diff --git a/.eslintignore b/.eslintignore index e16e0140326a..a288117cf8ee 100644 --- a/.eslintignore +++ b/.eslintignore @@ -13,6 +13,7 @@ packages/*/dist packages/*/types_generated packages/debugger-frontend/dist/**/* packages/react-native-codegen/lib +private/react-native-codegen-typescript-test/lib/**/* **/Pods/* **/*.macos.js **/*.windows.js diff --git a/.eslintrc.js b/.eslintrc.js index a6d2c177a278..3f3ff7adda01 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,6 +35,9 @@ module.exports = { // Flow handles these checks for us, so they aren't required 'no-undef': 'off', 'no-unreachable': 'off', + // Throwing from function or rejecting promises with non-error values could result in unclear error stack traces and lead to harder debugging + 'prefer-promise-reject-errors': 'error', + 'no-throw-literal': 'error', }, }, { diff --git a/.flowconfig b/.flowconfig index 58a694a14b94..9ccb6588a52f 100644 --- a/.flowconfig +++ b/.flowconfig @@ -69,14 +69,12 @@ munge_underscores=true module.name_mapper='^react-native$' -> '/packages/react-native/index.js' module.name_mapper='^react-native/\(.*\)$' -> '/packages/react-native/\1' module.name_mapper='^@react-native/dev-middleware$' -> '/packages/dev-middleware' -module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\|xml\)$' -> '/packages/react-native/Libraries/Image/RelativeImageStub' +module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\|xml\|ktx\|heic\|heif\)$' -> '/packages/react-native/Libraries/Image/RelativeImageStub' module.system.haste.module_ref_prefix=m# react.runtime=automatic -experimental.error_code_migration=new - ban_spread_key_props=true [lints] @@ -100,4 +98,4 @@ untyped-import untyped-type-import [version] -^0.279.0 +^0.297.0 diff --git a/.github/actions/build-android/action.yml b/.github/actions/build-android/action.yml index ac769b62ce95..89ca4c49b284 100644 --- a/.github/actions/build-android/action.yml +++ b/.github/actions/build-android/action.yml @@ -16,7 +16,17 @@ runs: uses: ./.github/actions/setup-node - name: Install node dependencies uses: ./.github/actions/yarn-install + - name: Read current RNVersion + shell: bash + id: read-rn-version + run: | + echo "rn-version=$(jq -r '.version' packages/react-native/package.json)" >> $GITHUB_OUTPUT - name: Set React Native Version + # We don't want to set the version for stable branches, because this has been + # already set from the 'create release' commits on the release branch. + # For testing RC.0, though, the version has not been set yet. In that case, we are on Stable branch and + # it is the only case when the version is still 1000.0.0 + if: ${{ !endsWith(github.ref_name, '-stable') || endsWith(github.ref_name, '-stable') && steps.read-rn-version.outputs.rn-version == '1000.0.0' }} shell: bash run: node ./scripts/releases/set-rn-artifacts-version.js --build-type ${{ inputs.release-type }} - name: Setup gradle @@ -25,7 +35,7 @@ runs: cache-read-only: "false" cache-encryption-key: ${{ inputs.gradle-cache-encryption-key }} - name: Restore Android ccache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v5 with: path: /github/home/.cache/ccache key: v2-ccache-android-${{ github.job }}-${{ github.ref }}-${{ hashFiles('packages/react-native/ReactAndroid/**/*.cpp', 'packages/react-native/ReactAndroid/**/*.h', 'packages/react-native/ReactCommon/**/*.cpp', 'packages/react-native/ReactAndroid/**/CMakeLists.txt', 'packages/react-native/ReactCommon/**/CMakeLists.txt') }} @@ -42,19 +52,22 @@ runs: if [[ "${{ inputs.release-type }}" == "dry-run" ]]; then # dry-run: we only build ARM64 to save time/resources. For release/nightlies the default is to build all archs. export ORG_GRADLE_PROJECT_reactNativeArchitectures="arm64-v8a,x86" # x86 is required for E2E testing + export HERMES_PREBUILT_FLAG="ORG_GRADLE_PROJECT_react.internal.useHermesNightly=true" TASKS="publishAllToMavenTempLocal build" elif [[ "${{ inputs.release-type }}" == "nightly" ]]; then # nightly: we set isSnapshot to true so artifacts are sent to the right repository on Maven Central. export ORG_GRADLE_PROJECT_isSnapshot="true" + export HERMES_PREBUILT_FLAG="ORG_GRADLE_PROJECT_react.internal.useHermesNightly=true" TASKS="publishAllToMavenTempLocal publishAndroidToSonatype build" else # release: we want to build all archs (default) + export HERMES_PREBUILT_FLAG="ORG_GRADLE_PROJECT_react.internal.useHermesStable=true" TASKS="publishAllToMavenTempLocal publishAndroidToSonatype build" fi - ./gradlew $TASKS -PenableWarningsAsErrors=true + env "$HERMES_PREBUILT_FLAG" ./gradlew $TASKS -PenableWarningsAsErrors=true - name: Save Android ccache if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 with: path: /github/home/.cache/ccache key: v2-ccache-android-${{ github.job }}-${{ github.ref }}-${{ hashFiles('packages/react-native/ReactAndroid/**/*.cpp', 'packages/react-native/ReactAndroid/**/*.h', 'packages/react-native/ReactCommon/**/*.cpp', 'packages/react-native/ReactAndroid/**/CMakeLists.txt', 'packages/react-native/ReactCommon/**/CMakeLists.txt') }} @@ -62,13 +75,13 @@ runs: shell: bash run: ccache -s -v - name: Upload Maven Artifacts - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: maven-local path: /tmp/maven-local - name: Upload test results if: ${{ always() }} - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: build-android-results compression-level: 1 @@ -78,14 +91,14 @@ runs: packages/react-native/ReactAndroid/build/reports - name: Upload RNTester APK - hermes-debug if: ${{ always() }} - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: rntester-debug path: packages/rn-tester/android/app/build/outputs/apk/debug/ compression-level: 0 - name: Upload RNTester APK - hermes-release if: ${{ always() }} - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: rntester-release path: packages/rn-tester/android/app/build/outputs/apk/release/ diff --git a/.github/actions/build-apple-slices-hermes/action.yml b/.github/actions/build-apple-slices-hermes/action.yml deleted file mode 100644 index bc66de6a21b2..000000000000 --- a/.github/actions/build-apple-slices-hermes/action.yml +++ /dev/null @@ -1,103 +0,0 @@ -name: build-apple-slices-hermes -description: This action builds hermesc for Apple platforms -inputs: - hermes-version: - required: true - description: The version of Hermes - react-native-version: - required: true - description: The version of Hermes - slice: - required: true - description: The slice of hermes you want to build. It could be iphone, iphonesimulator, macos, catalyst, appletvos, appletvsimulator, xros, or xrossimulator - flavor: - required: true - description: The flavor we want to build. It can be Debug or Release -runs: - using: composite - steps: - - name: Setup xcode - uses: ./.github/actions/setup-xcode - - name: Restore Hermes workspace - uses: ./.github/actions/restore-hermes-workspace - - name: Restore HermesC Artifact - uses: actions/download-artifact@v4 - with: - name: hermesc-apple - path: ./packages/react-native/sdks/hermes/build_host_hermesc - - name: Restore Slice From Cache - id: restore-slice-cache - uses: actions/cache/restore@v4 - with: - path: ./packages/react-native/sdks/hermes/build_${{ inputs.slice }}_${{ inputs.flavor }} - key: v6-hermes-apple-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ inputs.slice }}-${{ inputs.flavor }} - - name: Build the Hermes ${{ inputs.slice }} frameworks - shell: bash - run: | - cd ./packages/react-native/sdks/hermes || exit 1 - SLICE=${{ inputs.slice }} - FLAVOR=${{ inputs.flavor }} - FINAL_PATH=build_"$SLICE"_"$FLAVOR" - echo "Final path for this slice is: $FINAL_PATH" - - if [[ -d "$FINAL_PATH" ]]; then - echo "[HERMES] Skipping! Found the requested slice at $FINAL_PATH". - exit 0 - fi - - if [[ "$ARTIFACTS_EXIST" ]]; then - echo "[HERMES] Skipping! Artifacts exists already." - exit 0 - fi - - export RELEASE_VERSION=${{ inputs.react-native-version }} - - # HermesC is used to build hermes, so it has to be executable - chmod +x ./build_host_hermesc/bin/hermesc - - if [[ "$SLICE" == "macosx" ]]; then - echo "[HERMES] Building Hermes for MacOS" - - chmod +x ./utils/build-mac-framework.sh - BUILD_TYPE="${{ inputs.flavor }}" ./utils/build-mac-framework.sh - else - echo "[HERMES] Building Hermes for iOS: $SLICE" - - chmod +x ./utils/build-ios-framework.sh - BUILD_TYPE="${{ inputs.flavor }}" ./utils/build-ios-framework.sh "$SLICE" - fi - - echo "Moving from build_$SLICE to $FINAL_PATH" - mv build_"$SLICE" "$FINAL_PATH" - - # check whether everything is there - if [[ -d "$FINAL_PATH/lib/hermesvm.framework" ]]; then - echo "Successfully built hermesvm.framework for $SLICE in $FLAVOR" - else - echo "Failed to built hermesvm.framework for $SLICE in $FLAVOR" - exit 1 - fi - - if [[ -d "$FINAL_PATH/lib/hermesvm.framework.dSYM" ]]; then - echo "Successfully built hermesvm.framework.dSYM for $SLICE in $FLAVOR" - else - echo "Failed to built hermesvm.framework.dSYM for $SLICE in $FLAVOR" - echo "Please try again" - exit 1 - fi - - name: Compress slices to preserve Symlinks - shell: bash - run: | - cd ./packages/react-native/sdks/hermes - tar -czv -f build_${{ matrix.slice }}_${{ matrix.flavor }}.tar.gz build_${{ matrix.slice }}_${{ matrix.flavor }} - - name: Upload Artifact for Slice (${{ inputs.slice }}, ${{ inputs.flavor }}} - uses: actions/upload-artifact@v4.3.4 - with: - name: slice-${{ inputs.slice }}-${{ inputs.flavor }} - path: ./packages/react-native/sdks/hermes/build_${{ inputs.slice }}_${{ inputs.flavor }}.tar.gz - - name: Save slice cache - if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode. - uses: actions/cache/save@v4 - with: - path: ./packages/react-native/sdks/hermes/build_${{ inputs.slice }}_${{ inputs.flavor }} - key: v6-hermes-apple-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ inputs.SLICE }}-${{ inputs.FLAVOR }} diff --git a/.github/actions/build-hermes-macos/action.yml b/.github/actions/build-hermes-macos/action.yml deleted file mode 100644 index 0f3a42a367f7..000000000000 --- a/.github/actions/build-hermes-macos/action.yml +++ /dev/null @@ -1,227 +0,0 @@ -name: build-hermes-macos -description: This action builds hermesc for Apple platforms -inputs: - hermes-version: - required: true - description: The version of Hermes - react-native-version: - required: true - description: The version of React Native - flavor: - required: true - description: The flavor we want to build. It can be Debug or Release -runs: - using: composite - steps: - - name: Setup xcode - uses: ./.github/actions/setup-xcode - - name: Restore Hermes workspace - uses: ./.github/actions/restore-hermes-workspace - - name: Restore Cached Artifacts - uses: actions/cache/restore@v4 - with: - key: v4-hermes-artifacts-${{ inputs.flavor }}-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}-${{ hashFiles('./packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }} - path: | - /tmp/hermes/osx-bin/${{ inputs.flavor }} - /tmp/hermes/dSYM/${{ inputs.flavor }} - /tmp/hermes/hermes-runtime-darwin/hermes-ios-${{ inputs.flavor }}.tar.gz - - name: Check if the required artifacts already exist - id: check_if_apple_artifacts_are_there - shell: bash - run: | - FLAVOR="${{ inputs.flavor }}" - echo "Flavor is $FLAVOR" - OSX_BIN="/tmp/hermes/osx-bin/$FLAVOR" - DSYM="/tmp/hermes/dSYM/$FLAVOR" - HERMES="/tmp/hermes/hermes-runtime-darwin/hermes-ios-$FLAVOR.tar.gz" - - if [[ -d "$OSX_BIN" ]] && \ - [[ -d "$DSYM" ]] && \ - [[ -f "$HERMES" ]]; then - - echo "Artifacts are there!" - echo "ARTIFACTS_EXIST=true" >> $GITHUB_ENV - echo "ARTIFACTS_EXIST=true" >> $GITHUB_OUTPUT - fi - - name: Setup node.js - uses: ./.github/actions/setup-node - - name: Yarn- Install Dependencies - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: ./.github/actions/yarn-install - - name: Slice cache macosx - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: actions/download-artifact@v4 - with: - path: ./packages/react-native/sdks/hermes/ - name: slice-macosx-${{ inputs.flavor }} - - name: Slice cache iphoneos - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: actions/download-artifact@v4 - with: - path: ./packages/react-native/sdks/hermes/ - name: slice-iphoneos-${{ inputs.flavor }} - - name: Slice cache iphonesimulator - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: actions/download-artifact@v4 - with: - path: ./packages/react-native/sdks/hermes/ - name: slice-iphonesimulator-${{ inputs.flavor }} - - name: Slice cache appletvos - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: actions/download-artifact@v4 - with: - path: ./packages/react-native/sdks/hermes/ - name: slice-appletvos-${{ inputs.flavor }} - - name: Slice cache appletvsimulator - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: actions/download-artifact@v4 - with: - path: ./packages/react-native/sdks/hermes/ - name: slice-appletvsimulator-${{ inputs.flavor }} - - name: Slice cache catalyst - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: actions/download-artifact@v4 - with: - path: ./packages/react-native/sdks/hermes/ - name: slice-catalyst-${{ inputs.flavor }} - - name: Slice cache xros - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: actions/download-artifact@v4 - with: - path: ./packages/react-native/sdks/hermes/ - name: slice-xros-${{ inputs.flavor }} - - name: Slice cache xrsimulator - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: actions/download-artifact@v4 - with: - path: ./packages/react-native/sdks/hermes/ - name: slice-xrsimulator-${{ inputs.flavor }} - - name: Unzip slices - shell: bash - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - run: | - cd ./packages/react-native/sdks/hermes - ls -l . - tar -xzv -f build_catalyst_${{ matrix.flavor }}.tar.gz - tar -xzv -f build_iphoneos_${{ matrix.flavor }}.tar.gz - tar -xzv -f build_iphonesimulator_${{ matrix.flavor }}.tar.gz - tar -xzv -f build_appletvos_${{ matrix.flavor }}.tar.gz - tar -xzv -f build_appletvsimulator_${{ matrix.flavor }}.tar.gz - tar -xzv -f build_macosx_${{ matrix.flavor }}.tar.gz - tar -xzv -f build_xros_${{ matrix.flavor }}.tar.gz - tar -xzv -f build_xrsimulator_${{ matrix.flavor }}.tar.gz - - name: Move back build folders - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - shell: bash - run: | - ls -l ./packages/react-native/sdks/hermes - cd ./packages/react-native/sdks/hermes || exit 1 - mv build_macosx_${{ inputs.flavor }} build_macosx - mv build_iphoneos_${{ inputs.flavor }} build_iphoneos - mv build_iphonesimulator_${{ inputs.flavor }} build_iphonesimulator - mv build_appletvos_${{ inputs.flavor }} build_appletvos - mv build_appletvsimulator_${{ inputs.flavor }} build_appletvsimulator - mv build_catalyst_${{ inputs.flavor }} build_catalyst - mv build_xros_${{ inputs.flavor }} build_xros - mv build_xrsimulator_${{ inputs.flavor }} build_xrsimulator - - name: Prepare destroot folder - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - shell: bash - run: | - cd ./packages/react-native/sdks/hermes || exit 1 - chmod +x ./utils/build-apple-framework.sh - . ./utils/build-apple-framework.sh - prepare_dest_root_for_ci - - name: Create fat framework for iOS - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - shell: bash - run: | - cd ./packages/react-native/sdks/hermes || exit 1 - echo "[HERMES] Creating the universal framework" - chmod +x ./utils/build-ios-framework.sh - ./utils/build-ios-framework.sh build_framework - - chmod +x ./destroot/bin/hermesc - - name: Package the Hermes Apple frameworks - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - shell: bash - run: | - BUILD_TYPE="${{ inputs.flavor }}" - echo "Packaging Hermes Apple frameworks for $BUILD_TYPE build type" - - TARBALL_OUTPUT_DIR=$(mktemp -d /tmp/hermes-tarball-output-XXXXXXXX) - - TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "$BUILD_TYPE") - - echo "Packaging Hermes Apple frameworks for $BUILD_TYPE build type" - - TARBALL_OUTPUT_PATH=$(node ./packages/react-native/scripts/hermes/create-tarball.js \ - --inputDir ./packages/react-native/sdks/hermes \ - --buildType "$BUILD_TYPE" \ - --outputDir $TARBALL_OUTPUT_DIR) - - echo "Hermes tarball saved to $TARBALL_OUTPUT_PATH" - - mkdir -p $HERMES_TARBALL_ARTIFACTS_DIR - cp $TARBALL_OUTPUT_PATH $HERMES_TARBALL_ARTIFACTS_DIR/. - - mkdir -p /tmp/hermes/osx-bin/${{ inputs.flavor }} - cp ./packages/react-native/sdks/hermes/build_macosx/bin/* /tmp/hermes/osx-bin/${{ inputs.flavor }} - ls -lR /tmp/hermes/osx-bin/ - - name: Create dSYM archive - if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - shell: bash - run: | - FLAVOR=${{ inputs.flavor }} - WORKING_DIR="/tmp/hermes_tmp/dSYM/$FLAVOR" - - mkdir -p "$WORKING_DIR/macosx" - mkdir -p "$WORKING_DIR/catalyst" - mkdir -p "$WORKING_DIR/iphoneos" - mkdir -p "$WORKING_DIR/iphonesimulator" - mkdir -p "$WORKING_DIR/appletvos" - mkdir -p "$WORKING_DIR/appletvsimulator" - mkdir -p "$WORKING_DIR/xros" - mkdir -p "$WORKING_DIR/xrsimulator" - - cd ./packages/react-native/sdks/hermes || exit 1 - - DSYM_FILE_PATH=lib/hermesvm.framework.dSYM - cp -r build_macosx/$DSYM_FILE_PATH "$WORKING_DIR/macosx/" - cp -r build_catalyst/$DSYM_FILE_PATH "$WORKING_DIR/catalyst/" - cp -r build_iphoneos/$DSYM_FILE_PATH "$WORKING_DIR/iphoneos/" - cp -r build_iphonesimulator/$DSYM_FILE_PATH "$WORKING_DIR/iphonesimulator/" - cp -r build_appletvos/$DSYM_FILE_PATH "$WORKING_DIR/appletvos/" - cp -r build_appletvsimulator/$DSYM_FILE_PATH "$WORKING_DIR/appletvsimulator/" - cp -r build_xros/$DSYM_FILE_PATH "$WORKING_DIR/xros/" - cp -r build_xrsimulator/$DSYM_FILE_PATH "$WORKING_DIR/xrsimulator/" - - DEST_DIR="/tmp/hermes/dSYM/$FLAVOR" - tar -C "$WORKING_DIR" -czvf "hermesvm.framework.dSYM" . - - mkdir -p "$DEST_DIR" - mv "hermesvm.framework.dSYM" "$DEST_DIR" - - name: Upload hermes dSYM artifacts - uses: actions/upload-artifact@v4.3.4 - with: - name: hermes-dSYM-${{ inputs.flavor }} - path: /tmp/hermes/dSYM/${{ inputs.flavor }} - - name: Upload hermes Runtime artifacts - uses: actions/upload-artifact@v4.3.4 - with: - name: hermes-darwin-bin-${{ inputs.flavor }} - path: /tmp/hermes/hermes-runtime-darwin/hermes-ios-${{ inputs.flavor }}.tar.gz - - name: Upload hermes osx artifacts - uses: actions/upload-artifact@v4.3.4 - with: - name: hermes-osx-bin-${{ inputs.flavor }} - path: /tmp/hermes/osx-bin/${{ inputs.flavor }} - - name: Upload Hermes Artifacts - uses: actions/cache/save@v4 - if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode. - with: - key: v4-hermes-artifacts-${{ inputs.flavor }}-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}-${{ hashFiles('./packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }} - path: | - /tmp/hermes/osx-bin/${{ inputs.flavor }} - /tmp/hermes/dSYM/${{ inputs.flavor }} - /tmp/hermes/hermes-runtime-darwin/hermes-ios-${{ inputs.flavor }}.tar.gz diff --git a/.github/actions/build-hermesc-apple/action.yml b/.github/actions/build-hermesc-apple/action.yml deleted file mode 100644 index c4fefdce9e17..000000000000 --- a/.github/actions/build-hermesc-apple/action.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: build-hermesc-apple -description: This action builds hermesc for Apple platforms -inputs: - hermes-version: - required: true - description: The version of Hermes - react-native-version: - required: true - description: The version of React Native -runs: - using: composite - steps: - - name: Setup xcode - uses: ./.github/actions/setup-xcode - - name: Restore Hermes workspace - uses: ./.github/actions/restore-hermes-workspace - - name: Hermes apple cache - uses: actions/cache/restore@v4 - with: - path: ./packages/react-native/sdks/hermes/build_host_hermesc - key: v2-hermesc-apple-${{ inputs.hermes-version }}-${{ inputs.react-native-version }} - - name: Build HermesC Apple - shell: bash - run: | - cd ./packages/react-native/sdks/hermes || exit 1 - . ./utils/build-apple-framework.sh - build_host_hermesc_if_needed - - name: Upload HermesC Artifact - uses: actions/upload-artifact@v4.3.4 - with: - name: hermesc-apple - path: ./packages/react-native/sdks/hermes/build_host_hermesc - - name: Cache hermesc apple - uses: actions/cache/save@v4 - if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode. - with: - path: ./packages/react-native/sdks/hermes/build_host_hermesc - key: v2-hermesc-apple-${{ inputs.hermes-version }}-${{ inputs.react-native-version }} - enableCrossOsArchive: true diff --git a/.github/actions/build-hermesc-linux/action.yml b/.github/actions/build-hermesc-linux/action.yml deleted file mode 100644 index 0c90739d0a72..000000000000 --- a/.github/actions/build-hermesc-linux/action.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: build-hermesc-linux -description: This action builds hermesc for linux platforms -inputs: - hermes-version: - required: True - description: The version of Hermes - react-native-version: - required: True - description: The version of React Native -runs: - using: composite - steps: - - name: Install dependencies - shell: bash - run: | - sudo apt update - sudo apt install -y git openssh-client build-essential \ - libreadline-dev libicu-dev jq zip python3 - - # Install cmake 3.28.3-1build7 - sudo apt-get install cmake=3.28.3-1build7 - sudo ln -sf /usr/bin/cmake /usr/local/bin/cmake - - name: Restore Hermes workspace - uses: ./.github/actions/restore-hermes-workspace - - name: Linux cache - uses: actions/cache@v4 - with: - key: v1-hermes-${{ github.job }}-linux-${{ inputs.hermes-version }}-${{ inputs.react-native-version }} - path: | - /tmp/hermes/linux64-bin/ - /tmp/hermes/hermes/destroot/ - - name: Set up workspace - shell: bash - run: | - mkdir -p /tmp/hermes/linux64-bin - - name: Build HermesC for Linux - shell: bash - run: | - if [ -f /tmp/hermes/linux64-bin/hermesc ]; then - echo 'Skipping; Clean "/tmp/hermes/linux64-bin" to rebuild.' - else - cd /tmp/hermes - cmake -S hermes -B build -DHERMES_STATIC_LINK=ON -DCMAKE_BUILD_TYPE=Release -DHERMES_ENABLE_TEST_SUITE=OFF \ - -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=True -DCMAKE_CXX_FLAGS=-s -DCMAKE_C_FLAGS=-s \ - -DCMAKE_EXE_LINKER_FLAGS="-Wl,--whole-archive -lpthread -Wl,--no-whole-archive" - cmake --build build --target hermesc -j 4 - cp /tmp/hermes/build/bin/hermesc /tmp/hermes/linux64-bin/. - fi - - name: Upload linux artifacts - uses: actions/upload-artifact@v4.3.4 - with: - name: hermes-linux-bin - path: /tmp/hermes/linux64-bin diff --git a/.github/actions/build-hermesc-windows/action.yml b/.github/actions/build-hermesc-windows/action.yml deleted file mode 100644 index 1dcaebb2fb93..000000000000 --- a/.github/actions/build-hermesc-windows/action.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: build-hermesc-windows -description: This action builds hermesc for Windows platforms -inputs: - hermes-version: - required: True - description: The version of Hermes - react-native-version: - required: True - description: The version of React Native -runs: - using: composite - steps: - - name: Download Previous Artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-workspace - path: 'C:\tmp\hermes' - - name: Set up workspace - shell: powershell - run: | - mkdir -p C:\tmp\hermes\osx-bin - mkdir -p .\packages\react-native\sdks\hermes - cp -r -Force C:\tmp\hermes\hermes\* .\packages\react-native\sdks\hermes\. - cp -r -Force .\packages\react-native\sdks\hermes-engine\utils\* .\packages\react-native\sdks\hermes\. - - name: Windows cache - uses: actions/cache@v4 - with: - key: v3-hermes-${{ github.job }}-windows-${{ inputs.hermes-version }}-${{ inputs.react-native-version }} - path: | - C:\tmp\hermes\win64-bin\ - C:\tmp\hermes\hermes\icu\ - C:\tmp\hermes\hermes\deps\ - C:\tmp\hermes\hermes\build_release\ - - name: setup-msbuild - uses: microsoft/setup-msbuild@v1.3.2 - - name: Set up workspace - shell: powershell - run: | - New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\icu - New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\deps - New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\win64-bin - - name: Downgrade CMake - shell: powershell - run: choco install cmake --version 3.31.6 --force - - name: Build HermesC for Windows - shell: powershell - run: | - if (-not(Test-Path -Path $Env:HERMES_WS_DIR\win64-bin\hermesc.exe)) { - cd $Env:HERMES_WS_DIR\icu - # If Invoke-WebRequest shows a progress bar, it will fail with - # Win32 internal error "Access is denied" 0x5 occurred [...] - $progressPreference = 'silentlyContinue' - Invoke-WebRequest -Uri "$Env:ICU_URL" -OutFile "icu.zip" - Expand-Archive -Path "icu.zip" -DestinationPath "." - - cd $Env:HERMES_WS_DIR - Copy-Item -Path "icu\bin64\icu*.dll" -Destination "deps" - # Include MSVC++ 2015 redistributables - Copy-Item -Path "c:\windows\system32\msvcp140.dll" -Destination "deps" - Copy-Item -Path "c:\windows\system32\vcruntime140.dll" -Destination "deps" - Copy-Item -Path "c:\windows\system32\vcruntime140_1.dll" -Destination "deps" - - $Env:PATH += ";$Env:CMAKE_DIR;$Env:MSBUILD_DIR" - $Env:ICU_ROOT = "$Env:HERMES_WS_DIR\icu" - - cmake -S hermes -B build_release -G 'Visual Studio 17 2022' -Ax64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=True -DHERMES_ENABLE_WIN10_ICU_FALLBACK=OFF - if (-not $?) { throw "Failed to configure Hermes" } - echo "Running windows build..." - cd build_release - cmake --build . --target hermesc --config Release - if (-not $?) { throw "Failed to build Hermes" } - - echo "Copying hermesc.exe to win64-bin" - cd $Env:HERMES_WS_DIR - Copy-Item -Path "build_release\bin\Release\hermesc.exe" -Destination "win64-bin" - # Include Windows runtime dependencies - Copy-Item -Path "deps\*" -Destination "win64-bin" - } - else { - Write-Host "Skipping; Clean c:\tmp\hermes\win64-bin to rebuild." - } - - name: Upload windows artifacts - uses: actions/upload-artifact@v4.3.4 - with: - name: hermes-win64-bin - path: C:\tmp\hermes\win64-bin\ diff --git a/.github/actions/build-npm-package/action.yml b/.github/actions/build-npm-package/action.yml index 8b894e906395..6bacb3d29dde 100644 --- a/.github/actions/build-npm-package/action.yml +++ b/.github/actions/build-npm-package/action.yml @@ -4,9 +4,6 @@ inputs: release-type: required: true description: The type of release we are building. It could be nightly, release or dry-run - hermes-ws-dir: - required: 'true' - description: The workspace for hermes gha-npm-token: required: false description: The GHA npm token, required only to publish to npm @@ -20,95 +17,14 @@ runs: - name: Setup git safe folders shell: bash run: git config --global --add safe.directory '*' - - name: Create /tmp/hermes/osx-bin directory - shell: bash - run: mkdir -p /tmp/hermes/osx-bin - - name: Download osx-bin release artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-osx-bin-Release - path: /tmp/hermes/osx-bin/Release - - name: Download osx-bin debug artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-osx-bin-Debug - path: /tmp/hermes/osx-bin/Debug - - name: Download darwin-bin release artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-darwin-bin-Release - path: /tmp/hermes/hermes-runtime-darwin - - name: Download darwin-bin debug artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-darwin-bin-Debug - path: /tmp/hermes/hermes-runtime-darwin - - name: Download hermes dSYM debug artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-dSYM-Debug - path: /tmp/hermes/dSYM/Debug - - name: Download hermes dSYM release vartifacts - uses: actions/download-artifact@v4 - with: - name: hermes-dSYM-Release - path: /tmp/hermes/dSYM/Release - - name: Download windows-bin artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-win64-bin - path: /tmp/hermes/win64-bin - - name: Download linux-bin artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-linux-bin - path: /tmp/hermes/linux64-bin - - name: Show /tmp/hermes directory - shell: bash - run: ls -lR /tmp/hermes - - name: Copy Hermes binaries - shell: bash - run: | - mkdir -p ./packages/react-native/sdks/hermesc ./packages/react-native/sdks/hermesc/osx-bin ./packages/react-native/sdks/hermesc/win64-bin ./packages/react-native/sdks/hermesc/linux64-bin - - # When build_hermes_macos runs as a matrix, it outputs - if [[ -d ${{ inputs.hermes-ws-dir }}/osx-bin/Release ]]; then - cp -r ${{ inputs.hermes-ws-dir }}/osx-bin/Release/* ./packages/react-native/sdks/hermesc/osx-bin/. - elif [[ -d ${{ inputs.hermes-ws-dir }}/osx-bin/Debug ]]; then - cp -r ${{ inputs.hermes-ws-dir }}/osx-bin/Debug/* ./packages/react-native/sdks/hermesc/osx-bin/. - else - ls ${{ inputs.hermes-ws-dir }}/osx-bin || echo "hermesc macOS artifacts directory missing." - echo "Could not locate macOS hermesc binary."; exit 1; - fi - - # Sometimes, GHA creates artifacts with lowercase Debug/Release. Make sure that if it happen, we uppercase them. - if [[ -f "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-debug.tar.gz" ]]; then - mv "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-debug.tar.gz" "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-Debug.tar.gz" - fi - - if [[ -f "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-release.tar.gz" ]]; then - mv "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-release.tar.gz" "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-Release.tar.gz" - fi - - cp -r ${{ inputs.hermes-ws-dir }}/win64-bin/* ./packages/react-native/sdks/hermesc/win64-bin/. - cp -r ${{ inputs.hermes-ws-dir }}/linux64-bin/* ./packages/react-native/sdks/hermesc/linux64-bin/. - - # Make sure the hermesc files are actually executable. - chmod -R +x packages/react-native/sdks/hermesc/* - - mkdir -p ./packages/react-native/ReactAndroid/external-artifacts/artifacts/ - cp ${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-Debug.tar.gz ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-ios-debug.tar.gz - cp ${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-Release.tar.gz ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-ios-release.tar.gz - cp ${{ inputs.hermes-ws-dir }}/dSYM/Debug/hermesvm.framework.dSYM ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-framework-dSYM-debug.tar.gz - cp ${{ inputs.hermes-ws-dir }}/dSYM/Release/hermesvm.framework.dSYM ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-framework-dSYM-release.tar.gz - name: Download ReactNativeDependencies - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: ReactNativeDependencies* path: ./packages/react-native/ReactAndroid/external-artifacts/artifacts merge-multiple: true - name: Download ReactCore artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: ReactCore* path: ./packages/react-native/ReactAndroid/external-artifacts/artifacts @@ -149,7 +65,7 @@ runs: fi node ./scripts/releases-ci/publish-npm.js -t ${{ inputs.release-type }} - name: Upload npm logs - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: npm-logs path: ~/.npm/_logs @@ -164,7 +80,7 @@ runs: echo "$FILENAME" > build/react-native-package-version - name: Upload release package - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 if: ${{ inputs.release-type == 'dry-run' }} with: name: react-native-package diff --git a/.github/actions/diff-js-api-breaking-changes/action.yml b/.github/actions/diff-js-api-breaking-changes/action.yml deleted file mode 100644 index bc45b1b207aa..000000000000 --- a/.github/actions/diff-js-api-breaking-changes/action.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: diff-js-api-breaking-changes -description: Check for breaking changes in the public React Native JS API -runs: - using: composite - steps: - - name: Fetch snapshot from PR head - shell: bash - env: - SCRATCH_DIR: ${{ runner.temp }}/diff-js-api-breaking-changes - run: | - mkdir $SCRATCH_DIR - git fetch --depth=1 origin ${{ github.event.pull_request.head.sha }} - git show ${{ github.event.pull_request.head.sha }}:packages/react-native/ReactNativeApi.d.ts > $SCRATCH_DIR/ReactNativeApi-after.d.ts \ - || echo "" > $SCRATCH_DIR/ReactNativeApi.d.ts - - name: Run breaking change detection - shell: bash - env: - SCRATCH_DIR: ${{ runner.temp }}/diff-js-api-breaking-changes - run: | - node ./scripts/js-api/diff-api-snapshot \ - ${{ github.workspace }}/packages/react-native/ReactNativeApi.d.ts \ - $SCRATCH_DIR/ReactNativeApi-after.d.ts \ - > $SCRATCH_DIR/output.json diff --git a/.github/actions/diff-js-api-changes/action.yml b/.github/actions/diff-js-api-changes/action.yml new file mode 100644 index 000000000000..9e186d27cc01 --- /dev/null +++ b/.github/actions/diff-js-api-changes/action.yml @@ -0,0 +1,31 @@ +name: diff-js-api-changes +description: Check for breaking changes in the public React Native JS API +runs: + using: composite + steps: + - name: Compute merge base with main + id: merge_base + shell: bash + run: | + git fetch origin main + git fetch --deepen=500 + echo "merge_base=$(git merge-base HEAD origin/main)" >> $GITHUB_OUTPUT + + - name: Output snapshot before state for comparison + shell: bash + env: + SCRATCH_DIR: ${{ runner.temp }}/diff-js-api-changes + run: | + mkdir -p $SCRATCH_DIR + git show ${{ steps.merge_base.outputs.merge_base }}:packages/react-native/ReactNativeApi.d.ts > $SCRATCH_DIR/ReactNativeApi-before.d.ts \ + || echo "" > $SCRATCH_DIR/ReactNativeApi-before.d.ts + + - name: Run breaking change detection + shell: bash + env: + SCRATCH_DIR: ${{ runner.temp }}/diff-js-api-changes + run: | + node ./scripts/js-api/diff-api-snapshot \ + $SCRATCH_DIR/ReactNativeApi-before.d.ts \ + ./packages/react-native/ReactNativeApi.d.ts \ + > $SCRATCH_DIR/output.json diff --git a/.github/actions/maestro-android/action.yml b/.github/actions/maestro-android/action.yml index 4a24e2c0231e..4aa15709070e 100644 --- a/.github/actions/maestro-android/action.yml +++ b/.github/actions/maestro-android/action.yml @@ -22,6 +22,10 @@ inputs: required: false default: "." description: The directory from which metro should be started + emulator-arch: + required: false + default: x86 + description: The architecture of the emulator to run runs: using: composite @@ -31,7 +35,7 @@ runs: run: export MAESTRO_VERSION=1.40.0; curl -Ls "https://get.maestro.mobile.dev" | bash - name: Set up JDK 17 if: ${{ inputs.install-java == 'true' }} - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: '17' distribution: 'zulu' @@ -53,7 +57,7 @@ runs: uses: reactivecircus/android-emulator-runner@v2 with: api-level: 24 - arch: x86 + arch: ${{ inputs.emulator-arch }} ram-size: '8192M' heap-size: '4096M' disk-size: '10G' @@ -69,16 +73,16 @@ runs: NORM_APP_ID=$(echo "${{ inputs.app-id }}" | tr '.' '-') echo "app-id=$NORM_APP_ID" >> $GITHUB_OUTPUT - name: Store tests result - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 if: always() with: - name: e2e_android_${{ steps.normalize-app-id.outputs.app-id }}_report_${{ inputs.flavor }}_NewArch + name: e2e_android_${{ steps.normalize-app-id.outputs.app-id }}_report_${{ inputs.flavor }}_${{ inputs.emulator-arch }}_NewArch path: | report.xml screen.mp4 - name: Store Logs if: steps.run-tests.outcome == 'failure' - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: - name: maestro-logs-android-${{ steps.normalize-app-id.outputs.app-id }}-${{ inputs.flavor }}-NewArch + name: maestro-logs-android-${{ steps.normalize-app-id.outputs.app-id }}-${{ inputs.flavor }}-${{ inputs.emulator-arch }}-NewArch path: /tmp/MaestroLogs diff --git a/.github/actions/maestro-ios/action.yml b/.github/actions/maestro-ios/action.yml index 50b21597c9ed..16fbb84173f1 100644 --- a/.github/actions/maestro-ios/action.yml +++ b/.github/actions/maestro-ios/action.yml @@ -30,8 +30,8 @@ runs: run: | brew tap facebook/fb brew install facebook/fb/idb-companion - - name: Set up JDK 11 - uses: actions/setup-java@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v5 with: java-version: '17' distribution: 'zulu' @@ -66,7 +66,7 @@ runs: "${{ inputs.working-directory }}" - name: Store video record if: always() - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: e2e_ios_${{ inputs.app-id }}_report_${{ inputs.flavor }}_NewArch path: | @@ -78,7 +78,7 @@ runs: report.xml - name: Store Logs if: failure() && steps.run-tests.outcome == 'failure' - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: maestro-logs-${{ inputs.app-id }}-${{ inputs.flavor }}-NewArch path: /tmp/MaestroLogs diff --git a/.github/actions/prepare-hermes-v1-app/action.yml b/.github/actions/prepare-hermes-v1-app/action.yml new file mode 100644 index 000000000000..24f40d0fbacd --- /dev/null +++ b/.github/actions/prepare-hermes-v1-app/action.yml @@ -0,0 +1,41 @@ +name: prepare-hermes-v1-app +description: Prepares a React Native app with Hermes V1 enabled +inputs: + retry-count: + description: 'Number of times to retry the yarn install on failure' +runs: + using: composite + steps: + - name: Create new app + shell: bash + run: | + cd /tmp + npx @react-native-community/cli init RNApp --skip-install --version nightly + + - name: Select latest Hermes V1 version + shell: bash + run: | + node "$GITHUB_WORKSPACE/.github/workflow-scripts/selectLatestHermesV1Version.js" + + - name: Apply patch to enable Hermes V1 + shell: bash + run: | + cd /tmp/RNApp + git apply --binary --3way --whitespace=nowarn "$GITHUB_WORKSPACE/.github/workflow-scripts/hermes-v1.patch" + echo "✅ Patch applied successfully" + + - name: Install app dependencies with retry + uses: nick-fields/retry@v3 + with: + timeout_minutes: 10 + max_attempts: ${{ inputs.retry-count }} + retry_wait_seconds: 15 + shell: bash + command: | + cd /tmp/RNApp + yarn install + on_retry_command: | + echo "Cleaning up for yarn retry..." + cd /tmp/RNApp + rm -rf node_modules yarn.lock || true + yarn cache clean || true diff --git a/.github/actions/prepare-hermes-workspace/action.yml b/.github/actions/prepare-hermes-workspace/action.yml deleted file mode 100644 index 47953b676007..000000000000 --- a/.github/actions/prepare-hermes-workspace/action.yml +++ /dev/null @@ -1,99 +0,0 @@ -name: prepare-hermes-workspace -description: This action prepares the hermes workspace with the right hermes and react-native versions. -inputs: - hermes-ws-dir: - required: true - description: The hermes dir we need to use to setup the workspace - hermes-version-file: - required: true - description: the path to the file that will contain the hermes version -outputs: - hermes-version: - description: the version of Hermes tied to this run - value: ${{ steps.hermes-version.outputs.VERSION }} - react-native-version: - description: the version of React Native tied to this run - value: ${{ steps.react-native-version.outputs.VERSION }} -runs: - using: composite - steps: - - name: Setup hermes version - shell: bash - id: hermes-version - run: | - mkdir -p "/tmp/hermes" "/tmp/hermes/download" "/tmp/hermes/hermes" - - if [ -f "${{ inputs.hermes-version-file }}" ]; then - echo "Hermes Version file found! Using this version for the build:" - echo "VERSION=$(cat ${{ inputs.hermes-version-file }})" >> "$GITHUB_OUTPUT" - else - echo "Hermes Version file not found!!!" - echo "Using the last commit from main for the build:" - HERMES_TAG_SHA=$(git ls-remote https://github.com/facebook/hermes main | cut -f 1 | tr -d '[:space:]') - echo "VERSION=$HERMES_TAG_SHA" >> "$GITHUB_OUTPUT" - fi - echo "Hermes commit is $HERMES_TAG_SHA" - - - name: Get react-native version - shell: bash - id: react-native-version - run: | - VERSION=$(cat packages/react-native/package.json | jq -r '.version') - # Save the react native version we are building in an output variable so we can use that file as part of the cache key. - echo "VERSION=$VERSION" >> "$GITHUB_OUTPUT" - echo "React Native Version is $VERSION" - - - name: Cache hermes workspace - id: restore-hermes - uses: actions/cache/restore@v4 - with: - path: | - /tmp/hermes/download/ - /tmp/hermes/hermes/ - key: v1-hermes-${{ steps.hermes-version.outputs.version }} - enableCrossOsArchive: true - - # It happened while testing that a cache was created from the right folders - # but those folders where empty. Thus, the next check ensures that we can work with those caches. - - name: Check if cache was meaningful - id: meaningful-cache - shell: bash - run: | - if [[ -d /tmp/hermes/hermes ]] && [[ -n "$(ls -A /tmp/hermes/hermes)" ]]; then - echo "Found a good hermes cache" - echo "HERMES_CACHED=true" >> "$GITHUB_OUTPUT" - fi - - - name: Setup node.js - uses: ./.github/actions/setup-node - - name: Yarn- Install Dependencies - if: ${{ steps.meaningful-cache.outputs.HERMES_CACHED != 'true' }} - uses: ./.github/actions/yarn-install - - - name: Download Hermes tarball - if: ${{ steps.meaningful-cache.outputs.HERMES_CACHED != 'true' }} - shell: bash - run: | - node packages/react-native/scripts/hermes/prepare-hermes-for-build ${{ github.event.pull_request.html_url }} - cp packages/react-native/sdks/download/* ${{ inputs.hermes-ws-dir }}/download/. - cp -r packages/react-native/sdks/hermes/* ${{ inputs.hermes-ws-dir }}/hermes/. - - echo ${{ steps.hermes-version.outputs.version }} - - - name: Upload Hermes artifact - uses: actions/upload-artifact@v4.3.4 - with: - name: hermes-workspace - path: | - /tmp/hermes/download/ - /tmp/hermes/hermes/ - - - name: Cache hermes workspace - uses: actions/cache/save@v4 - if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode. - with: - path: | - /tmp/hermes/download/ - /tmp/hermes/hermes/ - key: v1-hermes-${{ steps.hermes-version.outputs.version }} - enableCrossOsArchive: true diff --git a/.github/actions/restore-hermes-workspace/action.yml b/.github/actions/restore-hermes-workspace/action.yml deleted file mode 100644 index 0b1cb2594357..000000000000 --- a/.github/actions/restore-hermes-workspace/action.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: restore-hermes-workspace -description: "Restore hermes workspace that has been created in Prepare Hermes Workspace" -runs: - using: composite - steps: - - name: Download Previous Artifacts - uses: actions/download-artifact@v4 - with: - name: hermes-workspace - path: /tmp/hermes - - name: Set up workspace - shell: bash - run: | - mkdir -p $HERMES_OSXBIN_ARTIFACTS_DIR ./packages/react-native/sdks/hermes - cp -r $HERMES_WS_DIR/hermes/* ./packages/react-native/sdks/hermes/. - cp -r ./packages/react-native/sdks/hermes-engine/utils ./packages/react-native/sdks/hermes/. diff --git a/.github/actions/run-fantom-tests/action.yml b/.github/actions/run-fantom-tests/action.yml index 1f143f2367bd..83fdd3a03d3f 100644 --- a/.github/actions/run-fantom-tests/action.yml +++ b/.github/actions/run-fantom-tests/action.yml @@ -27,7 +27,7 @@ runs: cache-read-only: "false" cache-encryption-key: ${{ inputs.gradle-cache-encryption-key }} - name: Restore Fantom ccache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v5 with: path: /github/home/.cache/ccache key: v2-ccache-fantom-${{ github.job }}-${{ github.ref }}-${{ hashFiles( @@ -56,7 +56,7 @@ runs: CXX: clang++ - name: Save Fantom ccache if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 with: path: /github/home/.cache/ccache key: v2-ccache-fantom-${{ github.job }}-${{ github.ref }}-${{ hashFiles( @@ -75,7 +75,7 @@ runs: run: ccache -s -v - name: Upload test results if: ${{ always() }} - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: run-fantom-tests-results compression-level: 1 diff --git a/.github/actions/setup-node/action.yml b/.github/actions/setup-node/action.yml index d076bf4acb8b..7b5aa82470a4 100644 --- a/.github/actions/setup-node/action.yml +++ b/.github/actions/setup-node/action.yml @@ -9,7 +9,7 @@ runs: using: "composite" steps: - name: Setup node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ inputs.node-version }} cache: yarn diff --git a/.github/actions/setup-xcode/action.yml b/.github/actions/setup-xcode/action.yml index c0ae6ceccea7..19e3f3e6f06e 100644 --- a/.github/actions/setup-xcode/action.yml +++ b/.github/actions/setup-xcode/action.yml @@ -4,7 +4,7 @@ inputs: xcode-version: description: 'The xcode version to use' required: false - default: '16.2.0' + default: '16.4.0' runs: using: "composite" steps: diff --git a/.github/actions/test-ios-helloworld/action.yml b/.github/actions/test-ios-helloworld/action.yml index 0a9a6939bba2..66d4ee84791b 100644 --- a/.github/actions/test-ios-helloworld/action.yml +++ b/.github/actions/test-ios-helloworld/action.yml @@ -10,12 +10,6 @@ inputs: flavor: description: The flavor of the build. Must be one of "Debug", "Release". default: Debug - hermes-version: - description: The version of hermes - required: true - react-native-version: - description: The version of react-native - required: true runs: using: composite steps: @@ -25,23 +19,18 @@ runs: uses: ./.github/actions/setup-node - name: Run yarn install uses: ./.github/actions/yarn-install - - name: Create Hermes folder - shell: bash - run: mkdir -p "$HERMES_WS_DIR" - - name: Download Hermes - uses: actions/download-artifact@v4 - with: - name: hermes-darwin-bin-${{ inputs.flavor }} - path: /tmp/hermes/hermes-runtime-darwin/ - - name: Print Downloaded hermes - shell: bash - run: ls -lR "$HERMES_WS_DIR" - name: Setup ruby uses: ruby/setup-ruby@v1 with: ruby-version: ${{ inputs.ruby-version }} + - name: Set nightly Hermes versions + shell: bash + run: | + node ./scripts/releases/use-hermes-nightly.js + - name: Run yarn install again, with the correct hermes version + uses: ./.github/actions/yarn-install - name: Download ReactNativeDependencies - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz path: /tmp/third-party @@ -49,7 +38,7 @@ runs: shell: bash run: ls -lR /tmp/third-party - name: Download React Native Prebuilds - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: ReactCore${{ inputs.flavor }}.xcframework.tar.gz path: /tmp/ReactCore @@ -66,20 +55,6 @@ runs: args+=(--frameworks dynamic) fi - # Tarball is restored with capital flavors suffix, but somehow the tarball name from JS at line 96 returns as lowercased. - # Let's ensure that the tarballs have the right names - - if [[ -f "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Debug.tar.gz" ]]; then - mv "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Debug.tar.gz" "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-debug.tar.gz" - fi - - if [[ -f "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Release.tar.gz" ]]; then - mv "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Release.tar.gz" "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-release.tar.gz" - fi - - BUILD_TYPE="${{ inputs.flavor }}" - TARBALL_FILENAME=$(node ../../packages/react-native/scripts/hermes/get-tarball-name.js --buildType "$BUILD_TYPE") - export HERMES_ENGINE_TARBALL_PATH="$HERMES_WS_DIR/hermes-runtime-darwin/$TARBALL_FILENAME" export RCT_USE_LOCAL_RN_DEP="/tmp/third-party/ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz" export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ inputs.flavor }}.xcframework.tar.gz" diff --git a/.github/actions/test-ios-rntester/action.yml b/.github/actions/test-ios-rntester/action.yml index b54e4a36c6e5..3d6d83b3b6e7 100644 --- a/.github/actions/test-ios-rntester/action.yml +++ b/.github/actions/test-ios-rntester/action.yml @@ -1,31 +1,23 @@ name: test-ios-rntester description: Test iOS RNTester inputs: - use-frameworks: - description: The dependency building and linking strategy to use. Must be one of "StaticLibraries", "DynamicFrameworks" - default: StaticLibraries ruby-version: description: The version of ruby that must be used default: 2.6.10 run-unit-tests: description: whether unit tests should run or not. - default: "false" - hermes-tarball-artifacts-dir: - description: The directory where the hermes tarball artifacts are stored - default: /tmp/hermes/hermes-runtime-darwin + default: false flavor: description: The flavor of the build. Must be one of "Debug", "Release". default: Debug - hermes-version: - description: The version of hermes - required: true - react-native-version: - description: The version of react-native - required: true run-e2e-tests: description: Whether we want to run E2E tests or not required: false default: false + use-frameworks: + description: Whether we have to build with Dynamic Frameworks. If this is set to true, it builds from source + required: false + default: false runs: using: composite @@ -36,87 +28,54 @@ runs: uses: ./.github/actions/setup-node - name: Run yarn uses: ./.github/actions/yarn-install - - name: Download Hermes - uses: actions/download-artifact@v4 - with: - name: hermes-darwin-bin-${{ inputs.flavor }} - path: ${{ inputs.hermes-tarball-artifacts-dir }} - name: Setup ruby uses: ruby/setup-ruby@v1 with: ruby-version: ${{ inputs.ruby-version }} + - name: Set nightly Hermes versions + shell: bash + run: | + node ./scripts/releases/use-hermes-nightly.js + - name: Run yarn install again, with the correct hermes version + uses: ./.github/actions/yarn-install - name: Prepare IOS Tests if: ${{ inputs.run-unit-tests == 'true' }} uses: ./.github/actions/prepare-ios-tests - - name: Set HERMES_ENGINE_TARBALL_PATH envvar if Hermes tarball is present - shell: bash - run: | - HERMES_TARBALL_ARTIFACTS_DIR=${{ inputs.hermes-tarball-artifacts-dir }} - if [ ! -d $HERMES_TARBALL_ARTIFACTS_DIR ]; then - echo "Hermes tarball artifacts dir not present ($HERMES_TARBALL_ARTIFACTS_DIR). Build Hermes from source." - exit 0 - fi - - TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "${{ inputs.flavor }}") - TARBALL_PATH=$HERMES_TARBALL_ARTIFACTS_DIR/$TARBALL_FILENAME - - echo "Looking for $TARBALL_FILENAME in $HERMES_TARBALL_ARTIFACTS_DIR" - echo "$TARBALL_PATH" - - if [ ! -f $TARBALL_PATH ]; then - echo "Hermes tarball not present ($TARBALL_PATH). Build Hermes from source." - exit 0 - fi - - echo "Found Hermes tarball at $TARBALL_PATH" - echo "HERMES_ENGINE_TARBALL_PATH=$TARBALL_PATH" >> $GITHUB_ENV - - name: Print Hermes version - shell: bash - run: | - HERMES_TARBALL_ARTIFACTS_DIR=${{ inputs.hermes-tarball-artifacts-dir }} - TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "${{ inputs.flavor }}") - TARBALL_PATH=$HERMES_TARBALL_ARTIFACTS_DIR/$TARBALL_FILENAME - if [[ -e $TARBALL_PATH ]]; then - tar -xf $TARBALL_PATH - echo 'print(HermesInternal?.getRuntimeProperties?.()["OSS Release Version"])' > test.js - chmod +x ./destroot/bin/hermes - ./destroot/bin/hermes test.js - rm test.js - rm -rf destroot - else - echo 'No Hermes tarball found.' - fi - name: Download ReactNativeDependencies - uses: actions/download-artifact@v4 + if: ${{ inputs.use-frameworks == 'false' }} + uses: actions/download-artifact@v7 with: name: ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz path: /tmp/third-party/ - name: Print third-party folder + if: ${{ inputs.use-frameworks == 'false' }} shell: bash run: ls -lR /tmp/third-party - name: Download React Native Prebuilds - uses: actions/download-artifact@v4 + if: ${{ inputs.use-frameworks == 'false' }} + uses: actions/download-artifact@v7 with: name: ReactCore${{ inputs.flavor }}.xcframework.tar.gz path: /tmp/ReactCore - name: Print ReactCore folder + if: ${{ inputs.use-frameworks == 'false' }} shell: bash run: ls -lR /tmp/ReactCore - name: Install CocoaPods dependencies shell: bash run: | - export HERMES_ENGINE_TARBALL_PATH=$HERMES_ENGINE_TARBALL_PATH - export RCT_USE_LOCAL_RN_DEP="/tmp/third-party/ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz" - export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ inputs.flavor }}.xcframework.tar.gz" - - if [[ ${{ inputs.use-frameworks }} == "DynamicFrameworks" ]]; then + if [[ ${{ inputs.use-frameworks }} == "true" ]]; then export USE_FRAMEWORKS=dynamic + else + # If use-frameworks is false, let's use prebuilds + export RCT_USE_LOCAL_RN_DEP="/tmp/third-party/ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz" + export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ inputs.flavor }}.xcframework.tar.gz" fi cd packages/rn-tester bundle install - bundle exec pod install + bundle exec pod update hermes-engine --no-repo-update - name: Build RNTester shell: bash run: | @@ -143,24 +102,23 @@ runs: shell: bash run: | echo "zipping tests results" - cd /Users/distiller/Library/Developer/Xcode - XCRESULT_PATH=$(find . -name '*.xcresult') - tar -zcvf xcresults.tar.gz $XCRESULT_PATH + cd /Users/runner/Library/Developer/Xcode + tar -zcvf xcresults.tar.gz "/tmp/RNTesterTestResults" - name: Upload artifact - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 if: ${{ inputs.run-unit-tests == 'true' }} with: - name: xcresults - path: /Users/distiller/Library/Developer/Xcode/xcresults.tar.gz + name: xcresults-${{ inputs.flavor }}-${{ inputs.use-frameworks == 'true' && 'dynamic-frameworks' || 'static-libraries' }}-Ruby${{ inputs.ruby-version }} + path: /Users/runner/Library/Developer/Xcode/xcresults.tar.gz - name: Upload RNTester App - if: ${{ inputs.use-frameworks == 'StaticLibraries' && inputs.ruby-version == '2.6.10' }} # This is needed to avoid conflicts with the artifacts - uses: actions/upload-artifact@v4.3.4 + if: ${{ inputs.use-frameworks == 'false' && inputs.ruby-version == '2.6.10' }} # This is needed to avoid conflicts with the artifacts + uses: actions/upload-artifact@v6 with: name: RNTesterApp-NewArch-${{ inputs.flavor }} path: ${{ env.app-path }} - name: Store test results if: ${{ inputs.run-unit-tests == 'true' }} - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: - name: test-results + name: test-results-${{ inputs.flavor }}-${{ inputs.use-frameworks == 'true' && 'dynamic-frameworks' || 'static-libraries' }}-Ruby${{ inputs.ruby-version }} path: ./reports/junit diff --git a/.github/actions/test-js/action.yml b/.github/actions/test-js/action.yml index 2528973d6e4a..2b5c97a009a0 100644 --- a/.github/actions/test-js/action.yml +++ b/.github/actions/test-js/action.yml @@ -19,7 +19,7 @@ runs: run: node ./scripts/run-ci-javascript-tests.js --maxWorkers 2 - name: Upload test results if: ${{ always() }} - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: test-js-results compression-level: 1 diff --git a/.github/workflow-scripts/__tests__/createDraftRelease-test.js b/.github/workflow-scripts/__tests__/createDraftRelease-test.js index 77901d4df099..b1b330acd87f 100644 --- a/.github/workflow-scripts/__tests__/createDraftRelease-test.js +++ b/.github/workflow-scripts/__tests__/createDraftRelease-test.js @@ -121,7 +121,7 @@ describe('Create Draft Release', () => { }); describe('#_computeBody', () => { - it('computes body for release', async () => { + it('computes body for release when no hermes versions are passed', async () => { const version = '0.77.1'; const changelog = `## v${version} ### Breaking Changes @@ -134,20 +134,83 @@ describe('Create Draft Release', () => { #### iOS - [PR #3436](https://github.com/facebook/react-native/pull/3436) - Some other change - [PR #3437](https://github.com/facebook/react-native/pull/3437) - Some other change`; - const body = _computeBody(version, changelog); + const body = _computeBody(changelog, version); expect(body).toEqual(`${changelog} --- Hermes dSYMS: -- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-framework-dSYM-debug.tar.gz) -- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-framework-dSYM-release.tar.gz) +- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${version}/hermes-ios-${version}-hermes-framework-dSYM-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${version}/hermes-ios-${version}-hermes-framework-dSYM-release.tar.gz) + +Hermes V1 dSYMS: +- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${version}/hermes-ios-${version}-hermes-framework-dSYM-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${version}/hermes-ios-${version}-hermes-framework-dSYM-release.tar.gz) + +ReactNativeDependencies dSYMs: +- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-release.tar.gz) + +ReactNative Core dSYMs: +- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-release.tar.gz) + +--- + +You can file issues or pick requests against this release [here](https://github.com/reactwg/react-native-releases/issues/new/choose). + +--- + +To help you upgrade to this version, you can use the [Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) ⚛️. + +--- + +View the whole changelog in the [CHANGELOG.md file](https://github.com/facebook/react-native/blob/main/CHANGELOG.md).`); + }); + + it('computes body for release when hermes versions are passed', async () => { + const version = '0.77.1'; + const hermesVersion = '0.15.0'; + const hermesV1Version = '250829098.0.2'; + const changelog = `## v${version} +### Breaking Changes +- [PR #9012](https://github.com/facebook/react-native/pull/9012) - Some other change + +#### Android +- [PR #3456](https://github.com/facebook/react-native/pull/3456) - Some other change +- [PR #3457](https://github.com/facebook/react-native/pull/3457) - Some other change + +#### iOS +- [PR #3436](https://github.com/facebook/react-native/pull/3436) - Some other change +- [PR #3437](https://github.com/facebook/react-native/pull/3437) - Some other change`; + const body = _computeBody( + changelog, + version, + hermesVersion, + hermesV1Version, + ); + + expect(body).toEqual(`${changelog} + +--- + +Hermes dSYMS: +- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesVersion}/hermes-ios-${hermesVersion}-hermes-framework-dSYM-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesVersion}/hermes-ios-${hermesVersion}-hermes-framework-dSYM-release.tar.gz) + +Hermes V1 dSYMS: +- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesV1Version}/hermes-ios-${hermesV1Version}-hermes-framework-dSYM-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesV1Version}/hermes-ios-${hermesV1Version}-hermes-framework-dSYM-release.tar.gz) ReactNativeDependencies dSYMs: - [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-debug.tar.gz) - [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-release.tar.gz) +ReactNative Core dSYMs: +- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-release.tar.gz) + --- You can file issues or pick requests against this release [here](https://github.com/reactwg/react-native-releases/issues/new/choose). @@ -188,6 +251,7 @@ View the whole changelog in the [CHANGELOG.md file](https://github.com/facebook/ status: 201, json: () => Promise.resolve({ + id: 1, html_url: 'https://github.com/facebook/react-native/releases/tag/v0.77.1', }), @@ -208,9 +272,11 @@ View the whole changelog in the [CHANGELOG.md file](https://github.com/facebook/ body: fetchBody, }, ); - expect(response).toEqual( - 'https://github.com/facebook/react-native/releases/tag/v0.77.1', - ); + expect(response).toEqual({ + id: 1, + html_url: + 'https://github.com/facebook/react-native/releases/tag/v0.77.1', + }); }); it('creates a draft release for prerelease on GitHub', async () => { @@ -238,6 +304,7 @@ View the whole changelog in the [CHANGELOG.md file](https://github.com/facebook/ status: 201, json: () => Promise.resolve({ + id: 1, html_url: 'https://github.com/facebook/react-native/releases/tag/v0.77.1', }), @@ -258,9 +325,11 @@ View the whole changelog in the [CHANGELOG.md file](https://github.com/facebook/ body: fetchBody, }, ); - expect(response).toEqual( - 'https://github.com/facebook/react-native/releases/tag/v0.77.1', - ); + expect(response).toEqual({ + id: 1, + html_url: + 'https://github.com/facebook/react-native/releases/tag/v0.77.1', + }); }); it('throws if the post failes', async () => { diff --git a/.github/workflow-scripts/analyze_scripts.sh b/.github/workflow-scripts/analyze_scripts.sh index 5f9bcfadee49..cdf280636b2b 100755 --- a/.github/workflow-scripts/analyze_scripts.sh +++ b/.github/workflow-scripts/analyze_scripts.sh @@ -16,6 +16,7 @@ if [ -x "$(command -v shellcheck)" ]; then -type f \ -not -path "*node_modules*" \ -not -path "*third-party*" \ + -not -path "*vendor*" \ -name '*.sh' \ -exec sh -c 'shellcheck "$1"' -- {} \; diff --git a/.github/workflow-scripts/createDraftRelease.js b/.github/workflow-scripts/createDraftRelease.js index f8737c3cbfda..ca9771b713c9 100644 --- a/.github/workflow-scripts/createDraftRelease.js +++ b/.github/workflow-scripts/createDraftRelease.js @@ -40,19 +40,29 @@ function _extractChangelog(version) { return changelog.slice(changelogStarts, changelogEnds).join('\n').trim(); } -function _computeBody(version, changelog) { +function _computeBody(changelog, version, hermesVersion, hermesV1Version) { + hermesVersion = hermesVersion ?? version; + hermesV1Version = hermesV1Version ?? version; return `${changelog} --- Hermes dSYMS: -- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-framework-dSYM-debug.tar.gz) -- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-framework-dSYM-release.tar.gz) +- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesVersion}/hermes-ios-${hermesVersion}-hermes-framework-dSYM-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesVersion}/hermes-ios-${hermesVersion}-hermes-framework-dSYM-release.tar.gz) + +Hermes V1 dSYMS: +- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesV1Version}/hermes-ios-${hermesV1Version}-hermes-framework-dSYM-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesV1Version}/hermes-ios-${hermesV1Version}-hermes-framework-dSYM-release.tar.gz) ReactNativeDependencies dSYMs: - [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-debug.tar.gz) - [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-release.tar.gz) +ReactNative Core dSYMs: +- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-debug.tar.gz) +- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-release.tar.gz) + --- You can file issues or pick requests against this release [here](https://github.com/reactwg/react-native-releases/issues/new/choose). @@ -101,7 +111,11 @@ async function _createDraftReleaseOnGitHub(version, body, latest, token) { } const data = await response.json(); - return data.html_url; + const {html_url, id} = data; + return { + html_url, + id, + }; } function moveToChangelogBranch(version) { @@ -109,7 +123,13 @@ function moveToChangelogBranch(version) { run(`git checkout -b changelog/v${version}`); } -async function createDraftRelease(version, latest, token) { +async function createDraftRelease( + version, + latest, + token, + hermesVersion, + hermesV1Version, +) { if (version.startsWith('v')) { version = version.substring(1); } @@ -117,14 +137,15 @@ async function createDraftRelease(version, latest, token) { _verifyTagExists(version); moveToChangelogBranch(version); const changelog = _extractChangelog(version); - const body = _computeBody(version, changelog); + const body = _computeBody(changelog, version, hermesVersion, hermesV1Version); const release = await _createDraftReleaseOnGitHub( version, body, latest, token, ); - log(`Created draft release: ${release}`); + log(`Created draft release: ${release.html_url}, ID ${release.id}`); + return release; } module.exports = { diff --git a/.github/workflow-scripts/generateChangelog.js b/.github/workflow-scripts/generateChangelog.js index fc7a9c1794de..2b01a5f8ccb8 100644 --- a/.github/workflow-scripts/generateChangelog.js +++ b/.github/workflow-scripts/generateChangelog.js @@ -45,8 +45,8 @@ function _generateChangelog(previousVersion, version, token) { run('git checkout main'); run('git fetch'); run('git pull origin main'); - const generateChangelogComand = `npx @rnx-kit/rn-changelog-generator --base v${previousVersion} --compare v${version} --repo . --changelog ./CHANGELOG.md --token ${token}`; - run(generateChangelogComand); + const generateChangelogCommand = `npx @rnx-kit/rn-changelog-generator --base v${previousVersion} --compare v${version} --repo . --changelog ./CHANGELOG.md --token ${token}`; + run(generateChangelogCommand); } function _pushCommit(version) { diff --git a/.github/workflow-scripts/hermes-v1.patch b/.github/workflow-scripts/hermes-v1.patch new file mode 100644 index 000000000000..213020381fc4 --- /dev/null +++ b/.github/workflow-scripts/hermes-v1.patch @@ -0,0 +1,30 @@ +diff --git a/android/settings.gradle b/android/settings.gradle +index 63b5d4e..6359ec3 100644 +--- a/android/settings.gradle ++++ b/android/settings.gradle +@@ -4,3 +4,11 @@ extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autoli + rootProject.name = 'RNApp' + include ':app' + includeBuild('../node_modules/@react-native/gradle-plugin') ++ ++includeBuild('../node_modules/react-native') { ++ dependencySubstitution { ++ substitute(module("com.facebook.react:react-android")).using(project(":packages:react-native:ReactAndroid")) ++ substitute(module("com.facebook.react:react-native")).using(project(":packages:react-native:ReactAndroid")) ++ substitute(project(":packages:react-native:ReactAndroid:hermes-engine")).using(module("com.facebook.hermes:hermes-android:$HERMES_V1_VERSION")) ++ } ++} +diff --git a/package.json b/package.json +index f05d51b..69938af 100644 +--- a/package.json ++++ b/package.json +@@ -35,6 +35,9 @@ + "react-test-renderer": "19.2.0", + "typescript": "^5.8.3" + }, ++ "resolutions": { ++ "hermes-compiler": "$HERMES_V1_VERSION" ++ }, + "engines": { + "node": ">=20" + } diff --git a/.github/workflow-scripts/maestro-ios.js b/.github/workflow-scripts/maestro-ios.js index ca9b546cd17b..bad5f8a35248 100644 --- a/.github/workflow-scripts/maestro-ios.js +++ b/.github/workflow-scripts/maestro-ios.js @@ -162,7 +162,7 @@ async function main() { console.info(`WORKING_DIRECTORY: ${WORKING_DIRECTORY}`); console.info('==============================\n'); - const simulatorName = 'iPhone 15 Pro'; + const simulatorName = 'iPhone 16 Pro'; launchSimulator(simulatorName); installAppOnSimulator(APP_PATH); const udid = extractSimulatorUDID(); diff --git a/.github/workflow-scripts/selectLatestHermesV1Version.js b/.github/workflow-scripts/selectLatestHermesV1Version.js new file mode 100644 index 000000000000..db11b9278c1b --- /dev/null +++ b/.github/workflow-scripts/selectLatestHermesV1Version.js @@ -0,0 +1,38 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const { execSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +const PATCH_FILE_PATH = path.join(__dirname, 'hermes-v1.patch'); + +function getLatestHermesV1Version() { + const npmString = "npm view hermes-compiler@latest-v1 version"; + + try { + const result = execSync(npmString, { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim(); + return result; + } catch (error) { + throw new Error(`Failed to get package version for hermes-compiler@latest-v1`); + } +} + +function setHermesV1VersionInPatch(version) { + if (!fs.existsSync(PATCH_FILE_PATH)) { + throw new Error(`Patch file not found at path: ${PATCH_FILE_PATH}`); + } + + let patchContent = fs.readFileSync(PATCH_FILE_PATH, 'utf8'); + const updatedContent = patchContent.replaceAll( + "$HERMES_V1_VERSION", + version + ); + fs.writeFileSync(PATCH_FILE_PATH, updatedContent, 'utf8'); +} + +setHermesV1VersionInPatch(getLatestHermesV1Version()); diff --git a/.github/workflows/autorebase.yml b/.github/workflows/autorebase.yml index 447e7dc5ece5..aee759bf78b0 100644 --- a/.github/workflows/autorebase.yml +++ b/.github/workflows/autorebase.yml @@ -17,7 +17,7 @@ jobs: if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') steps: - name: Checkout the latest code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 # otherwise, you will fail to push refs to dest repo diff --git a/.github/workflows/bump-podfile-lock.yml b/.github/workflows/bump-podfile-lock.yml index 80b726edfd53..81468f3cca7f 100644 --- a/.github/workflows/bump-podfile-lock.yml +++ b/.github/workflows/bump-podfile-lock.yml @@ -8,8 +8,9 @@ jobs: runs-on: macos-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: + token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} fetch-depth: 0 fetch-tags: true - name: Install dependencies @@ -20,8 +21,6 @@ jobs: git config --local user.name "React Native Bot" - name: Setup xcode uses: ./.github/actions/setup-xcode - with: - xcode-version: '16.2.0' - name: Extract branch name run: | TAG="${{ github.ref_name }}"; diff --git a/.github/workflows/cache-reaper.yml b/.github/workflows/cache-reaper.yml index 91ebb083e024..59feda574c19 100644 --- a/.github/workflows/cache-reaper.yml +++ b/.github/workflows/cache-reaper.yml @@ -13,7 +13,7 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Node.js uses: ./.github/actions/setup-node - name: Trim the cache diff --git a/.github/workflows/check-for-reproducer.yml b/.github/workflows/check-for-reproducer.yml index 5d124c32787a..e986259a3a23 100644 --- a/.github/workflows/check-for-reproducer.yml +++ b/.github/workflows/check-for-reproducer.yml @@ -10,8 +10,8 @@ jobs: if: | github.repository == 'facebook/react-native' && github.event.issue.pull_request == null && github.event.issue.state == 'open' && !contains(github.event.issue.labels.*.name, ':open_umbrella: Umbrella') steps: - - uses: actions/checkout@v4 - - uses: actions/github-script@v6 + - uses: actions/checkout@v6 + - uses: actions/github-script@v8 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | diff --git a/.github/workflows/close-pr.yml b/.github/workflows/close-pr.yml index 2b3d773fa993..5d0489f170b7 100644 --- a/.github/workflows/close-pr.yml +++ b/.github/workflows/close-pr.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' steps: - - uses: actions/github-script@v6 + - uses: actions/github-script@v8 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | diff --git a/.github/workflows/create-draft-release.yml b/.github/workflows/create-draft-release.yml index d3b89dba90d8..ca947dc267c1 100644 --- a/.github/workflows/create-draft-release.yml +++ b/.github/workflows/create-draft-release.yml @@ -2,14 +2,24 @@ name: Create Draft Release on: workflow_call: + inputs: + hermesVersion: + required: false + type: string + description: The version of Hermes to use for this release (eg. 0.15.0). If not specified, it will use React Native Version + hermesV1Version: + required: false + type: string + description: The version of Hermes V1 to use for this release (eg. 250829098.0.2). If not specified, it will use React Native Version jobs: create-draft-release: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: + token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} fetch-depth: 0 fetch-tags: true - name: Install dependencies @@ -20,10 +30,25 @@ jobs: git config --local user.email "bot@reactnative.dev" git config --local user.name "React Native Bot" - name: Create draft release - uses: actions/github-script@v6 + uses: actions/github-script@v8 + id: create-draft-release with: script: | const {createDraftRelease} = require('./.github/workflow-scripts/createDraftRelease.js'); const version = '${{ github.ref_name }}'; const {isLatest} = require('./.github/workflow-scripts/publishTemplate.js'); - await createDraftRelease(version, isLatest(), '${{secrets.REACT_NATIVE_BOT_GITHUB_TOKEN}}'); + return (await createDraftRelease(version, isLatest(), '${{secrets.REACT_NATIVE_BOT_GITHUB_TOKEN}}', '${{ inputs.hermesVersion }}', '${{ inputs.hermesV1Version }}')).id; + result-encoding: string + - name: Upload release assets for DotSlash + uses: actions/github-script@v8 + env: + RELEASE_ID: ${{ steps.create-draft-release.outputs.result }} + with: + script: | + const {uploadReleaseAssetsForDotSlashFiles} = require('./scripts/releases/upload-release-assets-for-dotslash.js'); + const version = '${{ github.ref_name }}'; + await uploadReleaseAssetsForDotSlashFiles({ + version, + token: '${{secrets.REACT_NATIVE_BOT_GITHUB_TOKEN}}', + releaseId: process.env.RELEASE_ID, + }); diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index ae5800f81ee2..464e9eb3f86c 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -19,10 +19,11 @@ on: jobs: create_release: + if: github.repository == 'facebook/react-native' runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} fetch-depth: 0 diff --git a/.github/workflows/danger-pr.yml b/.github/workflows/danger-pr.yml index cf28b788105a..ce41f6f602cd 100644 --- a/.github/workflows/danger-pr.yml +++ b/.github/workflows/danger-pr.yml @@ -17,13 +17,14 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' steps: - - uses: actions/checkout@v4 + - name: Check out PR branch + uses: actions/checkout@v6 - name: Setup Node.js uses: ./.github/actions/setup-node - name: Run yarn install uses: ./.github/actions/yarn-install - - name: Run diff-js-api-breaking-changes - uses: ./.github/actions/diff-js-api-breaking-changes + - name: Run diff-js-api-changes + uses: ./.github/actions/diff-js-api-changes - name: Danger run: yarn danger ci --use-github-checks --failOnErrors working-directory: private/react-native-bots diff --git a/.github/workflows/generate-changelog.yml b/.github/workflows/generate-changelog.yml index 9734ebd64173..ff8ee8d76def 100644 --- a/.github/workflows/generate-changelog.yml +++ b/.github/workflows/generate-changelog.yml @@ -8,8 +8,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: + token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} fetch-depth: 0 fetch-tags: true - name: Install dependencies @@ -20,7 +21,7 @@ jobs: git config --local user.email "bot@reactnative.dev" git config --local user.name "React Native Bot" - name: Generate Changelog - uses: actions/github-script@v6 + uses: actions/github-script@v8 with: script: | const {generateChangelog} = require('./.github/workflow-scripts/generateChangelog'); diff --git a/.github/workflows/monitor-new-issues.yml b/.github/workflows/monitor-new-issues.yml index 4c751b097965..36abe0bb4cfa 100644 --- a/.github/workflows/monitor-new-issues.yml +++ b/.github/workflows/monitor-new-issues.yml @@ -15,7 +15,7 @@ jobs: if: github.repository == 'facebook/react-native' steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Node.js uses: ./.github/actions/setup-node - name: Install dependencies diff --git a/.github/workflows/needs-attention.yml b/.github/workflows/needs-attention.yml index 4d7a0cf8f02f..485bbef9bf5d 100644 --- a/.github/workflows/needs-attention.yml +++ b/.github/workflows/needs-attention.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Apply Needs Attention Label uses: react-native-community/needs-attention@v2.0.0 with: diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 24177338f955..420439705e14 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -21,130 +21,22 @@ jobs: echo "Setting release type to nightly" echo "RELEASE_TYPE=nightly" >> $GITHUB_OUTPUT - prepare_hermes_workspace: - runs-on: ubuntu-latest - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_VERSION_FILE: packages/react-native/sdks/.hermesversion - outputs: - react-native-version: ${{ steps.prepare-hermes-workspace.outputs.react-native-version }} - hermes-version: ${{ steps.prepare-hermes-workspace.outputs.hermes-version }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Prepare Hermes Workspace - id: prepare-hermes-workspace - uses: ./.github/actions/prepare-hermes-workspace - with: - hermes-ws-dir: ${{ env.HERMES_WS_DIR }} - hermes-version-file: ${{ env.HERMES_VERSION_FILE }} - - build_hermesc_apple: - runs-on: macos-14 - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: /tmp/hermes - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Apple - uses: ./.github/actions/build-hermesc-apple - with: - hermes-version: ${{ needs.prepare_hermes_workspace.output.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.output.react-native-version }} - - build_apple_slices_hermes: - runs-on: macos-14 - needs: [build_hermesc_apple, prepare_hermes_workspace] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - HERMES_OSXBIN_ARTIFACTS_DIR: /tmp/hermes/osx-bin - IOS_DEPLOYMENT_TARGET: "15.1" - XROS_DEPLOYMENT_TARGET: "1.0" - MAC_DEPLOYMENT_TARGET: "10.15" - strategy: - fail-fast: false - matrix: - flavor: [Debug, Release] - slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build Slice - uses: ./.github/actions/build-apple-slices-hermes - with: - flavor: ${{ matrix.flavor }} - slice: ${{ matrix.slice}} - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - - build_hermes_macos: - runs-on: macos-14 - needs: [build_apple_slices_hermes, prepare_hermes_workspace] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - continue-on-error: true - strategy: - fail-fast: false - matrix: - flavor: [Debug, Release] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build Hermes MacOS - uses: ./.github/actions/build-hermes-macos - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - flavor: ${{ matrix.flavor }} - prebuild_apple_dependencies: + if: github.repository == 'facebook/react-native' uses: ./.github/workflows/prebuild-ios-dependencies.yml secrets: inherit prebuild_react_native_core: uses: ./.github/workflows/prebuild-ios-core.yml + with: + use-hermes-nightly: true + version-type: nightly secrets: inherit - needs: [prebuild_apple_dependencies, build_hermes_macos] - - build_hermesc_linux: - runs-on: ubuntu-latest - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Linux - uses: ./.github/actions/build-hermesc-linux - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - - build_hermesc_windows: - runs-on: windows-2025 - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: 'C:\tmp\hermes' - HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin' - HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin' - ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip" - MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin' - CMAKE_DIR: 'C:\Program Files\CMake\bin' - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Windows - uses: ./.github/actions/build-hermesc-windows - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} + needs: [prebuild_apple_dependencies] build_android: runs-on: 8-core-ubuntu + if: github.repository == 'facebook/react-native' needs: [set_release_type] container: image: reactnativecommunity/react-native-android:latest @@ -157,7 +49,7 @@ jobs: ORG_GRADLE_PROJECT_SONATYPE_PASSWORD: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPE_PASSWORD }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Build Android uses: ./.github/actions/build-android with: @@ -169,10 +61,6 @@ jobs: needs: [ set_release_type, - prepare_hermes_workspace, - build_hermes_macos, - build_hermesc_linux, - build_hermesc_windows, build_android, prebuild_apple_dependencies, prebuild_react_native_core, @@ -185,7 +73,6 @@ jobs: # By default we only build ARM64 to save time/resources. For release/nightlies, we override this value to build all archs. ORG_GRADLE_PROJECT_reactNativeArchitectures: "arm64-v8a" env: - HERMES_WS_DIR: /tmp/hermes GHA_NPM_TOKEN: ${{ secrets.GHA_NPM_TOKEN }} ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }} ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY }} @@ -193,11 +80,10 @@ jobs: ORG_GRADLE_PROJECT_SONATYPE_PASSWORD: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPE_PASSWORD }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Build and Publish NPM Package uses: ./.github/actions/build-npm-package with: - hermes-ws-dir: ${{ env.HERMES_WS_DIR }} release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }} gha-npm-token: ${{ env.GHA_NPM_TOKEN }} gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} diff --git a/.github/workflows/on-issue-labeled.yml b/.github/workflows/on-issue-labeled.yml index a58009873312..7500d9ce3d3b 100644 --- a/.github/workflows/on-issue-labeled.yml +++ b/.github/workflows/on-issue-labeled.yml @@ -16,10 +16,10 @@ jobs: if: "${{ github.repository == 'facebook/react-native' && contains(github.event.label.name, 'Needs: Triage :mag:') }}" steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Verify RN version - uses: actions/github-script@v6 + uses: actions/github-script@v8 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | @@ -39,7 +39,7 @@ jobs: } - name: Add descriptive label - uses: actions/github-script@v6 + uses: actions/github-script@v8 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | @@ -51,8 +51,8 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' steps: - - uses: actions/checkout@v4 - - uses: actions/github-script@v6 + - uses: actions/checkout@v6 + - uses: actions/github-script@v8 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | diff --git a/.github/workflows/prebuild-ios-core.yml b/.github/workflows/prebuild-ios-core.yml index b2d05c5e88fe..ce2f6b88c30b 100644 --- a/.github/workflows/prebuild-ios-core.yml +++ b/.github/workflows/prebuild-ios-core.yml @@ -1,12 +1,22 @@ -name: Prebuild iOS Dependencies +name: Prebuild iOS Core on: workflow_call: # this directive allow us to call this workflow from other workflows - + inputs: + version-type: + description: 'The version type to set for the prebuild (nightly or release)' + type: string + required: false + default: '' + use-hermes-nightly: + description: 'Whether to use the hermes nightly build or read the version from the versions.properties file' + type: boolean + required: false + default: false jobs: build-rn-slice: - runs-on: macos-14 + runs-on: macos-15 strategy: fail-fast: false matrix: @@ -18,10 +28,10 @@ jobs: ] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Restore cache if present id: restore-ios-slice - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v5 with: key: v3-ios-core-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashFiles('packages/react-native/Package.swift', 'packages/react-native/scripts/ios-prebuild/*.js', 'packages/react-native/scripts/ios-prebuild.js', 'packages/react-native/React/**/*', 'packages/react-native/ReactCommon/**/*', 'packages/react-native/Libraries/**/*') }} path: packages/react-native/ @@ -31,42 +41,29 @@ jobs: - name: Setup xcode if: steps.restore-ios-slice.outputs.cache-hit != 'true' uses: ./.github/actions/setup-xcode - with: - xcode-version: '16.2.0' - name: Yarn Install if: steps.restore-ios-slice.outputs.cache-hit != 'true' uses: ./.github/actions/yarn-install - - name: Download Hermes - if: steps.restore-ios-slice.outputs.cache-hit != 'true' - uses: actions/download-artifact@v4 - with: - name: hermes-darwin-bin-${{ matrix.flavor }} - path: /tmp/hermes/hermes-runtime-darwin - - name: Extract Hermes - if: steps.restore-ios-slice.outputs.cache-hit != 'true' + - name: Set Hermes version shell: bash run: | - HERMES_TARBALL_ARTIFACTS_DIR=/tmp/hermes/hermes-runtime-darwin - if [ ! -d $HERMES_TARBALL_ARTIFACTS_DIR ]; then - echo "Hermes tarball artifacts dir not present ($HERMES_TARBALL_ARTIFACTS_DIR)." - exit 0 + if [ "${{ inputs.use-hermes-nightly }}" == "true" ]; then + # We are not publishing nightly versions of Hermes V1 yet. + # For now, we can use the latest version of Hermes V1 published on maven and npm. + HERMES_VERSION="latest-v1" + else + HERMES_VERSION=$(sed -n 's/^HERMES_V1_VERSION_NAME=//p' packages/react-native/sdks/hermes-engine/version.properties) fi - - TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "${{ matrix.flavor }}") - TARBALL_PATH=$HERMES_TARBALL_ARTIFACTS_DIR/$TARBALL_FILENAME - - echo "Looking for $TARBALL_FILENAME in $HERMES_TARBALL_ARTIFACTS_DIR" - echo "$TARBALL_PATH" - - if [ ! -f $TARBALL_PATH ]; then - echo "Hermes tarball not present ($TARBALL_PATH). Build Hermes from source." - exit 0 + echo "Using Hermes version: $HERMES_VERSION" + echo "HERMES_VERSION=$HERMES_VERSION" >> $GITHUB_ENV + - name: Set React Native version + shell: bash + run: | + if [ "${{ inputs.version-type }}" != "" ]; then + node ./scripts/releases/set-rn-artifacts-version.js --build-type "${{ inputs.version-type }}" fi - - echo "Found Hermes tarball at $TARBALL_PATH" - echo "HERMES_ENGINE_TARBALL_PATH=$TARBALL_PATH" >> $GITHUB_ENV - name: Download ReactNativeDependencies - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz path: /tmp/third-party/ @@ -102,19 +99,19 @@ jobs: cd packages/react-native node scripts/ios-prebuild -b -f "${{ matrix.flavor }}" -p "${{ matrix.slice }}" - name: Upload headers - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: prebuild-ios-core-headers-${{ matrix.flavor }}-${{ matrix.slice }} path: packages/react-native/.build/headers - name: Upload artifacts - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: prebuild-ios-core-slice-${{ matrix.flavor }}-${{ matrix.slice }} path: | packages/react-native/.build/output/spm/${{ matrix.flavor }}/Build/Products - name: Save Cache - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode with: key: v3-ios-core-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashFiles('packages/react-native/Package.swift', 'packages/react-native/scripts/ios-prebuild/*.js', 'packages/react-native/scripts/ios-prebuild.js', 'packages/react-native/React/**/*', 'packages/react-native/ReactCommon/**/*', 'packages/react-native/Libraries/**/*') }} @@ -123,7 +120,7 @@ jobs: packages/react-native/.build/headers compose-xcframework: - runs-on: macos-14 + runs-on: macos-15 needs: [build-rn-slice] strategy: fail-fast: false @@ -134,10 +131,10 @@ jobs: REACT_ORG_CODE_SIGNING_P12_CERT_PWD: ${{ secrets.REACT_ORG_CODE_SIGNING_P12_CERT_PWD }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Restore cache if present id: restore-ios-xcframework - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v5 with: path: packages/react-native/.build/output/xcframeworks key: v2-ios-core-xcframework-${{ matrix.flavor }}-${{ hashFiles('packages/react-native/Package.swift', 'packages/react-native/scripts/ios-prebuild/*.js', 'packages/react-native/scripts/ios-prebuild.js', 'packages/react-native/React/**/*', 'packages/react-native/ReactCommon/**/*', 'packages/react-native/Libraries/**/*') }} @@ -147,21 +144,19 @@ jobs: - name: Setup xcode if: steps.restore-ios-xcframework.outputs.cache-hit != 'true' uses: ./.github/actions/setup-xcode - with: - xcode-version: '16.2.0' - name: Yarn Install if: steps.restore-ios-xcframework.outputs.cache-hit != 'true' uses: ./.github/actions/yarn-install - name: Download slice artifacts if: steps.restore-ios-xcframework.outputs.cache-hit != 'true' - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: prebuild-ios-core-slice-${{ matrix.flavor }}-* path: packages/react-native/.build/output/spm/${{ matrix.flavor }}/Build/Products merge-multiple: true - name: Download headers if: steps.restore-ios-xcframework.outputs.cache-hit != 'true' - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: prebuild-ios-core-headers-${{ matrix.flavor }}-* path: packages/react-native/.build/headers @@ -193,18 +188,18 @@ jobs: cd packages/react-native/.build/output/xcframeworks/${{matrix.flavor}}/Symbols tar -cz -f ../../ReactCore${{ matrix.flavor }}.framework.dSYM.tar.gz . - name: Upload XCFramework Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ReactCore${{ matrix.flavor }}.xcframework.tar.gz path: packages/react-native/.build/output/xcframeworks/ReactCore${{matrix.flavor}}.xcframework.tar.gz - name: Upload dSYM Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ReactCore${{ matrix.flavor }}.framework.dSYM.tar.gz path: packages/react-native/.build/output/xcframeworks/ReactCore${{matrix.flavor}}.framework.dSYM.tar.gz - name: Save cache if present if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 with: path: | packages/react-native/.build/output/xcframeworks/ReactCore${{matrix.flavor}}.xcframework.tar.gz diff --git a/.github/workflows/prebuild-ios-dependencies.yml b/.github/workflows/prebuild-ios-dependencies.yml index 3ae438892382..73cf9870c66c 100644 --- a/.github/workflows/prebuild-ios-dependencies.yml +++ b/.github/workflows/prebuild-ios-dependencies.yml @@ -7,18 +7,18 @@ on: jobs: prepare_workspace: name: Prepare workspace - runs-on: macos-14 + runs-on: macos-15 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup node.js uses: ./.github/actions/setup-node - name: Restore cache if present id: restore-ios-prebuilds - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v5 with: path: packages/react-native/third-party/ - key: v2-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + key: v3-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} enableCrossOsArchive: true - name: Yarn Install if: steps.restore-ios-prebuilds.outputs.cache-hit != 'true' @@ -32,21 +32,21 @@ jobs: run: | node scripts/releases/prepare-ios-prebuilds.js -w - name: Upload Artifacts - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: ios-prebuilds-workspace path: packages/react-native/third-party/ - name: Save Cache - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode with: - key: v2-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + key: v3-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} enableCrossOsArchive: true path: packages/react-native/third-party/ build-apple-slices: name: Build Apple Slice - runs-on: macos-14 + runs-on: macos-15 needs: [prepare_workspace] strategy: fail-fast: false @@ -62,59 +62,51 @@ jobs: 'xros-simulator'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup node.js uses: ./.github/actions/setup-node - - name: Setup xcode - uses: ./.github/actions/setup-xcode - with: - xcode-version: '16.1' - name: Restore slice folder id: restore-slice-folder - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v5 with: path: packages/react-native/third-party/.build/Build/Products - key: v2-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + key: v3-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + - name: Setup xcode + if: steps.restore-slice-folder.outputs.cache-hit != 'true' + uses: ./.github/actions/setup-xcode - name: Yarn Install if: steps.restore-slice-folder.outputs.cache-hit != 'true' uses: ./.github/actions/yarn-install - name: Restore workspace if: steps.restore-slice-folder.outputs.cache-hit != 'true' - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: ios-prebuilds-workspace path: packages/react-native/third-party/ - name: Print third-party folder structure + if: steps.restore-slice-folder.outputs.cache-hit != 'true' run: ls -lR packages/react-native/third-party - - name: Install VisionOS - if: ${{ steps.restore-slice-folder.outputs.cache-hit != 'true' && (matrix.slice == 'xros' || matrix.slice == 'xros-simulator') }} - run: | - # https://github.com/actions/runner-images/issues/10559 - sudo xcodebuild -runFirstLaunch - sudo xcrun simctl list - sudo xcodebuild -downloadPlatform visionOS - sudo xcodebuild -runFirstLaunch - name: Build slice ${{ matrix.slice }} for ${{ matrix.flavor }} if: steps.restore-slice-folder.outputs.cache-hit != 'true' run: node scripts/releases/prepare-ios-prebuilds.js -b -p ${{ matrix.slice }} -r ${{ matrix.flavor }} - name: Upload Artifacts - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: prebuild-slice-${{ matrix.flavor }}-${{ matrix.slice }} path: | packages/react-native/third-party/.build/Build/Products - name: Save Cache - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode with: - key: v2-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + key: v3-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} enableCrossOsArchive: true path: | packages/react-native/third-party/.build/Build/Products create-xcframework: name: Prepare XCFramework - runs-on: macos-14 + runs-on: macos-15 needs: [build-apple-slices] strategy: fail-fast: false @@ -125,33 +117,31 @@ jobs: REACT_ORG_CODE_SIGNING_P12_CERT_PWD: ${{ secrets.REACT_ORG_CODE_SIGNING_P12_CERT_PWD }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup node.js uses: ./.github/actions/setup-node - name: Setup xcode uses: ./.github/actions/setup-xcode - with: - xcode-version: '16.1' - name: Restore XCFramework id: restore-xcframework - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v5 with: path: | packages/react-native/third-party/ - key: v2-ios-dependencies-xcframework-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + key: v3-ios-dependencies-xcframework-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} # If cache hit, we already have our binary. We don't need to do anything. - name: Yarn Install if: steps.restore-xcframework.outputs.cache-hit != 'true' uses: ./.github/actions/yarn-install - name: Restore workspace if: steps.restore-xcframework.outputs.cache-hit != 'true' - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: ios-prebuilds-workspace path: packages/react-native/third-party/ - name: Download slices if: steps.restore-xcframework.outputs.cache-hit != 'true' - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: pattern: prebuild-slice-${{ matrix.flavor }}-* path: packages/react-native/third-party/.build/Build/Products @@ -179,24 +169,25 @@ jobs: - name: Compress and Rename dSYM if: steps.restore-xcframework.outputs.cache-hit != 'true' run: | - tar -cz -f packages/react-native/third-party/Symbols/ReactNativeDependencies${{ matrix.flavor }}.framework.dSYM.tar.gz \ - packages/react-native/third-party/Symbols/ReactNativeDependencies.framework.dSYM + cd packages/react-native/third-party/Symbols/ + tar -cz -f ../ReactNativeDependencies${{ matrix.flavor }}.framework.dSYM.tar.gz . + mv ../ReactNativeDependencies${{ matrix.flavor }}.framework.dSYM.tar.gz ./ReactNativeDependencies${{ matrix.flavor }}.framework.dSYM.tar.gz - name: Upload XCFramework Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz path: packages/react-native/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz - name: Upload dSYM Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ReactNativeDependencies${{ matrix.flavor }}.framework.dSYM.tar.gz path: | packages/react-native/third-party/Symbols/ReactNativeDependencies${{ matrix.flavor }}.framework.dSYM.tar.gz - name: Save XCFramework in Cache if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 with: path: | packages/react-native/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz packages/react-native/third-party/ReactNativeDependencies${{ matrix.flavor }}.framework.dSYM.tar.gz - key: v2-ios-dependencies-xcframework-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + key: v3-ios-dependencies-xcframework-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} diff --git a/.github/workflows/publish-bumped-packages.yml b/.github/workflows/publish-bumped-packages.yml index f47ddd9fc034..cf0b69b8c354 100644 --- a/.github/workflows/publish-bumped-packages.yml +++ b/.github/workflows/publish-bumped-packages.yml @@ -9,11 +9,12 @@ on: jobs: publish_bumped_packages: runs-on: ubuntu-latest + if: github.repository == 'facebook/react-native' env: GHA_NPM_TOKEN: ${{ secrets.GHA_NPM_TOKEN }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup node.js uses: ./.github/actions/setup-node - name: Run Yarn Install diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 8f356720f0b9..99e3b94fc9b4 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -19,136 +19,43 @@ jobs: echo "Setting release type to release" echo "RELEASE_TYPE=release" >> $GITHUB_OUTPUT - prepare_hermes_workspace: + set_hermes_versions: runs-on: ubuntu-latest - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_VERSION_FILE: packages/react-native/sdks/.hermesversion + if: github.repository == 'facebook/react-native' outputs: - react-native-version: ${{ steps.prepare-hermes-workspace.outputs.react-native-version }} - hermes-version: ${{ steps.prepare-hermes-workspace.outputs.hermes-version }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Prepare Hermes Workspace - id: prepare-hermes-workspace - uses: ./.github/actions/prepare-hermes-workspace - with: - hermes-ws-dir: ${{ env.HERMES_WS_DIR }} - hermes-version-file: ${{ env.HERMES_VERSION_FILE }} - - build_hermesc_apple: - runs-on: macos-14 - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: /tmp/hermes + HERMES_VERSION: ${{ steps.set_hermes_versions.outputs.HERMES_VERSION }} + HERMES_V1_VERSION: ${{ steps.set_hermes_versions.outputs.HERMES_V1_VERSION }} steps: - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Apple - uses: ./.github/actions/build-hermesc-apple - with: - hermes-version: ${{ needs.prepare_hermes_workspace.output.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.output.react-native-version }} - build_apple_slices_hermes: - runs-on: macos-14 - needs: [build_hermesc_apple, prepare_hermes_workspace] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - HERMES_OSXBIN_ARTIFACTS_DIR: /tmp/hermes/osx-bin - IOS_DEPLOYMENT_TARGET: "15.1" - XROS_DEPLOYMENT_TARGET: "1.0" - MAC_DEPLOYMENT_TARGET: "10.15" - strategy: - fail-fast: false - matrix: - flavor: [Debug, Release] - slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build Slice - uses: ./.github/actions/build-apple-slices-hermes - with: - flavor: ${{ matrix.flavor }} - slice: ${{ matrix.slice}} - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} + uses: actions/checkout@v6 + - id: set_hermes_versions + run: | + echo "Setting hermes versions to latest" + hermes_version=$(grep -oE 'HERMES_VERSION_NAME=([0-9]+\.[0-9]+\.[0-9]+)' packages/react-native/sdks/hermes-engine/version.properties | cut -d'=' -f2) + hermes_v1_version=$(grep -oE 'HERMES_V1_VERSION_NAME=([0-9]+\.[0-9]+\.[0-9]+)' packages/react-native/sdks/hermes-engine/version.properties | cut -d'=' -f2) - build_hermes_macos: - runs-on: macos-14 - needs: [build_apple_slices_hermes, prepare_hermes_workspace] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - continue-on-error: true - strategy: - fail-fast: false - matrix: - flavor: [Debug, Release] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build Hermes MacOS - uses: ./.github/actions/build-hermes-macos - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - flavor: ${{ matrix.flavor }} + echo "HERMES_VERSION=$hermes_version" >> $GITHUB_OUTPUT + echo "HERMES_V1_VERSION=$hermes_v1_version" >> $GITHUB_OUTPUT + - name: Print hermes versions + run: | + echo "HERMES_VERSION=${{ steps.set_hermes_versions.outputs.HERMES_VERSION }}" + echo "HERMES_V1_VERSION=${{ steps.set_hermes_versions.outputs.HERMES_V1_VERSION }}" prebuild_apple_dependencies: + if: github.repository == 'facebook/react-native' uses: ./.github/workflows/prebuild-ios-dependencies.yml secrets: inherit prebuild_react_native_core: uses: ./.github/workflows/prebuild-ios-core.yml secrets: inherit - needs: [prebuild_apple_dependencies, build_hermes_macos] - - build_hermesc_linux: - runs-on: ubuntu-latest - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Linux - uses: ./.github/actions/build-hermesc-linux - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - - build_hermesc_windows: - runs-on: windows-2025 - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: 'C:\tmp\hermes' - HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin' - HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin' - ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip" - MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin' - CMAKE_DIR: 'C:\Program Files\CMake\bin' - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Windows - uses: ./.github/actions/build-hermesc-windows - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} + needs: [prebuild_apple_dependencies] build_npm_package: runs-on: 8-core-ubuntu needs: [ set_release_type, - prepare_hermes_workspace, - build_hermes_macos, - build_hermesc_linux, - build_hermesc_windows, prebuild_apple_dependencies, prebuild_react_native_core, ] @@ -160,7 +67,6 @@ jobs: # By default we only build ARM64 to save time/resources. For release/nightlies, we override this value to build all archs. ORG_GRADLE_PROJECT_reactNativeArchitectures: "arm64-v8a" env: - HERMES_WS_DIR: /tmp/hermes GHA_NPM_TOKEN: ${{ secrets.GHA_NPM_TOKEN }} ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }} ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY }} @@ -169,20 +75,19 @@ jobs: REACT_NATIVE_BOT_GITHUB_TOKEN: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 fetch-tags: true - name: Build and Publish NPM Package uses: ./.github/actions/build-npm-package with: - hermes-ws-dir: ${{ env.HERMES_WS_DIR }} release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }} gha-npm-token: ${{ env.GHA_NPM_TOKEN }} gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} - name: Publish @react-native-community/template id: publish-template-to-npm - uses: actions/github-script@v6 + uses: actions/github-script@v8 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | @@ -192,7 +97,7 @@ jobs: await publishTemplate(github, version, isDryRun); - name: Wait for template to be published timeout-minutes: 3 - uses: actions/github-script@v6 + uses: actions/github-script@v8 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | @@ -207,7 +112,7 @@ jobs: -d "{\"event_type\": \"publish\", \"client_payload\": { \"version\": \"${{ github.ref_name }}\" }}" - name: Verify Release is on NPM timeout-minutes: 3 - uses: actions/github-script@v6 + uses: actions/github-script@v8 with: github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} script: | @@ -216,7 +121,7 @@ jobs: const version = "${{ github.ref_name }}"; await verifyReleaseOnNpm(version, isLatest()); - name: Verify that artifacts are on Maven - uses: actions/github-script@v6 + uses: actions/github-script@v8 with: script: | const {verifyArtifactsAreOnMaven} = require('./.github/workflow-scripts/verifyArtifactsAreOnMaven.js'); @@ -234,6 +139,9 @@ jobs: secrets: inherit create_draft_release: - needs: generate_changelog + needs: [generate_changelog, set_hermes_versions] uses: ./.github/workflows/create-draft-release.yml secrets: inherit + with: + hermesVersion: ${{ needs.set_hermes_versions.outputs.HERMES_VERSION }} + hermesV1Version: ${{ needs.set_hermes_versions.outputs.HERMES_V1_VERSION }} diff --git a/.github/workflows/retry-workflow.yml b/.github/workflows/retry-workflow.yml index aef1766b3613..d943d657d825 100644 --- a/.github/workflows/retry-workflow.yml +++ b/.github/workflows/retry-workflow.yml @@ -9,6 +9,7 @@ on: jobs: rerun: runs-on: ubuntu-latest + if: github.repository == 'facebook/react-native' steps: - name: rerun ${{ inputs.run_id }} env: diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index 585ea9a9e743..f4c2fa8d353f 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: repo-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} days-before-stale: 180 @@ -27,7 +27,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: ascending: true repo-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} @@ -45,7 +45,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: repo-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} any-of-labels: 'Needs: Author Feedback' @@ -63,7 +63,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: ascending: true repo-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index e4f00621dee9..5a59c493f41e 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -11,6 +11,7 @@ on: jobs: set_release_type: runs-on: ubuntu-latest + if: github.repository == 'facebook/react-native' outputs: RELEASE_TYPE: ${{ steps.set_release_type.outputs.RELEASE_TYPE }} env: @@ -32,154 +33,81 @@ jobs: echo "Should I run E2E tests? ${{ inputs.run-e2e-tests }}" - prepare_hermes_workspace: - runs-on: ubuntu-latest - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_VERSION_FILE: packages/react-native/sdks/.hermesversion - outputs: - react-native-version: ${{ steps.prepare-hermes-workspace.outputs.react-native-version }} - hermes-version: ${{ steps.prepare-hermes-workspace.outputs.hermes-version }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Prepare Hermes Workspace - id: prepare-hermes-workspace - uses: ./.github/actions/prepare-hermes-workspace - with: - hermes-ws-dir: ${{ env.HERMES_WS_DIR }} - hermes-version-file: ${{ env.HERMES_VERSION_FILE }} - - build_hermesc_apple: - runs-on: macos-14 - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: /tmp/hermes - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Apple - uses: ./.github/actions/build-hermesc-apple - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - - build_apple_slices_hermes: - runs-on: macos-14 - needs: [build_hermesc_apple, prepare_hermes_workspace] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - HERMES_OSXBIN_ARTIFACTS_DIR: /tmp/hermes/osx-bin - IOS_DEPLOYMENT_TARGET: "15.1" - XROS_DEPLOYMENT_TARGET: "1.0" - MAC_DEPLOYMENT_TARGET: "10.15" - strategy: - fail-fast: false - matrix: - flavor: [Debug, Release] - slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build Slice - uses: ./.github/actions/build-apple-slices-hermes - with: - flavor: ${{ matrix.flavor }} - slice: ${{ matrix.slice}} - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - - build_hermes_macos: - runs-on: macos-14 - needs: [build_apple_slices_hermes, prepare_hermes_workspace] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - continue-on-error: true - strategy: - fail-fast: false - matrix: - flavor: [Debug, Release] - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build Hermes MacOS - uses: ./.github/actions/build-hermes-macos - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - flavor: ${{ matrix.flavor }} - prebuild_apple_dependencies: + if: github.repository == 'facebook/react-native' uses: ./.github/workflows/prebuild-ios-dependencies.yml secrets: inherit prebuild_react_native_core: uses: ./.github/workflows/prebuild-ios-core.yml + with: + use-hermes-nightly: ${{ !endsWith(github.ref_name, '-stable') }} secrets: inherit - needs: [prebuild_apple_dependencies, build_hermes_macos] + needs: [prebuild_apple_dependencies] test_ios_rntester_ruby_3_2_0: - runs-on: macos-14 + runs-on: macos-15 needs: - [build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin + [prebuild_apple_dependencies, prebuild_react_native_core] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Run it uses: ./.github/actions/test-ios-rntester with: ruby-version: "3.2.0" - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} flavor: Debug + test_ios_rntester_dynamic_frameworks: + runs-on: macos-15-large + strategy: + fail-fast: false + matrix: + flavor: [Debug, Release] + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Run it + uses: ./.github/actions/test-ios-rntester + with: + flavor: ${{ matrix.flavor }} + use-frameworks: true + run-unit-tests: false # tests for dynamic frameworks are already run in the test_ios_rntester job; this is to just a test build from source (no prebuilds) + test_ios_rntester: - runs-on: macos-14-large + runs-on: macos-15-large needs: - [build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin + [prebuild_apple_dependencies, prebuild_react_native_core] continue-on-error: true strategy: fail-fast: false matrix: flavor: [Debug, Release] - frameworks: [StaticLibraries, DynamicFrameworks] + frameworks: [false, true] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Run it uses: ./.github/actions/test-ios-rntester with: use-frameworks: ${{ matrix.frameworks }} - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} flavor: ${{ matrix.flavor }} test_e2e_ios_rntester: - runs-on: macos-14-large + runs-on: macos-15-large needs: [test_ios_rntester] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin strategy: fail-fast: false matrix: flavor: [Debug, Release] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node.js uses: ./.github/actions/setup-node - name: Download App - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: RNTesterApp-NewArch-${{ matrix.flavor }} path: /tmp/RNTesterBuild/RNTester.app @@ -196,18 +124,15 @@ jobs: flavor: ${{ matrix.flavor }} test_e2e_ios_templateapp: - runs-on: macos-14-large + runs-on: macos-15-large needs: [build_npm_package, prebuild_apple_dependencies] - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin strategy: fail-fast: false matrix: flavor: [Debug, Release] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup xcode uses: ./.github/actions/setup-xcode - name: Setup node.js @@ -218,20 +143,15 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: 2.6.10 - - name: Download Hermes - uses: actions/download-artifact@v4 - with: - name: hermes-darwin-bin-${{matrix.flavor}} - path: /tmp/react-native-tmp - name: Download React Native Package - uses: actions/download-artifact@v4 + 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@v4 + uses: actions/download-artifact@v7 with: name: ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz path: /tmp/third-party @@ -239,7 +159,7 @@ jobs: shell: bash run: ls -lR /tmp/third-party - name: Download React Native Prebuilds - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: name: ReactCore${{ matrix.flavor }}.xcframework.tar.gz path: /tmp/ReactCore @@ -256,9 +176,6 @@ jobs: REACT_NATIVE_PKG=$(find /tmp/react-native-tmp -type f -name "*.tgz") echo "React Native tgs is $REACT_NATIVE_PKG" - HERMES_PATH=$(find /tmp/react-native-tmp -type f -name "*.tar.gz") - echo "Hermes path is $HERMES_PATH" - # 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 }} @@ -273,8 +190,9 @@ jobs: 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" - HERMES_ENGINE_TARBALL_PATH=$HERMES_PATH RCT_NEW_ARCH_ENABLED=$NEW_ARCH_ENABLED bundle exec pod install + RCT_NEW_ARCH_ENABLED=$NEW_ARCH_ENABLED bundle exec pod install xcodebuild \ -scheme "RNTestProject" \ @@ -301,23 +219,23 @@ jobs: flavor: [debug, release] steps: - name: Checkout - uses: actions/checkout@v4 + 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@v2 + uses: actions/setup-java@v5 with: java-version: '17' distribution: 'zulu' - name: Download Maven Local - uses: actions/download-artifact@v4 + 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@v4 + uses: actions/download-artifact@v7 with: name: react-native-package path: /tmp/react-native-tmp @@ -360,21 +278,6 @@ jobs: flavor: ${{ matrix.flavor }} working-directory: /tmp/RNTestProject - build_hermesc_linux: - runs-on: ubuntu-latest - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: /tmp/hermes - HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Linux - uses: ./.github/actions/build-hermesc-linux - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - run_fantom_tests: runs-on: 8-core-ubuntu needs: [set_release_type] @@ -387,32 +290,13 @@ jobs: ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Build and Test Fantom uses: ./.github/actions/run-fantom-tests with: release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }} gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} - build_hermesc_windows: - runs-on: windows-2025 - needs: prepare_hermes_workspace - env: - HERMES_WS_DIR: 'C:\tmp\hermes' - HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin' - HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin' - ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip" - MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin' - CMAKE_DIR: 'C:\Program Files\CMake\bin' - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build HermesC Windows - uses: ./.github/actions/build-hermesc-windows - with: - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - build_android: runs-on: 8-core-ubuntu needs: [set_release_type] @@ -425,7 +309,7 @@ jobs: ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Build Android uses: ./.github/actions/build-android with: @@ -441,13 +325,13 @@ jobs: flavor: [debug, release] steps: - name: Checkout - uses: actions/checkout@v4 + 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@v4 + uses: actions/download-artifact@v7 with: name: rntester-${{ matrix.flavor }} path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/ @@ -467,10 +351,6 @@ jobs: needs: [ set_release_type, - prepare_hermes_workspace, - build_hermes_macos, - build_hermesc_linux, - build_hermesc_windows, build_android, prebuild_apple_dependencies, prebuild_react_native_core, @@ -480,15 +360,12 @@ jobs: env: TERM: "dumb" GRADLE_OPTS: "-Dorg.gradle.daemon=false" - env: - HERMES_WS_DIR: /tmp/hermes steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Build NPM Package uses: ./.github/actions/build-npm-package with: - hermes-ws-dir: ${{ env.HERMES_WS_DIR }} release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }} gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} @@ -512,16 +389,16 @@ jobs: flavor: [Debug, Release] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup git safe folders run: git config --global --add safe.directory '*' - name: Download npm package artifact - uses: actions/download-artifact@v4.1.3 + uses: actions/download-artifact@v7 with: name: react-native-package path: build - name: Download maven-local artifact - uses: actions/download-artifact@v4.1.3 + uses: actions/download-artifact@v7 with: name: maven-local path: /tmp/maven-local @@ -531,6 +408,12 @@ jobs: cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} - name: Run yarn install uses: ./.github/actions/yarn-install + - name: Set nightly Hermes versions + shell: bash + run: | + node ./scripts/releases/use-hermes-nightly.js + - name: Run yarn install again, with the correct hermes version + uses: ./.github/actions/yarn-install - name: Prepare the Helloworld application shell: bash run: node ./scripts/e2e/init-project-e2e.js --useHelloWorld --pathToLocalReactNative "$GITHUB_WORKSPACE/build/$(cat build/react-native-package-version)" @@ -544,63 +427,58 @@ jobs: fi yarn build android "${args[@]}" -P reactNativeArchitectures="$TARGET_ARCHITECTURE" -P react.internal.mavenLocalRepo="/tmp/maven-local" - name: Upload artifact - uses: actions/upload-artifact@v4.3.4 + uses: actions/upload-artifact@v6 with: name: helloworld-apk-${{ matrix.flavor }}-NewArch-hermes path: ./private/helloworld/android/app/build/outputs/apk/ compression-level: 0 test_ios_helloworld_with_ruby_3_2_0: - runs-on: macos-14 - needs: [prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core] # prepare_hermes_workspace must be there because we need its reference to retrieve a couple of outputs + runs-on: macos-15 + needs: [prebuild_apple_dependencies, prebuild_react_native_core] env: PROJECT_NAME: iOSTemplateProject - HERMES_WS_DIR: /tmp/hermes YARN_ENABLE_IMMUTABLE_INSTALLS: false steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - uses: ./.github/actions/test-ios-helloworld with: ruby-version: 3.2.0 flavor: Debug - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} test_ios_helloworld: - runs-on: macos-14 - needs: [prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core] # prepare_hermes_workspace must be there because we need its reference to retrieve a couple of outputs + runs-on: macos-15 + needs: [prebuild_apple_dependencies, prebuild_react_native_core] strategy: matrix: flavor: [Debug, Release] - use_frameworks: [StaticLibraries, DynamicFrameworks] + use_frameworks: [false, true] exclude: # This config is tested with Ruby 3.2.0. Let's not double test it. - flavor: Debug use_frameworks: StaticLibraries env: PROJECT_NAME: iOSTemplateProject - HERMES_WS_DIR: /tmp/hermes YARN_ENABLE_IMMUTABLE_INSTALLS: false steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - uses: ./.github/actions/test-ios-helloworld with: flavor: ${{ matrix.flavor }} use-frameworks: ${{ matrix.use_frameworks }} - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} test_js: runs-on: ubuntu-latest + if: github.repository == 'facebook/react-native' strategy: fail-fast: false matrix: - node-version: ["24.4.1", "22", "20.19.4"] + node-version: ["24", "22", "20.19.4"] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Test JS uses: ./.github/actions/test-js with: @@ -608,11 +486,12 @@ jobs: lint: runs-on: ubuntu-latest + if: github.repository == 'facebook/react-native' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Run all the linters uses: ./.github/actions/lint with: @@ -629,11 +508,11 @@ jobs: # 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] + 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@v4 + uses: actions/checkout@v6 - name: Rerun failed jobs in the current workflow env: GH_TOKEN: ${{ github.token }} @@ -647,13 +526,15 @@ jobs: 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" ]]; then + 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 new file mode 100644 index 000000000000..1c7b7eedf12b --- /dev/null +++ b/.github/workflows/test-hermes-v1-android.yml @@ -0,0 +1,70 @@ +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 new file mode 100644 index 000000000000..bdafd9181b81 --- /dev/null +++ b/.github/workflows/test-hermes-v1-ios.yml @@ -0,0 +1,76 @@ +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 new file mode 100644 index 000000000000..d11e444e5ff6 --- /dev/null +++ b/.github/workflows/test-hermes-v1.yml @@ -0,0 +1,39 @@ +# 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-dotslash-artifacts.yml b/.github/workflows/validate-dotslash-artifacts.yml new file mode 100644 index 000000000000..c1baac14097d --- /dev/null +++ b/.github/workflows/validate-dotslash-artifacts.yml @@ -0,0 +1,51 @@ +name: Validate DotSlash Artifacts + +on: + workflow_dispatch: + release: + types: [published] + push: + branches: + - main + paths: + - packages/debugger-shell/bin/react-native-devtools + - "scripts/releases/**" + - package.json + - yarn.lock + pull_request: + branches: + - main + paths: + - packages/debugger-shell/bin/react-native-devtools + - "scripts/releases/**" + - package.json + - yarn.lock + # Same time as the nightly build: 2:15 AM UTC + schedule: + - cron: "15 2 * * *" + +jobs: + validate-dotslash-artifacts: + runs-on: ubuntu-latest + if: github.repository == 'facebook/react-native' + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + fetch-tags: true + - name: Setup node.js + uses: ./.github/actions/setup-node + - name: Install dependencies + uses: ./.github/actions/yarn-install + - name: Configure Git + shell: bash + run: | + git config --local user.email "bot@reactnative.dev" + git config --local user.name "React Native Bot" + - name: Validate DotSlash artifacts + uses: actions/github-script@v8 + with: + script: | + const {validateDotSlashArtifacts} = require('./scripts/releases/validate-dotslash-artifacts.js'); + await validateDotSlashArtifacts(); diff --git a/.gitignore b/.gitignore index 8533677fca9d..dd5a1d4431db 100644 --- a/.gitignore +++ b/.gitignore @@ -133,6 +133,7 @@ vendor/ # Swift Package build folder /packages/react-native/.build /packages/react-native/.swiftpm +/packages/react-native/React/includes/ # @react-native/codegen /packages/react-native/React/FBReactNativeSpec/ @@ -175,6 +176,3 @@ fix_*.patch # [Experimental] Generated TS type definitions /packages/**/types_generated/ - -/packages/debugger-shell/build/ -/packages/*/dist/ diff --git a/CHANGELOG-0.6x.md b/CHANGELOG-0.6x.md index 8e4e433af8e3..9cf3b2b4018f 100644 --- a/CHANGELOG-0.6x.md +++ b/CHANGELOG-0.6x.md @@ -606,7 +606,7 @@ This file contains all changelogs for releases in the 0.60-0.69 range. Please ch - Fix crash on ReactEditText with AppCompat 1.4.0 ([e21f8ec349](https://github.com/facebook/react-native/commit/e21f8ec34984551f87a306672160cc88e67e4793) by [@cortinico](https://github.com/cortinico)) - Do not .lowerCase the library name when codegenerating TurboModule Specs ([28aeb7b865](https://github.com/facebook/react-native/commit/28aeb7b8659b38ee3a27fae213c4d0800f4d7e31) by [@cortinico](https://github.com/cortinico)) - Enable hitSlop to be set using a single number. ([a96bdb7154](https://github.com/facebook/react-native/commit/a96bdb7154b0d8c7f43977d8a583e8d2cbdcb795) by [@javache](https://github.com/javache)) -- Updated TextInput prop types to accomodate for new autoComplete values ([9eb0881c8f](https://github.com/facebook/react-native/commit/9eb0881c8fecd0e974b1cb9f479bad3075854340) by [@TheWirv](https://github.com/TheWirv)) +- Updated TextInput prop types to accommodate for new autoComplete values ([9eb0881c8f](https://github.com/facebook/react-native/commit/9eb0881c8fecd0e974b1cb9f479bad3075854340) by [@TheWirv](https://github.com/TheWirv)) - Don't reconstruct app components https://github.com/facebook/react-native/issues/25040 ([fc962c9b6c](https://github.com/facebook/react-native/commit/fc962c9b6c4bf9f88decbe014ab9a9d5c1cf51bc) by [@Somena1](https://github.com/Somena1)) - Do NOT skip the first child view in the scroll view group when measuring the lower and upper bounds for snapping. ([61e1b6f86c](https://github.com/facebook/react-native/commit/61e1b6f86cf98d8a74eeb9353143fe0c624fe6e6) by [@ryancat](https://github.com/ryancat)) - Fix crash when a Switch is initialised with both backgroundColor and thumbColor. ([456cf3db14](https://github.com/facebook/react-native/commit/456cf3db14c443c483d63aa97c88b45ffd25799b) by [@smarki](https://github.com/smarki)) diff --git a/CHANGELOG-0.7x.md b/CHANGELOG-0.7x.md index fa8de8fe9d7d..6058d5ccfe24 100644 --- a/CHANGELOG-0.7x.md +++ b/CHANGELOG-0.7x.md @@ -1,5 +1,14 @@ # Changelog (pre 0.80) +## v0.79.7 + +### Fixed + +#### Android specific + +- **Layout:** Make missing parent view state in updateLayout a soft error ([56ad8d9bfd](https://github.com/facebook/react-native/commit/56ad8d9bfd08ea70bc6f5726a2b4a6afb6d2d7c2) by [@javache](https://github.com/javache)) +- **Layout:** Make missing parent view state in updateLayout a soft error ([f2e47d8dab](https://github.com/facebook/react-native/commit/f2e47d8dabcd61621ea81c86cd1e2488948c4229) by [@cipolleschi](https://github.com/cipolleschi)) + ## v0.79.6 ### Added diff --git a/CHANGELOG.md b/CHANGELOG.md index 9777c3b52239..c55b794917d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,629 @@ # Changelog +## v0.84.0-rc.1 + +### Breaking + +#### iOS specific + +- Make Hermes V1 the default engine for iOS ([f140c4906b](https://github.com/facebook/react-native/commit/f140c4906b286a85772d0b7d97eecd0798805fcd) by [@cipolleschi](https://github.com/cipolleschi)) + +### Fixed + +- Fixed missing dependency breaking `react-native config` in pnpm setups ([5c43ed2348](https://github.com/facebook/react-native/commit/5c43ed2348d1a0123164f5246aa4a85f909c5560) by [@tido64](https://github.com/tido64)) + +#### Android specific + +- Handle `unstable_path` query param in asset URLs ([42986f27a0](https://github.com/facebook/react-native/commit/42986f27a0285e501f71cf5cedacedefdc44c74e) by [@tido64](https://github.com/tido64)) + +## v0.84.0-rc.0 + +### Breaking + +- Bump minimum Node.js version to v22.11 ([8f10b339d4](https://github.com/facebook/react-native/commit/8f10b339d48ab3ee6a121e435b380cbe5f5fe36e) by [@robhogan](https://github.com/robhogan)) +- Make the TurboModuleBinding constructor private. ([53944eaa6c](https://github.com/facebook/react-native/commit/53944eaa6c99e6c916d7147b1ef7061fc1ce0e58) by [@RSNara](https://github.com/RSNara)) +- Remove TurboCxxModule ([2d6a3236ed](https://github.com/facebook/react-native/commit/2d6a3236ed2b82d8dc1868439ba958c9f888e48a) by [@christophpurrer](https://github.com/christophpurrer)) +- Removed microtask API from JSTimerManager ([60471cb268](https://github.com/facebook/react-native/commit/60471cb268a70546d6ea555d25c90ca47ad3d839) by [@javache](https://github.com/javache)) +- Remove CxxModule 2/2 C++ part ([a945cd99fa](https://github.com/facebook/react-native/commit/a945cd99fa106bcf327cb90c3349fb5511703663) by [@christophpurrer](https://github.com/christophpurrer)) +- Remove CxxModule 1/2 Java/Kotlin part ([75a11703a0](https://github.com/facebook/react-native/commit/75a11703a0baa0f3b48f977d5ca861eb177c5ab5) by [@christophpurrer](https://github.com/christophpurrer)) +- Remove CxxModule support from CatalystInstance ([c726c27537](https://github.com/facebook/react-native/commit/c726c27537d5fe81f3eeeef9a181888fcf1bb2c1) by [@christophpurrer](https://github.com/christophpurrer)) +- Remove RCTCxxModule ([2c8a376c47](https://github.com/facebook/react-native/commit/2c8a376c47cd112b765ef5b4003751875ba9a4b0) by [@christophpurrer](https://github.com/christophpurrer)) + +#### Android specific + +- Remove unstable_shouldEnableLegacyModuleInterop() ([e4eb64d6cc](https://github.com/facebook/react-native/commit/e4eb64d6cc4ca8834f94d5262f52ac0f099d75a3) by [@RSNara](https://github.com/RSNara)) +- Delete deprecated NativeKind class from React Native Android ([284d841b3d](https://github.com/facebook/react-native/commit/284d841b3d82ff102ff0d839216212e7d6acccea) by [@mdvacca](https://github.com/mdvacca)) +- Remove unnecessary classes inside `com.facebook.react.uimanager.layoutanimation` used in legacy architecture ([0b09e6f696](https://github.com/facebook/react-native/commit/0b09e6f6968240f43db5fec8f2ff7dc1e8d8d7db) by [@cortinico](https://github.com/cortinico)) +- Remove unnecessary `LazyReactPackage` used in legacy architecture ([2b09ae8992](https://github.com/facebook/react-native/commit/2b09ae8992bde33e32e8241792b125449bd4365b) by [@cortinico](https://github.com/cortinico)) +- Remove unused internal `NotThreadSafeBridgeIdleDebugListener` ([0ee4a2d01a](https://github.com/facebook/react-native/commit/0ee4a2d01a7abac197851d648260a7a34648c59d) by [@cortinico](https://github.com/cortinico)) +- Remove unused internal `NotThreadSafeViewHierarchyUpdateDebugListener` ([991dff2322](https://github.com/facebook/react-native/commit/991dff2322eb5d36af4c493e0ad8531d8015c2dc) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- Remove legacy arch by default ([c7f433a413](https://github.com/facebook/react-native/commit/c7f433a4130a04ff1fd765565f3b1bd030031767) by [@cipolleschi](https://github.com/cipolleschi)) +- Make `RCTPackagerConnection` instance of the `RCTDevSettings` and use bundle config. ([cf92cade49](https://github.com/facebook/react-native/commit/cf92cade4938518169aa52a12960d2d04501b78e) by [@coado](https://github.com/coado)) + +### Added + +- A new test for the AnimationBackend ([8bc6214284](https://github.com/facebook/react-native/commit/8bc62142845960d53145bd350e632c7b28e32746) by Bartlomiej Bloniarz) +- Added support for `maxWidth`, `maxHeight`, `minWidth`, and `minHeight` props to the AnimationBackend. ([3650ae3d08](https://github.com/facebook/react-native/commit/3650ae3d08755975287b7feffb10a85d0f8192fe) by [@coado](https://github.com/coado)) +- Added support for flex props to the AnimationBackend. ([33b2d6d367](https://github.com/facebook/react-native/commit/33b2d6d367f9236fa32a349203e0a6a003757437) by [@coado](https://github.com/coado)) +- Support parsing `Readonly` for the new Flow utility types ([a6b76c0c51](https://github.com/facebook/react-native/commit/a6b76c0c51bf37a864b88d48775afbc1143eebde) by [@marcoww6](https://github.com/marcoww6)) +- Support parsing `ReadonlyArray` for the new Flow utility types ([3bf7a09ecb](https://github.com/facebook/react-native/commit/3bf7a09ecba3fe9ed62631e29c192d7a64d43f1e) by [@marcoww6](https://github.com/marcoww6)) +- Added support for outline props to the AnimationBackend. ([4de9242e80](https://github.com/facebook/react-native/commit/4de9242e809a5ddef26c1c96f85f046309d4a9ba) by [@coado](https://github.com/coado)) +- Added support for filter props to Animation Backend ([e744329c3d](https://github.com/facebook/react-native/commit/e744329c3dc002ecd689e925974f62b0c00b61e0) by [@coado](https://github.com/coado)) +- Added support for border width props to the animation backend. ([782dc0e038](https://github.com/facebook/react-native/commit/782dc0e0381150ee8c7114944d210baf96ba7a6b) by [@coado](https://github.com/coado)) +- Add ResourceReceivedData trace events for network data chunks in Performance timeline ([c400b88ebf](https://github.com/facebook/react-native/commit/c400b88ebf749b00741a6abcce39007bff5ee4cb) by [@emily8rown](https://github.com/emily8rown)) +- Added support for positional `left`, `top`, `right`, `bottom` props to the animation backend. ([9931aeb830](https://github.com/facebook/react-native/commit/9931aeb8302686ce97b3590f1e2e1a2442c77859) by [@coado](https://github.com/coado)) +- Added support for margin and padding props to AnimationBackend. ([cd4744cb98](https://github.com/facebook/react-native/commit/cd4744cb985bb7f08ce94db7d41788cbf9ba2bd8) by [@coado](https://github.com/coado)) +- Added missing `experimental_backgroundSize`, `experimental_backgroundPosition`, `experimental_backgroundRepeat` to manually written types. ([37bf285836](https://github.com/facebook/react-native/commit/37bf285836f5cb0addd2acb0dbe6b85a706f9ab5) by [@tjzel](https://github.com/tjzel)) +- Added support for `shadowColor`, `shadowOffset`, `shadowOpacity`, and `shadowRadius` props to the animation backend. ([c31a5a8896](https://github.com/facebook/react-native/commit/c31a5a8896e31007ee76b7732564806af63a2ff1) by [@coado](https://github.com/coado)) +- Export `usePressability` hook and `PressabilityConfig`/`PressabilityEventHandlers` types from the public API ([d0e9b9c078](https://github.com/facebook/react-native/commit/d0e9b9c07858f140d9da97c080d47c833a82acae) by [@natew](https://github.com/natew)) +- Added missing standard properties to `URL` (hash, host, pathname, etc.) and methods to `URLSearchParams` (get, set, delete, etc.). ([f97b9a521d](https://github.com/facebook/react-native/commit/f97b9a521d6a1cd6141c39253267d26f4d0b359f) by Manish Balayan) +- Use the commit hook to reconcile the UI updates with react ([d04e1528da](https://github.com/facebook/react-native/commit/d04e1528da262968a5e6e5fe0194dcd277552938) by Bartlomiej Bloniarz) +- Add `connectAnimatedNodeToShadowNodeFamily` method to `NativeAnimatedModule` and `NativeAnimatedTurboModule` ([d7ef651c5c](https://github.com/facebook/react-native/commit/d7ef651c5cbfdd8a7289746d1afbe2c63bb61a83) by Bartlomiej Bloniarz) +- Added support for transform, border radius, and background color props to Animation Backend. ([e167faa449](https://github.com/facebook/react-native/commit/e167faa4494e03073dc9fc53581fad532cc3f1ee) by [@coado](https://github.com/coado)) +- Bundle support for heic and heif files ([f472ef980a](https://github.com/facebook/react-native/commit/f472ef980a19fc710baf6203a67c72d73b378fed) by [@anthonybajoua](https://github.com/anthonybajoua)) +- Thread down rootTag/surfaceId to AnimatedInterpolation node ([b46427a673](https://github.com/facebook/react-native/commit/b46427a67399874bd827658191898eeffcc9e56e) by [@zeyap](https://github.com/zeyap)) +- DevServer fast refresh banners now have a dismiss button but still tap anywhere to dismiss. ([fcd63032d0](https://github.com/facebook/react-native/commit/fcd63032d029cf9ec31605e9be4bb63d5e44ce1e) by [@emily8rown](https://github.com/emily8rown)) +- Jest tests for PlatformColor support ([cbbba7b9a5](https://github.com/facebook/react-native/commit/cbbba7b9a5cf81d5454f13dbf399a4c35d7d6667) by [@zeyap](https://github.com/zeyap)) +- (js part) Support PlatformColor type of toValue and interpolation outputRange ([8b6b47bd57](https://github.com/facebook/react-native/commit/8b6b47bd57f5b3d47d729c335c304b4c744576d7) by [@zeyap](https://github.com/zeyap)) +- Expose methods for registering packager connection handlers. ([d9842fdbe3](https://github.com/facebook/react-native/commit/d9842fdbe32a4c6eeae7cbca92f0f1706d9004ce) by [@coado](https://github.com/coado)) +- Add support for Flat Config (eslint v9) ([18592451de](https://github.com/facebook/react-native/commit/18592451de8106071473a898cbc4b6d4efc7814b) by [@pipopotamasu](https://github.com/pipopotamasu)) +- UIManagerNativeAnimatedDelegateBackendImpl for running animation frame updates on android ([219c2b84c2](https://github.com/facebook/react-native/commit/219c2b84c284f162f2f261a09b5a94d197408357) by Bartlomiej Bloniarz) + +#### Android specific + +- Add `{add|remove}SchemeChangeListener()` function to `OverrideColorScheme` interface to support dynamic appearance updates via override ([80e384a801](https://github.com/facebook/react-native/commit/80e384a8011762f571ff6f47b6674de00aab0485) by [@alanleedev](https://github.com/alanleedev)) +- Include activeHitPath in payload when it's PointerUp/Down ([1d6d8fc058](https://github.com/facebook/react-native/commit/1d6d8fc058bbfbc529ddfa65a0d7658eeca75332) by [@zeyap](https://github.com/zeyap)) +- Add onKeyDown/onKeyUp support to Android ([79b09ce9c4](https://github.com/facebook/react-native/commit/79b09ce9c416ed2b9ac5e168579150dd26823673) by [@Abbondanzo](https://github.com/Abbondanzo)) +- Add c++ animated support for PlatformColor type of toValue and interpolation outputRange ([7941a621f9](https://github.com/facebook/react-native/commit/7941a621f955d6b62e7a359de67cd3b375c45d9b) by [@zeyap](https://github.com/zeyap)) + +#### iOS specific + +- Allow invalidateDisplayLink on RCTAnimatedModuleProvider ([7c603ee261](https://github.com/facebook/react-native/commit/7c603ee261c3eb2d9bf160505427ba06607d3465) by [@zeyap](https://github.com/zeyap)) +- Add support for UIAccessibilityPriority in announcements ([4851fb2fc3](https://github.com/facebook/react-native/commit/4851fb2fc30c45da496bb982d13568767ddbad02) by [@maxencehenneron](https://github.com/maxencehenneron)) +- Added documentation for the prebuild scripts for precompiling React Native Core and React Native Dependencies. ([7a66582f60](https://github.com/facebook/react-native/commit/7a66582f60a743834a96101476dc6b54786b68a2) by [@chrfalch](https://github.com/chrfalch)) +- Add new `RCTBundleConfiguration` for modifying bundle URL on `RCTReactNativeFactory`. ([6fa75cce48](https://github.com/facebook/react-native/commit/6fa75cce48f4f3dc631c181a25a9401a2bf88eeb) by [@coado](https://github.com/coado)) + +### Changed + +- Sync React 19.2.3 into React Native ([e6923dd1e1](https://github.com/facebook/react-native/commit/e6923dd1e1dbcab0cb9f7441331b99071663c55a) by [@cipolleschi](https://github.com/cipolleschi)) +- AnimatedPropsRegistry now also receive the updates from the synchronous updates that bypass the ShadowTree, so that these updates are not overwritten by React commits ([c52d30e79b](https://github.com/facebook/react-native/commit/c52d30e79b680db15bd2d39b74e4e1f38bb00649) by Bartlomiej Bloniarz) +- C++ animated now passes the calculated `folly::dynamic` directly to the backend, without repacking it into `AnimatedProp` ([84e408cf89](https://github.com/facebook/react-native/commit/84e408cf89eb537439dc99db95d33df3c2a9394a) by Bartlomiej Bloniarz) +- Extracted `cloneProp` from `AnimationBackend.cpp` to `AnimatedProps.h` ([33f783ae23](https://github.com/facebook/react-native/commit/33f783ae23dca139900767108b2ad4390ea865ca) by Bartlomiej Bloniarz) +- CloneMultiple now invokes the callback for every cloned node, instead of doing that only for the nodes in `familiesToUpdate` ([976c849057](https://github.com/facebook/react-native/commit/976c849057ec6056727ffa71cac0d0c0a513a97e) by Bartlomiej Bloniarz) +- Text components with onPress or onLongPress now automatically get accessibilityRole='link' for proper accessibility support ([4c732b4ccf](https://github.com/facebook/react-native/commit/4c732b4ccf2f5c458640f8024759f5f57877749e) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Split the families by `SurfaceId` in `onAnimationFrame` ([5c078bd490](https://github.com/facebook/react-native/commit/5c078bd4905615b0fb3a640e81e53d594f195ca6) by Bartlomiej Bloniarz) +- Move the animation backend callback scheduling, behind the `isRenderCallbackStarted` check. ([8b95fce84e](https://github.com/facebook/react-native/commit/8b95fce84ea0a7fef79e78582a8717e403fa7349) by Bartlomiej Bloniarz) +- JSBigString mutable data accessor has been renamed to mutableData ([3012aac2ad](https://github.com/facebook/react-native/commit/3012aac2adc04659d6b882e910b1ecf14c8e5225) by [@javache](https://github.com/javache)) + +#### Android specific + +- `VirtualView` not clips subviews even if its parent `ScrollView` does not have `removeClippedSubviews` enabled. ([b0e754bc7f](https://github.com/facebook/react-native/commit/b0e754bc7f7b55c13b7632d354aaf3ee48f7296d) by [@yungsters](https://github.com/yungsters)) +- Set isClickable=true by default or based on the pointerEvents value for all views to improve accessibility tool detection while maintaining the configured focusable state ([427995858d](https://github.com/facebook/react-native/commit/427995858d604ab749d4b550a91be19c60cbf840) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Enabled shouldUseLinkRoleForPressableText and shouldSetEnabledBasedOnAccessibilityState feature flags by default to improve accessibility behavior. ([38e3075310](https://github.com/facebook/react-native/commit/38e3075310e2e0bc062406a06bfcdc232fe6100f) by [@fabriziocucci](https://github.com/fabriziocucci)) + +#### iOS specific + +- Use prebuild by default ([df9d31b243](https://github.com/facebook/react-native/commit/df9d31b2435255f799aa024ffb0f87bcdb665645) by [@cipolleschi](https://github.com/cipolleschi)) +- Add `RCTBundleConfiguration` property on `RCTReactNativeFactory` and pass it down to `RCTHost`. ([5465a511f4](https://github.com/facebook/react-native/commit/5465a511f4c23692371ebe5756d260281386520a) by [@coado](https://github.com/coado)) +- Allow linking local SPM packages in CocoaPods ([d31fc32882](https://github.com/facebook/react-native/commit/d31fc328826a584a2351acf831ee987846ca7e21) by [@sbuggay](https://github.com/sbuggay)) + +### Deprecated + +- Deprecate TurboModuleProviderFunctionType ([7a6a6ae2e6](https://github.com/facebook/react-native/commit/7a6a6ae2e63f907f95764e52bf958897462a5c8b) by [@RSNara](https://github.com/RSNara)) +- Deprecate `XHRInterceptor` and `WebSocketInterceptor` APIs. Developer tools should use the CDP `Network` domain instead. ([41380f39ab](https://github.com/facebook/react-native/commit/41380f39aba22913a2aa45a951a36cacc95fb57a) by [@huntie](https://github.com/huntie)) + +### Removed + +- Remove Babel preset transforms for already-unsupported non-Hermes engines ([07bd24ed0d](https://github.com/facebook/react-native/commit/07bd24ed0dbd11e77743086a970b9e7507e15c8f) by [@robhogan](https://github.com/robhogan)) +- Legacy Arch: Remove Perf and Network tabs from in-app Element Inspector. See [RFC0777](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0777-remove-legacy-element-inspector-features.md) ([b7ca04844d](https://github.com/facebook/react-native/commit/b7ca04844d689116692c16fce251f3270250854e) by [@huntie](https://github.com/huntie)) + +#### Android specific + +- Remove unnecessary `OnBatchCompleteListener` used in Legacy Architecture ([1bdd2a0aba](https://github.com/facebook/react-native/commit/1bdd2a0abac4ab2c420cadbf8796e44471201f06) by [@cortinico](https://github.com/cortinico)) +- Remove unnecessary and unused BridgeDevSupportManager ([13da82a337](https://github.com/facebook/react-native/commit/13da82a337826ac30fd2d4b581d963f5b872381b) by [@cortinico](https://github.com/cortinico)) + +### Fixed + +- Added handling of missing props to `AnimatedPropsRegistry` ([31a9eeeba4](https://github.com/facebook/react-native/commit/31a9eeeba4d7c4790133f41df48b16aff6920601) by [@j-piasecki](https://github.com/j-piasecki)) +- Handle `Object.create(null)` correctly in AnimatedObject.js' `isPlainObject` function ([4e0b9233c0](https://github.com/facebook/react-native/commit/4e0b9233c0242f46239f0f8b21f82b4cbd5ba781) by [@maman](https://github.com/maman)) +- Hash generation includes `declare const` types in API snapshot ([c36665f7c6](https://github.com/facebook/react-native/commit/c36665f7c658c641cf1b6cca890415bdb149a623) by [@emily8rown](https://github.com/emily8rown)) +- Nullcheck result of getAnimatedNode in NativeAnimatedNodesManager::updateNodes ([3e9083b423](https://github.com/facebook/react-native/commit/3e9083b4234eabfd4f3444c6b6804c66389739a5) by [@zeyap](https://github.com/zeyap)) +- React Native DevTools: Fix a bug where we would incorrectly flag apps using additonal Hermes runtimes (e.g. Reanimated) as being multi-host ([c800503214](https://github.com/facebook/react-native/commit/c8005032140f1aff16027b5ed53caea6c9d299f5) by [@huntie](https://github.com/huntie)) +- Fixed `hermes-compiler` not being resolved correctly when your repo is set up as a monorepo using pnpm. ([e23e9add80](https://github.com/facebook/react-native/commit/e23e9add8080a0204221edd4d8cc5e2f1a2f621b) by [@tido64](https://github.com/tido64)) +- Ensure codegen CLI supports unspecified `--outputPath` argument and respects `codegenConfig.outputDir` configurations ([716303362a](https://github.com/facebook/react-native/commit/716303362aead08310e2101f15a319b64a602026) by [@kitten](https://github.com/kitten)) +- Fixed an `ENOENT` exception when a dependency does not export `package.json`, and your repo is set up as a monorepo using pnpm ([20550c45d2](https://github.com/facebook/react-native/commit/20550c45d276a9cb348116a24cddc20415449e0e) by [@tido64](https://github.com/tido64)) +- Fixed URLSearchParams duplicate issue. ([1e06c92404](https://github.com/facebook/react-native/commit/1e06c9240407611558f4905117335e792446125f) by [@riteshshukla04](https://github.com/riteshshukla04)) +- Check nodesManager_ in AnimatedModule::executeOperation ([199b8982de](https://github.com/facebook/react-native/commit/199b8982de55a470a05efb27b63e55365e5e9997) by [@zeyap](https://github.com/zeyap)) +- `color` and `blurRadius` of BoxShadowValue mistakenly swapped ([8fa8fb7a52](https://github.com/facebook/react-native/commit/8fa8fb7a5265dc879106dbec6ec0232268910c56) by [@Phecda](https://github.com/Phecda)) + +#### Android specific + +- Fix BackHandler callbacks not working after app resume on API 36+ ([fef5b84996](https://github.com/facebook/react-native/commit/fef5b8499667f980c7ad7fe7400c3316722b90ba) by [@anferrat](https://github.com/anferrat)) +- Fix `ReactModalHostView` hover interception to call `super.onInterceptHoverEvent` instead of `super.onHoverEvent`. ([0fe23d7066](https://github.com/facebook/react-native/commit/0fe23d70660db0f97cec0a68a545ace8ee780666) by [@MegaManSec](https://github.com/MegaManSec)) +- DevSupport - fix small bugs with Host change dialog ([c4c587e5c3](https://github.com/facebook/react-native/commit/c4c587e5c3ce4c9d4bdcb9dd95b28cf222bdadee) by [@cortinico](https://github.com/cortinico)) +- Fix jni aborts when turbomodule constructors throw ([d67fc70497](https://github.com/facebook/react-native/commit/d67fc704978ec258b732d61f197d4faa6a784a9c) by [@RSNara](https://github.com/RSNara)) +- Make ReactDelegate.onBackPressed() return correct status ([17b3c1c698](https://github.com/facebook/react-native/commit/17b3c1c69877b674b61904ebec5b3a46d6075233) by [@RSNara](https://github.com/RSNara)) +- RNGP using node invocation non-compatible with Gradle Compilation Cache ([dd1f83e616](https://github.com/facebook/react-native/commit/dd1f83e61656f21769bd66b28a4c389d6ec31a72) by [@tjzel](https://github.com/tjzel)) +- RNGP using node invocation non-compatible with Gradle Compilation Cache ([dc73ec438a](https://github.com/facebook/react-native/commit/dc73ec438a00c17d3fe338db45919cf371828a3b) by [@tjzel](https://github.com/tjzel)) +- Fix text clipping on Android 15+ due to useBoundsForWidth change ([8347cc4b50](https://github.com/facebook/react-native/commit/8347cc4b50ca9229b638d0823d3148fed50b9a61) by [@chrfalch](https://github.com/chrfalch)) +- A11y: Mark virtual views for links as [`clickable`](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#setClickable(boolean%29) ([a9a0268953](https://github.com/facebook/react-native/commit/a9a02689533f9cf30fc20cfc7be1ade4f4a624da) by Tom Scallon) +- Fixed `adjustsFontSizeToFit` scaling the font size too much down ([253fdf4753](https://github.com/facebook/react-native/commit/253fdf475365f6ad7c7c7ba17098589cf18a5c3e) by [@j-piasecki](https://github.com/j-piasecki)) +- Use FQCN to avoid collisions ([5bb3a6d68d](https://github.com/facebook/react-native/commit/5bb3a6d68db113d49528848df8704c5adeb1eba8) by [@riteshshukla04](https://github.com/riteshshukla04)) +- Allow nullable `code` in `Promise.reject` to prevent NPEs from Java modules ([47c45688c7](https://github.com/facebook/react-native/commit/47c45688c7db5aa8da512928b1d5b216b46fc8c6) by [@ramanverse](https://github.com/ramanverse)) +- A11y: prevent redundant double screen reader focus steps on `` ([06786a8afa](https://github.com/facebook/react-native/commit/06786a8afa037296c3f779eab7779a2af42fe294) by [@mdjastrzebski](https://github.com/mdjastrzebski)) +- Emit scroll event once on overscrolled ([f60789abac](https://github.com/facebook/react-native/commit/f60789abac75ad4d1feaadff3fed0b8796a4f8ef) by [@zeyap](https://github.com/zeyap)) +- Fix isClickable state for TextViews after recycling ([cf3af8bf4a](https://github.com/facebook/react-native/commit/cf3af8bf4ac99f8671036addeb60df101197d5b7) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Fix isClickable state for TextViews based on onClickListener ([9ec41774b9](https://github.com/facebook/react-native/commit/9ec41774b942014e3c06c3a1f30bb3b6c0fc2de8) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Fixed recycled TextViews incorrectly appearing as clickable to accessibility systems ([b34e9c542d](https://github.com/facebook/react-native/commit/b34e9c542d494e704f45b6b950c6f23d86bb326f) by [@fabriziocucci](https://github.com/fabriziocucci)) +- – Enabled shouldResetOnClickListenerWhenRecyclingView by default to reset OnClickListener to null when recycling views and prevent accessibility tools from detecting incorrect states. ([21b93d82df](https://github.com/facebook/react-native/commit/21b93d82df560f31fde9405184399630cbfa437b) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Enabled shouldResetClickableWhenRecyclingView by default to reset isClickable to false when recycling views and prevent accessibility tools from detecting incorrect clickable states. ([a2e8bac60f](https://github.com/facebook/react-native/commit/a2e8bac60f343f4e28abd50fad0f89ecd18afc61) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Fix NPE on ReactAccessibilityDelegate.performAccessibilityAction ([cf6de77408](https://github.com/facebook/react-native/commit/cf6de774088f87304080755a8110999ed88b9556) by [@cortinico](https://github.com/cortinico)) +- Reset isClickable when recycling views to prevent accessibility tools from detecting incorrect state ([d553c31160](https://github.com/facebook/react-native/commit/d553c31160294e6094b96f706f07d06a589da79b) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Reset OnClickListener when recycling views to prevent accessibility tools from detecting incorrect state ([52a4f4b83d](https://github.com/facebook/react-native/commit/52a4f4b83dec615d2d6d67854aed42930682f708) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Fixed antialiasing issues from border radius usage in API <= 28 ([e08abbcb99](https://github.com/facebook/react-native/commit/e08abbcb99270381c94145a33476f51684dffd93) by [@Abbondanzo](https://github.com/Abbondanzo)) +- View.setEnabled() now properly reflects accessibilityState.disabled ([6fbe284082](https://github.com/facebook/react-native/commit/6fbe284082aa603c44df5edba9d86f8519b7dbf0) by [@fabriziocucci](https://github.com/fabriziocucci)) +- Fix android_ripple not working with foreground: false in Pressable components ([ca077c6bf8](https://github.com/facebook/react-native/commit/ca077c6bf8e1c842857878deb153b1fdbc71b1a2) by [@ish1416](https://github.com/ish1416)) +- Fix keyboard navigation through items in horizontal ScrollView with snapToInterval enabled ([a460df2165](https://github.com/facebook/react-native/commit/a460df216527b1a4435bd72f027565c5fd5e05a3) by [@jgryko5](https://github.com/jgryko5)) + +#### iOS specific + +- Moved setting xcconfig to after `add_rn_core` pod function is called. ([73d3429a44](https://github.com/facebook/react-native/commit/73d3429a44e67745a5c5df5d0a0560a40dbbb430) by [@chrfalch](https://github.com/chrfalch)) +- Fix listenerCount not resetting for RCTEventEmitter ([ac8fa25147](https://github.com/facebook/react-native/commit/ac8fa25147c3ee2cd3fefde79d09e3a8f87b95c1) by [@brainbicycle](https://github.com/brainbicycle)) +- Fix legacy module interop not handling hitTest correctly ([700d320a5f](https://github.com/facebook/react-native/commit/700d320a5f1615a2ae6ea69bcc68b645a2cd4618) by [@kruczy](https://github.com/kruczy)) +- Accessibility actions labels are not read by VoiceOver ([602a2d213a](https://github.com/facebook/react-native/commit/602a2d213a735e43c92edff3e2357085fa0d3af7) by [@maxencehenneron](https://github.com/maxencehenneron)) +- Respect `cancelsTouchesInView` when canceling touches in `RCTSurfaceTouchHandler` ([5634e8a601](https://github.com/facebook/react-native/commit/5634e8a601caf0faa174bac3511929de767609ac) by [@intmain](https://github.com/intmain)) +- Remove redundant gesture to tap button when the layer beneath is already tappable ([8b8cceac89](https://github.com/facebook/react-native/commit/8b8cceac89a5962fb2bc52025702f2c023d41055) by [@emily8rown](https://github.com/emily8rown)) +- Make rest of app responsive whilst dev loading banner present ([f97354368c](https://github.com/facebook/react-native/commit/f97354368ccdb5e72e5c233e90cd2a9755ffcf7f) by [@emily8rown](https://github.com/emily8rown)) +- Fixed dismiss button not appearing consistently in dev loading view ([336042ccb3](https://github.com/facebook/react-native/commit/336042ccb30903ee3e16ffbf9e100bb5ad3cf7e3) by [@emily8rown](https://github.com/emily8rown)) +- Fixed copying symbol bundles into correct slice folder ([ac31e96e49](https://github.com/facebook/react-native/commit/ac31e96e4925b3238ab548c91584a7e608a2e17c) by [@chrfalch](https://github.com/chrfalch)) +- Fixed crash from dismiss button in DevLoadingView ([6793f5cc51](https://github.com/facebook/react-native/commit/6793f5cc516170d1c28e3e762f0b7dd065330b8b) by [@emily8rown](https://github.com/emily8rown)) +- Address `-Wswitch-default` warnings for projects that use that compiler flag ([4c560b118c](https://github.com/facebook/react-native/commit/4c560b118c683c72e9eeebdca473b8ec3cdd7e41) by [@NSProgrammer](https://github.com/NSProgrammer)) +- Avoid reallocating views on RCTDevLoadingView progress updates ([55a5b6b015](https://github.com/facebook/react-native/commit/55a5b6b0156bfe81143caad6b0e69924939045e6) by [@shirakaba](https://github.com/shirakaba)) +- Fix missing default statements for projects that have `-Wswitch-default` enabled (along with `-Wswitch-enum`). ([a210409e03](https://github.com/facebook/react-native/commit/a210409e03c1951ab7c88100c763eff055b88e8a) by [@NSProgrammer](https://github.com/NSProgrammer)) +- Fix crash in RCTEnhancedScrollView when scrollViewDidScroll is called ([5f14001e92](https://github.com/facebook/react-native/commit/5f14001e929426144d1eaa5e5e52fb23a4d4f296) by Gabriel Cadden) +- Fix undefined behavior for values outside of enum range in generated `switch` methods in Objective-C. ([4bf8204391](https://github.com/facebook/react-native/commit/4bf8204391c6dc4014944bc21c997bdb8a7ef584) by [@NSProgrammer](https://github.com/NSProgrammer)) +- A Crash when some error information are nil ([efd2f679f2](https://github.com/facebook/react-native/commit/efd2f679f2cf054bd1301a1e6e851de5cdc38cc7) by [@cipolleschi](https://github.com/cipolleschi)) +- Improve -Wswitch-default support ([8f91076397](https://github.com/facebook/react-native/commit/8f910763973a5b59b515951d7ec4c4f88d0c3b4d) by [@NSProgrammer](https://github.com/NSProgrammer)) +- Improve -Wswitch-default support ([fedd1cfbda](https://github.com/facebook/react-native/commit/fedd1cfbda093dd9c96ab63ed9c2b8d81b6af1c5) by [@NSProgrammer](https://github.com/NSProgrammer)) +- 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) +- Make sure to only call onRender when NativeAnimatedNodesManagerProvider is not destroyed ([d8f9b3f1f5](https://github.com/facebook/react-native/commit/d8f9b3f1f59ebfea17105ea849469cf42325db1a) by [@zeyap](https://github.com/zeyap)) +- Fix rounding error occurring randomly in iOS text line height calculation ([581d643a9e](https://github.com/facebook/react-native/commit/581d643a9e59fd88f93757f80194e1efd11bd0e5) by [@soutua](https://github.com/soutua)) +- Fix incorrect source path resolution in dSYM remapping in precompiled framework scripts ([f383241b19](https://github.com/facebook/react-native/commit/f383241b197f4b98a8fca6bbd948de9ce1a756c9) by [@chrfalch](https://github.com/chrfalch)) +- Set the `CURRENT_ARCH=arm64` on M4 ([b78099b821](https://github.com/facebook/react-native/commit/b78099b821357a5449592c48bd4156e3b7c315dc) by [@ISeekTruth](https://github.com/ISeekTruth)) +- Fixed build with dynamic frameworks ([1033dbd1da](https://github.com/facebook/react-native/commit/1033dbd1da013a07ee5d2a13fadeba9f38fa8426) by [@cipolleschi](https://github.com/cipolleschi)) +- Improve support for projects with `-Wswitch-enum` compiler error ([f687292aad](https://github.com/facebook/react-native/commit/f687292aad20a79d9d8d8a706aa2fec64fe92f4b) by [@NSProgrammer](https://github.com/NSProgrammer)) + +## v0.83.1 + +### Fixed + +#### Android specific + +- **Networking**: Fix Network error that could occur for `FormData` uploads with binary data ([471ef7212e](https://github.com/facebook/react-native/commit/471ef7212e8f7778bb7692a372a58c6fba9d081d) by [@huntie](https://github.com/huntie)) + +## v0.83.0 + +### Breaking + +None + +### Deprecated + +#### Android specific + +- **Animated**: Mark `startOperationBatch` and `finishOperationBatch` as deprecated, replace with no-op ([c9dcd64ed5](https://github.com/facebook/react-native/commit/c9dcd64ed557d477828549e54afa71a12e5294ec) by [@zeyap](https://github.com/zeyap)) +- **Networking**: Mark `NetworkingModule.sendRequestInternal` as deprecated ([30999b868c](https://github.com/facebook/react-native/commit/30999b868cf1655b6799edfa65dba2cc9fa8161a) by [@motiz88](https://github.com/motiz88)) + +### Added + +- **Accessibility**: Add meaningful error reporting when `AccessibilityInfo`'s methods are not available ([9cadfe6607](https://github.com/facebook/react-native/commit/9cadfe6607159f78bdd45929e0eb9b3292240cb9) by [@vzaidman](https://github.com/vzaidman)) +- **Animated**: `AnimationBackend` initialisation and style updates ([e091759947](https://github.com/facebook/react-native/commit/e09175994759a8868148b4a5d31768e18057d5a4) by [@bartlomiejbloniarz](https://github.com/bartlomiejbloniarz)) +- **Animated**: Make `AnimatedNodesManager` use the backend behind the flag ([325c681cb1](https://github.com/facebook/react-native/commit/325c681cb17996c15b246ad0012cbde3d4631f08) by Bartlomiej Bloniarz) +- **Animated**: Add `unstable_setAnimationBackend`, `unstable_getAnimationBackend` in UIManager ([7ec470d49a](https://github.com/facebook/react-native/commit/7ec470d49abded215fef260d577b8424207f7fb9) by Bartlomiej Bloniarz) +- **Dev Server**: Dev server banners can now be closed on tap. On iOS, don't close them after 15s anymore ([6936bd9f6b](https://github.com/facebook/react-native/commit/6936bd9f6bcb4fce5af33442e72992e7aa3767d6) by [@vzaidman](https://github.com/vzaidman)) +- **Fast Refresh**: New banner Add to indicate that Fast Refresh has lost connection, and that the app needs to be restarted to reconnect ([4148746941](https://github.com/facebook/react-native/commit/4148746941f957031dd65fe94481bb3ea6367a47) by [@vzaidman](https://github.com/vzaidman)) +- **IntersectionObserver**: Gate `IntersectionObserver` in the Canary release level ([5119db44ce](https://github.com/facebook/react-native/commit/5119db44ce5b600edc79dd9fe752d6e0a53375f4) by [@lunaleaps](https://github.com/lunaleaps)) +- **JavaScript API**: `ListViewToken` is now exposed when using `"react-native-strict-api"` ([0a0b48b5ff](https://github.com/facebook/react-native/commit/0a0b48b5fff508a1976604bedc931a1b5110a4f2) by [@huntie](https://github.com/huntie)) +- **JavaScript API**: `unstable_NativeText` and `unstable_NativeView` are now exported from the `react-native` package ([90ac3ac7bd](https://github.com/facebook/react-native/commit/90ac3ac7bd2c7f8761d02e503224828f8af97fec) by [@huntie](https://github.com/huntie)) +- **JavaScript API**: Expose `NativeComponentRegistry` API to index.d.ts ([3f7f9d8fb8](https://github.com/facebook/react-native/commit/3f7f9d8fb8beb41408d092870a7c7cac58029a4d) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- **Performance**: Enable Web Performance APIs ([beccee2164](https://github.com/facebook/react-native/commit/beccee21649eb0353e2828c65f0045053f04c6db) by [@rubennorte](https://github.com/rubennorte)) +- **React Native DevTools**: Enable Network inspection features [66469b58d8](https://github.com/facebook/react-native/commit/66469b58d85e820e401b82028b3fda57c53f08c1) by [@cipolleschi](https://github.com/cipolleschi) +- **React Native DevTools**: Enable standalone app shell by default (https://github.com/facebook/react-native/commit/3341bb57b188d0e20ac6e9ebb1e8b1fbb6b26514 by [@huntie](https://github.com/huntie)) +- **StyleSheet**: Background image native parser ([a9780f9102](https://github.com/facebook/react-native/commit/a9780f9102800a53e381271bcf27542eaea4a46e) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **StyleSheet**: Merge the [iOS](https://github.com/facebook/react-native/pull/52283) and [android](https://github.com/facebook/react-native/pull/52282) PR into this, this PR includes `BackgroundImageExample`. I have also Add testcases for parsing syntax in JS ([3d08683d0f](https://github.com/facebook/react-native/commit/3d08683d0fcb66cd657e3f72388a53605c7c3974) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **TypeScript**: Add `@react-native/typescript-config/strict` export enabling the `react-native-strict-api` custom condition ([0198c92c71](https://github.com/facebook/react-native/commit/0198c92c714cdfe48bb8d84771e5ef25c17fb47f) by [@kraenhansen](https://github.com/kraenhansen)) + +#### Android specific + +- **Dev Menu**: Add new configuration for `RCTDevMenu` ([4ddf2ce64f](https://github.com/facebook/react-native/commit/4ddf2ce64f8c6886a575c69872273005fd4d90cd) by [@coado](https://github.com/coado)) +- **ReactHost**: Add new `setBundleSource` method to `ReactHost` for changing bundle URL at runtime ([005d705aff](https://github.com/facebook/react-native/commit/005d705aff70e560ac937740798b69582a5b6954) by [@coado](https://github.com/coado)) +- **StyleSheet**: Background size, position and repeat styles ([e859293674](https://github.com/facebook/react-native/commit/e859293674243d94895f710d1cb197e9e6f2e9e8) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) + +#### iOS specific + +- **Build options**: Add way to set the `RCT_REMOVE_LEGACY_ARCH` flag from Cocoapods to compile ou the legacy arch ([5abda9c7da](https://github.com/facebook/react-native/commit/5abda9c7dacc5533fac35675c09100c7120dd634) by [@cipolleschi](https://github.com/cipolleschi)) +- **Build options**: Add support for symbolication of precompiled `React.xcframework` ([07f40ec6b4](https://github.com/facebook/react-native/commit/07f40ec6b48bf4b6507bda5819b873f3a7334dea) by [@chrfalch](https://github.com/chrfalch)) +- **Codegen**: Update Codegen to generate `Package.swift` file for Codegen targets ([a7cd3cc08f](https://github.com/facebook/react-native/commit/a7cd3cc08fd2679bb00666162d91ee2fb7107d06) by [@cipolleschi](https://github.com/cipolleschi)) +- **Dev Menu**: Add new configuration for `RCTDevMenu` ([29d5aa582f](https://github.com/facebook/react-native/commit/29d5aa582ffd6c395e34a1d03d2fdd742df647af) by [@coado](https://github.com/coado)) +- **Font**: Add support for condensed system font when using the New Architecture ([07da2ff3e1](https://github.com/facebook/react-native/commit/07da2ff3e18bbb71f428985f185d5f971843ec26) by [@ismarbesic](https://github.com/ismarbesic)) +- **StyleSheet**: Add contrast and hue-rotate CSS filters ([20ba98e00d](https://github.com/facebook/react-native/commit/20ba98e00da84b629cf2c1b11fa24c28c7046093) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **StyleSheet**: Add grayscale, drop-shadow and saturate CSS filters ([1198a55d50](https://github.com/facebook/react-native/commit/1198a55d50809b9086771fa0b40415dd487afe0f) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **StyleSheet**: Background size, position and repeat styles ([d8c2f1c883](https://github.com/facebook/react-native/commit/d8c2f1c883180828ce2784c4b30565e2bec194cf) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **StyleSheet**: Filter blur ([b365e26593](https://github.com/facebook/react-native/commit/b365e26593112fee8824c53a2787679a29cbe9ab) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) + +### Changed + +- **Animated**: Initialize the backend in `NativeAnimatedNodesManagerProvider` ([3f396616d2](https://github.com/facebook/react-native/commit/3f396616d20beaebeb1fa7ab35deebc195bbcd2b) by Bartlomiej Bloniarz) +- **Animated**: Move using declarations into `AnimationBackend` class ([9e98c72ad3](https://github.com/facebook/react-native/commit/9e98c72ad34e0124df4ae846381fbc862d87206c) by [@zeyap](https://github.com/zeyap)) +- **Codegen**: Improve Codegen error when iOS native project not found ([bc3503452f](https://github.com/facebook/react-native/commit/bc3503452f70e1f6917070f3a1b00d75bcd46b3f) by [@vonovak](https://github.com/vonovak)) +- **ESLint**: Bump `eslint-plugin-react-hooks` to 7.0.1 ([28101284a9](https://github.com/facebook/react-native/commit/28101284a92ac0c93f646636423e6edf5e830006) by [@cipolleschi](https://github.com/cipolleschi)) +- **Hermes**: Use Hermes artifacts published independently from React Native ([27bb34c006](https://github.com/facebook/react-native/commit/27bb34c006bb5daaac639d065aaa4c963528814e) by [@j-piasecki](https://github.com/j-piasecki)) +- **Metro**: Metro bump to ^0.83.3 ([89f0a37800](https://github.com/facebook/react-native/commit/89f0a3780066e1d74b0cf45ff65a79534638f157) by [@robhogan](https://github.com/robhogan)) +- **React**: Bump React version to 19.2 ([6f482708b5](https://github.com/facebook/react-native/commit/6f482708b5abd31ec12c18afc874420f06eb22e3) by [@cipolleschi](https://github.com/cipolleschi)) +- **React Native DevTools**: Remove network experiment and experimental icon, Add conditional disabling of features incompatible with multiple hosts ([19359ed095](https://github.com/facebook/react-native/commit/19359ed095059c5d6befcc7e2ff3472447680add) by [@huntie](https://github.com/huntie)) +- **Yoga**: Update copyright header in Yoga CMake file from Facebook to Meta ([118a6621f5](https://github.com/facebook/react-native/commit/118a6621f5c4b15d89505b4dc12f05870c042194) by [@aialok](https://github.com/aialok)) + +#### Android specific + +- **Animated**: [c++ animated] Course correct props at `SurfaceMountingManager.updateProps()` ([dae2f606c7](https://github.com/facebook/react-native/commit/dae2f606c76905de74e76db7b0a20052a5caea46) by [@zeyap](https://github.com/zeyap)) +- **Fast Refresh**: Hot reload banner is now displayed in blue background like on iOS ([4d45e5987c](https://github.com/facebook/react-native/commit/4d45e5987c1d85e5f56ae9501ba74eed48939307) by [@vzaidman](https://github.com/vzaidman)) +- **Font**: Request layout on configuration change only when the font scale has changed ([e02e7b1a29](https://github.com/facebook/react-native/commit/e02e7b1a2943b3ec6e1eb15723c86a8255b100a6) by [@j-piasecki](https://github.com/j-piasecki)) +- **Hermes**: Changed value of `HERMESVM_HEAP_HV_MODE` to `HEAP_HV_PREFER32` for Hermes V1 ([fcb51b1392](https://github.com/facebook/react-native/commit/fcb51b13921dea7ed7d478d6944b52df470e2bef) by [@j-piasecki](https://github.com/j-piasecki)) +- **Kotlin**: Migrated `ReactRoot` to Kotlin ([0b14a19ea6](https://github.com/facebook/react-native/commit/0b14a19ea6f0bfd97fc8d3e3663615feab875d66) by [@sbuggay](https://github.com/sbuggay)) +- **New Architecture**: Runtime check that `NewArchitecture` is enabled in `DefaultNewArchitectureEntryPoint` ([d0d08e4554](https://github.com/facebook/react-native/commit/d0d08e4554c2b3a7676793fe2a43cedcf54b523f) by [@cortinico](https://github.com/cortinico)) +- **React Native DevTools**: Add Log error to discourage usages of `getJSModule(RCTEventEmitter)` API ([aab0d3397c](https://github.com/facebook/react-native/commit/aab0d3397c67bb3e27c3607ff2ed240859b5b039) by [@mdvacca](https://github.com/mdvacca)) +- **Touch Handling**: Defer to responder system to terminate on scroll ([1e1af623b1](https://github.com/facebook/react-native/commit/1e1af623b14f7952c2f39a601098533f899bb464) by [@zeyap](https://github.com/zeyap)) +- **UI**: Split `VirtualViewContainerState` into classic, experimental versions [Android] ([793f99d949](https://github.com/facebook/react-native/commit/793f99d949049c7ab9a7991af0a19010d5444b9f) by [@CalixTang](https://github.com/CalixTang)) + +#### iOS specific + +- **Image**: Use `CGImageSourceCreateImageAtIndex` instead of `CGImageSourceCreateThumbnailAtIndex` to decode full-sized images ([be4fcdafb1](https://github.com/facebook/react-native/commit/be4fcdafb13c2cee702bb120b0feb9b5966ca50e) by [@tsapeta](https://github.com/tsapeta)) +- **Prebuild**: Update logging functions for prebuilds ([f0f8b95719](https://github.com/facebook/react-native/commit/f0f8b957190f2f9bf162528210c41f1437346af9) by [@chrfalch](https://github.com/chrfalch)) + +### Fixed + +- **Animated**: Fix array type parsing in `DynamicEventPayload::extractValue` ([cf5040b4f8](https://github.com/facebook/react-native/commit/cf5040b4f82934c075a72b35d5f2d1d0dfa7aac1) by [@zeyap](https://github.com/zeyap)) +- **Babel**: Invalidate transform cache when `react-native/babel-preset` is Update ([2d2011c7ae](https://github.com/facebook/react-native/commit/2d2011c7ae0145369ad226417e9ecc3bf6df7890) by [@robhogan](https://github.com/robhogan)) +- **Build**: Fixed `hermes-compiler` not being resolved correctly when your repo is set up as a monorepo using pnpm (https://github.com/facebook/react-native/commit/45281ba48fc17508539c0b881327ef8b4bf8e530 by [@tido64](https://github.com/tido64)) +- **Codegen**: Fixed an `ENOENT` exception when a dependency does not export `package.json`, and your repo is set up as a monorepo using pnpm (https://github.com/facebook/react-native/commit/ad5e2680c8e491d89d7544ffb2fff45190cd5ef6 by [@tido64](https://github.com/tido64)) +- **Codegen**: Ensure codegen CLI supports unspecified `--outputPath` argument and respects `codegenConfig.outputDir` configurations (https://github.com/facebook/react-native/commit/f8207d6c757552ddac472aa278d7dd56ad04fb7e by [@kitten](https://github.com/kitten)) +- **Events**: Allow `EventEmitter`s to be optional (for push safety) ([4308185b64](https://github.com/facebook/react-native/commit/4308185b64145f315132865cc69f219bc3299eb3) by Tom Scallon) +- **Fast Refresh**: Only remove the Fast Refresh "Refreshing..." toast when all bundles being loaded finished loading ([92cae27cb2](https://github.com/facebook/react-native/commit/92cae27cb24590e96b01a1dc9547687bafea877b) by [@vzaidman](https://github.com/vzaidman)) +- **FlatList**: The `ItemSeparatorComponent` prop on list components now accepts a React element as well as a component function ([35f6ed1146](https://github.com/facebook/react-native/commit/35f6ed1146fae2c36113f5705230188790a0d70c) by [@huntie](https://github.com/huntie)) +- **Image**: `ResizeMethod` was not propagated correctly on Android with Props 2.0 ([7c543db181](https://github.com/facebook/react-native/commit/7c543db181a0c2dfce46cb26428e7bbc0341945c) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **LogBox**: Fixing an issue with the error LogBox formatting on windows causing text to wrap ([e2b62bc435](https://github.com/facebook/react-native/commit/e2b62bc43549545dfb29e7efad7aaf115cadc1f2) by Gianni Moschini) +- **Renderer**: Avoid data loss during CSS property conversion ([c629019080](https://github.com/facebook/react-native/commit/c62901908088b9c03baffb8903e9b19ba1bc919d) by [@vineethkuttan](https://github.com/vineethkuttan)) +- **Renderer**: Use `size_t` instead of `int` for vector iteration in `cloneMultipleRecursive` ([f9754d3459](https://github.com/facebook/react-native/commit/f9754d34590fe4d988065a92de5d512883de3b33) by Harini Malothu) +- **Renderer**: Fix 9-element (2D) transform matrix conversions ([ce243df972](https://github.com/facebook/react-native/commit/ce243df9725baff265fcd275b420ee78971e75cb) by [@cortinico](https://github.com/cortinico)) +- **Runtime**: [ReactCxxPlatform] Don't crash on reload ([5d65794ee4](https://github.com/facebook/react-native/commit/5d65794ee4fadc135d1c47ccd3bcce36e594ab8d) by [@christophpurrer](https://github.com/christophpurrer)) +- **TypeScript**: Fixed missing type definitions for new DOM APIs in legacy TypeScript types ([05ec7e0ad1](https://github.com/facebook/react-native/commit/05ec7e0ad13cce59e7e3161aa1005392584d6c59) by [@rubennorte](https://github.com/rubennorte)) +- **TypeScript**: Fixed Types in Refresh control ([ed24a4d05b](https://github.com/facebook/react-native/commit/ed24a4d05bb2e1e4a7e32a955777e59e827ebce5) by [@riteshshukla04](https://github.com/riteshshukla04)) +- **TypeScript**: TypeScript types of `positions` in `GradientValue` ([f7ea40bc28](https://github.com/facebook/react-native/commit/f7ea40bc28605fb712910e20d150af0bb9942611) by [@SimpleCreations](https://github.com/SimpleCreations)) +- **Yoga**: Update copyright headers ([0b68dcfac8](https://github.com/facebook/react-native/commit/0b68dcfac80e37423c886cc481a616506351bd81) by [@willspag](https://github.com/willspag)) + +#### Android specific + +- **API**: Correct deprecation message for `ReactContextBaseJavaModule#getCurrentActivity()` ([81bbbe3c45](https://github.com/facebook/react-native/commit/81bbbe3c458628187c078fe2c0ef2b5d13867fe5) by [@vladd-g](https://github.com/vladd-g)) +- **Build**: Fix build failures with `RNGP` due to `AGP` 9.0.0-alpha05 ([69dc655005](https://github.com/facebook/react-native/commit/69dc655005bc20feb119ddeca7f663d2d64a6275) by [@cortinico](https://github.com/cortinico)) +- **Dev Menu**: Fix displaying dev menu items in light mode ([269b0bd877](https://github.com/facebook/react-native/commit/269b0bd877b018e9d54e7b08ab9b4d265daaaef3) by [@coado](https://github.com/coado)) +- **React Native DevTools**: Fix `SoLoader` race condition in `InspectorNetworkRequestListener` ([6c874f25e2](https://github.com/facebook/react-native/commit/6c874f25e20499f6f5a2ccac38b157018e3ccb33) by [@vzaidman](https://github.com/vzaidman)) +- **Hermes**: Read the Hermes V1 opt-in flag from the apps properties when building from source ([813b9441ca](https://github.com/facebook/react-native/commit/813b9441cad3c5bd45ef25f438217281e66dcf65) by [@j-piasecki](https://github.com/j-piasecki)) +- **Permissions**: Fix request permission not always resolving in Android 16 ([39ede95921](https://github.com/facebook/react-native/commit/39ede959211e10032f147d2b0b7af783cba049c8) by [@lukmccall](https://github.com/lukmccall)) +- **Fabric**: Do not crash inside `getEncodedScreenSizeWithoutVerticalInsets` if `SurfaceMountingManager` is null ([f59a6f9508](https://github.com/facebook/react-native/commit/f59a6f9508f92391b26d44854f3da238ccbc5e62) by [@cortinico](https://github.com/cortinico)) +- **Runtime**: Request layout on attached surfaces when font scale changes ([417e068220](https://github.com/facebook/react-native/commit/417e0682203d70bd5ca510f7999a7f6c6990566f) by [@j-piasecki](https://github.com/j-piasecki)) +- **ScrollView**: Controller-driven scroll events now honor paging/snap alignment ([ed75963c0d](https://github.com/facebook/react-native/commit/ed75963c0d14ba0b7c85b0aaed8fe635d60d1b99) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **ScrollView**: Focused scroll into view behaviors for nested vertical scroll views ([26502c6319](https://github.com/facebook/react-native/commit/26502c63193c3f4814af82ca6f8ff4c45abbb76b) by [@rozele](https://github.com/rozele)) +- **ScrollView**: Issue with restarting scroll in `maintainVisibleContentPosition` ([a034841fd6](https://github.com/facebook/react-native/commit/a034841fd68a93778d4999f8bc540cf6a5fef8d4) by [@rozele](https://github.com/rozele)) +- **Text**: Fix text not scaling down when system `fontScale` < 1.0 ([642f086b8c](https://github.com/facebook/react-native/commit/642f086b8ce4088d7f0b3c6453e2bb8c5f75e41b) by [@kdwkr](https://github.com/kdwkr)) +- **View**: Defers focus until View is attached ([9d498f676d](https://github.com/facebook/react-native/commit/9d498f676d96b1c8d3d6c58dc188ea51e88e3474) by [@rozele](https://github.com/rozele)) +- **View**: Resolves an int overflow in `findNextFocusableElement` ([363d297260](https://github.com/facebook/react-native/commit/363d2972608e90abb423f9e0592270978a73fb9f) by [@rozele](https://github.com/rozele)) + +#### iOS specific + +- **ActionSheet**: Apply tint color to Actions sheets buttons ([535efc1403](https://github.com/facebook/react-native/commit/535efc1403e53bde190ce5ddb7ecf97918c5e5fd) by [@cipolleschi](https://github.com/cipolleschi)) +- **ActionSheet**: Revert action sheet behavior not to break apps on iOS 26 ([82d2352b19](https://github.com/facebook/react-native/commit/82d2352b19b5255c74d17efea467bdad2ba93f29) by [@cipolleschi](https://github.com/cipolleschi)) +- **Build**: Fix loading bundle using `debug_http_host` preferences (https://github.com/facebook/react-native/commit/2ac54881f3967346faafa4e5a6bc3b9a68c29e46 by [@coado](https://github.com/coado)) +- **Build**: Fixed copying symbol bundles into correct slice folder (https://github.com/facebook/react-native/commit/2bc6b0083237839b224d5427407d33cab3e2de6b by [@chrfalch](https://github.com/chrfalch)) +- **Codegen**: Fix autolinking-generated `react-native-config` output not being used in `ReactCodegen` script phase due to temp output directory ([c0290329cd](https://github.com/facebook/react-native/commit/c0290329cdb1771ec087c8552049a287c67259c6) by [@kitten](https://github.com/kitten)) +- **DeviceInfo**: Fix `RCTDeviceInfo` crash when `application.delegate.window` is nil in modern iOS app architectures ([968909488a](https://github.com/facebook/react-native/commit/968909488a844c695a92ce000497840e577190dd) by [@25harsh](https://github.com/25harsh)) +- **Events**: Add missing `break;` to `-[RCTViewManager pointerEvents]` ([916e53f845](https://github.com/facebook/react-native/commit/916e53f845cdb438c1bb38590d7743f113eed8f7) by [@NSProgrammer](https://github.com/NSProgrammer)) +- **Events**: Raised the maximum number of pointers tracked at the same time to 17 ([58bd51e7e2](https://github.com/facebook/react-native/commit/58bd51e7e23cbd1f5f0f360587610c9fc70c0d76) by [@j-piasecki](https://github.com/j-piasecki)) +- **Fabric**: Address unexpected warning about "Unbalanced calls start/end for tag 20/19" ([796d182d89](https://github.com/facebook/react-native/commit/796d182d8989ff826eaa3a57458bdfc79750f820) by [@lokshunhung](https://github.com/lokshunhung)) +- **Font**: Make `RCTSetDefaultFontHandler` compatible with the new arch, and add a more powerful version as `RCTSetDefaultFontResolver` ([64b30a9376](https://github.com/facebook/react-native/commit/64b30a937607e436b7979e245c456e7ca45bfd11) by [@javache](https://github.com/javache)) +- **Image**: Images are removed from memory more aggressively to prevent OOMs ([3895831c2b](https://github.com/facebook/react-native/commit/3895831c2bc83faf68223bb2a491e796d2799b24) by [@sammy-SC](https://github.com/sammy-SC)) +- **Image**: Update the `source`property to avoid multiple downloads ([0a71b43fbc](https://github.com/facebook/react-native/commit/0a71b43fbc9d759bb8effd0197031a955687d07a) by [@chrfalch](https://github.com/chrfalch)) +- **Modal**: Modal swipe dismissal works only for the first time ([3a0c402d26](https://github.com/facebook/react-native/commit/3a0c402d26c366126fe7b36b2d504be4f658d68d) by [@okwasniewski](https://github.com/okwasniewski)) +- **Prebuild**: Fix iOS version mismatch when using nightly prebuilds ([790860782e](https://github.com/facebook/react-native/commit/790860782e07c02b3d89742006d9e73fea62bcfc) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- **Prebuild**: Fix using iOS nightly prebuilds in release mode ([19d87c874e](https://github.com/facebook/react-native/commit/19d87c874edb534d3acf5cb6576c6335983b661e) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- **StyleSheet**: `BoxShadow` + overflow hidden combination interfering with pointerEvents and transform scale ([c8e5f9766b](https://github.com/facebook/react-native/commit/c8e5f9766b8caaf66aa61ef48eeab740a10a725a) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) + +## v0.82.1 + +### Fixed + +#### Android specific + +- Fixed representation of transforms when view is originally zero-sized ([a81e94a40c](https://github.com/facebook/react-native/commit/a81e94a40ca8dca9e57b562db21f8f235c5b25a0) by [@javache](https://github.com/javache)) + +#### iOS specific + +- Fixed issue when using gnu coreutils cp command when using precompiled binaries causing compilation error ([068ec39aea](https://github.com/facebook/react-native/commit/068ec39aea543617e5159fe22274b294bfb29026) by [@chrfalch](https://github.com/chrfalch)) + +## v0.82.0 + +### Breaking + +- **Appearance.setColorScheme:** `Appearance.setColorScheme` no longer accepts a nullable value ([a4581ecd8b](https://github.com/facebook/react-native/commit/a4581ecd8b6df5efa44dfe6d43708320209c900b) by [@huntie](https://github.com/huntie)) +- **`CxxSharedModuleWrapper`:** Removed CxxSharedModuleWrapper ([fafbee2402](https://github.com/facebook/react-native/commit/fafbee240235ea0e63eb01abd31ce32d6a576429) by [@javache](https://github.com/javache)) +- **DOM API:** Enable DOM APIs in host component refs ([2ad845ccb2](https://github.com/facebook/react-native/commit/2ad845ccb2fea277e05513dcf41407026a8224f0) by [@rubennorte](https://github.com/rubennorte)) +- **Error Handling:** Unhandled promises are now handled by ExceptionsManager.handleException, instead of being swallowed as Logbox Warnings. ([c4082c9ce2](https://github.com/facebook/react-native/commit/c4082c9ce208a324c2d011823ca2ba432411aafc) by [@krystofwoldrich](https://github.com/krystofwoldrich)) +- **InteractionManager:** InteractionManager has been deprecated and no longer respects interaction handles. Instead, it is now recommended to avoid executing long-running JavaScript tasks by breaking them up into smaller tasks and scheduling them using `requestIdleCallback()`. ([03d9f34a82](https://github.com/facebook/react-native/commit/03d9f34a8252456d389d9f9a3bd04b99a2828c16) by [@yungsters](https://github.com/yungsters)) +- **`shouldEmitW3CPointerEvents`:** Migrate `shouldPressibilityUseW3CPointerEventsForHover` to common private feature flags and remove `shouldEmitW3CPointerEvents` flag. ([fb4587780e](https://github.com/facebook/react-native/commit/fb4587780e8d6111139d73598a9a26ff392dee28) by [@coado](https://github.com/coado)) +- **TurboModuleUtils:** Remove unused ReactCommon/TurboModuleUtils functions #deepCopyJSIObject and #deepCopyJSIArray ([ead669ade3](https://github.com/facebook/react-native/commit/ead669ade31ee703c407f96c0ce98d8f2991bdc8) by [@christophpurrer](https://github.com/christophpurrer)) +- **TurboModules:** Delete old location of CallbackWrapper.h / LongLivedObject.h by ([cb94e71](https://github.com/facebook/react-native/commit/cb94e71845259ae7fa823eb4d21cde74fccd7435) [@christophpurrer](https://github.com/christophpurrer)) + +#### Android specific + +- **Deps:** Gradle to 9.0 ([7f93b664b4](https://github.com/facebook/react-native/commit/7f93b664b41ba11226aae7cca0e7c9b7f38a7d18) by [@cortinico](https://github.com/cortinico)) +- **Image Prefetching:** Android: Image Prefetching send ImageResizeMode as enum value ([e30f34eda6](https://github.com/facebook/react-native/commit/e30f34eda689994cab8cd62aa38175238da8638b) by [@christophpurrer](https://github.com/christophpurrer)) +- **New Architecture:** Remove possibility to newArchEnabled=false in 0.82 ([d5d21d0614](https://github.com/facebook/react-native/commit/d5d21d061493ee973c789a7c6ab8cceebc1f04f9) by [@cortinico](https://github.com/cortinico)) +- **`reactNativeHost`:** Throw Exception if ReactApplication.reactNativeHost is not overriden ([0d3791ca0a](https://github.com/facebook/react-native/commit/0d3791ca0ab30d5a12881c9901f31291b3e998c6) by [@mdvacca](https://github.com/mdvacca)) +- **ViewManagerInterfaces:** Migrate ViewManagerInterfaces to kotlin. Some types in code generated ViewManagerInterfaces might differ. e.g. this will start enforcing nullability in parameters of viewManagerInterface methods (e.g. String commands parameters are not nullable, view params are not nullable in any method, etc) ([79ca9036d3](https://github.com/facebook/react-native/commit/79ca9036d39c16cd115dc0427cb7092f358ac47e) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS Specific +- **New Architecture:** Removed the opt-out from the New Architecture. ([83e6eaf693](https://github.com/facebook/react-native/commit/83e6eaf693f967b7870a5d4896cbb799206a14f0) by [@cipolleschi](https://github.com/cipolleschi)) + +### Added + +- **Animated:** `Animated.CompositeAnimation` is now exposed when using `"react-native-strict-api"` ([024d25794a](https://github.com/facebook/react-native/commit/024d25794a51c94c877c1dfa115a82ebbf559614) by [@huntie](https://github.com/huntie)) +- **Animated:** Allow calling createAnimatedNode without batching ([d9d9a49e18](https://github.com/facebook/react-native/commit/d9d9a49e18f3c51caa18cf7da0a1fcd62f1ecf18) by [@zeyap](https://github.com/zeyap)) +- **Animated:** Allow filter usage with native animated driver. ([138d0eb01d](https://github.com/facebook/react-native/commit/138d0eb01dbe597261459a37d364d1780c3ef228) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **API:** Expose NativeComponentRegistry API as JavaScript root export ([f936780cd5](https://github.com/facebook/react-native/commit/f936780cd5c0c17797f9d2bbc8f5cee81c2eefce) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **API:** Expose `ReactNativeVersion` API as JavaScript root export ([ec5638abd0](https://github.com/facebook/react-native/commit/ec5638abd0e872be62b6ea5d8df9bed6335c2191) by [@huntie](https://github.com/huntie)) +- **Codegen:** Added getDebugProps to codegen ([e547f466ee](https://github.com/facebook/react-native/commit/e547f466ee41415a75ec6b6f910171285ee7bfc3) by [@cipolleschi](https://github.com/cipolleschi)) +- **Hermes V1:** Added a dependency on hermes-compiler ([0caf8e70d5](https://github.com/facebook/react-native/commit/0caf8e70d53f611a73ad9b55879dfe0a5f036371) by [@j-piasecki](https://github.com/j-piasecki)) +- **Pressable:** Allow setting `blockNativeResponder` on Pressable ([6e4d23ded2](https://github.com/facebook/react-native/commit/6e4d23ded2da4a717bafcc032e3d7a0a5fbe3731) by [@zeyap](https://github.com/zeyap)) +- **Yoga/API:** Make yoga/Yoga.h an umbrell header ([8ed2cee80e](https://github.com/facebook/react-native/commit/8ed2cee80e0aaac2f2a6a897ba450888f274a5a4) by [@rudybear](https://github.com/rudybear)) + +#### Android specific + +- **Build Type:** Create a `debugOptimized` `buildType` for Android ([eb2461c7c9](https://github.com/facebook/react-native/commit/eb2461c7c902ebed272bd2d22d6cff4d3c586da6) by [@cortinico](https://github.com/cortinico)) +- **DevMenu:** Add long-press back as an option to open the DevMenu for devices that lack menu & fast-forward. ([32d37f03ad](https://github.com/facebook/react-native/commit/32d37f03ad05290205a4f04d756f6e1880c4ff89) by [@sbuggay](https://github.com/sbuggay)) +- **DevTools:** `DevSupportManager::openDebugger` now supports an optional `panel` param determining the starting panel ([7eb3536728](https://github.com/facebook/react-native/commit/7eb3536728c4a20f7e51245f4f7b64aa505bd799) by [@huntie](https://github.com/huntie)) +- **DevTools:** Adds a landing view parameter to opening RNDT, enabling arbitrary view focus on launch. ([635c707eec](https://github.com/facebook/react-native/commit/635c707eec18f6d2ceceac2dcee9f458f17f8aab) by [@sbuggay](https://github.com/sbuggay)) +- **Hermes V1:** Added opt-in to use the new Hermes ([3e9990f860](https://github.com/facebook/react-native/commit/3e9990f860eb9380837ef431ca02def32c4261ad) by [@j-piasecki](https://github.com/j-piasecki)) +- **HWInput:** Channel up/down hardware events. ([c2a3e4420e](https://github.com/facebook/react-native/commit/c2a3e4420e07147f9a040a665da98dbe22b87a2a) by [@sbuggay](https://github.com/sbuggay)) +- **Manifest:** Add support to specify a single Manifest rather than 2 (main/debug) by using the `usesCleartextTraffic` manifest placeholder which is autoconfigured by RNGP. ([d89acc1596](https://github.com/facebook/react-native/commit/d89acc1596345534882938d2bbf40275a6cb89bd) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- **API:** Add deprecation message for RCTAppdelegate APIs ([d503ea4efc](https://github.com/facebook/react-native/commit/d503ea4efc84b6511cef2a46421a16e044862e88) by [@cipolleschi](https://github.com/cipolleschi)) +- **Fabric:** Add invalidation callback for non-recycled component instances ([dc4a6d2c7e](https://github.com/facebook/react-native/commit/dc4a6d2c7e2ed421b61929896f60b1a864a60d97) by [@kkafar](https://github.com/kkafar)) +- **Hermes V1:** Added opt-in to use the new Hermes ([e9cdc308b4](https://github.com/facebook/react-native/commit/e9cdc308b4c04753d85757e8877ac00c3c687b95) by [@j-piasecki](https://github.com/j-piasecki)) +- **New Architecture:** Add warning if RCT_NEW_ARCH_ENABLED is set to 0 ([7d0bef2f25](https://github.com/facebook/react-native/commit/7d0bef2f25a206d917e7f5cc2b9a6c088f13a832) by [@cipolleschi](https://github.com/cipolleschi)) +- **New Architecture:** Crash the app if they force the legacy architecture. ([dc132a4fd4](https://github.com/facebook/react-native/commit/dc132a4fd4ca8dc28dc7dbb2406ac67dac1a0ee7) by [@cipolleschi](https://github.com/cipolleschi)) + +### Changed + +- **Font:** Enabled `enableFontScaleChangesUpdatingLayout` feature flag by default ([686d14f1d1](https://github.com/facebook/react-native/commit/686d14f1d16c2f02720104ddd395f7d27c908350) by [@j-piasecki](https://github.com/j-piasecki)) +- **Hermes:** Changed names of hermes binaries ([776fca1e7c](https://github.com/facebook/react-native/commit/776fca1e7c978a2d8f817d042836073e4dcb4e0e) by [@j-piasecki](https://github.com/j-piasecki)) +- **Hermes V1:** Changed the source of hermesc binary to be an npm package ([2e0bd13a25](https://github.com/facebook/react-native/commit/2e0bd13a2533fe7ab64125a95b9215b806018c6e) by [@j-piasecki](https://github.com/j-piasecki)) +- **Metro:** Bump Metro to ^0.83.1 ([840fd6c83f](https://github.com/facebook/react-native/commit/840fd6c83f45326a796bf2823f8c2fa942aed06c) by [@robhogan](https://github.com/robhogan)) +- **React:** Bumped React to 19.1.1 ([ec5a98b1f5](https://github.com/facebook/react-native/commit/ec5a98b1f5c2137f5f6ff5f5f6706f20384c44df) by [@cipolleschi](https://github.com/cipolleschi)) +- **Runtime:** CDP backend now accepts `addBinding` and `removeBinding` methods earlier, before a Runtime exists. ([3271e57c75](https://github.com/facebook/react-native/commit/3271e57c751e7d1193c1e9f7b53e545231511b9d) by [@motiz88](https://github.com/motiz88)) +- **Typing:** Update types for Platform.version ([f6ba2dbf3b](https://github.com/facebook/react-native/commit/f6ba2dbf3b4c85da1a7f9079fd366a41b160fa69) by [@riteshshukla04](https://github.com/riteshshukla04)) +- **UIManager:** Avoid unnecessary copy of view props map in UIManager::updateShadowTree ([5b38bb4745](https://github.com/facebook/react-native/commit/5b38bb47457f853c2c3d5f275facbb9fbc150683) by [@zeyap](https://github.com/zeyap)) + +#### Android specific + +- **AGP:** AGP to 8.12.0 ([742ef3d661](https://github.com/facebook/react-native/commit/742ef3d6615c8c1202e9f683e6127ac97d7a9e23) by [@cortinico](https://github.com/cortinico)) +- **DevSupportManager:** DevSupport `openDebugger()` methods now accept a `panel: String?` param. Frameworks directly implementing `DevSupportManager` will need to adjust call signatures. ([9dba7112cf](https://github.com/facebook/react-native/commit/9dba7112cfd09b02300869a77dba3dca16f49a28) by [@huntie](https://github.com/huntie)) +- **Kotlin:** Migrated TextAttributeProps to Kotlin. You might need to update your property access to use camelCase instead of Hungarian notation. ([fa921b3c7b](https://github.com/facebook/react-native/commit/fa921b3c7b289800a79196468f993a0eb0bf693f) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrated ReactBaseTextShadowNode to Kotlin. You might need to update your property access to use camelCase instead of Hungarian notation. ([8ccfff9a46](https://github.com/facebook/react-native/commit/8ccfff9a46f317fd78f478c8b3f180441535d1ca) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrated com.facebook.react.bridge.Arguments to Kotlin. ([2534aeaddb](https://github.com/facebook/react-native/commit/2534aeaddb0490b69dfaba6b8d316616c7e10a9c) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaConfig` to Kotlin ([4d5caef76b](https://github.com/facebook/react-native/commit/4d5caef76b83eb7e983364ecc81abb6027e5f98e) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaValue` to Kotlin ([4340dcbae8](https://github.com/facebook/react-native/commit/4340dcbae8fc41cde844e805a1ebfc23d23d164f) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaNative` to Kotlin ([bc54a06fcb](https://github.com/facebook/react-native/commit/bc54a06fcb5b5d1efd8996d8568733b657fc1b06) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaConfigFactory` to Kotlin ([33ca53d9db](https://github.com/facebook/react-native/commit/33ca53d9dbe53b92d65f82dbd53a2e9f23efd4f3) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `DoNotStrip` to Kotlin ([35d8086881](https://github.com/facebook/react-native/commit/35d8086881fac643b0ebc0d53aaf7e79b7ccd830) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaLayoutType` to Kotlin ([7e461003c6](https://github.com/facebook/react-native/commit/7e461003c6592c8c539960bd5e8169c48dd27f50) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `LayoutPassReason` to Kotlin ([db2a9c089c](https://github.com/facebook/react-native/commit/db2a9c089cd5802d99e0fc86e4dc0dbf7c888307) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaNodeFactory` to Kotlin ([40afa75a7c](https://github.com/facebook/react-native/commit/40afa75a7c816a5581223c7bcd1b65b8713edf47) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaMeasureOutput` to Kotlin ([453508ada8](https://github.com/facebook/react-native/commit/453508ada837554455733e3ca94440a7143f51b1) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaMeasureFunction` to Kotlin ([05eddd354e](https://github.com/facebook/react-native/commit/05eddd354e2e80ad3c95ed5a2199a59a77317891) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaStyleInputs` to Kotlin ([001736000f](https://github.com/facebook/react-native/commit/001736000f69ce98db86c17707408bbf3f0ae9a5) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaBaselineFunction` to Kotlin ([a2eb3b299d](https://github.com/facebook/react-native/commit/a2eb3b299dddea60c510821b662dfed55b334df7) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Kotlin:** Migrate `YogaLogger` to Kotlin ([9c9a39b58e](https://github.com/facebook/react-native/commit/9c9a39b58e12bc734c27a5d9306e792b0dcaf927) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **OnBatchCompleteListener:** Make OnBatchCompleteListener interface internal ([046ff8e58b](https://github.com/facebook/react-native/commit/046ff8e58bed5da0f19adc860b327c7248b19f48) by [@cortinico](https://github.com/cortinico)) +- **ReactSurface:** Changed return type of ReactSurfaceImpl.view to ReactSurfaceView to align with parameter recived by ReactSurfaceImpl.attachView() ([41029d8e91](https://github.com/facebook/react-native/commit/41029d8e91492c34c377374b442b31755874618c) by [@mdvacca](https://github.com/mdvacca)) +- **TextAttributeProps:** Deprecate the field `TextAttributeProps.effectiveLineHeight`. This field was public but never used in OSS. ([ede037ade7](https://github.com/facebook/react-native/commit/ede037ade795bd44725f9bd82cace193a74aa68d) by [@cortinico](https://github.com/cortinico)) +- **ViewManagers:** Changed method arguments names for Core ViewManagers to match the names of ViewManagerInterfaces ([e7d9e0d197](https://github.com/facebook/react-native/commit/e7d9e0d1977c136a85b9a78ef36a258631d1e9ba) by [@mdvacca](https://github.com/mdvacca)) + +### Deprecated + +- **APIs:** Deprecate legacy javascript react native apis ([e7aeea26bd](https://github.com/facebook/react-native/commit/e7aeea26bde6e9cda0a3a0a55fc2a0421fb0c0e5) by [@RSNara](https://github.com/RSNara)) +- **StyleSheet:** `StyleSheet.absoluteFillObject` is deprecated in favor of `StyleSheet.absoluteFill` (equivalent). ([83e19813ff](https://github.com/facebook/react-native/commit/83e19813ff5498ab3497d97fe38dba63a5554425) by [@huntie](https://github.com/huntie)) +- Deprecate all the c++ classes not used by interop, or the new architecture. ([9539cd2626](https://github.com/facebook/react-native/commit/9539cd26261aef646379104833c7f719e3d83d02) by [@RSNara](https://github.com/RSNara)) + +#### Android specific + +- **DevMenu:** Remove bridge mode string from React Native Dev Menu title ([1c838f32a9](https://github.com/facebook/react-native/commit/1c838f32a9bcee3867ec0502b344889308302f26) by [@sbuggay](https://github.com/sbuggay)) +- **New Architecture:** DefaultDevSupportManagerFactory.create() method used for Old Arch ([026e22bb8d](https://github.com/facebook/react-native/commit/026e22bb8d7b38b3bd66ffcc7d4ee446adfee943) by [@cortinico](https://github.com/cortinico)) +- **New Architecture:** Deprecate `BridgelessReactContext.getCatalystInstance()` method ([4583fbe052](https://github.com/facebook/react-native/commit/4583fbe052924df1ad030e51ad80e8d754a4c5a4) by [@cortinico](https://github.com/cortinico)) +- **New Architecture:** Deprecate legacy architecture classes ReactInstanceManager and ReactInstanceManagerBuilder, these classes will be deleted in a future release ([fb84932e48](https://github.com/facebook/react-native/commit/fb84932e4894a45c0a2725e1d665acdf7bcea435) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Depreacate `CoreModulesPackage` and `NativeModuleRegistryBuilder` legacy architecture classes, these classes unused in the new architecture and will be deleted in the future ([d3bbbd893a](https://github.com/facebook/react-native/commit/d3bbbd893acd500237ab4e1778c6a2e0fe1948a9) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate Legacy Architecture ViewManagers, these classes are not used as part of the new architecture and will be deleted in the future ([da74d5da2c](https://github.com/facebook/react-native/commit/da74d5da2cac5306e37368c65490c434e7ff9f4f) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate LegacyArchitecture ShadowNode classes included in React Native ([07091a9ae8](https://github.com/facebook/react-native/commit/07091a9ae8d70a601d969d9def4952563d3b7bcf) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Depreacte all LegacyArchitecture classes from the bridge package ([c1f7c5e321](https://github.com/facebook/react-native/commit/c1f7c5e3217a7e8a77a859652aadff2a41e3ea58) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate LegacyArchitecture class UIManagerProvider ([b29b86f275](https://github.com/facebook/react-native/commit/b29b86f27553eac50daa18ffb6bca07be3f24f25) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate BridgeDevSupportManager and JSInstance ([25c011eb4d](https://github.com/facebook/react-native/commit/25c011eb4d403040b57e338bec704769de20793c) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate NativeModuleRegistry Legacy Architecture class ([22e4c25211](https://github.com/facebook/react-native/commit/22e4c252116da1a6658b15a84720e0ee314dddd6) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate subset of LegacyArchitecture classes in com/facebook/react/bridge ([78a3ff81eb](https://github.com/facebook/react-native/commit/78a3ff81eb38ae26fb15106580de841477897101) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate LegacyArchitecture class FrescoBasedReactTextInlineImageShadowNode ([25f466cc4d](https://github.com/facebook/react-native/commit/25f466cc4dd28c962b967475c04c284d26efb722) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate Legacy Architecture class CallbackImpl ([718126fcf0](https://github.com/facebook/react-native/commit/718126fcf0296969ee659c31fae51b4317c896d3) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate LegacyArchitecture class JavaMethodWrapper ([19a99dd088](https://github.com/facebook/react-native/commit/19a99dd0882d786daea3db486fd3aed3c10419b5) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate Legacy Architecture ShadowNode classes ([c4715886a9](https://github.com/facebook/react-native/commit/c4715886a917eb3eb63aab366de5225090dff5a1) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate LegacyArchitecture UIManagerModules class ([85610c8b43](https://github.com/facebook/react-native/commit/85610c8b43ea132154cddcfed973ee6ceb3e55b3) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate LegacyArchitecture classes from com/facebook/react/uimanager ([7f5b2b8f84](https://github.com/facebook/react-native/commit/7f5b2b8f84d7941891a447978c6adc17929ef87f) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate LegacyArchitecture classes from package com.facebook.react.uimanager ([39d24bade3](https://github.com/facebook/react-native/commit/39d24bade317920544a3715e3a1f131663d8cded) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** Deprecate LegacyArchitecture classes from LayoutAnimation package ([f67078df07](https://github.com/facebook/react-native/commit/f67078df07b6c9ad995eb43ff47fc4a43bb2eaee) by [@mdvacca](https://github.com/mdvacca)) +- **New Architecture:** ReactPackageLogger is not supported in the new architecture and being deprecated ([65671108f6](https://github.com/facebook/react-native/commit/65671108f69d9b23a011841102e4141293581d9c) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- **DevMenu:** Remove bridge mode title and description from React Native Dev Menu title ([775daf5972](https://github.com/facebook/react-native/commit/775daf597280db94354ed484f2ce81690f1eb7b0) by [@sbuggay](https://github.com/sbuggay)) +- **New Architecture:** Deprecate all the objc classes not used by interop, or the new architecture. ([70f53ac4ea](https://github.com/facebook/react-native/commit/70f53ac4ea144020560906f5931e480ed4dee87c) by [@RSNara](https://github.com/RSNara)) + +### Removed + +- **New Architecture:** Core: Remove legacy components ([9c8a4c2297](https://github.com/facebook/react-native/commit/9c8a4c22973c7ce6fcf6b5d22c6d5fd4c6dc0d92) by [@RSNara](https://github.com/RSNara)) + +#### Android specific + +- **DefaultReactHost:** Delete unused `DefaultReactHost.getDefaultReactHost()` overload ([d35ddb5e59](https://github.com/facebook/react-native/commit/d35ddb5e59a8cb990dd61a154a8e15e9542f8b15) by [@cortinico](https://github.com/cortinico)) +- **DefaultReactHost:** Remove deprecated DefaultReactHost.getDefaultReactHost() overload - part 2 ([bda6acf3b0](https://github.com/facebook/react-native/commit/bda6acf3b08779c0dae7bdadbc9913eea79acd0d) by [@cortinico](https://github.com/cortinico)) +- **DefaultReactHost:** Remove deprecated DefaultReactHost.getDefaultReactHost() overload - part 1 ([474f455a75](https://github.com/facebook/react-native/commit/474f455a7591049382da0d0308ddd21589f0cc7e) by [@cortinico](https://github.com/cortinico)) +- **Inspector:** Removed unused `Inspector` public class from React Android ([cf528526cc](https://github.com/facebook/react-native/commit/cf528526cc375f1003125cf63f66fbd88790ceae) by [@cortinico](https://github.com/cortinico)) +- **JSONArguments:** Remove the `com.facebook.react.bridge.JSONArguments` class ([04ae15d99b](https://github.com/facebook/react-native/commit/04ae15d99bb2ee6f7987bbe8c3d7acfdd46a482f) by [@cortinico](https://github.com/cortinico)) +- **MessageQueueThreadPerfStats:** Deprecated MessageQueueThreadPerfStats API and replaced with stub. ([3bf5cb3d0e](https://github.com/facebook/react-native/commit/3bf5cb3d0e7d9d1749ef19a8392b9bbd3ec7ab7d) by [@javache](https://github.com/javache)) + +### Fixed + +- **Accessibility:** Fix for setting the default value for accessibility props ([586f5ba89c](https://github.com/facebook/react-native/commit/586f5ba89cc20a81a9e2d5d0f2708e9cd1b440c0) by Vineeth K) +- **Accessibility:** `aria-hidden` support for `Text`, non-editable `TextInput` and `Image` ([0f39fc3000](https://github.com/facebook/react-native/commit/0f39fc3000411a43711814e0ab9cca1f7093b625) by [@mdjastrzebski](https://github.com/mdjastrzebski)) +- **Build:** Fixed babel plugin validation error when coverage instrumentation is enabled ([191ddc1ec7](https://github.com/facebook/react-native/commit/191ddc1ec72be6641ebb8b9cb729cf0e142fff55) by Umar Mohammad) +- **Casting:** Casting rawValue to int was incorrectly truncating ([31b9f10364](https://github.com/facebook/react-native/commit/31b9f103645e67586bdfc5c2f590c28c04ca3871) by [@javache](https://github.com/javache)) +- **Codegen:** Help Codegen find library's package.json if some libraries using `exports` field in their package.json file and the `./package.json` subpath is not explicitly defined ([739dfd2141](https://github.com/facebook/react-native/commit/739dfd2141015a8126448bda64a559f5bf22672e) by [@RakaDoank](https://github.com/RakaDoank)) +- **Hermes:** Change leftover references to `hermes.framework` to `hermesvm.framework` ([7f051c5470](https://github.com/facebook/react-native/commit/7f051c54701b3585f76f63846abbf7e68e2688d2) by [@j-piasecki](https://github.com/j-piasecki)) +- **Hermes V1:** Fixed coordinates for Hermes V1 artifacts ([674fb77d93](https://github.com/facebook/react-native/commit/674fb77d93dfe67a5fe90449dc71b195b1851e13) by [@j-piasecki](https://github.com/j-piasecki)) +- **Performance Panel:** Fix typo in Performance.js type checking condition ([6caf2dfa38](https://github.com/facebook/react-native/commit/6caf2dfa382fd4f1184b8d21b030c36687a256e4) by [@YangJonghun](https://github.com/YangJonghun)) +- **Performance Panel:** Add default cases to switch statements in headers ([323fe3a5d4](https://github.com/facebook/react-native/commit/323fe3a5d471ae5a2f94d5c2bd13cc97feffe0a5) by [@NSProgrammer](https://github.com/NSProgrammer)) +- **ReactCommon:** Bring back ContextContainer::Shared = std::shared_ptr alias ([daeb6e99ab](https://github.com/facebook/react-native/commit/daeb6e99abbca2b6395a9a703d2b0bb9e5091fb7) by [@christophpurrer](https://github.com/christophpurrer)) +- **ReactCommon:** Bring back SharedImageManager = std::shared_ptr alias ([4718b35259](https://github.com/facebook/react-native/commit/4718b35259135b3503033a0061ae84e15d4eb450) by [@christophpurrer](https://github.com/christophpurrer)) +- **ReactCommon:** Fixed Type Conversion Error in DynamicEventPayload ([ff38d59cff](https://github.com/facebook/react-native/commit/ff38d59cff92e0a50f0dd70384fbc4dd11d969c4) by Harini Malothu) +- **ReactCommon:** Fixed Type Conversion Error in CSSHexColor ([2ca88a0069](https://github.com/facebook/react-native/commit/2ca88a0069969bf115da6f0ea9f2fbbae9c9226c) by [@anupriya13](https://github.com/anupriya13)) +- **TestCallInvoker:** Fix memory leak in TestCallInvoker ([9f2fbc23e4](https://github.com/facebook/react-native/commit/9f2fbc23e48af9be56b3729d514fbb3fff4ba376) by [@christophpurrer](https://github.com/christophpurrer)) + +#### Android specific + +- **Accessability:** Stabilize custom accessibility action IDs to prevent "incompatible action" errors in TalkBack. ([626568f9a3](https://github.com/facebook/react-native/commit/626568f9a3f956a52f6c55df1dc3bc5cd017e353) by [@leg234-png](https://github.com/leg234-png)) +- **Build From Source:** Fix build from source due to missing folder error on Gradle 9.0 ([9fbce3eff1](https://github.com/facebook/react-native/commit/9fbce3eff18060f16e796badc415ba733ede19af) by [@cortinico](https://github.com/cortinico)) +- **Determinism:** Turned off build IDs for native libraries, fixing issues with reproducibility ([4b8dbe7642](https://github.com/facebook/react-native/commit/4b8dbe7642be53d0ccfc68ca8c9b3f5e750a68c0) by [@Rexogamer](https://github.com/Rexogamer)) +- **DevTools:** Fix stack trace linkifying failing when using Android emulator and other situations where the device and debugger have different bundle urls ([794df48ad6](https://github.com/facebook/react-native/commit/794df48ad6a259022e66de1a38ff54b5ec67c3e4) by [@vzaidman](https://github.com/vzaidman)) +- **Edge to Edge:** Fix `Dimensions` `window` values on Android < 15 when edge-to-edge is enabled ([3b185e4bce](https://github.com/facebook/react-native/commit/3b185e4bcef24e0689cccd4cf250d469b114d4da) by [@zoontek](https://github.com/zoontek)) +- **Fonts:** Update font scale when recreating `RootView` ([5cda3065ce](https://github.com/facebook/react-native/commit/5cda3065ce635460a7458cbab5c10e24bea3bfe2) by [@j-piasecki](https://github.com/j-piasecki)) +- **Fonts:** Fix incorrect positioning of inline view at the end of string when RTL text in LTR container ([7f224941bb](https://github.com/facebook/react-native/commit/7f224941bb807919b487d8e1634dd2124f9258b8) by [@NickGerleman](https://github.com/NickGerleman)) +- **Hermes V1:** Changed the coordinates of hermes artifacts when using Hermes V1 ([d0fb33822d](https://github.com/facebook/react-native/commit/d0fb33822de38183895c8b3421f46966909beaf3) by [@j-piasecki](https://github.com/j-piasecki)) +- **Locale:** Use the first available locale instead of the default one to decide `isDevicePreferredLanguageRTL` ([a03780d279](https://github.com/facebook/react-native/commit/a03780d279d0944e0dcbbf5a93680775006598b0) by Kaining Zhong) +- **New Architecture:** Correctly account for insets on first render of Modals on New Arch ([2e76fc8e8e](https://github.com/facebook/react-native/commit/2e76fc8e8ea01fbce5bd131f675364e688f49088) by [@cortinico](https://github.com/cortinico)) +- **Performance:** Fix mounting is very slow on Android by shipping native transform optimizations ([c557311ed8](https://github.com/facebook/react-native/commit/c557311ed836cded8548c5bca32f3eded0abc7ff) by [@cortinico](https://github.com/cortinico)) +- **Scroll:** Fixed an issue where shadow tree and native tree layouts mismatch at the end of a scroll event ([1828c53f85](https://github.com/facebook/react-native/commit/1828c53f85faf599a485b3859f8b62586696265f) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **Start up:** Fix wrong default for `jsBundleAssetPath` on `DefaultReactHost` ([2246e2b82c](https://github.com/facebook/react-native/commit/2246e2b82cf0c433f9a9b385ea98e532c6f322c6) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- **Build:** Fixed using USE_FRAMEWORKS (static/dynamic) with precompiled binaries ([e723ca4d6b](https://github.com/facebook/react-native/commit/e723ca4d6b86d5a98449498395c700513ceba555) by [@chrfalch](https://github.com/chrfalch)) +- **Build:** Non-UTF8 crashes Info.plist local frameworks ([91e69b5d4c](https://github.com/facebook/react-native/commit/91e69b5d4c768278680a8d9ae979bc267624ce98) by [@philipheinser](https://github.com/philipheinser)) +- **Build:** Fixed variable naming error in `set_fast_float_config` method in `react_native_pods.rb` ([327057fad5](https://github.com/facebook/react-native/commit/327057fad5c78a95e6c039bfe380d78672e83a43) by [@eliotfallon213](https://github.com/eliotfallon213)) +- **Build:** Fix pure cocoapods dynamic framework build ([aa4555eaf1](https://github.com/facebook/react-native/commit/aa4555eaf1b6aab83660c600e867fa6c2da4128e) by [@cipolleschi](https://github.com/cipolleschi)) +- **Codegen:** Fix regression that skips artifacts code generation ([f6f5ea0b2e](https://github.com/facebook/react-native/commit/f6f5ea0b2eed894725d8f6e8bd045c99c3182026) by [@kitten](https://github.com/kitten)) +- **Native Modules:** Fix concurrent calls into resolve/reject inside native modules ([dc879950d1](https://github.com/facebook/react-native/commit/dc879950d196dfd429229f1c4c8e743ef1799d11) by [@RSNara](https://github.com/RSNara)) +- **New Architecture:** Fix overriding (xc)framework Info.plist files with RCTNewArchEnabled field ([f84514a88b](https://github.com/facebook/react-native/commit/f84514a88be00f8dcae7972f84aa89d829392a58) by [@msynowski](https://github.com/msynowski)) +- **Prebuild:** Fix Node scripts related to prebuilt tarball extraction for paths containing whitespaces ([9731e8ebc5](https://github.com/facebook/react-native/commit/9731e8ebc5ea87526a91b9903172639e062cd920) by [@kitten](https://github.com/kitten)) +- **Prebuild:** Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source ([f170db412b](https://github.com/facebook/react-native/commit/f170db412b3ab46fd0894d5d66431d9c230cd3a8) by [@kitten](https://github.com/kitten)) +- **RCTAlertController:** Simplify RCTAlertController, don't create additional UIWindow ([05c4321b19](https://github.com/facebook/react-native/commit/05c4321b194c3d0e146b6085bcaccc75acd3fd67) by [@okwasniewski](https://github.com/okwasniewski)) +- **RCTPullToRefreshViewComponentView:** Properly initialize the `RCTPullToRefreshViewComponentView` ([27217e8bd6](https://github.com/facebook/react-native/commit/27217e8bd601757b5db6efc022db428b552a2aa4) by [@cipolleschi](https://github.com/cipolleschi)) +- **RCTReactNativeFactory:** Ask the delegate for `getModuleForClass` and `getModuleInstanceFromClass` ([85b47afb48](https://github.com/facebook/react-native/commit/85b47afb48e50b036d2c2c79a008f571d3bfcb43) by [@cipolleschi](https://github.com/cipolleschi)) +- **ScrollView:** Correctly propagate `ScrollView` props to `RefreshControl` ([09daad27ea](https://github.com/facebook/react-native/commit/09daad27ea22b83fab65176ea3c7f5f1488ba408) by [@cipolleschi](https://github.com/cipolleschi)) +- **ScrollView:** Make sure that `ScrollView` recycled refresh control have the right props setup. ([21b93d8d7d](https://github.com/facebook/react-native/commit/21b93d8d7d46a26f728df19764f85a8aebf318bb) by [@cipolleschi](https://github.com/cipolleschi)) +- **Switch:** Fixed a crash when rendering the `Switch` component ([28275a0f7b](https://github.com/facebook/react-native/commit/28275a0f7b182a215010d47fb841d9c2c36bb24c) by [@cipolleschi](https://github.com/cipolleschi)) +- **Switch:** Fix Switch layout to work with iOS26 ([91d427fe52](https://github.com/facebook/react-native/commit/91d427fe52a307f9aa8579912ef956d61808dad2) by [@cipolleschi](https://github.com/cipolleschi)) +- **Text:** Fix selectable prop not working correctly ([f004cd39bc](https://github.com/facebook/react-native/commit/f004cd39bc4b632006085cbcf61df52bc5d25242) by [@iamAbhi-916](https://github.com/iamAbhi-916)) +- **TextInput:** Update TextInput recycling logic to clean up the `inputAccessoryView` dependency. ([eb08f54594](https://github.com/facebook/react-native/commit/eb08f545948de9e2eca91ab3cb7569670c553b15) by [@ArturKalach](https://github.com/ArturKalach)) +- **TextInput:** Fixed TextInput behavior when `maxLength={null}` is passed ([56ad53cb14](https://github.com/facebook/react-native/commit/56ad53cb14b5c842714fcf976b6ba81f68c140f2) by [@cipolleschi](https://github.com/cipolleschi)) +- **View:** Inline `View` alignment with `lineHeight` in Text ([6da351a5ed](https://github.com/facebook/react-native/commit/6da351a5ed80a10138a5558afcb380410c8a93c9) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) + +### Security + +- **Network:** Fixed vulnerability on undici and on-headers ([dd00c9055a](https://github.com/facebook/react-native/commit/dd00c9055a8f0c9ceac1716385a8a9874f7a4c2e) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.81.5 + +### Fixed + +- Fixed switch ([4106d54a6d](https://github.com/facebook/react-native/commit/4106d54a6ddacbb784fc8335e9a82054f51a2d02) by [@cipolleschi](https://github.com/cipolleschi)) + +#### Android specific + +- Fix request permission not always resolving in Android 16 ([39ede95921](https://github.com/facebook/react-native/commit/39ede959211e10032f147d2b0b7af783cba049c8) by [@lukmccall](https://github.com/lukmccall)) + +#### iOS specific + +- Fix RCTDeviceInfo crash when application.delegate.window is nil in modern iOS app architectures ([968909488a](https://github.com/facebook/react-native/commit/968909488a844c695a92ce000497840e577190dd) by [@25harsh](https://github.com/25harsh)) + +## v0.81.4 + +### Fixed + +#### iOS specific + +- Fix regression that skips artifacts code generation ([f6f5ea0b2e](https://github.com/facebook/react-native/commit/f6f5ea0b2eed894725d8f6e8bd045c99c3182026) by [@kitten](https://github.com/kitten)) +- Reapplied "Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source" ([bb73315a3f](https://github.com/facebook/react-native/commit/bb73315a3fd8cd203c4ddb3ffa10bfec307c7e92) by [@kitten](https://github.com/kitten)) + +## v0.81.3 + +### Fixed + +#### iOS specific + +- Reverted "Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source" ([537e3ad930](https://github.com/facebook/react-native/commit/537e3ad93041c0cef959f0d20586fe97818900a6) by [@gabrieldonadel](https://github.com/gabrieldonadel)) + +## v0.81.2 + +### Added + +#### Android specific + +- Create a debugOptimized buildType for Android ([5e3edafec6](https://github.com/facebook/react-native/commit/5e3edafec6c69558521061dced7a6bcd046576b0) by [@cortinico](https://github.com/cortinico)) +- Add `useNativeEqualsInNativeReadableArrayAndroid` and `useNativeTransformHelperAndroid` feature flag to the experimental channel. This should alleviate some of the perf issue users are seeing on Android + Reanimated + NewArch on 0.81([a346096da8](https://github.com/facebook/react-native/commit/a346096da81fccf5fbc82d83bfc128695e6ec3a5) by [@cortinico](https://github.com/cortinico)) + +### Fixed + +#### iOS specific + +- Fix Node scripts related to prebuilt tarball extraction for paths containing whitespaces ([366f2ad505](https://github.com/facebook/react-native/commit/366f2ad5057ffecc1f5b211f6aae29567ae6b7e5) by [@kitten](https://github.com/kitten)) +- Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source ([a2eb29e5e7](https://github.com/facebook/react-native/commit/a2eb29e5e7aef8bbdf4c647c8467b5292b013b20) by [@kitten](https://github.com/kitten)) + +## v0.81.1 + +### Added + + +#### iOS specific + +- **Prebuild:** Added setting SWIFT_ENABLE_EXPLICIT_MODULES=NO when using precompiled to support Xcode 26 ([939a75b5ce](https://github.com/facebook/react-native/commit/939a75b5ce2a580ece4a62689582ea81480c3e97) by [@chrfalch](https://github.com/chrfalch)) + +### Fixed + +- **Infra:** Add missing Babel dependencies ([bf2c3af93b](https://github.com/facebook/react-native/commit/bf2c3af93b146943cb35866fa9badcd188e63f5b) by [@tido64](https://github.com/tido64)) +- **Accessibility:** fix `aria-label` on `TextInput` ([6965d57e75](https://github.com/facebook/react-native/commit/6965d57e75ed0cf9f265c6020d478ddb9af4bf10) by [@mdjastrzebski](https://github.com/mdjastrzebski)) + +#### iOS specific + +- **TextInput:** Setting maxLength to 0 in TextInput now correctly blocks typing ([c5956da8c0](https://github.com/facebook/react-native/commit/c5956da8c0b735d47761af51019ed25b49001c00) by [@riteshshukla04](https://github.com/riteshshukla04)) +- **Switch:** Fix Switch layout to work with iOS 26 ([ba51aeaa90](https://github.com/facebook/react-native/commit/ba51aeaa9040014e1d77c93158c96e9bf09940cf) by [@cipolleschi](https://github.com/cipolleschi)) +- **C++:** Fix import RuntimeExecutor.h with USE_FRAMEWORKS ([dacd8f26fd](https://github.com/facebook/react-native/commit/dacd8f26fda61b16b52a4953267f2108181c3282) by [@sharifhh](https://github.com/sharifhh)) +- **Infra:** Fix scripts for paths containing whitespaces ([94623ca8ec](https://github.com/facebook/react-native/commit/94623ca8ec969f09d8ec430e7633c3bf49a3d71e) by [@kitten](https://github.com/kitten)) +- **Prebuild:** Fixed how we copy and build the Symbols folder when precompiling ReactNativeDependencies ([a843119ff1](https://github.com/facebook/react-native/commit/a843119ff1f0e2dfb1d3884ccf255784e3cea1a7) by [@chrfalch](https://github.com/chrfalch)) +- **Prebuild:** Fixed wrong jsi symbols in use when using React.xcframework ([8a2e7efe01](https://github.com/facebook/react-native/commit/8a2e7efe010c49a293c146654094b1cb5d6e6acd) by [@chrfalch](https://github.com/chrfalch)) +- **Prebuild:** Fixed copying bundles correctly to xcframeworks when precompiling ReactNativeDependencies.xcframework ([e3adf47214](https://github.com/facebook/react-native/commit/e3adf4721467557f19e6cd7a65c4e2314796bc17) by [@chrfalch](https://github.com/chrfalch)) +- **Prebuild:** Aligned Symbols folder in React.xcframework symbols with ReactNativeDependencies.xcframework symbols. ([8c444f773a](https://github.com/facebook/react-native/commit/8c444f773a44e8554745c9cfc1451083c12b00e3) by [@chrfalch](https://github.com/chrfalch)) +- **Prebuild:** Fix "file exists" error in `ReactNativeDependencies.podspec` ([4c570b5d31](https://github.com/facebook/react-native/commit/4c570b5d31ef46e04e5fa26fa92d7f7090bf15e2) by [@vonovak](https://github.com/vonovak)) +- **Prebuild:** added explicit handling of ReactCodegen ([6526a98d68](https://github.com/facebook/react-native/commit/6526a98d68dbc8578ea15cbf117c0a216c6e9af0) by [@cipolleschi](https://github.com/cipolleschi)) + ## v0.81.0 ### Breaking @@ -554,6 +1178,10 @@ - **Text:** Selection range not respected when changing text or selection when selection is forced ([d32ea66e6a](https://github.com/facebook/react-native/commit/d32ea66e6a945dd84092532401b265b12d482668) by Olivier Bouillet) - **TextInput:** Fix TextInput `onContentSizeChange` event being dispatched only once on iOS on the new architecture ([5fd5188172](https://github.com/facebook/react-native/commit/5fd51881727b2d86f87abf04db032940ac0ec8c4) by [@j-piasecki](https://github.com/j-piasecki)) +## v0.79.7 + +See [CHANGELOG-0.7x](./CHANGELOG-0.7x.md#v0797) + ## v0.79.6 See [CHANGELOG-0.7x](./CHANGELOG-0.7x.md#v0796) diff --git a/README.md b/README.md index 502b38bcd2a4..b4280bb6abd8 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,13 @@ Current npm package version. - PRs welcome! + PRs are welcome! - Follow @reactnative + Follow @reactnative on X + + + Follow @reactnative.dev on Bluesky

diff --git a/build.gradle.kts b/build.gradle.kts index 866560d63884..2154d20f22ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -104,39 +104,70 @@ tasks.register("build") { tasks.register("publishAllToMavenTempLocal") { description = "Publish all the artifacts to be available inside a Maven Local repository on /tmp." dependsOn(":packages:react-native:ReactAndroid:publishAllPublicationsToMavenTempLocalRepository") - // We don't publish the external-artifacts to Maven Local as ci is using it via workspace. - dependsOn( - ":packages:react-native:ReactAndroid:hermes-engine:publishAllPublicationsToMavenTempLocalRepository" - ) } tasks.register("publishAndroidToSonatype") { description = "Publish the Android artifacts to Sonatype (Maven Central or Snapshot repository)" dependsOn(":packages:react-native:ReactAndroid:publishToSonatype") - dependsOn(":packages:react-native:ReactAndroid:hermes-engine:publishToSonatype") } -if (project.findProperty("react.internal.useHermesNightly")?.toString()?.toBoolean() == true) { +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") + hermesVersionPropertiesFile.inputStream().use { hermesVersions.load(it) } + val selectedHermesVersion = hermesVersions["HERMES_V1_VERSION_NAME"] as String + + hermesSubstitution = selectedHermesVersion to "Users opted to use stable hermes release" +} else if ( + project.findProperty("react.internal.useHermesNightly")?.toString()?.toBoolean() == true +) { + val reactNativePackageJson = File("./packages/react-native/package.json") + val reactNativePackageJsonContent = reactNativePackageJson.readText() + val packageJson = groovy.json.JsonSlurper().parseText(reactNativePackageJsonContent) as Map<*, *> + + val hermesCompilerVersion = + (packageJson["dependencies"] as Map<*, *>)["hermes-compiler"] as String + + if (hermesCompilerVersion == "0.0.0") { + throw RuntimeException( + "Trying to use Hermes Nightly but hermes-compiler version is not specified" + ) + } + + hermesSubstitution = "$hermesCompilerVersion-SNAPSHOT" to "Users opted to use hermes nightly" +} else { logger.warn( """ ******************************************************************************** - INFO: You're using Hermes from nightly as you set + INFO: You're building Hermes from source as you set - react.internal.useHermesNightly=true + react.internal.useHermesStable=false + react.internal.useHermesNightly=false in the ./gradle.properties file. That's fine for local development, but you should not commit this change. ******************************************************************************** - """ + """ .trimIndent() ) +} + +if (hermesSubstitution != null) { + val (hermesVersion, reason) = hermesSubstitution!! + project(":packages:react-native:ReactAndroid:hermes-engine") { + tasks.configureEach { enabled = false } + } + allprojects { configurations.all { resolutionStrategy.dependencySubstitution { substitute(project(":packages:react-native:ReactAndroid:hermes-engine")) - .using(module("com.facebook.react:hermes-android:0.+")) - .because("Users opted to use hermes from nightly") + .using(module("com.facebook.hermes:hermes-android:$hermesVersion")) + .because(reason) } } } diff --git a/flow-typed/environment/node.js b/flow-typed/environment/node.js index 7969e444e116..47c30518aa42 100644 --- a/flow-typed/environment/node.js +++ b/flow-typed/environment/node.js @@ -21,6 +21,12 @@ interface ErrnoError extends Error { syscall?: string; } +type Node$Conditional = T extends true + ? IfTrue + : T extends false + ? IfFalse + : IfTrue | IfFalse; + type buffer$NonBufferEncoding = | 'hex' | 'HEX' @@ -192,18 +198,33 @@ declare type Node$Buffer = typeof Buffer; declare module 'buffer' { declare var kMaxLength: number; declare var INSPECT_MAX_BYTES: number; + + declare var constants: Readonly<{ + MAX_LENGTH: number, + MAX_STRING_LENGTH: number, + }>; + declare function transcode( source: Node$Buffer, fromEnc: buffer$Encoding, toEnc: buffer$Encoding, ): Node$Buffer; + + declare function isUtf8(input: Buffer | ArrayBuffer | $TypedArray): boolean; + + declare function isAscii(input: Buffer | ArrayBuffer | $TypedArray): boolean; + + declare function resolveObjectURL(id: string): Blob | void; + declare var Buffer: Node$Buffer; + declare var Blob: typeof globalThis.Blob; + declare var File: typeof globalThis.File; } -type child_process$execOpts = { +type child_process$execOpts = Readonly<{ cwd?: string, - env?: Object, - encoding?: string, + env?: Readonly<{[key: string]: string | number | void}>, + encoding?: buffer$NonBufferEncoding | 'buffer' | string, shell?: string, timeout?: number, maxBuffer?: number, @@ -211,8 +232,8 @@ type child_process$execOpts = { uid?: number, gid?: number, windowsHide?: boolean, - ... -}; + signal?: AbortSignal, +}>; declare class child_process$Error extends Error { code: number | string | null; @@ -225,32 +246,31 @@ declare class child_process$Error extends Error { cmd: string; } -type child_process$execCallback = ( +type child_process$execCallback = ( error: ?child_process$Error, - stdout: string | Buffer, - stderr: string | Buffer, + stdout: T, + stderr: T, ) => void; -type child_process$execSyncOpts = { +type child_process$execSyncOpts = Readonly<{ cwd?: string, input?: string | Buffer | $TypedArray | DataView, stdio?: string | Array, - env?: Object, + env?: Readonly<{[key: string]: string | number | void}>, shell?: string, uid?: number, gid?: number, timeout?: number, killSignal?: string | number, maxBuffer?: number, - encoding?: string, + encoding?: buffer$NonBufferEncoding | 'buffer' | string, windowsHide?: boolean, - ... -}; +}>; -type child_process$execFileOpts = { +type child_process$execFileOpts = Readonly<{ cwd?: string, - env?: Object, - encoding?: string, + env?: Readonly<{[key: string]: string | number | void}>, + encoding?: buffer$NonBufferEncoding | 'buffer' | string, timeout?: number, maxBuffer?: number, killSignal?: string | number, @@ -259,168 +279,414 @@ type child_process$execFileOpts = { windowsHide?: boolean, windowsVerbatimArguments?: boolean, shell?: boolean | string, - ... -}; + signal?: AbortSignal, +}>; -type child_process$execFileCallback = ( - error: ?child_process$Error, - stdout: string | Buffer, - stderr: string | Buffer, -) => void; +type child_process$execFileCallback = + child_process$execCallback; -type child_process$execFileSyncOpts = { +type child_process$execFileSyncOpts = Readonly<{ cwd?: string, input?: string | Buffer | $TypedArray | DataView, stdio?: string | Array, - env?: Object, + env?: {[key: string]: string | number | void}, uid?: number, gid?: number, timeout?: number, killSignal?: string | number, maxBuffer?: number, - encoding?: string, + encoding?: buffer$NonBufferEncoding | 'buffer' | string, windowsHide?: boolean, shell?: boolean | string, - ... -}; +}>; -type child_process$forkOpts = { +type child_process$forkOpts = Readonly<{ cwd?: string, - env?: Object, + env?: Readonly<{[key: string]: string | number | void}>, execPath?: string, - execArgv?: Array, + execArgv?: ReadonlyArray, silent?: boolean, - stdio?: Array | string, + stdio?: + | child_process$StdioPipe + | string + | Readonly< + [ + child_process$StdioPipe, + child_process$StdioPipe, + child_process$StdioPipe, + ... + ], + > + | Readonly< + [ + child_process$StdioPipe, + child_process$StdioPipe, + string | number, + ... + ], + > + | Readonly< + [ + child_process$StdioPipe, + string | number, + child_process$StdioPipe, + ... + ], + > + | Readonly< + [ + string | number, + child_process$StdioPipe, + child_process$StdioPipe, + ... + ], + > + | Readonly<[child_process$StdioPipe, string | number, string | number, ...]> + | Readonly<[string | number, child_process$StdioPipe, string | number, ...]> + | Readonly<[string | number, string | number, child_process$StdioPipe, ...]> + | Readonly<[string | number, string | number, string | number, ...]>, windowsVerbatimArguments?: boolean, uid?: number, gid?: number, - ... -}; + serialization?: 'json' | 'advanced', + killSignal?: string | number, + timeout?: number, + signal?: AbortSignal, +}>; type child_process$Handle = any; // TODO -type child_process$spawnOpts = { +type child_process$StdioPipe = 'pipe' | 'overlapped'; + +type child_process$spawnOpts = Readonly<{ cwd?: string, - env?: Object, + env?: Readonly<{[key: string]: string | number | void}>, + encoding?: buffer$NonBufferEncoding | 'buffer' | string, argv0?: string, - stdio?: string | Array, + stdio?: + | child_process$StdioPipe + | string + | Readonly< + [ + child_process$StdioPipe, + child_process$StdioPipe, + child_process$StdioPipe, + ... + ], + > + | Readonly< + [ + child_process$StdioPipe, + child_process$StdioPipe, + string | number, + ... + ], + > + | Readonly< + [ + child_process$StdioPipe, + string | number, + child_process$StdioPipe, + ... + ], + > + | Readonly< + [ + string | number, + child_process$StdioPipe, + child_process$StdioPipe, + ... + ], + > + | Readonly<[child_process$StdioPipe, string | number, string | number, ...]> + | Readonly<[string | number, child_process$StdioPipe, string | number, ...]> + | Readonly<[string | number, string | number, child_process$StdioPipe, ...]> + | Readonly<[string | number, string | number, string | number, ...]>, detached?: boolean, uid?: number, gid?: number, shell?: boolean | string, windowsVerbatimArguments?: boolean, windowsHide?: boolean, - ... -}; + signal?: AbortSignal, + killSignal?: string | number, + timeout?: number, + serialization?: 'json' | 'advanced', +}>; -type child_process$spawnRet = { +type child_process$spawnSyncRet = Readonly<{ pid: number, output: Array, - stdout: Buffer | string, - stderr: Buffer | string, + // TODO: subprocess.stdout may be null in case of error + stdout: T, + // TODO: subprocess.stderr may be null in case of error + stderr: T, + // TODO: subprocess.status may be null in case of error or signal status: number, - signal: string, - error: Error, - ... -}; + signal: string | null, + error: Error | void, +}>; -type child_process$spawnSyncOpts = { +type child_process$spawnSyncOpts = Readonly<{ cwd?: string, input?: string | Buffer, - stdio?: string | Array, - env?: Object, + stdio?: string | ReadonlyArray, + env?: Readonly<{[key: string]: string | number | void}>, uid?: number, gid?: number, timeout?: number, - killSignal?: string, + killSignal?: string | number, maxBuffer?: number, - encoding?: string, + encoding?: buffer$NonBufferEncoding | 'buffer' | string, shell?: boolean | string, - ... -}; - -type child_process$spawnSyncRet = child_process$spawnRet; - -declare class child_process$ChildProcess extends events$EventEmitter { - channel: Object; - connected: boolean; - killed: boolean; - pid: number; - exitCode: number | null; - stderr: stream$Readable; - stdin: stream$Writable; - stdio: Array; - stdout: stream$Readable; + windowsHide?: boolean, + windowsVerbatimArguments?: boolean, +}>; +type child_process$Serializable = + | string + | number + | boolean + | bigint + | {[key: string]: child_process$Serializable} + | Array; + +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, +> extends events$EventEmitter +{ + +stdin: TStdin; + +stdout: TStdout; + +stderr: TStderr; + +channel: unknown; + +stdio: [TStdin, TStdout, TStderr, ...]; + +killed: boolean; + +pid: number; + +connected: boolean; + +exitCode: number | null; + +signalCode: string | null; + +spawnargs: Array; + +spawnfile: string; disconnect(): void; - kill(signal?: string): void; + kill(signal?: string | number): boolean; send( - message: Object, - sendHandleOrCallback?: child_process$Handle, - optionsOrCallback?: Object | Function, - callback?: Function, + message: child_process$Serializable, + callback?: (error: Error | null) => void, + ): boolean; + send( + message: child_process$Serializable, + sendHandle: child_process$SendHandle, + callback?: (error: Error | null) => void, + ): boolean; + send( + message: child_process$Serializable, + sendHandle: child_process$SendHandle, + options: Readonly<{keepOpen?: boolean}>, + callback?: (error: Error | null) => void, ): boolean; unref(): void; ref(): void; } +/** + * @deprecated - Unsafely assumes stdio is piped + */ +declare type child_process$ChildProcess = child_process$ChildProcessTyped< + stream$Writable, + stream$Readable, + stream$Readable, +>; + declare module 'child_process' { - declare var ChildProcess: typeof child_process$ChildProcess; + declare type ExecOptions = child_process$execOpts; + declare type ExecFileOptions = child_process$execFileOpts; + declare type ExecSyncOptions = child_process$execSyncOpts; + declare type ForkOptions = child_process$forkOpts; + declare type SpawnOptions = child_process$spawnOpts; + declare type SpawnSyncOptions = child_process$spawnSyncOpts; + + declare var ChildProcess: typeof child_process$ChildProcessTyped< + stream$Writable, + stream$Readable, + stream$Readable, + >; + + type StringOrBuffer = + Opts extends Readonly<{encoding: infer E, ...}> + ? E extends buffer$NonBufferEncoding + ? string + : E extends 'buffer' + ? Buffer + : string | Buffer + : Default; + + type StreamForChannel = Channel extends 0 + ? stream$Writable + : stream$Readable; + + type MaybeStream = + Opts extends Readonly<{stdio: infer E, ...}> + ? E extends child_process$StdioPipe + ? StreamForChannel + : E extends string + ? null + : E[FD] extends child_process$StdioPipe + ? StreamForChannel + : E[FD] extends string | number + ? null + : null | StreamForChannel + : PipeByDefault extends true + ? StreamForChannel + : null; declare function exec( command: string, - optionsOrCallback?: child_process$execOpts | child_process$execCallback, - callback?: child_process$execCallback, - ): child_process$ChildProcess; - - declare function execSync( + callback?: child_process$execCallback, + ): child_process$ChildProcessTyped< + stream$Writable, + stream$Readable, + stream$Readable, + >; + + declare function exec( command: string, - options: { - encoding: buffer$NonBufferEncoding, - ... - } & child_process$execSyncOpts, - ): string; - - declare function execSync( + options: Opts, + callback?: child_process$execCallback>, + ): child_process$ChildProcessTyped< + stream$Writable, + stream$Readable, + stream$Readable, + >; + + declare function execSync( command: string, - options?: child_process$execSyncOpts, ): Buffer; + declare function execSync( + command: string, + options: Opts, + ): StringOrBuffer; + declare function execFile( file: string, - argsOrOptionsOrCallback?: - | Array - | child_process$execFileOpts - | child_process$execFileCallback, - optionsOrCallback?: - | child_process$execFileOpts - | child_process$execFileCallback, - callback?: child_process$execFileCallback, - ): child_process$ChildProcess; + argsOrCallback?: + | ReadonlyArray + | child_process$execFileCallback, + callback?: child_process$execFileCallback, + ): child_process$ChildProcessTyped< + stream$Writable, + stream$Readable, + stream$Readable, + >; + + declare function execFile( + file: string, + args: ReadonlyArray, + options: Opts, + callback?: child_process$execFileCallback>, + ): child_process$ChildProcessTyped< + stream$Writable, + stream$Readable, + stream$Readable, + >; + + declare function execFile( + file: string, + options: Opts, + callback?: child_process$execFileCallback>, + ): child_process$ChildProcessTyped< + stream$Writable, + stream$Readable, + stream$Readable, + >; declare function execFileSync( command: string, - argsOrOptions?: Array | child_process$execFileSyncOpts, - options?: child_process$execFileSyncOpts, - ): Buffer | string; + args?: ReadonlyArray, + ): Buffer; + + declare function execFileSync( + command: string, + args: ReadonlyArray, + options: Opts, + ): StringOrBuffer; + + declare function execFileSync( + command: string, + options: Opts, + ): StringOrBuffer; declare function fork( modulePath: string, - argsOrOptions?: Array | child_process$forkOpts, - options?: child_process$forkOpts, - ): child_process$ChildProcess; + args?: ReadonlyArray, + ): child_process$ChildProcessTyped; + + declare function fork( + modulePath: string, + args: ReadonlyArray, + options: Opts, + ): child_process$ChildProcessTyped< + MaybeStream, + MaybeStream, + MaybeStream, + >; + + declare function fork( + modulePath: string, + options: Opts, + ): child_process$ChildProcessTyped< + MaybeStream, + MaybeStream, + MaybeStream, + >; declare function spawn( command: string, - argsOrOptions?: Array | child_process$spawnOpts, - options?: child_process$spawnOpts, - ): child_process$ChildProcess; + args?: ReadonlyArray, + ): child_process$ChildProcessTyped< + stream$Writable, + stream$Readable, + stream$Readable, + >; + + declare function spawn( + command: string, + args: ReadonlyArray, + options: Opts, + ): child_process$ChildProcessTyped< + MaybeStream, + MaybeStream, + MaybeStream, + >; + + declare function spawn( + command: string, + options: Opts, + ): child_process$ChildProcessTyped< + MaybeStream, + MaybeStream, + MaybeStream, + >; declare function spawnSync( command: string, - argsOrOptions?: Array | child_process$spawnSyncOpts, - options?: child_process$spawnSyncOpts, - ): child_process$spawnSyncRet; + args?: ReadonlyArray, + ): child_process$spawnSyncRet; + + declare function spawnSync( + command: string, + args: ReadonlyArray, + options: Opts, + ): child_process$spawnSyncRet>; + + declare function spawnSync( + command: string, + options: Opts, + ): child_process$spawnSyncRet>; } declare module 'cluster' { @@ -597,6 +863,7 @@ declare class crypto$Hash extends stream$Duplex { data: string | Buffer, input_encoding?: 'utf8' | 'ascii' | 'latin1' | 'binary', ): crypto$Hash; + copy(options?: unknown): crypto$Hash; } declare class crypto$Hmac extends stream$Duplex { @@ -655,6 +922,83 @@ type crypto$key = ... }; +declare class crypto$KeyObject { + +asymmetricKeyType?: + | 'rsa' + | 'rsa-pss' + | 'dsa' + | 'ec' + | 'ed25519' + | 'ed448' + | 'x25519' + | 'x448'; + +asymmetricKeySize?: number; + +symmetricKeySize?: number; + +type: 'secret' | 'public' | 'private'; + + export( + options: Readonly<{ + type: 'pkcs1' | 'spki' | 'pkcs8' | 'sec1', + format: 'pem', + }>, + ): string; + export( + options: Readonly<{ + type: 'pkcs1' | 'spki' | 'pkcs8' | 'sec1', + format: 'der', + }>, + ): Buffer; + export(options: Readonly<{format: 'jwk'}>): unknown; + equals(otherKeyObject: crypto$KeyObject): boolean; +} + +declare class crypto$X509Certificate { + constructor(buffer: string | Buffer | $TypedArray | DataView): void; + + +ca: boolean; + +fingerprint: string; + +fingerprint256: string; + +fingerprint512: string; + +issuer: string; + +issuerCertificate?: crypto$X509Certificate; + +keyUsage: Array; + +publicKey: crypto$KeyObject; + +raw: Buffer; + +serialNumber: string; + +subject: string; + +subjectAltName: string; + +validFrom: string; + +validTo: string; + +validFromDate: Date; + +validToDate: Date; + + checkEmail( + email: string, + options?: Readonly<{subject?: 'always' | 'default' | 'never'}>, + ): string | void; + checkHost( + name: string, + options?: Readonly<{subject?: 'always' | 'default' | 'never'}>, + ): string | void; + checkIP(ip: string): string | void; + checkIssued(otherCert: crypto$X509Certificate): boolean; + checkPrivateKey(privateKey: crypto$KeyObject): boolean; + toJSON(): string; + toLegacyObject(): unknown; + toString(): string; + verify(publicKey: crypto$KeyObject): boolean; +} + +declare class crypto$Certificate { + static exportChallenge( + spkac: string | Buffer | $TypedArray | DataView, + ): Buffer; + static exportPublicKey( + spkac: string | Buffer | $TypedArray | DataView, + ): Buffer; + static verifySpkac(spkac: Buffer | $TypedArray | DataView): boolean; +} + declare module 'crypto' { declare var DEFAULT_ENCODING: string; @@ -808,12 +1152,85 @@ declare module 'crypto' { callback: (err: ?Error, buffer: Buffer) => void, ): void; declare function randomUUID( - options?: $ReadOnly<{|disableEntropyCache?: boolean|}>, + options?: Readonly<{disableEntropyCache?: boolean}>, ): string; declare function timingSafeEqual( a: Buffer | $TypedArray | DataView, b: Buffer | $TypedArray | DataView, ): boolean; + declare function hash( + algorithm: string, + data: string | Buffer | $TypedArray | DataView, + ): Buffer; + declare function hash( + algorithm: string, + data: string | Buffer | $TypedArray | DataView, + outputEncoding: buffer$Encoding, + ): string; + declare function createSecretKey( + key: Buffer | $TypedArray | DataView, + ): crypto$KeyObject; + declare function createSecretKey( + key: string, + encoding: buffer$Encoding, + ): crypto$KeyObject; + declare function createPublicKey( + key: string | Buffer | crypto$KeyObject | unknown, + ): crypto$KeyObject; + declare function createPrivateKey( + key: string | Buffer | unknown, + ): crypto$KeyObject; + declare function generateKeyPair( + type: + | 'rsa' + | 'rsa-pss' + | 'dsa' + | 'ec' + | 'ed25519' + | 'ed448' + | 'x25519' + | 'x448', + options: unknown, + callback: ( + err: ?Error, + publicKey: crypto$KeyObject, + privateKey: crypto$KeyObject, + ) => void, + ): void; + declare function generateKeyPairSync( + type: + | 'rsa' + | 'rsa-pss' + | 'dsa' + | 'ec' + | 'ed25519' + | 'ed448' + | 'x25519' + | 'x448', + options: unknown, + ): {publicKey: crypto$KeyObject, privateKey: crypto$KeyObject, ...}; + declare function generateKey( + type: 'hmac' | 'aes', + options: Readonly<{length: number}>, + callback: (err: ?Error, key: crypto$KeyObject) => void, + ): void; + declare function generateKeySync( + type: 'hmac' | 'aes', + options: Readonly<{length: number}>, + ): crypto$KeyObject; + declare function checkPrime( + candidate: Buffer | $TypedArray | DataView | bigint, + options?: Readonly<{checks?: number}>, + callback: (err: ?Error, result: boolean) => void, + ): void; + declare function checkPrimeSync( + candidate: Buffer | $TypedArray | DataView | bigint, + options?: Readonly<{checks?: number}>, + ): boolean; + declare class Certificate extends crypto$Certificate {} + declare class X509Certificate extends crypto$X509Certificate {} + declare class KeyObject extends crypto$KeyObject {} + declare var webcrypto: unknown; } type net$Socket$address = { @@ -841,7 +1258,7 @@ declare class dgram$Socket extends events$EventEmitter { msg: Buffer, port: number, address: string, - callback?: (err: ?Error, bytes: any) => mixed, + callback?: (err: ?Error, bytes: any) => unknown, ): void; send( msg: Buffer, @@ -849,7 +1266,7 @@ declare class dgram$Socket extends events$EventEmitter { length: number, port: number, address: string, - callback?: (err: ?Error, bytes: any) => mixed, + callback?: (err: ?Error, bytes: any) => unknown, ): void; setBroadcast(flag: boolean): void; setMulticastLoopback(flag: boolean): void; @@ -1044,6 +1461,8 @@ declare module 'fs' { declare class FSWatcher extends events$EventEmitter { close(): void; + ref(): this; + unref(): this; } declare class ReadStream extends stream$Readable { @@ -1057,6 +1476,7 @@ declare module 'fs' { declare class Dirent { name: string | Buffer; + parentPath: string; isBlockDevice(): boolean; isCharacterDevice(): boolean; @@ -1290,12 +1710,24 @@ declare module 'fs' { declare function mkdtempSync(prefix: string): string; declare function readdir( path: string, - options: string | {encoding?: string, withFileTypes?: false, ...}, + options: + | string + | Readonly<{ + encoding?: string, + recursive?: boolean, + withFileTypes?: false, + ... + }>, callback: (err: ?ErrnoError, files: Array) => void, ): void; declare function readdir( path: string, - options: {encoding?: string, withFileTypes: true, ...}, + options: Readonly<{ + encoding?: string, + recursive?: boolean, + withFileTypes: true, + ... + }>, callback: (err: ?ErrnoError, files: Array) => void, ): void; declare function readdir( @@ -1304,11 +1736,23 @@ declare module 'fs' { ): void; declare function readdirSync( path: string, - options?: string | {encoding?: string, withFileTypes?: false, ...}, + options?: + | string + | Readonly<{ + encoding?: string, + recursive?: boolean, + withFileTypes?: false, + }>, ): Array; declare function readdirSync( path: string, - options?: string | {encoding?: string, withFileTypes: true, ...}, + options?: + | string + | Readonly<{ + encoding?: string, + recursive?: boolean, + withFileTypes: true, + }>, ): Array; declare function close( fd: number, @@ -1326,6 +1770,29 @@ declare module 'fs' { flags: string | number, callback: (err: ?ErrnoError, fd: number) => void, ): void; + declare function openAsBlob( + path: string | Buffer | URL, + options?: Readonly<{ + type?: string, // Optional MIME type hint + }>, + ): Promise; + declare function opendir( + path: string, + options?: Readonly<{ + encoding?: string, + bufferSize?: number, + recursive?: boolean, + }>, + callback: (err: ?ErrnoError, dir: Dir) => void, + ): void; + declare function opendirSync( + path: string, + options?: Readonly<{ + encoding?: string, + bufferSize?: number, + recursive?: boolean, + }>, + ): Dir; declare function openSync( path: string | Buffer, flags: string | number, @@ -1544,7 +2011,15 @@ declare module 'fs' { ): void; declare function watchFile( filename: string, - options?: Object, + listener?: (curr: Stats, prev: Stats) => void, + ): void; + declare function watchFile( + filename: string, + options?: Readonly<{ + bigint?: boolean, + persistent?: boolean, + interval?: number, + }>, listener?: (curr: Stats, prev: Stats) => void, ): void; declare function unwatchFile( @@ -1553,7 +2028,16 @@ declare module 'fs' { ): void; declare function watch( filename: string, - options?: Object, + listener?: (event: string, filename: string) => void, + ): FSWatcher; + declare function watch( + filename: string, + options?: Readonly<{ + persistent?: boolean, + recursive?: boolean, + encoding?: string, + signal?: AbortSignal, + }>, listener?: (event: string, filename: string) => void, ): FSWatcher; declare function exists( @@ -1593,6 +2077,105 @@ declare module 'fs' { dest: string, flags?: number, ): void; + declare function cp( + src: string | URL, + dest: string | URL, + options: Readonly<{ + dereference?: boolean, + errorOnExist?: boolean, + filter?: (src: string, dest: string) => boolean | Promise, + force?: boolean, + mode?: number, + preserveTimestamps?: boolean, + recursive?: boolean, + verbatimSymlinks?: boolean, + }>, + callback: (err: ?Error) => void, + ): void; + declare function cp( + src: string | URL, + dest: string | URL, + callback: (err: ?Error) => void, + ): void; + declare function cpSync( + src: string | URL, + dest: string | URL, + options?: Readonly<{ + dereference?: boolean, + errorOnExist?: boolean, + filter?: (src: string, dest: string) => boolean, + force?: boolean, + mode?: number, + preserveTimestamps?: boolean, + recursive?: boolean, + verbatimSymlinks?: boolean, + }>, + ): void; + + declare type GlobOptions = Readonly<{ + /** + * Current working directory. + * @default process.cwd() + */ + cwd?: string | void, + /** + * `true` if the glob should return paths as `Dirent`s, `false` otherwise. + * @default false + * @since v22.2.0 + */ + withFileTypes?: WithFileTypes, + /** + * Function to filter out files/directories or a + * list of glob patterns to be excluded. If a function is provided, return + * `true` to exclude the item, `false` to include it. + * @default undefined + */ + exclude?: + | ((fileName: Node$Conditional) => boolean) + | ReadonlyArray, + ... + }>; + + /** + * Retrieves the files matching the specified pattern. + * + * ```js + * import { glob } from 'node:fs'; + * + * glob('*.js', (err, matches) => { + * if (err) throw err; + * console.log(matches); + * }); + * ``` + * @since v22.0.0 + */ + declare function glob( + pattern: string | ReadonlyArray, + callback: (err: ?ErrnoError, matches: Array) => void, + ): void; + + declare function glob( + pattern: string | ReadonlyArray, + options: GlobOptions, + callback: ( + err: ?ErrnoError, + matches: Node$Conditional, Array>, + ) => void, + ): void; + + /** + * ```js + * import { globSync } from 'node:fs'; + * + * console.log(globSync('*.js')); + * ``` + * @since v22.0.0 + * @returns paths of files that match the pattern. + */ + declare function globSync( + pattern: string | ReadonlyArray, + options?: GlobOptions, + ): Node$Conditional, Array>; declare var F_OK: number; declare var R_OK: number; @@ -1658,14 +2241,52 @@ declare module 'fs' { retryDelay?: number, ... }; + declare class Dir { + +path: string; + close(): Promise; + closeSync(): void; + read(): Promise; + read(cb: (err?: Error, dirent: ?Dirent) => void): void; + readSync(): ?Dirent; + @@asyncIterator(): AsyncIterator; + } + type AppendOrWriteToFileHandle = ( + data: + | string + | Buffer + | Uint8Array + | DataView + | AsyncIterable + | Iterable + | stream$Readable, + options: WriteOptions | string, + ) => Promise; declare class FileHandle { - appendFile( - data: string | Buffer, - options: WriteOptions | string, - ): Promise; + appendFile: AppendOrWriteToFileHandle; chmod(mode: number): Promise; chown(uid: number, guid: number): Promise; close(): Promise; + createReadStream( + options?: Readonly<{ + encoding?: string, + autoClose?: boolean, + emitClose?: boolean, + start?: number, + end?: number, + highWaterMark?: number, + signal?: AbortSignal, + }>, + ): ReadStream; + createWriteStream( + options?: Readonly<{ + encoding?: string, + autoClose?: boolean, + emitClose?: boolean, + start?: number, + highWaterMark?: number, + flush?: boolean, + }>, + ): WriteStream; datasync(): Promise; fd: number; read( @@ -1678,8 +2299,25 @@ declare module 'fs' { buffer: T, ... }>; + readableWebStream( + options?: Readonly<{autoClose?: boolean}>, + ): ReadableStream; readFile(options: EncodingFlag): Promise; readFile(options: string): Promise; + readLines( + options?: Readonly<{ + encoding?: string, + autoClose?: boolean, + emitClose?: boolean, + start?: number, + end?: number, + highWaterMark?: number, + }>, + ): readline$Interface; + readv | Array | Array>( + buffers: T, + position?: number | null, + ): Promise<{buffers: T, bytesRead: number}>; stat(): Promise; sync(): Promise; truncate(len?: number): Promise; @@ -1688,15 +2326,24 @@ declare module 'fs' { mtime: number | string | Date, ): Promise; write( - buffer: Buffer | Uint8Array, + buffer: Buffer | Uint8Array | DataView, offset: number, length: number, position: number, ): Promise; - writeFile( - data: string | Buffer | Uint8Array, - options: WriteOptions | string, + write( + buffer: Buffer | Uint8Array | DataView, + options?: Readonly<{ + offset?: number, + length?: number, + position?: number, + }>, ): Promise; + writeFile: AppendOrWriteToFileHandle; + writev | Array | Array>( + buffers: T, + position?: number | null, + ): Promise<{buffers: T, bytesWritten: number}>; } declare type FSPromisePath = string | Buffer | URL; @@ -1714,6 +2361,20 @@ declare module 'fs' { dest: FSPromisePath, flags?: number, ): Promise, + cp( + src: string | URL, + dest: string | URL, + options?: Readonly<{ + dereference?: boolean, + errorOnExist?: boolean, + filter?: (src: string, dest: string) => boolean | Promise, + force?: boolean, + mode?: number, + preserveTimestamps?: boolean, + recursive?: boolean, + verbatimSymlinks?: boolean, + }>, + ): Promise, fchmod(filehandle: FileHandle, mode: number): Promise, fchown(filehandle: FileHandle, uid: number, guid: number): Promise, fdatasync(filehandle: FileHandle): Promise, @@ -1725,6 +2386,14 @@ declare module 'fs' { atime: number | string | Date, mtime: number | string | Date, ): Promise, + glob( + pattern: string | ReadonlyArray, + options?: GlobOptions, + ): Node$Conditional< + WithFileTypes, + AsyncIterator, + AsyncIterator, + >, lchmod(path: FSPromisePath, mode: number): Promise, lchown(path: FSPromisePath, uid: number, guid: number): Promise, link(existingPath: FSPromisePath, newPath: FSPromisePath): Promise, @@ -1745,6 +2414,14 @@ declare module 'fs' { flags?: string | number, mode?: number, ): Promise, + opendir( + path: string, + options?: Readonly<{ + encoding?: string, + bufferSize?: number, + recursive?: boolean, + }>, + ): Promise, read( filehandle: FileHandle, buffer: T, @@ -1758,11 +2435,21 @@ declare module 'fs' { }>, readdir: (( path: FSPromisePath, - options: string | {encoding?: string, withFileTypes?: false, ...}, + options: + | string + | Readonly<{ + encoding?: string, + recursive?: boolean, + withFileTypes?: false, + }>, ) => Promise>) & (( path: FSPromisePath, - options: {encoding?: string, withFileTypes: true, ...}, + options: Readonly<{ + encoding?: string, + recursive?: boolean, + withFileTypes: true, + }>, ) => Promise>) & ((path: FSPromisePath) => Promise>), readFile: (( @@ -1805,6 +2492,17 @@ declare module 'fs' { atime: number | string | Date, mtime: number | string | Date, ): Promise, + watch( + filename: FSPromisePath, + options?: Readonly<{ + persistent?: boolean, + recursive?: boolean, + encoding?: string, + signal?: AbortSignal, + maxQueue?: number, + overflow?: 'ignore' | 'throw', + }>, + ): AsyncIterator<{eventType: string, filename: ?string}>, write( filehandle: FileHandle, buffer: T, @@ -1827,6 +2525,10 @@ declare module 'fs' { declare var promises: FSPromise; } +declare module 'fs/promises' { + declare module.exports: $Exports<'fs'>['promises']; +} + type http$agentOptions = { keepAlive?: boolean, keepAliveMsecs?: number, @@ -1838,7 +2540,8 @@ type http$agentOptions = { declare class http$Agent<+SocketT = net$Socket> { constructor(options: http$agentOptions): void; destroy(): void; - freeSockets: {[name: string]: $ReadOnlyArray, ...}; + // $FlowFixMe[incompatible-variance] + freeSockets: {[name: string]: ReadonlyArray, ...}; getName(options: { host: string, port: number, @@ -1847,8 +2550,10 @@ declare class http$Agent<+SocketT = net$Socket> { }): string; maxFreeSockets: number; maxSockets: number; - requests: {[name: string]: $ReadOnlyArray>, ...}; - sockets: {[name: string]: $ReadOnlyArray, ...}; + // $FlowFixMe[incompatible-variance] + requests: {[name: string]: ReadonlyArray>, ...}; + // $FlowFixMe[incompatible-variance] + sockets: {[name: string]: ReadonlyArray, ...}; } declare class http$IncomingMessage @@ -1939,7 +2644,7 @@ declare class http$Server extends net$Server { callback?: Function, ): this; listening: boolean; - close(callback?: (error: ?Error) => mixed): this; + close(callback?: (error: ?Error) => unknown): this; closeAllConnections(): void; closeIdleConnections(): void; maxHeadersCount: number; @@ -1975,7 +2680,7 @@ declare class https$Server extends tls$Server { }, callback?: Function, ): this; - close(callback?: (error: ?Error) => mixed): this; + close(callback?: (error: ?Error) => unknown): this; closeAllConnections(): void; closeIdleConnections(): void; keepAliveTimeout: number; @@ -1988,7 +2693,7 @@ type requestOptions = {| auth?: string, defaultPort?: number, family?: number, - headers?: {[key: string]: mixed, ...}, + headers?: {[key: string]: unknown, ...}, host?: string, hostname?: string, localAddress?: string, @@ -2126,14 +2831,14 @@ declare class net$Socket extends stream$Duplex { bufferSize: number; bytesRead: number; bytesWritten: number; - connect(path: string, connectListener?: () => mixed): net$Socket; + connect(path: string, connectListener?: () => unknown): net$Socket; connect( port: number, host?: string, - connectListener?: () => mixed, + connectListener?: () => unknown, ): net$Socket; - connect(port: number, connectListener?: () => mixed): net$Socket; - connect(options: Object, connectListener?: () => mixed): net$Socket; + connect(port: number, connectListener?: () => unknown): net$Socket; + connect(options: Object, connectListener?: () => unknown): net$Socket; destroyed: boolean; end( chunkOrEncodingOrCallback?: @@ -2193,7 +2898,7 @@ type net$connectOptions = { domain: string, options?: ?number | ?Object, callback?: (err: ?Error, address: string, family: number) => void, - ) => mixed, + ) => unknown, path?: string, ... }; @@ -2241,9 +2946,7 @@ type os$CPU = { nice: number, sys: number, user: number, - ... }, - ... }; type os$NetIFAddr = { @@ -2252,7 +2955,8 @@ type os$NetIFAddr = { internal: boolean, mac: string, netmask: string, - ... + scopeid?: number, + cidr: ?string, }; type os$UserInfo$buffer = { @@ -2261,7 +2965,6 @@ type os$UserInfo$buffer = { username: Buffer, homedir: Buffer, shell: ?Buffer, - ... }; type os$UserInfo$string = { @@ -2270,43 +2973,117 @@ type os$UserInfo$string = { username: string, homedir: string, shell: ?string, - ... }; declare module 'os' { - declare function arch(): 'x64' | 'arm' | 'ia32'; + declare function arch(): + | 'arm' + | 'arm64' + | 'ia32' + | 'loong64' + | 'mips' + | 'mipsel' + | 'ppc64' + | 'riscv64' + | 's390x' + | 'x64'; declare function availableParallelism(): number; declare function cpus(): Array; declare function endianness(): 'BE' | 'LE'; declare function freemem(): number; + declare function getPriority(pid?: number): number; declare function homedir(): string; declare function hostname(): string; declare function loadavg(): [number, number, number]; + declare function machine(): string; declare function networkInterfaces(): { [ifName: string]: Array, - ... }; - declare function platform(): string; + declare function platform(): + | 'aix' + | 'android' + | 'darwin' + | 'freebsd' + | 'haiku' + | 'linux' + | 'openbsd' + | 'sunos' + | 'win32' + | 'cygwin'; declare function release(): string; + declare function setPriority(priority: number): void; + declare function setPriority(pid: number, priority: number): void; declare function tmpdir(): string; declare function totalmem(): number; declare function type(): string; declare function uptime(): number; - declare function userInfo(options: { - encoding: 'buffer', - ... - }): os$UserInfo$buffer; - declare function userInfo(options?: { - encoding: 'utf8', - ... - }): os$UserInfo$string; + declare function userInfo( + options: Readonly<{ + encoding: 'buffer', + }>, + ): os$UserInfo$buffer; + declare function userInfo( + options?: Readonly<{ + encoding: 'utf8', + }>, + ): os$UserInfo$string; + declare function version(): string; declare var EOL: string; + declare var devNull: string; + declare var constants: Readonly<{ + signals: {[key: string]: number, ...}, + errno: {[key: string]: number, ...}, + priority: Readonly<{ + PRIORITY_LOW: number, + PRIORITY_BELOW_NORMAL: number, + PRIORITY_NORMAL: number, + PRIORITY_ABOVE_NORMAL: number, + PRIORITY_HIGH: number, + PRIORITY_HIGHEST: number, + }>, + dlopen: {[key: string]: number, ...}, + }>; } +type path$PlatformPath = { + normalize(path: string): string, + join(...parts: Array): string, + resolve(...parts: Array): string, + matchesGlob(path: string, pattern: string): boolean, + isAbsolute(path: string): boolean, + relative(from: string, to: string): string, + dirname(path: string): string, + basename(path: string, ext?: string): string, + extname(path: string): string, + sep: string, + delimiter: string, + parse(pathString: string): Readonly<{ + root: string, + dir: string, + base: string, + ext: string, + name: string, + }>, + format( + pathObject: Readonly<{ + root?: string, + dir?: string, + base?: string, + ext?: string, + name?: string, + }>, + ): string, + toNamespacedPath(path: string): string, + posix: path$PlatformPath, + win32: path$PlatformPath, + ... +}; + declare module 'path' { declare function normalize(path: string): string; declare function join(...parts: Array): string; declare function resolve(...parts: Array): string; + declare function matchesGlob(path: string, pattern: string): boolean; declare function isAbsolute(path: string): boolean; declare function relative(from: string, to: string): string; declare function dirname(path: string): string; @@ -2320,18 +3097,221 @@ declare module 'path' { base: string, ext: string, name: string, - ... }; - declare function format(pathObject: { - root?: string, - dir?: string, - base?: string, - ext?: string, - name?: string, - ... - }): string; - declare var posix: any; - declare var win32: any; + declare function format( + pathObject: Readonly<{ + root?: string, + dir?: string, + base?: string, + ext?: string, + name?: string, + }>, + ): string; + declare function toNamespacedPath(path: string): string; + declare var posix: path$PlatformPath; + declare var win32: path$PlatformPath; +} + +declare module 'perf_hooks' { + declare export type EntryType = + | 'function' + | 'gc' + | 'http' + | 'http2' + | 'mark' + | 'measure' + | 'navigation' + | 'node' + | 'resource'; + + declare export interface Histogram { + +count: number; + +countBigInt: bigint; + +exceeds: number; + +exceedsBigInt: bigint; + +max: number; + +maxBigInt: bigint; + +mean: number; + +min: number; + +minBigInt: bigint; + +stddev: number; + +percentiles: Map; + +percentilesBigInt: Map; + percentile(percentile: number): number; + percentileBigInt(percentile: number): bigint; + reset(): void; + } + + declare export interface IntervalHistogram extends Histogram { + enable(): boolean; + disable(): boolean; + } + + declare export interface RecordableHistogram extends Histogram { + record(val: number | bigint): void; + recordDelta(): void; + } + + declare export class PerformanceEntry { + +duration: number; + +entryType: EntryType; + +name: string; + +startTime: number; + +detail?: unknown; + toJSON(): unknown; + } + + declare export class PerformanceMark extends PerformanceEntry { + +entryType: 'mark'; + +duration: 0; + +detail?: T; + } + + declare export class PerformanceMeasure + extends PerformanceEntry + { + +entryType: 'measure'; + +detail?: T; + } + + declare export class PerformanceNodeEntry extends PerformanceEntry { + +entryType: 'node'; + } + + declare export class PerformanceNodeTiming extends PerformanceEntry { + +entryType: 'node'; + +bootstrapComplete: number; + +environment: number; + +idleTime: number; + +loopExit: number; + +loopStart: number; + +nodeStart: number; + +v8Start: number; + } + + declare export class PerformanceResourceTiming extends PerformanceEntry { + +entryType: 'resource'; + +connectEnd: number; + +connectStart: number; + +decodedBodySize: number; + +domainLookupEnd: number; + +domainLookupStart: number; + +encodedBodySize: number; + +fetchStart: number; + +redirectEnd: number; + +redirectStart: number; + +requestStart: number; + +responseEnd: number; + +secureConnectionStart: number; + +transferSize: number; + +workerStart: number; + } + + declare export class PerformanceObserverEntryList { + getEntries(): Array; + getEntriesByName(name: string, type?: EntryType): Array; + getEntriesByType(type: EntryType): Array; + } + + declare export type PerformanceObserverCallback = ( + list: PerformanceObserverEntryList, + observer: PerformanceObserver, + ) => void; + + declare export class PerformanceObserver { + static supportedEntryTypes: ReadonlyArray; + constructor(callback: PerformanceObserverCallback): this; + observe( + options: Readonly<{ + entryTypes?: ReadonlyArray, + type?: EntryType, + buffered?: boolean, + }>, + ): void; + disconnect(): void; + takeRecords(): Array; + } + + declare export type EventLoopUtilization = { + +utilization: number, + +idle: number, + +active: number, + }; + + declare export type PerformanceMarkOptions = Readonly<{ + detail?: T, + startTime?: number, + }>; + + declare export type PerformanceMeasureOptions = Readonly<{ + detail?: T, + duration?: number, + end?: number | string, + start?: number | string, + }>; + + declare class Performance { + clearMarks(name?: string): void; + clearMeasures(name?: string): void; + clearResourceTimings(name?: string): void; + eventLoopUtilization( + elu1?: EventLoopUtilization, + elu2?: EventLoopUtilization, + ): EventLoopUtilization; + getEntries(): Array; + getEntriesByName(name: string, type?: EntryType): Array; + getEntriesByType(type: EntryType): Array; + mark( + name: string, + options?: PerformanceMarkOptions, + ): PerformanceMark; + measure( + name: string, + startMarkOrOptions?: string | PerformanceMeasureOptions, + endMark?: string, + ): PerformanceMeasure; + +nodeTiming: PerformanceNodeTiming; + now(): number; + setResourceTimingBufferSize(maxSize: number): void; + +timeOrigin: number; + timerify, TReturn>( + fn: (...TArgs) => TReturn, + options?: Readonly<{histogram?: RecordableHistogram}>, + ): (...TArgs) => TReturn; + toJSON(): unknown; + } + + declare export var performance: Performance; + + declare export var constants: Readonly<{ + NODE_PERFORMANCE_GC_MAJOR: number, + NODE_PERFORMANCE_GC_MINOR: number, + NODE_PERFORMANCE_GC_INCREMENTAL: number, + NODE_PERFORMANCE_GC_WEAKCB: number, + NODE_PERFORMANCE_GC_FLAGS_NO: number, + NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED: number, + NODE_PERFORMANCE_GC_FLAGS_FORCED: number, + NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING: number, + NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE: number, + NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY: number, + NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE: number, + }>; + + declare export function monitorEventLoopDelay( + options?: Readonly<{resolution?: number}>, + ): IntervalHistogram; + + declare export function createHistogram( + options?: Readonly<{ + lowest?: number | bigint, + highest?: number | bigint, + figures?: number, + }>, + ): RecordableHistogram; +} + +declare module 'process' { + declare module.exports: Process; } declare module 'punycode' { @@ -2457,7 +3437,14 @@ declare class stream$Readable extends stream$Stream { static from( iterable: Iterable | AsyncIterable, options?: readableStreamOptions, - ): stream$Readable; + ): this; + + static fromWeb( + readableStream: ReadableStream, + options?: readableStreamOptions, + ): this; + + static toWeb(streamReadable: stream$Readable): ReadableStream; constructor(options?: readableStreamOptions): void; destroy(error?: Error): this; @@ -2504,6 +3491,13 @@ type writableStreamOptions = { ... }; declare class stream$Writable extends stream$Stream { + static fromWeb( + writableStream: WritableStream, + options?: writableStreamOptions, + ): this; + + static toWeb(streamWritable: stream$Writable): WritableStream; + constructor(options?: writableStreamOptions): void; cork(): void; destroy(error?: Error): this; @@ -2545,10 +3539,6 @@ declare class stream$Writable extends stream$Stream { _final(callback: (error?: Error) => void): void; } -//According to the NodeJS docs: -//"Since JavaScript doesn't have multiple prototypal inheritance, this class -//prototypally inherits from Readable, and then parasitically from Writable." -//Source: , + options?: duplexStreamOptions, + ): this; + + // $FlowFixMe[incompatible-type] See above + static toWeb(streamDuplex: stream$Duplex): { + readable: ReadableStream, + writable: WritableStream, + ... + }; + constructor(options?: duplexStreamOptions): void; } type transformStreamOptions = duplexStreamOptions & { @@ -2704,7 +3716,7 @@ declare module 'stream' { options?: StreamPipelineOptions, ): Promise, pipeline( - streams: $ReadOnlyArray, + streams: ReadonlyArray, options?: StreamPipelineOptions, ): Promise, ... @@ -2811,7 +3823,7 @@ type tls$connectOptions = { domain: string, options?: ?number | ?Object, callback?: (err: ?Error, address: string, family: number) => void, - ) => mixed, + ) => unknown, requestOCSP?: boolean, ... }; @@ -2945,6 +3957,75 @@ type url$urlObject = { ... }; +declare module 'timers' { + declare export class Timeout { + close(): this; + hasRef(): boolean; + ref(): this; + refresh(): this; + unref(): this; + [key: $SymbolToPrimitive]: () => number; + // [key: $SymbolDispose]: () => void; + } + + declare export class Immediate { + hasRef(): boolean; + ref(): this; + unref(): this; + // [key: $SymbolDispose]: () => void; + } + + declare export function setTimeout>( + callback: (...args: TArgs) => unknown, + delay?: number, + ...args: TArgs + ): Timeout; + + declare export function setInterval>( + callback: (...args: TArgs) => unknown, + delay?: number, + ...args: TArgs + ): Timeout; + + declare export function setImmediate>( + callback: (...args: TArgs) => unknown, + ...args: TArgs + ): Immediate; + + declare export function clearTimeout(timeout?: Timeout | number): void; + declare export function clearInterval(timeout?: Timeout | number): void; + declare export function clearImmediate(immediate?: Immediate | number): void; +} + +declare module 'timers/promises' { + declare export type TimerOptions = Readonly<{ + ref?: boolean, + signal?: AbortSignal, + }>; + + declare export function setTimeout( + delay?: number, + value?: T, + options?: TimerOptions, + ): Promise; + + declare export function setImmediate( + value?: T, + options?: TimerOptions, + ): Promise; + + declare export function setInterval( + delay?: number, + value?: T, + options?: TimerOptions, + ): AsyncIterator; + + declare export var scheduler: Readonly<{ + wait(delay: number, options?: TimerOptions): Promise, + yield(): Promise, + }>; +} + declare module 'url' { declare type Url = {| protocol: string | null, @@ -2990,8 +4071,16 @@ declare module 'url' { declare function resolve(from: string, to: string): string; declare function domainToASCII(domain: string): string; declare function domainToUnicode(domain: string): string; - declare function pathToFileURL(path: string): url$urlObject; - declare function fileURLToPath(path: url$urlObject | string): string; + + declare function pathToFileURL( + path: string, + options?: Readonly<{windows?: boolean}>, + ): url$urlObject; + + declare function fileURLToPath( + path: url$urlObject | string, + options?: Readonly<{windows?: boolean}>, + ): string; declare class URLSearchParams { @@iterator(): Iterator<[string, string]>; @@ -3013,7 +4102,7 @@ declare module 'url' { value: string, name: string, searchParams: URLSearchParams, - ) => mixed, + ) => unknown, thisArg?: This, ): void; get(name: string): string | null; @@ -3027,6 +4116,7 @@ declare module 'url' { } declare class URL { static canParse(url: string, base?: string): boolean; + static parse(input: string, base?: string): URL | null; static createObjectURL(blob: Blob): string; static createObjectURL(mediaSource: MediaSource): string; static revokeObjectURL(url: string): void; @@ -3046,6 +4136,63 @@ declare module 'url' { toString(): string; toJSON(): string; } + + declare type url$URLPatternInit = { + protocol?: string, + username?: string, + password?: string, + hostname?: string, + port?: string, + pathname?: string, + search?: string, + hash?: string, + baseURL?: string, + }; + + declare type url$URLPatternComponentResult = { + input: string, + groups: {[key: string]: string | void}, + }; + + declare type url$URLPatternResult = { + inputs: ReadonlyArray, + protocol: url$URLPatternComponentResult, + username: url$URLPatternComponentResult, + password: url$URLPatternComponentResult, + hostname: url$URLPatternComponentResult, + port: url$URLPatternComponentResult, + pathname: url$URLPatternComponentResult, + search: url$URLPatternComponentResult, + hash: url$URLPatternComponentResult, + }; + + declare class URLPattern { + constructor( + input?: string | url$URLPatternInit, + options?: Readonly<{ignoreCase?: boolean}>, + ): void; + constructor( + input: string | url$URLPatternInit, + baseURL: string, + options?: Readonly<{ignoreCase?: boolean}>, + ): void; + + +hasRegExpGroups: boolean; + +hash: string; + +hostname: string; + +password: string; + +pathname: string; + +port: string; + +protocol: string; + +search: string; + +username: string; + + exec( + input?: string | url$URLPatternInit, + baseURL?: string, + ): url$URLPatternResult | null; + test(input?: string | url$URLPatternInit, baseURL?: string): boolean; + } } type util$InspectOptions = { @@ -3057,30 +4204,30 @@ type util$InspectOptions = { }; declare type util$ParseArgsOption = - | {| + | Readonly<{ type: 'boolean', multiple?: false, short?: string, default?: boolean, - |} - | {| + }> + | Readonly<{ type: 'boolean', multiple: true, short?: string, default?: Array, - |} - | {| + }> + | Readonly<{ type: 'string', multiple?: false, short?: string, default?: string, - |} - | {| + }> + | Readonly<{ type: 'string', multiple: true, short?: string, default?: Array, - |}; + }>; type util$ParseArgsOptionToValue = TOption['type'] extends 'boolean' ? TOption['multiple'] extends true @@ -3137,31 +4284,33 @@ declare module 'util' { declare function stripVTControlCharacters(str: string): string; declare function parseArgs< - TOptions: {[string]: util$ParseArgsOption} = {||}, - >(config: {| + TOptions: {+[string]: util$ParseArgsOption} = {}, + >(config: { args?: Array, options?: TOptions, strict?: boolean, allowPositionals?: boolean, + allowNegative?: boolean, tokens?: false, - |}): {| + }): { values: util$ParseArgsOptionsToValues, positionals: Array, - |}; + }; declare function parseArgs< - TOptions: {[string]: util$ParseArgsOption} = {||}, - >(config: {| + TOptions: {[string]: util$ParseArgsOption} = {}, + >(config: { args?: Array, options?: TOptions, strict?: boolean, allowPositionals?: boolean, + allowNegative?: boolean, tokens: true, - |}): {| + }): { values: util$ParseArgsOptionsToValues, positionals: Array, tokens: Array, - |}; + }; declare class TextDecoder { constructor( @@ -3187,46 +4336,87 @@ declare module 'util' { encoding: string; } + declare class MIMEType { + constructor(input: string): void; + type: string; + subtype: string; + +essence: string; + +params: MIMEParams; + toString(): string; + } + + declare class MIMEParams { + delete(name: string): void; + get(name: string): ?string; + has(name: string): boolean; + set(name: string, value: string): void; + entries(): Iterator<[string, string]>; + keys(): Iterator; + values(): Iterator; + } + + declare function parseEnv(content: string): {[key: string]: string, ...}; + + declare type util$DiffEntry = [operation: -1 | 0 | 1, value: string]; + declare function diff( + actual: string | ReadonlyArray, + expected: string | ReadonlyArray, + ): Array; + + declare function getSystemErrorMessage(err: number): string; + + declare type util$CallSiteObject = { + functionName: string, + scriptName: string, + scriptId: string, + lineNumber: number, + columnNumber: number, + }; + declare function getCallSites( + frameCountOrOptions?: number | Readonly<{frameCount?: number}>, + ): Array; + declare var types: { - isAnyArrayBuffer: (value: mixed) => boolean, - isArgumentsObject: (value: mixed) => boolean, - isArrayBuffer: (value: mixed) => boolean, - isAsyncFunction: (value: mixed) => boolean, - isBigInt64Array: (value: mixed) => boolean, - isBigUint64Array: (value: mixed) => boolean, - isBooleanObject: (value: mixed) => boolean, - isBoxedPrimitive: (value: mixed) => boolean, - isDataView: (value: mixed) => boolean, - isDate: (value: mixed) => boolean, - isExternal: (value: mixed) => boolean, - isFloat32Array: (value: mixed) => boolean, - isFloat64Array: (value: mixed) => boolean, - isGeneratorFunction: (value: mixed) => boolean, - isGeneratorObject: (value: mixed) => boolean, - isInt8Array: (value: mixed) => boolean, - isInt16Array: (value: mixed) => boolean, - isInt32Array: (value: mixed) => boolean, - isMap: (value: mixed) => boolean, - isMapIterator: (value: mixed) => boolean, - isModuleNamespaceObject: (value: mixed) => boolean, - isNativeError: (value: mixed) => boolean, - isNumberObject: (value: mixed) => boolean, - isPromise: (value: mixed) => boolean, - isProxy: (value: mixed) => boolean, - isRegExp: (value: mixed) => boolean, - isSet: (value: mixed) => boolean, - isSetIterator: (value: mixed) => boolean, - isSharedArrayBuffer: (value: mixed) => boolean, - isStringObject: (value: mixed) => boolean, - isSymbolObject: (value: mixed) => boolean, - isTypedArray: (value: mixed) => boolean, - isUint8Array: (value: mixed) => boolean, - isUint8ClampedArray: (value: mixed) => boolean, - isUint16Array: (value: mixed) => boolean, - isUint32Array: (value: mixed) => boolean, - isWeakMap: (value: mixed) => boolean, - isWeakSet: (value: mixed) => boolean, - isWebAssemblyCompiledModule: (value: mixed) => boolean, + isAnyArrayBuffer: (value: unknown) => boolean, + isArgumentsObject: (value: unknown) => boolean, + isArrayBuffer: (value: unknown) => boolean, + isAsyncFunction: (value: unknown) => boolean, + isBigInt64Array: (value: unknown) => boolean, + isBigUint64Array: (value: unknown) => boolean, + isBooleanObject: (value: unknown) => boolean, + isBoxedPrimitive: (value: unknown) => boolean, + isDataView: (value: unknown) => boolean, + isDate: (value: unknown) => boolean, + isExternal: (value: unknown) => boolean, + isFloat16Array: (value: unknown) => boolean, + isFloat32Array: (value: unknown) => boolean, + isFloat64Array: (value: unknown) => boolean, + isGeneratorFunction: (value: unknown) => boolean, + isGeneratorObject: (value: unknown) => boolean, + isInt8Array: (value: unknown) => boolean, + isInt16Array: (value: unknown) => boolean, + isInt32Array: (value: unknown) => boolean, + isMap: (value: unknown) => boolean, + isMapIterator: (value: unknown) => boolean, + isModuleNamespaceObject: (value: unknown) => boolean, + isNativeError: (value: unknown) => boolean, + isNumberObject: (value: unknown) => boolean, + isPromise: (value: unknown) => boolean, + isProxy: (value: unknown) => boolean, + isRegExp: (value: unknown) => boolean, + isSet: (value: unknown) => boolean, + isSetIterator: (value: unknown) => boolean, + isSharedArrayBuffer: (value: unknown) => boolean, + isStringObject: (value: unknown) => boolean, + isSymbolObject: (value: unknown) => boolean, + isTypedArray: (value: unknown) => boolean, + isUint8Array: (value: unknown) => boolean, + isUint8ClampedArray: (value: unknown) => boolean, + isUint16Array: (value: unknown) => boolean, + isUint32Array: (value: unknown) => boolean, + isWeakMap: (value: unknown) => boolean, + isWeakSet: (value: unknown) => boolean, + isWebAssemblyCompiledModule: (value: unknown) => boolean, ... }; @@ -3289,11 +4479,11 @@ declare module 'util' { | ForegroundColors | BackgroundColors | Modifiers - | $ReadOnlyArray, + | ReadonlyArray, text: string, - options?: $ReadOnly<{ + options?: Readonly<{ stream?: ?stream$Stream, - validStream?: ?boolean, + validateStream?: ?boolean, }>, ): string; } @@ -3402,6 +4592,20 @@ type zlib$brotliOptions = { ... }; +type zlib$zstdOptions = { + flush?: number, + finishFlush?: number, + chunkSize?: number, + params?: { + [number]: boolean | number, + ... + }, + maxOutputLength?: number, + info?: boolean, + dictionary?: Buffer, + ... +}; + type zlib$syncFn = ( buffer: Buffer | $TypedArray | DataView | ArrayBuffer | string, options?: zlib$options, @@ -3579,6 +4783,79 @@ declare module 'zlib' { BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: number, BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: number, BROTLI_DECODER_ERROR_UNREACHABL: number, + + ZSTD_COMPRESS: number, + ZSTD_DECOMPRESS: number, + + // Default compression level for zstd streams + ZSTD_CLEVEL_DEFAULT: number, + + // Keys for zlib$zstdOptions['params'] + ZSTD_c_compressionLevel: number, + ZSTD_c_windowLog: number, + ZSTD_c_hashLog: number, + ZSTD_c_chainLog: number, + ZSTD_c_searchLog: number, + ZSTD_c_minMatch: number, + ZSTD_c_targetLength: number, + ZSTD_c_strategy: number, + ZSTD_c_enableLongDistanceMatching: number, + ZSTD_c_ldmHashLog: number, + ZSTD_c_ldmMinMatch: number, + ZSTD_c_ldmBucketSizeLog: number, + ZSTD_c_ldmHashRateLog: number, + ZSTD_c_contentSizeFlag: number, + ZSTD_c_checksumFlag: number, + ZSTD_c_dictIDFlag: number, + ZSTD_c_nbWorkers: number, + ZSTD_c_jobSize: number, + ZSTD_c_overlapLog: number, + + // Flush operations + ZSTD_e_continue: number, + ZSTD_e_flush: number, + ZSTD_e_end: number, + + // Values for the ZSTD_c_strategy parameter + ZSTD_fast: number, + ZSTD_dfast: number, + ZSTD_greedy: number, + ZSTD_lazy: number, + ZSTD_lazy2: number, + ZSTD_btlazy2: number, + ZSTD_btopt: number, + ZSTD_btultra: number, + ZSTD_btultra2: number, + + // Error codes + ZSTD_error_no_error: number, + ZSTD_error_GENERIC: number, + ZSTD_error_prefix_unknown: number, + ZSTD_error_version_unsupported: number, + ZSTD_error_frameParameter_unsupported: number, + ZSTD_error_frameParameter_windowTooLarge: number, + ZSTD_error_corruption_detected: number, + ZSTD_error_checksum_wrong: number, + ZSTD_error_literals_headerWrong: number, + ZSTD_error_dictionary_corrupted: number, + ZSTD_error_dictionary_wrong: number, + ZSTD_error_dictionaryCreation_failed: number, + ZSTD_error_parameter_unsupported: number, + ZSTD_error_parameter_combination_unsupported: number, + ZSTD_error_parameter_outOfBound: number, + ZSTD_error_tableLog_tooLarge: number, + ZSTD_error_maxSymbolValue_tooLarge: number, + ZSTD_error_maxSymbolValue_tooSmall: number, + ZSTD_error_stabilityCondition_notRespected: number, + ZSTD_error_stage_wrong: number, + ZSTD_error_init_missing: number, + ZSTD_error_memory_allocation: number, + ZSTD_error_workSpace_tooSmall: number, + ZSTD_error_dstSize_tooSmall: number, + ZSTD_error_srcSize_wrong: number, + ZSTD_error_dstBuffer_null: number, + ZSTD_error_noForwardProgress_destFull: number, + ZSTD_error_noForwardProgress_inputEmpty: number, ... }; declare var codes: { @@ -3598,6 +4875,8 @@ declare module 'zlib' { } declare class BrotliCompress extends Zlib {} declare class BrotliDecompress extends Zlib {} + declare class ZstdCompress extends Zlib {} + declare class ZstdDecompress extends Zlib {} declare class Deflate extends Zlib {} declare class Inflate extends Zlib {} declare class Gzip extends Zlib {} @@ -3618,6 +4897,10 @@ declare module 'zlib' { declare function createGzip(options?: zlib$options): Gzip; declare function createGunzip(options?: zlib$options): Gunzip; declare function createUnzip(options?: zlib$options): Unzip; + declare function createZstdCompress(options?: zlib$zstdOptions): ZstdCompress; + declare function createZstdDecompress( + options?: zlib$zstdOptions, + ): ZstdDecompress; declare var brotliCompress: zlib$brotliAsyncFn; declare var brotliCompressSync: zlib$brotliSyncFn; declare var brotliDeompress: zlib$brotliAsyncFn; @@ -3688,6 +4971,10 @@ declare module 'assert' { }; } +declare module 'assert/strict' { + declare module.exports: $Exports<'assert'>['strict']; +} + type HeapCodeStatistics = { code_and_metadata_size: number, bytecode_and_metadata_size: number, @@ -3965,18 +5252,18 @@ declare class Process extends events$EventEmitter { emitWarning(warning: string | Error): void; emitWarning( warning: string, - typeOrCtor: string | ((...empty) => mixed), + typeOrCtor: string | ((...empty) => unknown), ): void; emitWarning( warning: string, type: string, - codeOrCtor: string | ((...empty) => mixed), + codeOrCtor: string | ((...empty) => unknown), ): void; emitWarning( warning: string, type: string, code: string, - ctor?: (...empty) => mixed, + ctor?: (...empty) => unknown, ): void; execArgv: Array; execPath: string; @@ -3995,15 +5282,18 @@ declare class Process extends events$EventEmitter { initgroups?: (user: number | string, extra_group: number | string) => void; kill(pid: number, signal?: string | number): void; mainModule: Object; - memoryUsage(): { - arrayBuffers: number, - rss: number, - heapTotal: number, - heapUsed: number, - external: number, - ... + memoryUsage: { + (): { + arrayBuffers: number, + rss: number, + heapTotal: number, + heapUsed: number, + external: number, + ... + }, + rss: () => number, }; - nextTick: (cb: (...T) => mixed, ...T) => void; + nextTick: (cb: (...T) => unknown, ...T) => void; pid: number; platform: string; release: { @@ -4044,61 +5334,11 @@ declare var __filename: string; declare var __dirname: string; declare function setImmediate( - callback: (...args: Array) => mixed, + callback: (...args: Array) => unknown, ...args: Array ): Object; declare function clearImmediate(immediateObject: any): Object; -// https://nodejs.org/api/esm.html#node-imports - -declare module 'node:assert' { - declare module.exports: $Exports<'assert'>; -} - -declare module 'node:assert/strict' { - declare module.exports: $Exports<'assert'>['strict']; -} - -declare module 'node:events' { - declare module.exports: $Exports<'events'>; -} - -declare module 'node:fs' { - declare module.exports: $Exports<'fs'>; -} - -declare module 'node:os' { - declare module.exports: $Exports<'os'>; -} - -declare module 'fs/promises' { - declare module.exports: $Exports<'fs'>['promises']; -} - -declare module 'node:fs/promises' { - declare module.exports: $Exports<'fs'>['promises']; -} - -declare module 'node:path' { - declare module.exports: $Exports<'path'>; -} - -declare module 'process' { - declare module.exports: Process; -} - -declare module 'node:process' { - declare module.exports: $Exports<'process'>; -} - -declare module 'node:util' { - declare module.exports: $Exports<'util'>; -} - -declare module 'node:url' { - declare module.exports: $Exports<'url'>; -} - declare module 'worker_threads' { declare var isMainThread: boolean; declare var parentPort: null | MessagePort; @@ -4274,6 +5514,93 @@ declare module 'worker_threads' { } } +// https://nodejs.org/api/esm.html#node-imports + +declare module 'node:assert' { + export type * from 'assert'; + declare module.exports: $Exports<'assert'>; +} + +declare module 'node:assert/strict' { + export type * from 'assert/strict'; + declare module.exports: $Exports<'assert'>['strict']; +} + +declare module 'node:child_process' { + export type * from 'child_process'; + declare module.exports: $Exports<'child_process'>; +} + +declare module 'node:cluster' { + export type * from 'cluster'; + declare module.exports: $Exports<'cluster'>; +} + +declare module 'node:crypto' { + export type * from 'crypto'; + declare module.exports: $Exports<'crypto'>; +} + +declare module 'node:dns' { + export type * from 'dns'; + declare module.exports: $Exports<'dns'>; +} + +declare module 'node:events' { + export type * from 'events'; + declare module.exports: $Exports<'events'>; +} + +declare module 'node:fs' { + export type * from 'fs'; + declare module.exports: $Exports<'fs'>; +} + +declare module 'node:fs/promises' { + export type * from 'fs/promises'; + declare module.exports: $Exports<'fs'>['promises']; +} + +declare module 'node:os' { + export type * from 'os'; + declare module.exports: $Exports<'os'>; +} + +declare module 'node:path' { + export type * from 'path'; + declare module.exports: $Exports<'path'>; +} + +declare module 'node:perf_hooks' { + export type * from 'perf_hooks'; + declare module.exports: $Exports<'perf_hooks'>; +} + +declare module 'node:process' { + export type * from 'process'; + declare module.exports: $Exports<'process'>; +} + +declare module 'node:timers' { + export type * from 'timers'; + declare module.exports: $Exports<'timers'>; +} + +declare module 'node:timers/promises' { + export type * from 'timers/promises'; + declare module.exports: $Exports<'timers/promises'>; +} + +declare module 'node:url' { + declare module.exports: $Exports<'url'>; +} + +declare module 'node:util' { + export type * from 'util'; + declare module.exports: $Exports<'util'>; +} + declare module 'node:worker_threads' { + export type * from 'worker_threads'; declare module.exports: $Exports<'worker_threads'>; } diff --git a/flow-typed/npm/@expo/spawn-async_v1.x.x.js b/flow-typed/npm/@expo/spawn-async_v1.x.x.js new file mode 100644 index 000000000000..1e60d38129da --- /dev/null +++ b/flow-typed/npm/@expo/spawn-async_v1.x.x.js @@ -0,0 +1,46 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +declare module '@expo/spawn-async' { + type SpawnOptions = { + cwd?: string, + env?: Object, + argv0?: string, + stdio?: string | Array, + detached?: boolean, + uid?: number, + gid?: number, + shell?: boolean | string, + windowsVerbatimArguments?: boolean, + windowsHide?: boolean, + encoding?: string, + ignoreStdio?: boolean, + }; + + declare class SpawnPromise extends Promise { + child: child_process$ChildProcess; + } + type SpawnResult = { + pid?: number, + output: string[], + stdout: string, + stderr: string, + status: number | null, + signal: string | null, + }; + + declare function spawnAsync( + command: string, + args?: ReadonlyArray, + options?: SpawnOptions, + ): SpawnPromise; + + declare module.exports: typeof spawnAsync; +} diff --git a/flow-typed/npm/@octokit/rest_v22.x.x.js b/flow-typed/npm/@octokit/rest_v22.x.x.js new file mode 100644 index 000000000000..4d3fbfccb4d2 --- /dev/null +++ b/flow-typed/npm/@octokit/rest_v22.x.x.js @@ -0,0 +1,61 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +// Partial types for Octokit based on the usage in react-native-github +declare module '@octokit/rest' { + declare class Octokit { + constructor(options?: {auth?: string, ...}): this; + + repos: Readonly<{ + listReleaseAssets: ( + params: Readonly<{ + owner: string, + repo: string, + release_id: string, + }>, + ) => Promise<{ + data: Array<{ + id: string, + name: string, + ... + }>, + ... + }>, + uploadReleaseAsset: ( + params: Readonly<{ + owner: string, + repo: string, + release_id: string, + name: string, + data: Buffer, + headers: Readonly<{ + 'content-type': string, + ... + }>, + ... + }>, + ) => Promise<{ + data: { + browser_download_url: string, + ... + }, + ... + }>, + deleteReleaseAsset: (params: { + owner: string, + repo: string, + asset_id: string, + ... + }) => Promise, + }>; + } + + declare export {Octokit}; +} diff --git a/flow-typed/npm/@react-native-community/cli-server-api_v19.x.x.js b/flow-typed/npm/@react-native-community/cli-server-api_v19.x.x.js index b8bcc3c40931..33f2f7d9fbad 100644 --- a/flow-typed/npm/@react-native-community/cli-server-api_v19.x.x.js +++ b/flow-typed/npm/@react-native-community/cli-server-api_v19.x.x.js @@ -13,7 +13,7 @@ declare module '@react-native-community/cli-server-api' { declare type MiddlewareOptions = { host?: string, - watchFolders: $ReadOnlyArray, + watchFolders: ReadonlyArray, port: number, }; @@ -32,7 +32,7 @@ declare module '@react-native-community/cli-server-api' { server: ws$WebSocketServer, broadcast: ( method: string, - params?: Record | null, + params?: Record | null, ) => void, }, eventsSocketEndpoint: { diff --git a/flow-typed/npm/babel-traverse_v7.x.x.js b/flow-typed/npm/babel-traverse_v7.x.x.js index 1cd8df07b182..bbebfb8332bd 100644 --- a/flow-typed/npm/babel-traverse_v7.x.x.js +++ b/flow-typed/npm/babel-traverse_v7.x.x.js @@ -53,7 +53,7 @@ declare module '@babel/traverse' { constructor( scope: Scope, - opts: TraverseOptions, + opts: TraverseOptions, state: any, parentPath: NodePath<>, ): TraversalContext; @@ -97,7 +97,7 @@ declare module '@babel/traverse' { /** Traverse node with current scope and path. */ traverse( node: BabelNode | Array, - opts: $ReadOnly>, + opts: Readonly>, state: S, ): void; @@ -298,12 +298,12 @@ declare module '@babel/traverse' { parent: BabelNode; hub: HubInterface; contexts: Array; - data: {[key: string]: mixed} | null; + data: {[key: string]: unknown} | null; shouldSkip: boolean; shouldStop: boolean; removed: boolean; - state: mixed; - +opts: $ReadOnly> | null; + state: unknown; + +opts: Readonly> | null; skipKeys: null | {[key: string]: boolean}; parentPath: ?NodePath<>; context: TraversalContext; @@ -338,7 +338,7 @@ declare module '@babel/traverse' { getScope(scope: Scope): Scope; setData(key: string, val: TVal): TVal; - getData(key: string, def?: TVal): TVal; + getData(key: string, def?: TVal): TVal; buildCodeFrameError( msg: string, @@ -346,7 +346,7 @@ declare module '@babel/traverse' { ): TError; traverse( - visitor: $ReadOnly>, + visitor: Readonly>, state: TState, ): void; @@ -390,9 +390,7 @@ declare module '@babel/traverse' { * Earliest is defined as being "before" all the other nodes in terms of list container * position and visiting key. */ - getEarliestCommonAncestorFrom( - paths: $ReadOnlyArray>, - ): NodePath<>; + getEarliestCommonAncestorFrom(paths: ReadonlyArray>): NodePath<>; /** * Get the earliest path in the tree where the provided `paths` intersect. @@ -400,7 +398,7 @@ declare module '@babel/traverse' { * TODO: Possible optimisation target. */ getDeepestCommonAncestorFrom( - paths: $ReadOnlyArray>, + paths: ReadonlyArray>, filter?: ( lastCommon: BabelNode, lastCommonIndex: number, @@ -558,24 +556,24 @@ declare module '@babel/traverse' { * Check whether we have the input `key`. If the `key` references an array then we check * if the array has any items, otherwise we just check if it's falsy. */ - has(key: $Keys): boolean; + has(key: keyof TNode): boolean; isStatic(): boolean; /** * Alias of `has`. */ - is(key: $Keys): boolean; + is(key: keyof TNode): boolean; /** * Opposite of `has`. */ - isnt(key: $Keys): boolean; + isnt(key: keyof TNode): boolean; /** * Check whether the path node `key` strict equals `value`. */ - equals(key: $Keys, value: any): boolean; + equals(key: keyof TNode, value: any): boolean; /** * Check the type against our stored internal type of the node. This is handy when a node has @@ -726,7 +724,7 @@ declare module '@babel/traverse' { getAllPrevSiblings(): Array>; - get>( + get( key: TKey, context?: boolean | TraversalContext, ): TNode[TKey] extends BabelNode ? NodePath<> : Array>; @@ -1444,7 +1442,7 @@ declare module '@babel/traverse' { | VisitNodeFunction | VisitNodeObject; - declare export type Visitor = $ReadOnly<{ + declare export type Visitor = Readonly<{ enter?: VisitNodeFunction, exit?: VisitNodeFunction, @@ -1872,7 +1870,7 @@ declare module '@babel/traverse' { explode(visitor: Visitor): Visitor, verify(visitor: Visitor): void, merge( - visitors: Array<$ReadOnly>>, + visitors: Array>>, states: Array, wrapper?: ?Function, ): Array>, @@ -1881,8 +1879,8 @@ declare module '@babel/traverse' { declare export var visitors: Visitors; declare export type Cache = { - path: $ReadOnlyWeakMap, - scope: $ReadOnlyWeakMap, + path: $ReadOnlyWeakMap, + scope: $ReadOnlyWeakMap, clear(): void, clearPath(): void, clearScope(): void, @@ -1891,7 +1889,7 @@ declare module '@babel/traverse' { declare export type Traverse = { ( parent?: BabelNode | Array, - opts?: $ReadOnly>, + opts?: Readonly>, scope?: ?Scope, state: TState, parentPath?: ?NodePath, @@ -1909,7 +1907,7 @@ declare module '@babel/traverse' { node( node: BabelNode, - opts: $ReadOnly>, + opts: Readonly>, scope: Scope, state: TState, parentPath: NodePath<>, diff --git a/flow-typed/npm/babel-types_v7.x.x.js b/flow-typed/npm/babel-types_v7.x.x.js index 61072e5245bd..d8d791a6bb9b 100644 --- a/flow-typed/npm/babel-types_v7.x.x.js +++ b/flow-typed/npm/babel-types_v7.x.x.js @@ -3846,7 +3846,7 @@ declare module "@babel/types" { enter?: TraversalHandler, exit?: TraversalHandler, }; - declare export function traverse(n: BabelNode, TraversalHandler | TraversalHandlers, state?: T): void; + declare export function traverse(n: BabelNode, handler: TraversalHandler | TraversalHandlers, state?: T): void; declare export function traverseFast(n: Node, h: TraversalHandler, state?: T): void; declare export function shallowEqual(actual: Object, expected: Object): boolean declare export function buildMatchMemberExpression(match: string, allowPartial?: boolean): (?BabelNode) => boolean diff --git a/flow-typed/npm/babel_v7.x.x.js b/flow-typed/npm/babel_v7.x.x.js index 53953323b240..f9d293c16c15 100644 --- a/flow-typed/npm/babel_v7.x.x.js +++ b/flow-typed/npm/babel_v7.x.x.js @@ -10,7 +10,7 @@ 'use strict'; -type _BabelSourceMap = $ReadOnly<{ +type _BabelSourceMap = Readonly<{ file?: string, mappings: string, names: Array, @@ -28,9 +28,9 @@ type _BabelSourceMapSegment = { ... }; -export type BabelSourceLocation = $ReadOnly<{ - start: $ReadOnly<{line: number, column: number}>, - end: $ReadOnly<{line: number, column: number}>, +export type BabelSourceLocation = Readonly<{ + start: Readonly<{line: number, column: number}>, + end: Readonly<{line: number, column: number}>, }>; declare module '@babel/parser' { @@ -304,9 +304,9 @@ declare module '@babel/core' { declare class Store { constructor(): Store; - setDynamic(key: string, fn: () => mixed): void; - set(key: string, val: mixed): void; - get(key: string): mixed; + setDynamic(key: string, fn: () => unknown): void; + set(key: string, val: unknown): void; + get(key: string): unknown; } declare export class File extends Store { @@ -330,7 +330,7 @@ declare module '@babel/core' { constructor( options: BabelCoreOptions, - input: $ReadOnly<{ast: BabelNode, code: string, inputMap: any}>, + input: Readonly<{ast: BabelNode, code: string, inputMap: any}>, ): File; getMetadata(): void; @@ -367,7 +367,7 @@ declare module '@babel/core' { transform(): TransformResult<>; - wrap(code: string, callback: () => mixed): TransformResult<>; + wrap(code: string, callback: () => unknown): TransformResult<>; addCode(code: string): void; @@ -394,7 +394,7 @@ declare module '@babel/core' { declare export type PluginObj = { name?: string, - inherits?: mixed, + inherits?: unknown, maniuplateOptions?: ( opts: BabelCoreOptions, parserOpts: ParserOptions, @@ -411,7 +411,7 @@ declare module '@babel/core' { // but have not yet been executed to call functions with options. declare export type UnloadedDescriptor = { name: string | void, - value: PluginObj | (() => PluginObj), + value: PluginObj | (() => PluginObj), options: EntryOptions, dirname: string, alias: string, @@ -423,7 +423,7 @@ declare module '@babel/core' { }; declare export class ConfigItem { - +value: PluginObj | (() => PluginObj); + +value: PluginObj | (() => PluginObj); +options: EntryOptions; +dirname: string; +name: string | void; @@ -924,8 +924,8 @@ declare module '@babel/core' { |}; declare type TransformCallback = - | ((Error, null) => mixed) - | ((null, TransformResult | null) => mixed); + | ((Error, null) => unknown) + | ((null, TransformResult | null) => unknown); /** * Transforms the passed in code. Calling a callback with an object with the generated code, source map, and AST. @@ -1027,7 +1027,7 @@ declare module '@babel/core' { declare export var template: Template; declare export var traverse: Traverse; declare export var types: Types; - declare export var DEFAULT_EXTENSIONS: $ReadOnlyArray; + declare export var DEFAULT_EXTENSIONS: ReadonlyArray; declare export function buildExternalHelpers( whitelist?: Array, @@ -1059,27 +1059,27 @@ declare module '@babel/core' { declare export type ResolvedConfig = { options: BabelCoreOptions, - passes: Array | (() => PluginObj)>>, + passes: Array | (() => PluginObj)>>, }; declare export function loadOptions( - options?: mixed, + options?: unknown, callback: - | ((error: Error, null) => mixed) - | ((null, config: ResolvedConfig | null) => mixed), + | ((error: Error, null) => unknown) + | ((null, config: ResolvedConfig | null) => unknown), ): void; declare export function loadOptionsSync( - options?: mixed, + options?: unknown, ): ResolvedConfig | null; declare export function loadOptionsAsync( - options?: mixed, + options?: unknown, ): Promise; // For now declare type ValidatedOptions = BabelCoreOptions; declare class PartialConfig { - +options: $ReadOnly; + +options: Readonly; +babelrc: string | void; +babelignore: string | void; +config: string | void; @@ -1090,16 +1090,16 @@ declare module '@babel/core' { } declare export function loadPartialConfig( - options?: mixed, + options?: unknown, callback: - | ((error: Error, null) => mixed) - | ((null, config: PartialConfig | null) => mixed), + | ((error: Error, null) => unknown) + | ((null, config: PartialConfig | null) => unknown), ): void; declare export function loadPartialConfigSync( - options?: mixed, + options?: unknown, ): PartialConfig | null; declare export function loadPartialConfigAsync( - options?: mixed, + options?: unknown, ): Promise; } @@ -1189,7 +1189,7 @@ declare module '@babel/generator' { jsecsOption?: {...}, decoratorsBeforeExport?: boolean, - recordAndTupleSyntaxType?: mixed, + recordAndTupleSyntaxType?: unknown, /** * Enable generating source maps @@ -1283,13 +1283,13 @@ declare module '@babel/template' { (tpl: string, opts: ?PublicOpts): (?PublicReplacements) => T, // Building from a template literal produces an AST builder function by default. - (tpl: Array, ...args: Array): (?PublicReplacements) => T, + (tpl: Array, ...args: Array): (?PublicReplacements) => T, // Allow users to explicitly create templates that produce ASTs, skipping // the need for an intermediate function. ast: { (tpl: string, opts: ?PublicOpts): T, - (tpl: Array, ...args: Array): T, + (tpl: Array, ...args: Array): T, }, }; @@ -1321,14 +1321,17 @@ declare module '@babel/template' { // Building from a template literal produces an AST builder function by default. ( tpl: Array, - ...args: Array + ...args: Array ): (?PublicReplacements) => Statement | Array, // Allow users to explicitly create templates that produce ASTs, skipping // the need for an intermediate function. ast: { (tpl: string, opts: ?PublicOpts): Statement | Array, - (tpl: Array, ...args: Array): Statement | Array, + ( + tpl: Array, + ...args: Array + ): Statement | Array, }, }; diff --git a/flow-typed/npm/chrome-launcher_v0.15.x.js b/flow-typed/npm/chrome-launcher_v0.15.x.js index b72a756ab929..4f7a3fef11a2 100644 --- a/flow-typed/npm/chrome-launcher_v0.15.x.js +++ b/flow-typed/npm/chrome-launcher_v0.15.x.js @@ -16,7 +16,7 @@ declare module 'chrome-launcher' { declare export type Options = { startingUrl?: string, chromeFlags?: Array, - prefs?: mixed, + prefs?: unknown, port?: number, handleSIGINT?: boolean, chromePath?: string, diff --git a/flow-typed/npm/chromium-edge-launcher_v0.2.x.js b/flow-typed/npm/chromium-edge-launcher_v0.2.x.js index ab8d7e0313ba..0b74594465da 100644 --- a/flow-typed/npm/chromium-edge-launcher_v0.2.x.js +++ b/flow-typed/npm/chromium-edge-launcher_v0.2.x.js @@ -16,7 +16,7 @@ declare module 'chromium-edge-launcher' { declare export type Options = { startingUrl?: string, edgeFlags?: Array, - prefs?: mixed, + prefs?: unknown, port?: number, handleSIGINT?: boolean, edgePath?: string, diff --git a/flow-typed/npm/connect_v3.x.x.js b/flow-typed/npm/connect_v3.x.x.js index 0195559e06ff..b76ac5582952 100644 --- a/flow-typed/npm/connect_v3.x.x.js +++ b/flow-typed/npm/connect_v3.x.x.js @@ -13,7 +13,7 @@ declare module 'connect' { declare export type ServerHandle = HandleFunction | http.Server; - declare type NextFunction = (err?: mixed) => void; + declare type NextFunction = (err?: unknown) => void; declare export type NextHandleFunction = ( req: IncomingMessage, diff --git a/flow-typed/npm/debug_v4.4.x.js b/flow-typed/npm/debug_v4.4.x.js index fea4ad05c4d5..bc1ef24062b3 100644 --- a/flow-typed/npm/debug_v4.4.x.js +++ b/flow-typed/npm/debug_v4.4.x.js @@ -12,15 +12,15 @@ declare module 'debug' { declare interface Formatters { - [formatter: string]: (v: mixed) => string; + [formatter: string]: (v: unknown) => string; } declare type Debugger = {| - (format: mixed, ...args: Array): void, + (format: unknown, ...args: Array): void, color: string, diff: number, enabled: boolean, - log: (format: mixed, ...args: Array) => mixed, + log: (format: unknown, ...args: Array) => unknown, namespace: string, destroy: () => boolean, extend: (namespace: string, delimiter?: string) => Debugger, @@ -28,12 +28,12 @@ declare module 'debug' { declare type Debug = {| (namespace: string): Debugger, - coerce: (val: mixed) => mixed, + coerce: (val: unknown) => unknown, disable: () => string, enable: (namespaces: string) => void, enabled: (namespaces: string) => boolean, - formatArgs: (args: Array) => void, - log: (format: mixed, ...args: Array) => mixed, + formatArgs: (args: Array) => void, + log: (format: unknown, ...args: Array) => unknown, selectColor: (namespace: string) => string | number, // this should be of type require('ms') but it doesn't play nicely with eslint // unless we add ms to dependencies, which we don't want to do diff --git a/flow-typed/npm/deep-equal_v1.x.x.js b/flow-typed/npm/deep-equal_v1.x.x.js index 215eb356778f..bcb809abed34 100644 --- a/flow-typed/npm/deep-equal_v1.x.x.js +++ b/flow-typed/npm/deep-equal_v1.x.x.js @@ -10,8 +10,8 @@ declare module 'deep-equal' { declare module.exports: ( - actual: mixed, - expected: mixed, + actual: unknown, + expected: unknown, options?: {strict: boolean}, ) => boolean; } diff --git a/flow-typed/npm/electron-packager_v18.x.x.js b/flow-typed/npm/electron-packager_v18.x.x.js index f77d694e7aca..4ac8b158eb5c 100644 --- a/flow-typed/npm/electron-packager_v18.x.x.js +++ b/flow-typed/npm/electron-packager_v18.x.x.js @@ -46,7 +46,7 @@ declare module '@electron/packager' { declare export type OsxUniversalOptions = $FlowFixMe; - declare export type Win32MetadataOptions = $ReadOnly<{ + declare export type Win32MetadataOptions = Readonly<{ CompanyName?: string, FileDescription?: string, OriginalFilename?: string, diff --git a/flow-typed/npm/execa_v5.x.x.js b/flow-typed/npm/execa_v5.x.x.js index 65e2ef8c9d3d..c54a07291e94 100644 --- a/flow-typed/npm/execa_v5.x.x.js +++ b/flow-typed/npm/execa_v5.x.x.js @@ -37,7 +37,7 @@ declare module 'execa' { shell?: boolean | string, stderr?: ?StdIoOption, stdin?: ?StdIoOption, - stdio?: 'pipe' | 'ignore' | 'inherit' | $ReadOnlyArray, + stdio?: 'pipe' | 'ignore' | 'inherit' | ReadonlyArray, stdout?: ?StdIoOption, stripEof?: boolean, timeout?: number, @@ -90,26 +90,26 @@ declare module 'execa' { declare interface Execa { ( file: string, - args?: $ReadOnlyArray, - options?: $ReadOnly, + args?: ReadonlyArray, + options?: Readonly, ): ExecaPromise; - (file: string, options?: $ReadOnly): ExecaPromise; + (file: string, options?: Readonly): ExecaPromise; - command(command: string, options?: $ReadOnly): ExecaPromise; - commandSync(command: string, options?: $ReadOnly): ExecaPromise; + command(command: string, options?: Readonly): ExecaPromise; + commandSync(command: string, options?: Readonly): ExecaPromise; node( path: string, - args?: $ReadOnlyArray, - options?: $ReadOnly, + args?: ReadonlyArray, + options?: Readonly, ): void; sync( file: string, - args?: $ReadOnlyArray, - options?: $ReadOnly, + args?: ReadonlyArray, + options?: Readonly, ): SyncResult; - sync(file: string, options?: $ReadOnly): SyncResult; + sync(file: string, options?: Readonly): SyncResult; } declare module.exports: Execa; diff --git a/flow-typed/npm/fb-dotslash_v0.x.x.js b/flow-typed/npm/fb-dotslash_v0.x.x.js new file mode 100644 index 000000000000..41c01f297da7 --- /dev/null +++ b/flow-typed/npm/fb-dotslash_v0.x.x.js @@ -0,0 +1,13 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +declare module 'fb-dotslash' { + declare module.exports: string; +} diff --git a/flow-typed/npm/glob_v7.x.x.js b/flow-typed/npm/glob_v7.x.x.js deleted file mode 100644 index 4bd3df6cb984..000000000000 --- a/flow-typed/npm/glob_v7.x.x.js +++ /dev/null @@ -1,79 +0,0 @@ -// flow-typed signature: d2a519d7d007e9ba3e5bf2ac3ff76eca -// flow-typed version: f243e51ed7/glob_v7.x.x/flow_>=v0.104.x - -declare module "glob" { - declare type MinimatchOptions = {| - debug?: boolean, - nobrace?: boolean, - noglobstar?: boolean, - dot?: boolean, - noext?: boolean, - nocase?: boolean, - nonull?: boolean, - matchBase?: boolean, - nocomment?: boolean, - nonegate?: boolean, - flipNegate?: boolean - |}; - - declare type Options = {| - ...MinimatchOptions, - cwd?: string, - root?: string, - nomount?: boolean, - mark?: boolean, - nosort?: boolean, - stat?: boolean, - silent?: boolean, - strict?: boolean, - cache?: { [path: string]: boolean | "DIR" | "FILE" | $ReadOnlyArray, ... }, - statCache?: { [path: string]: boolean | { isDirectory(): boolean, ... } | void, ... }, - symlinks?: { [path: string]: boolean | void, ... }, - realpathCache?: { [path: string]: string, ... }, - sync?: boolean, - nounique?: boolean, - nodir?: boolean, - ignore?: string | $ReadOnlyArray, - follow?: boolean, - realpath?: boolean, - absolute?: boolean - |}; - - /** - * Called when an error occurs, or matches are found - * err - * matches: filenames found matching the pattern - */ - declare type CallBack = (err: ?Error, matches: Array) => void; - - declare class Glob extends events$EventEmitter { - constructor(pattern: string): this; - constructor(pattern: string, callback: CallBack): this; - constructor(pattern: string, options: Options, callback: CallBack): this; - - minimatch: {...}; - options: Options; - aborted: boolean; - cache: { [path: string]: boolean | "DIR" | "FILE" | $ReadOnlyArray, ... }; - statCache: { [path: string]: boolean | { isDirectory(): boolean, ... } | void, ... }; - symlinks: { [path: string]: boolean | void, ... }; - realpathCache: { [path: string]: string, ... }; - found: Array; - - pause(): void; - resume(): void; - abort(): void; - } - - declare class GlobModule { - Glob: Class; - - (pattern: string, callback: CallBack): void; - (pattern: string, options: Options, callback: CallBack): void; - - hasMagic(pattern: string, options?: Options): boolean; - sync(pattern: string, options?: Options): Array; - } - - declare module.exports: GlobModule; -} diff --git a/flow-typed/npm/jest-diff_v29.x.x.js b/flow-typed/npm/jest-diff_v29.x.x.js index d1cdce568656..a3cc9d9130be 100644 --- a/flow-typed/npm/jest-diff_v29.x.x.js +++ b/flow-typed/npm/jest-diff_v29.x.x.js @@ -32,8 +32,8 @@ declare module 'jest-diff' { }; declare export function diff( - a: mixed, - b: mixed, + a: unknown, + b: unknown, options?: DiffOptions, ): string | null; } diff --git a/flow-typed/npm/jest-snapshot_v29.x.x.js b/flow-typed/npm/jest-snapshot_v29.x.x.js index fbae1235a572..58fa3fef7c8c 100644 --- a/flow-typed/npm/jest-snapshot_v29.x.x.js +++ b/flow-typed/npm/jest-snapshot_v29.x.x.js @@ -33,7 +33,7 @@ declare module 'jest-snapshot' { declare export function isSnapshotPath(path: string): boolean; - type LocalRequire = (module: string) => mixed; + type LocalRequire = (module: string) => unknown; declare export function buildSnapshotResolver( config: ProjectConfig, diff --git a/flow-typed/npm/jest.js b/flow-typed/npm/jest.js index 29974483804f..ae645e711e83 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 @@ -39,7 +39,7 @@ type JestMockFn, TReturn> = { /** * An array that contains the contexts for all calls of the mock function. */ - contexts: Array, + contexts: Array, /** * An array that contains all the object results that have been * returned by this mock function call @@ -129,17 +129,17 @@ type JestAsymmetricEqualityType = { /** * A custom Jasmine equality tester */ - asymmetricMatch(value: mixed): boolean, + asymmetricMatch(value: unknown): boolean, ... }; type JestCallsType = { - allArgs(): mixed, - all(): mixed, + allArgs(): unknown, + all(): unknown, any(): boolean, count(): number, - first(): mixed, - mostRecent(): mixed, + first(): unknown, + mostRecent(): unknown, reset(): void, ... }; @@ -768,7 +768,7 @@ interface JestExpectType { /** * */ - toHaveProperty(propPath: string | $ReadOnlyArray, value?: any): void; + toHaveProperty(propPath: string | ReadonlyArray, value?: any): void; /** * Use .toMatch to check that a string matches a regular expression or string. */ @@ -881,7 +881,7 @@ type JestObjectType = { * implementation. */ // MODIFIED: Added defaults to type arguments. - fn = $ReadOnlyArray, TReturn = any>( + fn = ReadonlyArray, TReturn = any>( implementation?: (...args: TArguments) => TReturn, ): JestMockFn, /** @@ -1005,22 +1005,22 @@ type JestDoneFn = { /** Runs this function after every test inside this context */ declare function afterEach( - fn: (done: JestDoneFn) => ?Promise, + fn: (done: JestDoneFn) => ?Promise, timeout?: number, ): void; /** Runs this function before every test inside this context */ declare function beforeEach( - fn: (done: JestDoneFn) => ?Promise, + fn: (done: JestDoneFn) => ?Promise, timeout?: number, ): void; /** Runs this function after all tests have finished inside this context */ declare function afterAll( - fn: (done: JestDoneFn) => ?Promise, + fn: (done: JestDoneFn) => ?Promise, timeout?: number, ): void; /** Runs this function before any tests have started inside this context */ declare function beforeAll( - fn: (done: JestDoneFn) => ?Promise, + fn: (done: JestDoneFn) => ?Promise, timeout?: number, ): void; @@ -1045,11 +1045,11 @@ declare var describe: { */ each( ...table: - | $ReadOnlyArray<$ReadOnlyArray | mixed> - | [$ReadOnlyArray, string] + | ReadonlyArray | unknown> + | [ReadonlyArray, string] ): ( name: JestTestName, - fn?: (...args: $ReadOnlyArray) => ?Promise, + fn?: (...args: ReadonlyArray) => ?Promise, timeout?: number, ) => void, ... @@ -1066,7 +1066,7 @@ declare var it: { */ ( name: JestTestName, - fn?: (done: JestDoneFn) => ?Promise, + fn?: (done: JestDoneFn) => ?Promise, timeout?: number, ): void, /** @@ -1079,14 +1079,14 @@ declare var it: { only: { ( name: JestTestName, - fn?: (done: JestDoneFn) => ?Promise, + fn?: (done: JestDoneFn) => ?Promise, timeout?: number, ): void, each( - ...table: Array | mixed> | [Array, string] + ...table: Array | unknown> | [Array, string] ): ( name: JestTestName, - fn?: (...args: Array) => ?Promise, + fn?: (...args: Array) => ?Promise, timeout?: number, ) => void, }, @@ -1100,14 +1100,14 @@ declare var it: { skip: { ( name: JestTestName, - fn?: (done: JestDoneFn) => ?Promise, + fn?: (done: JestDoneFn) => ?Promise, timeout?: number, ): void, each( - ...table: Array | mixed> | [Array, string] + ...table: Array | unknown> | [Array, string] ): ( name: JestTestName, - fn?: (...args: Array) => ?Promise, + fn?: (...args: Array) => ?Promise, timeout?: number, ) => void, }, @@ -1126,7 +1126,7 @@ declare var it: { */ concurrent( name: JestTestName, - fn?: (done: JestDoneFn) => ?Promise, + fn?: (done: JestDoneFn) => ?Promise, timeout?: number, ): void, /** @@ -1136,11 +1136,11 @@ declare var it: { */ each( ...table: - | $ReadOnlyArray<$ReadOnlyArray | mixed> - | [$ReadOnlyArray, string] + | ReadonlyArray | unknown> + | [ReadonlyArray, string] ): ( name: JestTestName, - fn?: (...args: Array) => ?Promise, + fn?: (...args: Array) => ?Promise, timeout?: number, ) => void, ... @@ -1148,7 +1148,7 @@ declare var it: { declare function fit( name: JestTestName, - fn: (done: JestDoneFn) => ?Promise, + fn: (done: JestDoneFn) => ?Promise, timeout?: number, ): void; /** An individual test unit */ @@ -1249,16 +1249,16 @@ declare var expect: { addSnapshotSerializer(pluginModule: JestPrettyFormatPlugin): void, assertions(expectedAssertions: number): void, hasAssertions(): void, - any(value: mixed): JestAsymmetricEqualityType, + any(value: unknown): JestAsymmetricEqualityType, anything(): any, // MODIFIED: Array -> $ReadOnlyArray - arrayContaining(value: $ReadOnlyArray): Array, + arrayContaining(value: ReadonlyArray): Array, objectContaining(value: Object): Object, /** Matches any received string that contains the exact expected string. */ stringContaining(value: string): string, stringMatching(value: string | RegExp): string, not: { - arrayContaining: (value: $ReadOnlyArray) => Array, + arrayContaining: (value: ReadonlyArray) => Array, objectContaining: (value: {...}) => Object, stringContaining: (value: string) => string, stringMatching: (value: string | RegExp) => string, @@ -1269,7 +1269,7 @@ declare var expect: { // TODO handle return type // http://jasmine.github.io/2.4/introduction.html#section-Spies -declare function spyOn(value: mixed, method: string): Object; +declare function spyOn(value: unknown, method: string): Object; /** Holds all functions related to manipulating test runner */ declare var jest: JestObjectType; @@ -1280,9 +1280,9 @@ declare var jest: JestObjectType; */ declare var jasmine: { DEFAULT_TIMEOUT_INTERVAL: number, - any(value: mixed): JestAsymmetricEqualityType, + any(value: unknown): JestAsymmetricEqualityType, anything(): any, - arrayContaining(value: Array): Array, + arrayContaining(value: Array): Array, clock(): JestClockType, createSpy(name: string): JestSpyType, createSpyObj( diff --git a/flow-typed/npm/jsonc-parser_v2.2.x.js b/flow-typed/npm/jsonc-parser_v2.2.x.js new file mode 100644 index 000000000000..51eadf91b48a --- /dev/null +++ b/flow-typed/npm/jsonc-parser_v2.2.x.js @@ -0,0 +1,421 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +declare module 'jsonc-parser' { + /** + * Creates a JSON scanner on the given text. + * If ignoreTrivia is set, whitespaces or comments are ignored. + */ + declare export const createScanner: ( + text: string, + ignoreTrivia?: boolean, + ) => JSONScanner; + export type ScanError = number; + export type SyntaxKind = number; + /** + * The scanner object, representing a JSON scanner at a position in the input string. + */ + export type JSONScanner = Readonly<{ + /** + * Sets the scan position to a new offset. A call to 'scan' is needed to get the first token. + */ + setPosition(pos: number): void, + /** + * Read the next token. Returns the token code. + */ + scan(): SyntaxKind, + /** + * Returns the zero-based current scan position, which is after the last read token. + */ + getPosition(): number, + /** + * Returns the last read token. + */ + getToken(): SyntaxKind, + /** + * Returns the last read token value. The value for strings is the decoded string content. For numbers it's of type number, for boolean it's true or false. + */ + getTokenValue(): string, + /** + * The zero-based start offset of the last read token. + */ + getTokenOffset(): number, + /** + * The length of the last read token. + */ + getTokenLength(): number, + /** + * The zero-based start line number of the last read token. + */ + getTokenStartLine(): number, + /** + * The zero-based start character (column) of the last read token. + */ + getTokenStartCharacter(): number, + /** + * An error code of the last scan. + */ + getTokenError(): ScanError, + }>; + /** + * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index. + */ + declare export const getLocation: ( + text: string, + position: number, + ) => Location; + /** + * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. + * Therefore, always check the errors list to find out if the input was valid. + */ + declare export const parse: ( + text: string, + errors?: ParseError[], + options?: ParseOptions, + ) => any; + /** + * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result. + */ + declare export const parseTree: ( + text: string, + errors?: ParseError[], + options?: ParseOptions, + ) => Node | void; + /** + * Finds the node at the given path in a JSON DOM. + */ + declare export const findNodeAtLocation: ( + root: Node, + path: JSONPath, + ) => Node | void; + /** + * Finds the innermost node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset. + */ + declare export const findNodeAtOffset: ( + root: Node, + offset: number, + includeRightBound?: boolean, + ) => Node | void; + /** + * Gets the JSON path of the given JSON DOM node + */ + declare export const getNodePath: (node: Node) => JSONPath; + /** + * Evaluates the JavaScript object of the given JSON DOM node + */ + declare export const getNodeValue: (node: Node) => any; + /** + * Parses the given text and invokes the visitor functions for each object, array and literal reached. + */ + declare export const visit: ( + text: string, + visitor: JSONVisitor, + options?: ParseOptions, + ) => any; + /** + * Takes JSON with JavaScript-style comments and remove + * them. Optionally replaces every none-newline character + * of comments with a replaceCharacter + */ + declare export const stripComments: ( + text: string, + replaceCh?: string, + ) => string; + export type ParseError = { + error: ParseErrorCode, + offset: number, + length: number, + }; + export type ParseErrorCode = number; + declare export function printParseErrorCode( + code: ParseErrorCode, + ): + | 'InvalidSymbol' + | 'InvalidNumberFormat' + | 'PropertyNameExpected' + | 'ValueExpected' + | 'ColonExpected' + | 'CommaExpected' + | 'CloseBraceExpected' + | 'CloseBracketExpected' + | 'EndOfFileExpected' + | 'InvalidCommentToken' + | 'UnexpectedEndOfComment' + | 'UnexpectedEndOfString' + | 'UnexpectedEndOfNumber' + | 'InvalidUnicode' + | 'InvalidEscapeCharacter' + | 'InvalidCharacter' + | ''; + export type NodeType = + | 'object' + | 'array' + | 'property' + | 'string' + | 'number' + | 'boolean' + | 'null'; + export type Node = { + type: NodeType, + value?: any, + offset: number, + length: number, + colonOffset?: number, + parent?: Node, + children?: Node[], + }; + /** + * A {@linkcode JSONPath} segment. Either a string representing an object property name + * or a number (starting at 0) for array indices. + */ + export type Segment = string | number; + export type JSONPath = Segment[]; + export type Location = { + /** + * The previous property key or literal value (string, number, boolean or null) or undefined. + */ + previousNode?: Node, + /** + * The path describing the location in the JSON document. The path consists of a sequence of strings + * representing an object property or numbers for array indices. + */ + path: JSONPath, + /** + * Matches the locations path against a pattern consisting of strings (for properties) and numbers (for array indices). + * '*' will match a single segment of any property name or index. + * '**' will match a sequence of segments of any property name or index, or no segment. + */ + matches: (patterns: JSONPath) => boolean, + /** + * If set, the location's offset is at a property key. + */ + isAtPropertyKey: boolean, + }; + export type ParseOptions = { + disallowComments?: boolean, + allowTrailingComma?: boolean, + allowEmptyContent?: boolean, + }; + /** + * Visitor called by {@linkcode visit} when parsing JSON. + * + * The visitor functions have the following common parameters: + * - `offset`: Global offset within the JSON document, starting at 0 + * - `startLine`: Line number, starting at 0 + * - `startCharacter`: Start character (column) within the current line, starting at 0 + * + * Additionally some functions have a `pathSupplier` parameter which can be used to obtain the + * current `JSONPath` within the document. + */ + export type JSONVisitor = { + /** + * Invoked when an open brace is encountered and an object is started. The offset and length represent the location of the open brace. + */ + onObjectBegin?: ( + offset: number, + length: number, + startLine: number, + startCharacter: number, + pathSupplier: () => JSONPath, + ) => void, + /** + * Invoked when a property is encountered. The offset and length represent the location of the property name. + * The `JSONPath` created by the `pathSupplier` refers to the enclosing JSON object, it does not include the + * property name yet. + */ + onObjectProperty?: ( + property: string, + offset: number, + length: number, + startLine: number, + startCharacter: number, + pathSupplier: () => JSONPath, + ) => void, + /** + * Invoked when a closing brace is encountered and an object is completed. The offset and length represent the location of the closing brace. + */ + onObjectEnd?: ( + offset: number, + length: number, + startLine: number, + startCharacter: number, + ) => void, + /** + * Invoked when an open bracket is encountered. The offset and length represent the location of the open bracket. + */ + onArrayBegin?: ( + offset: number, + length: number, + startLine: number, + startCharacter: number, + pathSupplier: () => JSONPath, + ) => void, + /** + * Invoked when a closing bracket is encountered. The offset and length represent the location of the closing bracket. + */ + onArrayEnd?: ( + offset: number, + length: number, + startLine: number, + startCharacter: number, + ) => void, + /** + * Invoked when a literal value is encountered. The offset and length represent the location of the literal value. + */ + onLiteralValue?: ( + value: any, + offset: number, + length: number, + startLine: number, + startCharacter: number, + pathSupplier: () => JSONPath, + ) => void, + /** + * Invoked when a comma or colon separator is encountered. The offset and length represent the location of the separator. + */ + onSeparator?: ( + character: string, + offset: number, + length: number, + startLine: number, + startCharacter: number, + ) => void, + /** + * When comments are allowed, invoked when a line or block comment is encountered. The offset and length represent the location of the comment. + */ + onComment?: ( + offset: number, + length: number, + startLine: number, + startCharacter: number, + ) => void, + /** + * Invoked on an error. + */ + onError?: ( + error: ParseErrorCode, + offset: number, + length: number, + startLine: number, + startCharacter: number, + ) => void, + }; + /** + * An edit result describes a textual edit operation. It is the result of a {@linkcode format} and {@linkcode modify} operation. + * It consist of one or more edits describing insertions, replacements or removals of text segments. + * * The offsets of the edits refer to the original state of the document. + * * No two edits change or remove the same range of text in the original document. + * * Multiple edits can have the same offset if they are multiple inserts, or an insert followed by a remove or replace. + * * The order in the array defines which edit is applied first. + * To apply an edit result use {@linkcode applyEdits}. + * In general multiple EditResults must not be concatenated because they might impact each other, producing incorrect or malformed JSON data. + */ + export type EditResult = Edit[]; + /** + * Represents a text modification + */ + export type Edit = { + /** + * The start offset of the modification. + */ + offset: number, + /** + * The length of the modification. Must not be negative. Empty length represents an *insert*. + */ + length: number, + /** + * The new content. Empty content represents a *remove*. + */ + content: string, + }; + /** + * A text range in the document + */ + export type Range = { + /** + * The start offset of the range. + */ + offset: number, + /** + * The length of the range. Must not be negative. + */ + length: number, + }; + /** + * Options used by {@linkcode format} when computing the formatting edit operations + */ + export type FormattingOptions = Readonly<{ + /** + * If indentation is based on spaces (`insertSpaces` = true), the number of spaces that make an indent. + */ + tabSize?: number, + /** + * Is indentation based on spaces? + */ + insertSpaces?: boolean, + /** + * The default 'end of line' character. If not set, '\n' is used as default. + */ + eol?: string, + }>; + /** + * Computes the edit operations needed to format a JSON document. + * + * @param documentText The input text + * @param range The range to format or `undefined` to format the full content + * @param options The formatting options + * @returns The edit operations describing the formatting changes to the original document following the format described in {@linkcode EditResult}. + * To apply the edit operations to the input, use {@linkcode applyEdits}. + */ + declare export function format( + documentText: string, + range: Range | void, + options: FormattingOptions, + ): EditResult; + /** + * Options used by {@linkcode modify} when computing the modification edit operations + */ + export type ModificationOptions = { + /** + * Formatting options. + */ + formattingOptions: FormattingOptions, + /** + * Optional function to define the insertion index given an existing list of properties. + */ + getInsertionIndex?: (properties: string[]) => number, + }; + /** + * Computes the edit operations needed to modify a value in the JSON document. + * + * @param documentText The input text + * @param path The path of the value to change. The path represents either to the document root, a property or an array item. + * If the path points to an non-existing property or item, it will be created. + * @param value The new value for the specified property or item. If the value is undefined, + * the property or item will be removed. + * @param options Options + * @returns The edit operations describing the changes to the original document, following the format described in {@linkcode EditResult}. + * To apply the edit operations to the input, use {@linkcode applyEdits}. + */ + declare export function modify( + text: string, + path: JSONPath, + value: any, + options: ModificationOptions, + ): EditResult; + /** + * Applies edits to an input string. + * @param text The input text + * @param edits Edit operations following the format described in {@linkcode EditResult}. + * @returns The text with the applied edits. + * @throws An error if the edit operations are not well-formed as described in {@linkcode EditResult}. + */ + declare export function applyEdits(text: string, edits: EditResult): string; +} diff --git a/flow-typed/npm/listr2_v8.x.x.js b/flow-typed/npm/listr2_v8.x.x.js index 02ec1761408f..b072831f66ed 100644 --- a/flow-typed/npm/listr2_v8.x.x.js +++ b/flow-typed/npm/listr2_v8.x.x.js @@ -8,7 +8,7 @@ declare module 'listr2' { declare export type TaskResult< ContextT = {__proto__: null}, - ReturnT = mixed, + ReturnT = unknown, > = | ReturnT | Promise @@ -35,7 +35,7 @@ declare module 'listr2' { declare export type TaskSpec< ContextT = {__proto__: null}, - ReturnT = mixed, + ReturnT = unknown, > = { title: string, task: TaskFn, @@ -55,7 +55,7 @@ declare module 'listr2' { options?: Options, ): void; add(task: TaskSpec): this; - add(tasks: $ReadOnlyArray>): this; + add(tasks: ReadonlyArray>): this; run(ctx?: ContextT): Promise; } } diff --git a/flow-typed/npm/listr_v14.x.x.js b/flow-typed/npm/listr_v14.x.x.js index 2e8e52ac6d52..8372dc9caf38 100644 --- a/flow-typed/npm/listr_v14.x.x.js +++ b/flow-typed/npm/listr_v14.x.x.js @@ -8,7 +8,7 @@ declare module 'listr' { declare export type TaskResult< ContextT = {__proto__: null}, - ReturnT = mixed, + ReturnT = unknown, > = | ReturnT | Promise @@ -35,7 +35,7 @@ declare module 'listr' { declare export type TaskSpec< ContextT = {__proto__: null}, - ReturnT = mixed, + ReturnT = unknown, > = { title: string, task: TaskFn, @@ -55,7 +55,7 @@ declare module 'listr' { options?: Options, ): void; add(task: TaskSpec): this; - add(tasks: $ReadOnlyArray>): this; + add(tasks: ReadonlyArray>): this; run(ctx?: ContextT): Promise; } } diff --git a/flow-typed/npm/node-fetch_v2.x.x.js b/flow-typed/npm/node-fetch_v2.x.x.js index 81441ccd0bc3..5b6b9cc51b46 100644 --- a/flow-typed/npm/node-fetch_v2.x.x.js +++ b/flow-typed/npm/node-fetch_v2.x.x.js @@ -20,8 +20,8 @@ declare module 'node-fetch' { +aborted: boolean, +onabort: (event?: {...}) => void, - +addEventListener: (name: string, cb: () => mixed) => void, - +removeEventListener: (name: string, cb: () => mixed) => void, + +addEventListener: (name: string, cb: () => unknown) => void, + +removeEventListener: (name: string, cb: () => unknown) => void, +dispatchEvent: (event: {...}) => void, ... }; diff --git a/flow-typed/npm/open_v7.x.x.js b/flow-typed/npm/open_v7.x.x.js index 19629e3c4f30..25f62fae2179 100644 --- a/flow-typed/npm/open_v7.x.x.js +++ b/flow-typed/npm/open_v7.x.x.js @@ -11,7 +11,7 @@ declare module 'open' { import type {ChildProcess} from 'child_process'; - declare export type Options = $ReadOnly<{ + declare export type Options = Readonly<{ wait?: boolean, background?: boolean, newInstance?: boolean, diff --git a/flow-typed/npm/pretty-format_v29.x.x.js b/flow-typed/npm/pretty-format_v29.x.x.js index 1fd2dfe577f0..a13951717f0f 100644 --- a/flow-typed/npm/pretty-format_v29.x.x.js +++ b/flow-typed/npm/pretty-format_v29.x.x.js @@ -4,7 +4,7 @@ * @flow strict * @format */ -declare type Print = (value: mixed) => string; +declare type Print = (value: unknown) => string; declare type Indent = (value: string) => string; declare type PluginOptions = { edgeSpacing: string, @@ -22,17 +22,17 @@ declare type Colors = { declare type PrettyFormatPlugin = | { print: ( - value: mixed, + value: unknown, print?: ?Print, indent?: ?Indent, options?: ?PluginOptions, colors?: ?Colors, ) => string, - test: (value: mixed) => boolean, + test: (value: unknown) => boolean, } | { - serialize: (value: mixed) => string, - test: (value: mixed) => boolean, + serialize: (value: unknown) => string, + test: (value: unknown) => boolean, }; declare module 'pretty-format' { @@ -41,7 +41,7 @@ declare module 'pretty-format' { | null | void; declare export function format( - value: mixed, + value: unknown, options?: ?{ callToJSON?: ?boolean, compareKeys?: CompareKeys, diff --git a/flow-typed/npm/promise_v8.x.x.js b/flow-typed/npm/promise_v8.x.x.js index f7eb92e4d12d..7358622e3bea 100644 --- a/flow-typed/npm/promise_v8.x.x.js +++ b/flow-typed/npm/promise_v8.x.x.js @@ -19,10 +19,10 @@ declare module 'promise/setimmediate/rejection-tracking' { declare module.exports: { enable: ( options?: ?{ - whitelist?: ?Array, + whitelist?: ?Array, allRejections?: ?boolean, - onUnhandled?: ?(number, mixed) => void, - onHandled?: ?(number, mixed) => void, + onUnhandled?: ?(number, unknown) => void, + onHandled?: ?(number, unknown) => void, }, ) => void, disable: () => void, diff --git a/flow-typed/npm/react-dom_v17.x.x.js b/flow-typed/npm/react-dom_v17.x.x.js index cc2f334626fe..2aa09e1b8871 100644 --- a/flow-typed/npm/react-dom_v17.x.x.js +++ b/flow-typed/npm/react-dom_v17.x.x.js @@ -4,44 +4,44 @@ declare module 'react-dom' { declare var version: string; declare function findDOMNode( - componentOrElement: Element | ?Component + componentOrElement: Element | ?Component, ): null | Element | Text; declare function render( element: ExactReactElement_DEPRECATED, container: Element, - callback?: () => void + callback?: () => void, ): React.ElementRef; declare function hydrate( element: ExactReactElement_DEPRECATED, container: Element, - callback?: () => void + callback?: () => void, ): React.ElementRef; declare function createPortal( node: React.Node, - container: Element + container: Element, ): React.Portal; declare function unmountComponentAtNode(container: any): boolean; declare function unstable_batchedUpdates( - callback: (a: A, b: B, c: C, d: D, e: E) => mixed, + callback: (a: A, b: B, c: C, d: D, e: E) => unknown, a: A, b: B, c: C, d: D, - e: E + e: E, ): void; declare function unstable_renderSubtreeIntoContainer< - ElementType: React.ElementType + ElementType: React.ElementType, >( parentComponent: Component, nextElement: ExactReactElement_DEPRECATED, container: any, - callback?: () => void + callback?: () => void, ): React.ElementRef; } @@ -55,7 +55,7 @@ declare module 'react-dom/server' { declare function renderToNodeStream(element: React.Node): stream$Readable; declare function renderToStaticNodeStream( - element: React.Node + element: React.Node, ): stream$Readable; } @@ -63,77 +63,75 @@ declare module 'react-dom/test-utils' { import type {Component} from 'react'; declare interface Thenable { - then(resolve: () => mixed, reject?: () => mixed): mixed, + then(resolve: () => unknown, reject?: () => unknown): unknown; } declare var Simulate: { [eventName: string]: ( element: Element, - eventData?: { [key: string]: mixed, ... } + eventData?: {[key: string]: unknown, ...}, ) => void, ... }; declare function renderIntoDocument( - instance: React.MixedElement + instance: React.MixedElement, ): Component; declare function mockComponent( componentClass: React.ElementType, - mockTagName?: string - ): { [key: string]: mixed, ... }; + mockTagName?: string, + ): {[key: string]: unknown, ...}; declare function isElement(element: React.MixedElement): boolean; declare function isElementOfType( element: React.MixedElement, - componentClass: React.ElementType + componentClass: React.ElementType, ): boolean; declare function isDOMComponent(instance: any): boolean; - declare function isCompositeComponent( - instance: Component - ): boolean; + declare function isCompositeComponent(instance: Component): boolean; declare function isCompositeComponentWithType( instance: Component, - componentClass: React.ElementType + componentClass: React.ElementType, ): boolean; declare function findAllInRenderedTree( tree: Component, - test: (child: Component) => boolean + test: (child: Component) => boolean, ): Array>; declare function scryRenderedDOMComponentsWithClass( tree: Component, - className: string + className: string, ): Array; declare function findRenderedDOMComponentWithClass( tree: Component, - className: string + className: string, ): ?Element; declare function scryRenderedDOMComponentsWithTag( tree: Component, - tagName: string + tagName: string, ): Array; declare function findRenderedDOMComponentWithTag( tree: Component, - tagName: string + tagName: string, ): ?Element; declare function scryRenderedComponentsWithType( tree: Component, - componentClass: React.ElementType + componentClass: React.ElementType, ): Array>; declare function findRenderedComponentWithType( tree: Component, - componentClass: React.ElementType + componentClass: React.ElementType, ): ?Component; declare function act(callback: () => void | Thenable): Thenable; diff --git a/flow-typed/npm/react-test-renderer_v16.x.x.js b/flow-typed/npm/react-test-renderer_v16.x.x.js index e27d1a6d2114..067a36f54747 100644 --- a/flow-typed/npm/react-test-renderer_v16.x.x.js +++ b/flow-typed/npm/react-test-renderer_v16.x.x.js @@ -1,22 +1,25 @@ // Type definitions for react-test-renderer 16.x.x // Ported from: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react-test-renderer -type TestRendererOptions = { createNodeMock(element: React.MixedElement): any, ... }; +type TestRendererOptions = { + createNodeMock(element: React.MixedElement): any, + ... +}; -declare module "react-test-renderer" { +declare module 'react-test-renderer' { import type {Component as ReactComponent} from 'react'; type ReactComponentInstance = ReactComponent; export type ReactTestRendererJSON = { type: string, - props: { [propName: string]: any, ... }, + props: {[propName: string]: any, ...}, children: null | ReactTestRendererJSON[], ... }; export type ReactTestRendererTree = ReactTestRendererJSON & { - nodeType: "component" | "host", + nodeType: 'component' | 'host', instance: ?ReactComponentInstance, rendered: null | ReactTestRendererTree, ... @@ -25,23 +28,23 @@ declare module "react-test-renderer" { export type ReactTestInstance = { instance: ?ReactComponentInstance, type: string, - props: { [propName: string]: any, ... }, + props: {[propName: string]: any, ...}, parent: null | ReactTestInstance, children: Array, find(predicate: (node: ReactTestInstance) => boolean): ReactTestInstance, findByType(type: React.ElementType): ReactTestInstance, - findByProps(props: { [propName: string]: any, ... }): ReactTestInstance, + findByProps(props: {[propName: string]: any, ...}): ReactTestInstance, findAll( predicate: (node: ReactTestInstance) => boolean, - options?: { deep: boolean, ... } + options?: {deep: boolean, ...}, ): ReactTestInstance[], findAllByType( type: React.ElementType, - options?: { deep: boolean, ... } + options?: {deep: boolean, ...}, ): ReactTestInstance[], findAllByProps( - props: { [propName: string]: any, ... }, - options?: { deep: boolean, ... } + props: {[propName: string]: any, ...}, + options?: {deep: boolean, ...}, ): ReactTestInstance[], ... }; @@ -56,17 +59,20 @@ declare module "react-test-renderer" { ... }; - declare type Thenable = { then(resolve: () => mixed, reject?: () => mixed): mixed, ... }; + declare type Thenable = { + then(resolve: () => unknown, reject?: () => unknown): unknown, + ... + }; declare function create( nextElement: React.MixedElement, - options?: TestRendererOptions + options?: TestRendererOptions, ): ReactTestRenderer; declare function act(callback: () => void | Promise): Thenable; } -declare module "react-test-renderer/shallow" { +declare module 'react-test-renderer/shallow' { import type {ReactTestInstance} from 'react-test-renderer'; declare export default class ShallowRenderer { diff --git a/flow-typed/npm/rxjs_v6.x.x.js b/flow-typed/npm/rxjs_v6.x.x.js index 8963f46bf1fd..a8c085b8a548 100644 --- a/flow-typed/npm/rxjs_v6.x.x.js +++ b/flow-typed/npm/rxjs_v6.x.x.js @@ -52,7 +52,7 @@ declare type rxjs$ObservableInput = | Iterable; declare type rxjs$InteropObservable = { - [string | mixed]: () => rxjs$Subscribable, + [string | unknown]: () => rxjs$Subscribable, ... }; /** OBSERVER INTERFACES */ @@ -371,7 +371,7 @@ declare module 'rxjs' { iif: typeof rxjs$iif, ConnectableObservable: typeof rxjs$ConnectableObservable, GroupedObservable: typeof rxjs$GroupedObservable, - observable: string | mixed, + observable: string | unknown, Subject: typeof rxjs$Subject, BehaviorSubject: typeof BehaviorSubject, ReplaySubject: typeof ReplaySubject, @@ -598,7 +598,7 @@ declare module 'rxjs' { UnsubscriptionError: UnsubscriptionError, TimeoutError: TimeoutError, fromEvent: ( - target: mixed, + target: unknown, eventName: string, options?: rxjs$EventListenerOptions | ((...args: any[]) => T), // @deprecated resultSelector no longer supported, pipe to map instead @@ -971,7 +971,7 @@ declare module 'rxjs' { ) => any, ) => any, scheduler?: rxjs$SchedulerLike, - ) => () => rxjs$Observable) & + ) => () => rxjs$Observable) & (( callbackFunc: (callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: rxjs$SchedulerLike, @@ -1000,7 +1000,7 @@ declare module 'rxjs' { ) => any, ) => any, scheduler?: rxjs$SchedulerLike, - ) => (arg1: A1) => rxjs$Observable) & + ) => (arg1: A1) => rxjs$Observable) & (( callbackFunc: ( arg1: A1, @@ -1033,7 +1033,7 @@ declare module 'rxjs' { ) => any, ) => any, scheduler?: rxjs$SchedulerLike, - ) => (arg1: A1, arg2: A2) => rxjs$Observable) & + ) => (arg1: A1, arg2: A2) => rxjs$Observable) & (( callbackFunc: ( arg1: A1, @@ -1072,7 +1072,7 @@ declare module 'rxjs' { ) => any, ) => any, scheduler?: rxjs$SchedulerLike, - ) => (arg1: A1, arg2: A2, arg3: A3) => rxjs$Observable) & + ) => (arg1: A1, arg2: A2, arg3: A3) => rxjs$Observable) & (( callbackFunc: ( arg1: A1, @@ -1129,7 +1129,7 @@ declare module 'rxjs' { arg2: A2, arg3: A3, arg4: A4, - ) => rxjs$Observable) & + ) => rxjs$Observable) & (( callbackFunc: ( arg1: A1, @@ -1202,7 +1202,7 @@ declare module 'rxjs' { arg3: A3, arg4: A4, arg5: A5, - ) => rxjs$Observable) & + ) => rxjs$Observable) & (( callbackFunc: ( arg1: A1, @@ -1301,7 +1301,7 @@ declare module 'rxjs' { ) => any, ) => any, scheduler?: rxjs$SchedulerLike, - ) => (...args: any[]) => rxjs$Observable) & + ) => (...args: any[]) => rxjs$Observable) & (( callbackFunc: ( callback: (err: any, res1: R1, res2: R2, res3: R3) => any, @@ -1370,7 +1370,7 @@ declare module 'rxjs' { ) => any, ) => any, scheduler?: rxjs$SchedulerLike, - ) => (...args: any[]) => rxjs$Observable) & + ) => (...args: any[]) => rxjs$Observable) & (( callbackFunc: ( arg1: A1, @@ -1467,7 +1467,7 @@ declare module 'rxjs' { ) => any, ) => any, scheduler?: rxjs$SchedulerLike, - ) => (...args: any[]) => rxjs$Observable) & + ) => (...args: any[]) => rxjs$Observable) & (( callbackFunc: ( arg1: A1, @@ -1535,7 +1535,7 @@ declare module 'rxjs' { ) => any, ) => any, scheduler?: rxjs$SchedulerLike, - ) => (...args: any[]) => rxjs$Observable) & + ) => (...args: any[]) => rxjs$Observable) & (( callbackFunc: ( arg1: A1, @@ -1607,7 +1607,7 @@ declare module 'rxjs' { (( callbackFunc: Function, scheduler?: rxjs$SchedulerLike, - ) => (...args: any[]) => rxjs$Observable), + ) => (...args: any[]) => rxjs$Observable), // @deprecated resultSelector no longer supported, pipe to map instead combineLatest: (( v1: rxjs$ObservableInput, @@ -1833,12 +1833,12 @@ declare module 'rxjs' { } declare class AsapScheduler extends AsyncScheduler { - flush(action?: AsyncAction): void; + flush(action?: AsyncAction): void; } declare class AsyncScheduler extends Scheduler { static delegate: Scheduler; - actions: Array>; + actions: Array>; // @deprecated internal use only active: boolean; // @deprecated internal use only @@ -1849,26 +1849,30 @@ declare module 'rxjs' { delay?: number, state?: T, ): rxjs$Subscription; - flush(action: AsyncAction): void; + flush(action: AsyncAction): void; } declare class QueueScheduler extends AsyncScheduler {} declare class AnimationFrameScheduler extends AsyncScheduler { - flush(action?: AsyncAction): void; + flush(action?: AsyncAction): void; } declare class AsyncAction extends Action { scheduler: AsyncScheduler; work: (state?: T) => void; - id: mixed; + id: unknown; state: T; delay: number; pending: boolean; constructor(scheduler: AsyncScheduler, work: (state?: T) => void): void; schedule(state?: T, delay?: number): rxjs$Subscription; - requestAsyncId(scheduler: AsyncScheduler, id?: mixed, delay?: number): any; - recycleAsyncId(scheduler: AsyncScheduler, id: mixed, delay?: number): any; + requestAsyncId( + scheduler: AsyncScheduler, + id?: unknown, + delay?: number, + ): any; + recycleAsyncId(scheduler: AsyncScheduler, id: unknown, delay?: number): any; execute(state: T, delay: number): any; _execute(state: T, delay: number): any; // @deprecated This is an internal implementation detail, do not use. @@ -1883,7 +1887,7 @@ declare module 'rxjs' { declare module 'rxjs/operators' { declare export function audit( - durationSelector: (value: T) => rxjs$SubscribableOrPromise, + durationSelector: (value: T) => rxjs$SubscribableOrPromise, ): rxjs$MonoTypeOperatorFunction; declare export function auditTime( @@ -1920,11 +1924,11 @@ declare module 'rxjs/operators' { declare export function bufferToggle( openings: rxjs$SubscribableOrPromise, - closingSelector: (value: O) => rxjs$SubscribableOrPromise, + closingSelector: (value: O) => rxjs$SubscribableOrPromise, ): rxjs$OperatorFunction; declare export function bufferWhen( - closingSelector: () => rxjs$Observable, + closingSelector: () => rxjs$Observable, ): rxjs$OperatorFunction; // declare export function catchError(selector: (err: any, caught: rxjs$Observable) => empty): rxjs$MonoTypeOperatorFunction; @@ -1938,15 +1942,15 @@ declare module 'rxjs/operators' { T[], >; - declare export function combineAll(): rxjs$OperatorFunction; + declare export function combineAll(): rxjs$OperatorFunction; declare export function combineAll( project: (...values: T[]) => R, ): rxjs$OperatorFunction, R>; declare export function combineAll( - project: (...values: Array) => R, - ): rxjs$OperatorFunction; + project: (...values: Array) => R, + ): rxjs$OperatorFunction; // @deprecated Deprecated in favor of static combineLatest. declare export function combineLatest( @@ -2095,7 +2099,7 @@ declare module 'rxjs/operators' { ): rxjs$MonoTypeOperatorFunction; // @deprecated Deprecated in favor of static concat. declare export function concat( - ...observables: Array | rxjs$SchedulerLike> + ...observables: Array | rxjs$SchedulerLike> ): rxjs$OperatorFunction; declare export function concatAll(): rxjs$OperatorFunction< @@ -2103,7 +2107,7 @@ declare module 'rxjs/operators' { T, >; - declare export function concatAll(): rxjs$OperatorFunction; + declare export function concatAll(): rxjs$OperatorFunction; declare export function concatMap( project: (value: T, index: number) => rxjs$ObservableInput, @@ -2117,13 +2121,13 @@ declare module 'rxjs/operators' { declare export function concatMapTo( observable: rxjs$ObservableInput, - ): rxjs$OperatorFunction; + ): rxjs$OperatorFunction; // @deprecated declare export function concatMapTo( observable: rxjs$ObservableInput, resultSelector: void, - ): rxjs$OperatorFunction; + ): rxjs$OperatorFunction; // @deprecated declare export function concatMapTo( observable: rxjs$ObservableInput, @@ -2144,7 +2148,7 @@ declare module 'rxjs/operators' { ): rxjs$OperatorFunction; declare export function debounce( - durationSelector: (value: T) => rxjs$SubscribableOrPromise, + durationSelector: (value: T) => rxjs$SubscribableOrPromise, ): rxjs$MonoTypeOperatorFunction; declare export function debounceTime( @@ -2162,8 +2166,11 @@ declare module 'rxjs/operators' { ): rxjs$MonoTypeOperatorFunction; declare export function delayWhen( - delayDurationSelector: (value: T, index: number) => rxjs$Observable, - subscriptionDelay?: rxjs$Observable, + delayDurationSelector: ( + value: T, + index: number, + ) => rxjs$Observable, + subscriptionDelay?: rxjs$Observable, ): rxjs$MonoTypeOperatorFunction; declare export function dematerialize(): rxjs$OperatorFunction< @@ -2173,7 +2180,7 @@ declare module 'rxjs/operators' { declare export function distinct( keySelector?: (value: T) => K, - flushes?: rxjs$Observable, + flushes?: rxjs$Observable, ): rxjs$MonoTypeOperatorFunction; declare export function distinctUntilChanged( @@ -2186,12 +2193,12 @@ declare module 'rxjs/operators' { ): rxjs$MonoTypeOperatorFunction; declare export function distinctUntilKeyChanged( - key: $Keys, + key: keyof T, ): rxjs$MonoTypeOperatorFunction; - declare export function distinctUntilKeyChanged>( + declare export function distinctUntilKeyChanged( key: K, - compare: (x: mixed, y: mixed) => boolean, + compare: (x: unknown, y: unknown) => boolean, ): rxjs$MonoTypeOperatorFunction; declare export function elementAt( @@ -2259,7 +2266,7 @@ declare module 'rxjs/operators' { T, >; - declare export function exhaust(): rxjs$OperatorFunction; + declare export function exhaust(): rxjs$OperatorFunction; declare export function exhaustMap( project: (value: T, index: number) => rxjs$ObservableInput, @@ -2334,7 +2341,7 @@ declare module 'rxjs/operators' { elementSelector: void, durationSelector: ( grouped: rxjs$GroupedObservable, - ) => rxjs$Observable, + ) => rxjs$Observable, ): rxjs$OperatorFunction>; declare export function groupBy( @@ -2342,7 +2349,7 @@ declare module 'rxjs/operators' { elementSelector?: (value: T) => R, durationSelector?: ( grouped: rxjs$GroupedObservable, - ) => rxjs$Observable, + ) => rxjs$Observable, subjectSelector?: () => rxjs$Subject, ): rxjs$OperatorFunction>; @@ -2487,7 +2494,7 @@ declare module 'rxjs/operators' { // @deprecated Deprecated in favor of static merge. declare export function merge( ...observables: Array< - rxjs$ObservableInput | rxjs$SchedulerLike | number, + rxjs$ObservableInput | rxjs$SchedulerLike | number, > ): rxjs$OperatorFunction; @@ -2517,7 +2524,7 @@ declare module 'rxjs/operators' { declare export function mergeMapTo( innerObservable: rxjs$ObservableInput, concurrent?: number, - ): rxjs$OperatorFunction; + ): rxjs$OperatorFunction; // @deprecated declare export function mergeMapTo( @@ -2600,12 +2607,12 @@ declare module 'rxjs/operators' { declare export function onErrorResumeNext( ...observables: Array< - rxjs$ObservableInput | ((...values: Array) => R), + rxjs$ObservableInput | ((...values: Array) => R), > ): rxjs$OperatorFunction; declare export function onErrorResumeNext( - array: rxjs$ObservableInput[], + array: rxjs$ObservableInput[], ): rxjs$OperatorFunction; declare export function onErrorResumeNextStatic( @@ -2640,12 +2647,12 @@ declare module 'rxjs/operators' { declare export function onErrorResumeNextStatic( ...observables: Array< - rxjs$ObservableInput | ((...values: Array) => R), + rxjs$ObservableInput | ((...values: Array) => R), > ): rxjs$Observable; declare export function onErrorResumeNextStatic( - array: rxjs$ObservableInput[], + array: rxjs$ObservableInput[], ): rxjs$Observable; declare export function pairwise(): rxjs$OperatorFunction; @@ -2722,7 +2729,7 @@ declare module 'rxjs/operators' { // @deprecated Deprecated in favor of static race. declare export function race( ...observables: Array< - rxjs$Observable | Array>, + rxjs$Observable | Array>, > ): rxjs$OperatorFunction; @@ -2745,7 +2752,7 @@ declare module 'rxjs/operators' { ): rxjs$MonoTypeOperatorFunction; declare export function repeatWhen( - notifier: (notifications: rxjs$Observable) => rxjs$Observable, + notifier: (notifications: rxjs$Observable) => rxjs$Observable, ): rxjs$MonoTypeOperatorFunction; declare export function retry( @@ -2753,7 +2760,7 @@ declare module 'rxjs/operators' { ): rxjs$MonoTypeOperatorFunction; declare export function retryWhen( - notifier: (errors: rxjs$Observable) => rxjs$Observable, + notifier: (errors: rxjs$Observable) => rxjs$Observable, ): rxjs$MonoTypeOperatorFunction; // @todo - find out why this used to return: (rxjs$Observable) => rxjs$Observable @@ -2900,7 +2907,7 @@ declare module 'rxjs/operators' { declare export function switchMapTo( observable: rxjs$ObservableInput, - ): rxjs$OperatorFunction; + ): rxjs$OperatorFunction; // @deprecated resultSelector is no longer supported. Switch to using switchMap with an inner map declare export function switchMapTo( @@ -2942,9 +2949,9 @@ declare module 'rxjs/operators' { ): rxjs$MonoTypeOperatorFunction; declare export function tap( - next?: (x: T) => mixed, - error?: (e: any) => mixed, - complete?: () => mixed, + next?: (x: T) => unknown, + error?: (e: any) => unknown, + complete?: () => unknown, ): rxjs$MonoTypeOperatorFunction; declare export function tap( @@ -2957,7 +2964,7 @@ declare module 'rxjs/operators' { } declare export function throttle( - durationSelector: (value: T) => rxjs$SubscribableOrPromise, + durationSelector: (value: T) => rxjs$SubscribableOrPromise, config?: ThrottleConfig, ): rxjs$MonoTypeOperatorFunction; @@ -2993,7 +3000,7 @@ declare module 'rxjs/operators' { declare export function toArray(): rxjs$OperatorFunction; declare export function window( - windowBoundaries: rxjs$Observable, + windowBoundaries: rxjs$Observable, ): rxjs$OperatorFunction>; declare export function windowCount( @@ -3021,11 +3028,11 @@ declare module 'rxjs/operators' { declare export function windowToggle( openings: rxjs$Observable, - closingSelector: (openValue: O) => rxjs$Observable, + closingSelector: (openValue: O) => rxjs$Observable, ): rxjs$OperatorFunction>; declare export function windowWhen( - closingSelector: () => rxjs$Observable, + closingSelector: () => rxjs$Observable, ): rxjs$OperatorFunction>; declare export function withLatestFrom( @@ -3099,16 +3106,16 @@ declare module 'rxjs/operators' { declare export function withLatestFrom( ...observables: Array< - rxjs$ObservableInput | ((...values: Array) => R), + rxjs$ObservableInput | ((...values: Array) => R), > ): rxjs$OperatorFunction; declare export function withLatestFrom( - array: rxjs$ObservableInput[], + array: rxjs$ObservableInput[], ): rxjs$OperatorFunction; declare export function withLatestFrom( - array: rxjs$ObservableInput[], + array: rxjs$ObservableInput[], project: (...values: Array) => R, ): rxjs$OperatorFunction; @@ -3215,7 +3222,7 @@ declare module 'rxjs/operators' { T[], >; - declare export function zipAll(): rxjs$OperatorFunction; + declare export function zipAll(): rxjs$OperatorFunction; declare export function zipAll( project: (...values: T[]) => R, @@ -3223,7 +3230,7 @@ declare module 'rxjs/operators' { declare export function zipAll( project: (...values: Array) => R, - ): rxjs$OperatorFunction; + ): rxjs$OperatorFunction; declare export function iif( condition: () => boolean, @@ -3234,7 +3241,7 @@ declare module 'rxjs/operators' { declare export function throwError( error: any, scheduler?: rxjs$SchedulerLike, - ): rxjs$Observable; + ): rxjs$Observable; } declare module 'rxjs/ajax' { @@ -3251,7 +3258,7 @@ declare module 'rxjs/ajax' { crossDomain?: boolean; withCredentials?: boolean; createXHR?: () => XMLHttpRequest; - progressSubscriber?: rxjs$Subscriber; + progressSubscriber?: rxjs$Subscriber; responseType?: string; } @@ -3352,7 +3359,7 @@ declare module 'rxjs/webSocket' { subMsg: () => any, unsubMsg: () => any, messageFilter: (value: T) => boolean, - ): rxjs$Observable; + ): rxjs$Observable; // @deprecated This is an internal implementation detail, do not use. _subscribe(subscriber: rxjs$Subscriber): rxjs$Subscription; unsubscribe(): void; diff --git a/flow-typed/npm/selfsigned_v2.x.x.js b/flow-typed/npm/selfsigned_v2.x.x.js index 4e41a70fe7c8..1bff6cb3e4a9 100644 --- a/flow-typed/npm/selfsigned_v2.x.x.js +++ b/flow-typed/npm/selfsigned_v2.x.x.js @@ -30,7 +30,7 @@ declare module 'selfsigned' { /** * additional extensions for the certificate */ - extensions?: mixed[]; + extensions?: unknown[]; /** * The signature algorithm sha256 or sha1 * @default "sha1" @@ -74,7 +74,7 @@ declare module 'selfsigned' { attrs?: pki$CertificateField[], opts?: SelfsignedOptions, /** Optional callback, if not provided the generation is synchronous */ - done?: (err: void | Error, result: GenerateResult) => mixed, + done?: (err: void | Error, result: GenerateResult) => unknown, ): void; // definitions from node-forge's `pki` and `asn1` namespaces @@ -94,7 +94,7 @@ declare module 'selfsigned' { declare interface pki$CertificateField extends pki$CertificateFieldOptions { valueConstructed?: boolean | void; valueTagClass?: asn1$Class | void; - value?: mixed[] | string | void; - extensions?: mixed[] | void; + value?: unknown[] | string | void; + extensions?: unknown[] | void; } } diff --git a/flow-typed/npm/serve-static_v1.x.x.js b/flow-typed/npm/serve-static_v1.x.x.js index 5ea71ddda7e3..d04a56fe4a84 100644 --- a/flow-typed/npm/serve-static_v1.x.x.js +++ b/flow-typed/npm/serve-static_v1.x.x.js @@ -12,7 +12,7 @@ declare module 'serve-static' { import type {NextHandleFunction} from 'connect'; import type http from 'http'; - declare export type Options = $ReadOnly<{ + declare export type Options = Readonly<{ /** * Enable or disable accepting ranged requests, defaults to true. Disabling * this will not send `Accept-Ranges` and ignore the contents of the diff --git a/flow-typed/npm/shelljs_v0.x.x.js b/flow-typed/npm/shelljs_v0.x.x.js index 9e1ca8fe8055..51567de3d7dc 100644 --- a/flow-typed/npm/shelljs_v0.x.x.js +++ b/flow-typed/npm/shelljs_v0.x.x.js @@ -34,7 +34,8 @@ declare type $npm$shelljs$OptionsPoly = { declare interface $npm$shelljs$ExecThen { (code: number, stdout: string, stderr: string): void; } -declare type $npm$shelljs$ExecOptionsPoly = T & { +declare type $npm$shelljs$ExecOptionsPoly = { + ...T, async?: boolean, silent?: boolean, ... diff --git a/flow-typed/npm/signedsource_v1.x.x.js b/flow-typed/npm/signedsource_v1.x.x.js index d82725250c11..6adbdb25d0c5 100644 --- a/flow-typed/npm/signedsource_v1.x.x.js +++ b/flow-typed/npm/signedsource_v1.x.x.js @@ -12,7 +12,7 @@ declare module 'signedsource' { isSigned(data: string): boolean, signFile(data: string): string, verifySignature(data: string): boolean, - [key: string]: mixed, + [key: string]: unknown, }; declare module.exports: SignedSource; diff --git a/flow-typed/npm/tinybench_v4.1.x.js b/flow-typed/npm/tinybench_v4.1.x.js index 56412034a9d6..2b6bbba9bafa 100644 --- a/flow-typed/npm/tinybench_v4.1.x.js +++ b/flow-typed/npm/tinybench_v4.1.x.js @@ -11,7 +11,7 @@ declare module 'tinybench' { declare export class Task extends EventTarget { name: string; - result: void | $ReadOnly; + result: void | Readonly; runs: number; reset(): void; @@ -108,13 +108,13 @@ declare module 'tinybench' { declare export class Bench extends EventTarget { concurrency: null | 'task' | 'bench'; name?: string; - opts: $ReadOnly; + opts: Readonly; threshold: number; constructor(options?: BenchOptions): this; // $FlowExpectedError[unsafe-getters-setters] - get results(): Array<$ReadOnly>; + get results(): Array>; // $FlowExpectedError[unsafe-getters-setters] get tasks(): Array; diff --git a/flow-typed/npm/tinyglobby_v0.2.x.js b/flow-typed/npm/tinyglobby_v0.2.x.js new file mode 100644 index 000000000000..96e77c27eb00 --- /dev/null +++ b/flow-typed/npm/tinyglobby_v0.2.x.js @@ -0,0 +1,43 @@ +declare module 'tinyglobby' { + import typeof FSModule from 'fs'; + + declare type FileSystemAdapter = Partial; + + declare type GlobOptions = { + absolute?: boolean, + braceExpansion?: boolean, + caseSensitiveMatch?: boolean, + cwd?: string | URL, + debug?: boolean, + deep?: number, + dot?: boolean, + expandDirectories?: boolean, + extglob?: boolean, + followSymbolicLinks?: boolean, + fs?: FileSystemAdapter, + globstar?: boolean, + ignore?: string | ReadonlyArray, + onlyDirectories?: boolean, + onlyFiles?: boolean, + signal?: AbortSignal, + }; + + declare type GlobModule = { + convertPathToPattern(path: string): string, + escapePath(path: string): string, + isDynamicPattern( + pattern: string, + options?: {caseSensitiveMatch: boolean}, + ): boolean, + glob( + patterns: string | ReadonlyArray, + options?: GlobOptions, + ): Promise, + globSync( + patterns: string | ReadonlyArray, + options?: GlobOptions, + ): string[], + }; + + declare module.exports: GlobModule; +} diff --git a/flow-typed/npm/typescript_v5.x.x.js b/flow-typed/npm/typescript_v5.x.x.js index 3e5efa0afc62..c89c7a5141e1 100644 --- a/flow-typed/npm/typescript_v5.x.x.js +++ b/flow-typed/npm/typescript_v5.x.x.js @@ -18,25 +18,25 @@ declare module 'typescript' { Bundler = 'Bundler', } - declare type SourceFile = $ReadOnly<{ + declare type SourceFile = Readonly<{ fileName: string, text: string, ... }>; - declare type Diagnostic = $ReadOnly<{ + declare type Diagnostic = Readonly<{ file?: SourceFile, start?: number, messageText: string, ... }>; - declare type EmitResult = $ReadOnly<{ + declare type EmitResult = Readonly<{ diagnostics: Array, ... }>; - declare type Program = $ReadOnly<{ + declare type Program = Readonly<{ emit: () => EmitResult, ... }>; @@ -47,7 +47,7 @@ declare module 'typescript' { getLineAndCharacterOfPosition( file: SourceFile, start?: number, - ): $ReadOnly<{line: number, character: number}>, + ): Readonly<{line: number, character: number}>, convertCompilerOptionsFromJson( jsonOptions: any, basePath: string, diff --git a/flow-typed/npm/undici_v5.x.x.js b/flow-typed/npm/undici_v5.x.x.js index 89a4a42fb5d4..9076fb91bee3 100644 --- a/flow-typed/npm/undici_v5.x.x.js +++ b/flow-typed/npm/undici_v5.x.x.js @@ -15,7 +15,7 @@ declare interface undici$Agent$Options { } declare module 'undici' { - declare export type RequestOptions = $ReadOnly<{ + declare export type RequestOptions = Readonly<{ dispatcher?: Dispatcher, method?: string, headers?: HeadersInit, diff --git a/flow-typed/npm/ws_v7.x.x.js b/flow-typed/npm/ws_v7.x.x.js index 151be0d2699e..7057bdd72712 100644 --- a/flow-typed/npm/ws_v7.x.x.js +++ b/flow-typed/npm/ws_v7.x.x.js @@ -31,7 +31,7 @@ declare class ws$WebSocketServer extends events$EventEmitter { options: { backlog?: number, clientTracking?: boolean, - handleProtocols?: () => mixed, + handleProtocols?: () => unknown, host?: string, maxPayload?: number, noServer?: boolean, @@ -39,28 +39,28 @@ declare class ws$WebSocketServer extends events$EventEmitter { perMessageDeflate?: boolean | ws$PerMessageDeflateOptions, port?: number, server?: http$Server | https$Server, - verifyClient?: () => mixed, + verifyClient?: () => unknown, }, - callback?: () => mixed, + callback?: () => unknown, ): this; /** * Emitted when the server closes. */ - on(event: 'close', () => mixed): this; + on(event: 'close', () => unknown): this; /** * Emitted when the handshake is complete. */ on( event: 'connection', - (socket: ws$WebSocket, request: http$IncomingMessage<>) => mixed, + (socket: ws$WebSocket, request: http$IncomingMessage<>) => unknown, ): this; /** * Emitted when an error occurs on the underlying server. */ - on(event: 'error', (error: Error) => mixed): this; + on(event: 'error', (error: Error) => unknown): this; /** * Emitted before the response headers are written to the socket as part of @@ -68,13 +68,13 @@ declare class ws$WebSocketServer extends events$EventEmitter { */ on( event: 'headers', - (headers: Array, request: http$IncomingMessage<>) => mixed, + (headers: Array, request: http$IncomingMessage<>) => unknown, ): this; /** * Emitted when the underlying server has been bound. */ - on(event: 'listening', () => mixed): this; + on(event: 'listening', () => unknown): this; /** * Returns the bound address, the address family name, and port of the server @@ -93,7 +93,7 @@ declare class ws$WebSocketServer extends events$EventEmitter { /** * Close the server. */ - close(callback?: () => mixed): void; + close(callback?: () => unknown): void; /** * Handle a HTTP Upgrade request. @@ -102,7 +102,7 @@ declare class ws$WebSocketServer extends events$EventEmitter { request: http$IncomingMessage<>, socket: net$Socket, head: Buffer, - callback: (?ws$WebSocket) => mixed, + callback: (?ws$WebSocket) => unknown, ): void; /** @@ -122,24 +122,28 @@ declare type ws$WebSocketOptions = { ...requestOptions, agent?: boolean | http$Agent<> | http$Agent, createConnection?: - | ((options: net$connectOptions, callback?: () => mixed) => net$Socket) - | ((options: tls$connectOptions, callback?: () => mixed) => tls$TLSSocket), + | ((options: net$connectOptions, callback?: () => unknown) => net$Socket) + | (( + options: tls$connectOptions, + callback?: () => unknown, + ) => tls$TLSSocket), rejectUnauthorized?: boolean, }; -declare type ws$CloseListener = (code: number, reason: string) => mixed; -declare type ws$ErrorListener = (error: Error) => mixed; +declare type ws$CloseListener = (code: number, reason: string) => unknown; +declare type ws$ErrorListener = (error: Error) => unknown; declare type ws$MessageListener = ( data: string | Buffer | ArrayBuffer | Array, -) => mixed; -declare type ws$OpenListener = () => mixed; -declare type ws$PingListener = (Buffer) => mixed; -declare type ws$PongListener = (Buffer) => mixed; + isBinary: boolean, +) => unknown; +declare type ws$OpenListener = () => unknown; +declare type ws$PingListener = (Buffer) => unknown; +declare type ws$PongListener = (Buffer) => unknown; declare type ws$UnexpectedResponseListener = ( request: http$ClientRequest<>, response: http$IncomingMessage<>, -) => mixed; -declare type ws$UpgradeListener = (response: http$IncomingMessage<>) => mixed; +) => unknown; +declare type ws$UpgradeListener = (response: http$IncomingMessage<>) => unknown; /* $FlowFixMe[incompatible-type] - Found with Flow v0.143.1 upgrade * "on" definition failing with string is incompatible with string literal */ @@ -277,16 +281,16 @@ declare class ws$WebSocket extends events$EventEmitter { /** * Send a ping. */ - ping(data?: any, mask?: boolean, callback?: () => mixed): void; - ping(data: any, callback: () => mixed): void; - ping(callback: () => mixed): void; + ping(data?: any, mask?: boolean, callback?: () => unknown): void; + ping(data: any, callback: () => unknown): void; + ping(callback: () => unknown): void; /** * Send a pong. */ - pong(data?: any, mask?: boolean, callback?: () => mixed): void; - pong(data: any, callback: () => mixed): void; - pong(callback: () => mixed): void; + pong(data?: any, mask?: boolean, callback?: () => unknown): void; + pong(data: any, callback: () => unknown): void; + pong(callback: () => unknown): void; /** * The subprotocol selected by the server. @@ -324,9 +328,9 @@ declare class ws$WebSocket extends events$EventEmitter { mask?: boolean, fin?: boolean, }, - callback?: () => mixed, + callback?: () => unknown, ): void; - send(data: any, callback: () => mixed): void; + send(data: any, callback: () => unknown): void; /** * Forcibly close the connection. diff --git a/flow-typed/npm/yargs_v17.x.x.js b/flow-typed/npm/yargs_v17.x.x.js index 9f614e41f16f..6d0dcf8f6ae4 100644 --- a/flow-typed/npm/yargs_v17.x.x.js +++ b/flow-typed/npm/yargs_v17.x.x.js @@ -1,6 +1,6 @@ // flow-typed version: f7c859e705/yargs_v17.x.x/flow_>=v0.104.x -declare module "yargs" { +declare module 'yargs' { declare type Argv = { [key: string]: any, _: Array, @@ -12,13 +12,13 @@ declare module "yargs" { alias: string | Array, array: boolean, boolean: boolean, - choices: Array, - coerce: (arg: {[key: string]: any, ...} | any) => mixed, + choices: Array, + coerce: (arg: {[key: string]: any, ...} | any) => unknown, config: boolean, - configParser: (configPath: string) => { [key: string]: mixed, ... }, - conflicts: string | Array | { [key: string]: string, ... }, + configParser: (configPath: string) => {[key: string]: unknown, ...}, + conflicts: string | Array | {[key: string]: string, ...}, count: boolean, - default: mixed, + default: unknown, defaultDescription: string, demandOption: boolean | string, desc: string, @@ -27,7 +27,7 @@ declare module "yargs" { global: boolean, group: string, hidden: boolean, - implies: string | { [key: string]: string, ... }, + implies: string | {[key: string]: string, ...}, nargs: number, normalize: boolean, number: boolean, @@ -35,30 +35,32 @@ declare module "yargs" { requiresArg: boolean, skipValidation: boolean, string: boolean, - type: "array" | "boolean" | "count" | "number" | "string", + type: 'array' | 'boolean' | 'count' | 'number' | 'string', ... }>; declare type CommonModuleObject = {| command?: string | Array, aliases?: Array | string, - builder?: { [key: string]: Options, ... } | ((yargsInstance: Yargs) => mixed), - handler?: ((argv: Argv) => void) | ((argv: Argv) => Promise) + builder?: + | {[key: string]: Options, ...} + | ((yargsInstance: Yargs) => unknown), + handler?: ((argv: Argv) => void) | ((argv: Argv) => Promise), |}; declare type ModuleObjectDesc = {| ...CommonModuleObject, - desc?: string | false + desc?: string | false, |}; declare type ModuleObjectDescribe = {| ...CommonModuleObject, - describe?: string | false + describe?: string | false, |}; declare type ModuleObjectDescription = {| ...CommonModuleObject, - description?: string | false + description?: string | false, |}; declare type ModuleObject = @@ -66,9 +68,10 @@ declare module "yargs" { | ModuleObjectDescribe | ModuleObjectDescription; - declare type MiddleWareCallback = - | (argv: Argv, yargsInstance?: Yargs) => void - | (argv: Argv, yargsInstance?: Yargs) => Promise; + declare type MiddleWareCallback = ( + argv: Argv, + yargsInstance?: Yargs, + ) => void | ((argv: Argv, yargsInstance?: Yargs) => Promise); declare type Middleware = MiddleWareCallback | Array; @@ -76,29 +79,29 @@ declare module "yargs" { (args: Array): Yargs; alias(key: string, alias: string): this; - alias(alias: { [key: string]: string | Array, ... }): this; + alias(alias: {[key: string]: string | Array, ...}): this; argv: Argv | Promise; array(key: string | Array): this; boolean(parameter: string | Array): this; - check(fn: (argv: Argv, options: Array) => mixed): this; + check(fn: (argv: Argv, options: Array) => unknown): this; choices(key: string, allowed: Array): this; - choices(allowed: { [key: string]: Array, ... }): this; - coerce(key: string, fn: (value: any) => mixed): this; - coerce(object: { [key: string]: (value: any) => mixed, ... }): this; - coerce(keys: Array, fn: (value: any) => mixed): this; + choices(allowed: {[key: string]: Array, ...}): this; + coerce(key: string, fn: (value: any) => unknown): this; + coerce(object: {[key: string]: (value: any) => unknown, ...}): this; + coerce(keys: Array, fn: (value: any) => unknown): this; command( cmd: string | Array, desc: string | false, builder?: - | { [key: string]: Options, ... } - | ((yargsInstance: Yargs) => mixed), - handler?: Function + | {[key: string]: Options, ...} + | ((yargsInstance: Yargs) => unknown), + handler?: Function, ): this; command( cmd: string | Array, desc: string | false, - module: ModuleObject + module: ModuleObject, ): this; command(module: ModuleObject): this; @@ -106,14 +109,14 @@ declare module "yargs" { cmd: string | Array, desc: string | false, builder?: - | { [key: string]: Options, ... } - | ((yargsInstance: Yargs) => mixed), - handler?: Function + | {[key: string]: Options, ...} + | ((yargsInstance: Yargs) => unknown), + handler?: Function, ): this; commands( cmd: string | Array, desc: string | false, - module: ModuleObject + module: ModuleObject, ): this; commands(module: ModuleObject): this; @@ -131,36 +134,39 @@ declare module "yargs" { completion( cmd?: string, - description?: string | false | ( - current: string, - argv: Argv, - done: (compeltion: Array) => void - ) => ?(Array | Promise>), + description?: + | string + | false + | (( + current: string, + argv: Argv, + done: (compeltion: Array) => void, + ) => ?(Array | Promise>)), fn?: ( current: string, argv: Argv, - done: (completion: Array) => void - ) => ?(Array | Promise>) + done: (completion: Array) => void, + ) => ?(Array | Promise>), ): this; config( key?: string, description?: string, - parseFn?: (configPath: string) => { [key: string]: mixed, ... } + parseFn?: (configPath: string) => {[key: string]: unknown, ...}, ): this; config( key: string, - parseFn?: (configPath: string) => { [key: string]: mixed, ... } + parseFn?: (configPath: string) => {[key: string]: unknown, ...}, ): this; - config(config: { [key: string]: mixed, ... }): this; + config(config: {[key: string]: unknown, ...}): this; conflicts(key: string, value: string | Array): this; - conflicts(keys: { [key: string]: string | Array, ... }): this; + conflicts(keys: {[key: string]: string | Array, ...}): this; count(name: string): this; - default(key: string, value: mixed, description?: string): this; - default(defaults: { [key: string]: mixed, ... }): this; + default(key: string, value: unknown, description?: string): this; + default(defaults: {[key: string]: unknown, ...}): this; // Deprecated: use demandOption() and demandCommand() instead. demand(key: string, msg?: string | boolean): this; @@ -174,11 +180,11 @@ declare module "yargs" { min: number, max: number, minMsg?: string, - maxMsg?: string + maxMsg?: string, ): this; describe(key: string, description: string): this; - describe(describeObject: { [key: string]: string, ... }): this; + describe(describeObject: {[key: string]: string, ...}): this; detectLocale(shouldDetect: boolean): this; @@ -191,11 +197,15 @@ declare module "yargs" { exitProcess(enable: boolean): this; - fail(fn: false | (failureMessage: string, err: Error, yargs: Yargs) => mixed): this; + fail( + fn: + | false + | ((failureMessage: string, err: Error, yargs: Yargs) => unknown), + ): this; getCompletion( args: Array, - fn: (err: Error | null, completions: Array | void) => void + fn: (err: Error | null, completions: Array | void) => void, ): Promise | void>; global(globals: string | Array, isGlobal?: boolean): this; @@ -209,28 +219,29 @@ declare module "yargs" { hide(key: string): this; implies(key: string, value: string | Array): this; - implies(keys: { [key: string]: string | Array, ... }): this; + implies(keys: {[key: string]: string | Array, ...}): this; locale( - locale: | "de" - | "en" - | "es" - | "fr" - | "hi" - | "hu" - | "id" - | "it" - | "ja" - | "ko" - | "nb" - | "pirate" - | "pl" - | "pt" - | "pt_BR" - | "ru" - | "th" - | "tr" - | "zh_CN" + locale: + | 'de' + | 'en' + | 'es' + | 'fr' + | 'hi' + | 'hu' + | 'id' + | 'it' + | 'ja' + | 'ko' + | 'nb' + | 'pirate' + | 'pl' + | 'pt' + | 'pt_BR' + | 'ru' + | 'th' + | 'tr' + | 'zh_CN', ): this; locale(): string; @@ -246,39 +257,39 @@ declare module "yargs" { number(key: string | Array): this; option(key: string, options?: Options): this; - option(optionMap: { [key: string]: Options, ... }): this; + option(optionMap: {[key: string]: Options, ...}): this; options(key: string, options?: Options): this; - options(optionMap: { [key: string]: Options, ... }): this; + options(optionMap: {[key: string]: Options, ...}): this; parse( args?: string | Array, - context?: { [key: string]: any, ... }, - parseCallback?: (err: Error, argv: Argv, output?: string) => void + context?: {[key: string]: any, ...}, + parseCallback?: (err: Error, argv: Argv, output?: string) => void, ): Argv | Promise; parse( args?: string | Array, - parseCallback?: (err: Error, argv: Argv, output?: string) => void + parseCallback?: (err: Error, argv: Argv, output?: string) => void, ): Argv | Promise; parseAsync( args?: string | Array, - context?: { [key: string]: any, ... }, - parseCallback?: (err: Error, argv: Argv, output?: string) => void + context?: {[key: string]: any, ...}, + parseCallback?: (err: Error, argv: Argv, output?: string) => void, ): Promise; parseAsync( args?: string | Array, - parseCallback?: (err: Error, argv: Argv, output?: string) => void + parseCallback?: (err: Error, argv: Argv, output?: string) => void, ): Promise; parseSync( args?: string | Array, - context?: { [key: string]: any, ... }, - parseCallback?: (err: Error, argv: Argv, output?: string) => void + context?: {[key: string]: any, ...}, + parseCallback?: (err: Error, argv: Argv, output?: string) => void, ): Argv; parseSync( args?: string | Array, - parseCallback?: (err: Error, argv: Argv, output?: string) => void + parseCallback?: (err: Error, argv: Argv, output?: string) => void, ): Argv; parserConfiguration(configuration: {[key: string]: any, ...}): this; @@ -299,14 +310,14 @@ declare module "yargs" { showCompletionScript(): this; - showHelp(consoleLevel?: "error" | "warn" | "log"): this; + showHelp(consoleLevel?: 'error' | 'warn' | 'log'): this; showHelp(printCallback: (usageData: string) => void): this; showHelpOnFail(enable: boolean, message?: string): this; skipValidation(key: string): this; - showVersion(consoleLevel?: "error" | "warn" | "log"): this; + showVersion(consoleLevel?: 'error' | 'warn' | 'log'): this; showVersion(printCallback: (usageData: string) => void): this; strict(enabled?: boolean): this; @@ -319,11 +330,16 @@ declare module "yargs" { terminalWidth(): number; - updateLocale(obj: { [key: string]: string, ... }): this; - updateStrings(obj: { [key: string]: string, ... }): this; + updateLocale(obj: {[key: string]: string, ...}): this; + updateStrings(obj: {[key: string]: string, ...}): this; - usage(message: string, opts?: { [key: string]: Options, ... }): this; - usage(message: string, desc?: string, builder: CommonModuleObject["builder"], handler: CommonModuleObject["handler"]): this; + usage(message: string, opts?: {[key: string]: Options, ...}): this; + usage( + message: string, + desc?: string, + builder: CommonModuleObject['builder'], + handler: CommonModuleObject['handler'], + ): this; version(): this; version(version: string | false): this; @@ -331,7 +347,7 @@ declare module "yargs" { version( option: string | (() => string), description: string | (() => string), - version: string + version: string, ): this; wrap(columns: number | null): this; diff --git a/gradle.properties b/gradle.properties index 12a6bcebf8b8..d7c39175371a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,11 +4,26 @@ org.gradle.caching=true android.useAndroidX=true +# Those 2 properties are needed to make our project compatible with +# AGP 9.0.0 for the time being. Ideally we should not opt-out of +# builtInKotlin and newDsl once AGP 9.0.0 hits stable. +# More on this: https://developer.android.com/build/releases/agp-preview#android-gradle-plugin-built-in-kotlin +android.builtInKotlin=false +android.newDsl=false + # Use this property to specify which architecture you want to build. # You can also override it from the CLI using # ./gradlew -PreactNativeArchitectures=x86_64 reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 +# Controls whether to use Hermes from stable builds. This will force hermes version +# set in the sdks/hermes-engine/version.properties file to be used. This has a higher +# priority than react.internal.useHermesNightly. +react.internal.useHermesStable=false + # Controls whether to use Hermes from nightly builds. This will speed up builds # but should NOT be turned on for CI or release builds. -react.internal.useHermesNightly=false +react.internal.useHermesNightly=true + +# Controls whether to use Hermes 1.0. Clean and rebuild when changing. +hermesV1Enabled=true diff --git a/package.json b/package.json index a9c66a49e214..b143f341f624 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "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": "node ./scripts/cxx-api/public-api.js", "flow-check": "flow check", "flow": "flow", "format-check": "prettier --list-different \"./**/*.{js,md,yml,ts,tsx}\"", @@ -23,8 +22,8 @@ "lint-kotlin": "./gradlew ktfmtFormat", "lint-markdown": "markdownlint-cli2 2>&1", "lint": "eslint --max-warnings 0 .", + "preinstall": "node ./scripts/try-set-nightly-hermes-compiler.js", "prettier": "prettier --write \"./**/*.{js,md,yml,ts,tsx}\"", - "print-packages": "node ./scripts/monorepo/print", "shellcheck": "./.github/workflow-scripts/analyze_scripts.sh", "start": "yarn --cwd packages/rn-tester start", "set-version": "node ./scripts/releases/set-version.js", @@ -54,16 +53,19 @@ "@babel/preset-env": "^7.25.3", "@babel/preset-flow": "^7.24.7", "@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", - "@react-native/metro-babel-transformer": "0.82.0-main", - "@react-native/metro-config": "0.82.0-main", + "@octokit/rest": "^22.0.0", + "@react-native/metro-babel-transformer": "0.85.0-main", + "@react-native/metro-config": "0.85.0-main", "@tsconfig/node22": "22.0.2", "@types/react": "^19.1.0", "@typescript-eslint/parser": "^8.36.0", + "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.32.0", + "babel-plugin-syntax-hermes-parser": "0.33.3", "babel-plugin-transform-define": "^2.1.4", "babel-plugin-transform-flow-enums": "^0.0.2", "clang-format": "^1.8.0", @@ -77,46 +79,47 @@ "eslint-plugin-ft-flow": "^2.0.1", "eslint-plugin-jest": "^29.0.1", "eslint-plugin-jsx-a11y": "^6.6.0", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-native": "^4.0.0", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-native": "^5.0.0", "eslint-plugin-redundant-undefined": "^0.4.0", "eslint-plugin-relay": "^1.8.3", - "flow-api-translator": "0.32.0", - "flow-bin": "^0.279.0", - "glob": "^7.1.1", - "hermes-eslint": "0.32.0", - "hermes-transform": "0.32.0", + "fb-dotslash": "0.5.8", + "flow-api-translator": "0.33.3", + "flow-bin": "^0.297.0", + "hermes-eslint": "0.33.3", + "hermes-transform": "0.33.3", "ini": "^5.0.0", "inquirer": "^7.1.0", "jest": "^29.7.0", "jest-config": "^29.7.0", "jest-diff": "^29.7.0", - "jest-junit": "^10.0.0", + "jest-junit": "^16.0.0", "jest-snapshot": "^29.7.0", + "jsonc-parser": "2.2.1", "markdownlint-cli2": "^0.17.2", "markdownlint-rule-relative-links": "^3.0.0", - "memfs": "^4.7.7", - "metro-babel-register": "^0.83.1", - "metro-transform-plugins": "^0.83.1", + "memfs": "^4.38.2", + "metro-babel-register": "^0.83.3", + "metro-transform-plugins": "^0.83.3", "micromatch": "^4.0.4", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", "prettier": "3.6.2", - "prettier-plugin-hermes-parser": "0.32.0", - "react": "19.1.1", - "react-test-renderer": "19.1.1", + "prettier-plugin-hermes-parser": "0.33.2", + "react": "19.2.3", + "react-test-renderer": "19.2.3", "rimraf": "^3.0.2", "shelljs": "^0.8.5", - "signedsource": "^1.0.0", + "signedsource": "^2.0.0", "supports-color": "^7.1.0", "temp-dir": "^2.0.0", "tinybench": "^4.1.0", + "tinyglobby": "^0.2.15", "typescript": "5.8.3", - "ws": "^6.2.3" + "ws": "^7.5.10" }, "resolutions": { - "eslint-plugin-react-hooks": "6.1.0-canary-12bc60f5-20250613", - "react-is": "19.1.1", + "react-is": "19.2.3", "on-headers": "1.1.0", "compression": "1.8.1" } diff --git a/packages/assets/package.json b/packages/assets/package.json index aff74ac9732b..fefd1afaec4d 100644 --- a/packages/assets/package.json +++ b/packages/assets/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/assets-registry", - "version": "0.82.0-main", + "version": "0.85.0-main", "description": "Asset support code for React Native.", "license": "MIT", "repository": { @@ -17,7 +17,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">= 20.19.4" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "files": [ "path-support.js", diff --git a/packages/assets/path-support.js b/packages/assets/path-support.js index bdf2acc3491b..c73a2e2bbf2e 100644 --- a/packages/assets/path-support.js +++ b/packages/assets/path-support.js @@ -43,6 +43,8 @@ function getAndroidAssetSuffix(scale /*: number */) /*: string */ { // See https://developer.android.com/guide/topics/resources/drawable-resource.html const drawableFileTypes = new Set([ 'gif', + 'heic', + 'heif', 'jpeg', 'jpg', 'ktx', diff --git a/packages/babel-plugin-codegen/__test_fixtures__/failures.js b/packages/babel-plugin-codegen/__test_fixtures__/failures.js index 908a83488e07..af4f40a3ec05 100644 --- a/packages/babel-plugin-codegen/__test_fixtures__/failures.js +++ b/packages/babel-plugin-codegen/__test_fixtures__/failures.js @@ -81,10 +81,147 @@ export {Commands}; export default (codegenNativeComponent('Module'): NativeType); `; +const COMMANDS_WITH_COVERAGE_INVALID = ` +// @flow + +const codegenNativeComponent = require('codegenNativeComponent'); +import type {NativeComponentType} from 'codegenNativeComponent'; + +import type {ViewProps} from 'ViewPropTypes'; + +type ModuleProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type NativeType = NativeComponentType; + +// Coverage instrumentation of invalid Commands export - should still fail +export const Commands = (cov_1234567890().s[0]++, { + hotspotUpdate: () => {}, + scrollTo: () => {}, +}); + +export default (codegenNativeComponent('Module'): NativeType); +`; + +const COMMANDS_WITH_COVERAGE_WRONG_FUNCTION = ` +// @flow + +const codegenNativeComponent = require('codegenNativeComponent'); +import type {NativeComponentType} from 'codegenNativeComponent'; + +import type {ViewProps} from 'ViewPropTypes'; + +type ModuleProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type NativeType = NativeComponentType; + +// Coverage instrumentation of wrong function call - should fail +export const Commands = (cov_abcdef123().s[0]++, someOtherFunction({ + supportedCommands: ['pause', 'play'], +})); + +export default (codegenNativeComponent('Module'): NativeType); +`; + +const COMMANDS_WITH_COMPLEX_COVERAGE_INVALID = ` +// @flow + +const codegenNativeComponent = require('codegenNativeComponent'); +import type {NativeComponentType} from 'codegenNativeComponent'; + +import type {ViewProps} from 'ViewPropTypes'; + +type ModuleProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type NativeType = NativeComponentType; + +// Complex coverage instrumentation with invalid nested structure - should fail +export const Commands = ( + cov_xyz789().f[1]++, + cov_xyz789().s[2]++, + { + pause: (ref) => {}, + play: (ref) => {}, + } +); + +export default (codegenNativeComponent('Module'): NativeType); +`; + +const COMMANDS_WITH_COVERAGE_WRONG_NAME = ` +// @flow + +const codegenNativeCommands = require('codegenNativeCommands'); +const codegenNativeComponent = require('codegenNativeComponent'); +import type {NativeComponentType} from 'codegenNativeComponent'; + +import type {ViewProps} from 'ViewPropTypes'; + +type ModuleProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type NativeType = NativeComponentType; + +interface NativeCommands { + +pause: (viewRef: React.ElementRef) => void; + +play: (viewRef: React.ElementRef) => void; +} + +// Coverage instrumentation with correct function but wrong export name - should fail +export const WrongName = (cov_wrong123().s[0]++, codegenNativeCommands({ + supportedCommands: ['pause', 'play'], +})); + +export default (codegenNativeComponent('Module'): NativeType); +`; + +const COMMANDS_WITH_COVERAGE_TYPE_CAST_INVALID = ` +// @flow + +const codegenNativeComponent = require('codegenNativeComponent'); +import type {NativeComponentType} from 'codegenNativeComponent'; + +import type {ViewProps} from 'ViewPropTypes'; + +type ModuleProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type NativeType = NativeComponentType; + +interface NativeCommands { + +pause: (viewRef: React.ElementRef) => void; + +play: (viewRef: React.ElementRef) => void; +} + +// Coverage instrumentation with type cast but wrong function - should fail +export const Commands: NativeCommands = (cov_cast123().s[0]++, invalidFunction({ + supportedCommands: ['pause', 'play'], +})); + +export default (codegenNativeComponent('Module'): NativeType); +`; + module.exports = { 'CommandsExportedWithDifferentNameNativeComponent.js': COMMANDS_EXPORTED_WITH_DIFFERENT_NAME, 'CommandsExportedWithShorthandNativeComponent.js': COMMANDS_EXPORTED_WITH_SHORTHAND, 'OtherCommandsExportNativeComponent.js': OTHER_COMMANDS_EXPORT, + 'CommandsWithCoverageInvalidNativeComponent.js': + COMMANDS_WITH_COVERAGE_INVALID, + 'CommandsWithCoverageWrongFunctionNativeComponent.js': + COMMANDS_WITH_COVERAGE_WRONG_FUNCTION, + 'CommandsWithComplexCoverageInvalidNativeComponent.js': + COMMANDS_WITH_COMPLEX_COVERAGE_INVALID, + 'CommandsWithCoverageWrongNameNativeComponent.js': + COMMANDS_WITH_COVERAGE_WRONG_NAME, + 'CommandsWithCoverageTypeCastInvalidNativeComponent.js': + COMMANDS_WITH_COVERAGE_TYPE_CAST_INVALID, }; diff --git a/packages/babel-plugin-codegen/__test_fixtures__/fixtures.js b/packages/babel-plugin-codegen/__test_fixtures__/fixtures.js index 1aec6340d2f6..6b813a3f07a6 100644 --- a/packages/babel-plugin-codegen/__test_fixtures__/fixtures.js +++ b/packages/babel-plugin-codegen/__test_fixtures__/fixtures.js @@ -59,6 +59,92 @@ export default codegenNativeComponent('Module', { }); `; +// Coverage instrumentation test cases - should be recognized as valid +const COMMANDS_WITH_SIMPLE_COVERAGE = ` +// @flow + +const codegenNativeCommands = require('codegenNativeCommands'); +const codegenNativeComponent = require('codegenNativeComponent'); + +import type {ViewProps} from 'ViewPropTypes'; +import type {NativeComponentType} from 'codegenNativeComponent'; + +type ModuleProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type NativeType = NativeComponentType; + +interface NativeCommands { + +pause: (viewRef: React.ElementRef) => void; + +play: (viewRef: React.ElementRef) => void; +} + +export const Commands = (cov_1234567890.s[0]++, codegenNativeCommands({ + supportedCommands: ['pause', 'play'], +})); + +export default codegenNativeComponent('Module'); +`; + +const COMMANDS_WITH_COMPLEX_COVERAGE = ` +// @flow + +const codegenNativeCommands = require('codegenNativeCommands'); +const codegenNativeComponent = require('codegenNativeComponent'); + +import type {ViewProps} from 'ViewPropTypes'; +import type {NativeComponentType} from 'codegenNativeComponent'; + +type ModuleProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type NativeType = NativeComponentType; + +interface NativeCommands { + +seek: (viewRef: React.ElementRef, position: number) => void; + +stop: (viewRef: React.ElementRef) => void; +} + +export const Commands = ( + cov_abcdef123().f[2]++, + cov_abcdef123().s[5]++, + codegenNativeCommands({ + supportedCommands: ['seek', 'stop'], + }) +); + +export default codegenNativeComponent('Module'); +`; + +const COMMANDS_WITH_TYPE_CAST_COVERAGE = ` +// @flow + +const codegenNativeCommands = require('codegenNativeCommands'); +const codegenNativeComponent = require('codegenNativeComponent'); + +import type {ViewProps} from 'ViewPropTypes'; +import type {NativeComponentType} from 'codegenNativeComponent'; + +type ModuleProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type NativeType = NativeComponentType; + +interface NativeCommands { + +mute: (viewRef: React.ElementRef) => void; + +unmute: (viewRef: React.ElementRef) => void; +} + +export const Commands: NativeCommands = (cov_xyz789().s[1]++, codegenNativeCommands({ + supportedCommands: ['mute', 'unmute'], +})); + +export default codegenNativeComponent('Module'); +`; + const FULL_NATIVE_COMPONENT_WITH_TYPE_EXPORT = ` // @flow @@ -107,4 +193,9 @@ module.exports = { 'NotANativeComponent.js': NOT_A_NATIVE_COMPONENT, 'FullNativeComponent.js': FULL_NATIVE_COMPONENT, 'FullTypedNativeComponent.js': FULL_NATIVE_COMPONENT_WITH_TYPE_EXPORT, + 'CommandsWithSimpleCoverageNativeComponent.js': COMMANDS_WITH_SIMPLE_COVERAGE, + 'CommandsWithComplexCoverageNativeComponent.js': + COMMANDS_WITH_COMPLEX_COVERAGE, + 'CommandsWithTypeCastCoverageNativeComponent.js': + COMMANDS_WITH_TYPE_CAST_COVERAGE, }; diff --git a/packages/babel-plugin-codegen/__tests__/__snapshots__/index-test.js.snap b/packages/babel-plugin-codegen/__tests__/__snapshots__/index-test.js.snap index 94e334ad3dae..c038ee55988e 100644 --- a/packages/babel-plugin-codegen/__tests__/__snapshots__/index-test.js.snap +++ b/packages/babel-plugin-codegen/__tests__/__snapshots__/index-test.js.snap @@ -1,5 +1,77 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Babel plugin inline view configs can inline config for CommandsWithComplexCoverageNativeComponent.js 1`] = ` +"// @flow + +const codegenNativeCommands = require('codegenNativeCommands'); +const codegenNativeComponent = require('codegenNativeComponent'); +import type { ViewProps } from 'ViewPropTypes'; +import type { NativeComponentType } from 'codegenNativeComponent'; +type ModuleProps = $ReadOnly<{| + ...ViewProps +|}>; +type NativeType = NativeComponentType; +interface NativeCommands { + +seek: (viewRef: React.ElementRef, position: number) => void, + +stop: (viewRef: React.ElementRef) => void, +} +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); +let nativeComponentName = 'Module'; +export const __INTERNAL_VIEW_CONFIG = { + uiViewClassName: \\"Module\\", + validAttributes: {} +}; +export default NativeComponentRegistry.get(nativeComponentName, () => __INTERNAL_VIEW_CONFIG);" +`; + +exports[`Babel plugin inline view configs can inline config for CommandsWithSimpleCoverageNativeComponent.js 1`] = ` +"// @flow + +const codegenNativeCommands = require('codegenNativeCommands'); +const codegenNativeComponent = require('codegenNativeComponent'); +import type { ViewProps } from 'ViewPropTypes'; +import type { NativeComponentType } from 'codegenNativeComponent'; +type ModuleProps = $ReadOnly<{| + ...ViewProps +|}>; +type NativeType = NativeComponentType; +interface NativeCommands { + +pause: (viewRef: React.ElementRef) => void, + +play: (viewRef: React.ElementRef) => void, +} +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); +let nativeComponentName = 'Module'; +export const __INTERNAL_VIEW_CONFIG = { + uiViewClassName: \\"Module\\", + validAttributes: {} +}; +export default NativeComponentRegistry.get(nativeComponentName, () => __INTERNAL_VIEW_CONFIG);" +`; + +exports[`Babel plugin inline view configs can inline config for CommandsWithTypeCastCoverageNativeComponent.js 1`] = ` +"// @flow + +const codegenNativeCommands = require('codegenNativeCommands'); +const codegenNativeComponent = require('codegenNativeComponent'); +import type { ViewProps } from 'ViewPropTypes'; +import type { NativeComponentType } from 'codegenNativeComponent'; +type ModuleProps = $ReadOnly<{| + ...ViewProps +|}>; +type NativeType = NativeComponentType; +interface NativeCommands { + +mute: (viewRef: React.ElementRef) => void, + +unmute: (viewRef: React.ElementRef) => void, +} +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); +let nativeComponentName = 'Module'; +export const __INTERNAL_VIEW_CONFIG = { + uiViewClassName: \\"Module\\", + validAttributes: {} +}; +export default NativeComponentRegistry.get(nativeComponentName, () => __INTERNAL_VIEW_CONFIG);" +`; + exports[`Babel plugin inline view configs can inline config for FullNativeComponent.js 1`] = ` "// @flow @@ -153,6 +225,61 @@ exports[`Babel plugin inline view configs fails on inline config for CommandsExp 24 |" `; +exports[`Babel plugin inline view configs fails on inline config for CommandsWithComplexCoverageInvalidNativeComponent.js 1`] = ` +"/CommandsWithComplexCoverageInvalidNativeComponent.js: 'Commands' is a reserved export and may only be used to export the result of codegenNativeCommands. + 14 | + 15 | // Complex coverage instrumentation with invalid nested structure - should fail +> 16 | export const Commands = ( + | ^ + 17 | cov_xyz789().f[1]++, + 18 | cov_xyz789().s[2]++, + 19 | {" +`; + +exports[`Babel plugin inline view configs fails on inline config for CommandsWithCoverageInvalidNativeComponent.js 1`] = ` +"/CommandsWithCoverageInvalidNativeComponent.js: 'Commands' is a reserved export and may only be used to export the result of codegenNativeCommands. + 14 | + 15 | // Coverage instrumentation of invalid Commands export - should still fail +> 16 | export const Commands = (cov_1234567890().s[0]++, { + | ^ + 17 | hotspotUpdate: () => {}, + 18 | scrollTo: () => {}, + 19 | });" +`; + +exports[`Babel plugin inline view configs fails on inline config for CommandsWithCoverageTypeCastInvalidNativeComponent.js 1`] = ` +"/CommandsWithCoverageTypeCastInvalidNativeComponent.js: 'Commands' is a reserved export and may only be used to export the result of codegenNativeCommands. + 19 | + 20 | // Coverage instrumentation with type cast but wrong function - should fail +> 21 | export const Commands: NativeCommands = (cov_cast123().s[0]++, invalidFunction({ + | ^ + 22 | supportedCommands: ['pause', 'play'], + 23 | })); + 24 |" +`; + +exports[`Babel plugin inline view configs fails on inline config for CommandsWithCoverageWrongFunctionNativeComponent.js 1`] = ` +"/CommandsWithCoverageWrongFunctionNativeComponent.js: 'Commands' is a reserved export and may only be used to export the result of codegenNativeCommands. + 14 | + 15 | // Coverage instrumentation of wrong function call - should fail +> 16 | export const Commands = (cov_abcdef123().s[0]++, someOtherFunction({ + | ^ + 17 | supportedCommands: ['pause', 'play'], + 18 | })); + 19 |" +`; + +exports[`Babel plugin inline view configs fails on inline config for CommandsWithCoverageWrongNameNativeComponent.js 1`] = ` +"/CommandsWithCoverageWrongNameNativeComponent.js: Native commands must be exported with the name 'Commands' + 20 | + 21 | // Coverage instrumentation with correct function but wrong export name - should fail +> 22 | export const WrongName = (cov_wrong123().s[0]++, codegenNativeCommands({ + | ^ + 23 | supportedCommands: ['pause', 'play'], + 24 | })); + 25 |" +`; + exports[`Babel plugin inline view configs fails on inline config for OtherCommandsExportNativeComponent.js 1`] = ` "/OtherCommandsExportNativeComponent.js: 'Commands' is a reserved export and may only be used to export the result of codegenNativeCommands. 17 | } diff --git a/packages/babel-plugin-codegen/index.js b/packages/babel-plugin-codegen/index.js index 37302dfd0503..06a4939ad225 100644 --- a/packages/babel-plugin-codegen/index.js +++ b/packages/babel-plugin-codegen/index.js @@ -102,6 +102,58 @@ function isCodegenDeclaration(declaration) { return false; } +function isCodegenNativeCommandsDeclaration(declaration) { + if (!declaration) { + return false; + } + + // Handle direct calls: codegenNativeCommands() + if ( + declaration.type === 'CallExpression' && + declaration.callee && + declaration.callee.type === 'Identifier' && + declaration.callee.name === 'codegenNativeCommands' + ) { + return true; + } + + // Handle coverage instrumentation: (cov_xxx().s[0]++, codegenNativeCommands()) + if (declaration.type === 'SequenceExpression' && declaration.expressions) { + // Get the last expression in the sequence (the actual function call) + const lastExpression = + declaration.expressions[declaration.expressions.length - 1]; + // Recursively check if the last expression is a valid codegenNativeCommands call + return isCodegenNativeCommandsDeclaration(lastExpression); + } + + // Handle Flow type casts: (codegenNativeCommands(): NativeCommands) + if ( + (declaration.type === 'TypeCastExpression' || + declaration.type === 'AsExpression') && + declaration.expression && + declaration.expression.type === 'CallExpression' && + declaration.expression.callee && + declaration.expression.callee.type === 'Identifier' && + declaration.expression.callee.name === 'codegenNativeCommands' + ) { + return true; + } + + // Handle TypeScript assertions: codegenNativeCommands() as NativeCommands + if ( + declaration.type === 'TSAsExpression' && + declaration.expression && + declaration.expression.type === 'CallExpression' && + declaration.expression.callee && + declaration.expression.callee.type === 'Identifier' && + declaration.expression.callee.name === 'codegenNativeCommands' + ) { + return true; + } + + return false; +} + module.exports = function ({parse, types: t}) { return { pre(state) { @@ -125,12 +177,12 @@ module.exports = function ({parse, types: t}) { const firstDeclaration = path.node.declaration.declarations[0]; if (firstDeclaration.type === 'VariableDeclarator') { - if ( - firstDeclaration.init && - firstDeclaration.init.type === 'CallExpression' && - firstDeclaration.init.callee.type === 'Identifier' && - firstDeclaration.init.callee.name === 'codegenNativeCommands' - ) { + // Check if this is a valid codegenNativeCommands call, handling type annotations + const isValidCommandsExport = isCodegenNativeCommandsDeclaration( + firstDeclaration.init, + ); + + if (isValidCommandsExport) { if ( firstDeclaration.id.type === 'Identifier' && firstDeclaration.id.name !== 'Commands' diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index 6af39526dbed..144b0a62f557 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.82.0-main", + "version": "0.85.0-main", "description": "Babel plugin to generate native module and view manager code for React Native.", "license": "MIT", "repository": { @@ -19,14 +19,14 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">= 20.19.4" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "files": [ "index.js" ], "dependencies": { "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.82.0-main" + "@react-native/codegen": "0.85.0-main" }, "devDependencies": { "@babel/core": "^7.25.2" diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index 5d070269c3ea..7714aaced800 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.82.0-main", + "version": "0.85.0-main", "description": "Core CLI commands for React Native", "keywords": [ "react-native", @@ -18,20 +18,29 @@ ".": "./src/index.js", "./package.json": "./package.json" }, + "publishConfig": { + "exports": { + ".": "./dist/index.js", + "./package.json": "./package.json" + } + }, "files": [ "dist" ], + "scripts": { + "prepack": "node ../../scripts/build/prepack.js" + }, "dependencies": { - "@react-native/dev-middleware": "0.82.0-main", + "@react-native/dev-middleware": "0.85.0-main", "debug": "^4.4.0", "invariant": "^2.2.4", - "metro": "^0.83.1", - "metro-config": "^0.83.1", - "metro-core": "^0.83.1", + "metro": "^0.83.3", + "metro-config": "^0.83.3", + "metro-core": "^0.83.3", "semver": "^7.1.3" }, "devDependencies": { - "metro-resolver": "^0.83.1" + "metro-resolver": "^0.83.3" }, "peerDependencies": { "@react-native-community/cli": "*", @@ -40,9 +49,12 @@ "peerDependenciesMeta": { "@react-native-community/cli": { "optional": true + }, + "@react-native/metro-config": { + "optional": true } }, "engines": { - "node": ">= 20.19.4" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } } diff --git a/packages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.js b/packages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.js index 33f013741a9f..eefc3c6d5ad9 100644 --- a/packages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.js +++ b/packages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.js @@ -31,7 +31,7 @@ type ImageSet = { export function getImageSet( catalogDir: string, asset: AssetData, - scales: $ReadOnlyArray, + scales: ReadonlyArray, ): ImageSet { const fileName = assetPathUtils.getResourceIdentifier(asset); return { diff --git a/packages/community-cli-plugin/src/commands/bundle/assetPathUtils.js b/packages/community-cli-plugin/src/commands/bundle/assetPathUtils.js index 6f1aaf532d97..1ac88c6c01ec 100644 --- a/packages/community-cli-plugin/src/commands/bundle/assetPathUtils.js +++ b/packages/community-cli-plugin/src/commands/bundle/assetPathUtils.js @@ -8,7 +8,7 @@ * @format */ -export type PackagerAsset = $ReadOnly<{ +export type PackagerAsset = Readonly<{ httpServerLocation: string, name: string, type: string, @@ -41,6 +41,8 @@ function getAndroidAssetSuffix(scale: number): string { // See https://developer.android.com/guide/topics/resources/drawable-resource.html const drawableFileTypes: Set = new Set([ 'gif', + 'heic', + 'heif', 'jpeg', 'jpg', 'png', @@ -73,7 +75,7 @@ function getResourceIdentifier(asset: PackagerAsset): string { .toLowerCase() .replace(/\//g, '_') // Encode folder structure in file name .replace(/([^a-z0-9_])/g, '') // Remove illegal chars - .replace(/^assets_/, ''); // Remove "assets_" prefix + .replace(/^(?:assets|assetsunstable_path)_/, ''); // Remove "assets_" or "assetsunstable_path_" prefix } function getBasePath(asset: PackagerAsset): string { diff --git a/packages/community-cli-plugin/src/commands/bundle/createKeepFileAsync.js b/packages/community-cli-plugin/src/commands/bundle/createKeepFileAsync.js index 405df8a46050..479c1bdf0143 100644 --- a/packages/community-cli-plugin/src/commands/bundle/createKeepFileAsync.js +++ b/packages/community-cli-plugin/src/commands/bundle/createKeepFileAsync.js @@ -15,7 +15,7 @@ import fs from 'fs'; import path from 'path'; async function createKeepFileAsync( - assets: $ReadOnlyArray, + assets: ReadonlyArray, outputDirectory: string, ): Promise { if (!assets.length) { diff --git a/packages/community-cli-plugin/src/commands/bundle/filterPlatformAssetScales.js b/packages/community-cli-plugin/src/commands/bundle/filterPlatformAssetScales.js index 139fa4ff61b6..0c78dd87e3cc 100644 --- a/packages/community-cli-plugin/src/commands/bundle/filterPlatformAssetScales.js +++ b/packages/community-cli-plugin/src/commands/bundle/filterPlatformAssetScales.js @@ -14,8 +14,8 @@ const ALLOWED_SCALES: {[key: string]: number[]} = { function filterPlatformAssetScales( platform: string, - scales: $ReadOnlyArray, -): $ReadOnlyArray { + scales: ReadonlyArray, +): ReadonlyArray { const whitelist: number[] = ALLOWED_SCALES[platform]; if (!whitelist) { return scales; diff --git a/packages/community-cli-plugin/src/commands/bundle/saveAssets.js b/packages/community-cli-plugin/src/commands/bundle/saveAssets.js index 2a759a0540f0..83a8e139cb2a 100644 --- a/packages/community-cli-plugin/src/commands/bundle/saveAssets.js +++ b/packages/community-cli-plugin/src/commands/bundle/saveAssets.js @@ -29,7 +29,7 @@ type CopiedFiles = { }; async function saveAssets( - assets: $ReadOnlyArray, + assets: ReadonlyArray, platform: string, assetsDest?: string, assetCatalogDest?: string, diff --git a/packages/community-cli-plugin/src/commands/start/OpenDebuggerKeyboardHandler.js b/packages/community-cli-plugin/src/commands/start/OpenDebuggerKeyboardHandler.js index bee5295cf1b1..75afc25ce13f 100644 --- a/packages/community-cli-plugin/src/commands/start/OpenDebuggerKeyboardHandler.js +++ b/packages/community-cli-plugin/src/commands/start/OpenDebuggerKeyboardHandler.js @@ -12,7 +12,7 @@ import type {TerminalReporter} from 'metro'; import {styleText} from 'util'; -type PageDescription = $ReadOnly<{ +type PageDescription = Readonly<{ id: string, title: string, description: string, @@ -22,7 +22,7 @@ type PageDescription = $ReadOnly<{ export default class OpenDebuggerKeyboardHandler { #devServerUrl: string; #reporter: TerminalReporter; - #targetsShownForSelection: ?$ReadOnlyArray = null; + #targetsShownForSelection: ?ReadonlyArray = null; constructor({ devServerUrl, @@ -82,7 +82,7 @@ export default class OpenDebuggerKeyboardHandler { if (res.status !== 200) { throw new Error(`Unexpected status code: ${res.status}`); } - const targets = (await res.json()) as $ReadOnlyArray; + const targets = (await res.json()) as ReadonlyArray; if (!Array.isArray(targets)) { throw new Error('Expected array.'); } @@ -94,22 +94,26 @@ export default class OpenDebuggerKeyboardHandler { const target = targets[0]; void this.#tryOpenDebuggerForTarget(target); } else { - this.#targetsShownForSelection = targets; - if (targets.length > 9) { this.#log( 'warn', '10 or more debug targets available, showing the first 9.', ); } + const targetsShown = targets.slice(0, 9); + const hasDuplicateTitles = + new Set(targetsShown.map(target => target.title)).size < + targetsShown.length; + this.#targetsShownForSelection = targetsShown; this.#setTerminalMenu( - `Multiple debug targets available, please select:\n ${targets - .slice(0, 9) - .map( - ({title}, i) => - `${styleText(['white', 'inverse'], ` ${i + 1} `)} - "${title}"`, - ) + `Multiple debug targets available, please select:\n ${targetsShown + .map(({title, description}, i) => { + const descriptionSuffix = hasDuplicateTitles + ? ` (${description})` + : ''; + return `${styleText(['white', 'inverse'], ` ${i + 1} `)} - "${title}${descriptionSuffix}"`; + }) .join('\n ')}`, ); } @@ -149,7 +153,7 @@ export default class OpenDebuggerKeyboardHandler { this.#targetsShownForSelection = null; } - #log(level: 'info' | 'warn' | 'error', ...data: Array): void { + #log(level: 'info' | 'warn' | 'error', ...data: Array): void { this.#reporter.update({ type: 'unstable_server_log', level, diff --git a/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js b/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js index 76f83acf94ca..fd43a0e8e011 100644 --- a/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js +++ b/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js @@ -45,8 +45,8 @@ export default function attachKeyHandlers({ reporter, }: { devServerUrl: string, - messageSocket: $ReadOnly<{ - broadcast: (type: string, params?: Record | null) => void, + messageSocket: Readonly<{ + broadcast: (type: string, params?: Record | null) => void, ... }>, reporter: TerminalReporter, diff --git a/packages/community-cli-plugin/src/commands/start/middleware.js b/packages/community-cli-plugin/src/commands/start/middleware.js index 8df3991cb421..806d8c393537 100644 --- a/packages/community-cli-plugin/src/commands/start/middleware.js +++ b/packages/community-cli-plugin/src/commands/start/middleware.js @@ -22,7 +22,10 @@ type MiddlewareReturn = { }, messageSocketEndpoint: { server: ws$WebSocketServer, - broadcast: (method: string, params?: Record | null) => void, + broadcast: ( + method: string, + params?: Record | null, + ) => void, }, eventsSocketEndpoint: { server: ws$WebSocketServer, @@ -31,16 +34,16 @@ type MiddlewareReturn = { ... }; -// $FlowFixMe +// $FlowFixMe[incompatible-type] const unusedStubWSServer: ws$WebSocketServer = {}; -// $FlowFixMe +// $FlowFixMe[incompatible-type] const unusedMiddlewareStub: Server = {}; const communityMiddlewareFallback = { createDevServerMiddleware: (params: { host?: string, port: number, - watchFolders: $ReadOnlyArray, + watchFolders: ReadonlyArray, }): MiddlewareReturn => ({ // FIXME: Several features will break without community middleware and // should be migrated into core. @@ -54,7 +57,7 @@ const communityMiddlewareFallback = { server: unusedStubWSServer, broadcast: ( method: string, - _params?: Record | null, + _params?: Record | null, ): void => {}, }, eventsSocketEndpoint: { diff --git a/packages/community-cli-plugin/src/commands/start/runServer.js b/packages/community-cli-plugin/src/commands/start/runServer.js index 385edb1d0da3..22962457a2bf 100644 --- a/packages/community-cli-plugin/src/commands/start/runServer.js +++ b/packages/community-cli-plugin/src/commands/start/runServer.js @@ -119,7 +119,6 @@ async function runServer( watchFolders, }); const {middleware, websocketEndpoints} = createDevMiddleware({ - projectRoot, serverBaseUrl: devServerUrl, logger: createDevMiddlewareLogger(terminalReporter), }); diff --git a/packages/community-cli-plugin/src/utils/createDevMiddlewareLogger.js b/packages/community-cli-plugin/src/utils/createDevMiddlewareLogger.js index 006fed8187fc..6975b9f925bd 100644 --- a/packages/community-cli-plugin/src/utils/createDevMiddlewareLogger.js +++ b/packages/community-cli-plugin/src/utils/createDevMiddlewareLogger.js @@ -10,7 +10,7 @@ import type {TerminalReporter} from 'metro'; -type LoggerFn = (...message: $ReadOnlyArray) => void; +type LoggerFn = (...message: ReadonlyArray) => void; /** * Create a dev-middleware logger object that will emit logs via Metro's @@ -18,7 +18,7 @@ type LoggerFn = (...message: $ReadOnlyArray) => void; */ export default function createDevMiddlewareLogger( reporter: TerminalReporter, -): $ReadOnly<{ +): Readonly<{ info: LoggerFn, error: LoggerFn, warn: LoggerFn, @@ -34,7 +34,7 @@ function makeLogger( reporter: TerminalReporter, level: 'info' | 'warn' | 'error', ): LoggerFn { - return (...data: Array) => + return (...data: Array) => reporter.update({ type: 'unstable_server_log', level, diff --git a/packages/community-cli-plugin/src/utils/loadMetroConfig.js b/packages/community-cli-plugin/src/utils/loadMetroConfig.js index 36d11175f632..8b5883a3148a 100644 --- a/packages/community-cli-plugin/src/utils/loadMetroConfig.js +++ b/packages/community-cli-plugin/src/utils/loadMetroConfig.js @@ -20,7 +20,7 @@ const debug = require('debug')('ReactNative:CommunityCliPlugin'); export type {Config}; -export type ConfigLoadingContext = $ReadOnly<{ +export type ConfigLoadingContext = Readonly<{ root: Config['root'], reactNativePath: Config['reactNativePath'], platforms: Config['platforms'], diff --git a/packages/community-cli-plugin/src/utils/parseKeyValueParamArray.js b/packages/community-cli-plugin/src/utils/parseKeyValueParamArray.js index cc2b94822f67..92356a6bba16 100644 --- a/packages/community-cli-plugin/src/utils/parseKeyValueParamArray.js +++ b/packages/community-cli-plugin/src/utils/parseKeyValueParamArray.js @@ -9,7 +9,7 @@ */ export default function parseKeyValueParamArray( - keyValueArray: $ReadOnlyArray, + keyValueArray: ReadonlyArray, ): Record { const result = {}; diff --git a/packages/community-cli-plugin/src/utils/version.js b/packages/community-cli-plugin/src/utils/version.js index cb7f7442a734..27f455a8aaee 100644 --- a/packages/community-cli-plugin/src/utils/version.js +++ b/packages/community-cli-plugin/src/utils/version.js @@ -88,7 +88,6 @@ Diff: ${styleText(['dim', 'underline'], newVersion?.diffUrl ?? 'none')} } } -// $FlowFixMe function isDiffPurgeEntry(data: Partial): data is DiffPurge { return ( // $FlowFixMe[incompatible-type-guard] diff --git a/packages/core-cli-utils/package.json b/packages/core-cli-utils/package.json index 601eb124a5da..9f178299ca52 100644 --- a/packages/core-cli-utils/package.json +++ b/packages/core-cli-utils/package.json @@ -1,31 +1,42 @@ { "name": "@react-native/core-cli-utils", - "version": "0.82.0-main", + "version": "0.85.0-main", "description": "React Native CLI library for Frameworks to build on", "license": "MIT", - "main": "./src/index.flow.js", + "keywords": [ + "cli-utils", + "react-native" + ], + "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/core-cli-utils#readme", + "bugs": "https://github.com/facebook/react-native/issues", "repository": { "type": "git", "url": "git+https://github.com/facebook/react-native.git", "directory": "packages/core-cli-utils" }, + "main": "./src/index.flow.js", "exports": { ".": "./src/index.js", "./package.json": "./package.json", "./version.js": "./src/public/version.js" }, - "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/core-cli-utils#readme", - "keywords": [ - "cli-utils", - "react-native" - ], - "bugs": "https://github.com/facebook/react-native/issues", - "engines": { - "node": ">= 20.19.4" + "publishConfig": { + "main": "./dist/index.js", + "exports": { + ".": "./dist/index.js", + "./package.json": "./package.json", + "./version.js": "./dist/public/version.js" + } }, "files": [ "dist" ], + "scripts": { + "prepack": "node ../../scripts/build/prepack.js" + }, "dependencies": {}, - "devDependencies": {} + "devDependencies": {}, + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } } diff --git a/packages/core-cli-utils/src/private/android.js b/packages/core-cli-utils/src/private/android.js index 6ef6c1be4b66..c9ea7a7e59ed 100644 --- a/packages/core-cli-utils/src/private/android.js +++ b/packages/core-cli-utils/src/private/android.js @@ -17,7 +17,7 @@ import execa from 'execa'; type AndroidBuildMode = 'Debug' | 'Release'; type Path = string; -type Args = $ReadOnlyArray; +type Args = ReadonlyArray; type Config = { cwd: Path, diff --git a/packages/core-cli-utils/src/private/app.js b/packages/core-cli-utils/src/private/app.js index 990f76a94410..0491ae577cd6 100644 --- a/packages/core-cli-utils/src/private/app.js +++ b/packages/core-cli-utils/src/private/app.js @@ -75,16 +75,13 @@ function getNodePackagePath(packageName: string): string { return require.resolve(packageName, {cwd: [process.cwd(), ...module.paths]}); } -function metro(...args: $ReadOnlyArray): ExecaPromise { +function metro(...args: ReadonlyArray): ExecaPromise { log(`🚇 metro ${args.join(' ')} `); return execa('npx', ['--offline', 'metro', ...args]); } export const tasks = { - bundle: ( - options: BundlerOptions, - ...args: $ReadOnlyArray - ): Bundle => { + bundle: (options: BundlerOptions, ...args: ReadonlyArray): Bundle => { const steps: Bundle = { /* eslint-disable sort-keys */ validate: task(FIRST, 'Check if Metro is available', () => { @@ -117,7 +114,7 @@ type Bundle = { const bundleApp = ( options: BundlerOptions, - ...metroArgs: $ReadOnlyArray + ...metroArgs: ReadonlyArray ) => { if (options.outputJsBundle === options.outputBundle) { throw new Error('outputJsBundle and outputBundle cannot be the same.'); diff --git a/packages/core-cli-utils/src/private/apple.js b/packages/core-cli-utils/src/private/apple.js index 317b60fbe610..691a6147ba13 100644 --- a/packages/core-cli-utils/src/private/apple.js +++ b/packages/core-cli-utils/src/private/apple.js @@ -144,7 +144,7 @@ export const tasks = { // 2. Build the iOS app using a setup environment build: ( options: AppleBuildOptions, - ...args: $ReadOnlyArray + ...args: ReadonlyArray ): { validate: Task, hasPodsInstalled: Task, diff --git a/packages/core-cli-utils/src/private/types.js b/packages/core-cli-utils/src/private/types.js index a7740c7ef149..2c2987e1d306 100644 --- a/packages/core-cli-utils/src/private/types.js +++ b/packages/core-cli-utils/src/private/types.js @@ -8,7 +8,7 @@ * @format */ -export type Task = { +export type Task = { order: number, label: string, action: () => R, diff --git a/packages/core-cli-utils/src/private/utils.js b/packages/core-cli-utils/src/private/utils.js index f41bbb8a8d21..78cadf5ebaae 100644 --- a/packages/core-cli-utils/src/private/utils.js +++ b/packages/core-cli-utils/src/private/utils.js @@ -55,7 +55,7 @@ export function isOnPath(dep: string, description: string): PathCheckResult { } export function assertDependencies( - ...deps: $ReadOnlyArray> + ...deps: ReadonlyArray> ) { for (const {found, dep, description} of deps) { if (!found) { diff --git a/packages/debugger-frontend/BUILD_INFO b/packages/debugger-frontend/BUILD_INFO index fc070ff008bf..331cfcfb3533 100644 --- a/packages/debugger-frontend/BUILD_INFO +++ b/packages/debugger-frontend/BUILD_INFO @@ -1,5 +1,5 @@ -@generated SignedSource<> -Git revision: e87564a24cf233c60aaebee8c418ec85724f7214 +@generated SignedSource<<900cc7078a764597498aecf717759e15>> +Git revision: d65c7f769b312cde3ecd7db20200141dbe729079 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/Images/Images.js b/packages/debugger-frontend/dist/third-party/front_end/Images/Images.js index 604a36749f17..8163f3813b42 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/Images/Images.js +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/Images.js @@ -20,6 +20,7 @@ style.setProperty('--image-file-nodeIcon', 'url(\"' + new URL('./nodeIcon.avif', style.setProperty('--image-file-popoverArrows', 'url(\"' + new URL('./popoverArrows.png', import.meta.url).toString() + '\")'); style.setProperty('--image-file-react_native/learn-debugging-basics', 'url(\"' + new URL('./react_native/learn-debugging-basics.jpg', import.meta.url).toString() + '\")'); style.setProperty('--image-file-react_native/learn-native-debugging', 'url(\"' + new URL('./react_native/learn-native-debugging.jpg', import.meta.url).toString() + '\")'); +style.setProperty('--image-file-react_native/whats-new-083', 'url(\"' + new URL('./react_native/whats-new-083.jpg', import.meta.url).toString() + '\")'); style.setProperty('--image-file-react_native/learn-react-native-devtools', 'url(\"' + new URL('./react_native/learn-react-native-devtools.jpg', import.meta.url).toString() + '\")'); style.setProperty('--image-file-react_native/welcomeIcon', 'url(\"' + new URL('./react_native/welcomeIcon.png', import.meta.url).toString() + '\")'); style.setProperty('--image-file-toolbarResizerVertical', 'url(\"' + new URL('./toolbarResizerVertical.png', import.meta.url).toString() + '\")'); diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-debugging-basics.jpg b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-debugging-basics.jpg index c0bc0a25784e..02fe75b825a0 100644 Binary files a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-debugging-basics.jpg and b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-debugging-basics.jpg differ diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-native-debugging.jpg b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-native-debugging.jpg index ea73f9d8a9c9..85666894a73e 100644 Binary files a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-native-debugging.jpg and b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-native-debugging.jpg differ diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/welcomeIcon.png b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/welcomeIcon.png index 6a010604d839..1e36e07feaca 100644 Binary files a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/welcomeIcon.png and b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/welcomeIcon.png differ diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/whats-new-083.jpg b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/whats-new-083.jpg new file mode 100644 index 000000000000..969df54a3038 Binary files /dev/null and b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/whats-new-083.jpg differ diff --git a/packages/debugger-frontend/dist/third-party/front_end/core/host/host.js b/packages/debugger-frontend/dist/third-party/front_end/core/host/host.js index 54a1a58d5f12..98fae274f241 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/core/host/host.js +++ b/packages/debugger-frontend/dist/third-party/front_end/core/host/host.js @@ -1 +1 @@ -import*as e from"../common/common.js";import*as r from"../root/root.js";import*as t from"../i18n/i18n.js";import*as n from"../platform/platform.js";var o;!function(e){e.AppendedToURL="appendedToURL",e.CanceledSaveURL="canceledSaveURL",e.ColorThemeChanged="colorThemeChanged",e.ContextMenuCleared="contextMenuCleared",e.ContextMenuItemSelected="contextMenuItemSelected",e.DeviceCountUpdated="deviceCountUpdated",e.DevicesDiscoveryConfigChanged="devicesDiscoveryConfigChanged",e.DevicesPortForwardingStatusChanged="devicesPortForwardingStatusChanged",e.DevicesUpdated="devicesUpdated",e.DispatchMessage="dispatchMessage",e.DispatchMessageChunk="dispatchMessageChunk",e.EnterInspectElementMode="enterInspectElementMode",e.EyeDropperPickedColor="eyeDropperPickedColor",e.FileSystemsLoaded="fileSystemsLoaded",e.FileSystemRemoved="fileSystemRemoved",e.FileSystemAdded="fileSystemAdded",e.FileSystemFilesChangedAddedRemoved="FileSystemFilesChangedAddedRemoved",e.IndexingTotalWorkCalculated="indexingTotalWorkCalculated",e.IndexingWorked="indexingWorked",e.IndexingDone="indexingDone",e.KeyEventUnhandled="keyEventUnhandled",e.ReloadInspectedPage="reloadInspectedPage",e.RevealSourceLine="revealSourceLine",e.SavedURL="savedURL",e.SearchCompleted="searchCompleted",e.SetInspectedTabId="setInspectedTabId",e.SetUseSoftMenu="setUseSoftMenu",e.ShowPanel="showPanel"}(o||(o={}));const s=[[o.AppendedToURL,"appendedToURL",["url"]],[o.CanceledSaveURL,"canceledSaveURL",["url"]],[o.ColorThemeChanged,"colorThemeChanged",[]],[o.ContextMenuCleared,"contextMenuCleared",[]],[o.ContextMenuItemSelected,"contextMenuItemSelected",["id"]],[o.DeviceCountUpdated,"deviceCountUpdated",["count"]],[o.DevicesDiscoveryConfigChanged,"devicesDiscoveryConfigChanged",["config"]],[o.DevicesPortForwardingStatusChanged,"devicesPortForwardingStatusChanged",["status"]],[o.DevicesUpdated,"devicesUpdated",["devices"]],[o.DispatchMessage,"dispatchMessage",["messageObject"]],[o.DispatchMessageChunk,"dispatchMessageChunk",["messageChunk","messageSize"]],[o.EnterInspectElementMode,"enterInspectElementMode",[]],[o.EyeDropperPickedColor,"eyeDropperPickedColor",["color"]],[o.FileSystemsLoaded,"fileSystemsLoaded",["fileSystems"]],[o.FileSystemRemoved,"fileSystemRemoved",["fileSystemPath"]],[o.FileSystemAdded,"fileSystemAdded",["errorMessage","fileSystem"]],[o.FileSystemFilesChangedAddedRemoved,"fileSystemFilesChangedAddedRemoved",["changed","added","removed"]],[o.IndexingTotalWorkCalculated,"indexingTotalWorkCalculated",["requestId","fileSystemPath","totalWork"]],[o.IndexingWorked,"indexingWorked",["requestId","fileSystemPath","worked"]],[o.IndexingDone,"indexingDone",["requestId","fileSystemPath"]],[o.KeyEventUnhandled,"keyEventUnhandled",["event"]],[o.ReloadInspectedPage,"reloadInspectedPage",["hard"]],[o.RevealSourceLine,"revealSourceLine",["url","lineNumber","columnNumber"]],[o.SavedURL,"savedURL",["url","fileSystemPath"]],[o.SearchCompleted,"searchCompleted",["requestId","fileSystemPath","files"]],[o.SetInspectedTabId,"setInspectedTabId",["tabId"]],[o.SetUseSoftMenu,"setUseSoftMenu",["useSoftMenu"]],[o.ShowPanel,"showPanel",["panelName"]]];var i=Object.freeze({__proto__:null,EventDescriptors:s,get Events(){return o}});const a={systemError:"System error",connectionError:"Connection error",certificateError:"Certificate error",httpError:"HTTP error",cacheError:"Cache error",signedExchangeError:"Signed Exchange error",ftpError:"FTP error",certificateManagerError:"Certificate manager error",dnsResolverError:"DNS resolver error",unknownError:"Unknown error",httpErrorStatusCodeSS:"HTTP error: status code {PH1}, {PH2}",invalidUrl:"Invalid URL",decodingDataUrlFailed:"Decoding Data URL failed"},d=t.i18n.registerUIStrings("core/host/ResourceLoader.ts",a),c=t.i18n.getLocalizedString.bind(void 0,d);let l=0;const u={},m=function(e){return u[++l]=e,l},g=function(e){u[e].close(),delete u[e]},p=function(e,r){u[e].write(r)};function h(e,r,t){if(void 0===e||void 0===t)return null;if(0!==e){if(function(e){return e<=-300&&e>-400}(e))return c(a.httpErrorStatusCodeSS,{PH1:String(r),PH2:t});const n=function(e){return c(e>-100?a.systemError:e>-200?a.connectionError:e>-300?a.certificateError:e>-400?a.httpError:e>-500?a.cacheError:e>-600?a.signedExchangeError:e>-700?a.ftpError:e>-800?a.certificateManagerError:e>-900?a.dnsResolverError:a.unknownError)}(e);return`${n}: ${t}`}return null}const S=function(r,t,n,o,s){const i=m(n);if(new e.ParsedURL.ParsedURL(r).isDataURL())return void(e=>new Promise(((r,t)=>{const n=new XMLHttpRequest;n.withCredentials=!1,n.open("GET",e,!0),n.onreadystatechange=function(){if(n.readyState===XMLHttpRequest.DONE){if(200!==n.status)return n.onreadystatechange=null,void t(new Error(String(n.status)));n.onreadystatechange=null,r(n.responseText)}},n.send(null)})))(r).then((function(e){p(i,e),l({statusCode:200})})).catch((function(e){l({statusCode:404,messageOverride:c(a.decodingDataUrlFailed)})}));if(!s&&function(e){try{const r=new URL(e);return"file:"===r.protocol&&""!==r.host}catch{return!1}}(r))return void(o&&o(!1,{},{statusCode:400,netError:-20,netErrorName:"net::BLOCKED_BY_CLIENT",message:"Loading from a remote file path is prohibited for security reasons."}));const d=[];if(t)for(const e in t)d.push(e+": "+t[e]);function l(e){if(o){const{success:r,description:t}=function(e){const{statusCode:r,netError:t,netErrorName:n,urlValid:o,messageOverride:s}=e;let i="";const d=r>=200&&r<300;if("string"==typeof s)i=s;else if(!d)if(void 0===t)i=c(!1===o?a.invalidUrl:a.unknownError);else{const e=h(t,r,n);e&&(i=e)}return console.assert(d===(0===i.length)),{success:d,description:{statusCode:r,netError:t,netErrorName:n,urlValid:o,message:i}}}(e);o(r,e.headers||{},t)}g(i)}f.loadNetworkResource(r,d.join("\r\n"),i,l)};var v=Object.freeze({__proto__:null,ResourceLoader:{},bindOutputStream:m,discardOutputStream:g,load:function(r,t,n,o){const s=new e.StringOutputStream.StringOutputStream;S(r,t,s,(function(e,r,t){n(e,r,s.data(),t)}),o)},loadAsStream:S,netErrorToMessage:h,streamWrite:p});const C={devtoolsS:"DevTools - {PH1}"},I=t.i18n.registerUIStrings("core/host/InspectorFrontendHost.ts",C),w=t.i18n.getLocalizedString.bind(void 0,I),k="/overrides";class E{#e=new Map;events;#r=null;recordedCountHistograms=[];recordedEnumeratedHistograms=[];recordedPerformanceHistograms=[];constructor(){function e(e){!("mac"===this.platform()?e.metaKey:e.ctrlKey)||"+"!==e.key&&"-"!==e.key||e.stopPropagation()}"undefined"!=typeof document&&document.addEventListener("keydown",(r=>{e.call(this,r)}),!0)}platform(){const e=navigator.userAgent;return e.includes("Windows NT")?"windows":e.includes("Mac OS X")?"mac":"linux"}loadCompleted(){}bringToFront(){}closeWindow(){}setIsDocked(e,r){window.setTimeout(r,0)}showSurvey(e,r){window.setTimeout((()=>r({surveyShown:!1})),0)}canShowSurvey(e,r){window.setTimeout((()=>r({canShowSurvey:!1})),0)}setInspectedPageBounds(e){}inspectElementCompleted(){}setInjectedScriptForOrigin(e,r){}inspectedURLChanged(e){document.title=w(C.devtoolsS,{PH1:e.replace(/^https?:\/\//,"")})}copyText(e){null!=e&&navigator.clipboard.writeText(e)}openInNewTab(r){e.ParsedURL.schemeIs(r,"javascript:")||window.open(r,"_blank")}openSearchResultsInNewTab(r){e.Console.Console.instance().error("Search is not enabled in hosted mode. Please inspect using chrome://inspect")}showItemInFolder(r){e.Console.Console.instance().error("Show item in folder is not enabled in hosted mode. Please inspect using chrome://inspect")}save(e,r,t,n){let s=this.#e.get(e);s||(s=[],this.#e.set(e,s)),s.push(r),this.events.dispatchEventToListeners(o.SavedURL,{url:e,fileSystemPath:e})}append(e,r){const t=this.#e.get(e);t&&(t.push(r),this.events.dispatchEventToListeners(o.AppendedToURL,e))}close(e){const r=this.#e.get(e)||[];this.#e.delete(e);let t="";if(e)try{const r=n.StringUtilities.trimURL(e);t=n.StringUtilities.removeURLFragment(r)}catch(r){t=e}const o=document.createElement("a");o.download=t;const s=new Blob([r.join("")],{type:"text/plain"}),i=URL.createObjectURL(s);o.href=i,o.click(),URL.revokeObjectURL(i)}sendMessageToBackend(e){}recordCountHistogram(e,r,t,n,o){this.recordedCountHistograms.length>=100&&this.recordedCountHistograms.shift(),this.recordedCountHistograms.push({histogramName:e,sample:r,min:t,exclusiveMax:n,bucketSize:o})}recordEnumeratedHistogram(e,r,t){this.recordedEnumeratedHistograms.length>=100&&this.recordedEnumeratedHistograms.shift(),this.recordedEnumeratedHistograms.push({actionName:e,actionCode:r})}recordPerformanceHistogram(e,r){this.recordedPerformanceHistograms.length>=100&&this.recordedPerformanceHistograms.shift(),this.recordedPerformanceHistograms.push({histogramName:e,duration:r})}recordUserMetricsAction(e){}connectAutomaticFileSystem(e,r,t,n){queueMicrotask((()=>n({success:!1})))}disconnectAutomaticFileSystem(e){}requestFileSystems(){this.events.dispatchEventToListeners(o.FileSystemsLoaded,[])}addFileSystem(e){window.webkitRequestFileSystem(window.TEMPORARY,1048576,(e=>{this.#r=e;const r={fileSystemName:"sandboxedRequestedFileSystem",fileSystemPath:k,rootURL:"filesystem:devtools://devtools/isolated/",type:"overrides"};this.events.dispatchEventToListeners(o.FileSystemAdded,{fileSystem:r})}))}removeFileSystem(e){const r=e=>{e.forEach((e=>{e.isDirectory?e.removeRecursively((()=>{})):e.isFile&&e.remove((()=>{}))}))};this.#r&&this.#r.root.createReader().readEntries(r),this.#r=null,this.events.dispatchEventToListeners(o.FileSystemRemoved,k)}isolatedFileSystem(e,r){return this.#r}loadNetworkResource(e,r,t,n){fetch(e).then((async e=>{const r=await e.arrayBuffer();let t=r;if(function(e){const r=new Uint8Array(e);return!(!r||r.length<3)&&31===r[0]&&139===r[1]&&8===r[2]}(r)){const e=new DecompressionStream("gzip"),n=e.writable.getWriter();n.write(r),n.close(),t=e.readable}return await new Response(t).text()})).then((function(e){p(t,e),n({statusCode:200,headers:void 0,messageOverride:void 0,netError:void 0,netErrorName:void 0,urlValid:void 0})})).catch((function(){n({statusCode:404,headers:void 0,messageOverride:void 0,netError:void 0,netErrorName:void 0,urlValid:void 0})}))}registerPreference(e,r){}getPreferences(e){const r={};for(const e in window.localStorage)r[e]=window.localStorage[e];e(r)}getPreference(e,r){r(window.localStorage[e])}setPreference(e,r){window.localStorage[e]=r}removePreference(e){delete window.localStorage[e]}clearPreferences(){window.localStorage.clear()}getSyncInformation(e){if("getSyncInformationForTesting"in globalThis)return e(globalThis.getSyncInformationForTesting());e({isSyncActive:!1,arePreferencesSynced:!1})}getHostConfig(e){const r={devToolsVeLogging:{enabled:!0},thirdPartyCookieControls:{thirdPartyCookieMetadataEnabled:!0,thirdPartyCookieHeuristicsEnabled:!0,managedBlockThirdPartyCookies:"Unset"}};if("hostConfigForTesting"in globalThis){const{hostConfigForTesting:e}=globalThis;for(const t of Object.keys(e)){const n=t=>{"object"==typeof r[t]&&"object"==typeof e[t]?r[t]={...r[t],...e[t]}:r[t]=e[t]??r[t]};n(t)}}e(r)}upgradeDraggedFileSystemPermissions(e){}indexPath(e,r,t){}stopIndexing(e){}searchInPath(e,r,t){}zoomFactor(){return 1}zoomIn(){}zoomOut(){}resetZoom(){}setWhitelistedShortcuts(e){}setEyeDropperActive(e){}showCertificateViewer(e){}reattach(e){e()}readyForTest(){}connectionReady(){}setOpenNewWindowForPopups(e){}setDevicesDiscoveryConfig(e){}setDevicesUpdatesEnabled(e){}openRemotePage(e,r){}openNodeFrontend(){}showContextMenuAtPoint(e,r,t,n){throw new Error("Soft context menu should be used")}isHostedMode(){return!0}setAddExtensionCallback(e){}async initialTargetId(){return null}doAidaConversation(e,r,t){t({error:"Not implemented"})}registerAidaClientEvent(e,r){r({error:"Not implemented"})}recordImpression(e){}recordResize(e){}recordClick(e){}recordHover(e){}recordDrag(e){}recordChange(e){}recordKeyDown(e){}recordSettingAccess(e){}}let f=globalThis.InspectorFrontendHost;class y{constructor(){for(const e of s)this[e[1]]=this.dispatch.bind(this,e[0],e[2],e[3])}dispatch(e,r,t,...n){if(r.length<2){try{f.events.dispatchEventToListeners(e,n[0])}catch(e){console.error(e+" "+e.stack)}return}const o={};for(let e=0;e=0&&(o.options??={},o.options.temperature=i),s&&(o.options??={},o.options.model_id=s),o}static async checkAccessPreconditions(){if(!navigator.onLine)return"no-internet";const e=await new Promise((e=>f.getSyncInformation((r=>e(r)))));return e.accountEmail?e.isSyncPaused?"sync-is-paused":"available":"no-account-email"}async*fetch(e,r){if(!f.doAidaConversation)throw new Error("doAidaConversation is not available");const t=(()=>{let{promise:e,resolve:t,reject:n}=Promise.withResolvers();return r?.signal?.addEventListener("abort",(()=>{n(new O)}),{once:!0}),{write:async r=>{t(r),({promise:e,resolve:t,reject:n}=Promise.withResolvers())},close:async()=>{t(null)},read:()=>e,fail:e=>n(e)}})(),n=m(t);let o;f.doAidaConversation(JSON.stringify(e),n,(e=>{403===e.statusCode?t.fail(new Error("Server responded: permission denied")):e.error?t.fail(new Error(`Cannot send request: ${e.error} ${e.detail||""}`)):"net::ERR_TIMED_OUT"===e.netErrorName?t.fail(new Error("doAidaConversation timed out")):200!==e.statusCode?t.fail(new Error(`Request failed: ${JSON.stringify(e)}`)):t.close()}));const s=[];let i=!1;const a=[];let d={rpcGlobalId:0};for(;o=await t.read();){let e,r=!1;if(o.length){o.startsWith(",")&&(o=o.slice(1)),o.startsWith("[")||(o="["+o),o.endsWith("]")||(o+="]");try{e=JSON.parse(o)}catch(e){throw new Error("Cannot parse chunk: "+o,{cause:e})}for(const t of e){if("metadata"in t&&(d=t.metadata,d?.attributionMetadata?.attributionAction===T.BLOCK))throw new N;if("textChunk"in t)i&&(s.push(_),i=!1),s.push(t.textChunk.text),r=!0;else if("codeChunk"in t)i||(s.push(_),i=!0),s.push(t.codeChunk.code),r=!0;else{if(!("functionCallChunk"in t))throw"error"in t?new Error(`Server responded: ${JSON.stringify(t)}`):new Error("Unknown chunk result");a.push({name:t.functionCallChunk.functionCall.name,args:t.functionCallChunk.functionCall.args})}}r&&(yield{explanation:s.join("")+(i?_:""),metadata:d,completed:!1})}}yield{explanation:s.join("")+(i?_:""),metadata:d,functionCalls:a.length?a:void 0,completed:!0}}registerClientEvent(e){const{promise:r,resolve:t}=Promise.withResolvers();return f.registerAidaClientEvent(JSON.stringify({client:M,event_time:(new Date).toISOString(),...e}),t),r}}let D;class H extends e.ObjectWrapper.ObjectWrapper{#t;#n;constructor(){super()}static instance(){return D||(D=new H),D}addEventListener(e,r){const t=!this.hasEventListeners(e),n=super.addEventListener(e,r);return t&&(window.clearTimeout(this.#t),this.pollAidaAvailability()),n}removeEventListener(e,r){super.removeEventListener(e,r),this.hasEventListeners(e)||window.clearTimeout(this.#t)}async pollAidaAvailability(){this.#t=window.setTimeout((()=>this.pollAidaAvailability()),2e3);const e=await L.checkAccessPreconditions();if(e!==this.#n){this.#n=e;const t=await new Promise((e=>f.getHostConfig(e)));Object.assign(r.Runtime.hostConfig,t),this.dispatchEventToListeners("aidaAvailabilityChanged")}}}var U=Object.freeze({__proto__:null,AidaAbortError:O,AidaBlockError:N,AidaClient:L,CLIENT_NAME:M,get CitationSourceType(){return x},get ClientFeature(){return P},get FunctionalityType(){return A},HostConfigTracker:H,get RecitationAction(){return T},get Role(){return b},get UserTier(){return R},convertToUserTierEnum:function(e){if(e)switch(e){case"TESTERS":return R.TESTERS;case"BETA":return R.BETA;case"PUBLIC":return R.PUBLIC}return R.BETA}});let W,B,V,G,j;function q(){return W||(W=f.platform()),W}var X=Object.freeze({__proto__:null,fontFamily:function(){if(j)return j;switch(q()){case"linux":j="Roboto, Ubuntu, Arial, sans-serif";break;case"mac":j="'Lucida Grande', sans-serif";break;case"windows":j="'Segoe UI', Tahoma, sans-serif"}return j},isCustomDevtoolsFrontend:function(){return void 0===G&&(G=window.location.toString().startsWith("devtools://devtools/custom/")),G},isMac:function(){return void 0===B&&(B="mac"===q()),B},isWin:function(){return void 0===V&&(V="windows"===q()),V},platform:q,setPlatformForTests:function(e){W=e,B=void 0,V=void 0}});let z=null;function K(){return null===z&&(z=new $),z}class ${#o="error";#s=new Set;#i=null;#a=null;#d="rn_inspector";#c={};#l=new Map;isEnabled(){return!0===globalThis.enableReactNativePerfMetrics}addEventListener(e){this.#s.add(e);return()=>{this.#s.delete(e)}}removeAllEventListeners(){this.#s.clear()}sendEvent(e){if(!0!==globalThis.enableReactNativePerfMetrics)return;const r=this.#u(e),t=[];for(const e of this.#s)try{e(r)}catch(e){t.push(e)}if(t.length>0){const e=new AggregateError(t);console.error("Error occurred when calling event listeners",e)}}registerPerfMetricsGlobalPostMessageHandler(){!0===globalThis.enableReactNativePerfMetrics&&!0===globalThis.enableReactNativePerfMetricsGlobalPostMessage&&this.addEventListener((e=>{window.postMessage({event:e,tag:"react-native-chrome-devtools-perf-metrics"},window.location.origin)}))}registerGlobalErrorReporting(){window.addEventListener("error",(e=>{const[r,t]=Y(`[RNPerfMetrics] uncaught error: ${e.message}`,e.error);this.sendEvent({eventName:"Browser.Error",params:{type:"error",message:r,error:t}})}),{passive:!0}),window.addEventListener("unhandledrejection",(e=>{const[r,t]=Y("[RNPerfMetrics] unhandled promise rejection",e.reason);this.sendEvent({eventName:"Browser.Error",params:{type:"rejectedPromise",message:r,error:t}})}),{passive:!0});const e=globalThis.console,r=e[this.#o];e[this.#o]=(...t)=>{try{const e=t[0],[r,n]=Y("[RNPerfMetrics] console.error",e);this.sendEvent({eventName:"Browser.Error",params:{message:r,error:n,type:"consoleError"}})}catch(e){const[r,t]=Y("[RNPerfMetrics] Error handling console.error",e);this.sendEvent({eventName:"Browser.Error",params:{message:r,error:t,type:"consoleError"}})}finally{r.apply(e,t)}}}setLaunchId(e){this.#i=e}setAppId(e){this.#a=e}setTelemetryInfo(e){this.#c=e}entryPointLoadingStarted(e){this.#d=e,this.sendEvent({eventName:"Entrypoint.LoadingStarted",entryPoint:e})}entryPointLoadingFinished(e){this.sendEvent({eventName:"Entrypoint.LoadingFinished",entryPoint:e})}browserVisibilityChanged(e){this.sendEvent({eventName:"Browser.VisibilityChange",params:{visibilityState:e}})}remoteDebuggingTerminated(e={}){this.sendEvent({eventName:"Connection.DebuggingTerminated",params:e})}developerResourceLoadingStarted(e,r){const t=Q(e);this.sendEvent({eventName:"DeveloperResource.LoadingStarted",params:{url:t,loadingMethod:r}})}developerResourceLoadingFinished(e,r,t){const n=Q(e);this.sendEvent({eventName:"DeveloperResource.LoadingFinished",params:{url:n,loadingMethod:r,success:t.success,errorMessage:t.errorDescription?.message}})}fuseboxSetClientMetadataStarted(){this.sendEvent({eventName:"FuseboxSetClientMetadataStarted"})}fuseboxSetClientMetadataFinished(e,r){if(e)this.sendEvent({eventName:"FuseboxSetClientMetadataFinished",params:{success:!0}});else{const[e,t]=Y("[RNPerfMetrics] Fusebox setClientMetadata failed",r);this.sendEvent({eventName:"FuseboxSetClientMetadataFinished",params:{success:!1,error:t,errorMessage:e}})}}heapSnapshotStarted(){this.sendEvent({eventName:"MemoryPanelActionStarted",params:{action:"snapshot"}})}heapSnapshotFinished(e){this.sendEvent({eventName:"MemoryPanelActionFinished",params:{action:"snapshot",success:e}})}heapProfilingStarted(){this.sendEvent({eventName:"MemoryPanelActionStarted",params:{action:"profiling"}})}heapProfilingFinished(e){this.sendEvent({eventName:"MemoryPanelActionFinished",params:{action:"profiling",success:e}})}heapSamplingStarted(){this.sendEvent({eventName:"MemoryPanelActionStarted",params:{action:"sampling"}})}heapSamplingFinished(e){this.sendEvent({eventName:"MemoryPanelActionFinished",params:{action:"sampling",success:e}})}stackTraceSymbolicationSucceeded(e){this.sendEvent({eventName:"StackTraceSymbolicationSucceeded",params:{specialHermesFrameTypes:e}})}stackTraceSymbolicationFailed(e,r,t){this.sendEvent({eventName:"StackTraceSymbolicationFailed",params:{stackTrace:e,line:r,reason:t}})}stackTraceFrameUrlResolutionSucceeded(){this.sendEvent({eventName:"StackTraceFrameUrlResolutionSucceeded"})}stackTraceFrameUrlResolutionFailed(e){this.sendEvent({eventName:"StackTraceFrameUrlResolutionFailed",params:{uniqueUrls:e}})}panelShown(e,r){}panelShownInLocation(e,r){this.sendEvent({eventName:"PanelShown",params:{location:r,newPanelName:e}}),this.#l.set(r,e)}#u(e){return{...e,...{timestamp:performance.timeOrigin+performance.now(),launchId:this.#i,appId:this.#a,entryPoint:this.#d,telemetryInfo:this.#c,currentPanels:this.#l}}}}function Q(e){const{url:r}=e;return"http"===e.scheme||"https"===e.scheme?r:`${r.slice(0,100)} …(omitted ${r.length-100} characters)`}function Y(e,r){if(r instanceof Error){return[`${e}: ${r.message}`,r]}const t=`${e}: ${String(r)}`;return[t,new Error(t,{cause:r})]}var J,Z,ee,re,te,ne,oe,se,ie,ae,de,ce,le,ue=Object.freeze({__proto__:null,getInstance:K});class me{#m;#g;#p;constructor(){this.#m=!1,this.#g=!1,this.#p=""}panelShown(e,r){const t=Z[e]||0;f.recordEnumeratedHistogram("DevTools.PanelShown",t,Z.MAX_VALUE),f.recordUserMetricsAction("DevTools_PanelShown_"+e),r||(this.#m=!0),K().panelShown(e,r)}panelShownInLocation(e,r){const t=ee[`${e}-${r}`]||0;f.recordEnumeratedHistogram("DevTools.PanelShownInLocation",t,ee.MAX_VALUE),K().panelShownInLocation(e,r)}settingsPanelShown(e){this.panelShown("settings-"+e)}sourcesPanelFileDebugged(e){const r=e&&te[e]||te.Unknown;f.recordEnumeratedHistogram("DevTools.SourcesPanelFileDebugged",r,te.MAX_VALUE)}sourcesPanelFileOpened(e){const r=e&&te[e]||te.Unknown;f.recordEnumeratedHistogram("DevTools.SourcesPanelFileOpened",r,te.MAX_VALUE)}networkPanelResponsePreviewOpened(e){const r=e&&te[e]||te.Unknown;f.recordEnumeratedHistogram("DevTools.NetworkPanelResponsePreviewOpened",r,te.MAX_VALUE)}actionTaken(e){f.recordEnumeratedHistogram("DevTools.ActionTaken",e,J.MAX_VALUE)}panelLoaded(e,r){this.#g||e!==this.#p||(this.#g=!0,requestAnimationFrame((()=>{window.setTimeout((()=>{performance.mark(r),this.#m||f.recordPerformanceHistogram(r,performance.now())}),0)})))}setLaunchPanel(e){this.#p=e}performanceTraceLoad(e){f.recordPerformanceHistogram("DevTools.TraceLoad",e.duration)}keybindSetSettingChanged(e){const r=ne[e]||0;f.recordEnumeratedHistogram("DevTools.KeybindSetSettingChanged",r,ne.MAX_VALUE)}keyboardShortcutFired(e){const r=oe[e]||oe.OtherShortcut;f.recordEnumeratedHistogram("DevTools.KeyboardShortcutFired",r,oe.MAX_VALUE)}issuesPanelOpenedFrom(e){f.recordEnumeratedHistogram("DevTools.IssuesPanelOpenedFrom",e,6)}issuesPanelIssueExpanded(e){if(void 0===e)return;const r=ie[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.IssuesPanelIssueExpanded",r,ie.MAX_VALUE)}issuesPanelResourceOpened(e,r){const t=ae[e+r];void 0!==t&&f.recordEnumeratedHistogram("DevTools.IssuesPanelResourceOpened",t,ae.MAX_VALUE)}issueCreated(e){const r=de[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.IssueCreated",r,de.MAX_VALUE)}experimentEnabledAtLaunch(e){const r=se[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.ExperimentEnabledAtLaunch",r,se.MAX_VALUE)}navigationSettingAtFirstTimelineLoad(e){f.recordEnumeratedHistogram("DevTools.TimelineNavigationSettingState",e,4)}experimentDisabledAtLaunch(e){const r=se[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.ExperimentDisabledAtLaunch",r,se.MAX_VALUE)}experimentChanged(e,r){const t=se[e];if(void 0===t)return;const n=r?"DevTools.ExperimentEnabled":"DevTools.ExperimentDisabled";f.recordEnumeratedHistogram(n,t,se.MAX_VALUE)}developerResourceLoaded(e){e>=8||f.recordEnumeratedHistogram("DevTools.DeveloperResourceLoaded",e,8)}developerResourceScheme(e){e>=9||f.recordEnumeratedHistogram("DevTools.DeveloperResourceScheme",e,9)}language(e){const r=ce[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.Language",r,ce.MAX_VALUE)}syncSetting(e){f.getSyncInformation((r=>{let t=1;r.isSyncActive&&!r.arePreferencesSynced?t=2:r.isSyncActive&&r.arePreferencesSynced&&(t=e?4:3),f.recordEnumeratedHistogram("DevTools.SyncSetting",t,5)}))}recordingAssertion(e){f.recordEnumeratedHistogram("DevTools.RecordingAssertion",e,4)}recordingToggled(e){f.recordEnumeratedHistogram("DevTools.RecordingToggled",e,3)}recordingReplayFinished(e){f.recordEnumeratedHistogram("DevTools.RecordingReplayFinished",e,5)}recordingReplaySpeed(e){f.recordEnumeratedHistogram("DevTools.RecordingReplaySpeed",e,5)}recordingReplayStarted(e){f.recordEnumeratedHistogram("DevTools.RecordingReplayStarted",e,4)}recordingEdited(e){f.recordEnumeratedHistogram("DevTools.RecordingEdited",e,11)}recordingExported(e){f.recordEnumeratedHistogram("DevTools.RecordingExported",e,6)}recordingCodeToggled(e){f.recordEnumeratedHistogram("DevTools.RecordingCodeToggled",e,3)}recordingCopiedToClipboard(e){f.recordEnumeratedHistogram("DevTools.RecordingCopiedToClipboard",e,9)}cssHintShown(e){f.recordEnumeratedHistogram("DevTools.CSSHintShown",e,14)}lighthouseModeRun(e){f.recordEnumeratedHistogram("DevTools.LighthouseModeRun",e,4)}lighthouseCategoryUsed(e){f.recordEnumeratedHistogram("DevTools.LighthouseCategoryUsed",e,6)}swatchActivated(e){f.recordEnumeratedHistogram("DevTools.SwatchActivated",e,11)}animationPlaybackRateChanged(e){f.recordEnumeratedHistogram("DevTools.AnimationPlaybackRateChanged",e,4)}animationPointDragged(e){f.recordEnumeratedHistogram("DevTools.AnimationPointDragged",e,5)}workspacesPopulated(e){f.recordPerformanceHistogram("DevTools.Workspaces.PopulateWallClocktime",e)}visualLoggingProcessingDone(e){f.recordPerformanceHistogram("DevTools.VisualLogging.ProcessingTime",e)}freestylerQueryLength(e){f.recordCountHistogram("DevTools.Freestyler.QueryLength",e,0,1e5,100)}freestylerEvalResponseSize(e){f.recordCountHistogram("DevTools.Freestyler.EvalResponseSize",e,0,1e5,100)}}!function(e){e[e.WindowDocked=1]="WindowDocked",e[e.WindowUndocked=2]="WindowUndocked",e[e.ScriptsBreakpointSet=3]="ScriptsBreakpointSet",e[e.TimelineStarted=4]="TimelineStarted",e[e.ProfilesCPUProfileTaken=5]="ProfilesCPUProfileTaken",e[e.ProfilesHeapProfileTaken=6]="ProfilesHeapProfileTaken",e[e.ConsoleEvaluated=8]="ConsoleEvaluated",e[e.FileSavedInWorkspace=9]="FileSavedInWorkspace",e[e.DeviceModeEnabled=10]="DeviceModeEnabled",e[e.AnimationsPlaybackRateChanged=11]="AnimationsPlaybackRateChanged",e[e.RevisionApplied=12]="RevisionApplied",e[e.FileSystemDirectoryContentReceived=13]="FileSystemDirectoryContentReceived",e[e.StyleRuleEdited=14]="StyleRuleEdited",e[e.CommandEvaluatedInConsolePanel=15]="CommandEvaluatedInConsolePanel",e[e.DOMPropertiesExpanded=16]="DOMPropertiesExpanded",e[e.ResizedViewInResponsiveMode=17]="ResizedViewInResponsiveMode",e[e.TimelinePageReloadStarted=18]="TimelinePageReloadStarted",e[e.ConnectToNodeJSFromFrontend=19]="ConnectToNodeJSFromFrontend",e[e.ConnectToNodeJSDirectly=20]="ConnectToNodeJSDirectly",e[e.CpuThrottlingEnabled=21]="CpuThrottlingEnabled",e[e.CpuProfileNodeFocused=22]="CpuProfileNodeFocused",e[e.CpuProfileNodeExcluded=23]="CpuProfileNodeExcluded",e[e.SelectFileFromFilePicker=24]="SelectFileFromFilePicker",e[e.SelectCommandFromCommandMenu=25]="SelectCommandFromCommandMenu",e[e.ChangeInspectedNodeInElementsPanel=26]="ChangeInspectedNodeInElementsPanel",e[e.StyleRuleCopied=27]="StyleRuleCopied",e[e.CoverageStarted=28]="CoverageStarted",e[e.LighthouseStarted=29]="LighthouseStarted",e[e.LighthouseFinished=30]="LighthouseFinished",e[e.ShowedThirdPartyBadges=31]="ShowedThirdPartyBadges",e[e.LighthouseViewTrace=32]="LighthouseViewTrace",e[e.FilmStripStartedRecording=33]="FilmStripStartedRecording",e[e.CoverageReportFiltered=34]="CoverageReportFiltered",e[e.CoverageStartedPerBlock=35]="CoverageStartedPerBlock",e[e["SettingsOpenedFromGear-deprecated"]=36]="SettingsOpenedFromGear-deprecated",e[e["SettingsOpenedFromMenu-deprecated"]=37]="SettingsOpenedFromMenu-deprecated",e[e["SettingsOpenedFromCommandMenu-deprecated"]=38]="SettingsOpenedFromCommandMenu-deprecated",e[e.TabMovedToDrawer=39]="TabMovedToDrawer",e[e.TabMovedToMainPanel=40]="TabMovedToMainPanel",e[e.CaptureCssOverviewClicked=41]="CaptureCssOverviewClicked",e[e.VirtualAuthenticatorEnvironmentEnabled=42]="VirtualAuthenticatorEnvironmentEnabled",e[e.SourceOrderViewActivated=43]="SourceOrderViewActivated",e[e.UserShortcutAdded=44]="UserShortcutAdded",e[e.ShortcutRemoved=45]="ShortcutRemoved",e[e.ShortcutModified=46]="ShortcutModified",e[e.CustomPropertyLinkClicked=47]="CustomPropertyLinkClicked",e[e.CustomPropertyEdited=48]="CustomPropertyEdited",e[e.ServiceWorkerNetworkRequestClicked=49]="ServiceWorkerNetworkRequestClicked",e[e.ServiceWorkerNetworkRequestClosedQuickly=50]="ServiceWorkerNetworkRequestClosedQuickly",e[e.NetworkPanelServiceWorkerRespondWith=51]="NetworkPanelServiceWorkerRespondWith",e[e.NetworkPanelCopyValue=52]="NetworkPanelCopyValue",e[e.ConsoleSidebarOpened=53]="ConsoleSidebarOpened",e[e.PerfPanelTraceImported=54]="PerfPanelTraceImported",e[e.PerfPanelTraceExported=55]="PerfPanelTraceExported",e[e.StackFrameRestarted=56]="StackFrameRestarted",e[e.CaptureTestProtocolClicked=57]="CaptureTestProtocolClicked",e[e.BreakpointRemovedFromRemoveButton=58]="BreakpointRemovedFromRemoveButton",e[e.BreakpointGroupExpandedStateChanged=59]="BreakpointGroupExpandedStateChanged",e[e.HeaderOverrideFileCreated=60]="HeaderOverrideFileCreated",e[e.HeaderOverrideEnableEditingClicked=61]="HeaderOverrideEnableEditingClicked",e[e.HeaderOverrideHeaderAdded=62]="HeaderOverrideHeaderAdded",e[e.HeaderOverrideHeaderEdited=63]="HeaderOverrideHeaderEdited",e[e.HeaderOverrideHeaderRemoved=64]="HeaderOverrideHeaderRemoved",e[e.HeaderOverrideHeadersFileEdited=65]="HeaderOverrideHeadersFileEdited",e[e.PersistenceNetworkOverridesEnabled=66]="PersistenceNetworkOverridesEnabled",e[e.PersistenceNetworkOverridesDisabled=67]="PersistenceNetworkOverridesDisabled",e[e.BreakpointRemovedFromContextMenu=68]="BreakpointRemovedFromContextMenu",e[e.BreakpointsInFileRemovedFromRemoveButton=69]="BreakpointsInFileRemovedFromRemoveButton",e[e.BreakpointsInFileRemovedFromContextMenu=70]="BreakpointsInFileRemovedFromContextMenu",e[e.BreakpointsInFileCheckboxToggled=71]="BreakpointsInFileCheckboxToggled",e[e.BreakpointsInFileEnabledDisabledFromContextMenu=72]="BreakpointsInFileEnabledDisabledFromContextMenu",e[e.BreakpointConditionEditedFromSidebar=73]="BreakpointConditionEditedFromSidebar",e[e.WorkspaceTabAddFolder=74]="WorkspaceTabAddFolder",e[e.WorkspaceTabRemoveFolder=75]="WorkspaceTabRemoveFolder",e[e.OverrideTabAddFolder=76]="OverrideTabAddFolder",e[e.OverrideTabRemoveFolder=77]="OverrideTabRemoveFolder",e[e.WorkspaceSourceSelected=78]="WorkspaceSourceSelected",e[e.OverridesSourceSelected=79]="OverridesSourceSelected",e[e.StyleSheetInitiatorLinkClicked=80]="StyleSheetInitiatorLinkClicked",e[e.BreakpointRemovedFromGutterContextMenu=81]="BreakpointRemovedFromGutterContextMenu",e[e.BreakpointRemovedFromGutterToggle=82]="BreakpointRemovedFromGutterToggle",e[e.StylePropertyInsideKeyframeEdited=83]="StylePropertyInsideKeyframeEdited",e[e.OverrideContentFromSourcesContextMenu=84]="OverrideContentFromSourcesContextMenu",e[e.OverrideContentFromNetworkContextMenu=85]="OverrideContentFromNetworkContextMenu",e[e.OverrideScript=86]="OverrideScript",e[e.OverrideStyleSheet=87]="OverrideStyleSheet",e[e.OverrideDocument=88]="OverrideDocument",e[e.OverrideFetchXHR=89]="OverrideFetchXHR",e[e.OverrideImage=90]="OverrideImage",e[e.OverrideFont=91]="OverrideFont",e[e.OverrideContentContextMenuSetup=92]="OverrideContentContextMenuSetup",e[e.OverrideContentContextMenuAbandonSetup=93]="OverrideContentContextMenuAbandonSetup",e[e.OverrideContentContextMenuActivateDisabled=94]="OverrideContentContextMenuActivateDisabled",e[e.OverrideContentContextMenuOpenExistingFile=95]="OverrideContentContextMenuOpenExistingFile",e[e.OverrideContentContextMenuSaveNewFile=96]="OverrideContentContextMenuSaveNewFile",e[e.ShowAllOverridesFromSourcesContextMenu=97]="ShowAllOverridesFromSourcesContextMenu",e[e.ShowAllOverridesFromNetworkContextMenu=98]="ShowAllOverridesFromNetworkContextMenu",e[e.AnimationGroupsCleared=99]="AnimationGroupsCleared",e[e.AnimationsPaused=100]="AnimationsPaused",e[e.AnimationsResumed=101]="AnimationsResumed",e[e.AnimatedNodeDescriptionClicked=102]="AnimatedNodeDescriptionClicked",e[e.AnimationGroupScrubbed=103]="AnimationGroupScrubbed",e[e.AnimationGroupReplayed=104]="AnimationGroupReplayed",e[e.OverrideTabDeleteFolderContextMenu=105]="OverrideTabDeleteFolderContextMenu",e[e.WorkspaceDropFolder=107]="WorkspaceDropFolder",e[e.WorkspaceSelectFolder=108]="WorkspaceSelectFolder",e[e.OverrideContentContextMenuSourceMappedWarning=109]="OverrideContentContextMenuSourceMappedWarning",e[e.OverrideContentContextMenuRedirectToDeployed=110]="OverrideContentContextMenuRedirectToDeployed",e[e.NewStyleRuleAdded=111]="NewStyleRuleAdded",e[e.TraceExpanded=112]="TraceExpanded",e[e.InsightConsoleMessageShown=113]="InsightConsoleMessageShown",e[e.InsightRequestedViaContextMenu=114]="InsightRequestedViaContextMenu",e[e.InsightRequestedViaHoverButton=115]="InsightRequestedViaHoverButton",e[e.InsightRatedPositive=117]="InsightRatedPositive",e[e.InsightRatedNegative=118]="InsightRatedNegative",e[e.InsightClosed=119]="InsightClosed",e[e.InsightErrored=120]="InsightErrored",e[e.InsightHoverButtonShown=121]="InsightHoverButtonShown",e[e.SelfXssWarningConsoleMessageShown=122]="SelfXssWarningConsoleMessageShown",e[e.SelfXssWarningDialogShown=123]="SelfXssWarningDialogShown",e[e.SelfXssAllowPastingInConsole=124]="SelfXssAllowPastingInConsole",e[e.SelfXssAllowPastingInDialog=125]="SelfXssAllowPastingInDialog",e[e.ToggleEmulateFocusedPageFromStylesPaneOn=126]="ToggleEmulateFocusedPageFromStylesPaneOn",e[e.ToggleEmulateFocusedPageFromStylesPaneOff=127]="ToggleEmulateFocusedPageFromStylesPaneOff",e[e.ToggleEmulateFocusedPageFromRenderingTab=128]="ToggleEmulateFocusedPageFromRenderingTab",e[e.ToggleEmulateFocusedPageFromCommandMenu=129]="ToggleEmulateFocusedPageFromCommandMenu",e[e.InsightGenerated=130]="InsightGenerated",e[e.InsightErroredApi=131]="InsightErroredApi",e[e.InsightErroredMarkdown=132]="InsightErroredMarkdown",e[e.ToggleShowWebVitals=133]="ToggleShowWebVitals",e[e.InsightErroredPermissionDenied=134]="InsightErroredPermissionDenied",e[e.InsightErroredCannotSend=135]="InsightErroredCannotSend",e[e.InsightErroredRequestFailed=136]="InsightErroredRequestFailed",e[e.InsightErroredCannotParseChunk=137]="InsightErroredCannotParseChunk",e[e.InsightErroredUnknownChunk=138]="InsightErroredUnknownChunk",e[e.InsightErroredOther=139]="InsightErroredOther",e[e.AutofillReceived=140]="AutofillReceived",e[e.AutofillReceivedAndTabAutoOpened=141]="AutofillReceivedAndTabAutoOpened",e[e.AnimationGroupSelected=142]="AnimationGroupSelected",e[e.ScrollDrivenAnimationGroupSelected=143]="ScrollDrivenAnimationGroupSelected",e[e.ScrollDrivenAnimationGroupScrubbed=144]="ScrollDrivenAnimationGroupScrubbed",e[e.AiAssistanceOpenedFromElementsPanel=145]="AiAssistanceOpenedFromElementsPanel",e[e.AiAssistanceOpenedFromStylesTab=146]="AiAssistanceOpenedFromStylesTab",e[e.ConsoleFilterByContext=147]="ConsoleFilterByContext",e[e.ConsoleFilterBySource=148]="ConsoleFilterBySource",e[e.ConsoleFilterByUrl=149]="ConsoleFilterByUrl",e[e.InsightConsentReminderShown=150]="InsightConsentReminderShown",e[e.InsightConsentReminderCanceled=151]="InsightConsentReminderCanceled",e[e.InsightConsentReminderConfirmed=152]="InsightConsentReminderConfirmed",e[e.InsightsOnboardingShown=153]="InsightsOnboardingShown",e[e.InsightsOnboardingCanceledOnPage1=154]="InsightsOnboardingCanceledOnPage1",e[e.InsightsOnboardingCanceledOnPage2=155]="InsightsOnboardingCanceledOnPage2",e[e.InsightsOnboardingConfirmed=156]="InsightsOnboardingConfirmed",e[e.InsightsOnboardingNextPage=157]="InsightsOnboardingNextPage",e[e.InsightsOnboardingPrevPage=158]="InsightsOnboardingPrevPage",e[e.InsightsOnboardingFeatureDisabled=159]="InsightsOnboardingFeatureDisabled",e[e.InsightsOptInTeaserShown=160]="InsightsOptInTeaserShown",e[e.InsightsOptInTeaserSettingsLinkClicked=161]="InsightsOptInTeaserSettingsLinkClicked",e[e.InsightsOptInTeaserConfirmedInSettings=162]="InsightsOptInTeaserConfirmedInSettings",e[e.InsightsReminderTeaserShown=163]="InsightsReminderTeaserShown",e[e.InsightsReminderTeaserConfirmed=164]="InsightsReminderTeaserConfirmed",e[e.InsightsReminderTeaserCanceled=165]="InsightsReminderTeaserCanceled",e[e.InsightsReminderTeaserSettingsLinkClicked=166]="InsightsReminderTeaserSettingsLinkClicked",e[e.InsightsReminderTeaserAbortedInSettings=167]="InsightsReminderTeaserAbortedInSettings",e[e.GeneratingInsightWithoutDisclaimer=168]="GeneratingInsightWithoutDisclaimer",e[e.AiAssistanceOpenedFromElementsPanelFloatingButton=169]="AiAssistanceOpenedFromElementsPanelFloatingButton",e[e.AiAssistanceOpenedFromNetworkPanel=170]="AiAssistanceOpenedFromNetworkPanel",e[e.AiAssistanceOpenedFromSourcesPanel=171]="AiAssistanceOpenedFromSourcesPanel",e[e.AiAssistanceOpenedFromSourcesPanelFloatingButton=172]="AiAssistanceOpenedFromSourcesPanelFloatingButton",e[e.AiAssistanceOpenedFromPerformancePanel=173]="AiAssistanceOpenedFromPerformancePanel",e[e.AiAssistanceOpenedFromNetworkPanelFloatingButton=174]="AiAssistanceOpenedFromNetworkPanelFloatingButton",e[e.AiAssistancePanelOpened=175]="AiAssistancePanelOpened",e[e.AiAssistanceQuerySubmitted=176]="AiAssistanceQuerySubmitted",e[e.AiAssistanceAnswerReceived=177]="AiAssistanceAnswerReceived",e[e.AiAssistanceDynamicSuggestionClicked=178]="AiAssistanceDynamicSuggestionClicked",e[e.AiAssistanceSideEffectConfirmed=179]="AiAssistanceSideEffectConfirmed",e[e.AiAssistanceSideEffectRejected=180]="AiAssistanceSideEffectRejected",e[e.AiAssistanceError=181]="AiAssistanceError",e[e.AiAssistanceOpenedFromPerformanceInsight=182]="AiAssistanceOpenedFromPerformanceInsight",e[e.MAX_VALUE=183]="MAX_VALUE"}(J||(J={})),function(e){e[e.elements=1]="elements",e[e.resources=2]="resources",e[e.network=3]="network",e[e.sources=4]="sources",e[e.timeline=5]="timeline",e[e["heap-profiler"]=6]="heap-profiler",e[e.console=8]="console",e[e.layers=9]="layers",e[e["console-view"]=10]="console-view",e[e.animations=11]="animations",e[e["network.config"]=12]="network.config",e[e.rendering=13]="rendering",e[e.sensors=14]="sensors",e[e["sources.search"]=15]="sources.search",e[e.security=16]="security",e[e["js-profiler"]=17]="js-profiler",e[e.lighthouse=18]="lighthouse",e[e.coverage=19]="coverage",e[e["protocol-monitor"]=20]="protocol-monitor",e[e["remote-devices"]=21]="remote-devices",e[e["web-audio"]=22]="web-audio",e[e["changes.changes"]=23]="changes.changes",e[e["performance.monitor"]=24]="performance.monitor",e[e["release-note"]=25]="release-note",e[e["live-heap-profile"]=26]="live-heap-profile",e[e["sources.quick"]=27]="sources.quick",e[e["network.blocked-urls"]=28]="network.blocked-urls",e[e["settings-preferences"]=29]="settings-preferences",e[e["settings-workspace"]=30]="settings-workspace",e[e["settings-experiments"]=31]="settings-experiments",e[e["settings-blackbox"]=32]="settings-blackbox",e[e["settings-devices"]=33]="settings-devices",e[e["settings-throttling-conditions"]=34]="settings-throttling-conditions",e[e["settings-emulation-locations"]=35]="settings-emulation-locations",e[e["settings-shortcuts"]=36]="settings-shortcuts",e[e["issues-pane"]=37]="issues-pane",e[e["settings-keybinds"]=38]="settings-keybinds",e[e.cssoverview=39]="cssoverview",e[e["chrome-recorder"]=40]="chrome-recorder",e[e["trust-tokens"]=41]="trust-tokens",e[e["reporting-api"]=42]="reporting-api",e[e["interest-groups"]=43]="interest-groups",e[e["back-forward-cache"]=44]="back-forward-cache",e[e["service-worker-cache"]=45]="service-worker-cache",e[e["background-service-background-fetch"]=46]="background-service-background-fetch",e[e["background-service-background-sync"]=47]="background-service-background-sync",e[e["background-service-push-messaging"]=48]="background-service-push-messaging",e[e["background-service-notifications"]=49]="background-service-notifications",e[e["background-service-payment-handler"]=50]="background-service-payment-handler",e[e["background-service-periodic-background-sync"]=51]="background-service-periodic-background-sync",e[e["service-workers"]=52]="service-workers",e[e["app-manifest"]=53]="app-manifest",e[e.storage=54]="storage",e[e.cookies=55]="cookies",e[e["frame-details"]=56]="frame-details",e[e["frame-resource"]=57]="frame-resource",e[e["frame-window"]=58]="frame-window",e[e["frame-worker"]=59]="frame-worker",e[e["dom-storage"]=60]="dom-storage",e[e["indexed-db"]=61]="indexed-db",e[e["web-sql"]=62]="web-sql",e[e["performance-insights"]=63]="performance-insights",e[e.preloading=64]="preloading",e[e["bounce-tracking-mitigations"]=65]="bounce-tracking-mitigations",e[e["developer-resources"]=66]="developer-resources",e[e["autofill-view"]=67]="autofill-view",e[e.MAX_VALUE=68]="MAX_VALUE"}(Z||(Z={})),function(e){e[e["elements-main"]=1]="elements-main",e[e["elements-drawer"]=2]="elements-drawer",e[e["resources-main"]=3]="resources-main",e[e["resources-drawer"]=4]="resources-drawer",e[e["network-main"]=5]="network-main",e[e["network-drawer"]=6]="network-drawer",e[e["sources-main"]=7]="sources-main",e[e["sources-drawer"]=8]="sources-drawer",e[e["timeline-main"]=9]="timeline-main",e[e["timeline-drawer"]=10]="timeline-drawer",e[e["heap_profiler-main"]=11]="heap_profiler-main",e[e["heap_profiler-drawer"]=12]="heap_profiler-drawer",e[e["console-main"]=13]="console-main",e[e["console-drawer"]=14]="console-drawer",e[e["layers-main"]=15]="layers-main",e[e["layers-drawer"]=16]="layers-drawer",e[e["console-view-main"]=17]="console-view-main",e[e["console-view-drawer"]=18]="console-view-drawer",e[e["animations-main"]=19]="animations-main",e[e["animations-drawer"]=20]="animations-drawer",e[e["network.config-main"]=21]="network.config-main",e[e["network.config-drawer"]=22]="network.config-drawer",e[e["rendering-main"]=23]="rendering-main",e[e["rendering-drawer"]=24]="rendering-drawer",e[e["sensors-main"]=25]="sensors-main",e[e["sensors-drawer"]=26]="sensors-drawer",e[e["sources.search-main"]=27]="sources.search-main",e[e["sources.search-drawer"]=28]="sources.search-drawer",e[e["security-main"]=29]="security-main",e[e["security-drawer"]=30]="security-drawer",e[e["lighthouse-main"]=33]="lighthouse-main",e[e["lighthouse-drawer"]=34]="lighthouse-drawer",e[e["coverage-main"]=35]="coverage-main",e[e["coverage-drawer"]=36]="coverage-drawer",e[e["protocol-monitor-main"]=37]="protocol-monitor-main",e[e["protocol-monitor-drawer"]=38]="protocol-monitor-drawer",e[e["remote-devices-main"]=39]="remote-devices-main",e[e["remote-devices-drawer"]=40]="remote-devices-drawer",e[e["web-audio-main"]=41]="web-audio-main",e[e["web-audio-drawer"]=42]="web-audio-drawer",e[e["changes.changes-main"]=43]="changes.changes-main",e[e["changes.changes-drawer"]=44]="changes.changes-drawer",e[e["performance.monitor-main"]=45]="performance.monitor-main",e[e["performance.monitor-drawer"]=46]="performance.monitor-drawer",e[e["release-note-main"]=47]="release-note-main",e[e["release-note-drawer"]=48]="release-note-drawer",e[e["live_heap_profile-main"]=49]="live_heap_profile-main",e[e["live_heap_profile-drawer"]=50]="live_heap_profile-drawer",e[e["sources.quick-main"]=51]="sources.quick-main",e[e["sources.quick-drawer"]=52]="sources.quick-drawer",e[e["network.blocked-urls-main"]=53]="network.blocked-urls-main",e[e["network.blocked-urls-drawer"]=54]="network.blocked-urls-drawer",e[e["settings-preferences-main"]=55]="settings-preferences-main",e[e["settings-preferences-drawer"]=56]="settings-preferences-drawer",e[e["settings-workspace-main"]=57]="settings-workspace-main",e[e["settings-workspace-drawer"]=58]="settings-workspace-drawer",e[e["settings-experiments-main"]=59]="settings-experiments-main",e[e["settings-experiments-drawer"]=60]="settings-experiments-drawer",e[e["settings-blackbox-main"]=61]="settings-blackbox-main",e[e["settings-blackbox-drawer"]=62]="settings-blackbox-drawer",e[e["settings-devices-main"]=63]="settings-devices-main",e[e["settings-devices-drawer"]=64]="settings-devices-drawer",e[e["settings-throttling-conditions-main"]=65]="settings-throttling-conditions-main",e[e["settings-throttling-conditions-drawer"]=66]="settings-throttling-conditions-drawer",e[e["settings-emulation-locations-main"]=67]="settings-emulation-locations-main",e[e["settings-emulation-locations-drawer"]=68]="settings-emulation-locations-drawer",e[e["settings-shortcuts-main"]=69]="settings-shortcuts-main",e[e["settings-shortcuts-drawer"]=70]="settings-shortcuts-drawer",e[e["issues-pane-main"]=71]="issues-pane-main",e[e["issues-pane-drawer"]=72]="issues-pane-drawer",e[e["settings-keybinds-main"]=73]="settings-keybinds-main",e[e["settings-keybinds-drawer"]=74]="settings-keybinds-drawer",e[e["cssoverview-main"]=75]="cssoverview-main",e[e["cssoverview-drawer"]=76]="cssoverview-drawer",e[e["chrome_recorder-main"]=77]="chrome_recorder-main",e[e["chrome_recorder-drawer"]=78]="chrome_recorder-drawer",e[e["trust_tokens-main"]=79]="trust_tokens-main",e[e["trust_tokens-drawer"]=80]="trust_tokens-drawer",e[e["reporting_api-main"]=81]="reporting_api-main",e[e["reporting_api-drawer"]=82]="reporting_api-drawer",e[e["interest_groups-main"]=83]="interest_groups-main",e[e["interest_groups-drawer"]=84]="interest_groups-drawer",e[e["back_forward_cache-main"]=85]="back_forward_cache-main",e[e["back_forward_cache-drawer"]=86]="back_forward_cache-drawer",e[e["service_worker_cache-main"]=87]="service_worker_cache-main",e[e["service_worker_cache-drawer"]=88]="service_worker_cache-drawer",e[e["background_service_backgroundFetch-main"]=89]="background_service_backgroundFetch-main",e[e["background_service_backgroundFetch-drawer"]=90]="background_service_backgroundFetch-drawer",e[e["background_service_backgroundSync-main"]=91]="background_service_backgroundSync-main",e[e["background_service_backgroundSync-drawer"]=92]="background_service_backgroundSync-drawer",e[e["background_service_pushMessaging-main"]=93]="background_service_pushMessaging-main",e[e["background_service_pushMessaging-drawer"]=94]="background_service_pushMessaging-drawer",e[e["background_service_notifications-main"]=95]="background_service_notifications-main",e[e["background_service_notifications-drawer"]=96]="background_service_notifications-drawer",e[e["background_service_paymentHandler-main"]=97]="background_service_paymentHandler-main",e[e["background_service_paymentHandler-drawer"]=98]="background_service_paymentHandler-drawer",e[e["background_service_periodicBackgroundSync-main"]=99]="background_service_periodicBackgroundSync-main",e[e["background_service_periodicBackgroundSync-drawer"]=100]="background_service_periodicBackgroundSync-drawer",e[e["service_workers-main"]=101]="service_workers-main",e[e["service_workers-drawer"]=102]="service_workers-drawer",e[e["app_manifest-main"]=103]="app_manifest-main",e[e["app_manifest-drawer"]=104]="app_manifest-drawer",e[e["storage-main"]=105]="storage-main",e[e["storage-drawer"]=106]="storage-drawer",e[e["cookies-main"]=107]="cookies-main",e[e["cookies-drawer"]=108]="cookies-drawer",e[e["frame_details-main"]=109]="frame_details-main",e[e["frame_details-drawer"]=110]="frame_details-drawer",e[e["frame_resource-main"]=111]="frame_resource-main",e[e["frame_resource-drawer"]=112]="frame_resource-drawer",e[e["frame_window-main"]=113]="frame_window-main",e[e["frame_window-drawer"]=114]="frame_window-drawer",e[e["frame_worker-main"]=115]="frame_worker-main",e[e["frame_worker-drawer"]=116]="frame_worker-drawer",e[e["dom_storage-main"]=117]="dom_storage-main",e[e["dom_storage-drawer"]=118]="dom_storage-drawer",e[e["indexed_db-main"]=119]="indexed_db-main",e[e["indexed_db-drawer"]=120]="indexed_db-drawer",e[e["web_sql-main"]=121]="web_sql-main",e[e["web_sql-drawer"]=122]="web_sql-drawer",e[e["performance_insights-main"]=123]="performance_insights-main",e[e["performance_insights-drawer"]=124]="performance_insights-drawer",e[e["preloading-main"]=125]="preloading-main",e[e["preloading-drawer"]=126]="preloading-drawer",e[e["bounce_tracking_mitigations-main"]=127]="bounce_tracking_mitigations-main",e[e["bounce_tracking_mitigations-drawer"]=128]="bounce_tracking_mitigations-drawer",e[e["developer-resources-main"]=129]="developer-resources-main",e[e["developer-resources-drawer"]=130]="developer-resources-drawer",e[e["autofill-view-main"]=131]="autofill-view-main",e[e["autofill-view-drawer"]=132]="autofill-view-drawer",e[e.MAX_VALUE=133]="MAX_VALUE"}(ee||(ee={})),function(e){e[e.OtherSidebarPane=0]="OtherSidebarPane",e[e.styles=1]="styles",e[e.computed=2]="computed",e[e["elements.layout"]=3]="elements.layout",e[e["elements.event-listeners"]=4]="elements.event-listeners",e[e["elements.dom-breakpoints"]=5]="elements.dom-breakpoints",e[e["elements.dom-properties"]=6]="elements.dom-properties",e[e["accessibility.view"]=7]="accessibility.view",e[e.MAX_VALUE=8]="MAX_VALUE"}(re||(re={})),function(e){e[e.Unknown=0]="Unknown",e[e["text/css"]=2]="text/css",e[e["text/html"]=3]="text/html",e[e["application/xml"]=4]="application/xml",e[e["application/wasm"]=5]="application/wasm",e[e["application/manifest+json"]=6]="application/manifest+json",e[e["application/x-aspx"]=7]="application/x-aspx",e[e["application/jsp"]=8]="application/jsp",e[e["text/x-c++src"]=9]="text/x-c++src",e[e["text/x-coffeescript"]=10]="text/x-coffeescript",e[e["application/vnd.dart"]=11]="application/vnd.dart",e[e["text/typescript"]=12]="text/typescript",e[e["text/typescript-jsx"]=13]="text/typescript-jsx",e[e["application/json"]=14]="application/json",e[e["text/x-csharp"]=15]="text/x-csharp",e[e["text/x-java"]=16]="text/x-java",e[e["text/x-less"]=17]="text/x-less",e[e["application/x-httpd-php"]=18]="application/x-httpd-php",e[e["text/x-python"]=19]="text/x-python",e[e["text/x-sh"]=20]="text/x-sh",e[e["text/x-gss"]=21]="text/x-gss",e[e["text/x-sass"]=22]="text/x-sass",e[e["text/x-scss"]=23]="text/x-scss",e[e["text/markdown"]=24]="text/markdown",e[e["text/x-clojure"]=25]="text/x-clojure",e[e["text/jsx"]=26]="text/jsx",e[e["text/x-go"]=27]="text/x-go",e[e["text/x-kotlin"]=28]="text/x-kotlin",e[e["text/x-scala"]=29]="text/x-scala",e[e["text/x.svelte"]=30]="text/x.svelte",e[e["text/javascript+plain"]=31]="text/javascript+plain",e[e["text/javascript+minified"]=32]="text/javascript+minified",e[e["text/javascript+sourcemapped"]=33]="text/javascript+sourcemapped",e[e["text/x.angular"]=34]="text/x.angular",e[e["text/x.vue"]=35]="text/x.vue",e[e["text/javascript+snippet"]=36]="text/javascript+snippet",e[e["text/javascript+eval"]=37]="text/javascript+eval",e[e.MAX_VALUE=38]="MAX_VALUE"}(te||(te={})),function(e){e[e.devToolsDefault=0]="devToolsDefault",e[e.vsCode=1]="vsCode",e[e.MAX_VALUE=2]="MAX_VALUE"}(ne||(ne={})),function(e){e[e.OtherShortcut=0]="OtherShortcut",e[e["quick-open.show-command-menu"]=1]="quick-open.show-command-menu",e[e["console.clear"]=2]="console.clear",e[e["console.toggle"]=3]="console.toggle",e[e["debugger.step"]=4]="debugger.step",e[e["debugger.step-into"]=5]="debugger.step-into",e[e["debugger.step-out"]=6]="debugger.step-out",e[e["debugger.step-over"]=7]="debugger.step-over",e[e["debugger.toggle-breakpoint"]=8]="debugger.toggle-breakpoint",e[e["debugger.toggle-breakpoint-enabled"]=9]="debugger.toggle-breakpoint-enabled",e[e["debugger.toggle-pause"]=10]="debugger.toggle-pause",e[e["elements.edit-as-html"]=11]="elements.edit-as-html",e[e["elements.hide-element"]=12]="elements.hide-element",e[e["elements.redo"]=13]="elements.redo",e[e["elements.toggle-element-search"]=14]="elements.toggle-element-search",e[e["elements.undo"]=15]="elements.undo",e[e["main.search-in-panel.find"]=16]="main.search-in-panel.find",e[e["main.toggle-drawer"]=17]="main.toggle-drawer",e[e["network.hide-request-details"]=18]="network.hide-request-details",e[e["network.search"]=19]="network.search",e[e["network.toggle-recording"]=20]="network.toggle-recording",e[e["quick-open.show"]=21]="quick-open.show",e[e["settings.show"]=22]="settings.show",e[e["sources.search"]=23]="sources.search",e[e["background-service.toggle-recording"]=24]="background-service.toggle-recording",e[e["components.collect-garbage"]=25]="components.collect-garbage",e[e["console.clear.history"]=26]="console.clear.history",e[e["console.create-pin"]=27]="console.create-pin",e[e["coverage.start-with-reload"]=28]="coverage.start-with-reload",e[e["coverage.toggle-recording"]=29]="coverage.toggle-recording",e[e["debugger.breakpoint-input-window"]=30]="debugger.breakpoint-input-window",e[e["debugger.evaluate-selection"]=31]="debugger.evaluate-selection",e[e["debugger.next-call-frame"]=32]="debugger.next-call-frame",e[e["debugger.previous-call-frame"]=33]="debugger.previous-call-frame",e[e["debugger.run-snippet"]=34]="debugger.run-snippet",e[e["debugger.toggle-breakpoints-active"]=35]="debugger.toggle-breakpoints-active",e[e["elements.capture-area-screenshot"]=36]="elements.capture-area-screenshot",e[e["emulation.capture-full-height-screenshot"]=37]="emulation.capture-full-height-screenshot",e[e["emulation.capture-node-screenshot"]=38]="emulation.capture-node-screenshot",e[e["emulation.capture-screenshot"]=39]="emulation.capture-screenshot",e[e["emulation.show-sensors"]=40]="emulation.show-sensors",e[e["emulation.toggle-device-mode"]=41]="emulation.toggle-device-mode",e[e["help.release-notes"]=42]="help.release-notes",e[e["help.report-issue"]=43]="help.report-issue",e[e["input.start-replaying"]=44]="input.start-replaying",e[e["input.toggle-pause"]=45]="input.toggle-pause",e[e["input.toggle-recording"]=46]="input.toggle-recording",e[e["inspector-main.focus-debuggee"]=47]="inspector-main.focus-debuggee",e[e["inspector-main.hard-reload"]=48]="inspector-main.hard-reload",e[e["inspector-main.reload"]=49]="inspector-main.reload",e[e["live-heap-profile.start-with-reload"]=50]="live-heap-profile.start-with-reload",e[e["live-heap-profile.toggle-recording"]=51]="live-heap-profile.toggle-recording",e[e["main.debug-reload"]=52]="main.debug-reload",e[e["main.next-tab"]=53]="main.next-tab",e[e["main.previous-tab"]=54]="main.previous-tab",e[e["main.search-in-panel.cancel"]=55]="main.search-in-panel.cancel",e[e["main.search-in-panel.find-next"]=56]="main.search-in-panel.find-next",e[e["main.search-in-panel.find-previous"]=57]="main.search-in-panel.find-previous",e[e["main.toggle-dock"]=58]="main.toggle-dock",e[e["main.zoom-in"]=59]="main.zoom-in",e[e["main.zoom-out"]=60]="main.zoom-out",e[e["main.zoom-reset"]=61]="main.zoom-reset",e[e["network-conditions.network-low-end-mobile"]=62]="network-conditions.network-low-end-mobile",e[e["network-conditions.network-mid-tier-mobile"]=63]="network-conditions.network-mid-tier-mobile",e[e["network-conditions.network-offline"]=64]="network-conditions.network-offline",e[e["network-conditions.network-online"]=65]="network-conditions.network-online",e[e["profiler.heap-toggle-recording"]=66]="profiler.heap-toggle-recording",e[e["profiler.js-toggle-recording"]=67]="profiler.js-toggle-recording",e[e["resources.clear"]=68]="resources.clear",e[e["settings.documentation"]=69]="settings.documentation",e[e["settings.shortcuts"]=70]="settings.shortcuts",e[e["sources.add-folder-to-workspace"]=71]="sources.add-folder-to-workspace",e[e["sources.add-to-watch"]=72]="sources.add-to-watch",e[e["sources.close-all"]=73]="sources.close-all",e[e["sources.close-editor-tab"]=74]="sources.close-editor-tab",e[e["sources.create-snippet"]=75]="sources.create-snippet",e[e["sources.go-to-line"]=76]="sources.go-to-line",e[e["sources.go-to-member"]=77]="sources.go-to-member",e[e["sources.jump-to-next-location"]=78]="sources.jump-to-next-location",e[e["sources.jump-to-previous-location"]=79]="sources.jump-to-previous-location",e[e["sources.rename"]=80]="sources.rename",e[e["sources.save"]=81]="sources.save",e[e["sources.save-all"]=82]="sources.save-all",e[e["sources.switch-file"]=83]="sources.switch-file",e[e["timeline.jump-to-next-frame"]=84]="timeline.jump-to-next-frame",e[e["timeline.jump-to-previous-frame"]=85]="timeline.jump-to-previous-frame",e[e["timeline.load-from-file"]=86]="timeline.load-from-file",e[e["timeline.next-recording"]=87]="timeline.next-recording",e[e["timeline.previous-recording"]=88]="timeline.previous-recording",e[e["timeline.record-reload"]=89]="timeline.record-reload",e[e["timeline.save-to-file"]=90]="timeline.save-to-file",e[e["timeline.show-history"]=91]="timeline.show-history",e[e["timeline.toggle-recording"]=92]="timeline.toggle-recording",e[e["sources.increment-css"]=93]="sources.increment-css",e[e["sources.increment-css-by-ten"]=94]="sources.increment-css-by-ten",e[e["sources.decrement-css"]=95]="sources.decrement-css",e[e["sources.decrement-css-by-ten"]=96]="sources.decrement-css-by-ten",e[e["layers.reset-view"]=97]="layers.reset-view",e[e["layers.pan-mode"]=98]="layers.pan-mode",e[e["layers.rotate-mode"]=99]="layers.rotate-mode",e[e["layers.zoom-in"]=100]="layers.zoom-in",e[e["layers.zoom-out"]=101]="layers.zoom-out",e[e["layers.up"]=102]="layers.up",e[e["layers.down"]=103]="layers.down",e[e["layers.left"]=104]="layers.left",e[e["layers.right"]=105]="layers.right",e[e["help.report-translation-issue"]=106]="help.report-translation-issue",e[e["rendering.toggle-prefers-color-scheme"]=107]="rendering.toggle-prefers-color-scheme",e[e["chrome-recorder.start-recording"]=108]="chrome-recorder.start-recording",e[e["chrome-recorder.replay-recording"]=109]="chrome-recorder.replay-recording",e[e["chrome-recorder.toggle-code-view"]=110]="chrome-recorder.toggle-code-view",e[e["chrome-recorder.copy-recording-or-step"]=111]="chrome-recorder.copy-recording-or-step",e[e["changes.revert"]=112]="changes.revert",e[e["changes.copy"]=113]="changes.copy",e[e["elements.new-style-rule"]=114]="elements.new-style-rule",e[e["elements.refresh-event-listeners"]=115]="elements.refresh-event-listeners",e[e["coverage.clear"]=116]="coverage.clear",e[e["coverage.export"]=117]="coverage.export",e[e["timeline.dim-third-parties"]=118]="timeline.dim-third-parties",e[e.MAX_VALUE=119]="MAX_VALUE"}(oe||(oe={})),function(e){e[e["capture-node-creation-stacks"]=1]="capture-node-creation-stacks",e[e["live-heap-profile"]=11]="live-heap-profile",e[e["protocol-monitor"]=13]="protocol-monitor",e[e["sampling-heap-profiler-timeline"]=17]="sampling-heap-profiler-timeline",e[e["show-option-tp-expose-internals-in-heap-snapshot"]=18]="show-option-tp-expose-internals-in-heap-snapshot",e[e["timeline-invalidation-tracking"]=26]="timeline-invalidation-tracking",e[e["timeline-show-all-events"]=27]="timeline-show-all-events",e[e["timeline-v8-runtime-call-stats"]=28]="timeline-v8-runtime-call-stats",e[e.apca=39]="apca",e[e["font-editor"]=41]="font-editor",e[e["full-accessibility-tree"]=42]="full-accessibility-tree",e[e["contrast-issues"]=44]="contrast-issues",e[e["experimental-cookie-features"]=45]="experimental-cookie-features",e[e["instrumentation-breakpoints"]=61]="instrumentation-breakpoints",e[e["authored-deployed-grouping"]=63]="authored-deployed-grouping",e[e["just-my-code"]=65]="just-my-code",e[e["highlight-errors-elements-panel"]=73]="highlight-errors-elements-panel",e[e["use-source-map-scopes"]=76]="use-source-map-scopes",e[e["network-panel-filter-bar-redesign"]=79]="network-panel-filter-bar-redesign",e[e["timeline-show-postmessage-events"]=86]="timeline-show-postmessage-events",e[e["timeline-enhanced-traces"]=90]="timeline-enhanced-traces",e[e["timeline-compiled-sources"]=91]="timeline-compiled-sources",e[e["timeline-debug-mode"]=93]="timeline-debug-mode",e[e["timeline-experimental-insights"]=102]="timeline-experimental-insights",e[e["timeline-dim-unrelated-events"]=103]="timeline-dim-unrelated-events",e[e["timeline-alternative-navigation"]=104]="timeline-alternative-navigation",e[e.MAX_VALUE=106]="MAX_VALUE"}(se||(se={})),function(e){e[e.CrossOriginEmbedderPolicy=0]="CrossOriginEmbedderPolicy",e[e.MixedContent=1]="MixedContent",e[e.SameSiteCookie=2]="SameSiteCookie",e[e.HeavyAd=3]="HeavyAd",e[e.ContentSecurityPolicy=4]="ContentSecurityPolicy",e[e.Other=5]="Other",e[e.Generic=6]="Generic",e[e.ThirdPartyPhaseoutCookie=7]="ThirdPartyPhaseoutCookie",e[e.GenericCookie=8]="GenericCookie",e[e.MAX_VALUE=9]="MAX_VALUE"}(ie||(ie={})),function(e){e[e.CrossOriginEmbedderPolicyRequest=0]="CrossOriginEmbedderPolicyRequest",e[e.CrossOriginEmbedderPolicyElement=1]="CrossOriginEmbedderPolicyElement",e[e.MixedContentRequest=2]="MixedContentRequest",e[e.SameSiteCookieCookie=3]="SameSiteCookieCookie",e[e.SameSiteCookieRequest=4]="SameSiteCookieRequest",e[e.HeavyAdElement=5]="HeavyAdElement",e[e.ContentSecurityPolicyDirective=6]="ContentSecurityPolicyDirective",e[e.ContentSecurityPolicyElement=7]="ContentSecurityPolicyElement",e[e.MAX_VALUE=13]="MAX_VALUE"}(ae||(ae={})),function(e){e[e.MixedContentIssue=0]="MixedContentIssue",e[e["ContentSecurityPolicyIssue::kInlineViolation"]=1]="ContentSecurityPolicyIssue::kInlineViolation",e[e["ContentSecurityPolicyIssue::kEvalViolation"]=2]="ContentSecurityPolicyIssue::kEvalViolation",e[e["ContentSecurityPolicyIssue::kURLViolation"]=3]="ContentSecurityPolicyIssue::kURLViolation",e[e["ContentSecurityPolicyIssue::kTrustedTypesSinkViolation"]=4]="ContentSecurityPolicyIssue::kTrustedTypesSinkViolation",e[e["ContentSecurityPolicyIssue::kTrustedTypesPolicyViolation"]=5]="ContentSecurityPolicyIssue::kTrustedTypesPolicyViolation",e[e["HeavyAdIssue::NetworkTotalLimit"]=6]="HeavyAdIssue::NetworkTotalLimit",e[e["HeavyAdIssue::CpuTotalLimit"]=7]="HeavyAdIssue::CpuTotalLimit",e[e["HeavyAdIssue::CpuPeakLimit"]=8]="HeavyAdIssue::CpuPeakLimit",e[e["CrossOriginEmbedderPolicyIssue::CoepFrameResourceNeedsCoepHeader"]=9]="CrossOriginEmbedderPolicyIssue::CoepFrameResourceNeedsCoepHeader",e[e["CrossOriginEmbedderPolicyIssue::CoopSandboxedIFrameCannotNavigateToCoopPage"]=10]="CrossOriginEmbedderPolicyIssue::CoopSandboxedIFrameCannotNavigateToCoopPage",e[e["CrossOriginEmbedderPolicyIssue::CorpNotSameOrigin"]=11]="CrossOriginEmbedderPolicyIssue::CorpNotSameOrigin",e[e["CrossOriginEmbedderPolicyIssue::CorpNotSameOriginAfterDefaultedToSameOriginByCoep"]=12]="CrossOriginEmbedderPolicyIssue::CorpNotSameOriginAfterDefaultedToSameOriginByCoep",e[e["CrossOriginEmbedderPolicyIssue::CorpNotSameSite"]=13]="CrossOriginEmbedderPolicyIssue::CorpNotSameSite",e[e["CookieIssue::ExcludeSameSiteNoneInsecure::ReadCookie"]=14]="CookieIssue::ExcludeSameSiteNoneInsecure::ReadCookie",e[e["CookieIssue::ExcludeSameSiteNoneInsecure::SetCookie"]=15]="CookieIssue::ExcludeSameSiteNoneInsecure::SetCookie",e[e["CookieIssue::WarnSameSiteNoneInsecure::ReadCookie"]=16]="CookieIssue::WarnSameSiteNoneInsecure::ReadCookie",e[e["CookieIssue::WarnSameSiteNoneInsecure::SetCookie"]=17]="CookieIssue::WarnSameSiteNoneInsecure::SetCookie",e[e["CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Secure"]=18]="CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Secure",e[e["CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Insecure"]=19]="CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Insecure",e[e["CookieIssue::WarnCrossDowngrade::ReadCookie::Secure"]=20]="CookieIssue::WarnCrossDowngrade::ReadCookie::Secure",e[e["CookieIssue::WarnCrossDowngrade::ReadCookie::Insecure"]=21]="CookieIssue::WarnCrossDowngrade::ReadCookie::Insecure",e[e["CookieIssue::WarnCrossDowngrade::SetCookie::Secure"]=22]="CookieIssue::WarnCrossDowngrade::SetCookie::Secure",e[e["CookieIssue::WarnCrossDowngrade::SetCookie::Insecure"]=23]="CookieIssue::WarnCrossDowngrade::SetCookie::Insecure",e[e["CookieIssue::ExcludeNavigationContextDowngrade::Secure"]=24]="CookieIssue::ExcludeNavigationContextDowngrade::Secure",e[e["CookieIssue::ExcludeNavigationContextDowngrade::Insecure"]=25]="CookieIssue::ExcludeNavigationContextDowngrade::Insecure",e[e["CookieIssue::ExcludeContextDowngrade::ReadCookie::Secure"]=26]="CookieIssue::ExcludeContextDowngrade::ReadCookie::Secure",e[e["CookieIssue::ExcludeContextDowngrade::ReadCookie::Insecure"]=27]="CookieIssue::ExcludeContextDowngrade::ReadCookie::Insecure",e[e["CookieIssue::ExcludeContextDowngrade::SetCookie::Secure"]=28]="CookieIssue::ExcludeContextDowngrade::SetCookie::Secure",e[e["CookieIssue::ExcludeContextDowngrade::SetCookie::Insecure"]=29]="CookieIssue::ExcludeContextDowngrade::SetCookie::Insecure",e[e["CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::ReadCookie"]=30]="CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::ReadCookie",e[e["CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::SetCookie"]=31]="CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::SetCookie",e[e["CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::ReadCookie"]=32]="CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::ReadCookie",e[e["CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::SetCookie"]=33]="CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::SetCookie",e[e["CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::ReadCookie"]=34]="CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::ReadCookie",e[e["CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::SetCookie"]=35]="CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::SetCookie",e[e["SharedArrayBufferIssue::TransferIssue"]=36]="SharedArrayBufferIssue::TransferIssue",e[e["SharedArrayBufferIssue::CreationIssue"]=37]="SharedArrayBufferIssue::CreationIssue",e[e.LowTextContrastIssue=41]="LowTextContrastIssue",e[e["CorsIssue::InsecurePrivateNetwork"]=42]="CorsIssue::InsecurePrivateNetwork",e[e["CorsIssue::InvalidHeaders"]=44]="CorsIssue::InvalidHeaders",e[e["CorsIssue::WildcardOriginWithCredentials"]=45]="CorsIssue::WildcardOriginWithCredentials",e[e["CorsIssue::PreflightResponseInvalid"]=46]="CorsIssue::PreflightResponseInvalid",e[e["CorsIssue::OriginMismatch"]=47]="CorsIssue::OriginMismatch",e[e["CorsIssue::AllowCredentialsRequired"]=48]="CorsIssue::AllowCredentialsRequired",e[e["CorsIssue::MethodDisallowedByPreflightResponse"]=49]="CorsIssue::MethodDisallowedByPreflightResponse",e[e["CorsIssue::HeaderDisallowedByPreflightResponse"]=50]="CorsIssue::HeaderDisallowedByPreflightResponse",e[e["CorsIssue::RedirectContainsCredentials"]=51]="CorsIssue::RedirectContainsCredentials",e[e["CorsIssue::DisallowedByMode"]=52]="CorsIssue::DisallowedByMode",e[e["CorsIssue::CorsDisabledScheme"]=53]="CorsIssue::CorsDisabledScheme",e[e["CorsIssue::PreflightMissingAllowExternal"]=54]="CorsIssue::PreflightMissingAllowExternal",e[e["CorsIssue::PreflightInvalidAllowExternal"]=55]="CorsIssue::PreflightInvalidAllowExternal",e[e["CorsIssue::NoCorsRedirectModeNotFollow"]=57]="CorsIssue::NoCorsRedirectModeNotFollow",e[e["QuirksModeIssue::QuirksMode"]=58]="QuirksModeIssue::QuirksMode",e[e["QuirksModeIssue::LimitedQuirksMode"]=59]="QuirksModeIssue::LimitedQuirksMode",e[e.DeprecationIssue=60]="DeprecationIssue",e[e["ClientHintIssue::MetaTagAllowListInvalidOrigin"]=61]="ClientHintIssue::MetaTagAllowListInvalidOrigin",e[e["ClientHintIssue::MetaTagModifiedHTML"]=62]="ClientHintIssue::MetaTagModifiedHTML",e[e["CorsIssue::PreflightAllowPrivateNetworkError"]=63]="CorsIssue::PreflightAllowPrivateNetworkError",e[e["GenericIssue::CrossOriginPortalPostMessageError"]=64]="GenericIssue::CrossOriginPortalPostMessageError",e[e["GenericIssue::FormLabelForNameError"]=65]="GenericIssue::FormLabelForNameError",e[e["GenericIssue::FormDuplicateIdForInputError"]=66]="GenericIssue::FormDuplicateIdForInputError",e[e["GenericIssue::FormInputWithNoLabelError"]=67]="GenericIssue::FormInputWithNoLabelError",e[e["GenericIssue::FormAutocompleteAttributeEmptyError"]=68]="GenericIssue::FormAutocompleteAttributeEmptyError",e[e["GenericIssue::FormEmptyIdAndNameAttributesForInputError"]=69]="GenericIssue::FormEmptyIdAndNameAttributesForInputError",e[e["GenericIssue::FormAriaLabelledByToNonExistingId"]=70]="GenericIssue::FormAriaLabelledByToNonExistingId",e[e["GenericIssue::FormInputAssignedAutocompleteValueToIdOrNameAttributeError"]=71]="GenericIssue::FormInputAssignedAutocompleteValueToIdOrNameAttributeError",e[e["GenericIssue::FormLabelHasNeitherForNorNestedInput"]=72]="GenericIssue::FormLabelHasNeitherForNorNestedInput",e[e["GenericIssue::FormLabelForMatchesNonExistingIdError"]=73]="GenericIssue::FormLabelForMatchesNonExistingIdError",e[e["GenericIssue::FormHasPasswordFieldWithoutUsernameFieldError"]=74]="GenericIssue::FormHasPasswordFieldWithoutUsernameFieldError",e[e["GenericIssue::FormInputHasWrongButWellIntendedAutocompleteValueError"]=75]="GenericIssue::FormInputHasWrongButWellIntendedAutocompleteValueError",e[e["StylesheetLoadingIssue::LateImportRule"]=76]="StylesheetLoadingIssue::LateImportRule",e[e["StylesheetLoadingIssue::RequestFailed"]=77]="StylesheetLoadingIssue::RequestFailed",e[e["CorsIssue::PreflightMissingPrivateNetworkAccessId"]=78]="CorsIssue::PreflightMissingPrivateNetworkAccessId",e[e["CorsIssue::PreflightMissingPrivateNetworkAccessName"]=79]="CorsIssue::PreflightMissingPrivateNetworkAccessName",e[e["CorsIssue::PrivateNetworkAccessPermissionUnavailable"]=80]="CorsIssue::PrivateNetworkAccessPermissionUnavailable",e[e["CorsIssue::PrivateNetworkAccessPermissionDenied"]=81]="CorsIssue::PrivateNetworkAccessPermissionDenied",e[e["CookieIssue::WarnThirdPartyPhaseout::ReadCookie"]=82]="CookieIssue::WarnThirdPartyPhaseout::ReadCookie",e[e["CookieIssue::WarnThirdPartyPhaseout::SetCookie"]=83]="CookieIssue::WarnThirdPartyPhaseout::SetCookie",e[e["CookieIssue::ExcludeThirdPartyPhaseout::ReadCookie"]=84]="CookieIssue::ExcludeThirdPartyPhaseout::ReadCookie",e[e["CookieIssue::ExcludeThirdPartyPhaseout::SetCookie"]=85]="CookieIssue::ExcludeThirdPartyPhaseout::SetCookie",e[e["SelectElementAccessibilityIssue::DisallowedSelectChild"]=86]="SelectElementAccessibilityIssue::DisallowedSelectChild",e[e["SelectElementAccessibilityIssue::DisallowedOptGroupChild"]=87]="SelectElementAccessibilityIssue::DisallowedOptGroupChild",e[e["SelectElementAccessibilityIssue::NonPhrasingContentOptionChild"]=88]="SelectElementAccessibilityIssue::NonPhrasingContentOptionChild",e[e["SelectElementAccessibilityIssue::InteractiveContentOptionChild"]=89]="SelectElementAccessibilityIssue::InteractiveContentOptionChild",e[e["SelectElementAccessibilityIssue::InteractiveContentLegendChild"]=90]="SelectElementAccessibilityIssue::InteractiveContentLegendChild",e[e["SRIMessageSignatureIssue::MissingSignatureHeader"]=91]="SRIMessageSignatureIssue::MissingSignatureHeader",e[e["SRIMessageSignatureIssue::MissingSignatureInputHeader"]=92]="SRIMessageSignatureIssue::MissingSignatureInputHeader",e[e["SRIMessageSignatureIssue::InvalidSignatureHeader"]=93]="SRIMessageSignatureIssue::InvalidSignatureHeader",e[e["SRIMessageSignatureIssue::InvalidSignatureInputHeader"]=94]="SRIMessageSignatureIssue::InvalidSignatureInputHeader",e[e["SRIMessageSignatureIssue::SignatureHeaderValueIsNotByteSequence"]=95]="SRIMessageSignatureIssue::SignatureHeaderValueIsNotByteSequence",e[e["SRIMessageSignatureIssue::SignatureHeaderValueIsParameterized"]=96]="SRIMessageSignatureIssue::SignatureHeaderValueIsParameterized",e[e["SRIMessageSignatureIssue::SignatureHeaderValueIsIncorrectLength"]=97]="SRIMessageSignatureIssue::SignatureHeaderValueIsIncorrectLength",e[e["SRIMessageSignatureIssue::SignatureInputHeaderMissingLabel"]=98]="SRIMessageSignatureIssue::SignatureInputHeaderMissingLabel",e[e["SRIMessageSignatureIssue::SignatureInputHeaderValueNotInnerList"]=99]="SRIMessageSignatureIssue::SignatureInputHeaderValueNotInnerList",e[e["SRIMessageSignatureIssue::SignatureInputHeaderValueMissingComponents"]=100]="SRIMessageSignatureIssue::SignatureInputHeaderValueMissingComponents",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentType"]=101]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentType",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentName"]=102]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentName",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidHeaderComponentParameter"]=103]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidHeaderComponentParameter",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidDerivedComponentParameter"]=104]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidDerivedComponentParameter",e[e["SRIMessageSignatureIssue::SignatureInputHeaderKeyIdLength"]=105]="SRIMessageSignatureIssue::SignatureInputHeaderKeyIdLength",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidParameter"]=106]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidParameter",e[e["SRIMessageSignatureIssue::SignatureInputHeaderMissingRequiredParameters"]=107]="SRIMessageSignatureIssue::SignatureInputHeaderMissingRequiredParameters",e[e["SRIMessageSignatureIssue::ValidationFailedSignatureExpired"]=108]="SRIMessageSignatureIssue::ValidationFailedSignatureExpired",e[e["SRIMessageSignatureIssue::ValidationFailedInvalidLength"]=109]="SRIMessageSignatureIssue::ValidationFailedInvalidLength",e[e["SRIMessageSignatureIssue::ValidationFailedSignatureMismatch"]=110]="SRIMessageSignatureIssue::ValidationFailedSignatureMismatch",e[e["CorsIssue::LocalNetworkAccessPermissionDenied"]=111]="CorsIssue::LocalNetworkAccessPermissionDenied",e[e["SRIMessageSignatureIssue::ValidationFailedIntegrityMismatch"]=112]="SRIMessageSignatureIssue::ValidationFailedIntegrityMismatch",e[e.MAX_VALUE=113]="MAX_VALUE"}(de||(de={})),function(e){e[e.af=1]="af",e[e.am=2]="am",e[e.ar=3]="ar",e[e.as=4]="as",e[e.az=5]="az",e[e.be=6]="be",e[e.bg=7]="bg",e[e.bn=8]="bn",e[e.bs=9]="bs",e[e.ca=10]="ca",e[e.cs=11]="cs",e[e.cy=12]="cy",e[e.da=13]="da",e[e.de=14]="de",e[e.el=15]="el",e[e["en-GB"]=16]="en-GB",e[e["en-US"]=17]="en-US",e[e["es-419"]=18]="es-419",e[e.es=19]="es",e[e.et=20]="et",e[e.eu=21]="eu",e[e.fa=22]="fa",e[e.fi=23]="fi",e[e.fil=24]="fil",e[e["fr-CA"]=25]="fr-CA",e[e.fr=26]="fr",e[e.gl=27]="gl",e[e.gu=28]="gu",e[e.he=29]="he",e[e.hi=30]="hi",e[e.hr=31]="hr",e[e.hu=32]="hu",e[e.hy=33]="hy",e[e.id=34]="id",e[e.is=35]="is",e[e.it=36]="it",e[e.ja=37]="ja",e[e.ka=38]="ka",e[e.kk=39]="kk",e[e.km=40]="km",e[e.kn=41]="kn",e[e.ko=42]="ko",e[e.ky=43]="ky",e[e.lo=44]="lo",e[e.lt=45]="lt",e[e.lv=46]="lv",e[e.mk=47]="mk",e[e.ml=48]="ml",e[e.mn=49]="mn",e[e.mr=50]="mr",e[e.ms=51]="ms",e[e.my=52]="my",e[e.ne=53]="ne",e[e.nl=54]="nl",e[e.no=55]="no",e[e.or=56]="or",e[e.pa=57]="pa",e[e.pl=58]="pl",e[e["pt-PT"]=59]="pt-PT",e[e.pt=60]="pt",e[e.ro=61]="ro",e[e.ru=62]="ru",e[e.si=63]="si",e[e.sk=64]="sk",e[e.sl=65]="sl",e[e.sq=66]="sq",e[e["sr-Latn"]=67]="sr-Latn",e[e.sr=68]="sr",e[e.sv=69]="sv",e[e.sw=70]="sw",e[e.ta=71]="ta",e[e.te=72]="te",e[e.th=73]="th",e[e.tr=74]="tr",e[e.uk=75]="uk",e[e.ur=76]="ur",e[e.uz=77]="uz",e[e.vi=78]="vi",e[e.zh=79]="zh",e[e["zh-HK"]=80]="zh-HK",e[e["zh-TW"]=81]="zh-TW",e[e.zu=82]="zu",e[e.MAX_VALUE=83]="MAX_VALUE"}(ce||(ce={})),function(e){e[e.OtherSection=0]="OtherSection",e[e.Identity=1]="Identity",e[e.Presentation=2]="Presentation",e[e["Protocol Handlers"]=3]="Protocol Handlers",e[e.Icons=4]="Icons",e[e["Window Controls Overlay"]=5]="Window Controls Overlay",e[e.MAX_VALUE=6]="MAX_VALUE"}(le||(le={}));var ge=Object.freeze({__proto__:null,get Action(){return J},get DevtoolsExperiments(){return se},get ElementsSidebarTabCodes(){return re},get IssueCreated(){return de},get IssueExpanded(){return ie},get IssueResourceOpened(){return ae},get KeybindSetSettings(){return ne},get KeyboardShortcutAction(){return oe},get Language(){return ce},get ManifestSectionCodes(){return le},get MediaTypes(){return te},get PanelCodes(){return Z},get PanelWithLocation(){return ee},UserMetrics:me});const pe=new me,he=K();export{U as AidaClient,F as InspectorFrontendHost,i as InspectorFrontendHostAPI,X as Platform,ue as RNPerfMetrics,v as ResourceLoader,ge as UserMetrics,he as rnPerfMetrics,pe as userMetrics}; +import*as e from"../common/common.js";import*as r from"../root/root.js";import*as t from"../i18n/i18n.js";import*as n from"../platform/platform.js";var o;!function(e){e.AppendedToURL="appendedToURL",e.CanceledSaveURL="canceledSaveURL",e.ColorThemeChanged="colorThemeChanged",e.ContextMenuCleared="contextMenuCleared",e.ContextMenuItemSelected="contextMenuItemSelected",e.DeviceCountUpdated="deviceCountUpdated",e.DevicesDiscoveryConfigChanged="devicesDiscoveryConfigChanged",e.DevicesPortForwardingStatusChanged="devicesPortForwardingStatusChanged",e.DevicesUpdated="devicesUpdated",e.DispatchMessage="dispatchMessage",e.DispatchMessageChunk="dispatchMessageChunk",e.EnterInspectElementMode="enterInspectElementMode",e.EyeDropperPickedColor="eyeDropperPickedColor",e.FileSystemsLoaded="fileSystemsLoaded",e.FileSystemRemoved="fileSystemRemoved",e.FileSystemAdded="fileSystemAdded",e.FileSystemFilesChangedAddedRemoved="FileSystemFilesChangedAddedRemoved",e.IndexingTotalWorkCalculated="indexingTotalWorkCalculated",e.IndexingWorked="indexingWorked",e.IndexingDone="indexingDone",e.KeyEventUnhandled="keyEventUnhandled",e.ReloadInspectedPage="reloadInspectedPage",e.RevealSourceLine="revealSourceLine",e.SavedURL="savedURL",e.SearchCompleted="searchCompleted",e.SetInspectedTabId="setInspectedTabId",e.SetUseSoftMenu="setUseSoftMenu",e.ShowPanel="showPanel"}(o||(o={}));const s=[[o.AppendedToURL,"appendedToURL",["url"]],[o.CanceledSaveURL,"canceledSaveURL",["url"]],[o.ColorThemeChanged,"colorThemeChanged",[]],[o.ContextMenuCleared,"contextMenuCleared",[]],[o.ContextMenuItemSelected,"contextMenuItemSelected",["id"]],[o.DeviceCountUpdated,"deviceCountUpdated",["count"]],[o.DevicesDiscoveryConfigChanged,"devicesDiscoveryConfigChanged",["config"]],[o.DevicesPortForwardingStatusChanged,"devicesPortForwardingStatusChanged",["status"]],[o.DevicesUpdated,"devicesUpdated",["devices"]],[o.DispatchMessage,"dispatchMessage",["messageObject"]],[o.DispatchMessageChunk,"dispatchMessageChunk",["messageChunk","messageSize"]],[o.EnterInspectElementMode,"enterInspectElementMode",[]],[o.EyeDropperPickedColor,"eyeDropperPickedColor",["color"]],[o.FileSystemsLoaded,"fileSystemsLoaded",["fileSystems"]],[o.FileSystemRemoved,"fileSystemRemoved",["fileSystemPath"]],[o.FileSystemAdded,"fileSystemAdded",["errorMessage","fileSystem"]],[o.FileSystemFilesChangedAddedRemoved,"fileSystemFilesChangedAddedRemoved",["changed","added","removed"]],[o.IndexingTotalWorkCalculated,"indexingTotalWorkCalculated",["requestId","fileSystemPath","totalWork"]],[o.IndexingWorked,"indexingWorked",["requestId","fileSystemPath","worked"]],[o.IndexingDone,"indexingDone",["requestId","fileSystemPath"]],[o.KeyEventUnhandled,"keyEventUnhandled",["event"]],[o.ReloadInspectedPage,"reloadInspectedPage",["hard"]],[o.RevealSourceLine,"revealSourceLine",["url","lineNumber","columnNumber"]],[o.SavedURL,"savedURL",["url","fileSystemPath"]],[o.SearchCompleted,"searchCompleted",["requestId","fileSystemPath","files"]],[o.SetInspectedTabId,"setInspectedTabId",["tabId"]],[o.SetUseSoftMenu,"setUseSoftMenu",["useSoftMenu"]],[o.ShowPanel,"showPanel",["panelName"]]];var i=Object.freeze({__proto__:null,EventDescriptors:s,get Events(){return o}});const a={systemError:"System error",connectionError:"Connection error",certificateError:"Certificate error",httpError:"HTTP error",cacheError:"Cache error",signedExchangeError:"Signed Exchange error",ftpError:"FTP error",certificateManagerError:"Certificate manager error",dnsResolverError:"DNS resolver error",unknownError:"Unknown error",httpErrorStatusCodeSS:"HTTP error: status code {PH1}, {PH2}",invalidUrl:"Invalid URL",decodingDataUrlFailed:"Decoding Data URL failed"},d=t.i18n.registerUIStrings("core/host/ResourceLoader.ts",a),c=t.i18n.getLocalizedString.bind(void 0,d);let l=0;const u={},m=function(e){return u[++l]=e,l},g=function(e){u[e].close(),delete u[e]},p=function(e,r){u[e].write(r)};function h(e,r,t){if(void 0===e||void 0===t)return null;if(0!==e){if(function(e){return e<=-300&&e>-400}(e))return c(a.httpErrorStatusCodeSS,{PH1:String(r),PH2:t});const n=function(e){return c(e>-100?a.systemError:e>-200?a.connectionError:e>-300?a.certificateError:e>-400?a.httpError:e>-500?a.cacheError:e>-600?a.signedExchangeError:e>-700?a.ftpError:e>-800?a.certificateManagerError:e>-900?a.dnsResolverError:a.unknownError)}(e);return`${n}: ${t}`}return null}const S=function(r,t,n,o,s){const i=m(n);if(new e.ParsedURL.ParsedURL(r).isDataURL())return void(e=>new Promise(((r,t)=>{const n=new XMLHttpRequest;n.withCredentials=!1,n.open("GET",e,!0),n.onreadystatechange=function(){if(n.readyState===XMLHttpRequest.DONE){if(200!==n.status)return n.onreadystatechange=null,void t(new Error(String(n.status)));n.onreadystatechange=null,r(n.responseText)}},n.send(null)})))(r).then((function(e){p(i,e),l({statusCode:200})})).catch((function(e){l({statusCode:404,messageOverride:c(a.decodingDataUrlFailed)})}));if(!s&&function(e){try{const r=new URL(e);return"file:"===r.protocol&&""!==r.host}catch{return!1}}(r))return void(o&&o(!1,{},{statusCode:400,netError:-20,netErrorName:"net::BLOCKED_BY_CLIENT",message:"Loading from a remote file path is prohibited for security reasons."}));const d=[];if(t)for(const e in t)d.push(e+": "+t[e]);function l(e){if(o){const{success:r,description:t}=function(e){const{statusCode:r,netError:t,netErrorName:n,urlValid:o,messageOverride:s}=e;let i="";const d=r>=200&&r<300;if("string"==typeof s)i=s;else if(!d)if(void 0===t)i=c(!1===o?a.invalidUrl:a.unknownError);else{const e=h(t,r,n);e&&(i=e)}return console.assert(d===(0===i.length)),{success:d,description:{statusCode:r,netError:t,netErrorName:n,urlValid:o,message:i}}}(e);o(r,e.headers||{},t)}g(i)}f.loadNetworkResource(r,d.join("\r\n"),i,l)};var v=Object.freeze({__proto__:null,ResourceLoader:{},bindOutputStream:m,discardOutputStream:g,load:function(r,t,n,o){const s=new e.StringOutputStream.StringOutputStream;S(r,t,s,(function(e,r,t){n(e,r,s.data(),t)}),o)},loadAsStream:S,netErrorToMessage:h,streamWrite:p});const C={devtoolsS:"DevTools - {PH1}"},I=t.i18n.registerUIStrings("core/host/InspectorFrontendHost.ts",C),w=t.i18n.getLocalizedString.bind(void 0,I),k="/overrides";class E{#e=new Map;events;#r=null;recordedCountHistograms=[];recordedEnumeratedHistograms=[];recordedPerformanceHistograms=[];constructor(){function e(e){!("mac"===this.platform()?e.metaKey:e.ctrlKey)||"+"!==e.key&&"-"!==e.key||e.stopPropagation()}"undefined"!=typeof document&&document.addEventListener("keydown",(r=>{e.call(this,r)}),!0)}platform(){const e=navigator.userAgent;return e.includes("Windows NT")?"windows":e.includes("Mac OS X")?"mac":"linux"}loadCompleted(){}bringToFront(){}closeWindow(){}setIsDocked(e,r){window.setTimeout(r,0)}showSurvey(e,r){window.setTimeout((()=>r({surveyShown:!1})),0)}canShowSurvey(e,r){window.setTimeout((()=>r({canShowSurvey:!1})),0)}setInspectedPageBounds(e){}inspectElementCompleted(){}setInjectedScriptForOrigin(e,r){}inspectedURLChanged(e){document.title=w(C.devtoolsS,{PH1:e.replace(/^https?:\/\//,"")})}copyText(e){null!=e&&navigator.clipboard.writeText(e)}openInNewTab(r){e.ParsedURL.schemeIs(r,"javascript:")||window.open(r,"_blank")}openSearchResultsInNewTab(r){e.Console.Console.instance().error("Search is not enabled in hosted mode. Please inspect using chrome://inspect")}showItemInFolder(r){e.Console.Console.instance().error("Show item in folder is not enabled in hosted mode. Please inspect using chrome://inspect")}save(e,r,t,n){let s=this.#e.get(e);s||(s=[],this.#e.set(e,s)),s.push(r),this.events.dispatchEventToListeners(o.SavedURL,{url:e,fileSystemPath:e})}append(e,r){const t=this.#e.get(e);t&&(t.push(r),this.events.dispatchEventToListeners(o.AppendedToURL,e))}close(e){const r=this.#e.get(e)||[];this.#e.delete(e);let t="";if(e)try{const r=n.StringUtilities.trimURL(e);t=n.StringUtilities.removeURLFragment(r)}catch(r){t=e}const o=document.createElement("a");o.download=t;const s=new Blob([r.join("")],{type:"text/plain"}),i=URL.createObjectURL(s);o.href=i,o.click(),URL.revokeObjectURL(i)}sendMessageToBackend(e){}recordCountHistogram(e,r,t,n,o){this.recordedCountHistograms.length>=100&&this.recordedCountHistograms.shift(),this.recordedCountHistograms.push({histogramName:e,sample:r,min:t,exclusiveMax:n,bucketSize:o})}recordEnumeratedHistogram(e,r,t){this.recordedEnumeratedHistograms.length>=100&&this.recordedEnumeratedHistograms.shift(),this.recordedEnumeratedHistograms.push({actionName:e,actionCode:r})}recordPerformanceHistogram(e,r){this.recordedPerformanceHistograms.length>=100&&this.recordedPerformanceHistograms.shift(),this.recordedPerformanceHistograms.push({histogramName:e,duration:r})}recordUserMetricsAction(e){}connectAutomaticFileSystem(e,r,t,n){queueMicrotask((()=>n({success:!1})))}disconnectAutomaticFileSystem(e){}requestFileSystems(){this.events.dispatchEventToListeners(o.FileSystemsLoaded,[])}addFileSystem(e){window.webkitRequestFileSystem(window.TEMPORARY,1048576,(e=>{this.#r=e;const r={fileSystemName:"sandboxedRequestedFileSystem",fileSystemPath:k,rootURL:"filesystem:devtools://devtools/isolated/",type:"overrides"};this.events.dispatchEventToListeners(o.FileSystemAdded,{fileSystem:r})}))}removeFileSystem(e){const r=e=>{e.forEach((e=>{e.isDirectory?e.removeRecursively((()=>{})):e.isFile&&e.remove((()=>{}))}))};this.#r&&this.#r.root.createReader().readEntries(r),this.#r=null,this.events.dispatchEventToListeners(o.FileSystemRemoved,k)}isolatedFileSystem(e,r){return this.#r}loadNetworkResource(e,r,t,n){fetch(e).then((async e=>{const r=await e.arrayBuffer();let t=r;if(function(e){const r=new Uint8Array(e);return!(!r||r.length<3)&&31===r[0]&&139===r[1]&&8===r[2]}(r)){const e=new DecompressionStream("gzip"),n=e.writable.getWriter();n.write(r),n.close(),t=e.readable}return await new Response(t).text()})).then((function(e){p(t,e),n({statusCode:200,headers:void 0,messageOverride:void 0,netError:void 0,netErrorName:void 0,urlValid:void 0})})).catch((function(){n({statusCode:404,headers:void 0,messageOverride:void 0,netError:void 0,netErrorName:void 0,urlValid:void 0})}))}registerPreference(e,r){}getPreferences(e){const r={};for(const e in window.localStorage)r[e]=window.localStorage[e];e(r)}getPreference(e,r){r(window.localStorage[e])}setPreference(e,r){window.localStorage[e]=r}removePreference(e){delete window.localStorage[e]}clearPreferences(){window.localStorage.clear()}getSyncInformation(e){if("getSyncInformationForTesting"in globalThis)return e(globalThis.getSyncInformationForTesting());e({isSyncActive:!1,arePreferencesSynced:!1})}getHostConfig(e){const r={devToolsVeLogging:{enabled:!0},thirdPartyCookieControls:{thirdPartyCookieMetadataEnabled:!0,thirdPartyCookieHeuristicsEnabled:!0,managedBlockThirdPartyCookies:"Unset"}};if("hostConfigForTesting"in globalThis){const{hostConfigForTesting:e}=globalThis;for(const t of Object.keys(e)){const n=t=>{"object"==typeof r[t]&&"object"==typeof e[t]?r[t]={...r[t],...e[t]}:r[t]=e[t]??r[t]};n(t)}}e(r)}upgradeDraggedFileSystemPermissions(e){}indexPath(e,r,t){}stopIndexing(e){}searchInPath(e,r,t){}zoomFactor(){return 1}zoomIn(){}zoomOut(){}resetZoom(){}setWhitelistedShortcuts(e){}setEyeDropperActive(e){}showCertificateViewer(e){}reattach(e){e()}readyForTest(){}connectionReady(){}setOpenNewWindowForPopups(e){}setDevicesDiscoveryConfig(e){}setDevicesUpdatesEnabled(e){}openRemotePage(e,r){}openNodeFrontend(){}showContextMenuAtPoint(e,r,t,n){throw new Error("Soft context menu should be used")}isHostedMode(){return!0}setAddExtensionCallback(e){}async initialTargetId(){return null}doAidaConversation(e,r,t){t({error:"Not implemented"})}registerAidaClientEvent(e,r){r({error:"Not implemented"})}recordImpression(e){}recordResize(e){}recordClick(e){}recordHover(e){}recordDrag(e){}recordChange(e){}recordKeyDown(e){}recordSettingAccess(e){}}let f=globalThis.InspectorFrontendHost;class y{constructor(){for(const e of s)this[e[1]]=this.dispatch.bind(this,e[0],e[2],e[3])}dispatch(e,r,t,...n){if(r.length<2){try{f.events.dispatchEventToListeners(e,n[0])}catch(e){console.error(e+" "+e.stack)}return}const o={};for(let e=0;e=0&&(o.options??={},o.options.temperature=i),s&&(o.options??={},o.options.model_id=s),o}static async checkAccessPreconditions(){if(!navigator.onLine)return"no-internet";const e=await new Promise((e=>f.getSyncInformation((r=>e(r)))));return e.accountEmail?e.isSyncPaused?"sync-is-paused":"available":"no-account-email"}async*fetch(e,r){if(!f.doAidaConversation)throw new Error("doAidaConversation is not available");const t=(()=>{let{promise:e,resolve:t,reject:n}=Promise.withResolvers();return r?.signal?.addEventListener("abort",(()=>{n(new O)}),{once:!0}),{write:async r=>{t(r),({promise:e,resolve:t,reject:n}=Promise.withResolvers())},close:async()=>{t(null)},read:()=>e,fail:e=>n(e)}})(),n=m(t);let o;f.doAidaConversation(JSON.stringify(e),n,(e=>{403===e.statusCode?t.fail(new Error("Server responded: permission denied")):e.error?t.fail(new Error(`Cannot send request: ${e.error} ${e.detail||""}`)):"net::ERR_TIMED_OUT"===e.netErrorName?t.fail(new Error("doAidaConversation timed out")):200!==e.statusCode?t.fail(new Error(`Request failed: ${JSON.stringify(e)}`)):t.close()}));const s=[];let i=!1;const a=[];let d={rpcGlobalId:0};for(;o=await t.read();){let e,r=!1;if(o.length){o.startsWith(",")&&(o=o.slice(1)),o.startsWith("[")||(o="["+o),o.endsWith("]")||(o+="]");try{e=JSON.parse(o)}catch(e){throw new Error("Cannot parse chunk: "+o,{cause:e})}for(const t of e){if("metadata"in t&&(d=t.metadata,d?.attributionMetadata?.attributionAction===T.BLOCK))throw new N;if("textChunk"in t)i&&(s.push(_),i=!1),s.push(t.textChunk.text),r=!0;else if("codeChunk"in t)i||(s.push(_),i=!0),s.push(t.codeChunk.code),r=!0;else{if(!("functionCallChunk"in t))throw"error"in t?new Error(`Server responded: ${JSON.stringify(t)}`):new Error("Unknown chunk result");a.push({name:t.functionCallChunk.functionCall.name,args:t.functionCallChunk.functionCall.args})}}r&&(yield{explanation:s.join("")+(i?_:""),metadata:d,completed:!1})}}yield{explanation:s.join("")+(i?_:""),metadata:d,functionCalls:a.length?a:void 0,completed:!0}}registerClientEvent(e){const{promise:r,resolve:t}=Promise.withResolvers();return f.registerAidaClientEvent(JSON.stringify({client:M,event_time:(new Date).toISOString(),...e}),t),r}}let D;class H extends e.ObjectWrapper.ObjectWrapper{#t;#n;constructor(){super()}static instance(){return D||(D=new H),D}addEventListener(e,r){const t=!this.hasEventListeners(e),n=super.addEventListener(e,r);return t&&(window.clearTimeout(this.#t),this.pollAidaAvailability()),n}removeEventListener(e,r){super.removeEventListener(e,r),this.hasEventListeners(e)||window.clearTimeout(this.#t)}async pollAidaAvailability(){this.#t=window.setTimeout((()=>this.pollAidaAvailability()),2e3);const e=await L.checkAccessPreconditions();if(e!==this.#n){this.#n=e;const t=await new Promise((e=>f.getHostConfig(e)));Object.assign(r.Runtime.hostConfig,t),this.dispatchEventToListeners("aidaAvailabilityChanged")}}}var U=Object.freeze({__proto__:null,AidaAbortError:O,AidaBlockError:N,AidaClient:L,CLIENT_NAME:M,get CitationSourceType(){return x},get ClientFeature(){return P},get FunctionalityType(){return A},HostConfigTracker:H,get RecitationAction(){return T},get Role(){return b},get UserTier(){return R},convertToUserTierEnum:function(e){if(e)switch(e){case"TESTERS":return R.TESTERS;case"BETA":return R.BETA;case"PUBLIC":return R.PUBLIC}return R.BETA}});let W,B,V,G,j;function q(){return W||(W=f.platform()),W}var X=Object.freeze({__proto__:null,fontFamily:function(){if(j)return j;switch(q()){case"linux":j="Roboto, Ubuntu, Arial, sans-serif";break;case"mac":j="'Lucida Grande', sans-serif";break;case"windows":j="'Segoe UI', Tahoma, sans-serif"}return j},isCustomDevtoolsFrontend:function(){return void 0===G&&(G=window.location.toString().startsWith("devtools://devtools/custom/")),G},isMac:function(){return void 0===B&&(B="mac"===q()),B},isWin:function(){return void 0===V&&(V="windows"===q()),V},platform:q,setPlatformForTests:function(e){W=e,B=void 0,V=void 0}});let z=null;function K(){return null===z&&(z=new $),z}class ${#o="error";#s=new Set;#i=null;#a=null;#d="rn_inspector";#c={};#l=new Map;isEnabled(){return!0===globalThis.enableReactNativePerfMetrics}addEventListener(e){this.#s.add(e);return()=>{this.#s.delete(e)}}removeAllEventListeners(){this.#s.clear()}sendEvent(e){if(!0!==globalThis.enableReactNativePerfMetrics)return;const r=this.#u(e),t=[];for(const e of this.#s)try{e(r)}catch(e){t.push(e)}if(t.length>0){const e=new AggregateError(t);console.error("Error occurred when calling event listeners",e)}}registerPerfMetricsGlobalPostMessageHandler(){!0===globalThis.enableReactNativePerfMetrics&&!0===globalThis.enableReactNativePerfMetricsGlobalPostMessage&&this.addEventListener((e=>{window.postMessage({event:e,tag:"react-native-chrome-devtools-perf-metrics"},window.location.origin)}))}registerGlobalErrorReporting(){window.addEventListener("error",(e=>{const[r,t]=Y(`[RNPerfMetrics] uncaught error: ${e.message}`,e.error);this.sendEvent({eventName:"Browser.Error",params:{type:"error",message:r,error:t}})}),{passive:!0}),window.addEventListener("unhandledrejection",(e=>{const[r,t]=Y("[RNPerfMetrics] unhandled promise rejection",e.reason);this.sendEvent({eventName:"Browser.Error",params:{type:"rejectedPromise",message:r,error:t}})}),{passive:!0});const e=globalThis.console,r=e[this.#o];e[this.#o]=(...t)=>{try{const e=t[0],[r,n]=Y("[RNPerfMetrics] console.error",e);this.sendEvent({eventName:"Browser.Error",params:{message:r,error:n,type:"consoleError"}})}catch(e){const[r,t]=Y("[RNPerfMetrics] Error handling console.error",e);this.sendEvent({eventName:"Browser.Error",params:{message:r,error:t,type:"consoleError"}})}finally{r.apply(e,t)}}}setLaunchId(e){this.#i=e}setAppId(e){this.#a=e}setTelemetryInfo(e){this.#c=e}entryPointLoadingStarted(e){this.#d=e,this.sendEvent({eventName:"Entrypoint.LoadingStarted",entryPoint:e})}entryPointLoadingFinished(e){this.sendEvent({eventName:"Entrypoint.LoadingFinished",entryPoint:e})}browserVisibilityChanged(e){this.sendEvent({eventName:"Browser.VisibilityChange",params:{visibilityState:e}})}remoteDebuggingTerminated(e={}){this.sendEvent({eventName:"Connection.DebuggingTerminated",params:e})}developerResourceLoadingStarted(e,r){const t=Q(e);this.sendEvent({eventName:"DeveloperResource.LoadingStarted",params:{url:t,loadingMethod:r}})}developerResourceLoadingFinished(e,r,t){const n=Q(e);this.sendEvent({eventName:"DeveloperResource.LoadingFinished",params:{url:n,loadingMethod:r,success:t.success,errorMessage:t.errorDescription?.message}})}developerResourcesStartupLoadingFinishedEvent(e,r){this.sendEvent({eventName:"DeveloperResources.StartupLoadingFinished",params:{numResources:e,timeSinceLaunch:r}})}fuseboxSetClientMetadataStarted(){this.sendEvent({eventName:"FuseboxSetClientMetadataStarted"})}fuseboxSetClientMetadataFinished(e,r){if(e)this.sendEvent({eventName:"FuseboxSetClientMetadataFinished",params:{success:!0}});else{const[e,t]=Y("[RNPerfMetrics] Fusebox setClientMetadata failed",r);this.sendEvent({eventName:"FuseboxSetClientMetadataFinished",params:{success:!1,error:t,errorMessage:e}})}}traceRequested(){this.sendEvent({eventName:"Tracing.TraceRequested"})}heapSnapshotStarted(){this.sendEvent({eventName:"MemoryPanelActionStarted",params:{action:"snapshot"}})}heapSnapshotFinished(e){this.sendEvent({eventName:"MemoryPanelActionFinished",params:{action:"snapshot",success:e}})}heapProfilingStarted(){this.sendEvent({eventName:"MemoryPanelActionStarted",params:{action:"profiling"}})}heapProfilingFinished(e){this.sendEvent({eventName:"MemoryPanelActionFinished",params:{action:"profiling",success:e}})}heapSamplingStarted(){this.sendEvent({eventName:"MemoryPanelActionStarted",params:{action:"sampling"}})}heapSamplingFinished(e){this.sendEvent({eventName:"MemoryPanelActionFinished",params:{action:"sampling",success:e}})}stackTraceSymbolicationSucceeded(e){this.sendEvent({eventName:"StackTraceSymbolicationSucceeded",params:{specialHermesFrameTypes:e}})}stackTraceSymbolicationFailed(e,r,t){this.sendEvent({eventName:"StackTraceSymbolicationFailed",params:{stackTrace:e,line:r,reason:t}})}stackTraceFrameUrlResolutionSucceeded(){this.sendEvent({eventName:"StackTraceFrameUrlResolutionSucceeded"})}stackTraceFrameUrlResolutionFailed(e){this.sendEvent({eventName:"StackTraceFrameUrlResolutionFailed",params:{uniqueUrls:e}})}manualBreakpointSetSucceeded(e){this.sendEvent({eventName:"ManualBreakpointSetSucceeded",params:{bpSettingDuration:e}})}stackTraceFrameClicked(e){this.sendEvent({eventName:"StackTraceFrameClicked",params:{isLinkified:e}})}panelShown(e,r){}panelShownInLocation(e,r){this.sendEvent({eventName:"PanelShown",params:{location:r,newPanelName:e}}),this.#l.set(r,e)}#u(e){return{...e,...{timestamp:performance.timeOrigin+performance.now(),launchId:this.#i,appId:this.#a,entryPoint:this.#d,telemetryInfo:this.#c,currentPanels:this.#l}}}}function Q(e){const{url:r}=e;return"http"===e.scheme||"https"===e.scheme?r:`${r.slice(0,100)} …(omitted ${r.length-100} characters)`}function Y(e,r){if(r instanceof Error){return[`${e}: ${r.message}`,r]}const t=`${e}: ${String(r)}`;return[t,new Error(t,{cause:r})]}var J,Z,ee,re,te,ne,oe,se,ie,ae,de,ce,le,ue=Object.freeze({__proto__:null,getInstance:K});class me{#m;#g;#p;constructor(){this.#m=!1,this.#g=!1,this.#p=""}panelShown(e,r){const t=Z[e]||0;f.recordEnumeratedHistogram("DevTools.PanelShown",t,Z.MAX_VALUE),f.recordUserMetricsAction("DevTools_PanelShown_"+e),r||(this.#m=!0),K().panelShown(e,r)}panelShownInLocation(e,r){const t=ee[`${e}-${r}`]||0;f.recordEnumeratedHistogram("DevTools.PanelShownInLocation",t,ee.MAX_VALUE),K().panelShownInLocation(e,r)}settingsPanelShown(e){this.panelShown("settings-"+e)}sourcesPanelFileDebugged(e){const r=e&&te[e]||te.Unknown;f.recordEnumeratedHistogram("DevTools.SourcesPanelFileDebugged",r,te.MAX_VALUE)}sourcesPanelFileOpened(e){const r=e&&te[e]||te.Unknown;f.recordEnumeratedHistogram("DevTools.SourcesPanelFileOpened",r,te.MAX_VALUE)}networkPanelResponsePreviewOpened(e){const r=e&&te[e]||te.Unknown;f.recordEnumeratedHistogram("DevTools.NetworkPanelResponsePreviewOpened",r,te.MAX_VALUE)}actionTaken(e){f.recordEnumeratedHistogram("DevTools.ActionTaken",e,J.MAX_VALUE)}panelLoaded(e,r){this.#g||e!==this.#p||(this.#g=!0,requestAnimationFrame((()=>{window.setTimeout((()=>{performance.mark(r),this.#m||f.recordPerformanceHistogram(r,performance.now())}),0)})))}setLaunchPanel(e){this.#p=e}performanceTraceLoad(e){f.recordPerformanceHistogram("DevTools.TraceLoad",e.duration)}keybindSetSettingChanged(e){const r=ne[e]||0;f.recordEnumeratedHistogram("DevTools.KeybindSetSettingChanged",r,ne.MAX_VALUE)}keyboardShortcutFired(e){const r=oe[e]||oe.OtherShortcut;f.recordEnumeratedHistogram("DevTools.KeyboardShortcutFired",r,oe.MAX_VALUE)}issuesPanelOpenedFrom(e){f.recordEnumeratedHistogram("DevTools.IssuesPanelOpenedFrom",e,6)}issuesPanelIssueExpanded(e){if(void 0===e)return;const r=ie[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.IssuesPanelIssueExpanded",r,ie.MAX_VALUE)}issuesPanelResourceOpened(e,r){const t=ae[e+r];void 0!==t&&f.recordEnumeratedHistogram("DevTools.IssuesPanelResourceOpened",t,ae.MAX_VALUE)}issueCreated(e){const r=de[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.IssueCreated",r,de.MAX_VALUE)}experimentEnabledAtLaunch(e){const r=se[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.ExperimentEnabledAtLaunch",r,se.MAX_VALUE)}navigationSettingAtFirstTimelineLoad(e){f.recordEnumeratedHistogram("DevTools.TimelineNavigationSettingState",e,4)}experimentDisabledAtLaunch(e){const r=se[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.ExperimentDisabledAtLaunch",r,se.MAX_VALUE)}experimentChanged(e,r){const t=se[e];if(void 0===t)return;const n=r?"DevTools.ExperimentEnabled":"DevTools.ExperimentDisabled";f.recordEnumeratedHistogram(n,t,se.MAX_VALUE)}developerResourceLoaded(e){e>=8||f.recordEnumeratedHistogram("DevTools.DeveloperResourceLoaded",e,8)}developerResourceScheme(e){e>=9||f.recordEnumeratedHistogram("DevTools.DeveloperResourceScheme",e,9)}language(e){const r=ce[e];void 0!==r&&f.recordEnumeratedHistogram("DevTools.Language",r,ce.MAX_VALUE)}syncSetting(e){f.getSyncInformation((r=>{let t=1;r.isSyncActive&&!r.arePreferencesSynced?t=2:r.isSyncActive&&r.arePreferencesSynced&&(t=e?4:3),f.recordEnumeratedHistogram("DevTools.SyncSetting",t,5)}))}recordingAssertion(e){f.recordEnumeratedHistogram("DevTools.RecordingAssertion",e,4)}recordingToggled(e){f.recordEnumeratedHistogram("DevTools.RecordingToggled",e,3)}recordingReplayFinished(e){f.recordEnumeratedHistogram("DevTools.RecordingReplayFinished",e,5)}recordingReplaySpeed(e){f.recordEnumeratedHistogram("DevTools.RecordingReplaySpeed",e,5)}recordingReplayStarted(e){f.recordEnumeratedHistogram("DevTools.RecordingReplayStarted",e,4)}recordingEdited(e){f.recordEnumeratedHistogram("DevTools.RecordingEdited",e,11)}recordingExported(e){f.recordEnumeratedHistogram("DevTools.RecordingExported",e,6)}recordingCodeToggled(e){f.recordEnumeratedHistogram("DevTools.RecordingCodeToggled",e,3)}recordingCopiedToClipboard(e){f.recordEnumeratedHistogram("DevTools.RecordingCopiedToClipboard",e,9)}cssHintShown(e){f.recordEnumeratedHistogram("DevTools.CSSHintShown",e,14)}lighthouseModeRun(e){f.recordEnumeratedHistogram("DevTools.LighthouseModeRun",e,4)}lighthouseCategoryUsed(e){f.recordEnumeratedHistogram("DevTools.LighthouseCategoryUsed",e,6)}swatchActivated(e){f.recordEnumeratedHistogram("DevTools.SwatchActivated",e,11)}animationPlaybackRateChanged(e){f.recordEnumeratedHistogram("DevTools.AnimationPlaybackRateChanged",e,4)}animationPointDragged(e){f.recordEnumeratedHistogram("DevTools.AnimationPointDragged",e,5)}workspacesPopulated(e){f.recordPerformanceHistogram("DevTools.Workspaces.PopulateWallClocktime",e)}visualLoggingProcessingDone(e){f.recordPerformanceHistogram("DevTools.VisualLogging.ProcessingTime",e)}freestylerQueryLength(e){f.recordCountHistogram("DevTools.Freestyler.QueryLength",e,0,1e5,100)}freestylerEvalResponseSize(e){f.recordCountHistogram("DevTools.Freestyler.EvalResponseSize",e,0,1e5,100)}}!function(e){e[e.WindowDocked=1]="WindowDocked",e[e.WindowUndocked=2]="WindowUndocked",e[e.ScriptsBreakpointSet=3]="ScriptsBreakpointSet",e[e.TimelineStarted=4]="TimelineStarted",e[e.ProfilesCPUProfileTaken=5]="ProfilesCPUProfileTaken",e[e.ProfilesHeapProfileTaken=6]="ProfilesHeapProfileTaken",e[e.ConsoleEvaluated=8]="ConsoleEvaluated",e[e.FileSavedInWorkspace=9]="FileSavedInWorkspace",e[e.DeviceModeEnabled=10]="DeviceModeEnabled",e[e.AnimationsPlaybackRateChanged=11]="AnimationsPlaybackRateChanged",e[e.RevisionApplied=12]="RevisionApplied",e[e.FileSystemDirectoryContentReceived=13]="FileSystemDirectoryContentReceived",e[e.StyleRuleEdited=14]="StyleRuleEdited",e[e.CommandEvaluatedInConsolePanel=15]="CommandEvaluatedInConsolePanel",e[e.DOMPropertiesExpanded=16]="DOMPropertiesExpanded",e[e.ResizedViewInResponsiveMode=17]="ResizedViewInResponsiveMode",e[e.TimelinePageReloadStarted=18]="TimelinePageReloadStarted",e[e.ConnectToNodeJSFromFrontend=19]="ConnectToNodeJSFromFrontend",e[e.ConnectToNodeJSDirectly=20]="ConnectToNodeJSDirectly",e[e.CpuThrottlingEnabled=21]="CpuThrottlingEnabled",e[e.CpuProfileNodeFocused=22]="CpuProfileNodeFocused",e[e.CpuProfileNodeExcluded=23]="CpuProfileNodeExcluded",e[e.SelectFileFromFilePicker=24]="SelectFileFromFilePicker",e[e.SelectCommandFromCommandMenu=25]="SelectCommandFromCommandMenu",e[e.ChangeInspectedNodeInElementsPanel=26]="ChangeInspectedNodeInElementsPanel",e[e.StyleRuleCopied=27]="StyleRuleCopied",e[e.CoverageStarted=28]="CoverageStarted",e[e.LighthouseStarted=29]="LighthouseStarted",e[e.LighthouseFinished=30]="LighthouseFinished",e[e.ShowedThirdPartyBadges=31]="ShowedThirdPartyBadges",e[e.LighthouseViewTrace=32]="LighthouseViewTrace",e[e.FilmStripStartedRecording=33]="FilmStripStartedRecording",e[e.CoverageReportFiltered=34]="CoverageReportFiltered",e[e.CoverageStartedPerBlock=35]="CoverageStartedPerBlock",e[e["SettingsOpenedFromGear-deprecated"]=36]="SettingsOpenedFromGear-deprecated",e[e["SettingsOpenedFromMenu-deprecated"]=37]="SettingsOpenedFromMenu-deprecated",e[e["SettingsOpenedFromCommandMenu-deprecated"]=38]="SettingsOpenedFromCommandMenu-deprecated",e[e.TabMovedToDrawer=39]="TabMovedToDrawer",e[e.TabMovedToMainPanel=40]="TabMovedToMainPanel",e[e.CaptureCssOverviewClicked=41]="CaptureCssOverviewClicked",e[e.VirtualAuthenticatorEnvironmentEnabled=42]="VirtualAuthenticatorEnvironmentEnabled",e[e.SourceOrderViewActivated=43]="SourceOrderViewActivated",e[e.UserShortcutAdded=44]="UserShortcutAdded",e[e.ShortcutRemoved=45]="ShortcutRemoved",e[e.ShortcutModified=46]="ShortcutModified",e[e.CustomPropertyLinkClicked=47]="CustomPropertyLinkClicked",e[e.CustomPropertyEdited=48]="CustomPropertyEdited",e[e.ServiceWorkerNetworkRequestClicked=49]="ServiceWorkerNetworkRequestClicked",e[e.ServiceWorkerNetworkRequestClosedQuickly=50]="ServiceWorkerNetworkRequestClosedQuickly",e[e.NetworkPanelServiceWorkerRespondWith=51]="NetworkPanelServiceWorkerRespondWith",e[e.NetworkPanelCopyValue=52]="NetworkPanelCopyValue",e[e.ConsoleSidebarOpened=53]="ConsoleSidebarOpened",e[e.PerfPanelTraceImported=54]="PerfPanelTraceImported",e[e.PerfPanelTraceExported=55]="PerfPanelTraceExported",e[e.StackFrameRestarted=56]="StackFrameRestarted",e[e.CaptureTestProtocolClicked=57]="CaptureTestProtocolClicked",e[e.BreakpointRemovedFromRemoveButton=58]="BreakpointRemovedFromRemoveButton",e[e.BreakpointGroupExpandedStateChanged=59]="BreakpointGroupExpandedStateChanged",e[e.HeaderOverrideFileCreated=60]="HeaderOverrideFileCreated",e[e.HeaderOverrideEnableEditingClicked=61]="HeaderOverrideEnableEditingClicked",e[e.HeaderOverrideHeaderAdded=62]="HeaderOverrideHeaderAdded",e[e.HeaderOverrideHeaderEdited=63]="HeaderOverrideHeaderEdited",e[e.HeaderOverrideHeaderRemoved=64]="HeaderOverrideHeaderRemoved",e[e.HeaderOverrideHeadersFileEdited=65]="HeaderOverrideHeadersFileEdited",e[e.PersistenceNetworkOverridesEnabled=66]="PersistenceNetworkOverridesEnabled",e[e.PersistenceNetworkOverridesDisabled=67]="PersistenceNetworkOverridesDisabled",e[e.BreakpointRemovedFromContextMenu=68]="BreakpointRemovedFromContextMenu",e[e.BreakpointsInFileRemovedFromRemoveButton=69]="BreakpointsInFileRemovedFromRemoveButton",e[e.BreakpointsInFileRemovedFromContextMenu=70]="BreakpointsInFileRemovedFromContextMenu",e[e.BreakpointsInFileCheckboxToggled=71]="BreakpointsInFileCheckboxToggled",e[e.BreakpointsInFileEnabledDisabledFromContextMenu=72]="BreakpointsInFileEnabledDisabledFromContextMenu",e[e.BreakpointConditionEditedFromSidebar=73]="BreakpointConditionEditedFromSidebar",e[e.WorkspaceTabAddFolder=74]="WorkspaceTabAddFolder",e[e.WorkspaceTabRemoveFolder=75]="WorkspaceTabRemoveFolder",e[e.OverrideTabAddFolder=76]="OverrideTabAddFolder",e[e.OverrideTabRemoveFolder=77]="OverrideTabRemoveFolder",e[e.WorkspaceSourceSelected=78]="WorkspaceSourceSelected",e[e.OverridesSourceSelected=79]="OverridesSourceSelected",e[e.StyleSheetInitiatorLinkClicked=80]="StyleSheetInitiatorLinkClicked",e[e.BreakpointRemovedFromGutterContextMenu=81]="BreakpointRemovedFromGutterContextMenu",e[e.BreakpointRemovedFromGutterToggle=82]="BreakpointRemovedFromGutterToggle",e[e.StylePropertyInsideKeyframeEdited=83]="StylePropertyInsideKeyframeEdited",e[e.OverrideContentFromSourcesContextMenu=84]="OverrideContentFromSourcesContextMenu",e[e.OverrideContentFromNetworkContextMenu=85]="OverrideContentFromNetworkContextMenu",e[e.OverrideScript=86]="OverrideScript",e[e.OverrideStyleSheet=87]="OverrideStyleSheet",e[e.OverrideDocument=88]="OverrideDocument",e[e.OverrideFetchXHR=89]="OverrideFetchXHR",e[e.OverrideImage=90]="OverrideImage",e[e.OverrideFont=91]="OverrideFont",e[e.OverrideContentContextMenuSetup=92]="OverrideContentContextMenuSetup",e[e.OverrideContentContextMenuAbandonSetup=93]="OverrideContentContextMenuAbandonSetup",e[e.OverrideContentContextMenuActivateDisabled=94]="OverrideContentContextMenuActivateDisabled",e[e.OverrideContentContextMenuOpenExistingFile=95]="OverrideContentContextMenuOpenExistingFile",e[e.OverrideContentContextMenuSaveNewFile=96]="OverrideContentContextMenuSaveNewFile",e[e.ShowAllOverridesFromSourcesContextMenu=97]="ShowAllOverridesFromSourcesContextMenu",e[e.ShowAllOverridesFromNetworkContextMenu=98]="ShowAllOverridesFromNetworkContextMenu",e[e.AnimationGroupsCleared=99]="AnimationGroupsCleared",e[e.AnimationsPaused=100]="AnimationsPaused",e[e.AnimationsResumed=101]="AnimationsResumed",e[e.AnimatedNodeDescriptionClicked=102]="AnimatedNodeDescriptionClicked",e[e.AnimationGroupScrubbed=103]="AnimationGroupScrubbed",e[e.AnimationGroupReplayed=104]="AnimationGroupReplayed",e[e.OverrideTabDeleteFolderContextMenu=105]="OverrideTabDeleteFolderContextMenu",e[e.WorkspaceDropFolder=107]="WorkspaceDropFolder",e[e.WorkspaceSelectFolder=108]="WorkspaceSelectFolder",e[e.OverrideContentContextMenuSourceMappedWarning=109]="OverrideContentContextMenuSourceMappedWarning",e[e.OverrideContentContextMenuRedirectToDeployed=110]="OverrideContentContextMenuRedirectToDeployed",e[e.NewStyleRuleAdded=111]="NewStyleRuleAdded",e[e.TraceExpanded=112]="TraceExpanded",e[e.InsightConsoleMessageShown=113]="InsightConsoleMessageShown",e[e.InsightRequestedViaContextMenu=114]="InsightRequestedViaContextMenu",e[e.InsightRequestedViaHoverButton=115]="InsightRequestedViaHoverButton",e[e.InsightRatedPositive=117]="InsightRatedPositive",e[e.InsightRatedNegative=118]="InsightRatedNegative",e[e.InsightClosed=119]="InsightClosed",e[e.InsightErrored=120]="InsightErrored",e[e.InsightHoverButtonShown=121]="InsightHoverButtonShown",e[e.SelfXssWarningConsoleMessageShown=122]="SelfXssWarningConsoleMessageShown",e[e.SelfXssWarningDialogShown=123]="SelfXssWarningDialogShown",e[e.SelfXssAllowPastingInConsole=124]="SelfXssAllowPastingInConsole",e[e.SelfXssAllowPastingInDialog=125]="SelfXssAllowPastingInDialog",e[e.ToggleEmulateFocusedPageFromStylesPaneOn=126]="ToggleEmulateFocusedPageFromStylesPaneOn",e[e.ToggleEmulateFocusedPageFromStylesPaneOff=127]="ToggleEmulateFocusedPageFromStylesPaneOff",e[e.ToggleEmulateFocusedPageFromRenderingTab=128]="ToggleEmulateFocusedPageFromRenderingTab",e[e.ToggleEmulateFocusedPageFromCommandMenu=129]="ToggleEmulateFocusedPageFromCommandMenu",e[e.InsightGenerated=130]="InsightGenerated",e[e.InsightErroredApi=131]="InsightErroredApi",e[e.InsightErroredMarkdown=132]="InsightErroredMarkdown",e[e.ToggleShowWebVitals=133]="ToggleShowWebVitals",e[e.InsightErroredPermissionDenied=134]="InsightErroredPermissionDenied",e[e.InsightErroredCannotSend=135]="InsightErroredCannotSend",e[e.InsightErroredRequestFailed=136]="InsightErroredRequestFailed",e[e.InsightErroredCannotParseChunk=137]="InsightErroredCannotParseChunk",e[e.InsightErroredUnknownChunk=138]="InsightErroredUnknownChunk",e[e.InsightErroredOther=139]="InsightErroredOther",e[e.AutofillReceived=140]="AutofillReceived",e[e.AutofillReceivedAndTabAutoOpened=141]="AutofillReceivedAndTabAutoOpened",e[e.AnimationGroupSelected=142]="AnimationGroupSelected",e[e.ScrollDrivenAnimationGroupSelected=143]="ScrollDrivenAnimationGroupSelected",e[e.ScrollDrivenAnimationGroupScrubbed=144]="ScrollDrivenAnimationGroupScrubbed",e[e.AiAssistanceOpenedFromElementsPanel=145]="AiAssistanceOpenedFromElementsPanel",e[e.AiAssistanceOpenedFromStylesTab=146]="AiAssistanceOpenedFromStylesTab",e[e.ConsoleFilterByContext=147]="ConsoleFilterByContext",e[e.ConsoleFilterBySource=148]="ConsoleFilterBySource",e[e.ConsoleFilterByUrl=149]="ConsoleFilterByUrl",e[e.InsightConsentReminderShown=150]="InsightConsentReminderShown",e[e.InsightConsentReminderCanceled=151]="InsightConsentReminderCanceled",e[e.InsightConsentReminderConfirmed=152]="InsightConsentReminderConfirmed",e[e.InsightsOnboardingShown=153]="InsightsOnboardingShown",e[e.InsightsOnboardingCanceledOnPage1=154]="InsightsOnboardingCanceledOnPage1",e[e.InsightsOnboardingCanceledOnPage2=155]="InsightsOnboardingCanceledOnPage2",e[e.InsightsOnboardingConfirmed=156]="InsightsOnboardingConfirmed",e[e.InsightsOnboardingNextPage=157]="InsightsOnboardingNextPage",e[e.InsightsOnboardingPrevPage=158]="InsightsOnboardingPrevPage",e[e.InsightsOnboardingFeatureDisabled=159]="InsightsOnboardingFeatureDisabled",e[e.InsightsOptInTeaserShown=160]="InsightsOptInTeaserShown",e[e.InsightsOptInTeaserSettingsLinkClicked=161]="InsightsOptInTeaserSettingsLinkClicked",e[e.InsightsOptInTeaserConfirmedInSettings=162]="InsightsOptInTeaserConfirmedInSettings",e[e.InsightsReminderTeaserShown=163]="InsightsReminderTeaserShown",e[e.InsightsReminderTeaserConfirmed=164]="InsightsReminderTeaserConfirmed",e[e.InsightsReminderTeaserCanceled=165]="InsightsReminderTeaserCanceled",e[e.InsightsReminderTeaserSettingsLinkClicked=166]="InsightsReminderTeaserSettingsLinkClicked",e[e.InsightsReminderTeaserAbortedInSettings=167]="InsightsReminderTeaserAbortedInSettings",e[e.GeneratingInsightWithoutDisclaimer=168]="GeneratingInsightWithoutDisclaimer",e[e.AiAssistanceOpenedFromElementsPanelFloatingButton=169]="AiAssistanceOpenedFromElementsPanelFloatingButton",e[e.AiAssistanceOpenedFromNetworkPanel=170]="AiAssistanceOpenedFromNetworkPanel",e[e.AiAssistanceOpenedFromSourcesPanel=171]="AiAssistanceOpenedFromSourcesPanel",e[e.AiAssistanceOpenedFromSourcesPanelFloatingButton=172]="AiAssistanceOpenedFromSourcesPanelFloatingButton",e[e.AiAssistanceOpenedFromPerformancePanel=173]="AiAssistanceOpenedFromPerformancePanel",e[e.AiAssistanceOpenedFromNetworkPanelFloatingButton=174]="AiAssistanceOpenedFromNetworkPanelFloatingButton",e[e.AiAssistancePanelOpened=175]="AiAssistancePanelOpened",e[e.AiAssistanceQuerySubmitted=176]="AiAssistanceQuerySubmitted",e[e.AiAssistanceAnswerReceived=177]="AiAssistanceAnswerReceived",e[e.AiAssistanceDynamicSuggestionClicked=178]="AiAssistanceDynamicSuggestionClicked",e[e.AiAssistanceSideEffectConfirmed=179]="AiAssistanceSideEffectConfirmed",e[e.AiAssistanceSideEffectRejected=180]="AiAssistanceSideEffectRejected",e[e.AiAssistanceError=181]="AiAssistanceError",e[e.AiAssistanceOpenedFromPerformanceInsight=182]="AiAssistanceOpenedFromPerformanceInsight",e[e.MAX_VALUE=183]="MAX_VALUE"}(J||(J={})),function(e){e[e.elements=1]="elements",e[e.resources=2]="resources",e[e.network=3]="network",e[e.sources=4]="sources",e[e.timeline=5]="timeline",e[e["heap-profiler"]=6]="heap-profiler",e[e.console=8]="console",e[e.layers=9]="layers",e[e["console-view"]=10]="console-view",e[e.animations=11]="animations",e[e["network.config"]=12]="network.config",e[e.rendering=13]="rendering",e[e.sensors=14]="sensors",e[e["sources.search"]=15]="sources.search",e[e.security=16]="security",e[e["js-profiler"]=17]="js-profiler",e[e.lighthouse=18]="lighthouse",e[e.coverage=19]="coverage",e[e["protocol-monitor"]=20]="protocol-monitor",e[e["remote-devices"]=21]="remote-devices",e[e["web-audio"]=22]="web-audio",e[e["changes.changes"]=23]="changes.changes",e[e["performance.monitor"]=24]="performance.monitor",e[e["release-note"]=25]="release-note",e[e["live-heap-profile"]=26]="live-heap-profile",e[e["sources.quick"]=27]="sources.quick",e[e["network.blocked-urls"]=28]="network.blocked-urls",e[e["settings-preferences"]=29]="settings-preferences",e[e["settings-workspace"]=30]="settings-workspace",e[e["settings-experiments"]=31]="settings-experiments",e[e["settings-blackbox"]=32]="settings-blackbox",e[e["settings-devices"]=33]="settings-devices",e[e["settings-throttling-conditions"]=34]="settings-throttling-conditions",e[e["settings-emulation-locations"]=35]="settings-emulation-locations",e[e["settings-shortcuts"]=36]="settings-shortcuts",e[e["issues-pane"]=37]="issues-pane",e[e["settings-keybinds"]=38]="settings-keybinds",e[e.cssoverview=39]="cssoverview",e[e["chrome-recorder"]=40]="chrome-recorder",e[e["trust-tokens"]=41]="trust-tokens",e[e["reporting-api"]=42]="reporting-api",e[e["interest-groups"]=43]="interest-groups",e[e["back-forward-cache"]=44]="back-forward-cache",e[e["service-worker-cache"]=45]="service-worker-cache",e[e["background-service-background-fetch"]=46]="background-service-background-fetch",e[e["background-service-background-sync"]=47]="background-service-background-sync",e[e["background-service-push-messaging"]=48]="background-service-push-messaging",e[e["background-service-notifications"]=49]="background-service-notifications",e[e["background-service-payment-handler"]=50]="background-service-payment-handler",e[e["background-service-periodic-background-sync"]=51]="background-service-periodic-background-sync",e[e["service-workers"]=52]="service-workers",e[e["app-manifest"]=53]="app-manifest",e[e.storage=54]="storage",e[e.cookies=55]="cookies",e[e["frame-details"]=56]="frame-details",e[e["frame-resource"]=57]="frame-resource",e[e["frame-window"]=58]="frame-window",e[e["frame-worker"]=59]="frame-worker",e[e["dom-storage"]=60]="dom-storage",e[e["indexed-db"]=61]="indexed-db",e[e["web-sql"]=62]="web-sql",e[e["performance-insights"]=63]="performance-insights",e[e.preloading=64]="preloading",e[e["bounce-tracking-mitigations"]=65]="bounce-tracking-mitigations",e[e["developer-resources"]=66]="developer-resources",e[e["autofill-view"]=67]="autofill-view",e[e.MAX_VALUE=68]="MAX_VALUE"}(Z||(Z={})),function(e){e[e["elements-main"]=1]="elements-main",e[e["elements-drawer"]=2]="elements-drawer",e[e["resources-main"]=3]="resources-main",e[e["resources-drawer"]=4]="resources-drawer",e[e["network-main"]=5]="network-main",e[e["network-drawer"]=6]="network-drawer",e[e["sources-main"]=7]="sources-main",e[e["sources-drawer"]=8]="sources-drawer",e[e["timeline-main"]=9]="timeline-main",e[e["timeline-drawer"]=10]="timeline-drawer",e[e["heap_profiler-main"]=11]="heap_profiler-main",e[e["heap_profiler-drawer"]=12]="heap_profiler-drawer",e[e["console-main"]=13]="console-main",e[e["console-drawer"]=14]="console-drawer",e[e["layers-main"]=15]="layers-main",e[e["layers-drawer"]=16]="layers-drawer",e[e["console-view-main"]=17]="console-view-main",e[e["console-view-drawer"]=18]="console-view-drawer",e[e["animations-main"]=19]="animations-main",e[e["animations-drawer"]=20]="animations-drawer",e[e["network.config-main"]=21]="network.config-main",e[e["network.config-drawer"]=22]="network.config-drawer",e[e["rendering-main"]=23]="rendering-main",e[e["rendering-drawer"]=24]="rendering-drawer",e[e["sensors-main"]=25]="sensors-main",e[e["sensors-drawer"]=26]="sensors-drawer",e[e["sources.search-main"]=27]="sources.search-main",e[e["sources.search-drawer"]=28]="sources.search-drawer",e[e["security-main"]=29]="security-main",e[e["security-drawer"]=30]="security-drawer",e[e["lighthouse-main"]=33]="lighthouse-main",e[e["lighthouse-drawer"]=34]="lighthouse-drawer",e[e["coverage-main"]=35]="coverage-main",e[e["coverage-drawer"]=36]="coverage-drawer",e[e["protocol-monitor-main"]=37]="protocol-monitor-main",e[e["protocol-monitor-drawer"]=38]="protocol-monitor-drawer",e[e["remote-devices-main"]=39]="remote-devices-main",e[e["remote-devices-drawer"]=40]="remote-devices-drawer",e[e["web-audio-main"]=41]="web-audio-main",e[e["web-audio-drawer"]=42]="web-audio-drawer",e[e["changes.changes-main"]=43]="changes.changes-main",e[e["changes.changes-drawer"]=44]="changes.changes-drawer",e[e["performance.monitor-main"]=45]="performance.monitor-main",e[e["performance.monitor-drawer"]=46]="performance.monitor-drawer",e[e["release-note-main"]=47]="release-note-main",e[e["release-note-drawer"]=48]="release-note-drawer",e[e["live_heap_profile-main"]=49]="live_heap_profile-main",e[e["live_heap_profile-drawer"]=50]="live_heap_profile-drawer",e[e["sources.quick-main"]=51]="sources.quick-main",e[e["sources.quick-drawer"]=52]="sources.quick-drawer",e[e["network.blocked-urls-main"]=53]="network.blocked-urls-main",e[e["network.blocked-urls-drawer"]=54]="network.blocked-urls-drawer",e[e["settings-preferences-main"]=55]="settings-preferences-main",e[e["settings-preferences-drawer"]=56]="settings-preferences-drawer",e[e["settings-workspace-main"]=57]="settings-workspace-main",e[e["settings-workspace-drawer"]=58]="settings-workspace-drawer",e[e["settings-experiments-main"]=59]="settings-experiments-main",e[e["settings-experiments-drawer"]=60]="settings-experiments-drawer",e[e["settings-blackbox-main"]=61]="settings-blackbox-main",e[e["settings-blackbox-drawer"]=62]="settings-blackbox-drawer",e[e["settings-devices-main"]=63]="settings-devices-main",e[e["settings-devices-drawer"]=64]="settings-devices-drawer",e[e["settings-throttling-conditions-main"]=65]="settings-throttling-conditions-main",e[e["settings-throttling-conditions-drawer"]=66]="settings-throttling-conditions-drawer",e[e["settings-emulation-locations-main"]=67]="settings-emulation-locations-main",e[e["settings-emulation-locations-drawer"]=68]="settings-emulation-locations-drawer",e[e["settings-shortcuts-main"]=69]="settings-shortcuts-main",e[e["settings-shortcuts-drawer"]=70]="settings-shortcuts-drawer",e[e["issues-pane-main"]=71]="issues-pane-main",e[e["issues-pane-drawer"]=72]="issues-pane-drawer",e[e["settings-keybinds-main"]=73]="settings-keybinds-main",e[e["settings-keybinds-drawer"]=74]="settings-keybinds-drawer",e[e["cssoverview-main"]=75]="cssoverview-main",e[e["cssoverview-drawer"]=76]="cssoverview-drawer",e[e["chrome_recorder-main"]=77]="chrome_recorder-main",e[e["chrome_recorder-drawer"]=78]="chrome_recorder-drawer",e[e["trust_tokens-main"]=79]="trust_tokens-main",e[e["trust_tokens-drawer"]=80]="trust_tokens-drawer",e[e["reporting_api-main"]=81]="reporting_api-main",e[e["reporting_api-drawer"]=82]="reporting_api-drawer",e[e["interest_groups-main"]=83]="interest_groups-main",e[e["interest_groups-drawer"]=84]="interest_groups-drawer",e[e["back_forward_cache-main"]=85]="back_forward_cache-main",e[e["back_forward_cache-drawer"]=86]="back_forward_cache-drawer",e[e["service_worker_cache-main"]=87]="service_worker_cache-main",e[e["service_worker_cache-drawer"]=88]="service_worker_cache-drawer",e[e["background_service_backgroundFetch-main"]=89]="background_service_backgroundFetch-main",e[e["background_service_backgroundFetch-drawer"]=90]="background_service_backgroundFetch-drawer",e[e["background_service_backgroundSync-main"]=91]="background_service_backgroundSync-main",e[e["background_service_backgroundSync-drawer"]=92]="background_service_backgroundSync-drawer",e[e["background_service_pushMessaging-main"]=93]="background_service_pushMessaging-main",e[e["background_service_pushMessaging-drawer"]=94]="background_service_pushMessaging-drawer",e[e["background_service_notifications-main"]=95]="background_service_notifications-main",e[e["background_service_notifications-drawer"]=96]="background_service_notifications-drawer",e[e["background_service_paymentHandler-main"]=97]="background_service_paymentHandler-main",e[e["background_service_paymentHandler-drawer"]=98]="background_service_paymentHandler-drawer",e[e["background_service_periodicBackgroundSync-main"]=99]="background_service_periodicBackgroundSync-main",e[e["background_service_periodicBackgroundSync-drawer"]=100]="background_service_periodicBackgroundSync-drawer",e[e["service_workers-main"]=101]="service_workers-main",e[e["service_workers-drawer"]=102]="service_workers-drawer",e[e["app_manifest-main"]=103]="app_manifest-main",e[e["app_manifest-drawer"]=104]="app_manifest-drawer",e[e["storage-main"]=105]="storage-main",e[e["storage-drawer"]=106]="storage-drawer",e[e["cookies-main"]=107]="cookies-main",e[e["cookies-drawer"]=108]="cookies-drawer",e[e["frame_details-main"]=109]="frame_details-main",e[e["frame_details-drawer"]=110]="frame_details-drawer",e[e["frame_resource-main"]=111]="frame_resource-main",e[e["frame_resource-drawer"]=112]="frame_resource-drawer",e[e["frame_window-main"]=113]="frame_window-main",e[e["frame_window-drawer"]=114]="frame_window-drawer",e[e["frame_worker-main"]=115]="frame_worker-main",e[e["frame_worker-drawer"]=116]="frame_worker-drawer",e[e["dom_storage-main"]=117]="dom_storage-main",e[e["dom_storage-drawer"]=118]="dom_storage-drawer",e[e["indexed_db-main"]=119]="indexed_db-main",e[e["indexed_db-drawer"]=120]="indexed_db-drawer",e[e["web_sql-main"]=121]="web_sql-main",e[e["web_sql-drawer"]=122]="web_sql-drawer",e[e["performance_insights-main"]=123]="performance_insights-main",e[e["performance_insights-drawer"]=124]="performance_insights-drawer",e[e["preloading-main"]=125]="preloading-main",e[e["preloading-drawer"]=126]="preloading-drawer",e[e["bounce_tracking_mitigations-main"]=127]="bounce_tracking_mitigations-main",e[e["bounce_tracking_mitigations-drawer"]=128]="bounce_tracking_mitigations-drawer",e[e["developer-resources-main"]=129]="developer-resources-main",e[e["developer-resources-drawer"]=130]="developer-resources-drawer",e[e["autofill-view-main"]=131]="autofill-view-main",e[e["autofill-view-drawer"]=132]="autofill-view-drawer",e[e.MAX_VALUE=133]="MAX_VALUE"}(ee||(ee={})),function(e){e[e.OtherSidebarPane=0]="OtherSidebarPane",e[e.styles=1]="styles",e[e.computed=2]="computed",e[e["elements.layout"]=3]="elements.layout",e[e["elements.event-listeners"]=4]="elements.event-listeners",e[e["elements.dom-breakpoints"]=5]="elements.dom-breakpoints",e[e["elements.dom-properties"]=6]="elements.dom-properties",e[e["accessibility.view"]=7]="accessibility.view",e[e.MAX_VALUE=8]="MAX_VALUE"}(re||(re={})),function(e){e[e.Unknown=0]="Unknown",e[e["text/css"]=2]="text/css",e[e["text/html"]=3]="text/html",e[e["application/xml"]=4]="application/xml",e[e["application/wasm"]=5]="application/wasm",e[e["application/manifest+json"]=6]="application/manifest+json",e[e["application/x-aspx"]=7]="application/x-aspx",e[e["application/jsp"]=8]="application/jsp",e[e["text/x-c++src"]=9]="text/x-c++src",e[e["text/x-coffeescript"]=10]="text/x-coffeescript",e[e["application/vnd.dart"]=11]="application/vnd.dart",e[e["text/typescript"]=12]="text/typescript",e[e["text/typescript-jsx"]=13]="text/typescript-jsx",e[e["application/json"]=14]="application/json",e[e["text/x-csharp"]=15]="text/x-csharp",e[e["text/x-java"]=16]="text/x-java",e[e["text/x-less"]=17]="text/x-less",e[e["application/x-httpd-php"]=18]="application/x-httpd-php",e[e["text/x-python"]=19]="text/x-python",e[e["text/x-sh"]=20]="text/x-sh",e[e["text/x-gss"]=21]="text/x-gss",e[e["text/x-sass"]=22]="text/x-sass",e[e["text/x-scss"]=23]="text/x-scss",e[e["text/markdown"]=24]="text/markdown",e[e["text/x-clojure"]=25]="text/x-clojure",e[e["text/jsx"]=26]="text/jsx",e[e["text/x-go"]=27]="text/x-go",e[e["text/x-kotlin"]=28]="text/x-kotlin",e[e["text/x-scala"]=29]="text/x-scala",e[e["text/x.svelte"]=30]="text/x.svelte",e[e["text/javascript+plain"]=31]="text/javascript+plain",e[e["text/javascript+minified"]=32]="text/javascript+minified",e[e["text/javascript+sourcemapped"]=33]="text/javascript+sourcemapped",e[e["text/x.angular"]=34]="text/x.angular",e[e["text/x.vue"]=35]="text/x.vue",e[e["text/javascript+snippet"]=36]="text/javascript+snippet",e[e["text/javascript+eval"]=37]="text/javascript+eval",e[e.MAX_VALUE=38]="MAX_VALUE"}(te||(te={})),function(e){e[e.devToolsDefault=0]="devToolsDefault",e[e.vsCode=1]="vsCode",e[e.MAX_VALUE=2]="MAX_VALUE"}(ne||(ne={})),function(e){e[e.OtherShortcut=0]="OtherShortcut",e[e["quick-open.show-command-menu"]=1]="quick-open.show-command-menu",e[e["console.clear"]=2]="console.clear",e[e["console.toggle"]=3]="console.toggle",e[e["debugger.step"]=4]="debugger.step",e[e["debugger.step-into"]=5]="debugger.step-into",e[e["debugger.step-out"]=6]="debugger.step-out",e[e["debugger.step-over"]=7]="debugger.step-over",e[e["debugger.toggle-breakpoint"]=8]="debugger.toggle-breakpoint",e[e["debugger.toggle-breakpoint-enabled"]=9]="debugger.toggle-breakpoint-enabled",e[e["debugger.toggle-pause"]=10]="debugger.toggle-pause",e[e["elements.edit-as-html"]=11]="elements.edit-as-html",e[e["elements.hide-element"]=12]="elements.hide-element",e[e["elements.redo"]=13]="elements.redo",e[e["elements.toggle-element-search"]=14]="elements.toggle-element-search",e[e["elements.undo"]=15]="elements.undo",e[e["main.search-in-panel.find"]=16]="main.search-in-panel.find",e[e["main.toggle-drawer"]=17]="main.toggle-drawer",e[e["network.hide-request-details"]=18]="network.hide-request-details",e[e["network.search"]=19]="network.search",e[e["network.toggle-recording"]=20]="network.toggle-recording",e[e["quick-open.show"]=21]="quick-open.show",e[e["settings.show"]=22]="settings.show",e[e["sources.search"]=23]="sources.search",e[e["background-service.toggle-recording"]=24]="background-service.toggle-recording",e[e["components.collect-garbage"]=25]="components.collect-garbage",e[e["console.clear.history"]=26]="console.clear.history",e[e["console.create-pin"]=27]="console.create-pin",e[e["coverage.start-with-reload"]=28]="coverage.start-with-reload",e[e["coverage.toggle-recording"]=29]="coverage.toggle-recording",e[e["debugger.breakpoint-input-window"]=30]="debugger.breakpoint-input-window",e[e["debugger.evaluate-selection"]=31]="debugger.evaluate-selection",e[e["debugger.next-call-frame"]=32]="debugger.next-call-frame",e[e["debugger.previous-call-frame"]=33]="debugger.previous-call-frame",e[e["debugger.run-snippet"]=34]="debugger.run-snippet",e[e["debugger.toggle-breakpoints-active"]=35]="debugger.toggle-breakpoints-active",e[e["elements.capture-area-screenshot"]=36]="elements.capture-area-screenshot",e[e["emulation.capture-full-height-screenshot"]=37]="emulation.capture-full-height-screenshot",e[e["emulation.capture-node-screenshot"]=38]="emulation.capture-node-screenshot",e[e["emulation.capture-screenshot"]=39]="emulation.capture-screenshot",e[e["emulation.show-sensors"]=40]="emulation.show-sensors",e[e["emulation.toggle-device-mode"]=41]="emulation.toggle-device-mode",e[e["help.release-notes"]=42]="help.release-notes",e[e["help.report-issue"]=43]="help.report-issue",e[e["input.start-replaying"]=44]="input.start-replaying",e[e["input.toggle-pause"]=45]="input.toggle-pause",e[e["input.toggle-recording"]=46]="input.toggle-recording",e[e["inspector-main.focus-debuggee"]=47]="inspector-main.focus-debuggee",e[e["inspector-main.hard-reload"]=48]="inspector-main.hard-reload",e[e["inspector-main.reload"]=49]="inspector-main.reload",e[e["live-heap-profile.start-with-reload"]=50]="live-heap-profile.start-with-reload",e[e["live-heap-profile.toggle-recording"]=51]="live-heap-profile.toggle-recording",e[e["main.debug-reload"]=52]="main.debug-reload",e[e["main.next-tab"]=53]="main.next-tab",e[e["main.previous-tab"]=54]="main.previous-tab",e[e["main.search-in-panel.cancel"]=55]="main.search-in-panel.cancel",e[e["main.search-in-panel.find-next"]=56]="main.search-in-panel.find-next",e[e["main.search-in-panel.find-previous"]=57]="main.search-in-panel.find-previous",e[e["main.toggle-dock"]=58]="main.toggle-dock",e[e["main.zoom-in"]=59]="main.zoom-in",e[e["main.zoom-out"]=60]="main.zoom-out",e[e["main.zoom-reset"]=61]="main.zoom-reset",e[e["network-conditions.network-low-end-mobile"]=62]="network-conditions.network-low-end-mobile",e[e["network-conditions.network-mid-tier-mobile"]=63]="network-conditions.network-mid-tier-mobile",e[e["network-conditions.network-offline"]=64]="network-conditions.network-offline",e[e["network-conditions.network-online"]=65]="network-conditions.network-online",e[e["profiler.heap-toggle-recording"]=66]="profiler.heap-toggle-recording",e[e["profiler.js-toggle-recording"]=67]="profiler.js-toggle-recording",e[e["resources.clear"]=68]="resources.clear",e[e["settings.documentation"]=69]="settings.documentation",e[e["settings.shortcuts"]=70]="settings.shortcuts",e[e["sources.add-folder-to-workspace"]=71]="sources.add-folder-to-workspace",e[e["sources.add-to-watch"]=72]="sources.add-to-watch",e[e["sources.close-all"]=73]="sources.close-all",e[e["sources.close-editor-tab"]=74]="sources.close-editor-tab",e[e["sources.create-snippet"]=75]="sources.create-snippet",e[e["sources.go-to-line"]=76]="sources.go-to-line",e[e["sources.go-to-member"]=77]="sources.go-to-member",e[e["sources.jump-to-next-location"]=78]="sources.jump-to-next-location",e[e["sources.jump-to-previous-location"]=79]="sources.jump-to-previous-location",e[e["sources.rename"]=80]="sources.rename",e[e["sources.save"]=81]="sources.save",e[e["sources.save-all"]=82]="sources.save-all",e[e["sources.switch-file"]=83]="sources.switch-file",e[e["timeline.jump-to-next-frame"]=84]="timeline.jump-to-next-frame",e[e["timeline.jump-to-previous-frame"]=85]="timeline.jump-to-previous-frame",e[e["timeline.load-from-file"]=86]="timeline.load-from-file",e[e["timeline.next-recording"]=87]="timeline.next-recording",e[e["timeline.previous-recording"]=88]="timeline.previous-recording",e[e["timeline.record-reload"]=89]="timeline.record-reload",e[e["timeline.save-to-file"]=90]="timeline.save-to-file",e[e["timeline.show-history"]=91]="timeline.show-history",e[e["timeline.toggle-recording"]=92]="timeline.toggle-recording",e[e["sources.increment-css"]=93]="sources.increment-css",e[e["sources.increment-css-by-ten"]=94]="sources.increment-css-by-ten",e[e["sources.decrement-css"]=95]="sources.decrement-css",e[e["sources.decrement-css-by-ten"]=96]="sources.decrement-css-by-ten",e[e["layers.reset-view"]=97]="layers.reset-view",e[e["layers.pan-mode"]=98]="layers.pan-mode",e[e["layers.rotate-mode"]=99]="layers.rotate-mode",e[e["layers.zoom-in"]=100]="layers.zoom-in",e[e["layers.zoom-out"]=101]="layers.zoom-out",e[e["layers.up"]=102]="layers.up",e[e["layers.down"]=103]="layers.down",e[e["layers.left"]=104]="layers.left",e[e["layers.right"]=105]="layers.right",e[e["help.report-translation-issue"]=106]="help.report-translation-issue",e[e["rendering.toggle-prefers-color-scheme"]=107]="rendering.toggle-prefers-color-scheme",e[e["chrome-recorder.start-recording"]=108]="chrome-recorder.start-recording",e[e["chrome-recorder.replay-recording"]=109]="chrome-recorder.replay-recording",e[e["chrome-recorder.toggle-code-view"]=110]="chrome-recorder.toggle-code-view",e[e["chrome-recorder.copy-recording-or-step"]=111]="chrome-recorder.copy-recording-or-step",e[e["changes.revert"]=112]="changes.revert",e[e["changes.copy"]=113]="changes.copy",e[e["elements.new-style-rule"]=114]="elements.new-style-rule",e[e["elements.refresh-event-listeners"]=115]="elements.refresh-event-listeners",e[e["coverage.clear"]=116]="coverage.clear",e[e["coverage.export"]=117]="coverage.export",e[e["timeline.dim-third-parties"]=118]="timeline.dim-third-parties",e[e.MAX_VALUE=119]="MAX_VALUE"}(oe||(oe={})),function(e){e[e["capture-node-creation-stacks"]=1]="capture-node-creation-stacks",e[e["live-heap-profile"]=11]="live-heap-profile",e[e["protocol-monitor"]=13]="protocol-monitor",e[e["sampling-heap-profiler-timeline"]=17]="sampling-heap-profiler-timeline",e[e["show-option-tp-expose-internals-in-heap-snapshot"]=18]="show-option-tp-expose-internals-in-heap-snapshot",e[e["timeline-invalidation-tracking"]=26]="timeline-invalidation-tracking",e[e["timeline-show-all-events"]=27]="timeline-show-all-events",e[e["timeline-v8-runtime-call-stats"]=28]="timeline-v8-runtime-call-stats",e[e.apca=39]="apca",e[e["font-editor"]=41]="font-editor",e[e["full-accessibility-tree"]=42]="full-accessibility-tree",e[e["contrast-issues"]=44]="contrast-issues",e[e["experimental-cookie-features"]=45]="experimental-cookie-features",e[e["instrumentation-breakpoints"]=61]="instrumentation-breakpoints",e[e["authored-deployed-grouping"]=63]="authored-deployed-grouping",e[e["just-my-code"]=65]="just-my-code",e[e["highlight-errors-elements-panel"]=73]="highlight-errors-elements-panel",e[e["use-source-map-scopes"]=76]="use-source-map-scopes",e[e["network-panel-filter-bar-redesign"]=79]="network-panel-filter-bar-redesign",e[e["timeline-show-postmessage-events"]=86]="timeline-show-postmessage-events",e[e["timeline-enhanced-traces"]=90]="timeline-enhanced-traces",e[e["timeline-compiled-sources"]=91]="timeline-compiled-sources",e[e["timeline-debug-mode"]=93]="timeline-debug-mode",e[e["timeline-experimental-insights"]=102]="timeline-experimental-insights",e[e["timeline-dim-unrelated-events"]=103]="timeline-dim-unrelated-events",e[e["timeline-alternative-navigation"]=104]="timeline-alternative-navigation",e[e.MAX_VALUE=106]="MAX_VALUE"}(se||(se={})),function(e){e[e.CrossOriginEmbedderPolicy=0]="CrossOriginEmbedderPolicy",e[e.MixedContent=1]="MixedContent",e[e.SameSiteCookie=2]="SameSiteCookie",e[e.HeavyAd=3]="HeavyAd",e[e.ContentSecurityPolicy=4]="ContentSecurityPolicy",e[e.Other=5]="Other",e[e.Generic=6]="Generic",e[e.ThirdPartyPhaseoutCookie=7]="ThirdPartyPhaseoutCookie",e[e.GenericCookie=8]="GenericCookie",e[e.MAX_VALUE=9]="MAX_VALUE"}(ie||(ie={})),function(e){e[e.CrossOriginEmbedderPolicyRequest=0]="CrossOriginEmbedderPolicyRequest",e[e.CrossOriginEmbedderPolicyElement=1]="CrossOriginEmbedderPolicyElement",e[e.MixedContentRequest=2]="MixedContentRequest",e[e.SameSiteCookieCookie=3]="SameSiteCookieCookie",e[e.SameSiteCookieRequest=4]="SameSiteCookieRequest",e[e.HeavyAdElement=5]="HeavyAdElement",e[e.ContentSecurityPolicyDirective=6]="ContentSecurityPolicyDirective",e[e.ContentSecurityPolicyElement=7]="ContentSecurityPolicyElement",e[e.MAX_VALUE=13]="MAX_VALUE"}(ae||(ae={})),function(e){e[e.MixedContentIssue=0]="MixedContentIssue",e[e["ContentSecurityPolicyIssue::kInlineViolation"]=1]="ContentSecurityPolicyIssue::kInlineViolation",e[e["ContentSecurityPolicyIssue::kEvalViolation"]=2]="ContentSecurityPolicyIssue::kEvalViolation",e[e["ContentSecurityPolicyIssue::kURLViolation"]=3]="ContentSecurityPolicyIssue::kURLViolation",e[e["ContentSecurityPolicyIssue::kTrustedTypesSinkViolation"]=4]="ContentSecurityPolicyIssue::kTrustedTypesSinkViolation",e[e["ContentSecurityPolicyIssue::kTrustedTypesPolicyViolation"]=5]="ContentSecurityPolicyIssue::kTrustedTypesPolicyViolation",e[e["HeavyAdIssue::NetworkTotalLimit"]=6]="HeavyAdIssue::NetworkTotalLimit",e[e["HeavyAdIssue::CpuTotalLimit"]=7]="HeavyAdIssue::CpuTotalLimit",e[e["HeavyAdIssue::CpuPeakLimit"]=8]="HeavyAdIssue::CpuPeakLimit",e[e["CrossOriginEmbedderPolicyIssue::CoepFrameResourceNeedsCoepHeader"]=9]="CrossOriginEmbedderPolicyIssue::CoepFrameResourceNeedsCoepHeader",e[e["CrossOriginEmbedderPolicyIssue::CoopSandboxedIFrameCannotNavigateToCoopPage"]=10]="CrossOriginEmbedderPolicyIssue::CoopSandboxedIFrameCannotNavigateToCoopPage",e[e["CrossOriginEmbedderPolicyIssue::CorpNotSameOrigin"]=11]="CrossOriginEmbedderPolicyIssue::CorpNotSameOrigin",e[e["CrossOriginEmbedderPolicyIssue::CorpNotSameOriginAfterDefaultedToSameOriginByCoep"]=12]="CrossOriginEmbedderPolicyIssue::CorpNotSameOriginAfterDefaultedToSameOriginByCoep",e[e["CrossOriginEmbedderPolicyIssue::CorpNotSameSite"]=13]="CrossOriginEmbedderPolicyIssue::CorpNotSameSite",e[e["CookieIssue::ExcludeSameSiteNoneInsecure::ReadCookie"]=14]="CookieIssue::ExcludeSameSiteNoneInsecure::ReadCookie",e[e["CookieIssue::ExcludeSameSiteNoneInsecure::SetCookie"]=15]="CookieIssue::ExcludeSameSiteNoneInsecure::SetCookie",e[e["CookieIssue::WarnSameSiteNoneInsecure::ReadCookie"]=16]="CookieIssue::WarnSameSiteNoneInsecure::ReadCookie",e[e["CookieIssue::WarnSameSiteNoneInsecure::SetCookie"]=17]="CookieIssue::WarnSameSiteNoneInsecure::SetCookie",e[e["CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Secure"]=18]="CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Secure",e[e["CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Insecure"]=19]="CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Insecure",e[e["CookieIssue::WarnCrossDowngrade::ReadCookie::Secure"]=20]="CookieIssue::WarnCrossDowngrade::ReadCookie::Secure",e[e["CookieIssue::WarnCrossDowngrade::ReadCookie::Insecure"]=21]="CookieIssue::WarnCrossDowngrade::ReadCookie::Insecure",e[e["CookieIssue::WarnCrossDowngrade::SetCookie::Secure"]=22]="CookieIssue::WarnCrossDowngrade::SetCookie::Secure",e[e["CookieIssue::WarnCrossDowngrade::SetCookie::Insecure"]=23]="CookieIssue::WarnCrossDowngrade::SetCookie::Insecure",e[e["CookieIssue::ExcludeNavigationContextDowngrade::Secure"]=24]="CookieIssue::ExcludeNavigationContextDowngrade::Secure",e[e["CookieIssue::ExcludeNavigationContextDowngrade::Insecure"]=25]="CookieIssue::ExcludeNavigationContextDowngrade::Insecure",e[e["CookieIssue::ExcludeContextDowngrade::ReadCookie::Secure"]=26]="CookieIssue::ExcludeContextDowngrade::ReadCookie::Secure",e[e["CookieIssue::ExcludeContextDowngrade::ReadCookie::Insecure"]=27]="CookieIssue::ExcludeContextDowngrade::ReadCookie::Insecure",e[e["CookieIssue::ExcludeContextDowngrade::SetCookie::Secure"]=28]="CookieIssue::ExcludeContextDowngrade::SetCookie::Secure",e[e["CookieIssue::ExcludeContextDowngrade::SetCookie::Insecure"]=29]="CookieIssue::ExcludeContextDowngrade::SetCookie::Insecure",e[e["CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::ReadCookie"]=30]="CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::ReadCookie",e[e["CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::SetCookie"]=31]="CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::SetCookie",e[e["CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::ReadCookie"]=32]="CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::ReadCookie",e[e["CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::SetCookie"]=33]="CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::SetCookie",e[e["CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::ReadCookie"]=34]="CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::ReadCookie",e[e["CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::SetCookie"]=35]="CookieIssue::WarnSameSiteUnspecifiedCrossSiteContext::SetCookie",e[e["SharedArrayBufferIssue::TransferIssue"]=36]="SharedArrayBufferIssue::TransferIssue",e[e["SharedArrayBufferIssue::CreationIssue"]=37]="SharedArrayBufferIssue::CreationIssue",e[e.LowTextContrastIssue=41]="LowTextContrastIssue",e[e["CorsIssue::InsecurePrivateNetwork"]=42]="CorsIssue::InsecurePrivateNetwork",e[e["CorsIssue::InvalidHeaders"]=44]="CorsIssue::InvalidHeaders",e[e["CorsIssue::WildcardOriginWithCredentials"]=45]="CorsIssue::WildcardOriginWithCredentials",e[e["CorsIssue::PreflightResponseInvalid"]=46]="CorsIssue::PreflightResponseInvalid",e[e["CorsIssue::OriginMismatch"]=47]="CorsIssue::OriginMismatch",e[e["CorsIssue::AllowCredentialsRequired"]=48]="CorsIssue::AllowCredentialsRequired",e[e["CorsIssue::MethodDisallowedByPreflightResponse"]=49]="CorsIssue::MethodDisallowedByPreflightResponse",e[e["CorsIssue::HeaderDisallowedByPreflightResponse"]=50]="CorsIssue::HeaderDisallowedByPreflightResponse",e[e["CorsIssue::RedirectContainsCredentials"]=51]="CorsIssue::RedirectContainsCredentials",e[e["CorsIssue::DisallowedByMode"]=52]="CorsIssue::DisallowedByMode",e[e["CorsIssue::CorsDisabledScheme"]=53]="CorsIssue::CorsDisabledScheme",e[e["CorsIssue::PreflightMissingAllowExternal"]=54]="CorsIssue::PreflightMissingAllowExternal",e[e["CorsIssue::PreflightInvalidAllowExternal"]=55]="CorsIssue::PreflightInvalidAllowExternal",e[e["CorsIssue::NoCorsRedirectModeNotFollow"]=57]="CorsIssue::NoCorsRedirectModeNotFollow",e[e["QuirksModeIssue::QuirksMode"]=58]="QuirksModeIssue::QuirksMode",e[e["QuirksModeIssue::LimitedQuirksMode"]=59]="QuirksModeIssue::LimitedQuirksMode",e[e.DeprecationIssue=60]="DeprecationIssue",e[e["ClientHintIssue::MetaTagAllowListInvalidOrigin"]=61]="ClientHintIssue::MetaTagAllowListInvalidOrigin",e[e["ClientHintIssue::MetaTagModifiedHTML"]=62]="ClientHintIssue::MetaTagModifiedHTML",e[e["CorsIssue::PreflightAllowPrivateNetworkError"]=63]="CorsIssue::PreflightAllowPrivateNetworkError",e[e["GenericIssue::CrossOriginPortalPostMessageError"]=64]="GenericIssue::CrossOriginPortalPostMessageError",e[e["GenericIssue::FormLabelForNameError"]=65]="GenericIssue::FormLabelForNameError",e[e["GenericIssue::FormDuplicateIdForInputError"]=66]="GenericIssue::FormDuplicateIdForInputError",e[e["GenericIssue::FormInputWithNoLabelError"]=67]="GenericIssue::FormInputWithNoLabelError",e[e["GenericIssue::FormAutocompleteAttributeEmptyError"]=68]="GenericIssue::FormAutocompleteAttributeEmptyError",e[e["GenericIssue::FormEmptyIdAndNameAttributesForInputError"]=69]="GenericIssue::FormEmptyIdAndNameAttributesForInputError",e[e["GenericIssue::FormAriaLabelledByToNonExistingId"]=70]="GenericIssue::FormAriaLabelledByToNonExistingId",e[e["GenericIssue::FormInputAssignedAutocompleteValueToIdOrNameAttributeError"]=71]="GenericIssue::FormInputAssignedAutocompleteValueToIdOrNameAttributeError",e[e["GenericIssue::FormLabelHasNeitherForNorNestedInput"]=72]="GenericIssue::FormLabelHasNeitherForNorNestedInput",e[e["GenericIssue::FormLabelForMatchesNonExistingIdError"]=73]="GenericIssue::FormLabelForMatchesNonExistingIdError",e[e["GenericIssue::FormHasPasswordFieldWithoutUsernameFieldError"]=74]="GenericIssue::FormHasPasswordFieldWithoutUsernameFieldError",e[e["GenericIssue::FormInputHasWrongButWellIntendedAutocompleteValueError"]=75]="GenericIssue::FormInputHasWrongButWellIntendedAutocompleteValueError",e[e["StylesheetLoadingIssue::LateImportRule"]=76]="StylesheetLoadingIssue::LateImportRule",e[e["StylesheetLoadingIssue::RequestFailed"]=77]="StylesheetLoadingIssue::RequestFailed",e[e["CorsIssue::PreflightMissingPrivateNetworkAccessId"]=78]="CorsIssue::PreflightMissingPrivateNetworkAccessId",e[e["CorsIssue::PreflightMissingPrivateNetworkAccessName"]=79]="CorsIssue::PreflightMissingPrivateNetworkAccessName",e[e["CorsIssue::PrivateNetworkAccessPermissionUnavailable"]=80]="CorsIssue::PrivateNetworkAccessPermissionUnavailable",e[e["CorsIssue::PrivateNetworkAccessPermissionDenied"]=81]="CorsIssue::PrivateNetworkAccessPermissionDenied",e[e["CookieIssue::WarnThirdPartyPhaseout::ReadCookie"]=82]="CookieIssue::WarnThirdPartyPhaseout::ReadCookie",e[e["CookieIssue::WarnThirdPartyPhaseout::SetCookie"]=83]="CookieIssue::WarnThirdPartyPhaseout::SetCookie",e[e["CookieIssue::ExcludeThirdPartyPhaseout::ReadCookie"]=84]="CookieIssue::ExcludeThirdPartyPhaseout::ReadCookie",e[e["CookieIssue::ExcludeThirdPartyPhaseout::SetCookie"]=85]="CookieIssue::ExcludeThirdPartyPhaseout::SetCookie",e[e["SelectElementAccessibilityIssue::DisallowedSelectChild"]=86]="SelectElementAccessibilityIssue::DisallowedSelectChild",e[e["SelectElementAccessibilityIssue::DisallowedOptGroupChild"]=87]="SelectElementAccessibilityIssue::DisallowedOptGroupChild",e[e["SelectElementAccessibilityIssue::NonPhrasingContentOptionChild"]=88]="SelectElementAccessibilityIssue::NonPhrasingContentOptionChild",e[e["SelectElementAccessibilityIssue::InteractiveContentOptionChild"]=89]="SelectElementAccessibilityIssue::InteractiveContentOptionChild",e[e["SelectElementAccessibilityIssue::InteractiveContentLegendChild"]=90]="SelectElementAccessibilityIssue::InteractiveContentLegendChild",e[e["SRIMessageSignatureIssue::MissingSignatureHeader"]=91]="SRIMessageSignatureIssue::MissingSignatureHeader",e[e["SRIMessageSignatureIssue::MissingSignatureInputHeader"]=92]="SRIMessageSignatureIssue::MissingSignatureInputHeader",e[e["SRIMessageSignatureIssue::InvalidSignatureHeader"]=93]="SRIMessageSignatureIssue::InvalidSignatureHeader",e[e["SRIMessageSignatureIssue::InvalidSignatureInputHeader"]=94]="SRIMessageSignatureIssue::InvalidSignatureInputHeader",e[e["SRIMessageSignatureIssue::SignatureHeaderValueIsNotByteSequence"]=95]="SRIMessageSignatureIssue::SignatureHeaderValueIsNotByteSequence",e[e["SRIMessageSignatureIssue::SignatureHeaderValueIsParameterized"]=96]="SRIMessageSignatureIssue::SignatureHeaderValueIsParameterized",e[e["SRIMessageSignatureIssue::SignatureHeaderValueIsIncorrectLength"]=97]="SRIMessageSignatureIssue::SignatureHeaderValueIsIncorrectLength",e[e["SRIMessageSignatureIssue::SignatureInputHeaderMissingLabel"]=98]="SRIMessageSignatureIssue::SignatureInputHeaderMissingLabel",e[e["SRIMessageSignatureIssue::SignatureInputHeaderValueNotInnerList"]=99]="SRIMessageSignatureIssue::SignatureInputHeaderValueNotInnerList",e[e["SRIMessageSignatureIssue::SignatureInputHeaderValueMissingComponents"]=100]="SRIMessageSignatureIssue::SignatureInputHeaderValueMissingComponents",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentType"]=101]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentType",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentName"]=102]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentName",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidHeaderComponentParameter"]=103]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidHeaderComponentParameter",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidDerivedComponentParameter"]=104]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidDerivedComponentParameter",e[e["SRIMessageSignatureIssue::SignatureInputHeaderKeyIdLength"]=105]="SRIMessageSignatureIssue::SignatureInputHeaderKeyIdLength",e[e["SRIMessageSignatureIssue::SignatureInputHeaderInvalidParameter"]=106]="SRIMessageSignatureIssue::SignatureInputHeaderInvalidParameter",e[e["SRIMessageSignatureIssue::SignatureInputHeaderMissingRequiredParameters"]=107]="SRIMessageSignatureIssue::SignatureInputHeaderMissingRequiredParameters",e[e["SRIMessageSignatureIssue::ValidationFailedSignatureExpired"]=108]="SRIMessageSignatureIssue::ValidationFailedSignatureExpired",e[e["SRIMessageSignatureIssue::ValidationFailedInvalidLength"]=109]="SRIMessageSignatureIssue::ValidationFailedInvalidLength",e[e["SRIMessageSignatureIssue::ValidationFailedSignatureMismatch"]=110]="SRIMessageSignatureIssue::ValidationFailedSignatureMismatch",e[e["CorsIssue::LocalNetworkAccessPermissionDenied"]=111]="CorsIssue::LocalNetworkAccessPermissionDenied",e[e["SRIMessageSignatureIssue::ValidationFailedIntegrityMismatch"]=112]="SRIMessageSignatureIssue::ValidationFailedIntegrityMismatch",e[e.MAX_VALUE=113]="MAX_VALUE"}(de||(de={})),function(e){e[e.af=1]="af",e[e.am=2]="am",e[e.ar=3]="ar",e[e.as=4]="as",e[e.az=5]="az",e[e.be=6]="be",e[e.bg=7]="bg",e[e.bn=8]="bn",e[e.bs=9]="bs",e[e.ca=10]="ca",e[e.cs=11]="cs",e[e.cy=12]="cy",e[e.da=13]="da",e[e.de=14]="de",e[e.el=15]="el",e[e["en-GB"]=16]="en-GB",e[e["en-US"]=17]="en-US",e[e["es-419"]=18]="es-419",e[e.es=19]="es",e[e.et=20]="et",e[e.eu=21]="eu",e[e.fa=22]="fa",e[e.fi=23]="fi",e[e.fil=24]="fil",e[e["fr-CA"]=25]="fr-CA",e[e.fr=26]="fr",e[e.gl=27]="gl",e[e.gu=28]="gu",e[e.he=29]="he",e[e.hi=30]="hi",e[e.hr=31]="hr",e[e.hu=32]="hu",e[e.hy=33]="hy",e[e.id=34]="id",e[e.is=35]="is",e[e.it=36]="it",e[e.ja=37]="ja",e[e.ka=38]="ka",e[e.kk=39]="kk",e[e.km=40]="km",e[e.kn=41]="kn",e[e.ko=42]="ko",e[e.ky=43]="ky",e[e.lo=44]="lo",e[e.lt=45]="lt",e[e.lv=46]="lv",e[e.mk=47]="mk",e[e.ml=48]="ml",e[e.mn=49]="mn",e[e.mr=50]="mr",e[e.ms=51]="ms",e[e.my=52]="my",e[e.ne=53]="ne",e[e.nl=54]="nl",e[e.no=55]="no",e[e.or=56]="or",e[e.pa=57]="pa",e[e.pl=58]="pl",e[e["pt-PT"]=59]="pt-PT",e[e.pt=60]="pt",e[e.ro=61]="ro",e[e.ru=62]="ru",e[e.si=63]="si",e[e.sk=64]="sk",e[e.sl=65]="sl",e[e.sq=66]="sq",e[e["sr-Latn"]=67]="sr-Latn",e[e.sr=68]="sr",e[e.sv=69]="sv",e[e.sw=70]="sw",e[e.ta=71]="ta",e[e.te=72]="te",e[e.th=73]="th",e[e.tr=74]="tr",e[e.uk=75]="uk",e[e.ur=76]="ur",e[e.uz=77]="uz",e[e.vi=78]="vi",e[e.zh=79]="zh",e[e["zh-HK"]=80]="zh-HK",e[e["zh-TW"]=81]="zh-TW",e[e.zu=82]="zu",e[e.MAX_VALUE=83]="MAX_VALUE"}(ce||(ce={})),function(e){e[e.OtherSection=0]="OtherSection",e[e.Identity=1]="Identity",e[e.Presentation=2]="Presentation",e[e["Protocol Handlers"]=3]="Protocol Handlers",e[e.Icons=4]="Icons",e[e["Window Controls Overlay"]=5]="Window Controls Overlay",e[e.MAX_VALUE=6]="MAX_VALUE"}(le||(le={}));var ge=Object.freeze({__proto__:null,get Action(){return J},get DevtoolsExperiments(){return se},get ElementsSidebarTabCodes(){return re},get IssueCreated(){return de},get IssueExpanded(){return ie},get IssueResourceOpened(){return ae},get KeybindSetSettings(){return ne},get KeyboardShortcutAction(){return oe},get Language(){return ce},get ManifestSectionCodes(){return le},get MediaTypes(){return te},get PanelCodes(){return Z},get PanelWithLocation(){return ee},UserMetrics:me});const pe=new me,he=K();export{U as AidaClient,F as InspectorFrontendHost,i as InspectorFrontendHostAPI,X as Platform,ue as RNPerfMetrics,v as ResourceLoader,ge as UserMetrics,he as rnPerfMetrics,pe as userMetrics}; 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 d354af80c8ef..2134ee005530 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/FuseboxExperimentsObserver.ts | reloadRequiredForNetworkPanelMessage":{"message":"The Network panel is now available for dogfooding. Please reload to access it."},"entrypoints/rn_fusebox/FuseboxExperimentsObserver.ts | reloadRequiredForPerformancePanelMessage":{"message":"[Profiling build first run] One or more settings have changed. Please reload to access the Performance panel."},"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/rn_inspector/rn_inspector.ts | networkTitle":{"message":"React Native"},"entrypoints/rn_inspector/rn_inspector.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
,