diff --git a/.flowconfig b/.flowconfig
index aebb534c864..43156e99048 100644
--- a/.flowconfig
+++ b/.flowconfig
@@ -100,4 +100,4 @@ untyped-import
untyped-type-import
[version]
-^0.303.0
+^0.312.0
diff --git a/.github/actions/build-fantom-runner/action.yml b/.github/actions/build-fantom-runner/action.yml
new file mode 100644
index 00000000000..00ea1d63d2d
--- /dev/null
+++ b/.github/actions/build-fantom-runner/action.yml
@@ -0,0 +1,84 @@
+name: Build Fantom Runner
+inputs:
+ release-type:
+ required: true
+ description: The type of release we are building. It could be nightly, release or dry-run
+ gradle-cache-encryption-key:
+ description: "The encryption key needed to store the Gradle Configuration cache"
+
+runs:
+ using: composite
+ steps:
+ - name: Install dependencies
+ shell: bash
+ run: |
+ sudo apt update
+ sudo apt install -y git cmake openssl libssl-dev clang
+ - name: Setup git safe folders
+ shell: bash
+ run: git config --global --add safe.directory '*'
+ - name: Setup node.js
+ uses: ./.github/actions/setup-node
+ - name: Install node dependencies
+ uses: ./.github/actions/yarn-install
+ - name: Setup gradle
+ uses: ./.github/actions/setup-gradle
+ with:
+ cache-read-only: "false"
+ cache-encryption-key: ${{ inputs.gradle-cache-encryption-key }}
+ - name: Restore Fantom ccache
+ uses: actions/cache/restore@v5
+ with:
+ path: /github/home/.cache/ccache
+ key: v2-ccache-fantom-${{ github.job }}-${{ github.ref }}-${{ hashFiles(
+ 'packages/react-native/ReactAndroid/**/*.cpp',
+ 'packages/react-native/ReactAndroid/**/*.h',
+ 'packages/react-native/ReactAndroid/**/CMakeLists.txt',
+ 'packages/react-native/ReactCommon/**/*.cpp',
+ 'packages/react-native/ReactCommon/**/*.h',
+ 'packages/react-native/ReactCommon/**/CMakeLists.txt',
+ 'private/react-native-fantom/tester/**/*.cpp',
+ 'private/react-native-fantom/tester/**/*.h',
+ 'private/react-native-fantom/tester/**/CMakeLists.txt'
+ ) }}
+ restore-keys: |
+ v2-ccache-fantom-${{ github.job }}-${{ github.ref }}-
+ v2-ccache-fantom-${{ github.job }}-
+ v2-ccache-fantom-
+ - name: Show ccache stats (before)
+ shell: bash
+ run: ccache -s -v
+ - name: Build Fantom Runner
+ shell: bash
+ run: yarn workspace @react-native/fantom build
+ env:
+ CC: clang
+ CXX: clang++
+ - name: Save Fantom ccache
+ if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }}
+ uses: actions/cache/save@v5
+ with:
+ path: /github/home/.cache/ccache
+ key: v2-ccache-fantom-${{ github.job }}-${{ github.ref }}-${{ hashFiles(
+ 'packages/react-native/ReactAndroid/**/*.cpp',
+ 'packages/react-native/ReactAndroid/**/*.h',
+ 'packages/react-native/ReactAndroid/**/CMakeLists.txt',
+ 'packages/react-native/ReactCommon/**/*.cpp',
+ 'packages/react-native/ReactCommon/**/*.h',
+ 'packages/react-native/ReactCommon/**/CMakeLists.txt',
+ 'private/react-native-fantom/tester/**/*.cpp',
+ 'private/react-native-fantom/tester/**/*.h',
+ 'private/react-native-fantom/tester/**/CMakeLists.txt'
+ ) }}
+ - name: Show ccache stats (after)
+ shell: bash
+ run: ccache -s -v
+ - name: Copy shared libraries
+ shell: bash
+ run: cp packages/react-native/ReactAndroid/hermes-engine/build/hermes/lib/libhermesvm.so private/react-native-fantom/build/tester/
+ - name: Upload Fantom Runner binary
+ uses: actions/upload-artifact@v6
+ with:
+ name: fantom-runner-binary
+ compression-level: 1
+ path: private/react-native-fantom/build/tester/
diff --git a/.github/actions/maestro-android/action.yml b/.github/actions/maestro-android/action.yml
index 4aa15709070..cbc5ef1b96b 100644
--- a/.github/actions/maestro-android/action.yml
+++ b/.github/actions/maestro-android/action.yml
@@ -77,6 +77,7 @@ runs:
if: always()
with:
name: e2e_android_${{ steps.normalize-app-id.outputs.app-id }}_report_${{ inputs.flavor }}_${{ inputs.emulator-arch }}_NewArch
+ overwrite: true
path: |
report.xml
screen.mp4
@@ -85,4 +86,5 @@ runs:
uses: actions/upload-artifact@v6
with:
name: maestro-logs-android-${{ steps.normalize-app-id.outputs.app-id }}-${{ inputs.flavor }}-${{ inputs.emulator-arch }}-NewArch
+ overwrite: true
path: /tmp/MaestroLogs
diff --git a/.github/actions/maestro-ios/action.yml b/.github/actions/maestro-ios/action.yml
index 16fbb84173f..4720d1ad5d8 100644
--- a/.github/actions/maestro-ios/action.yml
+++ b/.github/actions/maestro-ios/action.yml
@@ -69,6 +69,7 @@ runs:
uses: actions/upload-artifact@v6
with:
name: e2e_ios_${{ inputs.app-id }}_report_${{ inputs.flavor }}_NewArch
+ overwrite: true
path: |
video_record_1.mov
video_record_2.mov
@@ -81,4 +82,5 @@ runs:
uses: actions/upload-artifact@v6
with:
name: maestro-logs-${{ inputs.app-id }}-${{ inputs.flavor }}-NewArch
+ overwrite: true
path: /tmp/MaestroLogs
diff --git a/.github/actions/run-fantom-tests/action.yml b/.github/actions/run-fantom-tests/action.yml
index 83fdd3a03d3..8a6fdcd832a 100644
--- a/.github/actions/run-fantom-tests/action.yml
+++ b/.github/actions/run-fantom-tests/action.yml
@@ -1,19 +1,12 @@
name: Run Fantom Tests
-inputs:
- release-type:
- required: true
- description: The type of release we are building. It could be nightly, release or dry-run
- gradle-cache-encryption-key:
- description: "The encryption key needed to store the Gradle Configuration cache"
-
runs:
using: composite
steps:
- - name: Install dependencies
+ - name: Install runtime dependencies
shell: bash
run: |
sudo apt update
- sudo apt install -y git cmake openssl libssl-dev clang
+ sudo apt install -y openssl libssl-dev
- name: Setup git safe folders
shell: bash
run: git config --global --add safe.directory '*'
@@ -21,58 +14,36 @@ runs:
uses: ./.github/actions/setup-node
- name: Install node dependencies
uses: ./.github/actions/yarn-install
- - name: Setup gradle
- uses: ./.github/actions/setup-gradle
+ - name: Download Fantom Runner binary
+ uses: actions/download-artifact@v7
with:
- cache-read-only: "false"
- cache-encryption-key: ${{ inputs.gradle-cache-encryption-key }}
- - name: Restore Fantom ccache
- uses: actions/cache/restore@v5
- with:
- path: /github/home/.cache/ccache
- key: v2-ccache-fantom-${{ github.job }}-${{ github.ref }}-${{ hashFiles(
- 'packages/react-native/ReactAndroid/**/*.cpp',
- 'packages/react-native/ReactAndroid/**/*.h',
- 'packages/react-native/ReactAndroid/**/CMakeLists.txt',
- 'packages/react-native/ReactCommon/**/*.cpp',
- 'packages/react-native/ReactCommon/**/*.h',
- 'packages/react-native/ReactCommon/**/CMakeLists.txt',
- 'private/react-native-fantom/tester/**/*.cpp',
- 'private/react-native-fantom/tester/**/*.h',
- 'private/react-native-fantom/tester/**/CMakeLists.txt'
- ) }}
- restore-keys: |
- v2-ccache-fantom-${{ github.job }}-${{ github.ref }}-
- v2-ccache-fantom-${{ github.job }}-
- v2-ccache-fantom-
- - name: Show ccache stats
+ name: fantom-runner-binary
+ path: private/react-native-fantom/build/tester
+ - name: Make binary executable
shell: bash
- run: ccache -s -v
+ run: chmod +x private/react-native-fantom/build/tester/fantom_tester
- name: Run Fantom Tests
shell: bash
- run: yarn fantom
+ run: |
+ for attempt in 1 2 3; do
+ echo "Attempt $attempt of 3"
+ if [ "$attempt" -eq 1 ]; then
+ if yarn fantom; then
+ exit 0
+ fi
+ else
+ if yarn fantom --onlyFailures; then
+ exit 0
+ fi
+ fi
+ if [ "$attempt" -lt 3 ]; then
+ echo "Attempt $attempt failed. Retrying only failed tests..."
+ fi
+ done
+ echo "All 3 attempts failed."
+ exit 1
env:
- CC: clang
- CXX: clang++
- - name: Save Fantom ccache
- if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }}
- uses: actions/cache/save@v5
- with:
- path: /github/home/.cache/ccache
- key: v2-ccache-fantom-${{ github.job }}-${{ github.ref }}-${{ hashFiles(
- 'packages/react-native/ReactAndroid/**/*.cpp',
- 'packages/react-native/ReactAndroid/**/*.h',
- 'packages/react-native/ReactAndroid/**/CMakeLists.txt',
- 'packages/react-native/ReactCommon/**/*.cpp',
- 'packages/react-native/ReactCommon/**/*.h',
- 'packages/react-native/ReactCommon/**/CMakeLists.txt',
- 'private/react-native-fantom/tester/**/*.cpp',
- 'private/react-native-fantom/tester/**/*.h',
- 'private/react-native-fantom/tester/**/CMakeLists.txt'
- ) }}
- - name: Show ccache stats
- shell: bash
- run: ccache -s -v
+ LD_LIBRARY_PATH: ${{ github.workspace }}/private/react-native-fantom/build/tester
- name: Upload test results
if: ${{ always() }}
uses: actions/upload-artifact@v6
diff --git a/.github/scripts/resolve-hermes.mts b/.github/scripts/resolve-hermes.mts
index 77fb5d9a1ab..f8986b8b81d 100644
--- a/.github/scripts/resolve-hermes.mts
+++ b/.github/scripts/resolve-hermes.mts
@@ -31,7 +31,7 @@ function setActionOutput(key: string, value: string) {
* Reads the Hermes artifact version from
* packages/react-native/sdks/hermes-engine/version.properties.
*
- * Returns HERMES_V1_VERSION_NAME when RCT_HERMES_V1_ENABLED=1, otherwise
+ * [macOS] Returns HERMES_V1_VERSION_NAME unless RCT_HERMES_V1_ENABLED=0, otherwise
* HERMES_VERSION_NAME. Returns null if the file or the key is missing.
*/
function resolveHermesArtifactVersion(): string | null {
@@ -48,7 +48,7 @@ function resolveHermesArtifactVersion(): string | null {
}
}
const key =
- process.env.RCT_HERMES_V1_ENABLED === '1'
+ process.env.RCT_HERMES_V1_ENABLED !== '0' // [macOS]
? 'HERMES_V1_VERSION_NAME'
: 'HERMES_VERSION_NAME';
const version = props[key];
@@ -60,12 +60,12 @@ function resolveHermesArtifactVersion(): string | null {
/**
* Reads the pinned Hermes tag from packages/react-native/sdks/.hermesversion
- * (or .hermesv1version when RCT_HERMES_V1_ENABLED=1). The value is a git tag in
+ * [macOS] Uses .hermesv1version unless RCT_HERMES_V1_ENABLED=0. The value is a git tag in
* facebook/hermes. Returns null if the file is missing or empty.
*/
function resolveHermesTag(): string | null {
const tagFile =
- process.env.RCT_HERMES_V1_ENABLED === '1'
+ process.env.RCT_HERMES_V1_ENABLED !== '0' // [macOS]
? '.hermesv1version'
: '.hermesversion';
const tagPath = path.resolve(
diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml
index 464e9eb3f86..705b4e31331 100644
--- a/.github/workflows/create-release.yml
+++ b/.github/workflows/create-release.yml
@@ -28,6 +28,21 @@ jobs:
token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }}
fetch-depth: 0
fetch-tags: 'true'
+ - name: Verify NPM token
+ run: |
+ if [[ -z "$GHA_NPM_TOKEN" ]]; then
+ echo "⚠️ No NPM token found. Skipping validation."
+ exit 0
+ fi
+ echo "//registry.npmjs.org/:_authToken=$GHA_NPM_TOKEN" > ~/.npmrc
+ if ! npm whoami > /dev/null 2>&1; then
+ echo "❌ NPM token is invalid or expired. Aborting release."
+ exit 1
+ fi
+ echo "✅ NPM token is valid ($(npm whoami))"
+ rm -f ~/.npmrc
+ env:
+ GHA_NPM_TOKEN: ${{ secrets.GHA_NPM_TOKEN }}
- name: Check if on stable branch
id: check_stable_branch
run: |
diff --git a/.github/workflows/e2e-android-rntester.yml b/.github/workflows/e2e-android-rntester.yml
new file mode 100644
index 00000000000..03970036269
--- /dev/null
+++ b/.github/workflows/e2e-android-rntester.yml
@@ -0,0 +1,71 @@
+name: E2E Android RNTester
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ fail-on-error:
+ type: boolean
+ default: false
+ outputs:
+ status:
+ description: "The result of the E2E tests (success or failure)"
+ value: ${{ jobs.report.outputs.status }}
+
+jobs:
+ test:
+ runs-on: 4-core-ubuntu
+ outputs:
+ status: ${{ steps.report-status.outputs.status }}
+ strategy:
+ fail-fast: false
+ matrix:
+ flavor: [debug, release]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ - name: Setup node.js
+ uses: ./.github/actions/setup-node
+ - name: Install node dependencies
+ uses: ./.github/actions/yarn-install
+ - name: Download APK
+ uses: actions/download-artifact@v7
+ with:
+ name: rntester-${{ matrix.flavor }}
+ path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/
+ - name: Print folder structure
+ run: ls -lR ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/
+ - name: Run E2E Tests
+ id: run-tests
+ continue-on-error: true
+ uses: ./.github/actions/maestro-android
+ timeout-minutes: 60
+ with:
+ app-path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/app-x86-${{ matrix.flavor }}.apk
+ app-id: com.facebook.react.uiapp
+ maestro-flow: ./packages/rn-tester/.maestro
+ flavor: ${{ matrix.flavor }}
+ - name: Report status
+ id: report-status
+ if: ${{ always() && steps.run-tests.outcome == 'failure' }}
+ run: echo "status=failure" >> $GITHUB_OUTPUT
+
+ report:
+ needs: test
+ if: always()
+ runs-on: ubuntu-latest
+ outputs:
+ status: ${{ steps.check.outputs.status }}
+ steps:
+ - id: check
+ run: |
+ if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
+ echo "status=failure" >> $GITHUB_OUTPUT
+ else
+ echo "status=success" >> $GITHUB_OUTPUT
+ fi
+ - name: Fail if needed
+ if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
+ run: exit 1
diff --git a/.github/workflows/e2e-android-templateapp.yml b/.github/workflows/e2e-android-templateapp.yml
new file mode 100644
index 00000000000..5246d6b5935
--- /dev/null
+++ b/.github/workflows/e2e-android-templateapp.yml
@@ -0,0 +1,109 @@
+name: E2E Android Template App
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ fail-on-error:
+ type: boolean
+ default: false
+ outputs:
+ status:
+ description: "The result of the E2E tests (success or failure)"
+ value: ${{ jobs.report.outputs.status }}
+
+jobs:
+ test:
+ runs-on: 4-core-ubuntu
+ outputs:
+ status: ${{ steps.report-status.outputs.status }}
+ strategy:
+ fail-fast: false
+ matrix:
+ flavor: [debug, release]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ - name: Setup node.js
+ uses: ./.github/actions/setup-node
+ - name: Run yarn
+ uses: ./.github/actions/yarn-install
+ - name: Set up JDK 17
+ uses: actions/setup-java@v5
+ with:
+ java-version: '17'
+ distribution: 'zulu'
+ - name: Download Maven Local
+ uses: actions/download-artifact@v7
+ with:
+ name: maven-local
+ path: /tmp/react-native-tmp/maven-local
+ - name: Download React Native Package
+ uses: actions/download-artifact@v7
+ with:
+ name: react-native-package
+ path: /tmp/react-native-tmp
+ - name: Print /tmp folder
+ run: ls -lR /tmp/react-native-tmp
+ - name: Prepare artifacts
+ id: prepare-artifacts
+ run: |
+ REACT_NATIVE_PKG=$(find /tmp/react-native-tmp -type f -name "*.tgz")
+ echo "React Native tgs is $REACT_NATIVE_PKG"
+
+ MAVEN_LOCAL=/tmp/react-native-tmp/maven-local
+ echo "Maven local path is $MAVEN_LOCAL"
+
+ # For stable branches, we want to use the stable branch of the template
+ # In all the other cases, we want to use "main"
+ BRANCH=${{ github.ref_name }}
+ if ! [[ $BRANCH == *-stable* ]]; then
+ BRANCH=main
+ fi
+ node ./scripts/e2e/init-project-e2e.js --projectName RNTestProject --currentBranch $BRANCH --directory /tmp/RNTestProject --pathToLocalReactNative $REACT_NATIVE_PKG
+
+ echo "Feed maven local to gradle.properties"
+ cd /tmp/RNTestProject
+ echo "react.internal.mavenLocalRepo=$MAVEN_LOCAL" >> android/gradle.properties
+
+ # Build
+ cd android
+ CAPITALIZED_FLAVOR=$(echo "${{ matrix.flavor }}" | awk '{print toupper(substr($0, 1, 1)) substr($0, 2)}')
+ ./gradlew assemble$CAPITALIZED_FLAVOR --no-daemon -PreactNativeArchitectures=x86
+
+ - name: Run E2E Tests
+ id: run-tests
+ continue-on-error: true
+ uses: ./.github/actions/maestro-android
+ timeout-minutes: 60
+ with:
+ app-path: /tmp/RNTestProject/android/app/build/outputs/apk/${{ matrix.flavor }}/app-${{ matrix.flavor }}.apk
+ app-id: com.rntestproject
+ maestro-flow: ./scripts/e2e/.maestro/
+ install-java: 'false'
+ flavor: ${{ matrix.flavor }}
+ working-directory: /tmp/RNTestProject
+ - name: Report status
+ id: report-status
+ if: ${{ always() && steps.run-tests.outcome == 'failure' }}
+ run: echo "status=failure" >> $GITHUB_OUTPUT
+
+ report:
+ needs: test
+ if: always()
+ runs-on: ubuntu-latest
+ outputs:
+ status: ${{ steps.check.outputs.status }}
+ steps:
+ - id: check
+ run: |
+ if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
+ echo "status=failure" >> $GITHUB_OUTPUT
+ else
+ echo "status=success" >> $GITHUB_OUTPUT
+ fi
+ - name: Fail if needed
+ if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
+ run: exit 1
diff --git a/.github/workflows/e2e-ios-rntester.yml b/.github/workflows/e2e-ios-rntester.yml
new file mode 100644
index 00000000000..941711c111e
--- /dev/null
+++ b/.github/workflows/e2e-ios-rntester.yml
@@ -0,0 +1,70 @@
+name: E2E iOS RNTester
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ fail-on-error:
+ type: boolean
+ default: false
+ outputs:
+ status:
+ description: "The result of the E2E tests (success or failure)"
+ value: ${{ jobs.report.outputs.status }}
+
+jobs:
+ test:
+ runs-on: macos-15-large
+ outputs:
+ status: ${{ steps.report-status.outputs.status }}
+ strategy:
+ fail-fast: false
+ matrix:
+ flavor: [Debug, Release]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ - name: Setup Node.js
+ uses: ./.github/actions/setup-node
+ - name: Download App
+ uses: actions/download-artifact@v7
+ with:
+ name: RNTesterApp-NewArch-${{ matrix.flavor }}
+ path: /tmp/RNTesterBuild/RNTester.app
+ - name: Check downloaded folder content
+ run: ls -lR /tmp/RNTesterBuild
+ - name: Setup xcode
+ uses: ./.github/actions/setup-xcode
+ - name: Run E2E Tests
+ id: run-tests
+ continue-on-error: true
+ uses: ./.github/actions/maestro-ios
+ with:
+ app-path: "/tmp/RNTesterBuild/RNTester.app"
+ app-id: com.meta.RNTester.localDevelopment
+ maestro-flow: ./packages/rn-tester/.maestro/
+ flavor: ${{ matrix.flavor }}
+ - name: Report status
+ id: report-status
+ if: ${{ always() && steps.run-tests.outcome == 'failure' }}
+ run: echo "status=failure" >> $GITHUB_OUTPUT
+
+ report:
+ needs: test
+ if: always()
+ runs-on: ubuntu-latest
+ outputs:
+ status: ${{ steps.check.outputs.status }}
+ steps:
+ - id: check
+ run: |
+ if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
+ echo "status=failure" >> $GITHUB_OUTPUT
+ else
+ echo "status=success" >> $GITHUB_OUTPUT
+ fi
+ - name: Fail if needed
+ if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
+ run: exit 1
diff --git a/.github/workflows/e2e-ios-templateapp.yml b/.github/workflows/e2e-ios-templateapp.yml
new file mode 100644
index 00000000000..dd4761471ca
--- /dev/null
+++ b/.github/workflows/e2e-ios-templateapp.yml
@@ -0,0 +1,128 @@
+name: E2E iOS Template App
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ fail-on-error:
+ type: boolean
+ default: false
+ outputs:
+ status:
+ description: "The result of the E2E tests (success or failure)"
+ value: ${{ jobs.report.outputs.status }}
+
+jobs:
+ test:
+ runs-on: macos-15-large
+ outputs:
+ status: ${{ steps.report-status.outputs.status }}
+ strategy:
+ fail-fast: false
+ matrix:
+ flavor: [Debug, Release]
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ - name: Setup xcode
+ uses: ./.github/actions/setup-xcode
+ - name: Setup node.js
+ uses: ./.github/actions/setup-node
+ - name: Run yarn
+ uses: ./.github/actions/yarn-install
+ - name: Setup ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: 2.6.10
+ - name: Download React Native Package
+ uses: actions/download-artifact@v7
+ with:
+ name: react-native-package
+ path: /tmp/react-native-tmp
+ - name: Print /tmp folder
+ run: ls -lR /tmp/react-native-tmp
+ - name: Download ReactNativeDependencies
+ uses: actions/download-artifact@v7
+ with:
+ name: ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz
+ path: /tmp/third-party
+ - name: Print third-party folder
+ shell: bash
+ run: ls -lR /tmp/third-party
+ - name: Download React Native Prebuilds
+ uses: actions/download-artifact@v7
+ with:
+ name: ReactCore${{ matrix.flavor }}.xcframework.tar.gz
+ path: /tmp/ReactCore
+ - name: Print ReactCore folder
+ shell: bash
+ run: ls -lR /tmp/ReactCore
+ - name: Configure git
+ shell: bash
+ run: |
+ git config --global user.email "react-native-bot@meta.com"
+ git config --global user.name "React Native Bot"
+ - name: Prepare artifacts
+ run: |
+ REACT_NATIVE_PKG=$(find /tmp/react-native-tmp -type f -name "*.tgz")
+ echo "React Native tgs is $REACT_NATIVE_PKG"
+
+ # For stable branches, we want to use the stable branch of the template
+ # In all the other cases, we want to use "main"
+ BRANCH=${{ github.ref_name }}
+ if ! [[ $BRANCH == *-stable* ]]; then
+ BRANCH=main
+ fi
+
+ node ./scripts/e2e/init-project-e2e.js --projectName RNTestProject --currentBranch $BRANCH --directory /tmp/RNTestProject --pathToLocalReactNative $REACT_NATIVE_PKG
+
+ cd /tmp/RNTestProject/ios
+ bundle install
+ NEW_ARCH_ENABLED=1
+
+ export RCT_USE_LOCAL_RN_DEP=/tmp/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz
+ # Disable prebuilds for now, as they are causing issues with E2E tests for 0.82-stable branch
+ export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ matrix.flavor }}.xcframework.tar.gz"
+ RCT_NEW_ARCH_ENABLED=$NEW_ARCH_ENABLED bundle exec pod install
+
+ xcodebuild \
+ -scheme "RNTestProject" \
+ -workspace RNTestProject.xcworkspace \
+ -configuration "${{ matrix.flavor }}" \
+ -sdk "iphonesimulator" \
+ -destination "generic/platform=iOS Simulator" \
+ -derivedDataPath "/tmp/RNTestProject"
+ - name: Run E2E Tests
+ id: run-tests
+ continue-on-error: true
+ uses: ./.github/actions/maestro-ios
+ with:
+ app-path: "/tmp/RNTestProject/Build/Products/${{ matrix.flavor }}-iphonesimulator/RNTestProject.app"
+ app-id: org.reactjs.native.example.RNTestProject
+ maestro-flow: ./scripts/e2e/.maestro/
+ flavor: ${{ matrix.flavor }}
+ working-directory: /tmp/RNTestProject
+ - name: Report status
+ id: report-status
+ if: ${{ always() && steps.run-tests.outcome == 'failure' }}
+ run: echo "status=failure" >> $GITHUB_OUTPUT
+
+ report:
+ needs: test
+ if: always()
+ runs-on: ubuntu-latest
+ outputs:
+ status: ${{ steps.check.outputs.status }}
+ steps:
+ - id: check
+ run: |
+ if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
+ echo "status=failure" >> $GITHUB_OUTPUT
+ else
+ echo "status=success" >> $GITHUB_OUTPUT
+ fi
+ - name: Fail if needed
+ if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
+ run: exit 1
diff --git a/.github/workflows/fantom-tests.yml b/.github/workflows/fantom-tests.yml
new file mode 100644
index 00000000000..97c8fd5c18f
--- /dev/null
+++ b/.github/workflows/fantom-tests.yml
@@ -0,0 +1,54 @@
+name: Fantom Tests
+
+permissions:
+ contents: read
+
+on:
+ workflow_call:
+ inputs:
+ fail-on-error:
+ type: boolean
+ default: false
+ outputs:
+ status:
+ description: "The result of the Fantom tests (success or failure)"
+ value: ${{ jobs.report.outputs.status }}
+
+jobs:
+ test:
+ runs-on: 8-core-ubuntu
+ outputs:
+ status: ${{ steps.report-status.outputs.status }}
+ container:
+ image: reactnativecommunity/react-native-android:latest
+ env:
+ TERM: "dumb"
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ - name: Run Fantom Tests
+ id: run-tests
+ continue-on-error: true
+ uses: ./.github/actions/run-fantom-tests
+ - name: Report status
+ id: report-status
+ if: ${{ always() && steps.run-tests.outcome == 'failure' }}
+ run: echo "status=failure" >> $GITHUB_OUTPUT
+
+ report:
+ needs: test
+ if: always()
+ runs-on: ubuntu-latest
+ outputs:
+ status: ${{ steps.check.outputs.status }}
+ steps:
+ - id: check
+ run: |
+ if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
+ echo "status=failure" >> $GITHUB_OUTPUT
+ else
+ echo "status=success" >> $GITHUB_OUTPUT
+ fi
+ - name: Fail if needed
+ if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
+ run: exit 1
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index f8d3b0f8d96..e471fb0b78b 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -89,6 +89,19 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v6
+ - name: Verify NPM token
+ run: |
+ if [[ -z "$GHA_NPM_TOKEN" ]]; then
+ echo "⚠️ No NPM token found. Skipping validation."
+ exit 0
+ fi
+ echo "//registry.npmjs.org/:_authToken=$GHA_NPM_TOKEN" > ~/.npmrc
+ if ! npm whoami > /dev/null 2>&1; then
+ echo "❌ NPM token is invalid or expired. Aborting release."
+ exit 1
+ fi
+ echo "✅ NPM token is valid ($(npm whoami))"
+ rm -f ~/.npmrc
- name: Build and Publish NPM Package
uses: ./.github/actions/build-npm-package
with:
diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml
index b7a0873bfe6..38507506de0 100644
--- a/.github/workflows/test-all.yml
+++ b/.github/workflows/test-all.yml
@@ -8,6 +8,9 @@ on:
- main
- "*-stable"
+permissions:
+ contents: read
+
jobs:
set_release_type:
runs-on: ubuntu-latest
@@ -37,9 +40,9 @@ jobs:
runs-on: ubuntu-latest
if: github.repository == 'facebook/react-native'
outputs:
- any_code_change: ${{ steps.filter_exclusions.outputs.any_code_change || github.event_name != 'pull_request' }}
- should_test_android: ${{ steps.filter_exclusions.outputs.should_test_android || github.event_name != 'pull_request' }}
- should_test_ios: ${{ steps.filter_exclusions.outputs.should_test_ios || github.event_name != 'pull_request' }}
+ any_code_change: ${{ steps.filter_exclusions.outputs.any_code_change == 'true' || github.event_name != 'pull_request' }}
+ should_test_android: ${{ steps.filter_exclusions.outputs.should_test_android == 'true' || github.event_name != 'pull_request' }}
+ should_test_ios: ${{ steps.filter_exclusions.outputs.should_test_ios == 'true' || github.event_name != 'pull_request' }}
debugger_shell: ${{ steps.filter_inclusions.outputs.debugger_shell }}
steps:
- name: Checkout
@@ -154,191 +157,63 @@ jobs:
flavor: ${{ matrix.flavor }}
test_e2e_ios_rntester:
- runs-on: macos-15-large
- needs:
- [test_ios_rntester]
- strategy:
- fail-fast: false
- matrix:
- flavor: [Debug, Release]
- steps:
- - name: Checkout
- uses: actions/checkout@v6
- - name: Setup Node.js
- uses: ./.github/actions/setup-node
- - name: Download App
- uses: actions/download-artifact@v7
- with:
- name: RNTesterApp-NewArch-${{ matrix.flavor }}
- path: /tmp/RNTesterBuild/RNTester.app
- - name: Check downloaded folder content
- run: ls -lR /tmp/RNTesterBuild
- - name: Setup xcode
- uses: ./.github/actions/setup-xcode
- - name: Run E2E Tests
- uses: ./.github/actions/maestro-ios
- with:
- app-path: "/tmp/RNTesterBuild/RNTester.app"
- app-id: com.meta.RNTester.localDevelopment
- maestro-flow: ./packages/rn-tester/.maestro/
- flavor: ${{ matrix.flavor }}
+ needs: test_ios_rntester
+ uses: ./.github/workflows/e2e-ios-rntester.yml
+ secrets: inherit
+
+ test_e2e_ios_rntester_retry_1:
+ needs: test_e2e_ios_rntester
+ if: ${{ always() && needs.test_e2e_ios_rntester.outputs.status == 'failure' }}
+ uses: ./.github/workflows/e2e-ios-rntester.yml
+ secrets: inherit
+
+ test_e2e_ios_rntester_retry_2:
+ needs: test_e2e_ios_rntester_retry_1
+ if: ${{ always() && needs.test_e2e_ios_rntester_retry_1.outputs.status == 'failure' }}
+ uses: ./.github/workflows/e2e-ios-rntester.yml
+ with:
+ fail-on-error: true
+ secrets: inherit
test_e2e_ios_templateapp:
- runs-on: macos-15-large
needs: [build_npm_package, prebuild_apple_dependencies]
- strategy:
- fail-fast: false
- matrix:
- flavor: [Debug, Release]
- steps:
- - name: Checkout
- uses: actions/checkout@v6
- - name: Setup xcode
- uses: ./.github/actions/setup-xcode
- - name: Setup node.js
- uses: ./.github/actions/setup-node
- - name: Run yarn
- uses: ./.github/actions/yarn-install
- - name: Setup ruby
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: 2.6.10
- - name: Download React Native Package
- uses: actions/download-artifact@v7
- with:
- name: react-native-package
- path: /tmp/react-native-tmp
- - name: Print /tmp folder
- run: ls -lR /tmp/react-native-tmp
- - name: Download ReactNativeDependencies
- uses: actions/download-artifact@v7
- with:
- name: ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz
- path: /tmp/third-party
- - name: Print third-party folder
- shell: bash
- run: ls -lR /tmp/third-party
- - name: Download React Native Prebuilds
- uses: actions/download-artifact@v7
- with:
- name: ReactCore${{ matrix.flavor }}.xcframework.tar.gz
- path: /tmp/ReactCore
- - name: Print ReactCore folder
- shell: bash
- run: ls -lR /tmp/ReactCore
- - name: Configure git
- shell: bash
- run: |
- git config --global user.email "react-native-bot@meta.com"
- git config --global user.name "React Native Bot"
- - name: Prepare artifacts
- run: |
- REACT_NATIVE_PKG=$(find /tmp/react-native-tmp -type f -name "*.tgz")
- echo "React Native tgs is $REACT_NATIVE_PKG"
-
- # For stable branches, we want to use the stable branch of the template
- # In all the other cases, we want to use "main"
- BRANCH=${{ github.ref_name }}
- if ! [[ $BRANCH == *-stable* ]]; then
- BRANCH=main
- fi
+ uses: ./.github/workflows/e2e-ios-templateapp.yml
+ secrets: inherit
- node ./scripts/e2e/init-project-e2e.js --projectName RNTestProject --currentBranch $BRANCH --directory /tmp/RNTestProject --pathToLocalReactNative $REACT_NATIVE_PKG
-
- cd /tmp/RNTestProject/ios
- bundle install
- NEW_ARCH_ENABLED=1
-
- export RCT_USE_LOCAL_RN_DEP=/tmp/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz
- # Disable prebuilds for now, as they are causing issues with E2E tests for 0.82-stable branch
- export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ matrix.flavor }}.xcframework.tar.gz"
- RCT_NEW_ARCH_ENABLED=$NEW_ARCH_ENABLED bundle exec pod install
-
- xcodebuild \
- -scheme "RNTestProject" \
- -workspace RNTestProject.xcworkspace \
- -configuration "${{ matrix.flavor }}" \
- -sdk "iphonesimulator" \
- -destination "generic/platform=iOS Simulator" \
- -derivedDataPath "/tmp/RNTestProject"
- - name: Run E2E Tests
- uses: ./.github/actions/maestro-ios
- with:
- app-path: "/tmp/RNTestProject/Build/Products/${{ matrix.flavor }}-iphonesimulator/RNTestProject.app"
- app-id: org.reactjs.native.example.RNTestProject
- maestro-flow: ./scripts/e2e/.maestro/
- flavor: ${{ matrix.flavor }}
- working-directory: /tmp/RNTestProject
+ test_e2e_ios_templateapp_retry_1:
+ needs: test_e2e_ios_templateapp
+ if: ${{ always() && needs.test_e2e_ios_templateapp.outputs.status == 'failure' }}
+ uses: ./.github/workflows/e2e-ios-templateapp.yml
+ secrets: inherit
+
+ test_e2e_ios_templateapp_retry_2:
+ needs: test_e2e_ios_templateapp_retry_1
+ if: ${{ always() && needs.test_e2e_ios_templateapp_retry_1.outputs.status == 'failure' }}
+ uses: ./.github/workflows/e2e-ios-templateapp.yml
+ with:
+ fail-on-error: true
+ secrets: inherit
test_e2e_android_templateapp:
- runs-on: 4-core-ubuntu
needs: build_npm_package
- strategy:
- fail-fast: false
- matrix:
- flavor: [debug, release]
- steps:
- - name: Checkout
- uses: actions/checkout@v6
- - name: Setup node.js
- uses: ./.github/actions/setup-node
- - name: Run yarn
- uses: ./.github/actions/yarn-install
- - name: Set up JDK 17
- uses: actions/setup-java@v5
- with:
- java-version: '17'
- distribution: 'zulu'
- - name: Download Maven Local
- uses: actions/download-artifact@v7
- with:
- name: maven-local
- path: /tmp/react-native-tmp/maven-local
- - name: Download React Native Package
- uses: actions/download-artifact@v7
- with:
- name: react-native-package
- path: /tmp/react-native-tmp
- - name: Print /tmp folder
- run: ls -lR /tmp/react-native-tmp
- - name: Prepare artifacts
- id: prepare-artifacts
- run: |
- REACT_NATIVE_PKG=$(find /tmp/react-native-tmp -type f -name "*.tgz")
- echo "React Native tgs is $REACT_NATIVE_PKG"
-
- MAVEN_LOCAL=/tmp/react-native-tmp/maven-local
- echo "Maven local path is $MAVEN_LOCAL"
-
- # For stable branches, we want to use the stable branch of the template
- # In all the other cases, we want to use "main"
- BRANCH=${{ github.ref_name }}
- if ! [[ $BRANCH == *-stable* ]]; then
- BRANCH=main
- fi
- node ./scripts/e2e/init-project-e2e.js --projectName RNTestProject --currentBranch $BRANCH --directory /tmp/RNTestProject --pathToLocalReactNative $REACT_NATIVE_PKG
-
- echo "Feed maven local to gradle.properties"
- cd /tmp/RNTestProject
- echo "react.internal.mavenLocalRepo=$MAVEN_LOCAL" >> android/gradle.properties
+ uses: ./.github/workflows/e2e-android-templateapp.yml
+ secrets: inherit
- # Build
- cd android
- CAPITALIZED_FLAVOR=$(echo "${{ matrix.flavor }}" | awk '{print toupper(substr($0, 1, 1)) substr($0, 2)}')
- ./gradlew assemble$CAPITALIZED_FLAVOR --no-daemon -PreactNativeArchitectures=x86
+ test_e2e_android_templateapp_retry_1:
+ needs: test_e2e_android_templateapp
+ if: ${{ always() && needs.test_e2e_android_templateapp.outputs.status == 'failure' }}
+ uses: ./.github/workflows/e2e-android-templateapp.yml
+ secrets: inherit
- - name: Run E2E Tests
- uses: ./.github/actions/maestro-android
- timeout-minutes: 60
- with:
- app-path: /tmp/RNTestProject/android/app/build/outputs/apk/${{ matrix.flavor }}/app-${{ matrix.flavor }}.apk
- app-id: com.rntestproject
- maestro-flow: ./scripts/e2e/.maestro/
- install-java: 'false'
- flavor: ${{ matrix.flavor }}
- working-directory: /tmp/RNTestProject
+ test_e2e_android_templateapp_retry_2:
+ needs: test_e2e_android_templateapp_retry_1
+ if: ${{ always() && needs.test_e2e_android_templateapp_retry_1.outputs.status == 'failure' }}
+ uses: ./.github/workflows/e2e-android-templateapp.yml
+ with:
+ fail-on-error: true
+ secrets: inherit
- run_fantom_tests:
+ build_fantom_runner:
runs-on: 8-core-ubuntu
needs: [set_release_type, check_code_changes, lint]
if: needs.check_code_changes.outputs.any_code_change == 'true'
@@ -356,12 +231,31 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v6
- - name: Build and Test Fantom
- uses: ./.github/actions/run-fantom-tests
+ - name: Build Fantom Runner
+ uses: ./.github/actions/build-fantom-runner
with:
release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }}
gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
+ run_fantom_tests:
+ needs: build_fantom_runner
+ uses: ./.github/workflows/fantom-tests.yml
+ secrets: inherit
+
+ run_fantom_tests_retry_1:
+ needs: run_fantom_tests
+ if: ${{ always() && needs.run_fantom_tests.outputs.status == 'failure' }}
+ uses: ./.github/workflows/fantom-tests.yml
+ secrets: inherit
+
+ run_fantom_tests_retry_2:
+ needs: run_fantom_tests_retry_1
+ if: ${{ always() && needs.run_fantom_tests_retry_1.outputs.status == 'failure' }}
+ uses: ./.github/workflows/fantom-tests.yml
+ with:
+ fail-on-error: true
+ secrets: inherit
+
build_android:
runs-on: 8-core-ubuntu
needs: [set_release_type, check_code_changes]
@@ -389,34 +283,23 @@ jobs:
gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
test_e2e_android_rntester:
- runs-on: 4-core-ubuntu
- needs: [build_android]
- strategy:
- fail-fast: false
- matrix:
- flavor: [debug, release]
- steps:
- - name: Checkout
- uses: actions/checkout@v6
- - name: Setup node.js
- uses: ./.github/actions/setup-node
- - name: Install node dependencies
- uses: ./.github/actions/yarn-install
- - name: Download APK
- uses: actions/download-artifact@v7
- with:
- name: rntester-${{ matrix.flavor }}
- path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/
- - name: Print folder structure
- run: ls -lR ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/
- - name: Run E2E Tests
- uses: ./.github/actions/maestro-android
- timeout-minutes: 60
- with:
- app-path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/app-x86-${{ matrix.flavor }}.apk
- app-id: com.facebook.react.uiapp
- maestro-flow: ./packages/rn-tester/.maestro
- flavor: ${{ matrix.flavor }}
+ needs: build_android
+ uses: ./.github/workflows/e2e-android-rntester.yml
+ secrets: inherit
+
+ test_e2e_android_rntester_retry_1:
+ needs: test_e2e_android_rntester
+ if: ${{ always() && needs.test_e2e_android_rntester.outputs.status == 'failure' }}
+ uses: ./.github/workflows/e2e-android-rntester.yml
+ secrets: inherit
+
+ test_e2e_android_rntester_retry_2:
+ needs: test_e2e_android_rntester_retry_1
+ if: ${{ always() && needs.test_e2e_android_rntester_retry_1.outputs.status == 'failure' }}
+ uses: ./.github/workflows/e2e-android-rntester.yml
+ with:
+ fail-on-error: true
+ secrets: inherit
build_npm_package:
runs-on: 8-core-ubuntu
@@ -623,49 +506,8 @@ jobs:
uses: ./.github/actions/yarn-install
- name: Build packages
shell: bash
- run: yarn build
+ run: yarn build --prepack
- name: Verify debugger-shell build
shell: bash
run: node scripts/debugger-shell/build-binary.js
- # This job should help with the E2E flakyness.
- # In case E2E tests fails, it launches a new retry-workflow workflow, passing the current run_id as input.
- # The retry-workflow reruns only the failed jobs of the current test-all workflow using
- # ```
- # gh run rerun ${{ inputs.run_id }} --failed
- # ```
- # From https://stackoverflow.com/a/78314483 it seems like that adding the extra workflow
- # rather then calling directly this command should improve stability of this solution.
- # This is exactly the same as rerunning failed tests from the GH UI, but automated.
- rerun-failed-jobs:
- runs-on: ubuntu-latest
- needs: [test_e2e_ios_rntester, test_e2e_android_rntester, test_e2e_ios_templateapp, test_e2e_android_templateapp, run_fantom_tests]
- if: ${{ github.ref == 'refs/heads/main' && always() }}
- steps:
- - name: Checkout
- uses: actions/checkout@v6
- - name: Rerun failed jobs in the current workflow
- env:
- GH_TOKEN: ${{ github.token }}
- run: |
- SHOULD_RETRY=${{fromJSON(github.run_attempt) < 3}}
- if [[ $SHOULD_RETRY == "false" ]]; then
- exit 0
- fi
-
- RNTESTER_ANDROID_FAILED=${{ needs.test_e2e_android_rntester.result == 'failure' }}
- TEMPLATE_ANDROID_FAILED=${{ needs.test_e2e_android_templateapp.result == 'failure' }}
- RNTESTER_IOS_FAILED=${{ needs.test_e2e_ios_rntester.result == 'failure' }}
- TEMPLATE_IOS_FAILED=${{ needs.test_e2e_ios_templateapp.result == 'failure' }}
- FANTOM_TESTS_FAILED=${{ needs.run_fantom_tests.result == 'failure' }}
-
- echo "RNTESTER_ANDROID_FAILED: $RNTESTER_ANDROID_FAILED"
- echo "TEMPLATE_ANDROID_FAILED: $TEMPLATE_ANDROID_FAILED"
- echo "RNTESTER_IOS_FAILED: $RNTESTER_IOS_FAILED"
- echo "TEMPLATE_IOS_FAILED: $TEMPLATE_IOS_FAILED"
- echo "FANTOM_TESTS_FAILED: $FANTOM_TESTS_FAILED"
-
- if [[ $RNTESTER_ANDROID_FAILED == "true" || $TEMPLATE_ANDROID_FAILED == "true" || $RNTESTER_IOS_FAILED == "true" || $TEMPLATE_IOS_FAILED == "true" || $FANTOM_TESTS_FAILED == "true" ]]; then
- echo "Rerunning failed jobs in the current workflow"
- gh workflow run retry-workflow.yml -F run_id=${{ github.run_id }}
- fi
diff --git a/.github/workflows/test-hermes-v1-android.yml b/.github/workflows/test-hermes-v1-android.yml
deleted file mode 100644
index 1c7b7eedf12..00000000000
--- a/.github/workflows/test-hermes-v1-android.yml
+++ /dev/null
@@ -1,70 +0,0 @@
-name: Test Hermes V1 with nightly on Android
-
-on:
- workflow_call:
- inputs:
- retry-count:
- description: 'Number of times to retry the build on failure'
- required: false
- type: number
- default: 3
-
-jobs:
- test-hermes-v1-android:
- name: Test Hermes V1 on Android
- runs-on: 4-core-ubuntu
- strategy:
- matrix:
- flavor: [debug, release]
- steps:
- - name: Checkout
- uses: actions/checkout@v6
-
- - name: Setup node.js
- uses: actions/setup-node@v6
- with:
- node-version: '22.14.0'
- cache: yarn
-
- - name: Set up JDK 17
- uses: actions/setup-java@v5
- with:
- java-version: '17'
- distribution: 'zulu'
-
- - name: Prepare the app with Hermes V1
- uses: ./.github/actions/prepare-hermes-v1-app
- with:
- retry-count: ${{ inputs.retry-count }}
-
- - name: Build Android with retry
- uses: nick-fields/retry@v3
- env:
- CMAKE_VERSION: 3.31.5
- ORG_GRADLE_PROJECT_reactNativeArchitectures: x86_64
- with:
- timeout_minutes: 45
- max_attempts: ${{ inputs.retry-count }}
- retry_wait_seconds: 30
- shell: bash
- command: |
- cd /tmp/RNApp/android
- CAPITALIZED_FLAVOR=$(echo "${{ matrix.flavor }}" | awk '{print toupper(substr($0, 1, 1)) substr($0, 2)}')
- ./gradlew assemble${CAPITALIZED_FLAVOR} -PhermesV1Enabled=true
- on_retry_command: |
- echo "Cleaning up for Android retry..."
- cd /tmp/RNApp/android
- ./gradlew clean || true
- rm -rf build app/build .gradle || true
-
- - name: Run E2E Tests
- uses: ./.github/actions/maestro-android
- timeout-minutes: 60
- with:
- app-path: /tmp/RNApp/android/app/build/outputs/apk/${{ matrix.flavor }}/app-${{ matrix.flavor }}.apk
- app-id: com.rnapp
- maestro-flow: ./scripts/e2e/.maestro/
- install-java: 'false'
- flavor: ${{ matrix.flavor }}
- working-directory: /tmp/RNApp
- emulator-arch: x86_64
diff --git a/.github/workflows/test-hermes-v1-ios.yml b/.github/workflows/test-hermes-v1-ios.yml
deleted file mode 100644
index bdafd9181b8..00000000000
--- a/.github/workflows/test-hermes-v1-ios.yml
+++ /dev/null
@@ -1,76 +0,0 @@
-name: Test Hermes V1 with nightly on iOS
-
-on:
- workflow_call:
- inputs:
- retry-count:
- description: 'Number of times to retry the build on failure'
- required: false
- type: number
- default: 3
-
-jobs:
- test-hermes-v1-ios:
- name: Test Hermes V1 on iOS
- runs-on: macos-15-large
- strategy:
- matrix:
- flavor: [debug, release]
- steps:
- - name: Checkout
- uses: actions/checkout@v6
-
- - name: Setup node.js
- uses: actions/setup-node@v6
- with:
- node-version: '22.14.0'
- cache: yarn
-
- - name: Prepare capitalized flavor
- id: prepare-flavor
- shell: bash
- run: |
- CAPITALIZED_FLAVOR=$(echo "${{ matrix.flavor }}" | awk '{print toupper(substr($0, 1, 1)) substr($0, 2)}')
- echo "capitalized_flavor=$CAPITALIZED_FLAVOR" >> $GITHUB_OUTPUT
-
- - name: Prepare the app with Hermes V1
- uses: ./.github/actions/prepare-hermes-v1-app
- with:
- retry-count: ${{ inputs.retry-count }}
-
- - name: Setup xcode
- uses: maxim-lobanov/setup-xcode@v1
-
- - name: Build iOS with retry
- uses: nick-fields/retry@v3
- with:
- timeout_minutes: 45
- max_attempts: ${{ inputs.retry-count }}
- retry_wait_seconds: 30
- shell: bash
- command: |
- cd /tmp/RNApp/ios
- bundle install
- RCT_HERMES_V1_ENABLED=1 bundle exec pod install
- xcodebuild build \
- -workspace "RNApp.xcworkspace" \
- -scheme "RNApp" \
- -configuration "${{ steps.prepare-flavor.outputs.capitalized_flavor }}" \
- -sdk "iphonesimulator" \
- -destination "generic/platform=iOS Simulator" \
- -derivedDataPath "/tmp/RNApp" \
- -quiet
- on_retry_command: |
- echo "Cleaning up for iOS retry..."
- cd /tmp/RNApp/ios
- rm -rf Pods Podfile.lock build
- rm -rf ~/Library/Developer/Xcode/DerivedData/* || true
-
- - name: Run E2E Tests
- uses: ./.github/actions/maestro-ios
- with:
- app-path: "/tmp/RNApp/Build/Products/${{ steps.prepare-flavor.outputs.capitalized_flavor }}-iphonesimulator/RNApp.app"
- app-id: org.reactjs.native.example.RNApp
- maestro-flow: ./scripts/e2e/.maestro/
- flavor: ${{ steps.prepare-flavor.outputs.capitalized_flavor }}
- working-directory: /tmp/RNApp
diff --git a/.github/workflows/test-hermes-v1.yml b/.github/workflows/test-hermes-v1.yml
deleted file mode 100644
index d11e444e5ff..00000000000
--- a/.github/workflows/test-hermes-v1.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-# This jobs runs every day 2 hours after the nightly job for React Native so we can verify how the nightly is behaving.
-name: Check Hermes V1 with the nightly build
-
-on:
- workflow_dispatch:
- # nightly build @ 4:15 AM UTC
- schedule:
- - cron: '15 4 * * *'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- check-nightly:
- runs-on: ubuntu-latest
- if: github.repository == 'facebook/react-native'
- steps:
- - name: Checkout
- uses: actions/checkout@v6
- - name: Check nightly
- run: |
- TODAY=$(date "+%Y%m%d")
- echo "Checking nightly for $TODAY"
- NIGHTLY="$(npm view react-native | grep $TODAY)"
- if [[ -z $NIGHTLY ]]; then
- echo 'Nightly job failed.'
- exit 1
- else
- echo 'Nightly Worked, All Good!'
- fi
-
- test-hermes-v1-ios:
- uses: ./.github/workflows/test-hermes-v1-ios.yml
- needs: check-nightly
-
- test-hermes-v1-android:
- uses: ./.github/workflows/test-hermes-v1-android.yml
- needs: check-nightly
diff --git a/.github/workflows/validate-cxx-api-snapshots.yml b/.github/workflows/validate-cxx-api-snapshots.yml
new file mode 100644
index 00000000000..4d8230a1e66
--- /dev/null
+++ b/.github/workflows/validate-cxx-api-snapshots.yml
@@ -0,0 +1,82 @@
+name: Validate C++ API Snapshots
+
+on:
+ workflow_dispatch:
+ pull_request:
+ paths:
+ - "packages/react-native/ReactCommon/**"
+ - "packages/react-native/ReactAndroid/**"
+ - "packages/react-native/React/**"
+ - "packages/react-native/ReactApple/**"
+ - "packages/react-native/Libraries/**"
+ - "scripts/cxx-api/**"
+ push:
+ branches:
+ - main
+ - "*-stable"
+ paths:
+ - "packages/react-native/ReactCommon/**"
+ - "packages/react-native/ReactAndroid/**"
+ - "packages/react-native/React/**"
+ - "packages/react-native/ReactApple/**"
+ - "packages/react-native/Libraries/**"
+ - "scripts/cxx-api/**"
+
+env:
+ DOXYGEN_VERSION: "1.16.1"
+
+jobs:
+ validate_cxx_api_snapshots:
+ runs-on: ubuntu-latest
+ if: github.repository == 'facebook/react-native'
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ - name: Setup node.js
+ uses: ./.github/actions/setup-node
+ - name: Run yarn
+ uses: ./.github/actions/yarn-install
+ - name: Restore Doxygen cache
+ id: cache-doxygen
+ uses: actions/cache@v4
+ with:
+ path: /tmp/doxygen-${{ env.DOXYGEN_VERSION }}
+ key: doxygen-${{ env.DOXYGEN_VERSION }}
+ - name: Install Doxygen
+ if: steps.cache-doxygen.outputs.cache-hit != 'true'
+ shell: bash
+ run: |
+ DOXYGEN_URL="https://github.com/doxygen/doxygen/releases/download/Release_${DOXYGEN_VERSION//./_}/doxygen-${DOXYGEN_VERSION}.linux.bin.tar.gz"
+ MAX_RETRIES=3
+ for i in $(seq 1 $MAX_RETRIES); do
+ echo "Attempt $i of $MAX_RETRIES: Installing Doxygen ${DOXYGEN_VERSION}..."
+ curl -fsSL "$DOXYGEN_URL" -o /tmp/doxygen.tar.gz && \
+ tar -xzf /tmp/doxygen.tar.gz -C /tmp && \
+ echo "Doxygen installed successfully." && \
+ break
+ echo "Attempt $i failed."
+ if [ $i -eq $MAX_RETRIES ]; then
+ echo "All $MAX_RETRIES attempts failed."
+ exit 1
+ fi
+ sleep 5
+ done
+ - name: Set DOXYGEN_BIN
+ shell: bash
+ run: echo "DOXYGEN_BIN=/tmp/doxygen-${DOXYGEN_VERSION}/bin/doxygen" >> "$GITHUB_ENV"
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.12"
+ - name: Install Python dependencies
+ shell: bash
+ run: pip install doxmlparser natsort pyyaml
+ - name: Validate C++ API snapshots
+ shell: bash
+ run: yarn cxx-api-validate --output-dir /tmp/cxx-api-snapshots
+ - name: Upload C++ API snapshots
+ if: always()
+ uses: actions/upload-artifact@v6
+ with:
+ name: cxx-api-snapshots
+ path: /tmp/cxx-api-snapshots/
diff --git a/.gitignore b/.gitignore
index 97c533ee8c4..ad4065064ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -202,7 +202,11 @@ fix_*.patch
.github/instructions/nx.instructions.md
# macOS]
+# Python
+__pycache__/
+
# Doxygen XML output used for C++ API tracking
/packages/react-native/**/api/xml
-/packages/react-native/**/.doxygen.config.generated
+/packages/react-native/**/api/codegen
+/packages/react-native/**/.doxygen.config.*.generated
/scripts/cxx-api/codegen
diff --git a/.yarnrc.yml b/.yarnrc.yml
index a5b9869f637..da65d046291 100644
--- a/.yarnrc.yml
+++ b/.yarnrc.yml
@@ -36,10 +36,11 @@ packageExtensions:
"hermes-estree": "0.29.1"
"@react-native/fantom@*":
dependencies:
+ "istanbul-lib-coverage": "^3.2.0"
"jest-docblock": "^29.7.0"
"jest-message-util": "^29.7.0"
- "metro": "^0.84.0"
- "metro-config": "^0.84.0"
+ "metro": "^0.84.3"
+ "metro-config": "^0.84.3"
"source-map": "^0.6.1"
"@typescript-eslint/type-utils@*":
dependencies:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ac2a222ff0..5e1f6978618 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,235 @@
# Changelog
+## v0.85.2
+
+### Added
+
+- **Animated**: Add pushAnimationMutations to AnimationBackend for targeted event-driven animation updates ([e4f0509973](https://github.com/facebook/react-native/commit/e4f0509973241d43f969401f81e85f0cd25ccc94) by Bartlomiej Bloniarz)
+
+### Fixed
+
+- **Animated**: Fix potential data corruption in animation backend when ShadowTree commits are retried by copying RawProps instead of moving them ([77d3df8cab](https://github.com/facebook/react-native/commit/77d3df8cab3dccfd4fefad6a80603fadcfc45106) by Bartlomiej Bloniarz)
+
+#### iOS specific
+
+- **Dev Server**: Fix "Loading from Metro..." banner getting stuck after reloads in quick succession ([e122c24c27](https://github.com/facebook/react-native/commit/e122c24c273f5fb6e0a2d6b1c961d75ac9bc90b7) by [@alanjhughes](https://github.com/alanjhughes))
+
+## v0.85.1
+
+### Fixed
+
+- **Animated**: Share animation backend enabled as experimental([401b1620dc](https://github.com/facebook/react-native/commit/401b1620dc674b3f7b9e88a783baca68a2f94ebc) by [@cortinico](https://github.com/cortinico))
+
+#### Android specific
+
+- **Networking**: FormData uploads broken in debug builds ([0d1b70ee22](https://github.com/facebook/react-native/commit/0d1b70ee225a2e9970364ddda323071aa0a7e485) by [@riteshshukla04](https://github.com/riteshshukla04))
+
+## v0.85.0
+
+### Breaking
+
+- **Animated**: Fix unsafe rawPointer access in cloneMultiple. ([1d47693230](https://github.com/facebook/react-native/commit/1d476932305f2563d773eb04f0f78a9bdd2525e1) by [@coado](https://github.com/coado))
+- **Build**: Drop support for EOL Node.js lines and old minors. ([c9c601d61a](https://github.com/facebook/react-native/commit/c9c601d61af836d26ab628c2c8a30bae713ef010) by [@robhogan](https://github.com/robhogan))
+- **Jest**: Move Jest preset to new `react-native/jest-preset` package ([c4ae05534a](https://github.com/facebook/react-native/commit/c4ae05534ad5b6e6def35e736764f64b1f145a2b) by [@kitten](https://github.com/kitten))
+- **StyleSheet**: Remove deprecated `StyleSheet.absoluteFillObject` API ([5681db09b8](https://github.com/facebook/react-native/commit/5681db09b875e8c2b59b14df2300bad2b68d8a17) by [@huntie](https://github.com/huntie))
+- **TypeScript**: Removing deprecated type aliases. Use the type directly. ([1813df743d](https://github.com/facebook/react-native/commit/1813df743db3852f3b667e36c31d564867c257fc) by [@sammy-SC](https://github.com/sammy-SC))
+- **TypeScript**: Removing deprecated type aliases. Use the type directly. ([796a9a8922](https://github.com/facebook/react-native/commit/796a9a892283feeb01e9ded21c40dc91409c1499) by [@sammy-SC](https://github.com/sammy-SC))
+
+#### Android specific
+
+- **Events**: Re-added `receiveTouches` to `RCTEventEmitter` with a default no-op implementation to avoid breaking ecosystem libraries ([67db89d08a](https://github.com/facebook/react-native/commit/67db89d08aa2aaaed6ff270032024fee1dcad531) by [@javache](https://github.com/javache))
+- **Legacy Architecture**: Deprecated UIManagerHelper.getEventDispatcherForReactTag and UIManagerHelper.getEventDispatcher(ReactContext, UIManagerType Int), use getEventDispatcher ([4e5d45f4db](https://github.com/facebook/react-native/commit/4e5d45f4dbea143b72925078c65ab2ad4846dfd3) by [@javache](https://github.com/javache))
+- **Legacy Architecture**: Stub UIImplementation class, this class is unused in the new architecture ([fbe15f6605](https://github.com/facebook/react-native/commit/fbe15f6605bb99c451d1105bcac72af7692182fe) by [@mdvacca](https://github.com/mdvacca))
+- **Text**: Make ReactTextUpdate internal ([faebee4338](https://github.com/facebook/react-native/commit/faebee4338e5842b2dd915eede0ee049d4fd7368) by [@NickGerleman](https://github.com/NickGerleman))
+
+### Added
+
+- **Animated**: `RCTAnimationChoreographer` to `RCTScheduler` ([019c9a7d8f](https://github.com/facebook/react-native/commit/019c9a7d8f56fe895253de8487b4c6d0d76f85be) by Bartlomiej Bloniarz)
+- **Animated**: `std::mutex` to `AnimationBackend` to protect `start`, `stop` and `callbacks`. ([4064b89867](https://github.com/facebook/react-native/commit/4064b89867cb7424fd02433c6d597e534bfc8cbc) by Bartlomiej Bloniarz)
+- **Animated**: Add c++ AnimatedModule to DefaultTurboModules ([15e52e3f71](https://github.com/facebook/react-native/commit/15e52e3f71e7199808686e2b86ea54dcb2495b71) by [@zeyap](https://github.com/zeyap))
+- **Animated**: Added support for transform operations. ([58b7b052c0](https://github.com/facebook/react-native/commit/58b7b052c092e79277ab026ea6dd4f78021ed6c5) by [@coado](https://github.com/coado))
+- **Animated**: Animated calls `AnimationBackend::trigger` to push updates from. events to the mounting layer ([ac06f3bdc7](https://github.com/facebook/react-native/commit/ac06f3bdc76a9fd7c65ab899e82bff5cad9b94b6) by Bartlomiej Bloniarz)
+- **Animated**: Animated can now prompt the backend to push changes to the shadowTree on the JS thread, making RSNRU update the ShadowNode references held by the react renderer. ([f9e94c0502](https://github.com/facebook/react-native/commit/f9e94c050251c67bf0d2c806738b8c6e59bb59d5) by Bartlomiej Bloniarz)
+- **Animated**: Animation Backend examples in RNTester ([149a4b8dcd](https://github.com/facebook/react-native/commit/149a4b8dcde07df9c2f4d8456463ad242a2cb842) by Bartlomiej Bloniarz)
+- **Animated**: AnimationBackend docs ([f3678f51d9](https://github.com/facebook/react-native/commit/f3678f51d9873cb19602d7e36a4d8ed71562b9d0) by Bartlomiej Bloniarz)
+- **Animated**: AnimationBackend now cleans-up the AnimatedPropsRegistry after the js sync when `updateRuntimeShadowNodeReferencesOnCommitThread` is enabled ([b38428c9bc](https://github.com/facebook/react-native/commit/b38428c9bc9ad2e62a4cedf2240d44eb7a5b52df) by Bartlomiej Bloniarz)
+- **Animated**: Moved `shadowNodeFamily_` from a map in `NativeAnimatedNodesManager` to `PropsAnimatedNode` ([af96497b54](https://github.com/facebook/react-native/commit/af96497b543a44c5ce93464346d853b50159432a) by Bartlomiej Bloniarz)
+- **Animated**: Updated `AnimationBackend` usages to use `AnimationTimestamp` ([2a4a54ae6c](https://github.com/facebook/react-native/commit/2a4a54ae6c92c9fbf8601601aae50fd1f1115871) by Bartlomiej Bloniarz)
+- **Animated**: Upstream useAnimatedColor and useAnimatedValueXY ([b92d37879e](https://github.com/facebook/react-native/commit/b92d37879e8e6ca5dbb3c0047a50b20ae6286bc5) by [@zeyap](https://github.com/zeyap))
+- **Dev Server**: Make metro accept tls server config ([8915d81a5b](https://github.com/facebook/react-native/commit/8915d81a5bae5b37247ab56bf9f1b4aace189b9c) by [@vzaidman](https://github.com/vzaidman))
+- **Feature Flags**: Create featureflag viewTransitionEnabled ([d7a1d080c2](https://github.com/facebook/react-native/commit/d7a1d080c242300986935f64ac7906924a5f7189) by [@zeyap](https://github.com/zeyap))
+- **JavaScript API**: Added `EventEmitter` to `react-native` exports. ([f7cd8c4c1c](https://github.com/facebook/react-native/commit/f7cd8c4c1ccc7738fcfea193019f190d4a6effb2) by [@yungsters](https://github.com/yungsters))
+- **Pressable**: Added tests for `Pressability` `onHoverOut` property ([de5994817d](https://github.com/facebook/react-native/commit/de5994817d8214cae217fca583f89a71c08d7b40) by [@chicio](https://github.com/chicio))
+- **React Native DevTools**: Added missing tests for Standalone fusebox shell ([e5d720d98d](https://github.com/facebook/react-native/commit/e5d720d98d55b1f23e49d3820df6957063a1d1a7) by [@chicio](https://github.com/chicio))
+- **React Native DevTools**: Support multiple CDP connections to one React Native Host (diff 1 of 2) ([534c06f3c8](https://github.com/facebook/react-native/commit/534c06f3c85394c8294f080e57ffb76dc655fb74) by [@motiz88](https://github.com/motiz88))
+- **React Native DevTools**: Support multiple CDP connections to one React Native Host (diff 2 of 2) ([f04659972c](https://github.com/facebook/react-native/commit/f04659972c0996ada70ded2cf1456865cf3a7f32) by [@motiz88](https://github.com/motiz88))
+- **Runtime**: Added a synchronization mechanism for the layout information between the React branch and the main branch of the ShadowTree ([c8d498d62d](https://github.com/facebook/react-native/commit/c8d498d62d73ea8d58a6017bd0283e43d78d2c8a) by [@j-piasecki](https://github.com/j-piasecki))
+- **TextInput**: TextInput onChange event now includes selection data (cursor location) on iOS and Android ([162627af7c](https://github.com/facebook/react-native/commit/162627af7c53e27433f39f82c4630baff0695bf1) by [@alanleedev](https://github.com/alanleedev))
+- **TextInput**: TextInput onChange event types now include optional selection data ([c1f5445f4a](https://github.com/facebook/react-native/commit/c1f5445f4a59d0035389725e47da58eb3d2c267c) by [@alanleedev](https://github.com/alanleedev))
+- **TypeScript**: Add missing `onPressMove` prop to `` ([d07318226d](https://github.com/facebook/react-native/commit/d07318226d4b8d66e1bd55c9b683d1715c39b84e) by [@retyui](https://github.com/retyui))
+
+#### Android specific
+
+- **Animated**: Decouple ReactScrollViewHelper from kt NativeAnimated ([0cde8ed0bb](https://github.com/facebook/react-native/commit/0cde8ed0bb6bbd8159f5b07405ed8e5a685ed3eb) by [@zeyap](https://github.com/zeyap))
+- **Build**: Allow specifying dev server ip via gradle property ([6f54846a08](https://github.com/facebook/react-native/commit/6f54846a08025c05ab7c7bf514f189085cde7b18) by [@amartinz](https://github.com/amartinz))
+- **Build**: Re-added prefabPublishing=true to make Android build from source work again ([e8eb37414e](https://github.com/facebook/react-native/commit/e8eb37414ed34c360eef6bf988d8cee445e6e72b) by [@chrfalch](https://github.com/chrfalch))
+- **Dev Server**: Make DevSupportHttpClient public for custom dev-support HTTP header registration ([58d94863f8](https://github.com/facebook/react-native/commit/58d94863f896a64e3ab176008d4141a0a68da71f) by [@cortinico](https://github.com/cortinico))
+- **Dev Server**: Public DevSupportRequestHeaders API for registering custom dev-support HTTP headers ([e0d34b254a](https://github.com/facebook/react-native/commit/e0d34b254aca4b695c2eda24f1fb086ee3a037f6) by [@cortinico](https://github.com/cortinico))
+- **React Native DevTools**: Restore request payload previews on Android ([cc44e96e0b](https://github.com/facebook/react-native/commit/cc44e96e0bc7f82a1729301dce7c4ca5a5e11f65) by [@huntie](https://github.com/huntie))
+- **Runtime**: Add `StateWrapper` to C++ fbjni types ([99b328bffa](https://github.com/facebook/react-native/commit/99b328bffae134430e864af999237c3c39170c5a) by [@mrousavy](https://github.com/mrousavy))
+- **ScrollView**: Add `scrollsChildToFocus` prop to ScrollView to control automatic scrolling when a child receives focus ([d9ee4bb0aa](https://github.com/facebook/react-native/commit/d9ee4bb0aa55a71fd2328a8b9dfdca56a4a1e75a) by [@johankasperi](https://github.com/johankasperi))
+- **Text**: `ReactFontManager.customFontFamilies` property to query registered custom font family names ([c3acbc424d](https://github.com/facebook/react-native/commit/c3acbc424da9b044957d5a35c4a2d4a1254a3729) by [@vonovak](https://github.com/vonovak))
+- **Text**: Add Unstable DrawCommandSpan Usable with PreparedLayoutTextView ([ad8ac5e176](https://github.com/facebook/react-native/commit/ad8ac5e17602919ac3a6c287d176cd07d8fd18f9) by [@NickGerleman](https://github.com/NickGerleman))
+
+#### iOS specific
+
+- **Build**: Added support for clang virtual file system in React.XCFramework ([f0422abd23](https://github.com/facebook/react-native/commit/f0422abd23b87d086d02a5afd6b8b9f300528137) by [@chrfalch](https://github.com/chrfalch))
+
+### Changed
+
+- **Animated**: `AnimationChoreographer` interface with an implementation for fantom tests ([f8564b47fd](https://github.com/facebook/react-native/commit/f8564b47fd742bce3dc68b129ea0d4ae04e61bc3) by Bartlomiej Bloniarz)
+- **Animated**: Enable -DRN_USE_ANIMATION_BACKEND by default ([4cfb2ee468](https://github.com/facebook/react-native/commit/4cfb2ee46831b57987873b1d7ce6306778463afd) by [@zeyap](https://github.com/zeyap))
+- **Build**: Metro bump to ^0.84.0 ([58ed78fec1](https://github.com/facebook/react-native/commit/58ed78fec1714003c25311def5e95d4d212337d7) by [@robhogan](https://github.com/robhogan))
+- **Dev Server**: `createDevMiddleware` now accepts `string | URL` for `serverBaseUrl` ([10709f427d](https://github.com/facebook/react-native/commit/10709f427d164ed07fbd9e462334c9a0cb9bceb5) by [@emily8rown](https://github.com/emily8rown))
+- **Dev Server**: Remove "JavaScript logs have moved!" notice from dev server CLI ([4bd62a1d41](https://github.com/facebook/react-native/commit/4bd62a1d41417b9feaeef2a5e03532ef66587f9d) by [@huntie](https://github.com/huntie))
+- **Hermes**: Bump hermes version ([4379f21bd7](https://github.com/facebook/react-native/commit/4379f21bd7f04f977f0dc7bfe1efa55400cf52e0) by [@alanleedev](https://github.com/alanleedev))
+- **Hermes**: Do not use hermesNightly on the release branch ([c35a22db2b](https://github.com/facebook/react-native/commit/c35a22db2b1427e7e4fe404dfc10cc711a7558f8) by [@cortinico](https://github.com/cortinico))
+- **Hermes**: Introduce 'Determine Hermes build flag' step ([111bd59db5](https://github.com/facebook/react-native/commit/111bd59db5ddeb2201de7f88fce14d2f4223432e) by [@fabriziocucci](https://github.com/fabriziocucci))
+- **JavaScript API**: Changed Flow type for `URL` constructor to accept `URL` as first argument, matching the second argument type ([678f7a9cfb](https://github.com/facebook/react-native/commit/678f7a9cfb01efc97c66ba2c178dbaa7b2837be5) by [@emily8rown](https://github.com/emily8rown))
+- **Pressable**: `Pressable` no longer unmounts event listeners in a hidden `Activity`. ([c295ec2261](https://github.com/facebook/react-native/commit/c295ec22617985b757775bfcca75a4ea9471a689) by [@yungsters](https://github.com/yungsters))
+- **Pressable**: Migrated `Pressability` tests to Jest modern timers ([7dd2d255de](https://github.com/facebook/react-native/commit/7dd2d255deaecf20101675cb4a616226e48a80d7) by [@chicio](https://github.com/chicio))
+- **React Native DevTools**: Changed debugger proxy to only permit connections from localhost. ([f34b8702db](https://github.com/facebook/react-native/commit/f34b8702dbb3843429a76779ca0800e99d5cfa10) by [@yungsters](https://github.com/yungsters))
+- **React Native DevTools**: Enable native macOS window merging ([34b3c108bc](https://github.com/facebook/react-native/commit/34b3c108bcd57c9466e8fd74e5588832d1bd864b) by [@huntie](https://github.com/huntie))
+- **React Native DevTools**: Extracting shared logic for fuseboxSessionObserver into reusable components ([b0013ea22a](https://github.com/facebook/react-native/commit/b0013ea22a70f28efe02425f0faa58ac404b9f6e) by [@emily8rown](https://github.com/emily8rown))
+- **React Native DevTools**: Page targets returned from `/json/list` will no longer set `prefersFuseboxFrontend` ([421de23470](https://github.com/facebook/react-native/commit/421de234700805cec1277940187020e6baa5c8eb) by [@huntie](https://github.com/huntie))
+- **React Native DevTools**: Suppress LogBox warnings and errors during CDP performance tracing ([a308014d87](https://github.com/facebook/react-native/commit/a308014d879dffc142335aff344ace2bfd77eb26) by [@emily8rown](https://github.com/emily8rown))
+- **React**: Make React Native consume 250829098.0.6 ([4fb33022bc](https://github.com/facebook/react-native/commit/4fb33022bc57dd719ce46a1a074b029cdfd8ff24) by [@cipolleschi](https://github.com/cipolleschi))
+- **Runtime**: `cancelAnimationFrame`, `clearImmediate`, `clearTimeout` and `clearInterval` do nothing If there is no callback associated the given handle ([9d3cc383ba](https://github.com/facebook/react-native/commit/9d3cc383ba9b45ef28721a1ae81b2d0429363bf5) by [@retyui](https://github.com/retyui))
+- **Runtime**: Changed how React changes are commited to the Shadow Tree (behind a feature flag) ([45b4817414](https://github.com/facebook/react-native/commit/45b4817414928c9bfa0b055bb09533ac177cada6) by [@j-piasecki](https://github.com/j-piasecki))
+- **Runtime**: Importing `hairlineWidth` no longer eagerly initializes the `PixelRatio` TurboModule. ([e11a2f07e8](https://github.com/facebook/react-native/commit/e11a2f07e8fd962adb76ff55a9b159e8ca3ae51f) by [@yungsters](https://github.com/yungsters))
+- **Runtime**: Logs created by `console.error` that begin with "Warning: " will no longer be treated as warnings. These call sites should migrate to using `console.warn` instead. ([5ab418460b](https://github.com/facebook/react-native/commit/5ab418460b573a02feb5e394392ac87a8b79848b) by [@yungsters](https://github.com/yungsters))
+- **Runtime**: Refactor how shadow tree revisions are promoted as latest for JS consistency ([4a7bc4c0e7](https://github.com/facebook/react-native/commit/4a7bc4c0e7424bf0dcea9ae2a3c1ce3e4cbb1333) by [@j-piasecki](https://github.com/j-piasecki))
+- **Runtime**: The JS revision merge now is scheduled on the main thread ([47e5e6c394](https://github.com/facebook/react-native/commit/47e5e6c3945b97fd64b9dd0465a30b42259d6157) by [@j-piasecki](https://github.com/j-piasecki))
+- **Text**: Text Can Conditionally Use "RCTSelectableText" Native Component ([a175bff10a](https://github.com/facebook/react-native/commit/a175bff10a459005504ba037ab6eede0d2724e29) by [@NickGerleman](https://github.com/NickGerleman))
+- **Text**: Text outside the bounds of a borderRadius is now hidden by default ([2111bec8d5](https://github.com/facebook/react-native/commit/2111bec8d5044486f5f123949b32dc58657a21ab) by [@NickGerleman](https://github.com/NickGerleman))
+- **TypeScript**: Transform `$Values` to `Values` ([94383613d8](https://github.com/facebook/react-native/commit/94383613d8a836682a4789ce7528b05b4a2b1c3d) by [@marcoww6](https://github.com/marcoww6))
+- **TypeScript**: Transform `mixed` to `unknown` in xplat/js ([625d702fec](https://github.com/facebook/react-native/commit/625d702fec0d0aa29953a8152219f9651f490dcd) by [@marcoww6](https://github.com/marcoww6))
+- **TypeScript**: Transform $ReadOnly to Readonly 38/n ([41efc3b588](https://github.com/facebook/react-native/commit/41efc3b5886e285b9b660fa4504f759eeac796c4) by [@marcoww6](https://github.com/marcoww6))
+- **TypeScript**: Transform $ReadOnlyArray to ReadonlyArray 17/n ([7051a07c63](https://github.com/facebook/react-native/commit/7051a07c637bc221889eba5017d62600cca7701d) by [@marcoww6](https://github.com/marcoww6))
+- **TypeScript**: Transform $ReadOnlyArray to ReadonlyArray 18/n ([92c32780f1](https://github.com/facebook/react-native/commit/92c32780f1842be4d0bb82ca06f66cf3d2ea4011) by [@marcoww6](https://github.com/marcoww6))
+- **TypeScript**: Transform all remaining utility types ([cd3a9c55c1](https://github.com/facebook/react-native/commit/cd3a9c55c109e7312152653f8a4ccacc58ddf0f8) by [@marcoww6](https://github.com/marcoww6))
+- **TypeScript**: Transform mixed to unknown ([60f9bfd546](https://github.com/facebook/react-native/commit/60f9bfd5469c9de61559cb4d5941748394fd5a19) by [@marcoww6](https://github.com/marcoww6))
+- **Yoga**: Migrate `YogaNode` to Kotlin ([cd27b7e1a8](https://github.com/facebook/react-native/commit/cd27b7e1a85c89423f88b9ab0e53f620a146b9a0) by [@mateoguzmana](https://github.com/mateoguzmana))
+
+#### Android specific
+
+- **Animated**: Log error when unsupported type is passed to interpolation outputRange ([30fd0c4ac8](https://github.com/facebook/react-native/commit/30fd0c4ac82edb8716c8b05239ae55909bc83b12) by [@zeyap](https://github.com/zeyap))
+- **Build**: Add Sonatype Central repository for users of nightly builds only ([47c3ebe23f](https://github.com/facebook/react-native/commit/47c3ebe23f201f012dc077293065090d5a16de61) by [@sergeich](https://github.com/sergeich))
+- **Build**: Gradle to 9.3.1 ([319e589d3d](https://github.com/facebook/react-native/commit/319e589d3d15f226f29bced5bb66d4aa3c63ef10) by [@cortinico](https://github.com/cortinico))
+- **i18n**: Translation auto-update for batch 0/61 on master ([26da0fa509](https://github.com/facebook/react-native/commit/26da0fa50995d6ba33fbfafeb74d31e5115869c5) by Intl Scheduler)
+- **React Native DevTools**: CDP: The`deviceName` field in app metadata is now prefixed with the manufacturer ([9b906753d9](https://github.com/facebook/react-native/commit/9b906753d9ac44e84bdd46ba6868f9a16604a5e7) by [@huntie](https://github.com/huntie))
+- **Runtime**: Updated documentation for GuardedFrameCallback class ([dfcb56dfea](https://github.com/facebook/react-native/commit/dfcb56dfea3b71a091e2b84bd27b1ca7bde7724f) by [@mdvacca](https://github.com/mdvacca))
+- **ScrollView**: Updated the `nestedScrollEnabled` prop to default to true if the ScrollView defines a `refreshControl` ([95bac85b5a](https://github.com/facebook/react-native/commit/95bac85b5a8bba67289a503544a00615b3506047) by [@Abbondanzo](https://github.com/Abbondanzo))
+- **Text**: Merge ReactTextAnchorViewManager into ReactTextViewManager ([f67f6a2448](https://github.com/facebook/react-native/commit/f67f6a244852b22bf8dcd79a3269073143aeba58) by [@NickGerleman](https://github.com/NickGerleman))
+- **Yoga**: Migrate `YogaConfigJNIBase` to Kotlin ([9db85e7503](https://github.com/facebook/react-native/commit/9db85e75037656616cc396ea34a6cf5f087c4da4) by [@mateoguzmana](https://github.com/mateoguzmana))
+- **Yoga**: Migrate `YogaProps` to Kotlin ([2e12cbdfb3](https://github.com/facebook/react-native/commit/2e12cbdfb396ca865d3088caf9aba3acf153a0b9) by [@mateoguzmana](https://github.com/mateoguzmana))
+
+#### iOS specific
+
+- **Build**: Bump fmt to 12.1.0 to fix Xcode 26.4 ([faeef2b90a](https://github.com/facebook/react-native/commit/faeef2b90a56633ad44289b994d31e7ce590b145) by [@leotm](https://github.com/leotm))
+- **Build**: Changed umbrella header template to use angled import syntax ([2b66a9a622](https://github.com/facebook/react-native/commit/2b66a9a622ada3b540e1466d1dea61f2404d34ab) by [@chrfalch](https://github.com/chrfalch))
+
+### Deprecated
+
+- **Accessibility**: Deprecated `AccessibilityInfo.setAccessibilityFocus` in favor of `AccessibilityInfo.sendAccessibilityEvent` ([36a0d9ef63](https://github.com/facebook/react-native/commit/36a0d9ef63b5ecb1cdf62d6d56b420f484bfa037) by [@Abbondanzo](https://github.com/Abbondanzo))
+
+#### Android specific
+
+- **Legacy Architecture**: Deprecate NativeViewHierarchyOptimizer as part of Legacy Architecture cleanup ([352d73bef0](https://github.com/facebook/react-native/commit/352d73bef0663643a976e947aa3dd40d20542498) by [@mdvacca](https://github.com/mdvacca))
+
+#### iOS specific
+
+- **Runtime**: Deprecate `RCTHostRuntimeDelegate` and merge into `RCTHostDelegate` ([4626732f5b](https://github.com/facebook/react-native/commit/4626732f5b0558ee9bc661deba09e531b96b9b87) by [@tsapeta](https://github.com/tsapeta))
+
+### Removed
+
+- **Animated**: `AnimationBackendChoreographer`, `AndroidAnimationChoregrapher` ([bb7c0f7c5f](https://github.com/facebook/react-native/commit/bb7c0f7c5f5d8648a1feddf42a6927d7eb0e6299) by Bartlomiej Bloniarz)
+- **Legacy Architecture**: Stub UIViewOperationQueue and remove its usages ([7de3dbe1c8](https://github.com/facebook/react-native/commit/7de3dbe1c864c7159034287960befd8756aac69e) by [@mdvacca](https://github.com/mdvacca))
+
+#### Android specific
+
+- **Legacy Architecture**: Remove deprecated CatalystInstanceImpl ([0889f7d774](https://github.com/facebook/react-native/commit/0889f7d774138596b8a6c510424fe151fea09a50) by [@mdvacca](https://github.com/mdvacca))
+- **Legacy Architecture**: Removed Paper-specific event dispatching methods. ([05d64d9316](https://github.com/facebook/react-native/commit/05d64d9316fa43838438673a8041e557e33d030a) by [@javache](https://github.com/javache))
+- **Legacy Architecture**: Stub out NativeViewHierarchyManager (Legacy Architecture) ([c2156a835f](https://github.com/facebook/react-native/commit/c2156a835ffc2d1d6f15d7b28cbc59bd8a9720ec) by [@mdvacca](https://github.com/mdvacca))
+- **Text**: Remove Deprecated ReactTextInputShadowNode ([d5399dd40d](https://github.com/facebook/react-native/commit/d5399dd40d8f939f3009288a4b69f7ab5282e89d) by [@NickGerleman](https://github.com/NickGerleman))
+- **View**: Removed support for ReactZIndexedViewGroup ([81acf78f81](https://github.com/facebook/react-native/commit/81acf78f81ebde3bc6aa06c817e490e858a33e67) by [@javache](https://github.com/javache))
+
+### Fixed
+
+- **Animated**: (animationbackend) add default in switch statements ([66f6146f6f](https://github.com/facebook/react-native/commit/66f6146f6f0689c54034aa2615f4cdc5c89cbd5d) by [@zeyap](https://github.com/zeyap))
+- **Animated**: Fixed TypeError when serializing arbitrary transform operation ([8067f7b353](https://github.com/facebook/react-native/commit/8067f7b3533de890f80afad86ece12f0d83d1d8c) by [@coado](https://github.com/coado))
+- **Babel**: Babel-preset: Don't override explicitly-passed `dev` config if obsolete `withDevTools` is missing ([c5a38ab285](https://github.com/facebook/react-native/commit/c5a38ab2859ba64f424655948fd2cd76159b272a) by [@robhogan](https://github.com/robhogan))
+- **Babel**: Fix Babel transformer changing `BABEL_ENV` as a side effect ([88d40dcda3](https://github.com/facebook/react-native/commit/88d40dcda3f44f64a295bce6560f86fab39962f4) by [@robhogan](https://github.com/robhogan))
+- **Build**: Fix test build breaks after GoogleTest update ([2a776b1f65](https://github.com/facebook/react-native/commit/2a776b1f657235246843ec3f4ff24fc0a583e6c1) by Tal Benesh)
+- **CI**: Typo on maestro ios gh action for jdk step ([0344c0c9cb](https://github.com/facebook/react-native/commit/0344c0c9cb67643c54a6e110e5b9bdd9c3da5e77) by [@gkartalis](https://github.com/gkartalis))
+- **Image**: When using Image with a `uri`, `width` and `height` the default dimensions were being lost ([dd3c20057b](https://github.com/facebook/react-native/commit/dd3c20057b3b550797750d9f9aefe3468a736aa9) by [@javache](https://github.com/javache))
+- **LogBox**: Fix TypeError in LogBoxInspectorReactFrames on Windows/macOS ([995879ca9b](https://github.com/facebook/react-native/commit/995879ca9b30f160e0d7b0e7143227130a2fd9a3) by [@jisoo-hisoo](https://github.com/jisoo-hisoo))
+- **React Native DevTools**: Reaching Metro from Debugger on urls other than localhost:8081 and 127.0.0.1:8081. ([3c7b4881dd](https://github.com/facebook/react-native/commit/3c7b4881dde4cb417bedea7f3c28aa98c3500c13) by [@vzaidman](https://github.com/vzaidman))
+- **React Native DevTools**: Send network events to all CDP clients with the Network domain enabled ([93a43c90ce](https://github.com/facebook/react-native/commit/93a43c90ce35ca346319b9877dbfbe0c971b5b41) by [@motiz88](https://github.com/motiz88))
+- **Runtime**: Fixed crash in `cloneMultiple` when families have no path to root ([54b4cb5e89](https://github.com/facebook/react-native/commit/54b4cb5e8926770935f2c482b5f2fbdac66d2d83) by [@coado](https://github.com/coado))
+- **TextInput**: Fix memory leak in TextInput ([5229e507e1](https://github.com/facebook/react-native/commit/5229e507e1a1cb0cff00ab49fb21f9d47438582d) by [@mobinni](https://github.com/mobinni))
+- **TextInput**: Fixed isFocused false positive ([42cd0f0414](https://github.com/facebook/react-native/commit/42cd0f04148ad7760e5c2099954b6912d02b35c4) by [@chicio](https://github.com/chicio))
+- **Yoga**: Fix CQS signal modernize-use-designated-initializers in xplat/yoga/yoga/algorithm ([4ef7ac3136](https://github.com/facebook/react-native/commit/4ef7ac3136e500fdd400e05d283d2e6abfcbeec5) by generatedunixname1587093422349604)
+
+#### Android specific
+
+- **Accessibility**: Properly set view.setEnabled() based on accessibilityState.disabled ([fc66884d73](https://github.com/facebook/react-native/commit/fc66884d7350230f0b682b6d0394a922d5409196) by [@fabriziocucci](https://github.com/fabriziocucci))
+- **Accessibility**: Reset isClickable to false when recycling views to avoid accessibility tools finding views with incorrect state ([07c0539cb8](https://github.com/facebook/react-native/commit/07c0539cb81d02d69e20d3733e479228e7bc8469) by [@fabriziocucci](https://github.com/fabriziocucci))
+- **Accessibility**: Reset OnClickListener to null when recycling views to avoid accessibility tools finding views with incorrect state ([04bdebc585](https://github.com/facebook/react-native/commit/04bdebc585840c6a4b72be435a7f399082319da9) by [@fabriziocucci](https://github.com/fabriziocucci))
+- **Accessibility**: Set accessibilityRole to "link" for pressable Text components by default ([68e5b4ee9f](https://github.com/facebook/react-native/commit/68e5b4ee9f9c5bc4b1b1d38595320054e5b54fd5) by [@fabriziocucci](https://github.com/fabriziocucci))
+- **Animated**: Fix null pointer crash in FabricUIManagerBinding::driveCxxAnimations by adding null check for scheduler ([349cf1595b](https://github.com/facebook/react-native/commit/349cf1595bd0135e07862d4f51b2eb2eda610db4) by Dileep Siva Sai Nallabothu)
+- **Animated**: Prevent Native Animated tracking spring crash when tracked `toValue` node is detached. ([45de7109fe](https://github.com/facebook/react-native/commit/45de7109fe93db8052e9ba06e53807f89cbd7fd9) by [@kmsbernard](https://github.com/kmsbernard))
+- **Build**: Fix included-build `gradle.properties` resolution for monorepos by reading from parent Gradle start parameters (`projectDir`/`currentDir`) before falling back to `../../android/gradle.properties`, so `hermesV1Enabled` can be inherited correctly. ([c5ae0c820a](https://github.com/facebook/react-native/commit/c5ae0c820a571141a43de980cb011d232fc2268f) by [@Titozzz](https://github.com/Titozzz))
+- **Codegen**: Validate module names in codegen ([a748a405b6](https://github.com/facebook/react-native/commit/a748a405b66546367f0160425d135be88812763d) by [@RSNara](https://github.com/RSNara))
+- **Dev Server**: Sync bundling progress between Metro cli and app hints ([56e1710b73](https://github.com/facebook/react-native/commit/56e1710b73f0011516872bc6a62e52626588839c) by [@vzaidman](https://github.com/vzaidman))
+- **Hermes**: Fixed so that all build types get the HERMES_V1_ENABLED flag ([8d68b11005](https://github.com/facebook/react-native/commit/8d68b110059fbd0b6e5da24e7ead66554262af60) by [@chrfalch](https://github.com/chrfalch))
+- **Hermes**: Provide symbol fallbacks for `inspector-modern/chrome/Registration.h` when HermesV1 is disabled. ([5ee695ad8f](https://github.com/facebook/react-native/commit/5ee695ad8f41d7c9a92a83fa1f0acd227cdab7b8) by [@tjzel](https://github.com/tjzel))
+- **Hermes**: ReactPlugin.kt always setting `hermesV1Enabled` to `true` ([45896674d1](https://github.com/facebook/react-native/commit/45896674d14d4b0104cb166e83c5b403f90981c0) by [@tjzel](https://github.com/tjzel))
+- **Image**: Image fadeDuration=0 not working with props 2.0 enabled ([3fb5c0bc02](https://github.com/facebook/react-native/commit/3fb5c0bc0224a33afb275d73e963d85111b561b2) by [@hannojg](https://github.com/hannojg))
+- **Legacy Architecture**: Restore getUIImplementation() stub for backwards compatibility with third-party libraries ([e5d2d951de](https://github.com/facebook/react-native/commit/e5d2d951de3e2081d512d363120c0d38eb21d3c9) by [@sammy-SC](https://github.com/sammy-SC))
+- **Networking**: File:// URIs passed to fetch() or XMLHttpRequest no longer fail (https://github.com/facebook/react-native/issues/54626) ([e76a6e2ef4](https://github.com/facebook/react-native/commit/e76a6e2ef4bfd2cf9e10a4a2ffe21bd1b2c981a9) by [@bhamiltoncx](https://github.com/bhamiltoncx))
+- **Runtime**: Capture idle callback before running it ([90e48d6031](https://github.com/facebook/react-native/commit/90e48d6031de3188a71157fe22d80b138a8d7605) by [@mozzius](https://github.com/mozzius))
+- **Runtime**: Fix thread-safety crash in `DynamicFromArray` by using `ThreadLocal` instead of a shared `SimplePool`, matching the existing fix in `DynamicFromMap` ([21fae86546](https://github.com/facebook/react-native/commit/21fae865468fa0ec178078ca834e77964abf7d0a) by [@edwii-zhu](https://github.com/edwii-zhu))
+- **ScrollView**: Fixed bug where joystick could still scroll when scrollEnabled is false ([c51b9698c7](https://github.com/facebook/react-native/commit/c51b9698c7e5f571146264c5ba0281dd7b28e408) by William Khoe)
+- **Text**: Fix crash with setting certain `` props back to `undefined` when using `enablePropsUpdateReconciliationAndroid` feature flag ([50289e3add](https://github.com/facebook/react-native/commit/50289e3addcfc4162b72d46e03c1750523418c39) by [@hannojg](https://github.com/hannojg))
+- **Text**: FontVariants `stylistic-{num}` not being propagated correctly ([9353eb55b8](https://github.com/facebook/react-native/commit/9353eb55b877e6e51c35c6041eebd72971c6b9a5) by [@dragoncodes](https://github.com/dragoncodes))
+- **View**: Fix image content disappearing on API 24 (Nougat) when antialiased border radius clipping is applied ([51ec52e806](https://github.com/facebook/react-native/commit/51ec52e8068bd90cca20d9e5bfe369565fb0454f) by [@Abbondanzo](https://github.com/Abbondanzo))
+
+#### iOS specific
+
+- **Accessibility**: Ensure accessibilityElementsHidden prop is respected in recursive accessibility label aggregation ([b60f533acc](https://github.com/facebook/react-native/commit/b60f533accc589ddff7fde8fbdaa65606b2cad85) by Max Polevy)
+- **Animated**: Fixed edge-case with animating non-layout props through the `commitUpdates` path. ([31f215a421](https://github.com/facebook/react-native/commit/31f215a42183fa815204c8d730cc41437b077534) by [@coado](https://github.com/coado))
+- **Animated**: Revert RCTAnimatedModuleProvider change from [# 55729](https://github.com/facebook/react-native/pull/55729) ([85696fe](https://github.com/facebook/react-native/commit/85696fe1169d737c42cc9b4f85472dda23e99ed7) by [@zeyap](https://github.com/zeyap))
+- **Build**: Fix unused exception parameter compile error in RCTUIManager catch block in certain build mode ([58bc6c3e38](https://github.com/facebook/react-native/commit/58bc6c3e38d45398ebec01a5399eac8d72f83adc) by Yannick Loriot)
+- **Build**: Fixed duplicate symbol error when using React.XCFramework ([d21ffc9e32](https://github.com/facebook/react-native/commit/d21ffc9e322060c354b78da84d590cfc337c1de8) by [@chrfalch](https://github.com/chrfalch))
+- **Build**: Fixed replace script deleting the react-vfs.yaml file on iOS ([11e257cec0](https://github.com/facebook/react-native/commit/11e257cec09d1e69e7261fd769ad0f0e4007e09e) by [@chrfalch](https://github.com/chrfalch))
+- **CocoaPods**: Add `nkf` and `base64` as ruby dependencies ([51c965883f](https://github.com/facebook/react-native/commit/51c965883f609b93b47c99b18ab260633a57346a) by [@kimchi-developer](https://github.com/kimchi-developer))
+- **CocoaPods**: Allow absolute react-native paths to be passed to `use_react_native!` in project podfiles ([33641f09fa](https://github.com/facebook/react-native/commit/33641f09fa91e93bc5780c2d6999515f9761a17f) by [@kitten](https://github.com/kitten))
+- **CocoaPods**: Regression from https://github.com/facebook/react-native/issues/54948 preventing `pod install --project-directory` from working properly ([9f686f2014](https://github.com/facebook/react-native/commit/9f686f2014aefd2ad6ee3b5843718d5d7d72d13a) by [@kitten](https://github.com/kitten))
+- **Dev Server**: Not crashing on network issues with connecting to DevServer ([ec29c292e0](https://github.com/facebook/react-native/commit/ec29c292e0417ef2c02fefe08f904117c3d5972e) by [@vzaidman](https://github.com/vzaidman))
+- **Dev Server**: Sync bundling progress between Metro cli and app hints ([e112934f2e](https://github.com/facebook/react-native/commit/e112934f2e1c74732e2fcf828299d8afab648d8e) by [@vzaidman](https://github.com/vzaidman))
+- **Hermes**: Fix Hermes crash when async void TurboModule method throws NSException by re-throwing instead of converting to JSError on wrong thread ([4083a6ff92](https://github.com/facebook/react-native/commit/4083a6ff92b0ffd4f71166848f3d7ce36172fac8) by [@fabriziocucci](https://github.com/fabriziocucci))
+- **Image**: Fix expo-image-manipulator cropped image orientation ([978d5a2d4f](https://github.com/facebook/react-native/commit/978d5a2d4f4eede9cd6ba4786cae2dcc99ce3a37) by [@mlazari](https://github.com/mlazari))
+- **Image**: Resolves a rare race-condition that can trigger in RCTImageComponentView. ([3b46755b3b](https://github.com/facebook/react-native/commit/3b46755b3b2f4a53b79d0828ef4c0cfe319a34ac) by Ryan Frawley)
+- **Prebuild**: Refactored header files generator for prebuilt React framework ([3fad7dc13d](https://github.com/facebook/react-native/commit/3fad7dc13dc6a7e4a2e9f5e877561526f990e90d) by [@chrfalch](https://github.com/chrfalch))
+- **ScrollView**: Reset contentInset in scroll view prepareForRecycle ([984dbe83d8](https://github.com/facebook/react-native/commit/984dbe83d8de76fd94c191173dc23897d31edcd8) by [@sandeee1928](https://github.com/sandeee1928))
+- **View**: Fixed `transformOrigin` using stale layout dimensions from recycled views, causing incorrect transform positioning ([0eb5e652a2](https://github.com/facebook/react-native/commit/0eb5e652a2957720500f1689c7d41528f8b13738) by Mazin Zakaria)
+
+### Security
+
+- **Dependencies**: Bump to `chromium-edge-launcher@^0.3.0` to drop `rimraf` ([1f2312687b](https://github.com/facebook/react-native/commit/1f2312687bae96d8a1f7bbd5d44ec628859656eb) by [@kitten](https://github.com/kitten))
+
+
## v0.84.0
### Breaking
@@ -191,6 +421,69 @@
- **Touch Handling**: Respect `cancelsTouchesInView` when canceling touches in `RCTSurfaceTouchHandler` ([5634e8a601](https://github.com/facebook/react-native/commit/5634e8a601caf0faa174bac3511929de767609ac) by [@intmain](https://github.com/intmain))
- **View**: Fix duplicate shadow bug during component recycling by cleaning up visual layers in prepareForRecycle ([7dcedf1def](https://github.com/facebook/react-native/commit/7dcedf1def880163ab7ca07b2575a8153029a925) by Atharv Soni)
+## v0.83.8
+
+### Fixed
+
+- Fix missing header search path for React-featureflags in React-CoreModules ([2ff85bcba2](https://github.com/facebook/react-native/commit/2ff85bcba292dcd0d395a7fc218cbff79e5f2116) by [@radko93](https://github.com/radko93))
+
+## v0.83.7
+
+- Changes to experimental features only.
+
+## v0.83.6
+
+### Fixed
+
+- Provide symbol fallbacks for `inspector-modern/chrome/Registration.h` when `HERMES_V1_ENABLED` is set ([efc4cf4ea9](https://github.com/facebook/react-native/commit/efc4cf4ea963894ef6c5ed57bab16e46c4d6e5ca) by [@huntie](https://github.com/huntie))
+
+#### iOS specific
+
+- Fix "Loading from Metro..." banner getting stuck after reloads in quick succession. ([e122c24c27](https://github.com/facebook/react-native/commit/e122c24c273f5fb6e0a2d6b1c961d75ac9bc90b7) by [@alanjhughes](https://github.com/alanjhughes))
+
+## v0.83.5
+
+### Fixed
+
+- **Appearance**: Fix color scheme in appearance state after setting it to unspecified ([c338d19](https://github.com/facebook/react-native/commit/c338d19a1d4dfeb06ca796176a23f6b07457ac50) by [@ismarbesic](https://github.com/ismarbesic))
+
+#### Android specific
+
+- **Networking**: File:// URIs passed to fetch() or XMLHttpRequest no longer fail (https://github.com/facebook/react-native/issues/54626) ([3cf6bff](https://github.com/facebook/react-native/commit/3cf6bff25d106c2f25b6c7cfce6295bd812013bf) by [@bhamiltoncx](https://github.com/bhamiltoncx))
+
+#### iOS specific
+
+- **Build**: Bump fmt to 12.1.0 to fix Xcode 26.4 ([faeef2b90a](https://github.com/facebook/react-native/commit/faeef2b90a56633ad44289b994d31e7ce590b145) by [@leotm](https://github.com/leotm))
+- **Hermes**: Fix Hermes crash when async void TurboModule method throws NSException by re-throwing instead of converting to JSError on wrong thread ([a9a976a](https://github.com/facebook/react-native/commit/a9a976af89c3cd52e7f742109e24dbc6ebf09aa9) by [@fabriziocucci](https://github.com/fabriziocucci))
+
+## v0.83.4
+
+### Fixed
+
+#### iOS specific
+
+- **Precompiled Binaries:** Add RCTDevSupportHeaders in React Umbrella ([cfb5328833](https://github.com/facebook/react-native/commit/cfb53288331885ce5d221783affe2f1fb9e18782) by [@cipolleschi](https://github.com/cipolleschi))
+
+## v0.83.3
+
+### Added
+
+#### Android specific
+
+- **Dev Support**: [0.83] Add support for custom header in devsupport ([c8ab750148](https://github.com/facebook/react-native/commit/c8ab750148f318062a75f5294020e854d91969dc) by [@cortinico](https://github.com/cortinico))
+
+### Changed
+
+- **CI**: Skip set-rn-artifacts-version for PRs targeting stable branches ([81223f27b7](https://github.com/facebook/react-native/commit/81223f27b7cba74a9c560614b3b9655e54b12b31) by [@cipolleschi](https://github.com/cipolleschi))
+
+### Fixed
+
+- **Build**: [0.83] Fix rncore tarball extraction for EdenFS compatibility ([becef72f12](https://github.com/facebook/react-native/commit/becef72f1216430f9ac0c3e9c90c87a2167651d3) by [@cipolleschi](https://github.com/cipolleschi))
+
+#### Android specific
+
+- **Gradle**: Fix included-build `gradle.properties` resolution for monorepos by reading from parent Gradle start parameters (`projectDir`/`currentDir`) before falling back to `../../android/gradle.properties`, so `hermesV1Enabled` can be inherited correctly. ([c5ae0c820a](https://github.com/facebook/react-native/commit/c5ae0c820a571141a43de980cb011d232fc2268f) by [@Titozzz](https://github.com/Titozzz))
+
## v0.83.2
### Added
diff --git a/build.gradle.kts b/build.gradle.kts
index 2154d20f22e..0858b5cb291 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -116,7 +116,7 @@ var hermesSubstitution: Pair? = null
if (project.findProperty("react.internal.useHermesStable")?.toString()?.toBoolean() == true) {
val hermesVersions = java.util.Properties()
val hermesVersionPropertiesFile =
- File("./packages/react-native/sdks/hermes-engine/version.properties")
+ rootProject.file("./packages/react-native/sdks/hermes-engine/version.properties")
hermesVersionPropertiesFile.inputStream().use { hermesVersions.load(it) }
val selectedHermesVersion = hermesVersions["HERMES_V1_VERSION_NAME"] as String
@@ -124,7 +124,7 @@ if (project.findProperty("react.internal.useHermesStable")?.toString()?.toBoolea
} else if (
project.findProperty("react.internal.useHermesNightly")?.toString()?.toBoolean() == true
) {
- val reactNativePackageJson = File("./packages/react-native/package.json")
+ val reactNativePackageJson = rootProject.file("./packages/react-native/package.json")
val reactNativePackageJsonContent = reactNativePackageJson.readText()
val packageJson = groovy.json.JsonSlurper().parseText(reactNativePackageJsonContent) as Map<*, *>
@@ -137,7 +137,15 @@ if (project.findProperty("react.internal.useHermesStable")?.toString()?.toBoolea
)
}
- hermesSubstitution = "$hermesCompilerVersion-SNAPSHOT" to "Users opted to use hermes nightly"
+ val hermesV1Enabled = project.findProperty("hermesV1Enabled")?.toString()?.toBoolean() ?: true
+ // Hermes V1 stable releases are published without the -SNAPSHOT suffix.
+ // Legacy nightly builds use -SNAPSHOT.
+ val resolvedVersion =
+ if (hermesV1Enabled) hermesCompilerVersion else "$hermesCompilerVersion-SNAPSHOT"
+ val reason =
+ if (hermesV1Enabled) "Users opted to use hermes V1 stable"
+ else "Users opted to use hermes nightly"
+ hermesSubstitution = resolvedVersion to reason
} else {
logger.warn(
"""
diff --git a/flow-typed/environment/node.js b/flow-typed/environment/node.js
index 8bd1534e171..1a99ec0dcbd 100644
--- a/flow-typed/environment/node.js
+++ b/flow-typed/environment/node.js
@@ -21,7 +21,7 @@ interface ErrnoError extends Error {
syscall?: string;
}
-type Node$Conditional = T extends true
+type Node$Conditional = T extends true
? IfTrue
: T extends false
? IfFalse
@@ -282,7 +282,7 @@ type child_process$execFileOpts = Readonly<{
signal?: AbortSignal,
}>;
-type child_process$execFileCallback =
+type child_process$execFileCallback =
child_process$execCallback;
type child_process$execFileSyncOpts = Readonly<{
@@ -414,7 +414,7 @@ type child_process$spawnOpts = Readonly<{
serialization?: 'json' | 'advanced',
}>;
-type child_process$spawnSyncRet = Readonly<{
+type child_process$spawnSyncRet = Readonly<{
pid: number,
output: Array,
// TODO: subprocess.stdout may be null in case of error
@@ -454,9 +454,9 @@ type child_process$Serializable =
type child_process$SendHandle = net$Server | net$Socket;
declare class child_process$ChildProcessTyped<
- TStdin: stream$Writable | null,
- TStdout: stream$Readable | null,
- TStderr: stream$Readable | null,
+ TStdin extends stream$Writable | null,
+ TStdout extends stream$Readable | null,
+ TStderr extends stream$Readable | null,
> extends events$EventEmitter
{
+stdin: TStdin;
@@ -515,7 +515,7 @@ declare module 'child_process' {
stream$Readable,
>;
- type StringOrBuffer =
+ type StringOrBuffer =
Opts extends Readonly<{encoding: infer E, ...}>
? E extends buffer$NonBufferEncoding
? string
@@ -524,11 +524,15 @@ declare module 'child_process' {
: string | Buffer
: Default;
- type StreamForChannel = Channel extends 0
+ type StreamForChannel = Channel extends 0
? stream$Writable
: stream$Readable;
- type MaybeStream =
+ type MaybeStream<
+ Opts,
+ FD extends 0 | 1 | 2,
+ PipeByDefault extends true | false = true,
+ > =
Opts extends Readonly<{stdio: infer E, ...}>
? E extends child_process$StdioPipe
? StreamForChannel
@@ -552,7 +556,7 @@ declare module 'child_process' {
stream$Readable,
>;
- declare function exec(
+ declare function exec(
command: string,
options: Opts,
callback?: child_process$execCallback>,
@@ -562,11 +566,11 @@ declare module 'child_process' {
stream$Readable,
>;
- declare function execSync(
+ declare function execSync(
command: string,
): Buffer;
- declare function execSync(
+ declare function execSync(
command: string,
options: Opts,
): StringOrBuffer;
@@ -583,7 +587,7 @@ declare module 'child_process' {
stream$Readable,
>;
- declare function execFile(
+ declare function execFile(
file: string,
args: ReadonlyArray,
options: Opts,
@@ -594,7 +598,7 @@ declare module 'child_process' {
stream$Readable,
>;
- declare function execFile(
+ declare function execFile(
file: string,
options: Opts,
callback?: child_process$execFileCallback>,
@@ -609,13 +613,13 @@ declare module 'child_process' {
args?: ReadonlyArray,
): Buffer;
- declare function execFileSync(
+ declare function execFileSync(
command: string,
args: ReadonlyArray,
options: Opts,
): StringOrBuffer;
- declare function execFileSync(
+ declare function execFileSync(
command: string,
options: Opts,
): StringOrBuffer;
@@ -625,7 +629,7 @@ declare module 'child_process' {
args?: ReadonlyArray,
): child_process$ChildProcessTyped;
- declare function fork(
+ declare function fork(
modulePath: string,
args: ReadonlyArray,
options: Opts,
@@ -635,7 +639,7 @@ declare module 'child_process' {
MaybeStream,
>;
- declare function fork(
+ declare function fork(
modulePath: string,
options: Opts,
): child_process$ChildProcessTyped<
@@ -653,7 +657,7 @@ declare module 'child_process' {
stream$Readable,
>;
- declare function spawn(
+ declare function spawn(
command: string,
args: ReadonlyArray,
options: Opts,
@@ -663,7 +667,7 @@ declare module 'child_process' {
MaybeStream,
>;
- declare function spawn(
+ declare function spawn(
command: string,
options: Opts,
): child_process$ChildProcessTyped<
@@ -677,13 +681,13 @@ declare module 'child_process' {
args?: ReadonlyArray,
): child_process$spawnSyncRet;
- declare function spawnSync(
+ declare function spawnSync(
command: string,
args: ReadonlyArray,
options: Opts,
): child_process$spawnSyncRet>;
- declare function spawnSync(
+ declare function spawnSync(
command: string,
options: Opts,
): child_process$spawnSyncRet>;
@@ -2112,7 +2116,7 @@ declare module 'fs' {
}>,
): void;
- declare type GlobOptions = Readonly<{
+ declare type GlobOptions = Readonly<{
/**
* Current working directory.
* @default process.cwd()
@@ -2154,7 +2158,7 @@ declare module 'fs' {
callback: (err: ?ErrnoError, matches: Array) => void,
): void;
- declare function glob(
+ declare function glob(
pattern: string | ReadonlyArray,
options: GlobOptions,
callback: (
@@ -2172,7 +2176,7 @@ declare module 'fs' {
* @since v22.0.0
* @returns paths of files that match the pattern.
*/
- declare function globSync(
+ declare function globSync(
pattern: string | ReadonlyArray,
options?: GlobOptions,
): Node$Conditional, Array>;
@@ -2289,7 +2293,7 @@ declare module 'fs' {
): WriteStream;
datasync(): Promise;
fd: number;
- read(
+ read(
buffer: T,
offset: number,
length: number,
@@ -2314,7 +2318,7 @@ declare module 'fs' {
highWaterMark?: number,
}>,
): readline$Interface;
- readv | Array | Array>(
+ readv | Array | Array>(
buffers: T,
position?: number | null,
): Promise<{buffers: T, bytesRead: number}>;
@@ -2340,7 +2344,7 @@ declare module 'fs' {
}>,
): Promise;
writeFile: AppendOrWriteToFileHandle;
- writev | Array | Array>(
+ writev | Array | Array>(
buffers: T,
position?: number | null,
): Promise<{buffers: T, bytesWritten: number}>;
@@ -2386,7 +2390,7 @@ declare module 'fs' {
atime: number | string | Date,
mtime: number | string | Date,
): Promise,
- glob(
+ glob(
pattern: string | ReadonlyArray,
options?: GlobOptions,
): Node$Conditional<
@@ -2422,7 +2426,7 @@ declare module 'fs' {
recursive?: boolean,
}>,
): Promise,
- read(
+ read(
filehandle: FileHandle,
buffer: T,
offset: number,
@@ -2503,7 +2507,7 @@ declare module 'fs' {
overflow?: 'ignore' | 'throw',
}>,
): AsyncIterator<{eventType: string, filename: ?string}>,
- write(
+ write(
filehandle: FileHandle,
buffer: T,
offset: number,
@@ -3314,7 +3318,7 @@ declare module 'perf_hooks' {
now(): number;
setResourceTimingBufferSize(maxSize: number): void;
+timeOrigin: number;
- timerify, TReturn>(
+ timerify, TReturn>(
fn: (...TArgs) => TReturn,
options?: Readonly<{histogram?: RecordableHistogram}>,
): (...TArgs) => TReturn;
@@ -3606,14 +3610,22 @@ declare class stream$Readable extends stream$Stream {
static toWeb(streamReadable: stream$Readable): ReadableStream;
constructor(options?: readableStreamOptions): void;
+ closed: boolean;
destroy(error?: Error): this;
+ destroyed: boolean;
+ errored: ?Error;
isPaused(): boolean;
pause(): this;
- pipe(dest: T, options?: {end?: boolean, ...}): T;
+ pipe(dest: T, options?: {end?: boolean, ...}): T;
read(size?: number): ?(string | Buffer);
readable: boolean;
+ readableAborted: boolean;
+ readableDidRead: boolean;
+ readableEnded: boolean;
+ readableFlowing: boolean | null;
readableHighWaterMark: number;
readableLength: number;
+ readableObjectMode: boolean;
resume(): this;
setEncoding(encoding: string): this;
unpipe(dest?: stream$Writable): this;
@@ -3658,8 +3670,10 @@ declare class stream$Writable extends stream$Stream {
static toWeb(streamWritable: stream$Writable): WritableStream;
constructor(options?: writableStreamOptions): void;
+ closed: boolean;
cork(): void;
destroy(error?: Error): this;
+ destroyed: boolean;
end(callback?: () => void): this;
end(chunk?: string | Buffer | Uint8Array, callback?: () => void): this;
end(
@@ -3667,11 +3681,17 @@ declare class stream$Writable extends stream$Stream {
encoding?: string,
callback?: () => void,
): this;
+ errored: ?Error;
setDefaultEncoding(encoding: string): this;
uncork(): void;
writable: boolean;
+ writableAborted: boolean;
+ writableEnded: boolean;
+ writableFinished: boolean;
writableHighWaterMark: number;
writableLength: number;
+ writableNeedDrain: boolean;
+ writableObjectMode: boolean;
write(
chunk: string | Buffer | Uint8Array,
callback?: (error?: Error) => void,
@@ -3773,25 +3793,25 @@ declare module 'stream' {
},
callback: (error?: Error) => void,
): () => void;
- declare function pipeline(
+ declare function pipeline(
s1: stream$Readable,
last: T,
cb: (error?: Error) => void,
): T;
- declare function pipeline(
+ declare function pipeline(
s1: stream$Readable,
s2: stream$Duplex,
last: T,
cb: (error?: Error) => void,
): T;
- declare function pipeline(
+ declare function pipeline(
s1: stream$Readable,
s2: stream$Duplex,
s3: stream$Duplex,
last: T,
cb: (error?: Error) => void,
): T;
- declare function pipeline(
+ declare function pipeline(
s1: stream$Readable,
s2: stream$Duplex,
s3: stream$Duplex,
@@ -3799,7 +3819,7 @@ declare module 'stream' {
last: T,
cb: (error?: Error) => void,
): T;
- declare function pipeline(
+ declare function pipeline(
s1: stream$Readable,
s2: stream$Duplex,
s3: stream$Duplex,
@@ -3808,7 +3828,7 @@ declare module 'stream' {
last: T,
cb: (error?: Error) => void,
): T;
- declare function pipeline(
+ declare function pipeline(
s1: stream$Readable,
s2: stream$Duplex,
s3: stream$Duplex,
@@ -4191,19 +4211,19 @@ declare module 'timers' {
// [key: $SymbolDispose]: () => void;
}
- declare export function setTimeout>(
+ declare export function setTimeout>(
callback: (...args: TArgs) => unknown,
delay?: number,
...args: TArgs
): Timeout;
- declare export function setInterval>(
+ declare export function setInterval>(
callback: (...args: TArgs) => unknown,
delay?: number,
...args: TArgs
): Timeout;
- declare export function setImmediate>(
+ declare export function setImmediate>(
callback: (...args: TArgs) => unknown,
...args: TArgs
): Immediate;
@@ -4500,7 +4520,7 @@ declare module 'util' {
declare function stripVTControlCharacters(str: string): string;
declare function parseArgs<
- TOptions: {+[string]: util$ParseArgsOption} = {},
+ TOptions extends {+[string]: util$ParseArgsOption} = {},
>(config: {
args?: Array,
options?: TOptions,
@@ -4514,7 +4534,7 @@ declare module 'util' {
};
declare function parseArgs<
- TOptions: {[string]: util$ParseArgsOption} = {},
+ TOptions extends {[string]: util$ParseArgsOption} = {},
>(config: {
args?: Array,
options?: TOptions,
@@ -5658,7 +5678,7 @@ declare class Process extends events$EventEmitter {
setegid?: (id: number | string) => void;
seteuid?: (id: number | string) => void;
setgid?: (id: number | string) => void;
- setgroups?: (groups: Array) => void;
+ setgroups?: (groups: Array) => void;
setuid?: (id: number | string) => void;
stderr: stream$Writable | tty$WriteStream;
stdin: stream$Readable | tty$ReadStream;
diff --git a/flow-typed/npm/@isaacs/ttlcache_1.x.x.js b/flow-typed/npm/@isaacs/ttlcache_1.x.x.js
index d39c43742b2..0f0f04fe7d5 100644
--- a/flow-typed/npm/@isaacs/ttlcache_1.x.x.js
+++ b/flow-typed/npm/@isaacs/ttlcache_1.x.x.js
@@ -31,7 +31,7 @@ declare module '@isaacs/ttlcache' {
* as in `cache.set(key, undefined)`. Use `cache.has()` to determine
* whether a key is present in the cache at all.
*/
- get(key: K, options?: TTLCache$GetOptions): T | void;
+ get(key: K, options?: TTLCache$GetOptions): T | void;
/**
* Check if a key is in the cache.
diff --git a/flow-typed/npm/babel-traverse_v7.x.x.js b/flow-typed/npm/babel-traverse_v7.x.x.js
index 3abf30bc3c5..e28bb4921fe 100644
--- a/flow-typed/npm/babel-traverse_v7.x.x.js
+++ b/flow-typed/npm/babel-traverse_v7.x.x.js
@@ -25,7 +25,7 @@ declare module '@babel/traverse' {
getCode(): ?string;
getScope(): ?Scope;
addHelper(name: string): {};
- buildError(
+ buildError(
node: BabelNode,
msg: string,
Error: Class,
@@ -37,7 +37,7 @@ declare module '@babel/traverse' {
getCode(): ?string;
getScope(): ?Scope;
addHelper(name: string): {};
- buildError(
+ buildError(
node: BabelNode,
msg: string,
Error: Class,
@@ -294,7 +294,7 @@ declare module '@babel/traverse' {
declare type Opts = {...};
- declare export class NodePath<+TNode: BabelNode = BabelNode> {
+ declare export class NodePath<+TNode extends BabelNode = BabelNode> {
parent: BabelNode;
hub: HubInterface;
contexts: Array;
@@ -340,7 +340,7 @@ declare module '@babel/traverse' {
setData(key: string, val: TVal): TVal;
getData(key: string, def?: TVal): TVal;
- buildCodeFrameError(
+ buildCodeFrameError(
msg: string,
Error?: Class,
): TError;
@@ -724,7 +724,7 @@ declare module '@babel/traverse' {
getAllPrevSiblings(): Array>;
- get(
+ get(
key: TKey,
context?: boolean | TraversalContext,
): TNode[TKey] extends BabelNode ? NodePath<> : Array>;
@@ -1432,17 +1432,20 @@ declare module '@babel/traverse' {
// END GENERATED NODE PATH METHODS
}
- declare export type VisitNodeFunction<-TNode: BabelNode, TState> = (
+ declare export type VisitNodeFunction<-TNode extends BabelNode, TState> = (
path: NodePath,
state: TState,
) => void;
- declare export type VisitNodeObject<-TNode: BabelNode, TState> = Partial<{
+ declare export type VisitNodeObject<
+ -TNode extends BabelNode,
+ TState,
+ > = Partial<{
enter(path: NodePath, state: TState): void,
exit(path: NodePath, state: TState): void,
}>;
- declare export type VisitNode<-TNode: BabelNode, TState> =
+ declare export type VisitNode<-TNode extends BabelNode, TState> =
| VisitNodeFunction
| VisitNodeObject;
diff --git a/flow-typed/npm/babel_v7.x.x.js b/flow-typed/npm/babel_v7.x.x.js
index f9d293c16c1..4da72d6b7d5 100644
--- a/flow-typed/npm/babel_v7.x.x.js
+++ b/flow-typed/npm/babel_v7.x.x.js
@@ -353,7 +353,7 @@ declare module '@babel/core' {
raw: BabelNodeArrayExpression,
): BabelNodeIdentifier;
- buildCodeFrameError(
+ buildCodeFrameError(
node: BabelNode,
msg: string,
Class,
@@ -1083,6 +1083,8 @@ declare module '@babel/core' {
+babelrc: string | void;
+babelignore: string | void;
+config: string | void;
+ +files: ReadonlySet;
+ +fileHandling: 'ignored' | 'transpile' | 'unsupported';
constructor(options: ValidatedOptions): PartialConfig;
diff --git a/flow-typed/npm/jest.js b/flow-typed/npm/jest.js
index ae645e711e8..00767deaa1c 100644
--- a/flow-typed/npm/jest.js
+++ b/flow-typed/npm/jest.js
@@ -13,7 +13,7 @@
// MODIFIED: Added ESLint suppression comment - no-unused-vars doesn't understand declaration files
-type JestMockFn, TReturn> = {
+type JestMockFn, TReturn> = {
(...args: TArguments): TReturn,
/**
* An object for introspecting mock calls
@@ -881,7 +881,10 @@ type JestObjectType = {
* implementation.
*/
// MODIFIED: Added defaults to type arguments.
- fn = ReadonlyArray, TReturn = any>(
+ fn<
+ TArguments extends ReadonlyArray = ReadonlyArray,
+ TReturn = any,
+ >(
implementation?: (...args: TArguments) => TReturn,
): JestMockFn,
/**
diff --git a/flow-typed/npm/rxjs_v6.x.x.js b/flow-typed/npm/rxjs_v6.x.x.js
index a8c085b8a54..a4326724e3e 100644
--- a/flow-typed/npm/rxjs_v6.x.x.js
+++ b/flow-typed/npm/rxjs_v6.x.x.js
@@ -2196,7 +2196,7 @@ declare module 'rxjs/operators' {
key: keyof T,
): rxjs$MonoTypeOperatorFunction;
- declare export function distinctUntilKeyChanged(
+ declare export function distinctUntilKeyChanged(
key: K,
compare: (x: unknown, y: unknown) => boolean,
): rxjs$MonoTypeOperatorFunction;
@@ -2291,7 +2291,7 @@ declare module 'rxjs/operators' {
scheduler?: rxjs$SchedulerLike,
): rxjs$MonoTypeOperatorFunction;
- declare export function filter(
+ declare export function filter(
predicate: (value: T, index: number) => boolean,
thisArg?: any,
): rxjs$OperatorFunction;
@@ -2305,7 +2305,7 @@ declare module 'rxjs/operators' {
callback: () => void,
): rxjs$MonoTypeOperatorFunction;
- declare export function find(
+ declare export function find(
predicate: (value: T, index: number, source: rxjs$Observable) => boolean,
thisArg?: any,
): rxjs$OperatorFunction;
@@ -2938,7 +2938,7 @@ declare module 'rxjs/operators' {
notifier: rxjs$Observable,
): rxjs$MonoTypeOperatorFunction;
- declare export function takeWhile(
+ declare export function takeWhile(
predicate: (value: T, index: number) => S,
inclusive?: boolean,
): rxjs$OperatorFunction;
diff --git a/flow-typed/npm/shelljs_v0.x.x.js b/flow-typed/npm/shelljs_v0.x.x.js
index 51567de3d7d..c5ffdee8061 100644
--- a/flow-typed/npm/shelljs_v0.x.x.js
+++ b/flow-typed/npm/shelljs_v0.x.x.js
@@ -27,14 +27,14 @@ declare interface $npm$shelljs$Env {
[key: string]: string;
}
-declare type $npm$shelljs$OptionsPoly = {
+declare type $npm$shelljs$OptionsPoly = {
[keys: Flags]: boolean,
...
};
declare interface $npm$shelljs$ExecThen {
(code: number, stdout: string, stderr: string): void;
}
-declare type $npm$shelljs$ExecOptionsPoly = {
+declare type $npm$shelljs$ExecOptionsPoly = {
...T,
async?: boolean,
silent?: boolean,
@@ -140,7 +140,7 @@ declare interface $npm$shelljs$Result {
declare module 'shelljs' {
declare export type ShellArray = $npm$shelljs$Array;
declare export type ShellAsync = $npm$shelljs$Async;
- declare export type ShellOptionsPoly =
+ declare export type ShellOptionsPoly =
$npm$shelljs$OptionsPoly;
declare export type ShellConfig = $npm$shelljs$Config;
declare export type ShellEnv = $npm$shelljs$Env;
diff --git a/jest.config.js b/jest.config.js
index 5f620d78628..f881ea65f14 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -43,7 +43,7 @@ module.exports = {
'/packages/react-native/Libraries/Renderer',
'/packages/react-native/sdks/hermes/',
...PODS_LOCATIONS,
- ] /*:: as $ReadOnlyArray */,
+ ] /*:: as ReadonlyArray */,
transformIgnorePatterns: ['node_modules/(?!@react-native/)'],
haste: {
defaultPlatform: 'ios',
@@ -59,12 +59,12 @@ module.exports = {
moduleFileExtensions: [
'fb.js',
...defaults.moduleFileExtensions,
- ] /*:: as $ReadOnlyArray */,
+ ] /*:: as ReadonlyArray */,
modulePathIgnorePatterns: [
'scripts/.*/__fixtures__/',
'/packages/react-native/sdks/hermes/',
...PODS_LOCATIONS,
- ] /*:: as $ReadOnlyArray */,
+ ] /*:: as ReadonlyArray */,
unmockedModulePathPatterns: [
'node_modules/react/',
'packages/react-native/Libraries/Renderer',
diff --git a/package.json b/package.json
index e4ffa9e4a20..6b04ab88fb6 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,8 @@
"build-types": "node ./scripts/js-api/build-types",
"clang-format": "clang-format -i --glob=*/**/*.{h,cpp,m,mm}",
"clean": "node ./scripts/build/clean.js",
+ "cxx-api-build": "python -m scripts.cxx-api.parser",
+ "cxx-api-validate": "python -m scripts.cxx-api.parser --validate",
"flow-check": "flow check",
"flow": "flow",
"format-check": "prettier --list-different \"./**/*.{js,md,yml,ts,tsx}\"",
@@ -55,38 +57,24 @@
"@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.25.1",
"@babel/generator": "^7.29.1",
- "@babel/parser": "^7.25.2",
"@babel/plugin-syntax-typescript": "^7.25.4",
"@babel/plugin-transform-regenerator": "^7.24.7",
"@babel/preset-env": "^7.25.3",
"@babel/preset-flow": "^7.24.7",
- "@babel/runtime": "^7.25.2",
- "@babel/traverse": "^7.25.2",
- "@babel/types": "^7.25.2",
- "@changesets/cli": "^2.28.1",
"@electron/packager": "^18.3.6",
"@expo/spawn-async": "^1.7.2",
"@jest/create-cache-key-function": "^29.7.0",
"@microsoft/api-extractor": "^7.52.2",
- "@nx/js": "^21.4.1",
"@octokit/rest": "^22.0.0",
- "@react-native/babel-preset": "workspace:*",
- "@react-native/eslint-config": "workspace:*",
- "@react-native/eslint-plugin": "workspace:*",
- "@react-native/eslint-plugin-monorepo": "workspace:*",
- "@react-native/eslint-plugin-specs": "workspace:*",
- "@react-native/jest-preset": "workspace:*",
"@react-native/metro-babel-transformer": "workspace:*",
"@react-native/metro-config": "workspace:*",
"@tsconfig/node22": "22.0.2",
"@types/react": "^19.1.0",
- "@typescript-eslint/eslint-plugin": "^8.36.0",
"@typescript-eslint/parser": "^8.36.0",
- "@yarnpkg/types": "^4.0.1",
"ansi-regex": "^5.0.0",
"ansi-styles": "^4.2.1",
"babel-plugin-minify-dead-code-elimination": "^0.5.2",
- "babel-plugin-syntax-hermes-parser": "0.33.3",
+ "babel-plugin-syntax-hermes-parser": "0.36.0",
"babel-plugin-transform-define": "^2.1.4",
"babel-plugin-transform-flow-enums": "^0.0.2",
"clang-format": "^1.8.0",
@@ -101,41 +89,32 @@
"eslint-plugin-jest": "^29.0.1",
"eslint-plugin-jsx-a11y": "^6.6.0",
"eslint-plugin-react": "^7.37.5",
- "eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-native": "^5.0.0",
"eslint-plugin-redundant-undefined": "^0.4.0",
"eslint-plugin-relay": "^1.8.3",
"fb-dotslash": "0.5.8",
- "flow-api-translator": "0.33.3",
- "flow-bin": "^0.303.0",
- "glob": "^7.1.1",
- "hermes-eslint": "0.33.3",
- "hermes-estree": "0.33.3",
- "hermes-transform": "0.33.3",
+ "flow-api-translator": "0.36.0",
+ "flow-bin": "^0.312.0",
+ "hermes-eslint": "0.36.0",
+ "hermes-transform": "0.36.0",
"ini": "^5.0.0",
"inquirer": "^7.1.0",
- "invariant": "^2.2.4",
"jest": "^29.7.0",
"jest-config": "^29.7.0",
"jest-diff": "^29.7.0",
"jest-junit": "^16.0.0",
"jest-snapshot": "^29.7.0",
- "jsonc-eslint-parser": "^2.3.0",
"jsonc-parser": "2.2.1",
"markdownlint-cli2": "^0.22.0",
"markdownlint-rule-relative-links": "^3.0.0",
"memfs": "^4.38.2",
- "metro": "^0.84.0",
- "metro-babel-register": "^0.83.3",
- "metro-config": "^0.84.0",
- "metro-memory-fs": "^0.82.5",
- "metro-transform-plugins": "^0.83.3",
+ "metro-babel-register": "^0.84.3",
+ "metro-transform-plugins": "^0.84.3",
"micromatch": "^4.0.4",
"node-fetch": "^2.2.0",
"nullthrows": "^1.1.1",
- "nx": "21.4.1",
"prettier": "3.6.2",
- "prettier-plugin-hermes-parser": "0.34.1",
+ "prettier-plugin-hermes-parser": "0.36.0",
"react": "19.2.3",
"react-test-renderer": "19.2.3",
"rimraf": "^3.0.2",
@@ -147,13 +126,40 @@
"tinyglobby": "^0.2.15",
"typescript": "5.8.3",
"ws": "^7.5.10",
+ "@babel/parser": "^7.25.2",
+ "@babel/runtime": "^7.25.2",
+ "@babel/traverse": "^7.25.2",
+ "@babel/types": "^7.25.2",
+ "@changesets/cli": "^2.28.1",
+ "@nx/js": "^21.4.1",
+ "@react-native/babel-preset": "workspace:*",
+ "@react-native/eslint-config": "workspace:*",
+ "@react-native/eslint-plugin": "workspace:*",
+ "@react-native/eslint-plugin-monorepo": "workspace:*",
+ "@react-native/eslint-plugin-specs": "workspace:*",
+ "@react-native/jest-preset": "workspace:*",
+ "@typescript-eslint/eslint-plugin": "^8.36.0",
+ "@yarnpkg/types": "^4.0.1",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "glob": "^7.1.1",
+ "hermes-estree": "0.36.0",
+ "invariant": "^2.2.4",
+ "jsonc-eslint-parser": "^2.3.0",
+ "metro": "^0.84.3",
+ "metro-config": "^0.84.3",
+ "metro-memory-fs": "^0.82.5",
+ "nx": "21.4.1",
"yargs": "^17.6.2",
"zx": "^8.2.4"
},
"resolutions": {
+ "react-is": "19.2.3",
+ "on-headers": "1.1.0",
+ "compression": "1.8.1",
+ "@microsoft/api-extractor/minimatch": "3.1.4",
+ "lodash": "4.18.1",
"@grpc/proto-loader": "^0.7.8",
"async": "^3.2.2",
- "compression": "1.8.1",
"debug": ">=3.1.0",
"es5-ext": "0.10.53",
"eslint-plugin-react-hooks": "6.1.0-canary-12bc60f5-20250613",
@@ -161,8 +167,6 @@
"minimatch@npm:>=5.0.0 <6.0.0": "npm:5.1.9",
"minimatch@npm:9.0.3": "npm:9.0.9",
"minimatch@npm:>=9.0.0 <10.0.0": "npm:9.0.9",
- "on-headers": "1.1.0",
- "react-is": "19.2.3",
"readable-stream": "^4.0.0 <4.4.2",
"shell-quote": "^1.7.3",
"tough-cookie": "^4.1.3"
diff --git a/packages/assets/package.json b/packages/assets/package.json
index ef06e03417f..853eeb4f9b2 100644
--- a/packages/assets/package.json
+++ b/packages/assets/package.json
@@ -1,6 +1,6 @@
{
"name": "@react-native/assets-registry",
- "version": "0.85.0-main",
+ "version": "0.86.0-main",
"description": "Asset support code for React Native.",
"license": "MIT",
"repository": {
diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json
index 23b5eb22674..22d21ba8bbd 100644
--- a/packages/babel-plugin-codegen/package.json
+++ b/packages/babel-plugin-codegen/package.json
@@ -1,6 +1,6 @@
{
"name": "@react-native/babel-plugin-codegen",
- "version": "0.85.0-main",
+ "version": "0.86.0-main",
"description": "Babel plugin to generate native module and view manager code for React Native.",
"license": "MIT",
"repository": {
diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json
index 4304169e2d9..1ea650093b0 100644
--- a/packages/community-cli-plugin/package.json
+++ b/packages/community-cli-plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "@react-native/community-cli-plugin",
- "version": "0.85.0-main",
+ "version": "0.86.0-main",
"description": "Core CLI commands for React Native",
"keywords": [
"react-native",
@@ -32,16 +32,16 @@
},
"dependencies": {
"@react-native/dev-middleware": "workspace:*",
- "chalk": "^4.0.0",
"debug": "^4.4.0",
"invariant": "^2.2.4",
- "metro": "^0.84.0",
- "metro-config": "^0.84.0",
- "metro-core": "^0.84.0",
- "semver": "^7.1.3"
+ "metro": "^0.84.3",
+ "metro-config": "^0.84.3",
+ "metro-core": "^0.84.3",
+ "semver": "^7.1.3",
+ "chalk": "^4.0.0"
},
"devDependencies": {
- "metro-resolver": "^0.84.0"
+ "metro-resolver": "^0.84.3"
},
"peerDependencies": {
"@react-native-community/cli": "*",
diff --git a/packages/core-cli-utils/package.json b/packages/core-cli-utils/package.json
index 7a4f1230a3e..a580e96e767 100644
--- a/packages/core-cli-utils/package.json
+++ b/packages/core-cli-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@react-native/core-cli-utils",
- "version": "0.85.0-main",
+ "version": "0.86.0-main",
"description": "React Native CLI library for Frameworks to build on",
"license": "MIT",
"keywords": [
diff --git a/packages/core-cli-utils/src/private/apple.js b/packages/core-cli-utils/src/private/apple.js
index 691a6147ba1..9bea66afbb1 100644
--- a/packages/core-cli-utils/src/private/apple.js
+++ b/packages/core-cli-utils/src/private/apple.js
@@ -64,7 +64,7 @@ function checkPodfileInSyncWithManifest(
);
}
} catch (e) {
- throw new Error('Please run: yarn run boostrap ios: ' + e.message);
+ throw new Error('Please run: yarn run bootstrap ios: ' + e.message);
}
}
@@ -166,7 +166,7 @@ export const tasks = {
fs.constants.F_OK | fs.constants.R_OK,
);
} catch (e) {
- throw new Error('Please run: yarn run boostrap ios: ' + e.message);
+ throw new Error('Please run: yarn run bootstrap ios: ' + e.message);
}
}
checkPodfileInSyncWithManifest(
diff --git a/packages/debugger-frontend/BUILD_INFO b/packages/debugger-frontend/BUILD_INFO
index f77fdbb7fb2..966fb68e246 100644
--- a/packages/debugger-frontend/BUILD_INFO
+++ b/packages/debugger-frontend/BUILD_INFO
@@ -1,5 +1,5 @@
-@generated SignedSource<<541ade34cd7ba2fc1f21d1cb5c23141c>>
-Git revision: 8edd9be3b89dbc710cb4c5f8dda2f2bb68cc2426
+@generated SignedSource<<06b58bc7c9ba92605c093ab30f1bcad6>>
+Git revision: 571dc30a5de05c09d6734fd38f6a6c279d5d7ec2
Built with --nohooks: false
Is local checkout: false
Remote URL: https://github.com/facebook/react-native-devtools-frontend
diff --git a/packages/debugger-frontend/dist/third-party/front_end/core/i18n/locales/en-US.json b/packages/debugger-frontend/dist/third-party/front_end/core/i18n/locales/en-US.json
index 3b140e899eb..61903b1d74e 100644
--- a/packages/debugger-frontend/dist/third-party/front_end/core/i18n/locales/en-US.json
+++ b/packages/debugger-frontend/dist/third-party/front_end/core/i18n/locales/en-US.json
@@ -1 +1 @@
-{"core/common/ResourceType.ts | cspviolationreport":{"message":"CSPViolationReport"},"core/common/ResourceType.ts | css":{"message":"CSS"},"core/common/ResourceType.ts | directsocket":{"message":"DirectSocket"},"core/common/ResourceType.ts | doc":{"message":"Doc"},"core/common/ResourceType.ts | document":{"message":"Document"},"core/common/ResourceType.ts | eventsource":{"message":"EventSource"},"core/common/ResourceType.ts | fetch":{"message":"Fetch"},"core/common/ResourceType.ts | fetchAndXHR":{"message":"Fetch and XHR"},"core/common/ResourceType.ts | font":{"message":"Font"},"core/common/ResourceType.ts | image":{"message":"Image"},"core/common/ResourceType.ts | img":{"message":"Img"},"core/common/ResourceType.ts | javascript":{"message":"JavaScript"},"core/common/ResourceType.ts | js":{"message":"JS"},"core/common/ResourceType.ts | manifest":{"message":"Manifest"},"core/common/ResourceType.ts | media":{"message":"Media"},"core/common/ResourceType.ts | other":{"message":"Other"},"core/common/ResourceType.ts | ping":{"message":"Ping"},"core/common/ResourceType.ts | preflight":{"message":"Preflight"},"core/common/ResourceType.ts | script":{"message":"Script"},"core/common/ResourceType.ts | signedexchange":{"message":"SignedExchange"},"core/common/ResourceType.ts | socketShort":{"message":"Socket"},"core/common/ResourceType.ts | stylesheet":{"message":"Stylesheet"},"core/common/ResourceType.ts | texttrack":{"message":"TextTrack"},"core/common/ResourceType.ts | wasm":{"message":"Wasm"},"core/common/ResourceType.ts | webassembly":{"message":"WebAssembly"},"core/common/ResourceType.ts | webbundle":{"message":"WebBundle"},"core/common/ResourceType.ts | websocket":{"message":"WebSocket"},"core/common/ResourceType.ts | webtransport":{"message":"WebTransport"},"core/common/Revealer.ts | animationsPanel":{"message":"Animations panel"},"core/common/Revealer.ts | applicationPanel":{"message":"Application panel"},"core/common/Revealer.ts | changesDrawer":{"message":"Changes drawer"},"core/common/Revealer.ts | developerResourcesPanel":{"message":"Developer Resources panel"},"core/common/Revealer.ts | elementsPanel":{"message":"Elements panel"},"core/common/Revealer.ts | issuesView":{"message":"Issues view"},"core/common/Revealer.ts | memoryInspectorPanel":{"message":"Memory inspector panel"},"core/common/Revealer.ts | networkPanel":{"message":"Network panel"},"core/common/Revealer.ts | securityPanel":{"message":"Security panel"},"core/common/Revealer.ts | sourcesPanel":{"message":"Sources panel"},"core/common/Revealer.ts | stylesSidebar":{"message":"styles sidebar"},"core/common/Revealer.ts | timelinePanel":{"message":"Performance panel"},"core/common/SettingRegistration.ts | adorner":{"message":"Adorner"},"core/common/SettingRegistration.ts | ai":{"message":"AI"},"core/common/SettingRegistration.ts | appearance":{"message":"Appearance"},"core/common/SettingRegistration.ts | console":{"message":"Console"},"core/common/SettingRegistration.ts | debugger":{"message":"Debugger"},"core/common/SettingRegistration.ts | elements":{"message":"Elements"},"core/common/SettingRegistration.ts | extension":{"message":"Extension"},"core/common/SettingRegistration.ts | global":{"message":"Global"},"core/common/SettingRegistration.ts | grid":{"message":"Grid"},"core/common/SettingRegistration.ts | memory":{"message":"Memory"},"core/common/SettingRegistration.ts | mobile":{"message":"Mobile"},"core/common/SettingRegistration.ts | network":{"message":"Network"},"core/common/SettingRegistration.ts | performance":{"message":"Performance"},"core/common/SettingRegistration.ts | persistence":{"message":"Persistence"},"core/common/SettingRegistration.ts | privacy":{"message":"Privacy"},"core/common/SettingRegistration.ts | rendering":{"message":"Rendering"},"core/common/SettingRegistration.ts | sources":{"message":"Sources"},"core/common/SettingRegistration.ts | sync":{"message":"Sync"},"core/host/InspectorFrontendHost.ts | devtoolsS":{"message":"DevTools - {PH1}"},"core/host/ResourceLoader.ts | cacheError":{"message":"Cache error"},"core/host/ResourceLoader.ts | certificateError":{"message":"Certificate error"},"core/host/ResourceLoader.ts | certificateManagerError":{"message":"Certificate manager error"},"core/host/ResourceLoader.ts | connectionError":{"message":"Connection error"},"core/host/ResourceLoader.ts | decodingDataUrlFailed":{"message":"Decoding Data URL failed"},"core/host/ResourceLoader.ts | dnsResolverError":{"message":"DNS resolver error"},"core/host/ResourceLoader.ts | ftpError":{"message":"FTP error"},"core/host/ResourceLoader.ts | httpError":{"message":"HTTP error"},"core/host/ResourceLoader.ts | httpErrorStatusCodeSS":{"message":"HTTP error: status code {PH1}, {PH2}"},"core/host/ResourceLoader.ts | invalidUrl":{"message":"Invalid URL"},"core/host/ResourceLoader.ts | signedExchangeError":{"message":"Signed Exchange error"},"core/host/ResourceLoader.ts | systemError":{"message":"System error"},"core/host/ResourceLoader.ts | unknownError":{"message":"Unknown error"},"core/sdk/ChildTargetManager.ts | main":{"message":"Main"},"core/sdk/CompilerSourceMappingContentProvider.ts | couldNotLoadContentForSS":{"message":"Could not load content for {PH1} ({PH2})"},"core/sdk/Connections.ts | websocketDisconnected":{"message":"WebSocket disconnected"},"core/sdk/ConsoleModel.ts | bfcacheNavigation":{"message":"Navigation to {PH1} was restored from back/forward cache (see https://web.dev/bfcache/)"},"core/sdk/ConsoleModel.ts | failedToSaveToTempVariable":{"message":"Failed to save to temp variable."},"core/sdk/ConsoleModel.ts | navigatedToS":{"message":"Navigated to {PH1}"},"core/sdk/ConsoleModel.ts | profileSFinished":{"message":"Profile ''{PH1}'' finished."},"core/sdk/ConsoleModel.ts | profileSStarted":{"message":"Profile ''{PH1}'' started."},"core/sdk/CPUProfilerModel.ts | profileD":{"message":"Profile {PH1}"},"core/sdk/CPUThrottlingManager.ts | calibratedLowTierMobile":{"message":"Low-tier mobile"},"core/sdk/CPUThrottlingManager.ts | calibratedMidTierMobile":{"message":"Mid-tier mobile"},"core/sdk/CPUThrottlingManager.ts | calibrationErrorDeviceTooWeak":{"message":"Device is not powerful enough"},"core/sdk/CPUThrottlingManager.ts | dSlowdown":{"message":"{PH1}× slowdown"},"core/sdk/CPUThrottlingManager.ts | noThrottling":{"message":"No throttling"},"core/sdk/CSSStyleSheetHeader.ts | couldNotFindTheOriginalStyle":{"message":"Could not find the original style sheet."},"core/sdk/CSSStyleSheetHeader.ts | thereWasAnErrorRetrievingThe":{"message":"There was an error retrieving the source styles."},"core/sdk/DebuggerModel.ts | block":{"message":"Block"},"core/sdk/DebuggerModel.ts | catchBlock":{"message":"Catch block"},"core/sdk/DebuggerModel.ts | closure":{"message":"Closure"},"core/sdk/DebuggerModel.ts | exception":{"message":"Exception"},"core/sdk/DebuggerModel.ts | expression":{"message":"Expression"},"core/sdk/DebuggerModel.ts | global":{"message":"Global"},"core/sdk/DebuggerModel.ts | local":{"message":"Local"},"core/sdk/DebuggerModel.ts | module":{"message":"Module"},"core/sdk/DebuggerModel.ts | returnValue":{"message":"Return value"},"core/sdk/DebuggerModel.ts | script":{"message":"Script"},"core/sdk/DebuggerModel.ts | withBlock":{"message":"With block"},"core/sdk/NetworkManager.ts | directSocketStatusAborted":{"message":"Aborted"},"core/sdk/NetworkManager.ts | directSocketStatusClosed":{"message":"Closed"},"core/sdk/NetworkManager.ts | directSocketStatusOpen":{"message":"Open"},"core/sdk/NetworkManager.ts | directSocketStatusOpening":{"message":"Opening"},"core/sdk/NetworkManager.ts | fast4G":{"message":"Fast 4G"},"core/sdk/NetworkManager.ts | fastG":{"message":"Slow 4G"},"core/sdk/NetworkManager.ts | noContentForPreflight":{"message":"No content available for preflight request"},"core/sdk/NetworkManager.ts | noContentForRedirect":{"message":"No content available because this request was redirected"},"core/sdk/NetworkManager.ts | noContentForWebSocket":{"message":"Content for WebSockets is currently not supported"},"core/sdk/NetworkManager.ts | noThrottling":{"message":"No throttling"},"core/sdk/NetworkManager.ts | offline":{"message":"Offline"},"core/sdk/NetworkManager.ts | requestWasBlockedByDevtoolsS":{"message":"Request was blocked by DevTools: \"{PH1}\""},"core/sdk/NetworkManager.ts | sFailedLoadingSS":{"message":"{PH1} failed loading: {PH2} \"{PH3}\"."},"core/sdk/NetworkManager.ts | sFinishedLoadingSS":{"message":"{PH1} finished loading: {PH2} \"{PH3}\"."},"core/sdk/NetworkManager.ts | slowG":{"message":"3G"},"core/sdk/NetworkRequest.ts | anUnknownErrorWasEncounteredWhenTrying":{"message":"An unknown error was encountered when trying to store this cookie."},"core/sdk/NetworkRequest.ts | binary":{"message":"(binary)"},"core/sdk/NetworkRequest.ts | blockedReasonInvalidDomain":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because its Domain attribute was invalid with regards to the current host url."},"core/sdk/NetworkRequest.ts | blockedReasonInvalidPrefix":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because it used the \"__Secure-\" or \"__Host-\" prefix in its name and broke the additional rules applied to cookies with these prefixes as defined in https://tools.ietf.org/html/draft-west-cookie-prefixes-05."},"core/sdk/NetworkRequest.ts | blockedReasonOverwriteSecure":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because it was not sent over a secure connection and would have overwritten a cookie with the Secure attribute."},"core/sdk/NetworkRequest.ts | blockedReasonSameSiteNoneInsecure":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because it had the \"SameSite=None\" attribute but did not have the \"Secure\" attribute, which is required in order to use \"SameSite=None\"."},"core/sdk/NetworkRequest.ts | blockedReasonSameSiteStrictLax":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because it had the \"{PH1}\" attribute but came from a cross-site response which was not the response to a top-level navigation."},"core/sdk/NetworkRequest.ts | blockedReasonSameSiteUnspecifiedTreatedAsLax":{"message":"This Set-Cookie header didn't specify a \"SameSite\" attribute and was defaulted to \"SameSite=Lax,\" and was blocked because it came from a cross-site response which was not the response to a top-level navigation. The Set-Cookie had to have been set with \"SameSite=None\" to enable cross-site usage."},"core/sdk/NetworkRequest.ts | blockedReasonSecureOnly":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because it had the \"Secure\" attribute but was not received over a secure connection."},"core/sdk/NetworkRequest.ts | domainMismatch":{"message":"This cookie was blocked because neither did the request URL's domain exactly match the cookie's domain, nor was the request URL's domain a subdomain of the cookie's Domain attribute value."},"core/sdk/NetworkRequest.ts | exemptionReasonEnterprisePolicy":{"message":"This cookie is allowed by Chrome Enterprise policy. Learn more: goo.gle/ce-3pc"},"core/sdk/NetworkRequest.ts | exemptionReasonScheme":{"message":"This cookie is allowed by the top-level url scheme"},"core/sdk/NetworkRequest.ts | exemptionReasonStorageAccessAPI":{"message":"This cookie is allowed by the Storage Access API. Learn more: goo.gle/saa"},"core/sdk/NetworkRequest.ts | exemptionReasonTopLevelStorageAccessAPI":{"message":"This cookie is allowed by the top-level Storage Access API. Learn more: goo.gle/saa-top"},"core/sdk/NetworkRequest.ts | exemptionReasonTopLevelTPCDDeprecationTrial":{"message":"This cookie is allowed by top-level third-party cookie deprecation trial. Learn more: goo.gle/ps-dt."},"core/sdk/NetworkRequest.ts | exemptionReasonTPCDDeprecationTrial":{"message":"This cookie is allowed by third-party cookie deprecation trial. Learn more: goo.gle/ps-dt."},"core/sdk/NetworkRequest.ts | exemptionReasonTPCDHeuristics":{"message":"This cookie is allowed by third-party cookie heuristics. Learn more: goo.gle/hbe"},"core/sdk/NetworkRequest.ts | exemptionReasonTPCDMetadata":{"message":"This cookie is allowed by a third-party cookie deprecation trial grace period. Learn more: goo.gle/dt-grace."},"core/sdk/NetworkRequest.ts | exemptionReasonUserSetting":{"message":"This cookie is allowed by user preference."},"core/sdk/NetworkRequest.ts | nameValuePairExceedsMaxSize":{"message":"This cookie was blocked because it was too large. The combined size of the name and value must be less than or equal to 4096 characters."},"core/sdk/NetworkRequest.ts | notOnPath":{"message":"This cookie was blocked because its path was not an exact match for or a superdirectory of the request url's path."},"core/sdk/NetworkRequest.ts | samePartyFromCrossPartyContext":{"message":"This cookie was blocked because it had the \"SameParty\" attribute but the request was cross-party. The request was considered cross-party because the domain of the resource's URL and the domains of the resource's enclosing frames/documents are neither owners nor members in the same First-Party Set."},"core/sdk/NetworkRequest.ts | sameSiteLax":{"message":"This cookie was blocked because it had the \"SameSite=Lax\" attribute and the request was made from a different site and was not initiated by a top-level navigation."},"core/sdk/NetworkRequest.ts | sameSiteNoneInsecure":{"message":"This cookie was blocked because it had the \"SameSite=None\" attribute but was not marked \"Secure\". Cookies without SameSite restrictions must be marked \"Secure\" and sent over a secure connection."},"core/sdk/NetworkRequest.ts | sameSiteStrict":{"message":"This cookie was blocked because it had the \"SameSite=Strict\" attribute and the request was made from a different site. This includes top-level navigation requests initiated by other sites."},"core/sdk/NetworkRequest.ts | sameSiteUnspecifiedTreatedAsLax":{"message":"This cookie didn't specify a \"SameSite\" attribute when it was stored and was defaulted to \"SameSite=Lax,\" and was blocked because the request was made from a different site and was not initiated by a top-level navigation. The cookie had to have been set with \"SameSite=None\" to enable cross-site usage."},"core/sdk/NetworkRequest.ts | schemefulSameSiteLax":{"message":"This cookie was blocked because it had the \"SameSite=Lax\" attribute but the request was cross-site and was not initiated by a top-level navigation. This request is considered cross-site because the URL has a different scheme than the current site."},"core/sdk/NetworkRequest.ts | schemefulSameSiteStrict":{"message":"This cookie was blocked because it had the \"SameSite=Strict\" attribute but the request was cross-site. This includes top-level navigation requests initiated by other sites. This request is considered cross-site because the URL has a different scheme than the current site."},"core/sdk/NetworkRequest.ts | schemefulSameSiteUnspecifiedTreatedAsLax":{"message":"This cookie didn't specify a \"SameSite\" attribute when it was stored, was defaulted to \"SameSite=Lax\", and was blocked because the request was cross-site and was not initiated by a top-level navigation. This request is considered cross-site because the URL has a different scheme than the current site."},"core/sdk/NetworkRequest.ts | secureOnly":{"message":"This cookie was blocked because it had the \"Secure\" attribute and the connection was not secure."},"core/sdk/NetworkRequest.ts | setcookieHeaderIsIgnoredIn":{"message":"Set-Cookie header is ignored in response from url: {PH1}. The combined size of the name and value must be less than or equal to 4096 characters."},"core/sdk/NetworkRequest.ts | theSchemeOfThisConnectionIsNot":{"message":"The scheme of this connection is not allowed to store cookies."},"core/sdk/NetworkRequest.ts | thirdPartyPhaseout":{"message":"This cookie was blocked either because of Chrome flags or browser configuration. Learn more in the Issues panel."},"core/sdk/NetworkRequest.ts | thisSetcookieDidntSpecifyASamesite":{"message":"This Set-Cookie header didn't specify a \"SameSite\" attribute, was defaulted to \"SameSite=Lax\", and was blocked because it came from a cross-site response which was not the response to a top-level navigation. This response is considered cross-site because the URL has a different scheme than the current site."},"core/sdk/NetworkRequest.ts | thisSetcookieHadADisallowedCharacter":{"message":"This Set-Cookie header contained a disallowed character (a forbidden ASCII control character, or the tab character if it appears in the middle of the cookie name, value, an attribute name, or an attribute value)."},"core/sdk/NetworkRequest.ts | thisSetcookieHadInvalidSyntax":{"message":"This Set-Cookie header had invalid syntax."},"core/sdk/NetworkRequest.ts | thisSetcookieWasBlockedBecauseItHadTheSameparty":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because it had the \"SameParty\" attribute but the request was cross-party. The request was considered cross-party because the domain of the resource's URL and the domains of the resource's enclosing frames/documents are neither owners nor members in the same First-Party Set."},"core/sdk/NetworkRequest.ts | thisSetcookieWasBlockedBecauseItHadTheSamepartyAttribute":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because it had the \"SameParty\" attribute but also had other conflicting attributes. Chrome requires cookies that use the \"SameParty\" attribute to also have the \"Secure\" attribute, and to not be restricted to \"SameSite=Strict\"."},"core/sdk/NetworkRequest.ts | thisSetcookieWasBlockedBecauseItHadTheSamesiteStrictLax":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because it had the \"{PH1}\" attribute but came from a cross-site response which was not the response to a top-level navigation. This response is considered cross-site because the URL has a different scheme than the current site."},"core/sdk/NetworkRequest.ts | thisSetcookieWasBlockedBecauseTheNameValuePairExceedsMaxSize":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked because the cookie was too large. The combined size of the name and value must be less than or equal to 4096 characters."},"core/sdk/NetworkRequest.ts | thisSetcookieWasBlockedDueThirdPartyPhaseout":{"message":"Setting this cookie was blocked either because of Chrome flags or browser configuration. Learn more in the Issues panel."},"core/sdk/NetworkRequest.ts | thisSetcookieWasBlockedDueToUser":{"message":"This attempt to set a cookie via a Set-Cookie header was blocked due to user preferences."},"core/sdk/NetworkRequest.ts | unknownError":{"message":"An unknown error was encountered when trying to send this cookie."},"core/sdk/NetworkRequest.ts | userPreferences":{"message":"This cookie was blocked due to user preferences."},"core/sdk/OverlayModel.ts | pausedInDebugger":{"message":"Paused in debugger"},"core/sdk/PageResourceLoader.ts | loadCanceledDueToReloadOf":{"message":"Load canceled due to reload of inspected page"},"core/sdk/RehydratingConnection.ts | errorLoadingLog":{"message":"Error loading log"},"core/sdk/RehydratingConnection.ts | noHostWindow":{"message":"Can not find host window"},"core/sdk/RehydratingConnection.ts | noSourceText":{"message":"No source text available"},"core/sdk/Script.ts | scriptRemovedOrDeleted":{"message":"Script removed or deleted."},"core/sdk/Script.ts | unableToFetchScriptSource":{"message":"Unable to fetch script source."},"core/sdk/sdk-meta.ts | achromatopsia":{"message":"Achromatopsia (no color)"},"core/sdk/sdk-meta.ts | blurredVision":{"message":"Blurred vision"},"core/sdk/sdk-meta.ts | captureAsyncStackTraces":{"message":"Capture async stack traces"},"core/sdk/sdk-meta.ts | customFormatters":{"message":"Custom formatters"},"core/sdk/sdk-meta.ts | deuteranopia":{"message":"Deuteranopia (no green)"},"core/sdk/sdk-meta.ts | disableAsyncStackTraces":{"message":"Disable async stack traces"},"core/sdk/sdk-meta.ts | disableAvifFormat":{"message":"Disable AVIF format"},"core/sdk/sdk-meta.ts | disableCache":{"message":"Disable cache while DevTools is open"},"core/sdk/sdk-meta.ts | disableJavascript":{"message":"Disable JavaScript"},"core/sdk/sdk-meta.ts | disableLocalFonts":{"message":"Disable local fonts"},"core/sdk/sdk-meta.ts | disableNetworkRequestBlocking":{"message":"Disable network request blocking"},"core/sdk/sdk-meta.ts | disableWebpFormat":{"message":"Disable WebP format"},"core/sdk/sdk-meta.ts | doNotCaptureAsyncStackTraces":{"message":"Do not capture async stack traces"},"core/sdk/sdk-meta.ts | doNotEmulateAFocusedPage":{"message":"Do not emulate a focused page"},"core/sdk/sdk-meta.ts | doNotEmulateAnyVisionDeficiency":{"message":"Do not emulate any vision deficiency"},"core/sdk/sdk-meta.ts | doNotEmulateCss":{"message":"Do not emulate CSS {PH1}"},"core/sdk/sdk-meta.ts | doNotEmulateCssMediaType":{"message":"Do not emulate CSS media type"},"core/sdk/sdk-meta.ts | doNotExtendGridLines":{"message":"Do not extend grid lines"},"core/sdk/sdk-meta.ts | doNotHighlightAdFrames":{"message":"Do not highlight ad frames"},"core/sdk/sdk-meta.ts | doNotPauseOnExceptions":{"message":"Do not pause on exceptions"},"core/sdk/sdk-meta.ts | doNotPreserveLogUponNavigation":{"message":"Do not preserve log upon navigation"},"core/sdk/sdk-meta.ts | doNotShowGridNamedAreas":{"message":"Do not show grid named areas"},"core/sdk/sdk-meta.ts | doNotShowGridTrackSizes":{"message":"Do not show grid track sizes"},"core/sdk/sdk-meta.ts | doNotShowRulersOnHover":{"message":"Do not show rulers on hover"},"core/sdk/sdk-meta.ts | emulateAchromatopsia":{"message":"Emulate achromatopsia (no color)"},"core/sdk/sdk-meta.ts | emulateAFocusedPage":{"message":"Emulate a focused page"},"core/sdk/sdk-meta.ts | emulateAutoDarkMode":{"message":"Emulate auto dark mode"},"core/sdk/sdk-meta.ts | emulateBlurredVision":{"message":"Emulate blurred vision"},"core/sdk/sdk-meta.ts | emulateCss":{"message":"Emulate CSS {PH1}"},"core/sdk/sdk-meta.ts | emulateCssMediaFeature":{"message":"Emulate CSS media feature {PH1}"},"core/sdk/sdk-meta.ts | emulateCssMediaType":{"message":"Emulate CSS media type"},"core/sdk/sdk-meta.ts | emulateCssPrintMediaType":{"message":"Emulate CSS print media type"},"core/sdk/sdk-meta.ts | emulateCssScreenMediaType":{"message":"Emulate CSS screen media type"},"core/sdk/sdk-meta.ts | emulateDeuteranopia":{"message":"Emulate deuteranopia (no green)"},"core/sdk/sdk-meta.ts | emulateProtanopia":{"message":"Emulate protanopia (no red)"},"core/sdk/sdk-meta.ts | emulateReducedContrast":{"message":"Emulate reduced contrast"},"core/sdk/sdk-meta.ts | emulateTritanopia":{"message":"Emulate tritanopia (no blue)"},"core/sdk/sdk-meta.ts | emulateVisionDeficiencies":{"message":"Emulate vision deficiencies"},"core/sdk/sdk-meta.ts | enableAvifFormat":{"message":"Enable AVIF format"},"core/sdk/sdk-meta.ts | enableCache":{"message":"Enable cache"},"core/sdk/sdk-meta.ts | enableJavascript":{"message":"Enable JavaScript"},"core/sdk/sdk-meta.ts | enableLocalFonts":{"message":"Enable local fonts"},"core/sdk/sdk-meta.ts | enableNetworkRequestBlocking":{"message":"Enable network request blocking"},"core/sdk/sdk-meta.ts | enableRemoteFileLoading":{"message":"Allow DevTools to load resources, such as source maps, from remote file paths. Disabled by default for security reasons."},"core/sdk/sdk-meta.ts | enableWebpFormat":{"message":"Enable WebP format"},"core/sdk/sdk-meta.ts | extendGridLines":{"message":"Extend grid lines"},"core/sdk/sdk-meta.ts | hideFramesPerSecondFpsMeter":{"message":"Hide frames per second (FPS) meter"},"core/sdk/sdk-meta.ts | hideLayerBorders":{"message":"Hide layer borders"},"core/sdk/sdk-meta.ts | hideLayoutShiftRegions":{"message":"Hide layout shift regions"},"core/sdk/sdk-meta.ts | hideLineLabels":{"message":"Hide line labels"},"core/sdk/sdk-meta.ts | hidePaintFlashingRectangles":{"message":"Hide paint flashing rectangles"},"core/sdk/sdk-meta.ts | hideScrollPerformanceBottlenecks":{"message":"Hide scroll performance bottlenecks"},"core/sdk/sdk-meta.ts | highlightAdFrames":{"message":"Highlight ad frames"},"core/sdk/sdk-meta.ts | networkCacheExplanation":{"message":"Disabling the network cache will simulate a network experience similar to a first time visitor."},"core/sdk/sdk-meta.ts | networkRequestBlocking":{"message":"Network request blocking"},"core/sdk/sdk-meta.ts | noEmulation":{"message":"No emulation"},"core/sdk/sdk-meta.ts | pauseOnExceptions":{"message":"Pause on exceptions"},"core/sdk/sdk-meta.ts | preserveLogUponNavigation":{"message":"Preserve log upon navigation"},"core/sdk/sdk-meta.ts | print":{"message":"print"},"core/sdk/sdk-meta.ts | protanopia":{"message":"Protanopia (no red)"},"core/sdk/sdk-meta.ts | query":{"message":"query"},"core/sdk/sdk-meta.ts | reducedContrast":{"message":"Reduced contrast"},"core/sdk/sdk-meta.ts | screen":{"message":"screen"},"core/sdk/sdk-meta.ts | showAreaNames":{"message":"Show area names"},"core/sdk/sdk-meta.ts | showFramesPerSecondFpsMeter":{"message":"Show frames per second (FPS) meter"},"core/sdk/sdk-meta.ts | showGridNamedAreas":{"message":"Show grid named areas"},"core/sdk/sdk-meta.ts | showGridTrackSizes":{"message":"Show grid track sizes"},"core/sdk/sdk-meta.ts | showLayerBorders":{"message":"Show layer borders"},"core/sdk/sdk-meta.ts | showLayoutShiftRegions":{"message":"Show layout shift regions"},"core/sdk/sdk-meta.ts | showLineLabels":{"message":"Show line labels"},"core/sdk/sdk-meta.ts | showLineNames":{"message":"Show line names"},"core/sdk/sdk-meta.ts | showLineNumbers":{"message":"Show line numbers"},"core/sdk/sdk-meta.ts | showPaintFlashingRectangles":{"message":"Show paint flashing rectangles"},"core/sdk/sdk-meta.ts | showRulersOnHover":{"message":"Show rulers on hover"},"core/sdk/sdk-meta.ts | showScrollPerformanceBottlenecks":{"message":"Show scroll performance bottlenecks"},"core/sdk/sdk-meta.ts | showTrackSizes":{"message":"Show track sizes"},"core/sdk/sdk-meta.ts | tritanopia":{"message":"Tritanopia (no blue)"},"core/sdk/ServerTiming.ts | deprecatedSyntaxFoundPleaseUse":{"message":"Deprecated syntax found. Please use: ;dur=;desc="},"core/sdk/ServerTiming.ts | duplicateParameterSIgnored":{"message":"Duplicate parameter \"{PH1}\" ignored."},"core/sdk/ServerTiming.ts | extraneousTrailingCharacters":{"message":"Extraneous trailing characters."},"core/sdk/ServerTiming.ts | noValueFoundForParameterS":{"message":"No value found for parameter \"{PH1}\"."},"core/sdk/ServerTiming.ts | unableToParseSValueS":{"message":"Unable to parse \"{PH1}\" value \"{PH2}\"."},"core/sdk/ServerTiming.ts | unrecognizedParameterS":{"message":"Unrecognized parameter \"{PH1}\"."},"core/sdk/ServiceWorkerCacheModel.ts | serviceworkercacheagentError":{"message":"ServiceWorkerCacheAgent error deleting cache entry {PH1} in cache: {PH2}"},"core/sdk/ServiceWorkerManager.ts | activated":{"message":"activated"},"core/sdk/ServiceWorkerManager.ts | activating":{"message":"activating"},"core/sdk/ServiceWorkerManager.ts | installed":{"message":"installed"},"core/sdk/ServiceWorkerManager.ts | installing":{"message":"installing"},"core/sdk/ServiceWorkerManager.ts | new":{"message":"new"},"core/sdk/ServiceWorkerManager.ts | redundant":{"message":"redundant"},"core/sdk/ServiceWorkerManager.ts | running":{"message":"running"},"core/sdk/ServiceWorkerManager.ts | sSS":{"message":"{PH1} #{PH2} ({PH3})"},"core/sdk/ServiceWorkerManager.ts | starting":{"message":"starting"},"core/sdk/ServiceWorkerManager.ts | stopped":{"message":"stopped"},"core/sdk/ServiceWorkerManager.ts | stopping":{"message":"stopping"},"core/sdk/SourceMapScopeChainEntry.ts | block":{"message":"Block"},"core/sdk/SourceMapScopeChainEntry.ts | closure":{"message":"Closure"},"core/sdk/SourceMapScopeChainEntry.ts | global":{"message":"Global"},"core/sdk/SourceMapScopeChainEntry.ts | local":{"message":"Local"},"core/sdk/SourceMapScopeChainEntry.ts | returnValue":{"message":"Return value"},"entrypoints/inspector_main/inspector_main-meta.ts | autoOpenDevTools":{"message":"Auto-open DevTools for popups"},"entrypoints/inspector_main/inspector_main-meta.ts | blockAds":{"message":"Block ads on this site"},"entrypoints/inspector_main/inspector_main-meta.ts | colorVisionDeficiency":{"message":"color vision deficiency"},"entrypoints/inspector_main/inspector_main-meta.ts | cssMediaFeature":{"message":"CSS media feature"},"entrypoints/inspector_main/inspector_main-meta.ts | cssMediaType":{"message":"CSS media type"},"entrypoints/inspector_main/inspector_main-meta.ts | disablePaused":{"message":"Disable paused state overlay"},"entrypoints/inspector_main/inspector_main-meta.ts | doNotAutoOpen":{"message":"Do not auto-open DevTools for popups"},"entrypoints/inspector_main/inspector_main-meta.ts | forceAdBlocking":{"message":"Force ad blocking on this site"},"entrypoints/inspector_main/inspector_main-meta.ts | fps":{"message":"fps"},"entrypoints/inspector_main/inspector_main-meta.ts | hardReloadPage":{"message":"Hard reload page"},"entrypoints/inspector_main/inspector_main-meta.ts | layout":{"message":"layout"},"entrypoints/inspector_main/inspector_main-meta.ts | paint":{"message":"paint"},"entrypoints/inspector_main/inspector_main-meta.ts | reloadPage":{"message":"Reload page"},"entrypoints/inspector_main/inspector_main-meta.ts | rendering":{"message":"Rendering"},"entrypoints/inspector_main/inspector_main-meta.ts | showAds":{"message":"Show ads on this site, if allowed"},"entrypoints/inspector_main/inspector_main-meta.ts | showRendering":{"message":"Show Rendering"},"entrypoints/inspector_main/inspector_main-meta.ts | toggleCssPrefersColorSchemeMedia":{"message":"Toggle CSS media feature prefers-color-scheme"},"entrypoints/inspector_main/inspector_main-meta.ts | visionDeficiency":{"message":"vision deficiency"},"entrypoints/inspector_main/InspectorMain.ts | javascriptIsDisabled":{"message":"JavaScript is disabled"},"entrypoints/inspector_main/InspectorMain.ts | main":{"message":"Main"},"entrypoints/inspector_main/InspectorMain.ts | openDedicatedTools":{"message":"Open dedicated DevTools for Node.js"},"entrypoints/inspector_main/InspectorMain.ts | tab":{"message":"Tab"},"entrypoints/inspector_main/OutermostTargetSelector.ts | targetNotSelected":{"message":"Page: Not selected"},"entrypoints/inspector_main/OutermostTargetSelector.ts | targetS":{"message":"Page: {PH1}"},"entrypoints/inspector_main/RenderingOptions.ts | disableAvifImageFormat":{"message":"Disable AVIF image format"},"entrypoints/inspector_main/RenderingOptions.ts | disableLocalFonts":{"message":"Disable local fonts"},"entrypoints/inspector_main/RenderingOptions.ts | disablesLocalSourcesInFontface":{"message":"Disables local() sources in @font-face rules. Requires a page reload to apply."},"entrypoints/inspector_main/RenderingOptions.ts | disableWebpImageFormat":{"message":"Disable WebP image format"},"entrypoints/inspector_main/RenderingOptions.ts | emulateAFocusedPage":{"message":"Emulate a focused page"},"entrypoints/inspector_main/RenderingOptions.ts | emulateAutoDarkMode":{"message":"Enable automatic dark mode"},"entrypoints/inspector_main/RenderingOptions.ts | emulatesAFocusedPage":{"message":"Keep page focused. Commonly used for debugging disappearing elements."},"entrypoints/inspector_main/RenderingOptions.ts | emulatesAutoDarkMode":{"message":"Enables automatic dark mode and sets prefers-color-scheme to dark."},"entrypoints/inspector_main/RenderingOptions.ts | forcesCssColorgamutMediaFeature":{"message":"Forces CSS color-gamut media feature"},"entrypoints/inspector_main/RenderingOptions.ts | forcesCssForcedColors":{"message":"Forces CSS forced-colors media feature"},"entrypoints/inspector_main/RenderingOptions.ts | forcesCssPreferscolorschemeMedia":{"message":"Forces CSS prefers-color-scheme media feature"},"entrypoints/inspector_main/RenderingOptions.ts | forcesCssPreferscontrastMedia":{"message":"Forces CSS prefers-contrast media feature"},"entrypoints/inspector_main/RenderingOptions.ts | forcesCssPrefersreduceddataMedia":{"message":"Forces CSS prefers-reduced-data media feature"},"entrypoints/inspector_main/RenderingOptions.ts | forcesCssPrefersreducedmotion":{"message":"Forces CSS prefers-reduced-motion media feature"},"entrypoints/inspector_main/RenderingOptions.ts | forcesCssPrefersreducedtransparencyMedia":{"message":"Forces CSS prefers-reduced-transparency media feature"},"entrypoints/inspector_main/RenderingOptions.ts | forcesMediaTypeForTestingPrint":{"message":"Forces media type for testing print and screen styles"},"entrypoints/inspector_main/RenderingOptions.ts | forcesVisionDeficiencyEmulation":{"message":"Forces vision deficiency emulation"},"entrypoints/inspector_main/RenderingOptions.ts | frameRenderingStats":{"message":"Frame Rendering Stats"},"entrypoints/inspector_main/RenderingOptions.ts | highlightAdFrames":{"message":"Highlight ad frames"},"entrypoints/inspector_main/RenderingOptions.ts | highlightsAreasOfThePageBlueThat":{"message":"Highlights areas of the page (blue) that were shifted. May not be suitable for people prone to photosensitive epilepsy."},"entrypoints/inspector_main/RenderingOptions.ts | highlightsAreasOfThePageGreen":{"message":"Highlights areas of the page (green) that need to be repainted. May not be suitable for people prone to photosensitive epilepsy."},"entrypoints/inspector_main/RenderingOptions.ts | highlightsElementsTealThatCan":{"message":"Highlights elements (teal) that can slow down scrolling, including touch & wheel event handlers and other main-thread scrolling situations."},"entrypoints/inspector_main/RenderingOptions.ts | highlightsFramesRedDetectedToBe":{"message":"Highlights frames (red) detected to be ads."},"entrypoints/inspector_main/RenderingOptions.ts | layerBorders":{"message":"Layer borders"},"entrypoints/inspector_main/RenderingOptions.ts | layoutShiftRegions":{"message":"Layout shift regions"},"entrypoints/inspector_main/RenderingOptions.ts | paintFlashing":{"message":"Paint flashing"},"entrypoints/inspector_main/RenderingOptions.ts | plotsFrameThroughputDropped":{"message":"Plots frame throughput, dropped frames distribution, and GPU memory."},"entrypoints/inspector_main/RenderingOptions.ts | requiresAPageReloadToApplyAnd":{"message":"Requires a page reload to apply and disables caching for image requests."},"entrypoints/inspector_main/RenderingOptions.ts | scrollingPerformanceIssues":{"message":"Scrolling performance issues"},"entrypoints/inspector_main/RenderingOptions.ts | showsLayerBordersOrangeoliveAnd":{"message":"Shows layer borders (orange/olive) and tiles (cyan)."},"entrypoints/js_app/js_app.ts | main":{"message":"Main"},"entrypoints/js_app/js_app.ts | networkTitle":{"message":"Scripts"},"entrypoints/js_app/js_app.ts | showNode":{"message":"Show Scripts"},"entrypoints/main/main-meta.ts | auto":{"message":"auto"},"entrypoints/main/main-meta.ts | autoTheme":{"message":"Auto"},"entrypoints/main/main-meta.ts | bottom":{"message":"Bottom"},"entrypoints/main/main-meta.ts | browserLanguage":{"message":"Browser UI language"},"entrypoints/main/main-meta.ts | cancelSearch":{"message":"Cancel search"},"entrypoints/main/main-meta.ts | darkCapital":{"message":"Dark"},"entrypoints/main/main-meta.ts | darkLower":{"message":"dark"},"entrypoints/main/main-meta.ts | devtoolsDefault":{"message":"DevTools (Default)"},"entrypoints/main/main-meta.ts | dockToBottom":{"message":"Dock to bottom"},"entrypoints/main/main-meta.ts | dockToLeft":{"message":"Dock to left"},"entrypoints/main/main-meta.ts | dockToRight":{"message":"Dock to right"},"entrypoints/main/main-meta.ts | dontMatchChromeColorSchemeCommand":{"message":"Don't match Chrome color scheme"},"entrypoints/main/main-meta.ts | enableCtrlShortcutToSwitchPanels":{"message":"Enable Ctrl + 1-9 shortcut to switch panels"},"entrypoints/main/main-meta.ts | enableShortcutToSwitchPanels":{"message":"Enable ⌘ + 1-9 shortcut to switch panels"},"entrypoints/main/main-meta.ts | enableSync":{"message":"Enable settings sync"},"entrypoints/main/main-meta.ts | findNextResult":{"message":"Find next result"},"entrypoints/main/main-meta.ts | findPreviousResult":{"message":"Find previous result"},"entrypoints/main/main-meta.ts | focusDebuggee":{"message":"Focus page"},"entrypoints/main/main-meta.ts | horizontal":{"message":"horizontal"},"entrypoints/main/main-meta.ts | language":{"message":"Language:"},"entrypoints/main/main-meta.ts | left":{"message":"Left"},"entrypoints/main/main-meta.ts | lightCapital":{"message":"Light"},"entrypoints/main/main-meta.ts | lightLower":{"message":"light"},"entrypoints/main/main-meta.ts | matchChromeColorScheme":{"message":"Match Chrome color scheme"},"entrypoints/main/main-meta.ts | matchChromeColorSchemeCommand":{"message":"Match Chrome color scheme"},"entrypoints/main/main-meta.ts | matchChromeColorSchemeDocumentation":{"message":"Match DevTools colors to your customized Chrome theme (when enabled)"},"entrypoints/main/main-meta.ts | nextPanel":{"message":"Next panel"},"entrypoints/main/main-meta.ts | panelLayout":{"message":"Panel layout:"},"entrypoints/main/main-meta.ts | previousPanel":{"message":"Previous panel"},"entrypoints/main/main-meta.ts | reloadDevtools":{"message":"Reload DevTools"},"entrypoints/main/main-meta.ts | resetZoomLevel":{"message":"Reset zoom level"},"entrypoints/main/main-meta.ts | restoreLastDockPosition":{"message":"Restore last dock position"},"entrypoints/main/main-meta.ts | right":{"message":"Right"},"entrypoints/main/main-meta.ts | searchAsYouTypeCommand":{"message":"Enable search as you type"},"entrypoints/main/main-meta.ts | searchAsYouTypeSetting":{"message":"Search as you type"},"entrypoints/main/main-meta.ts | searchInPanel":{"message":"Search in panel"},"entrypoints/main/main-meta.ts | searchOnEnterCommand":{"message":"Disable search as you type (press Enter to search)"},"entrypoints/main/main-meta.ts | switchToBrowserPreferredTheme":{"message":"Switch to browser's preferred theme"},"entrypoints/main/main-meta.ts | switchToDarkTheme":{"message":"Switch to dark theme"},"entrypoints/main/main-meta.ts | switchToLightTheme":{"message":"Switch to light theme"},"entrypoints/main/main-meta.ts | theme":{"message":"Theme:"},"entrypoints/main/main-meta.ts | toggleDrawer":{"message":"Toggle drawer"},"entrypoints/main/main-meta.ts | undocked":{"message":"Undocked"},"entrypoints/main/main-meta.ts | undockIntoSeparateWindow":{"message":"Undock into separate window"},"entrypoints/main/main-meta.ts | useAutomaticPanelLayout":{"message":"Use automatic panel layout"},"entrypoints/main/main-meta.ts | useHorizontalPanelLayout":{"message":"Use horizontal panel layout"},"entrypoints/main/main-meta.ts | useVerticalPanelLayout":{"message":"Use vertical panel layout"},"entrypoints/main/main-meta.ts | vertical":{"message":"vertical"},"entrypoints/main/main-meta.ts | zoomIn":{"message":"Zoom in"},"entrypoints/main/main-meta.ts | zoomOut":{"message":"Zoom out"},"entrypoints/main/MainImpl.ts | customizeAndControlDevtools":{"message":"Customize and control DevTools"},"entrypoints/main/MainImpl.ts | dockSide":{"message":"Dock side"},"entrypoints/main/MainImpl.ts | dockSideNaviation":{"message":"Use left and right arrow keys to navigate the options"},"entrypoints/main/MainImpl.ts | dockToBottom":{"message":"Dock to bottom"},"entrypoints/main/MainImpl.ts | dockToLeft":{"message":"Dock to left"},"entrypoints/main/MainImpl.ts | dockToRight":{"message":"Dock to right"},"entrypoints/main/MainImpl.ts | focusDebuggee":{"message":"Focus page"},"entrypoints/main/MainImpl.ts | help":{"message":"Help"},"entrypoints/main/MainImpl.ts | hideConsoleDrawer":{"message":"Hide console drawer"},"entrypoints/main/MainImpl.ts | moreTools":{"message":"More tools"},"entrypoints/main/MainImpl.ts | placementOfDevtoolsRelativeToThe":{"message":"Placement of DevTools relative to the page. ({PH1} to restore last position)"},"entrypoints/main/MainImpl.ts | showConsoleDrawer":{"message":"Show console drawer"},"entrypoints/main/MainImpl.ts | undockIntoSeparateWindow":{"message":"Undock into separate window"},"entrypoints/node_app/node_app.ts | connection":{"message":"Connection"},"entrypoints/node_app/node_app.ts | networkTitle":{"message":"Node"},"entrypoints/node_app/node_app.ts | node":{"message":"node"},"entrypoints/node_app/node_app.ts | showConnection":{"message":"Show Connection"},"entrypoints/node_app/node_app.ts | showNode":{"message":"Show Node"},"entrypoints/node_app/NodeConnectionsPanel.ts | addConnection":{"message":"Add connection"},"entrypoints/node_app/NodeConnectionsPanel.ts | networkAddressEgLocalhost":{"message":"Network address (e.g. localhost:9229)"},"entrypoints/node_app/NodeConnectionsPanel.ts | noConnectionsSpecified":{"message":"No connections specified"},"entrypoints/node_app/NodeConnectionsPanel.ts | nodejsDebuggingGuide":{"message":"Node.js debugging guide"},"entrypoints/node_app/NodeConnectionsPanel.ts | specifyNetworkEndpointAnd":{"message":"Specify network endpoint and DevTools will connect to it automatically. Read {PH1} to learn more."},"entrypoints/node_app/NodeMain.ts | main":{"message":"Main"},"entrypoints/node_app/NodeMain.ts | nodejsS":{"message":"Node.js: {PH1}"},"entrypoints/node_app/NodeMain.ts | NodejsTitleS":{"message":"DevTools - Node.js: {PH1}"},"entrypoints/rn_fusebox/FuseboxFeatureObserver.ts | multiHostFeatureDisabledDetail":{"message":"This feature is disabled as the app or framework has registered multiple React Native hosts, which is not currently supported."},"entrypoints/rn_fusebox/FuseboxFeatureObserver.ts | multiHostFeatureUnavailableTitle":{"message":"Feature is unavailable"},"entrypoints/rn_fusebox/FuseboxFeatureObserver.ts | networkInspectionUnavailable":{"message":"Network inspection is unavailable"},"entrypoints/rn_fusebox/FuseboxFeatureObserver.ts | performanceProfilingUnavailable":{"message":"Performance profiling is unavailable"},"entrypoints/rn_fusebox/FuseboxReconnectDeviceButton.ts | connectionStatusDisconnectedLabel":{"message":"Reconnect DevTools"},"entrypoints/rn_fusebox/FuseboxReconnectDeviceButton.ts | connectionStatusDisconnectedTooltip":{"message":"Debugging connection was closed"},"entrypoints/rn_fusebox/rn_fusebox.ts | networkTitle":{"message":"React Native"},"entrypoints/rn_fusebox/rn_fusebox.ts | sendFeedback":{"message":"[FB-only] Send feedback"},"entrypoints/rn_fusebox/rn_fusebox.ts | showReactNative":{"message":"Show React Native"},"entrypoints/worker_app/WorkerMain.ts | main":{"message":"Main"},"generated/Deprecation.ts | AuthorizationCoveredByWildcard":{"message":"Authorization will not be covered by the wildcard symbol (*) in CORS Access-Control-Allow-Headers handling."},"generated/Deprecation.ts | CanRequestURLHTTPContainingNewline":{"message":"Resource requests whose URLs contained both removed whitespace \\(n|r|t) characters and less-than characters (<) are blocked. Please remove newlines and encode less-than characters from places like element attribute values in order to load these resources."},"generated/Deprecation.ts | ChromeLoadTimesConnectionInfo":{"message":"chrome.loadTimes() is deprecated, instead use standardized API: Navigation Timing 2."},"generated/Deprecation.ts | ChromeLoadTimesFirstPaintAfterLoadTime":{"message":"chrome.loadTimes() is deprecated, instead use standardized API: Paint Timing."},"generated/Deprecation.ts | ChromeLoadTimesWasAlternateProtocolAvailable":{"message":"chrome.loadTimes() is deprecated, instead use standardized API: nextHopProtocol in Navigation Timing 2."},"generated/Deprecation.ts | CookieWithTruncatingChar":{"message":"Cookies containing a \\(0|r|n) character will be rejected instead of truncated."},"generated/Deprecation.ts | CrossOriginAccessBasedOnDocumentDomain":{"message":"Relaxing the same-origin policy by setting document.domain is deprecated, and will be disabled by default. This deprecation warning is for a cross-origin access that was enabled by setting document.domain."},"generated/Deprecation.ts | CrossOriginWindowAlert":{"message":"Triggering window.alert from cross origin iframes has been deprecated and will be removed in the future."},"generated/Deprecation.ts | CrossOriginWindowConfirm":{"message":"Triggering window.confirm from cross origin iframes has been deprecated and will be removed in the future."},"generated/Deprecation.ts | CSSSelectorInternalMediaControlsOverlayCastButton":{"message":"The disableRemotePlayback attribute should be used in order to disable the default Cast integration instead of using -internal-media-controls-overlay-cast-button selector."},"generated/Deprecation.ts | CSSValueAppearanceSliderVertical":{"message":"CSS appearance value slider-vertical is not standardized and will be removed."},"generated/Deprecation.ts | DataUrlInSvgUse":{"message":"Support for data: URLs in SVGUseElement is deprecated and it will be removed in the future."},"generated/Deprecation.ts | DOMMutationEvents":{"message":"DOM Mutation Events, including DOMSubtreeModified, DOMNodeInserted, DOMNodeRemoved, DOMNodeRemovedFromDocument, DOMNodeInsertedIntoDocument, and DOMCharacterDataModified are deprecated (https://w3c.github.io/uievents/#legacy-event-types) and will be removed. Please use MutationObserver instead."},"generated/Deprecation.ts | GeolocationInsecureOrigin":{"message":"getCurrentPosition() and watchPosition() no longer work on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gle/chrome-insecure-origins for more details."},"generated/Deprecation.ts | GeolocationInsecureOriginDeprecatedNotRemoved":{"message":"getCurrentPosition() and watchPosition() are deprecated on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gle/chrome-insecure-origins for more details."},"generated/Deprecation.ts | GetUserMediaInsecureOrigin":{"message":"getUserMedia() no longer works on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gle/chrome-insecure-origins for more details."},"generated/Deprecation.ts | H1UserAgentFontSizeInSection":{"message":"Found an tag within an ,