diff --git a/.circleci/README.md b/.circleci/README.md deleted file mode 100644 index a69111990927..000000000000 --- a/.circleci/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Circle CI - -This directory was home to the Circle CI configuration files. -In July 2024 we moved to GitHub Actions, and week this folder for backward compatibility, as we want to keep on using Circle CI for the release of React Native <= 0.74. diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 88db963b290c..000000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: 2.1 -workflows: - version: 2 - stub: - jobs: - - circleci-stub - -jobs: - circleci-stub: - docker: - - image: debian:bullseye - steps: - - run: echo "There is nothing here, just an empty job. Everything has been moved to GitHub Action" diff --git a/.eslintignore b/.eslintignore index da763c3a56bf..ca22506f6c8c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,12 +3,14 @@ docs/generatedComponentApiDocs.js packages/react-native/flow/ packages/react-native/sdks/ +packages/react-native/ReactAndroid/build packages/react-native/ReactAndroid/hermes-engine/build/ packages/react-native/Libraries/Renderer/* packages/react-native/Libraries/vendor/**/* node_modules/ packages/*/node_modules packages/*/dist +packages/*/types_generated packages/debugger-frontend/dist/**/* packages/react-native-codegen/lib tools/eslint/rules/sort-imports.js diff --git a/.eslintrc.js b/.eslintrc.js index 4c434aab38a9..a71d9474a489 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -30,10 +30,21 @@ module.exports = { // These rules are not required with hermes-eslint 'ft-flow/define-flow-type': 0, 'ft-flow/use-flow-type': 0, + 'lint/sort-imports': 1, // flow handles this check for us, so it's not required 'no-undef': 0, }, }, + { + files: [ + './packages/react-native/**/*.{js,flow}', + './packages/assets/registry.js', + ], + parser: 'hermes-eslint', + rules: { + 'lint/no-commonjs-exports': 1, + }, + }, { files: ['package.json'], parser: 'jsonc-eslint-parser', diff --git a/.flowconfig b/.flowconfig index 931b2077d038..45110f76ccbf 100644 --- a/.flowconfig +++ b/.flowconfig @@ -26,6 +26,9 @@ ; helloworld /packages/helloworld/ios/Pods/ +; Ignore rn-tester Pods +/packages/rn-tester/Pods/ + [untyped] .*/node_modules/@react-native-community/cli/.*/.* @@ -38,6 +41,7 @@ flow-typed/ packages/react-native/interface.js packages/react-native/flow/ +packages/react-native/src/types/ [options] enums=true @@ -69,6 +73,8 @@ suppress_type=$FlowFixMeProps suppress_type=$FlowFixMeState suppress_type=$FlowFixMeEmpty +ban_spread_key_props=true + [lints] sketchy-null-number=warn sketchy-null-mixed=warn @@ -90,4 +96,4 @@ untyped-import untyped-type-import [version] -^0.245.2 +^0.262.0 diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index eeda1f865d9c..00d0b00f9a77 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,4 @@ -name: 🐛 Bug Report +name: 🐛 React Native - Bug Report description: Report a reproducible bug or regression in React Native. labels: ["Needs: Triage :mag:"] body: @@ -69,10 +69,10 @@ body: - type: textarea id: react-native-info attributes: - label: Output of `npx react-native info` - description: Run `npx react-native info` in your terminal, copy and paste the results here. + label: Output of `npx @react-native-community/cli info` + description: Run `npx @react-native-community/cli info` in your terminal, copy and paste the results here. placeholder: | - Paste the output of `npx react-native info` here. The output looks like: + Paste the output of `npx @react-native-community/cli info` here. The output looks like: ... System: OS: macOS 14.1.1 diff --git a/.github/ISSUE_TEMPLATE/debugger_bug_report.yml b/.github/ISSUE_TEMPLATE/debugger_bug_report.yml new file mode 100644 index 000000000000..b586e9b52660 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/debugger_bug_report.yml @@ -0,0 +1,76 @@ +name: 🔍 Debugger - Bug Report +description: Report a bug with React Native DevTools and the New Debugger +labels: ["Needs: Triage :mag:", "Debugger"] + +body: + - type: markdown + attributes: + value: "## Reporting a bug for React Native DevTools" + - type: markdown + attributes: + value: | + Thank you for taking the time to report an issue for React Native DevTools, our new Debugger for React Native. + + Before you continue: + * If you're using **Expo** and you're noticing a bug, [report it here](https://github.com/expo/expo/issues). + * If you've found a problem with our **documentation**, [report it here](https://github.com/facebook/react-native-website/issues/). + * If you're having an issue with **Metro** (the bundler), [report it here](https://github.com/facebook/metro/issues/). + * If you're using an external library, report the issue to the **library first**. + * Please [search for similar issues](https://github.com/facebook/react-native/issues) in our issue tracker. + + Make sure that your issue is tested against the [**latest stable**](https://github.com/facebook/react-native/releases/) of React Native. + - type: textarea + id: description + attributes: + label: Description + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: Steps to reproduce + description: The list of steps that reproduces the issue. + placeholder: | + 1. Install the application with `yarn android` + 2. Press `j` to open the debugger + 3. Do something... + validations: + required: true + - type: input + id: version + attributes: + label: React Native Version + description: The version of react-native that this issue reproduces on. Bear in mind that only issues on [supported versions](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported) will be looked into. + placeholder: "0.76.0" + validations: + required: true + - type: textarea + id: react-native-info + attributes: + label: Output of `npx @react-native-community/cli info` + description: Run `npx @react-native-community/cli info` in your terminal, copy and paste the results here. + placeholder: | + Paste the output of `npx @react-native-community/cli info` here. The output looks like: + ... + System: + OS: macOS 14.1.1 + CPU: (10) arm64 Apple M1 Max + Memory: 417.81 MB / 64.00 GB + Shell: + version: "5.9" + path: /bin/zsh + Binaries: + Node: ... + version: 18.14.0 + ... + render: text + validations: + required: true + - type: textarea + id: extra + attributes: + label: Screenshots and Videos + description: | + Please provide screenshot or a video of your bug if relevant. + Issues with videos and screenshots are more likely to **get prioritized**. diff --git a/.github/ISSUE_TEMPLATE/new_architecture_bug_report.yml b/.github/ISSUE_TEMPLATE/new_architecture_bug_report.yml index 452c7899eabc..f2870c540afe 100644 --- a/.github/ISSUE_TEMPLATE/new_architecture_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/new_architecture_bug_report.yml @@ -81,10 +81,10 @@ body: - type: textarea id: react-native-info attributes: - label: Output of `npx react-native info` - description: Run `npx react-native info` in your terminal, copy and paste the results here. + label: Output of `npx @react-native-community/cli info` + description: Run `npx @react-native-community/cli info` in your terminal, copy and paste the results here. placeholder: | - Paste the output of `npx react-native info` here. The output looks like: + Paste the output of `npx @react-native-community/cli info` here. The output looks like: ... System: OS: macOS 14.1.1 diff --git a/.github/actions/build-android/action.yml b/.github/actions/build-android/action.yml index cf2367f647e3..91019234adcd 100644 --- a/.github/actions/build-android/action.yml +++ b/.github/actions/build-android/action.yml @@ -7,6 +7,8 @@ inputs: run-e2e-tests: default: 'false' description: If we need to build to run E2E tests. If yes, we need to build also x86. + gradle-cache-encryption-key: + description: "The encryption key needed to store the Gradle Configuration cache" runs: using: composite steps: @@ -16,7 +18,7 @@ runs: - name: Setup node.js uses: ./.github/actions/setup-node - name: Install node dependencies - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Set React Native Version shell: bash run: node ./scripts/releases/set-rn-artifacts-version.js --build-type ${{ inputs.release-type }} @@ -24,6 +26,7 @@ runs: uses: ./.github/actions/setup-gradle with: cache-read-only: "false" + cache-encryption-key: ${{ inputs.gradle-cache-encryption-key }} - name: Restore Android ccache uses: actions/cache/restore@v4 with: diff --git a/.github/actions/build-apple-slices-hermes/action.yml b/.github/actions/build-apple-slices-hermes/action.yml index 4f6b30679e2d..36eda067ef00 100644 --- a/.github/actions/build-apple-slices-hermes/action.yml +++ b/.github/actions/build-apple-slices-hermes/action.yml @@ -9,7 +9,7 @@ inputs: description: The version of Hermes slice: required: true - description: The slice of hermes you want to build. It could be iphone, iphonesimulator, macos, catalyst, xros, or xrossimulator + 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 diff --git a/.github/actions/build-hermes-macos/action.yml b/.github/actions/build-hermes-macos/action.yml index daa6b3391450..41c7e6e869c8 100644 --- a/.github/actions/build-hermes-macos/action.yml +++ b/.github/actions/build-hermes-macos/action.yml @@ -22,7 +22,7 @@ runs: - name: Restore Cached Artifacts uses: actions/cache/restore@v4 with: - key: v4-hermes-artifacts-${{ inputs.flavor }}-${{ inputs.hermes-version }}-${{ inputs.react-native-version }} + 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 }} @@ -47,7 +47,7 @@ runs: fi - name: Yarn- Install Dependencies if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }} - uses: ./.github/actions/yarn-install-with-cache + 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 @@ -66,6 +66,18 @@ runs: 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 @@ -93,6 +105,8 @@ runs: 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 @@ -105,6 +119,8 @@ runs: 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 @@ -163,6 +179,8 @@ runs: 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" @@ -173,6 +191,8 @@ runs: 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/" @@ -200,7 +220,7 @@ runs: 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 }} + 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 }} diff --git a/.github/actions/build-hermesc-windows/action.yml b/.github/actions/build-hermesc-windows/action.yml index 743e820942fc..aec9927e36e3 100644 --- a/.github/actions/build-hermesc-windows/action.yml +++ b/.github/actions/build-hermesc-windows/action.yml @@ -43,9 +43,6 @@ runs: shell: powershell run: | if (-not(Test-Path -Path $Env:HERMES_WS_DIR\win64-bin\hermesc.exe)) { - choco install --no-progress cmake --version 3.14.7 - if (-not $?) { throw "Failed to install CMake" } - 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 [...] diff --git a/.github/actions/build-npm-package/action.yml b/.github/actions/build-npm-package/action.yml index 295868a376bb..e68f4c1e35e3 100644 --- a/.github/actions/build-npm-package/action.yml +++ b/.github/actions/build-npm-package/action.yml @@ -11,6 +11,9 @@ inputs: required: false description: The GHA npm token, required only to publish to npm default: '' + gradle-cache-encryption-key: + description: The encryption key needed to store the Gradle Configuration cache + runs: using: composite steps: @@ -98,12 +101,23 @@ runs: 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/hermes.framework.dSYM ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-framework-dSYM-debug.tar.gz cp ${{ inputs.hermes-ws-dir }}/dSYM/Release/hermes.framework.dSYM ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-framework-dSYM-release.tar.gz + - name: Download ReactNativeDependencies + uses: actions/download-artifact@v4 + with: + pattern: ReactNativeDependencies* + path: ./packages/react-native/ReactAndroid/external-artifacts/artifacts + merge-multiple: true + - name: Print Artifacts Directory + shell: bash + run: ls -lR ./packages/react-native/ReactAndroid/external-artifacts/artifacts/ - name: Setup node.js uses: ./.github/actions/setup-node - name: Setup gradle uses: ./.github/actions/setup-gradle + with: + cache-encryption-key: ${{ inputs.gradle-cache-encryption-key }} - name: Install dependencies - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Build packages shell: bash run: yarn build diff --git a/.github/actions/create-release/action.yml b/.github/actions/create-release/action.yml index 0d0f2055f035..ff22a0cb3a09 100644 --- a/.github/actions/create-release/action.yml +++ b/.github/actions/create-release/action.yml @@ -15,7 +15,7 @@ runs: using: composite steps: - name: Yarn install - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Configure Git shell: bash run: | diff --git a/.github/actions/lint/action.yml b/.github/actions/lint/action.yml index 667b990029b8..8a704c7ed639 100644 --- a/.github/actions/lint/action.yml +++ b/.github/actions/lint/action.yml @@ -4,7 +4,7 @@ inputs: node-version: description: "The node.js version to use" required: false - default: "18" + default: "20" github-token: description: "The GitHub token used by pull-bot" required: true @@ -15,20 +15,23 @@ runs: uses: ./.github/actions/setup-node with: node-version: ${{ inputs.node-version }} - - name: Yarn install - shell: bash - run: yarn install --non-interactive --frozen-lockfile + - name: Run yarn install + uses: ./.github/actions/yarn-install - name: Run linters against modified files (analysis-bot) shell: bash run: yarn lint-ci env: GITHUB_TOKEN: ${{ inputs.github-token }} + GITHUB_PR_NUMBER: ${{ github.event.number }} - name: Lint code shell: bash - run: ./scripts/circleci/exec_swallow_error.sh yarn lint --format junit -o ./reports/junit/eslint/results.xml + run: ./.github/workflow-scripts/exec_swallow_error.sh yarn lint --format junit -o ./reports/junit/eslint/results.xml - name: Lint java shell: bash - run: ./scripts/circleci/exec_swallow_error.sh yarn lint-java --check + run: ./.github/workflow-scripts/exec_swallow_error.sh yarn lint-java --check + - name: Verify not committing repo after running build + shell: bash + run: yarn run build --check - name: Run flowcheck shell: bash run: yarn flow-check @@ -37,7 +40,7 @@ runs: run: yarn test-typescript - name: Check license shell: bash - run: ./scripts/circleci/check_license.sh + run: ./.github/workflow-scripts/check_license.sh - name: Check formatting shell: bash run: yarn run format-check diff --git a/.github/actions/maestro-android/action.yml b/.github/actions/maestro-android/action.yml index 1b34e6efe0e1..6c7766d2c8a2 100644 --- a/.github/actions/maestro-android/action.yml +++ b/.github/actions/maestro-android/action.yml @@ -17,15 +17,28 @@ inputs: required: false default: 'true' description: whether this action has to install java 17 or not + flavor: + required: true + description: the flavor we want to run - either debug or release + default: release + working-directory: + required: false + default: "." + description: The directory from which metro should be started + architecture: + required: false + default: "NewArch" + description: The react native architecture to test + runs: using: composite steps: - name: Installing Maestro shell: bash - run: export MAESTRO_VERSION=1.36.0; curl -Ls "https://get.maestro.mobile.dev" | bash + run: export MAESTRO_VERSION=1.39.7; curl -Ls "https://get.maestro.mobile.dev" | bash - name: Set up JDK 17 if: ${{ inputs.install-java == 'true' }} - uses: actions/setup-java@v2 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'zulu' @@ -38,33 +51,41 @@ runs: echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm + - name: Build Codegen + shell: bash + if: ${{ inputs.flavor == 'debug' }} + run: ./packages/react-native-codegen/scripts/oss/build.sh - name: Run e2e tests + id: run-tests uses: reactivecircus/android-emulator-runner@v2 with: api-level: 24 arch: x86 - script: | - echo "Install APK from ${{ inputs.app-path }}" - adb install "${{ inputs.app-path }}" - - echo "Start recording to /sdcard/screen.mp4" - adb shell screenrecord /sdcard/screen.mp4 - - echo "Start testing ${{ inputs.maestro-flow }}" - $HOME/.maestro/bin/maestro test ${{ inputs.maestro-flow }} --format junit -e APP_ID=${{ inputs.app-id }} --debug-output /tmp/MaestroLogs - - echo "Stop recording. Saving to screen.mp4" - adb pull /sdcard/screen.mp4 + ram-size: '8192M' + heap-size: '4096M' + disk-size: '10G' + cores: '4' + disable-animations: false + avd-name: e2e_emulator + script: node .github/workflow-scripts/maestro-android.js ${{ inputs.app-path }} ${{ inputs.app-id }} ${{ inputs.maestro-flow }} ${{ inputs.flavor }} ${{ inputs.working-directory }} + - name: Normalize APP_ID + id: normalize-app-id + shell: bash + if: always() + run: | + NORM_APP_ID=$(echo "${{ inputs.app-id }}" | tr '.' '-') + echo "app-id=$NORM_APP_ID" >> $GITHUB_OUTPUT - name: Store tests result - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4.3.4 + if: always() with: - name: e2e_android_${{ inputs.app-id }}_report_${{ inputs.jsengine }} + name: e2e_android_${{ steps.normalize-app-id.outputs.app-id }}_report_${{ inputs.jsengine }}_${{ inputs.flavor }}_${{ inputs.architecture }} path: | report.xml screen.mp4 - name: Store Logs - if: failure() && steps.run-tests.outcome == 'failure' + if: steps.run-tests.outcome == 'failure' uses: actions/upload-artifact@v4.3.4 with: - name: maestro-logs-android-${{ inputs.app-id }}-${{ inputs.jsengine }} + name: maestro-logs-android-${{ steps.normalize-app-id.outputs.app-id }}-${{ inputs.jsengine }}-${{ inputs.flavor }}-${{ inputs.architecture }} path: /tmp/MaestroLogs diff --git a/.github/actions/maestro-ios/action.yml b/.github/actions/maestro-ios/action.yml index 8379a6d458f6..34f8e4d70d7b 100644 --- a/.github/actions/maestro-ios/action.yml +++ b/.github/actions/maestro-ios/action.yml @@ -13,22 +13,47 @@ inputs: maestro-flow: required: true description: the folder that contains the maestro tests + flavor: + required: true + description: Whether we are building for Debug or Release + default: Release + working-directory: + required: false + default: "." + description: The directory from which metro should be started + architecture: + required: false + default: "NewArch" + description: The react native architecture to test + runs: using: composite steps: - name: Installing Maestro shell: bash - run: export MAESTRO_VERSION=1.36.0; curl -Ls "https://get.maestro.mobile.dev" | bash + run: export MAESTRO_VERSION=1.39.7; curl -Ls "https://get.maestro.mobile.dev" | bash - name: Installing Maestro dependencies shell: bash run: | brew tap facebook/fb - brew install facebook/fb/idb-companion jq + brew install facebook/fb/idb-companion - name: Set up JDK 11 uses: actions/setup-java@v2 with: java-version: '17' distribution: 'zulu' + - name: Run yarn install + uses: ./.github/actions/yarn-install + - name: Start Metro in Debug + shell: bash + if: ${{ inputs.flavor == 'Debug' }} + run: | + # build codegen or we will see a redbox + ./packages/react-native-codegen/scripts/oss/build.sh + + cd ${{ inputs.working-directory }} + yarn start & + sleep 5 # to give metro time to load - name: Run tests id: run-tests shell: bash @@ -37,60 +62,28 @@ runs: # Maestro can fail in case of flakyness, we have some retry logic. set +e - echo "Launching iOS Simulator: iPhone 15 Pro" - xcrun simctl boot "iPhone 15 Pro" - - echo "Installing app on Simulator" - xcrun simctl install booted "${{ inputs.app-path }}" - - echo "Retrieving device UDID" - UDID=$(xcrun simctl list devices booted -j | jq -r '[.devices[]] | add | first | .udid') - echo "UDID is $UDID" - - echo "Bring simulator in foreground" - open -a simulator - - echo "Launch the app" - xcrun simctl launch $UDID ${{ inputs.app-id }} - - echo "Running tests with Maestro" - export MAESTRO_DRIVER_STARTUP_TIMEOUT=1500000 # 25 min. CI is extremely slow - - # Add retries for flakyness - MAX_ATTEMPTS=3 - CURR_ATTEMPT=0 - RESULT=1 - - while [[ $CURR_ATTEMPT -lt $MAX_ATTEMPTS ]] && [[ $RESULT -ne 0 ]]; do - CURR_ATTEMPT=$((CURR_ATTEMPT+1)) - echo "Attempt number $CURR_ATTEMPT" - - echo "Start video record using pid: video_record_${{ inputs.jsengine }}_$CURR_ATTEMPT.pid" - xcrun simctl io booted recordVideo video_record_$CURR_ATTEMPT.mov & echo $! > video_record_${{ inputs.jsengine }}_$CURR_ATTEMPT.pid - - echo '$HOME/.maestro/bin/maestro --udid=$UDID test ${{ inputs.maestro-flow }} --format junit -e APP_ID=${{ inputs.app-id }}' - $HOME/.maestro/bin/maestro --udid=$UDID test ${{ inputs.maestro-flow }} --format junit -e APP_ID=${{ inputs.app-id }} --debug-output /tmp/MaestroLogs - - RESULT=$? - - # Stop video - kill -SIGINT $(cat video_record_${{ inputs.jsengine }}_$CURR_ATTEMPT.pid) - done - - exit $RESULT + node .github/workflow-scripts/maestro-ios.js \ + "${{ inputs.app-path }}" \ + "${{ inputs.app-id }}" \ + "${{ inputs.maestro-flow }}" \ + "${{ inputs.jsengine }}" \ + "${{ inputs.flavor }}" \ + "${{ inputs.working-directory }}" - name: Store video record if: always() uses: actions/upload-artifact@v4.3.4 with: - name: e2e_ios_${{ inputs.app-id }}_report_${{ inputs.jsengine }} + name: e2e_ios_${{ inputs.app-id }}_report_${{ inputs.jsengine }}_${{ inputs.flavor }}_${{ inputs.architecture }} path: | - video_record_1.mov - video_record_2.mov - video_record_3.mov + video_record_${{ inputs.jsengine }}_1.mov + video_record_${{ inputs.jsengine }}_2.mov + video_record_${{ inputs.jsengine }}_3.mov + video_record_${{ inputs.jsengine }}_4.mov + video_record_${{ inputs.jsengine }}_5.mov report.xml - name: Store Logs if: failure() && steps.run-tests.outcome == 'failure' uses: actions/upload-artifact@v4.3.4 with: - name: maestro-logs-${{ inputs.app-id }}-${{ inputs.jsengine }} + name: maestro-logs-${{ inputs.app-id }}-${{ inputs.jsengine }}-${{ inputs.flavor }}-${{ inputs.architecture }} path: /tmp/MaestroLogs diff --git a/.github/actions/prepare-hermes-workspace/action.yml b/.github/actions/prepare-hermes-workspace/action.yml index 4a5e638790e0..22dbe356ee58 100644 --- a/.github/actions/prepare-hermes-workspace/action.yml +++ b/.github/actions/prepare-hermes-workspace/action.yml @@ -69,7 +69,7 @@ runs: - name: Yarn- Install Dependencies if: ${{ steps.meaningful-cache.outputs.HERMES_CACHED != 'true' }} - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Download Hermes tarball if: ${{ steps.meaningful-cache.outputs.HERMES_CACHED != 'true' }} diff --git a/.github/actions/prepare-ios-tests/action.yml b/.github/actions/prepare-ios-tests/action.yml index daa43b3b64e1..6465f0db99bd 100644 --- a/.github/actions/prepare-ios-tests/action.yml +++ b/.github/actions/prepare-ios-tests/action.yml @@ -3,9 +3,6 @@ description: Prepare iOS Tests runs: using: composite steps: - - name: brew install xcbeautify - run: brew install xcbeautify - shell: bash - name: Run Ruby Tests shell: bash run: | diff --git a/.github/actions/setup-gradle/action.yml b/.github/actions/setup-gradle/action.yml index c146592c1911..6228715b65f8 100644 --- a/.github/actions/setup-gradle/action.yml +++ b/.github/actions/setup-gradle/action.yml @@ -4,17 +4,20 @@ inputs: cache-read-only: description: "Whether the Gradle Cache should be in read-only mode so this job won't be allowed to write to it" default: "true" + cache-encryption-key: + description: "The encryption key needed to store the Gradle Configuration cache" runs: using: "composite" steps: - name: Setup gradle - uses: gradle/actions/setup-gradle@v3 + uses: gradle/actions/setup-gradle@v4 with: gradle-version: wrapper # We want the Gradle cache to be written only on main/-stable branches run, and only for jobs with `cache-read-only` == false (i.e. `build_android`). cache-read-only: ${{ (github.ref != 'refs/heads/main' && !contains(github.ref, '-stable')) || inputs.cache-read-only == 'true' }} # Similarly, for those jobs we want to start with a clean cache so it doesn't grow without limits (this is the negation of the previous condition). cache-write-only: ${{ (github.ref == 'refs/heads/main' || contains(github.ref, '-stable')) && inputs.cache-read-only != 'true' }} - # Temporarily disabling to try resolve a cache cleanup failure - # gradle-home-cache-cleanup: true add-job-summary-as-pr-comment: on-failure + # Encryption key for the Gradle Configuration Cache. + # See https://docs.gradle.org/8.6/userguide/configuration_cache.html#config_cache:secrets:configuring_encryption_key + cache-encryption-key: ${{ inputs.cache-encryption-key }} diff --git a/.github/actions/setup-node/action.yml b/.github/actions/setup-node/action.yml index fe041bca1c62..8123f5a78550 100644 --- a/.github/actions/setup-node/action.yml +++ b/.github/actions/setup-node/action.yml @@ -4,7 +4,7 @@ inputs: node-version: description: 'The node.js version to use' required: false - default: '18' + default: '20' runs: using: "composite" steps: @@ -12,3 +12,4 @@ runs: uses: actions/setup-node@v4 with: node-version: ${{ inputs.node-version }} + cache: yarn diff --git a/.github/actions/test-ios-helloworld/action.yml b/.github/actions/test-ios-helloworld/action.yml index c3819ae95270..687a9d24970c 100644 --- a/.github/actions/test-ios-helloworld/action.yml +++ b/.github/actions/test-ios-helloworld/action.yml @@ -41,7 +41,7 @@ runs: shell: bash run: ls -lR "$HERMES_WS_DIR" - name: Run yarn - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Setup ruby uses: ruby/setup-ruby@v1.170.0 with: diff --git a/.github/actions/test-ios-rntester/action.yml b/.github/actions/test-ios-rntester/action.yml index 1ab333089d09..47cec865807b 100644 --- a/.github/actions/test-ios-rntester/action.yml +++ b/.github/actions/test-ios-rntester/action.yml @@ -41,7 +41,7 @@ runs: - name: Setup node.js uses: ./.github/actions/setup-node - name: Run yarn - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Download Hermes uses: actions/download-artifact@v4 with: @@ -109,8 +109,8 @@ runs: export USE_FRAMEWORKS=dynamic fi - if [[ ${{ inputs.architecture }} == "NewArch" ]]; then - export RCT_NEW_ARCH_ENABLED=1 + if [[ ${{ inputs.architecture }} == "OldArch" ]]; then + export RCT_NEW_ARCH_ENABLED=0 fi cd packages/rn-tester @@ -118,27 +118,21 @@ runs: bundle install bundle exec pod install - name: Build RNTester - if: ${{ inputs.run-unit-tests != 'true' && inputs.run-e2e-tests == 'false' }} shell: bash run: | - set -o pipefail && xcodebuild build \ - -workspace packages/rn-tester/RNTesterPods.xcworkspace \ - -scheme RNTester \ - -sdk iphonesimulator | xcbeautify - - name: Build RNTester (E2E Tests) - shell: bash - if: ${{ inputs.run-e2e-tests == 'true' }} - run: | - set -o pipefail && xcodebuild \ + xcodebuild \ -scheme "RNTester" \ -workspace packages/rn-tester/RNTesterPods.xcworkspace \ - -configuration "Release" \ + -configuration "${{ inputs.flavor }}" \ -sdk "iphonesimulator" \ -destination "generic/platform=iOS Simulator" \ - -derivedDataPath "/tmp/RNTesterBuild" | xcbeautify + -derivedDataPath "/tmp/RNTesterBuild" echo "Print path to *.app file" - find "/tmp/RNTesterBuild" -type d -name "*.app" + APP_PATH=$(find "/tmp/RNTesterBuild" -type d -name "*.app") + + echo "App found at $APP_PATH" + echo "app-path=$APP_PATH" >> $GITHUB_ENV - name: "Run Tests: iOS Unit and Integration Tests" if: ${{ inputs.run-unit-tests == 'true' }} shell: bash @@ -158,6 +152,12 @@ runs: with: name: xcresults path: /Users/distiller/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 + with: + name: RNTesterApp-${{ inputs.architecture }}-${{ inputs.jsengine }}-${{ inputs.flavor }} + path: ${{ env.app-path }} - name: Store test results if: ${{ inputs.run-unit-tests == 'true' }} uses: actions/upload-artifact@v4.3.4 diff --git a/.github/actions/test-js/action.yml b/.github/actions/test-js/action.yml index 4cb531c46097..7755fc410b1c 100644 --- a/.github/actions/test-js/action.yml +++ b/.github/actions/test-js/action.yml @@ -4,7 +4,7 @@ inputs: node-version: description: "The node.js version to use" required: false - default: "18" + default: "20" runs: using: composite steps: @@ -13,7 +13,7 @@ runs: with: node-version: ${{ inputs.node-version }} - name: Yarn install - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Run Tests - JavaScript Tests shell: bash run: node ./scripts/run-ci-javascript-tests.js --maxWorkers 2 diff --git a/.github/actions/test-library-on-nightly/action.yml b/.github/actions/test-library-on-nightly/action.yml new file mode 100644 index 000000000000..f6fdaa21446c --- /dev/null +++ b/.github/actions/test-library-on-nightly/action.yml @@ -0,0 +1,46 @@ +name: test-library-on-nightly +description: Tests a library on a nightly +inputs: + library-npm-package: + description: The library npm package to add + required: true + platform: + description: whether we want to build for iOS or Android + required: true +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: Add library + shell: bash + run: | + cd /tmp/RNApp + yarn add ${{ inputs.library-npm-package }} + + - name: Build iOS + shell: bash + if: ${{ inputs.platform == 'ios' }} + run: | + cd /tmp/RNApp/ios + bundle install + bundle exec pod install + xcodebuild build \ + -workspace RNApp.xcworkspace \ + -scheme RNApp \ + -sdk iphonesimulator + - name: Setup Java for Android + if: ${{ inputs.platform == 'android' }} + uses: actions/setup-java@v2 + with: + java-version: '17' + distribution: 'zulu' + - name: Build Android + shell: bash + if: ${{ inputs.platform == 'android' }} + run: | + cd /tmp/RNApp/android + ./gradlew assembleDebug diff --git a/.github/actions/yarn-install-with-cache/action.yml b/.github/actions/yarn-install-with-cache/action.yml deleted file mode 100644 index 8273398acbbe..000000000000 --- a/.github/actions/yarn-install-with-cache/action.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: yarn-install-with-cache -inputs: - update-cache: - description: Update the cache, only do this if you are update-node-modules-cache.yml - default: "false" -description: Only update node_modules if on main -runs: - using: composite - steps: - - name: Load node_modules from cache - # Restore for all branches, but save for 'main'. - uses: actions/cache/restore@v4 - with: - path: node_modules/ - key: node-modules-${{ hashFiles('package.json') }} - - name: Install dependencies - shell: bash - run: yarn install --non-interactive - - name: Save node_modules to the cache - if: github.ref == 'refs/heads/main' && inputs.update-cache == 'true' - uses: actions/cache/save@v4 - with: - path: node_modules/ - # We're assuming that variations on branches will slightly vary from main, - # so it's always important to run yarn install --non-interactive after this - # cache is restored. - key: node-modules-v1-${{ hashFiles('package.json') }} - enableCrossOsArchive: true diff --git a/.github/actions/yarn-install/action.yml b/.github/actions/yarn-install/action.yml new file mode 100644 index 000000000000..cdb4a85c899e --- /dev/null +++ b/.github/actions/yarn-install/action.yml @@ -0,0 +1,20 @@ +name: yarn-install +runs: + using: composite + steps: + - name: Install dependencies + shell: bash + run: | + MAX_ATTEMPTS=2 + ATTEMPT=0 + WAIT_TIME=20 + while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do + yarn install --non-interactive --frozen-lockfile && break + echo "yarn install failed. Retrying in $WAIT_TIME seconds..." + sleep $WAIT_TIME + ATTEMPT=$((ATTEMPT + 1)) + done + if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then + echo "All attempts to invoke yarn install failed - Aborting the workflow" + exit 1 + fi diff --git a/.github/workflow-scripts/__tests__/publishTemplate-test.js b/.github/workflow-scripts/__tests__/publishTemplate-test.js new file mode 100644 index 000000000000..9ddc60016806 --- /dev/null +++ b/.github/workflow-scripts/__tests__/publishTemplate-test.js @@ -0,0 +1,129 @@ +/** + * 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. + * + * @format + */ + +const { + publishTemplate, + verifyPublishedTemplate, +} = require('../publishTemplate'); + +const mockRun = jest.fn(); +const mockSleep = jest.fn(); +const mockGetNpmPackageInfo = jest.fn(); +const mockVerifyPublishedPackage = jest.fn(); +const silence = () => {}; + +jest.mock('../utils.js', () => ({ + log: silence, + run: mockRun, + sleep: mockSleep, + getNpmPackageInfo: mockGetNpmPackageInfo, +})); + +jest.mock('../verifyPublishedPackage.js', () => ({ + verifyPublishedPackage: mockVerifyPublishedPackage, +})); + +const getMockGithub = () => ({ + rest: { + actions: { + createWorkflowDispatch: jest.fn(), + }, + }, +}); + +describe('#publishTemplate', () => { + beforeEach(jest.clearAllMocks); + + it('checks commits for magic #publish-package-to-npm&latest string and sets latest', async () => { + mockRun.mockReturnValueOnce(` + The commit message + + #publish-packages-to-npm&latest`); + + const github = getMockGithub(); + await publishTemplate(github, '0.76.0', true); + expect(github.rest.actions.createWorkflowDispatch).toHaveBeenCalledWith({ + owner: 'react-native-community', + repo: 'template', + workflow_id: 'release.yaml', + ref: '0.76-stable', + inputs: { + dry_run: true, + is_latest_on_npm: true, + version: '0.76.0', + }, + }); + }); + + it('pubished as is_latest_on_npm = false if missing magic string', async () => { + mockRun.mockReturnValueOnce(` + The commit message without magic + `); + + const github = getMockGithub(); + await publishTemplate(github, '0.76.0', false); + expect(github.rest.actions.createWorkflowDispatch).toHaveBeenCalledWith({ + owner: 'react-native-community', + repo: 'template', + workflow_id: 'release.yaml', + ref: '0.76-stable', + inputs: { + dry_run: false, + is_latest_on_npm: false, + version: '0.76.0', + }, + }); + }); +}); + +describe('#verifyPublishedTemplate', () => { + beforeEach(jest.clearAllMocks); + + it("waits on npm updating for version and not 'latest'", async () => { + const NOT_LATEST = false; + const version = '0.77.0'; + + await verifyPublishedTemplate(version, NOT_LATEST); + + expect(mockVerifyPublishedPackage).toHaveBeenCalledWith( + '@react-native-community/template', + version, + null, + 18, + ); + }); + + it('waits on npm updating version and latest tag', async () => { + const IS_LATEST = true; + const version = '0.77.0'; + + await verifyPublishedTemplate(version, IS_LATEST); + + expect(mockVerifyPublishedPackage).toHaveBeenCalledWith( + '@react-native-community/template', + version, + 'latest', + 18, + ); + }); + + describe('retries', () => { + it('will timeout if npm does not update package version after a set number of retries', async () => { + const RETRIES = 2; + + await verifyPublishedTemplate('0.77.0', true, RETRIES), + expect(mockVerifyPublishedPackage).toHaveBeenCalledWith( + '@react-native-community/template', + '0.77.0', + 'latest', + 2, + ); + }); + }); +}); diff --git a/.github/workflow-scripts/__tests__/verifyPublishedPackage-test.js b/.github/workflow-scripts/__tests__/verifyPublishedPackage-test.js new file mode 100644 index 000000000000..95e22baa854e --- /dev/null +++ b/.github/workflow-scripts/__tests__/verifyPublishedPackage-test.js @@ -0,0 +1,135 @@ +/** + * 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. + * + * @format + */ + +const {verifyPublishedPackage} = require('../verifyPublishedPackage'); + +const mockRun = jest.fn(); +const mockSleep = jest.fn(); +const mockGetNpmPackageInfo = jest.fn(); +const silence = () => {}; + +const REACT_NATIVE_PACKAGE = 'react-native'; + +jest.mock('../utils.js', () => ({ + log: silence, + run: mockRun, + sleep: mockSleep, + getNpmPackageInfo: mockGetNpmPackageInfo, +})); + +describe('#verifyPublishedPackage', () => { + beforeEach(jest.clearAllMocks); + + it("waits on npm updating for version and not 'latest'", async () => { + mockGetNpmPackageInfo + // template@ + .mockReturnValueOnce(Promise.reject('mock http/404')) + .mockReturnValueOnce(Promise.resolve()); + mockSleep.mockReturnValueOnce(Promise.resolve()).mockImplementation(() => { + throw new Error('Should not be called again!'); + }); + + const version = '0.78.0'; + await verifyPublishedPackage(REACT_NATIVE_PACKAGE, version, null); + + expect(mockGetNpmPackageInfo).toHaveBeenLastCalledWith( + REACT_NATIVE_PACKAGE, + version, + ); + }); + + it('waits on npm updating version and latest tag', async () => { + const version = '0.78.0'; + mockGetNpmPackageInfo + // template@latest → unknown tag + .mockReturnValueOnce(Promise.reject('mock http/404')) + // template@latest != version → old tag + .mockReturnValueOnce(Promise.resolve({version: '0.76.5'})) + // template@latest == version → correct tag + .mockReturnValueOnce(Promise.resolve({version})); + mockSleep + .mockReturnValueOnce(Promise.resolve()) + .mockReturnValueOnce(Promise.resolve()) + .mockImplementation(() => { + throw new Error('Should not be called again!'); + }); + + await verifyPublishedPackage(REACT_NATIVE_PACKAGE, version, 'latest'); + + expect(mockGetNpmPackageInfo).toHaveBeenCalledWith( + REACT_NATIVE_PACKAGE, + 'latest', + ); + }); + + it('waits on npm updating version and next tag', async () => { + const version = '0.78.0-rc.0'; + mockGetNpmPackageInfo + // template@latest → unknown tag + .mockReturnValueOnce(Promise.reject('mock http/404')) + // template@latest != version → old tag + .mockReturnValueOnce(Promise.resolve({version: '0.76.5'})) + // template@latest == version → correct tag + .mockReturnValueOnce(Promise.resolve({version})); + mockSleep + .mockReturnValueOnce(Promise.resolve()) + .mockReturnValueOnce(Promise.resolve()) + .mockImplementation(() => { + throw new Error('Should not be called again!'); + }); + await verifyPublishedPackage(REACT_NATIVE_PACKAGE, version, 'next'); + + expect(mockGetNpmPackageInfo).toHaveBeenCalledWith( + REACT_NATIVE_PACKAGE, + 'next', + ); + }); + + describe('timeouts', () => { + let mockProcess; + beforeEach(() => { + mockProcess = jest.spyOn(process, 'exit').mockImplementation(code => { + throw new Error(`process.exit(${code}) called!`); + }); + }); + afterEach(() => mockProcess.mockRestore()); + it('will timeout if npm does not update package version after a set number of retries', async () => { + const RETRIES = 2; + mockGetNpmPackageInfo.mockReturnValue(Promise.reject('mock http/404')); + mockSleep.mockReturnValue(Promise.resolve()); + await expect(() => + verifyPublishedPackage( + REACT_NATIVE_PACKAGE, + '0.77.0', + 'latest', + RETRIES, + ), + ).rejects.toThrowError('process.exit(1) called!'); + expect(mockGetNpmPackageInfo).toHaveBeenCalledTimes(RETRIES); + }); + + it('will timeout if npm does not update latest tag after a set number of retries', async () => { + const RETRIES = 7; + const IS_LATEST = true; + mockGetNpmPackageInfo.mockReturnValue( + Promise.resolve({version: '0.76.5'}), + ); + mockSleep.mockReturnValue(Promise.resolve()); + await expect(async () => { + await verifyPublishedPackage( + REACT_NATIVE_PACKAGE, + '0.77.0', + 'latest', + RETRIES, + ); + }).rejects.toThrowError('process.exit(1) called!'); + expect(mockGetNpmPackageInfo).toHaveBeenCalledTimes(RETRIES); + }); + }); +}); diff --git a/.github/workflow-scripts/__tests__/verifyReleaseOnNpm-test.js b/.github/workflow-scripts/__tests__/verifyReleaseOnNpm-test.js new file mode 100644 index 000000000000..4850e256b5ab --- /dev/null +++ b/.github/workflow-scripts/__tests__/verifyReleaseOnNpm-test.js @@ -0,0 +1,109 @@ +/** + * 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. + * + * @format + */ + +const {verifyReleaseOnNpm} = require('../verifyReleaseOnNpm'); + +const mockVerifyPublishedPackage = jest.fn(); +const silence = () => {}; + +jest.mock('../utils.js', () => ({ + log: silence, + sleep: silence, +})); + +jest.mock('../verifyPublishedPackage.js', () => ({ + verifyPublishedPackage: mockVerifyPublishedPackage, +})); + +describe('#verifyReleaseOnNPM', () => { + beforeEach(jest.clearAllMocks); + + it("waits on npm updating for version and not 'latest'", async () => { + const NOT_LATEST = false; + const version = '0.78.0'; + await verifyReleaseOnNpm(version, NOT_LATEST); + + expect(mockVerifyPublishedPackage).toHaveBeenLastCalledWith( + 'react-native', + version, + null, + 18, + ); + }); + + it('waits on npm updating version and latest tag', async () => { + const IS_LATEST = true; + const version = '0.78.0'; + + await verifyReleaseOnNpm(version, IS_LATEST); + + expect(mockVerifyPublishedPackage).toHaveBeenCalledWith( + 'react-native', + version, + 'latest', + 18, + ); + }); + + it('waits on npm updating version, not latest and next tag', async () => { + const IS_LATEST = false; + const version = '0.78.0-rc.0'; + + await verifyReleaseOnNpm(version, IS_LATEST); + + expect(mockVerifyPublishedPackage).toHaveBeenCalledWith( + 'react-native', + version, + 'next', + 18, + ); + }); + + it('waits on npm updating version, latest and next tag', async () => { + const IS_LATEST = true; + const version = '0.78.0-rc.0'; + + await verifyReleaseOnNpm(version, IS_LATEST); + + expect(mockVerifyPublishedPackage).toHaveBeenCalledWith( + 'react-native', + version, + 'next', + 18, + ); + }); + + describe('timeouts', () => { + it('will timeout if npm does not update package version after a set number of retries', async () => { + const RETRIES = 2; + + await verifyReleaseOnNpm('0.77.0', true, RETRIES), + expect(mockVerifyPublishedPackage).toHaveBeenCalledWith( + 'react-native', + '0.77.0', + 'latest', + 2, + ); + }); + + it('will timeout if npm does not update latest tag after a set number of retries', async () => { + const RETRIES = 7; + const IS_LATEST = true; + + await verifyReleaseOnNpm('0.77.0', IS_LATEST, RETRIES); + + expect(mockVerifyPublishedPackage).toHaveBeenCalledWith( + 'react-native', + '0.77.0', + 'latest', + 7, + ); + }); + }); +}); diff --git a/.github/workflow-scripts/actOnLabel.js b/.github/workflow-scripts/actOnLabel.js index a4c2158466ca..826fce7d23b6 100644 --- a/.github/workflow-scripts/actOnLabel.js +++ b/.github/workflow-scripts/actOnLabel.js @@ -48,96 +48,84 @@ module.exports = async (github, context, labelWithContext) => { switch (labelWithContext.label) { case 'Type: Invalid': await addComment( - `| :warning: | Issue is Invalid |\n` + - `| --- | --- |\n` + - `| :information_source: | This issue doesn't match any of the expected types for this repository - closing. |`, + `> [!CAUTION]\n` + + `> **Invalid issue**: This issue is not valid, either is not a bug in React Native, it doesn't match any of the issue template, or we can't help further with this.`, ); await closeIssue(); return; case 'Type: Question': await addComment( - `| :warning: | Issue is a Question |\n` + - `| --- | --- |\n` + - `| :information_source: | We are using GitHub issues exclusively to track bugs in React Native. GitHub may not be the ideal place to ask a question, but you can try asking over on [Stack Overflow](http://stackoverflow.com/questions/tagged/react-native), or on [Reactiflux](https://www.reactiflux.com/). |`, + `> [!NOTE]\n` + + `> **Not a bug report**: This issue looks like a question. We are using GitHub issues exclusively to track bugs in React Native. GitHub may not be the ideal place to ask a question, but you can try asking over on [Stack Overflow](http://stackoverflow.com/questions/tagged/react-native), or on [Reactiflux](https://www.reactiflux.com/).`, ); await closeIssue(); return; - case 'Type: Docs': + case 'Resolution: For Stack Overflow': await addComment( - `| :warning: | Documentation Issue |\n` + - `| --- | --- |\n` + - `| :information_source: | Please report documentation issues in the [react-native-website](https://github.com/facebook/react-native-website/issues) repository. |`, + `> [!NOTE]\n` + + `> **Not a bug report**: This issue looks like a question. We are using GitHub issues exclusively to track bugs in React Native. GitHub may not be the ideal place to ask a question, but you can try asking over on [Stack Overflow](http://stackoverflow.com/questions/tagged/react-native), or on [Reactiflux](https://www.reactiflux.com/).`, ); await closeIssue(); return; - case 'Resolution: For Stack Overflow': + case 'Type: Docs': await addComment( - `| :warning: | Issue is a Question |\n` + - `| --- | --- |\n` + - `| :information_source: | We are using GitHub issues exclusively to track bugs in the core React Native library. Please try asking over on [Stack Overflow](http://stackoverflow.com/questions/tagged/react-native) as it is better suited for this type of question. |`, + `> [!NOTE]\n` + + `> **Docs issue**: This issue looks like an issue related to our docs. Please report documentation issues in the [react-native-website](https://github.com/facebook/react-native-website/issues) repository.`, ); await closeIssue(); return; case 'Type: Expo': await addComment( - `| :warning: | Issue is Related to Expo |\n` + - `| --- | --- |\n` + - `| :information_source: | It looks like your issue is related to Expo and not React Native core. Please open your issue in [Expo's repository](https://github.com/expo/expo/issues/new). If you are able to create a repro that showcases that this issue is also happening in React Native vanilla, we will be happy to re-open. |`, + `> [!NOTE]\n` + + `> **Expo related**: It looks like your issue is related to Expo and not React Native core. Please open your issue in [Expo's repository](https://github.com/expo/expo/issues/new). If you are able to create a repro that showcases that this issue is also happening in React Native vanilla, we will be happy to re-open.`, ); await closeIssue(); return; case 'Needs: Issue Template': await addComment( - `| :warning: | Missing Required Fields |\n` + - `| --- | --- |\n` + - `| :information_source: | It looks like your issue may be missing some necessary information. GitHub provides an example template whenever a [new issue is created](https://github.com/facebook/react-native/issues/new?template=bug_report.md). Could you go back and make sure to fill out the template? You may edit this issue, or close it and open a new one. |`, + `> [!WARNING]\n` + + `> **Missing issue template**: It looks like your issue may be missing some necessary information. GitHub provides an example template whenever a [new issue is created](https://github.com/facebook/react-native/issues/new?assignees=&labels=Needs%3A+Triage+%3Amag%3A&projects=&template=bug_report.yml). Could you go back and make sure to fill out the template? You may edit this issue, or close it and open a new one.`, ); await requestAuthorFeedback(); return; case 'Needs: Environment Info': await addComment( - `| :warning: | Missing Environment Information |\n` + - `| --- | --- |\n` + - `| :information_source: | Your issue may be missing information about your development environment. You can obtain the missing information by running react-native info in a console. |`, + `> [!WARNING]\n` + + `> **Missing info**: It looks like your issue may be missing information about your development environment. You can obtain the missing information by running react-native info in a console.`, ); await requestAuthorFeedback(); return; case 'Newer Patch Available': await addComment( - `| :warning: | Newer Version of React Native is Available! |\n` + - `| --- | --- |\n` + - `| :information_source: | You are on a supported minor version, but it looks like there's a newer patch available - ${labelWithContext.newestPatch}. Please [upgrade](https://reactnative.dev/docs/upgrading) to the highest patch for your minor or latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If it does not repro, please let us know so we can close out this issue. This helps us ensure we are looking at issues that still exist in the most recent releases. |`, + `> [!TIP]\n` + + `> **Newer version available**: You are on a supported minor version, but it looks like there's a newer patch available - ${labelWithContext.newestPatch}. Please [upgrade](https://reactnative.dev/docs/upgrading) to the highest patch for your minor or latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If it does not repro, please let us know so we can close out this issue. This helps us ensure we are looking at issues that still exist in the most recent releases.`, ); return; case 'Needs: Version Info': await addComment( - `| :warning: | Add or Reformat Version Info |\n` + - `| --- | --- |\n` + - `| :information_source: | We could not find or parse the version number of React Native in your issue report. Please use the template, and report your version including major, minor, and patch numbers - e.g. 0.70.2 |`, + `> [!WARNING]\n` + + `> **Could not parse version**: We could not find or parse the version number of React Native in your issue report. Please use the template, and report your version including major, minor, and patch numbers - e.g. 0.76.2.`, ); await requestAuthorFeedback(); return; case 'Needs: Repro': await addComment( - `| :warning: | Missing Reproducible Example |\n` + - `| --- | --- |\n` + - `| :information_source: | We could not detect a reproducible example in your issue report. Please provide either:
  • If your bug is UI related: a [Snack](https://snack.expo.dev)
  • If your bug is build/update related: use our [Reproducer Template](https://github.com/react-native-community/reproducer-react-native/generate)
|`, + `> [!WARNING]\n` + + `> **Missing reproducer**: We could not detect a reproducible example in your issue report. Please provide either:
  • If your bug is UI related: a [Snack](https://snack.expo.dev)
  • If your bug is build/upgrade related: a project using our [Reproducer Template](https://github.com/react-native-community/reproducer-react-native/generate)
  • Otherwise send us a Pull Request with the [RNTesterPlayground.js](https://github.com/facebook/react-native/blob/main/packages/rn-tester/js/examples/Playground/RNTesterPlayground.js) edited to reproduce your bug.
`, ); await requestAuthorFeedback(); return; case 'Type: Unsupported Version': await addComment( - `| :warning: | Unsupported Version of React Native |\n` + - `| --- | --- |\n` + - `| :information_source: | It looks like your issue or the example you provided uses an [unsupported version of React Native](https://github.com/reactwg/react-native-releases/blob/main/README.md#releases-support-policy).

Due to the number of issues we receive, we're currently only accepting new issues against one of the supported versions. Please [upgrade](https://reactnative.dev/docs/upgrading) to latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If you cannot upgrade, please open your issue on [StackOverflow](https://stackoverflow.com/questions/tagged/react-native) to get further community support. |`, + `> [!WARNING]\n` + + `> **Unsupported version**: It looks like your issue or the example you provided uses an [unsupported version of React Native](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md).

Due to the number of issues we receive, we're currently only accepting new issues against one of the supported versions. Please [upgrade](https://reactnative.dev/docs/upgrading) to latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If you cannot upgrade, please open your issue on [StackOverflow](https://stackoverflow.com/questions/tagged/react-native) to get further community support.`, ); await requestAuthorFeedback(); return; case 'Type: Too Old Version': await addComment( - `| :warning: | Too Old Version of React Native |\n` + - `| --- | --- |\n` + - `| :information_source: | It looks like your issue or the example you provided uses a [**Too Old Version of React Native**](https://github.com/reactwg/react-native-releases/blob/main/README.md#releases-support-policy).

Due to the number of issues we receive, we're currently only accepting new issues against one of the supported versions. Please [upgrade](https://reactnative.dev/docs/upgrading) to latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If you cannot upgrade, please open your issue on [StackOverflow](https://stackoverflow.com/questions/tagged/react-native) to get further community support. |`, + `> [!CAUTION]\n` + + `> **Too old version**: It looks like your issue or the example you provided uses a [**Too Old Version of React Native**](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md).

Due to the number of issues we receive, we're currently only accepting new issues against one of the supported versions. Please [upgrade](https://reactnative.dev/docs/upgrading) to latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If you cannot upgrade, please open your issue on [StackOverflow](https://stackoverflow.com/questions/tagged/react-native) to get further community support.`, ); await closeIssue(); return; diff --git a/.github/workflow-scripts/analyze_code.sh b/.github/workflow-scripts/analyze_code.sh new file mode 100755 index 000000000000..ebb6a1d72eeb --- /dev/null +++ b/.github/workflow-scripts/analyze_code.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# 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. + +GITHUB_OWNER=-facebook +GITHUB_REPO=-react-native +export GITHUB_OWNER +export GITHUB_REPO + +cat <(echo eslint; npm run lint --silent -- --format=json; echo flow; npm run flow-check --silent --json; echo google-java-format; node scripts/lint-java.js --diff) | node packages/react-native-bots/code-analysis-bot.js + +STATUS=$? +if [ $STATUS == 0 ]; then + echo "Code analyzed successfully." +else + echo "Code analysis failed, error status $STATUS." +fi diff --git a/.github/workflow-scripts/analyze_scripts.sh b/.github/workflow-scripts/analyze_scripts.sh new file mode 100755 index 000000000000..5f9bcfadee49 --- /dev/null +++ b/.github/workflow-scripts/analyze_scripts.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# 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. + +GITHUB_OWNER=-facebook +GITHUB_REPO=-react-native +export GITHUB_OWNER +export GITHUB_REPO + +if [ -x "$(command -v shellcheck)" ]; then + IFS=$'\n' + + find . \ + -type f \ + -not -path "*node_modules*" \ + -not -path "*third-party*" \ + -name '*.sh' \ + -exec sh -c 'shellcheck "$1"' -- {} \; + +else + echo 'shellcheck is not installed. See https://github.com/facebook/react-native/wiki/Development-Dependencies#shellcheck for instructions.' + exit 1 +fi diff --git a/.github/workflow-scripts/checkForReproducer.js b/.github/workflow-scripts/checkForReproducer.js index b4814d5441d9..f1f336da2ca5 100644 --- a/.github/workflow-scripts/checkForReproducer.js +++ b/.github/workflow-scripts/checkForReproducer.js @@ -9,11 +9,6 @@ const NEEDS_REPRO_LABEL = 'Needs: Repro'; const NEEDS_AUTHOR_FEEDBACK_LABEL = 'Needs: Author Feedback'; -const NEEDS_REPRO_HEADER = 'Missing Reproducible Example'; -const NEEDS_REPRO_MESSAGE = - `| :warning: | Missing Reproducible Example |\n` + - `| --- | --- |\n` + - `| :information_source: | We could not detect a reproducible example in your issue report. Please provide either:
  • If your bug is UI related: a [Snack](https://snack.expo.dev)
  • If your bug is build/update related: use our [Reproducer Template](https://github.com/react-native-community/reproducer-react-native/generate). A reproducer needs to be in a GitHub repository under your username.
|`; const SKIP_ISSUES_OLDER_THAN = '2023-07-01T00:00:00Z'; module.exports = async (github, context) => { @@ -25,7 +20,6 @@ module.exports = async (github, context) => { const issue = await github.rest.issues.get(issueData); const comments = await github.rest.issues.listComments(issueData); - const author = issue.data.user.login; const issueDate = issue.data.created_at; @@ -43,10 +37,6 @@ module.exports = async (github, context) => { return; } - const botComment = comments.data.find(comment => - comment.body.includes(NEEDS_REPRO_HEADER), - ); - const entities = [issue.data, ...comments.data]; // Look for Snack or a GH repo associated with the user that added an issue or comment @@ -74,25 +64,11 @@ module.exports = async (github, context) => { throw error; } } - - if (!botComment) return; - - await github.rest.issues.deleteComment({ - ...issueData, - comment_id: botComment.id, - }); } else { await github.rest.issues.addLabels({ ...issueData, labels: [NEEDS_REPRO_LABEL, NEEDS_AUTHOR_FEEDBACK_LABEL], }); - - if (botComment) return; - - await github.rest.issues.createComment({ - ...issueData, - body: NEEDS_REPRO_MESSAGE, - }); } }; @@ -101,7 +77,7 @@ function containsPattern(body, pattern) { return body.search(regexp) !== -1; } -// Prevents the bot from responding when maintainer has changed Needs: Repro the label +// Prevents the bot from responding when maintainer has changed the 'Needs: Repro' label async function hasMaintainerChangedLabel(github, issueData, author) { const timeline = await github.rest.issues.listEventsForTimeline(issueData); diff --git a/scripts/circleci/check_license.sh b/.github/workflow-scripts/check_license.sh similarity index 89% rename from scripts/circleci/check_license.sh rename to .github/workflow-scripts/check_license.sh index bba12722c7d4..53b9dddcbe60 100755 --- a/scripts/circleci/check_license.sh +++ b/.github/workflow-scripts/check_license.sh @@ -7,7 +7,7 @@ set -e # Make sure we don't introduce accidental references to PATENTS. -EXPECTED='scripts/circleci/check_license.sh' +EXPECTED='.github/workflow-scripts/check_license.sh' ACTUAL=$(git grep -l PATENTS) if [ "$EXPECTED" != "$ACTUAL" ]; then diff --git a/scripts/circleci/exec_swallow_error.sh b/.github/workflow-scripts/exec_swallow_error.sh similarity index 100% rename from scripts/circleci/exec_swallow_error.sh rename to .github/workflow-scripts/exec_swallow_error.sh diff --git a/.github/workflow-scripts/maestro-android.js b/.github/workflow-scripts/maestro-android.js new file mode 100644 index 000000000000..62ee99a2279d --- /dev/null +++ b/.github/workflow-scripts/maestro-android.js @@ -0,0 +1,152 @@ +/** + * 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. + * + * @format + */ + +const childProcess = require('child_process'); +const fs = require('fs'); + +const usage = ` +=== Usage === +node maestro-android.js + +@param {string} appPath - Path to the app APK +@param {string} appId - App ID that needs to be launched +@param {string} maestroFlow - Path to the maestro flow to be executed +@param {string} flavor - Flavor of the app to be launched. Can be 'release' or 'debug' +@param {string} workingDirectory - Working directory from where to run Metro +============== +`; + +const args = process.argv.slice(2); + +if (args.length !== 5) { + throw new Error(`Invalid number of arguments.\n${usage}`); +} + +const APP_PATH = args[0]; +const APP_ID = args[1]; +const MAESTRO_FLOW = args[2]; +const IS_DEBUG = args[3] === 'debug'; +const WORKING_DIRECTORY = args[4]; + +const MAX_ATTEMPTS = 3; + +async function executeFlowWithRetries(flow, currentAttempt) { + try { + console.info(`Executing flow: ${flow}`); + const timeout = 1000 * 60 * 10; // 10 minutes + childProcess.execSync( + `MAESTRO_DRIVER_STARTUP_TIMEOUT=120000 $HOME/.maestro/bin/maestro test ${flow} --format junit -e APP_ID=${APP_ID} --debug-output /tmp/MaestroLogs`, + {stdio: 'inherit', timeout}, + ); + } catch (err) { + if (currentAttempt < MAX_ATTEMPTS) { + console.info(`Retrying...`); + await executeFlowWithRetries(flow, currentAttempt + 1); + } else { + throw err; + } + } +} + +async function executeFlowInFolder(flowFolder) { + const files = fs.readdirSync(flowFolder); + for (const file of files) { + const filePath = `${flowFolder}/${file}`; + if (fs.lstatSync(filePath).isDirectory()) { + await executeFlowInFolder(filePath); + } else { + await executeFlowWithRetries(filePath, 0); + } + } +} + +async function main() { + console.info('\n=============================='); + console.info('Running tests for Android with the following parameters:'); + console.info(`APP_PATH: ${APP_PATH}`); + console.info(`APP_ID: ${APP_ID}`); + console.info(`MAESTRO_FLOW: ${MAESTRO_FLOW}`); + console.info(`IS_DEBUG: ${IS_DEBUG}`); + console.info(`WORKING_DIRECTORY: ${WORKING_DIRECTORY}`); + console.info('==============================\n'); + + console.info('Install app'); + childProcess.execSync(`adb install ${APP_PATH}`, {stdio: 'ignore'}); + + let metroProcess = null; + if (IS_DEBUG) { + console.info('Start Metro'); + childProcess.execSync(`cd ${WORKING_DIRECTORY}`, {stdio: 'ignore'}); + metroProcess = childProcess.spawn('yarn', ['start', '&'], { + cwd: WORKING_DIRECTORY, + stdio: 'ignore', + detached: true, + }); + metroProcess.unref(); + console.info(`- Metro PID: ${metroProcess.pid}`); + + console.info('Wait For Metro to Start'); + await sleep(5000); + } + + console.info('Start the app'); + childProcess.execSync(`adb shell monkey -p ${APP_ID} 1`, {stdio: 'ignore'}); + + if (IS_DEBUG) { + console.info('Wait For App to warm from Metro'); + await sleep(10000); + } + + console.info('Start recording to /sdcard/screen.mp4'); + childProcess + .exec('adb shell screenrecord /sdcard/screen.mp4', { + stdio: 'ignore', + detached: true, + }) + .unref(); + + console.info(`Start testing ${MAESTRO_FLOW}`); + let error = null; + try { + //check if MAESTRO_FLOW is a folder + if ( + fs.existsSync(MAESTRO_FLOW) && + fs.lstatSync(MAESTRO_FLOW).isDirectory() + ) { + await executeFlowInFolder(MAESTRO_FLOW); + } else { + await executeFlowWithRetries(MAESTRO_FLOW, 0); + } + } catch (err) { + error = err; + } finally { + console.info('Stop recording'); + childProcess.execSync('adb pull /sdcard/screen.mp4', {stdio: 'ignore'}); + + if (IS_DEBUG && metroProcess != null) { + const pid = metroProcess.pid; + console.info(`Kill Metro. PID: ${pid}`); + process.kill(pid); + console.info(`Metro Killed`); + } + } + + if (error) { + throw error; + } + process.exit(); +} + +function sleep(ms) { + return new Promise(resolve => { + setTimeout(resolve, ms); + }); +} + +main(); diff --git a/.github/workflow-scripts/maestro-ios.js b/.github/workflow-scripts/maestro-ios.js new file mode 100644 index 000000000000..c2b4b80b6117 --- /dev/null +++ b/.github/workflow-scripts/maestro-ios.js @@ -0,0 +1,176 @@ +/** + * 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. + * + * @format + */ + +const childProcess = require('child_process'); +const fs = require('fs'); + +const usage = ` +=== Usage === +node maestro-android.js + +@param {string} appPath - Path to the app APK +@param {string} appId - App ID that needs to be launched +@param {string} maestroFlow - Path to the maestro flow to be executed +@param {string} jsengine - The JSEngine to use for the test +@param {string} flavor - Flavor of the app to be launched. Can be 'Release' or 'Debug' +@param {string} workingDirectory - Working directory from where to run Metro +============== +`; + +const args = process.argv.slice(2); + +if (args.length !== 6) { + throw new Error(`Invalid number of arguments.\n${usage}`); +} + +const APP_PATH = args[0]; +const APP_ID = args[1]; +const MAESTRO_FLOW = args[2]; +const JS_ENGINE = args[3]; +const IS_DEBUG = args[4] === 'Debug'; +const WORKING_DIRECTORY = args[5]; + +const MAX_ATTEMPTS = 5; + +function launchSimulator(simulatorName) { + console.log(`Launching simulator ${simulatorName}`); + try { + childProcess.execSync(`xcrun simctl boot "${simulatorName}"`); + } catch (error) { + if ( + !error.message.includes('Unable to boot device in current state: Booted') + ) { + throw error; + } + } +} + +function installAppOnSimulator(appPath) { + console.log(`Installing app at path ${appPath}`); + childProcess.execSync(`xcrun simctl install booted "${appPath}"`); +} + +function extractSimulatorUDID() { + console.log('Retrieving device UDID'); + const command = `xcrun simctl list devices booted -j | jq -r '[.devices[]] | add | first | .udid'`; + const udid = String(childProcess.execSync(command)).trim(); + console.log(`UDID is ${udid}`); + return udid; +} + +function bringSimulatorInForeground() { + console.log('Bringing simulator in foreground'); + childProcess.execSync('open -a simulator'); +} + +function sleep(ms) { + return new Promise(resolve => { + setTimeout(resolve, ms); + }); +} + +async function launchAppOnSimulator(appId, udid, isDebug) { + console.log('Launch the app'); + childProcess.execSync(`xcrun simctl launch "${udid}" "${appId}"`); + + if (isDebug) { + console.log('Wait for metro to warm'); + await sleep(20 * 1000); + } +} + +function startVideoRecording(jsengine, currentAttempt) { + console.log( + `Start video record using pid: video_record_${jsengine}_${currentAttempt}.pid`, + ); + + const recordingArgs = + `simctl io booted recordVideo video_record_${jsengine}_${currentAttempt}.mov`.split( + ' ', + ); + const recordingProcess = childProcess.spawn('xcrun', recordingArgs, { + detached: true, + stdio: 'ignore', + }); + + return recordingProcess; +} + +function stopVideoRecording(recordingProcess) { + if (!recordingProcess) { + console.log("Passed a null recording process. Can't kill it"); + return; + } + + console.log(`Stop video record using pid: ${recordingProcess.pid}`); + + recordingProcess.kill('SIGINT'); +} + +function executeTestsWithRetries( + appId, + udid, + maestroFlow, + jsengine, + currentAttempt, +) { + const recProcess = startVideoRecording(jsengine, currentAttempt); + try { + const timeout = 1000 * 60 * 10; // 10 minutes + const command = `$HOME/.maestro/bin/maestro --udid="${udid}" test "${maestroFlow}" --format junit -e APP_ID="${appId}"`; + console.log(command); + childProcess.execSync(`MAESTRO_DRIVER_STARTUP_TIMEOUT=1500000 ${command}`, { + stdio: 'inherit', + timeout, + }); + + stopVideoRecording(recProcess); + } catch (error) { + // Can't put this in the finally block because it will be executed after the + // recursive call of executeTestsWithRetries + stopVideoRecording(recProcess); + + if (currentAttempt < MAX_ATTEMPTS) { + executeTestsWithRetries( + appId, + udid, + maestroFlow, + jsengine, + currentAttempt + 1, + ); + } else { + console.error(`Failed to execute flow after ${MAX_ATTEMPTS} attempts.`); + throw error; + } + } +} + +async function main() { + console.info('\n=============================='); + console.info('Running tests for iOS with the following parameters:'); + console.info(`APP_PATH: ${APP_PATH}`); + console.info(`APP_ID: ${APP_ID}`); + console.info(`MAESTRO_FLOW: ${MAESTRO_FLOW}`); + console.info(`JS_ENGINE: ${JS_ENGINE}`); + console.info(`IS_DEBUG: ${IS_DEBUG}`); + console.info(`WORKING_DIRECTORY: ${WORKING_DIRECTORY}`); + console.info('==============================\n'); + + const simulatorName = 'iPhone 15 Pro'; + launchSimulator(simulatorName); + installAppOnSimulator(APP_PATH); + const udid = extractSimulatorUDID(); + bringSimulatorInForeground(); + await launchAppOnSimulator(APP_ID, udid, IS_DEBUG); + executeTestsWithRetries(APP_ID, udid, MAESTRO_FLOW, JS_ENGINE, 1); + console.log('Test finished'); + process.exit(0); +} + +main(); diff --git a/.github/workflow-scripts/publishTemplate.js b/.github/workflow-scripts/publishTemplate.js new file mode 100644 index 000000000000..2119446b3eca --- /dev/null +++ b/.github/workflow-scripts/publishTemplate.js @@ -0,0 +1,82 @@ +/** + * 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. + * + * @format + */ + +const {run, sleep, log} = require('./utils.js'); +const {verifyPublishedPackage} = require('./verifyPublishedPackage.js'); + +const TAG_AS_LATEST_REGEX = /#publish-packages-to-npm&latest/; + +/** + * Should this commit be `latest` on npm? + */ +function isLatest() { + const commitMessage = run('git log -n1 --pretty=%B'); + return TAG_AS_LATEST_REGEX.test(commitMessage); +} +module.exports.isLatest = isLatest; + +/** + * Create a Github Action to publish the community template matching the released version + * of React Native. + */ +module.exports.publishTemplate = async (github, version, dryRun = true) => { + log(`📤 Get the ${TEMPLATE_NPM_PKG} repo to publish ${version}`); + + const is_latest_on_npm = isLatest(); + + const majorMinor = /^v?(\d+\.\d+)/.exec(version); + + if (!majorMinor) { + log(`🔥 can't capture MAJOR.MINOR from '${version}', giving up.`); + process.exit(1); + } + + // MAJOR.MINOR-stable + const ref = `${majorMinor[1]}-stable`; + + await github.rest.actions.createWorkflowDispatch({ + owner: 'react-native-community', + repo: 'template', + workflow_id: 'release.yaml', + ref, + inputs: { + dry_run: dryRun, + is_latest_on_npm, + // 0.75.0-rc.0, note no 'v' prefix + version: version.replace(/^v/, ''), + }, + }); +}; + +const MAX_RETRIES = 3 * 6; // 18 attempts. Waiting between attempt: 10 s. Total time: 3 mins. +const TEMPLATE_NPM_PKG = '@react-native-community/template'; + +/** + * Will verify that @latest and the @ have been published. + * + * NOTE: This will infinitely query each step until successful, make sure the + * calling job has a timeout. + */ +module.exports.verifyPublishedTemplate = async ( + version, + latest = false, + retries = MAX_RETRIES, +) => { + try { + await verifyPublishedPackage( + TEMPLATE_NPM_PKG, + version, + latest ? 'latest' : null, + retries, + ); + } catch (e) { + console.error(e.message); + process.exit(1); + } +}; diff --git a/.github/workflow-scripts/utils.js b/.github/workflow-scripts/utils.js new file mode 100644 index 000000000000..3ed454775219 --- /dev/null +++ b/.github/workflow-scripts/utils.js @@ -0,0 +1,33 @@ +/** + * 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. + * + * @format + */ + +const {execSync} = require('child_process'); + +const log = (...args) => console.log(...args); + +async function getNpmPackageInfo(pkg, versionOrTag) { + return fetch(`https://registry.npmjs.org/${pkg}/${versionOrTag}`).then(resp => + resp.json(), + ); +} + +async function sleep(seconds) { + return new Promise(resolve => setTimeout(resolve, seconds * 1000)); +} + +function run(cmd) { + return execSync(cmd, 'utf8').toString().trim(); +} + +module.exports = { + log, + getNpmPackageInfo, + sleep, + run, +}; diff --git a/.github/workflow-scripts/verifyPublishedPackage.js b/.github/workflow-scripts/verifyPublishedPackage.js new file mode 100644 index 000000000000..b7358b9b253d --- /dev/null +++ b/.github/workflow-scripts/verifyPublishedPackage.js @@ -0,0 +1,63 @@ +/** + * 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. + * + * @format + */ + +const {log, getNpmPackageInfo, sleep} = require('./utils'); + +const SLEEP_S = 10; +const MAX_RETRIES = 3 * 6; // 18 attempts. Waiting between attempt: 10 s. Total time: 3 mins. + +async function verifyPublishedPackage( + packageName, + version, + tag = null, + retries = MAX_RETRIES, +) { + log(`🔍 Is ${packageName}@${version} on npm?`); + + let count = retries; + while (count-- > 0) { + try { + const json = await getNpmPackageInfo(packageName, tag ? tag : version); + log(`🎉 Found ${packageName}@${version} on npm`); + if (!tag) { + return; + } + + // check for next tag + if (tag === 'next' && json.version === version) { + log(`🎉 ${packageName}@next → ${version} on npm`); + return; + } + + // Check for latest tag + if (tag === 'latest' && json.version === version) { + log(`🎉 ${packageName}@latest → ${version} on npm`); + return; + } + + log( + `🐌 ${packageName}@${tag} → ${json.version} on npm and not ${version} as expected, retrying...`, + ); + } catch (e) { + log(`Nope, fetch failed: ${e.message}`); + } + await sleep(SLEEP_S); + } + + let msg = `🚨 Timed out when trying to verify ${packageName}@${version} on npm`; + if (tag) { + msg += ` and ${tag} tag points to this version.`; + } + log(msg); + process.exit(1); +} + +module.exports = { + verifyPublishedPackage, +}; diff --git a/.github/workflow-scripts/verifyReleaseOnNpm.js b/.github/workflow-scripts/verifyReleaseOnNpm.js new file mode 100644 index 000000000000..1472f7950e60 --- /dev/null +++ b/.github/workflow-scripts/verifyReleaseOnNpm.js @@ -0,0 +1,27 @@ +/** + * 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. + * + * @format + */ + +const {run, sleep, log} = require('./utils.js'); +const {verifyPublishedPackage} = require('./verifyPublishedPackage.js'); +const REACT_NATIVE_NPM_PKG = 'react-native'; +const MAX_RETRIES = 3 * 6; // 18 attempts. Waiting between attempt: 10 s. Total time: 3 mins. +/** + * Will verify that @latest, @next and the @ have been published. + * + * NOTE: This will infinitely query each step until successful, make sure the + * calling job has a timeout. + */ +module.exports.verifyReleaseOnNpm = async ( + version, + latest = false, + retries = MAX_RETRIES, +) => { + const tag = version.includes('-rc.') ? 'next' : latest ? 'latest' : null; + await verifyPublishedPackage(REACT_NATIVE_NPM_PKG, version, tag, retries); +}; diff --git a/.github/workflow-scripts/verifyVersion.js b/.github/workflow-scripts/verifyVersion.js index c28c6b0dd11f..5f51adff75e5 100644 --- a/.github/workflow-scripts/verifyVersion.js +++ b/.github/workflow-scripts/verifyVersion.js @@ -10,11 +10,6 @@ module.exports = async (github, context) => { const issue = context.payload.issue; - // Ignore issues using upgrade template (they use a special label) - if (issue.labels.find(label => label.name === 'Type: Upgrade Issue')) { - return; - } - const issueVersionUnparsed = getReactNativeVersionFromIssueBodyIfExists(issue); const issueVersion = parseVersionFromString(issueVersionUnparsed); diff --git a/.github/workflows/check-nightly.yml b/.github/workflows/check-nightly.yml index 2fb26d108110..95974e965707 100644 --- a/.github/workflows/check-nightly.yml +++ b/.github/workflows/check-nightly.yml @@ -13,6 +13,8 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' steps: + - name: Checkout + uses: actions/checkout@v4 - name: Check nightly run: | TODAY=$(date "+%Y%m%d") @@ -24,3 +26,7 @@ jobs: else echo 'Nightly Worked, All Good!' fi + + test-libraries: + uses: ./.github/workflows/test-libraries-on-nightlies.yml + needs: check-nightly diff --git a/.github/workflows/danger-pr.yml b/.github/workflows/danger-pr.yml index 6d0bd1622705..2db802350d96 100644 --- a/.github/workflows/danger-pr.yml +++ b/.github/workflows/danger-pr.yml @@ -18,9 +18,8 @@ jobs: if: github.repository == 'facebook/react-native' steps: - uses: actions/checkout@v4 - - name: Run Yarn Install on Root - run: yarn install - working-directory: . + - name: Run yarn install + uses: ./.github/actions/yarn-install - name: Danger run: yarn danger ci --use-github-checks --failOnErrors working-directory: packages/react-native-bots diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml deleted file mode 100644 index eb1ab715d172..000000000000 --- a/.github/workflows/gradle-wrapper-validation.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: "Validate Gradle Wrapper" - -on: - push: - pull_request: - -jobs: - validation: - name: "Validation" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: gradle/actions/wrapper-validation@v3 diff --git a/.github/workflows/monitor-new-issues.yml b/.github/workflows/monitor-new-issues.yml new file mode 100644 index 000000000000..632cf62f584e --- /dev/null +++ b/.github/workflows/monitor-new-issues.yml @@ -0,0 +1,27 @@ +name: Monitor React Native New Issues + +on: + schedule: + - cron: "0 0,6,12,18 * * *" + workflow_dispatch: + +jobs: + monitor-issues: + runs-on: ubuntu-latest + steps: + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + - name: Monitor New Issues + uses: react-native-community/repo-monitor@v1.0.1 + with: + task: "monitor-issues" + git_secret: ${{ secrets.GITHUB_TOKEN }} + notifier: "discord" + fetch_data_interval: 6 + repo_owner: "facebook" + repo_name: "react-native" + discord_webhook_url: "${{ secrets.DISCORD_WEBHOOK_URL }}" + discord_id_type: "role" + discord_ids: "1339243367841927228" diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index b7121c935740..d16d5df6efa4 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -67,7 +67,7 @@ jobs: fail-fast: false matrix: flavor: [Debug, Release] - slice: [macosx, iphoneos, iphonesimulator, catalyst, xros, xrsimulator] + slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator] steps: - name: Checkout uses: actions/checkout@v4 @@ -100,6 +100,9 @@ jobs: react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} flavor: ${{ matrix.flavor }} + prebuild_apple_dependencies: + uses: ./.github/workflows/prebuild-ios.yml + build_hermesc_linux: runs-on: ubuntu-latest needs: prepare_hermes_workspace @@ -153,6 +156,7 @@ jobs: uses: ./.github/actions/build-android with: release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }} + gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} build_npm_package: runs-on: 8-core-ubuntu @@ -164,13 +168,14 @@ jobs: build_hermesc_linux, build_hermesc_windows, build_android, + prebuild_apple_dependencies, ] container: image: reactnativecommunity/react-native-android:latest env: TERM: "dumb" GRADLE_OPTS: "-Dorg.gradle.daemon=false" - # By default we only build ARM64 to save time/resources. For release/nightlies/prealpha, we override this value to build all archs. + # 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 @@ -182,9 +187,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Build and Publish NPM PAckage + - 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/prebuild-ios.yml b/.github/workflows/prebuild-ios.yml new file mode 100644 index 000000000000..bb352b3c089b --- /dev/null +++ b/.github/workflows/prebuild-ios.yml @@ -0,0 +1,183 @@ +name: Prebuild iOS + +on: + workflow_call: # this directive allow us to call this workflow from other workflows + +jobs: + prepare_workspace: + name: Prepare workspace + runs-on: macos-14 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup node.js + uses: ./.github/actions/setup-node + - name: Restore cache if present + id: restore-ios-prebuilds + uses: actions/cache/restore@v4 + with: + path: packages/react-native/third-party/ + key: v1-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + enableCrossOsArchive: true + - name: Yarn Install + if: steps.restore-ios-prebuilds.outputs.cache-hit != 'true' + uses: ./.github/actions/yarn-install + - name: Prepare Dependencies + if: steps.restore-ios-prebuilds.outputs.cache-hit != 'true' + run: | + node scripts/releases/prepare-ios-prebuilds.js -s + - name: Generate Package.swift + if: steps.restore-ios-prebuilds.outputs.cache-hit != 'true' + run: | + node scripts/releases/prepare-ios-prebuilds.js -w + - name: Upload Artifacts + uses: actions/upload-artifact@v4.3.4 + with: + name: ios-prebuilds-workspace + path: packages/react-native/third-party/ + - name: Save Cache + uses: actions/cache/save@v4 + if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode + with: + key: v1-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 + needs: [prepare_workspace] + strategy: + fail-fast: false + matrix: + flavor: ['Debug', 'Release'] + slice: ['ios', + 'ios-simulator', + 'macos', + 'mac-catalyst', + 'tvos', + 'tvos-simulator', + 'xros', + 'xros-simulator'] + steps: + - name: Checkout + uses: actions/checkout@v4 + - 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 + with: + path: packages/react-native/third-party/.build/Build/Products + key: v1-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }} + - 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 + with: + name: ios-prebuilds-workspace + path: packages/react-native/third-party/ + - name: Print third-party folder structure + 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 + 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 + if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode + with: + key: v1-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 + needs: [build-apple-slices] + strategy: + fail-fast: false + matrix: + flavor: [Debug, Release] + steps: + - name: Checkout + uses: actions/checkout@v4 + - 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 + with: + path: | + packages/react-native/third-party/ + key: v1-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: Download slices + if: steps.restore-xcframework.outputs.cache-hit != 'true' + uses: actions/download-artifact@v4 + with: + pattern: prebuild-slice-${{ matrix.flavor }}-* + path: packages/react-native/third-party/.build/Build/Products + merge-multiple: true + - name: Create XCFramework + if: steps.restore-xcframework.outputs.cache-hit != 'true' + run: node scripts/releases/prepare-ios-prebuilds.js -c + - name: Compress and Rename XCFramework + if: steps.restore-xcframework.outputs.cache-hit != 'true' + run: | + tar -cz -f packages/react-native/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz \ + packages/react-native/third-party/ReactNativeDependencies.xcframework + - name: Show Symbol folder content + if: steps.restore-xcframework.outputs.cache-hit != 'true' + run: ls -lR packages/react-native/third-party/Symbols + - 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 + - name: Upload XCFramework Artifact + uses: actions/upload-artifact@v4 + 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 + 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 + 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: v1-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 6d5c27fbdd69..d2a2fb7a9b30 100644 --- a/.github/workflows/publish-bumped-packages.yml +++ b/.github/workflows/publish-bumped-packages.yml @@ -17,7 +17,7 @@ jobs: - name: Setup node.js uses: ./.github/actions/setup-node - name: Run Yarn Install - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Build packages run: yarn build - name: Set NPM auth token diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 296a246f93ed..e3b151e875f2 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -64,7 +64,7 @@ jobs: fail-fast: false matrix: flavor: [Debug, Release] - slice: [macosx, iphoneos, iphonesimulator, catalyst, xros, xrsimulator] + slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator] steps: - name: Checkout uses: actions/checkout@v4 @@ -96,6 +96,8 @@ jobs: 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: + uses: ./.github/workflows/prebuild-ios.yml build_hermesc_linux: runs-on: ubuntu-latest @@ -150,6 +152,7 @@ jobs: uses: ./.github/actions/build-android with: release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }} + gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} build_npm_package: runs-on: 8-core-ubuntu @@ -161,13 +164,14 @@ jobs: build_hermesc_linux, build_hermesc_windows, build_android, + prebuild_apple_dependencies, ] container: image: reactnativecommunity/react-native-android:latest env: TERM: "dumb" GRADLE_OPTS: "-Dorg.gradle.daemon=false" - # By default we only build ARM64 to save time/resources. For release/nightlies/prealpha, we override this value to build all archs. + # 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 @@ -183,57 +187,45 @@ jobs: with: fetch-depth: 0 fetch-tags: true - - name: Build and Publish NPM PAckage + - 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 - shell: bash - run: | - COMMIT_MSG=$(git log -n1 --pretty=%B); - if grep -q '#publish-packages-to-npm&latest' <<< "$COMMIT_MSG"; then - echo "TAG=latest" >> $GITHUB_OUTPUT - IS_LATEST=true - else - IS_LATEST=false - fi - # Go from v0.75.0-rc.4 -> 0.75-stable, which is the template's branching scheme - VERSION=$(grep -oE '\d+\.\d+' <<< "${{ github.ref_name }}" | { read version; echo "$version-stable"; }) - echo "VERSION=$VERSION" >> $GITHUB_OUTPUT - - curl -L https://api.github.com/repos/react-native-community/template/actions/workflows/release.yaml/dispatches - -H "Accept: application/vnd.github.v3+json" \ - -H "Authorization: Bearer $REACT_NATIVE_BOT_GITHUB_TOKEN" \ - -d "{\"ref\":\"$VERSION\",\"inputs\":{\"version\":\"${{ github.ref_name }}\",\"is_latest_on_npm\":\"$IS_LATEST\"}}" + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} + script: | + const {publishTemplate} = require('./.github/workflow-scripts/publishTemplate.js') + const version = "${{ github.ref_name }}" + const isDryRun = false + await publishTemplate(github, version, isDryRun); - name: Wait for template to be published timeout-minutes: 3 - env: - VERSION: ${{ steps.publish-template-to-npm.outputs.VERSION }} - TAG: ${{ steps.publish-template-to-npm.outputs.TAG }} - shell: bash - run: | - echo "Waiting until @react-native-community/template is published to npm" - while true; do - if curl -o /dev/null -s -f "https://registry.npmjs.org/@react-native-community/template/$VERSION"; then - echo "Confirm that @react-native-community/template@$VERSION is published on npm" - break - fi - sleep 10 - done - while [ "$TAG" == "latest" ]; do - CURRENT=$(curl -s "https://registry.npmjs.org/react-native/latest" | jq -r '.version'); - if [ "$CURRENT" == "$VERSION" ]; then - echo "Confirm that @react-native-community/template@latest == $VERSION on npm" - break - fi - sleep 10 - done + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} + script: | + const {verifyPublishedTemplate, isLatest} = require('./.github/workflow-scripts/publishTemplate.js') + const version = "${{ github.ref_name }}" + await verifyPublishedTemplate(version, isLatest()); - name: Update rn-diff-purge to generate upgrade-support diff run: | curl -X POST https://api.github.com/repos/react-native-community/rn-diff-purge/dispatches \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: Bearer $REACT_NATIVE_BOT_GITHUB_TOKEN" \ -d "{\"event_type\": \"publish\", \"client_payload\": { \"version\": \"${{ github.ref_name }}\" }}" + - name: Verify Release is on NPM + timeout-minutes: 3 + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }} + script: | + const {verifyReleaseOnNpm} = require('./.github/workflow-scripts/verifyReleaseOnNpm.js'); + const {isLatest} = require('./.github/workflow-scripts/publishTemplate.js'); + const version = "${{ github.ref_name }}"; + await verifyReleaseOnNpm(version, isLatest()); diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index a4e1c92f3a60..6708e1400329 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -2,16 +2,17 @@ name: Test All on: workflow_dispatch: + inputs: + run-e2e-tests: + description: Whether to run E2E tests or not + type: boolean + default: false pull_request: push: branches: - main - "*-stable" -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !contains(github.ref, 'stable')}} - jobs: set_release_type: runs-on: ubuntu-latest @@ -34,6 +35,8 @@ jobs: echo "RELEASE_TYPE=dry-run" >> $GITHUB_OUTPUT fi + echo "Should I run E2E tests? ${{ inputs.run-e2e-tests }}" + prepare_hermes_workspace: runs-on: ubuntu-latest env: @@ -80,7 +83,7 @@ jobs: fail-fast: false matrix: flavor: [Debug, Release] - slice: [macosx, iphoneos, iphonesimulator, catalyst, xros, xrsimulator] + slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator] steps: - name: Checkout uses: actions/checkout@v4 @@ -113,6 +116,9 @@ jobs: react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} flavor: ${{ matrix.flavor }} + prebuild_apple_dependencies: + uses: ./.github/workflows/prebuild-ios.yml + test_ios_rntester_ruby_3_2_0: runs-on: macos-13 needs: @@ -154,7 +160,7 @@ jobs: react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} test_ios_rntester: - runs-on: macos-13 + runs-on: macos-13-large needs: [build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos] env: @@ -166,6 +172,14 @@ jobs: matrix: jsengine: [Hermes, JSC] architecture: [NewArch, OldArch] + flavor: [Debug, Release] + exclude: # We don't want to test the Old Arch in Release for E2E + - jsengine: Hermes + architecture: OldArch + flavor: Release + - jsengine: JSC + architecture: OldArch + flavor: Release steps: - name: Checkout uses: actions/checkout@v4 @@ -178,12 +192,13 @@ jobs: use-frameworks: StaticLibraries 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: - if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') }} - runs-on: macos-13 + if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') || inputs.run-e2e-tests }} + runs-on: macos-13-large needs: - [build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos] + [test_ios_rntester] env: HERMES_WS_DIR: /tmp/hermes HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin @@ -193,30 +208,29 @@ jobs: matrix: jsengine: [Hermes, JSC] architecture: [NewArch] + flavor: [Debug, Release] steps: - name: Checkout uses: actions/checkout@v4 - - name: Run it - uses: ./.github/actions/test-ios-rntester + - name: Download App + uses: actions/download-artifact@v4 with: - jsengine: ${{ matrix.jsengine }} - architecture: ${{ matrix.architecture }} - run-unit-tests: "false" - use-frameworks: StaticLibraries - hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }} - react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }} - run-e2e-tests: "true" + name: RNTesterApp-${{ matrix.architecture }}-${{ matrix.jsengine }}-${{ matrix.flavor }} + path: /tmp/RNTesterBuild/RNTester.app + - name: Check downloaded folder content + run: ls -lR /tmp/RNTesterBuild - name: Run E2E Tests uses: ./.github/actions/maestro-ios with: - app-path: "/tmp/RNTesterBuild/Build/Products/Release-iphonesimulator/RNTester.app" + app-path: "/tmp/RNTesterBuild/RNTester.app" app-id: com.meta.RNTester.localDevelopment jsengine: ${{ matrix.jsengine }} maestro-flow: ./packages/rn-tester/.maestro/ + flavor: ${{ matrix.flavor }} test_e2e_ios_templateapp: - if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') }} - runs-on: macos-13 + if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') || inputs.run-e2e-tests }} + runs-on: macos-13-large needs: build_npm_package env: HERMES_WS_DIR: /tmp/hermes @@ -226,6 +240,8 @@ jobs: fail-fast: false matrix: jsengine: [Hermes, JSC] + flavor: [Debug, Release] + architecture: [OldArch, NewArch] steps: - name: Checkout uses: actions/checkout@v4 @@ -234,7 +250,7 @@ jobs: - name: Setup node.js uses: ./.github/actions/setup-node - name: Run yarn - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Setup ruby uses: ruby/setup-ruby@v1.170.0 with: @@ -242,7 +258,7 @@ jobs: - name: Download Hermes uses: actions/download-artifact@v4 with: - name: hermes-darwin-bin-Release + name: hermes-darwin-bin-${{matrix.flavor}} path: /tmp/react-native-tmp - name: Download React Native Package uses: actions/download-artifact@v4 @@ -259,29 +275,44 @@ jobs: HERMES_PATH=$(find /tmp/react-native-tmp -type f -name "*.tar.gz") echo "Hermes path is $HERMES_PATH" - node ./scripts/e2e/init-project-e2e.js --projectName RNTestProject --currentBranch ${{ github.ref_name }} --directory /tmp/RNTestProject --pathToLocalReactNative $REACT_NATIVE_PKG + # For stable branches, we want to use the stable branch of the template + # In all the other cases, we want to use "main" + BRANCH=${{ github.ref_name }} + if ! [[ $BRANCH == *-stable* ]]; then + BRANCH=main + fi + + node ./scripts/e2e/init-project-e2e.js --projectName RNTestProject --currentBranch $BRANCH --directory /tmp/RNTestProject --pathToLocalReactNative $REACT_NATIVE_PKG cd /tmp/RNTestProject/ios bundle install - HERMES_ENGINE_TARBALL_PATH=$HERMES_PATH bundle exec pod install + NEW_ARCH_ENABLED=1 + if [[ ${{ matrix.architecture }} == "OldArch" ]]; then + echo "Disable the New Architecture" + NEW_ARCH_ENABLED=0 + fi + HERMES_ENGINE_TARBALL_PATH=$HERMES_PATH RCT_NEW_ARCH_ENABLED=$NEW_ARCH_ENABLED bundle exec pod install - set -o pipefail && xcodebuild \ + xcodebuild \ -scheme "RNTestProject" \ -workspace RNTestProject.xcworkspace \ - -configuration "Release" \ + -configuration "${{ matrix.flavor }}" \ -sdk "iphonesimulator" \ -destination "generic/platform=iOS Simulator" \ - -derivedDataPath "/tmp/RNTestProject" | xcbeautify + -derivedDataPath "/tmp/RNTestProject" - name: Run E2E Tests uses: ./.github/actions/maestro-ios with: - app-path: "/tmp/RNTestProject/Build/Products/Release-iphonesimulator/RNTestProject.app" + app-path: "/tmp/RNTestProject/Build/Products/${{ matrix.flavor }}-iphonesimulator/RNTestProject.app" app-id: org.reactjs.native.example.RNTestProject jsengine: ${{ matrix.jsengine }} maestro-flow: ./scripts/e2e/.maestro/ + flavor: ${{ matrix.flavor }} + working-directory: /tmp/RNTestProject + architecture: ${{ matrix.architecture }} test_e2e_android_templateapp: - if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') }} + if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') || inputs.run-e2e-tests }} runs-on: 4-core-ubuntu needs: build_npm_package continue-on-error: true @@ -289,13 +320,15 @@ jobs: fail-fast: false matrix: jsengine: [Hermes, JSC] + flavor: [debug, release] + architecture: [OldArch, NewArch] steps: - name: Checkout uses: actions/checkout@v4 - name: Setup node.js uses: ./.github/actions/setup-node - name: Run yarn - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Set up JDK 17 uses: actions/setup-java@v2 with: @@ -314,6 +347,7 @@ jobs: - name: Print /tmp folder run: ls -lR /tmp/react-native-tmp - name: Prepare artifacts + id: prepare-artifacts run: | REACT_NATIVE_PKG=$(find /tmp/react-native-tmp -type f -name "*.tgz") echo "React Native tgs is $REACT_NATIVE_PKG" @@ -321,23 +355,45 @@ jobs: MAVEN_LOCAL=/tmp/react-native-tmp/maven-local echo "Maven local path is $MAVEN_LOCAL" - node ./scripts/e2e/init-project-e2e.js --projectName RNTestProject --currentBranch ${{ github.ref_name }} --directory /tmp/RNTestProject --pathToLocalReactNative $REACT_NATIVE_PKG + # For stable branches, we want to use the stable branch of the template + # In all the other cases, we want to use "main" + BRANCH=${{ github.ref_name }} + if ! [[ $BRANCH == *-stable* ]]; then + BRANCH=main + fi + node ./scripts/e2e/init-project-e2e.js --projectName RNTestProject --currentBranch $BRANCH --directory /tmp/RNTestProject --pathToLocalReactNative $REACT_NATIVE_PKG echo "Feed maven local to gradle.properties" cd /tmp/RNTestProject echo "react.internal.mavenLocalRepo=$MAVEN_LOCAL" >> android/gradle.properties + if [[ ${{matrix.architecture}} == "OldArch" ]]; then + echo "Disabling the New Architecture" + sed -i 's/newArchEnabled=true/newArchEnabled=false/' android/gradle.properties + fi + + if [[ ${{matrix.jsengine}} == "JSC" ]]; then + echo "Using JSC instead of Hermes" + sed -i 's/hermesEnabled=true/hermesEnabled=false/' android/gradle.properties + fi + # Build cd android - ./gradlew assembleRelease --no-daemon -PreactNativeArchitectures=x86 + CAPITALIZED_FLAVOR=$(echo "${{ matrix.flavor }}" | awk '{print toupper(substr($0, 1, 1)) substr($0, 2)}') + ./gradlew assemble$CAPITALIZED_FLAVOR --no-daemon -PreactNativeArchitectures=x86 + - name: Run E2E Tests uses: ./.github/actions/maestro-android + timeout-minutes: 60 with: - app-path: /tmp/RNTestProject/android/app/build/outputs/apk/release/app-release.apk + app-path: /tmp/RNTestProject/android/app/build/outputs/apk/${{ matrix.flavor }}/app-${{ matrix.flavor }}.apk app-id: com.rntestproject jsengine: ${{ matrix.jsengine }} maestro-flow: ./scripts/e2e/.maestro/ install-java: 'false' + flavor: ${{ matrix.flavor }} + working-directory: /tmp/RNTestProject + architecture: ${{ matrix.architecture }} build_hermesc_linux: runs-on: ubuntu-latest @@ -390,37 +446,41 @@ jobs: uses: ./.github/actions/build-android with: release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }} - run-e2e-tests: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') }} + run-e2e-tests: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') || inputs.run-e2e-tests }} + gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} test_e2e_android_rntester: - if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') }} - runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') || inputs.run-e2e-tests }} + runs-on: 4-core-ubuntu needs: [build_android] strategy: fail-fast: false matrix: jsengine: [hermes, jsc] + flavor: [debug, release] steps: - name: Checkout uses: actions/checkout@v4 - name: Setup node.js uses: ./.github/actions/setup-node - name: Install node dependencies - uses: ./.github/actions/yarn-install-with-cache + uses: ./.github/actions/yarn-install - name: Download APK uses: actions/download-artifact@v4 with: - name: rntester-${{ matrix.jsengine }}-release - path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.jsengine }}/release/ + name: rntester-${{ matrix.jsengine }}-${{ matrix.flavor }} + path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.jsengine }}/${{ matrix.flavor }}/ - name: Print folder structure - run: ls -lR ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.jsengine }}/release/ + run: ls -lR ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.jsengine }}/${{ matrix.flavor }}/ - name: Run E2E Tests uses: ./.github/actions/maestro-android + timeout-minutes: 60 with: - app-path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.jsengine }}/release/app-${{ matrix.jsengine }}-x86-release.apk + app-path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.jsengine }}/${{ matrix.flavor }}/app-${{ matrix.jsengine }}-x86-${{ matrix.flavor }}.apk app-id: com.facebook.react.uiapp jsengine: ${{ matrix.jsengine }} - maestro-flow: ./packages/rn-tester/.maestro/ + maestro-flow: ./packages/rn-tester/.maestro + flavor: ${{ matrix.flavor }} build_npm_package: runs-on: 8-core-ubuntu @@ -432,6 +492,7 @@ jobs: build_hermesc_linux, build_hermesc_windows, build_android, + prebuild_apple_dependencies, ] container: image: reactnativecommunity/react-native-android:latest @@ -448,6 +509,7 @@ jobs: 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 }} test_android_helloworld: runs-on: 4-core-ubuntu @@ -486,8 +548,10 @@ jobs: path: /tmp/maven-local - name: Setup gradle uses: ./.github/actions/setup-gradle + with: + cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} - name: Run yarn install - uses: ./.github/actions/yarn-install-with-cache + 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)" @@ -564,7 +628,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: ["20", "18"] + node-version: ["22", "20", "18"] steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/test-libraries-on-nightlies.yml b/.github/workflows/test-libraries-on-nightlies.yml new file mode 100644 index 000000000000..9587c9285642 --- /dev/null +++ b/.github/workflows/test-libraries-on-nightlies.yml @@ -0,0 +1,75 @@ +name: Test Libraries on Nightlies + +on: + workflow_call: + +jobs: + test-library-on-nightly-android: + name: "[Android] ${{ matrix.library }}" + runs-on: ubuntu-latest + continue-on-error: true + strategy: + matrix: + library: [ + "react-native-async-storage", + "react-native-blob-util", + "@react-native-clipboard/clipboard", + "@react-native-community/datetimepicker", + "react-native-gesture-handler", + "react-native-image-picker", + "react-native-linear-gradient", + "@react-native-masked-view/masked-view", + "react-native-maps", + "@react-native-community/netinfo", + "react-native-reanimated", + "react-native-svg", + "react-native-video", + "react-native-webview", + "react-native-mmkv", + "react-native-screens", + "react-native-pager-view", + "@react-native-community/slider" + ] + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Test ${{ inputs.library-name }} + uses: ./.github/actions/test-library-on-nightly + with: + library-npm-package: ${{ matrix.library }} + platform: android + + test-library-on-nightly-ios: + name: "[iOS] ${{ matrix.library }}" + runs-on: macos-13-large + continue-on-error: true + strategy: + matrix: + library: [ + "react-native-async-storage", + "react-native-blob-util", + "@react-native-clipboard/clipboard", + "@react-native-community/datetimepicker", + "react-native-gesture-handler", + "react-native-image-picker", + "react-native-linear-gradient", + "@react-native-masked-view/masked-view", + "react-native-maps", + "@react-native-community/netinfo", + "react-native-reanimated", + "react-native-svg", + "react-native-video", + "react-native-webview", + "react-native-mmkv", + "react-native-screens", + "react-native-pager-view", + "@react-native-community/slider" + ] + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Test ${{ inputs.library-name }} + uses: ./.github/actions/test-library-on-nightly + with: + library-npm-package: ${{ matrix.library }} + platform: ios diff --git a/.github/workflows/update-node-modules-cache.yml b/.github/workflows/update-node-modules-cache.yml deleted file mode 100644 index 9c74021341b8..000000000000 --- a/.github/workflows/update-node-modules-cache.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Update node modules cache - -on: - workflow_dispatch: - push: - branches: - - main - -jobs: - update_node_modules_cache: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install yarn dependencies and update cache - uses: ./.github/actions/yarn-install-with-cache - with: - update-cache: "true" diff --git a/.gitignore b/.gitignore index e734a3cffbb6..ff2474a35241 100644 --- a/.gitignore +++ b/.gitignore @@ -68,6 +68,7 @@ local.properties *.iml /packages/react-native/android/* !/packages/react-native/android/README.md +.kotlin/ # Node node_modules @@ -124,7 +125,7 @@ vendor/ !/packages/rn-tester/Pods/__offline_mirrors_jsc__ # @react-native/codegen -/packages/react-native/React/FBReactNativeSpec/FBReactNativeSpec +/packages/react-native/React/FBReactNativeSpec/ /packages/react-native-codegen/lib /packages/react-native-codegen/tmp/ /packages/react-native/ReactCommon/react/renderer/components/rncore/ @@ -140,6 +141,11 @@ vendor/ /packages/react-native/sdks/hermesc /packages/react-native/sdks/hermes-engine/hermes-engine-from-local-source-dir.tar.gz +# iOS prebuilds +/packages/react-native/third-party/ +fix_*.patch +*.xcframework + # Visual Studio Code (config dir - if present, this merges user defined # workspace settings on top of react-native.code-workspace) /.vscode @@ -153,5 +159,9 @@ vendor/ # Temporary files created by Metro to check the health of the file watcher .metro-health-check* -# CircleCI -.circleci/generated_config.yml +# Jest Integration +/packages/react-native-fantom/build/ +/packages/react-native-fantom/tester/build/ + +# [Experimental] Generated TS type definitions +/packages/**/types_generated/ diff --git a/.prettierignore b/.prettierignore index 4e8b78e14f5b..a2c77e3527d0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,5 +7,6 @@ packages/*/dist vendor +packages/**/types_generated/ packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeEnumTurboModule.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 6316f3936b5a..2cd4922d313a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,1028 @@ # Changelog +## v0.78.0 + +### Breaking + +- **Codegen:** Separate component array types and command array types ([825492b199](https://github.com/facebook/react-native/commit/825492b1999b62de708e6f40d5d5de8d3d7cb8a9) by [@elicwhite](https://github.com/elicwhite)) +- **DevTools:** The `FuseboxClient.setClientMetadata` CDP method is removed. Instead, use `ReactNativeApplication.enable`. ([1a9780f0e3](https://github.com/facebook/react-native/commit/1a9780f0e3714ac18ffae34cb67376c711b0e031) by [@huntie](https://github.com/huntie)) + +#### Android specific + +- **APIs:** Changed visibility of `FrescoBasedReactTextInlineImageViewManager` to internal ([d5f33c19cb](https://github.com/facebook/react-native/commit/d5f33c19cb33e2f2c7d2470cc90872c1f065f20d) by [@alanleedev](https://github.com/alanleedev)) +- **APIs:** Migrating pointerEvents API breaks compatibility for kotlin usages of this api as a val ([45e4a3afce](https://github.com/facebook/react-native/commit/45e4a3afceb4be3047cd01a60ec2c9f806ed30fe) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Convert `RootView` to Kotlin ([21c9491926](https://github.com/facebook/react-native/commit/21c94919260a68409f82081740169d0409e78933) by [@fabriziocucci](https://github.com/fabriziocucci)) +- **APIs:** Delete unused abstract class `GuardedResultAsyncTask` ([67bff8734f](https://github.com/facebook/react-native/commit/67bff8734f4b92fe399910eecad5b67511a749c1) by [@mdvacca](https://github.com/mdvacca)) +- **APIs**: Delete deprecated class `FabricViewStateManager` ([b25b65ba19](https://github.com/facebook/react-native/commit/b25b65ba19f3c674fd2efe5c01123ccc0ae55cbf) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Removed `ComponentNameResolver` from public API ([a4849cb3d6](https://github.com/facebook/react-native/commit/a4849cb3d6f4245d15eb3812e417a9f4248bb3a1) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- **Image:** Change Image load event size info from logical size to pixel ([09995fc874](https://github.com/facebook/react-native/commit/09995fc8741cfdc6095d09627262b4f6fbbaafc2) by [@zhongwuzw](https://github.com/zhongwuzw)) + +### Added + +- **C++:** Added `RawValue(Runtime*, jsi::Value&)` constructor to make a `RawValue` from a `jsi::Value`. ([03d2186ace](https://github.com/facebook/react-native/commit/03d2186ace2cb17c676b7763d5a545759a658b77) by [@hannojg](https://github.com/hannojg)) +- **Codegen:** Include cxx modules in codegen schema ([cf5ab03d43](https://github.com/facebook/react-native/commit/cf5ab03d4324b7e3fce38f9eacc96da82b11b68a) by [@elicwhite](https://github.com/elicwhite)) +- **Deps:** Add `jest-diff v29.7.0` to devDependencies ([b27bd00a38](https://github.com/facebook/react-native/commit/b27bd00a389295250ec003357df713ebf306374b) by [@andrewdacenko](https://github.com/andrewdacenko)) +- **Logging:** Add support for the second parameter of `console.table` to specify a list of columns to print in the table. ([fd0894b1c7](https://github.com/facebook/react-native/commit/fd0894b1c7fcb20dd213ec1e93aafef25935d709) by [@rubennorte](https://github.com/rubennorte)) +- **Logging:** Add "jsEngine: hermes" to JS runtime Error prototype ([85bdd75828](https://github.com/facebook/react-native/commit/85bdd75828f85230aaa90ed510666457c46f996c) by Maddie Lord) +- **Metro:** Add opt in for legacy Metro log streaming via `--client-logs` flag ([86db4fa90b](https://github.com/facebook/react-native/commit/86db4fa90b90919867a9b66f6caa28f77fba3a37) by [@huntie](https://github.com/huntie)) +- **Text:** Added `pointerEvents` to `TextProps` type. ([3efbe33ce0](https://github.com/facebook/react-native/commit/3efbe33ce03f846932406742528652eb695b957d) by [@hyochan](https://github.com/hyochan)) + +#### Android specific + +- **ActivityIndicator:** setting `resource-id` from the `testID` prop ([87b1bad45e](https://github.com/facebook/react-native/commit/87b1bad45e4eb730ea07686a2b2558253c60d3b7) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Codegen:** Fixing schema types for component command params of Arrays ([25c673e357](https://github.com/facebook/react-native/commit/25c673e35784d8d8c49555af104b9b4d8d37973d) by [@elicwhite](https://github.com/elicwhite)) +- **Gradle:** Make the addition of JitPack repository configurable ([a98528e609](https://github.com/facebook/react-native/commit/a98528e609ff0ace4b7bc82f3aa273b7e3fa6443) by [@cortinico](https://github.com/cortinico)) +- **Logging:** SoftException categories ([c832f94cf7](https://github.com/facebook/react-native/commit/c832f94cf713d0cb7616ef095f38583979e1cf43) by Thomas Nardone) +- **Logging:** Add logging in ReactInstanceManager.onHostPause when activity is incorrectly null ([c2fd35a442](https://github.com/facebook/react-native/commit/c2fd35a4429c752dc2d10a789e4c5f48d22b1eeb) by Maddie Lord) +- **Runtime:** Added `getState` method for `StateWrapperImpl` ([ed36e896ac](https://github.com/facebook/react-native/commit/ed36e896ac34fcbefece87456dbdfdff30d22ad5) by [@hannojg](https://github.com/hannojg)) + +#### iOS specific + +- **Codegen:** Add the `source` parameter to generate-codegen-artifacts to avoid generating files not needed by libraries. ([98b8f17811](https://github.com/facebook/react-native/commit/98b8f178110472e5fed97de80766c03b0b5e988c) by [@cipolleschi](https://github.com/cipolleschi)) +- **Initialization:** Implement ReactNativeFactory ([081be01a5d](https://github.com/facebook/react-native/commit/081be01a5dd24d0a398c6aa8297575502a17d5ec) by [@okwasniewski](https://github.com/okwasniewski)) +- **Text:** Support system font families (system-ui, ui-sans-serif, ui-serif, ui-monospace, and ui-rounded) on iOS ([1763321c89](https://github.com/facebook/react-native/commit/1763321c8960d30ddc4d3464a0fffdecdd44617a) by [@cxa](https://github.com/cxa)) +- **TextInput:** Integrate a new property - `disableKeyboardShortcuts`. It can disable the keyboard shortcuts on iPads. ([0154372b93](https://github.com/facebook/react-native/commit/0154372b93eb1b02f0c62f2a75c95f4fc6a9f3e8) by [@rezkiy37](https://github.com/rezkiy37)) + +### Changed + +- **Deps:** Bump Hermes ([0c8e15e8bb](https://github.com/facebook/react-native/commit/0c8e15e8bb16ec279290d2390caf75e83d52f518) by [@cipolleschi](https://github.com/cipolleschi)) +- **Flow:** Improved types in `BoxInspector` and refactored a code ([f832c450a5](https://github.com/facebook/react-native/commit/f832c450a52c4c9d61c1d6b609fcad1332613556) by [@coado](https://github.com/coado)) +- **Flow:** Improved types in StyleInspector and refactored a code ([49e5c58c59](https://github.com/facebook/react-native/commit/49e5c58c595265c9fffc84741aab6363d291f1f5) by [@coado](https://github.com/coado)) +- **Flow:** Improved types in ElementBox and refactored a code ([2959d49e8d](https://github.com/facebook/react-native/commit/2959d49e8d09663f9ac437ffcb66d1c99162c6d0) by [@coado](https://github.com/coado)) +- **Flow:** Improve types on BorderBox ([48a7840919](https://github.com/facebook/react-native/commit/48a784091989c695e3432cb8ba657139eb9f5e99) by [@coado](https://github.com/coado)) +- **Flow:** Improve types on DrawerLayoutAndroid ([b5155fba89](https://github.com/facebook/react-native/commit/b5155fba895411e290faeeea06180fce24079f78) by [@huntie](https://github.com/huntie)) +- **Logging:** Improved formatting of values logged via `console.table` (including Markdown format). ([7154c62afb](https://github.com/facebook/react-native/commit/7154c62afb5371f3f861663826792e41229c344a) by [@rubennorte](https://github.com/rubennorte)) +- **Runtime:** Mark `intersectionRect` required in `NativeIntersectionObserverEntry` to reflect native logic. ([8681fc2ab2](https://github.com/facebook/react-native/commit/8681fc2ab20aa1e5937a0bf3fc58ed03c3e0ee23) by [@lunaleaps](https://github.com/lunaleaps)) +- **Runtime:** ([9aa21b5e87](https://github.com/facebook/react-native/commit/9aa21b5e8765f14a9806eac435636b87f62178cc) by [@lunaleaps](https://github.com/lunaleaps)) +- **TypeScript:** Upgrading `typescript-config` module version to `esnext` ([5370347f54](https://github.com/facebook/react-native/commit/5370347f54719f318a4e032aba6cbf2269e7c3d7) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **VirtualizedList:** Fix item disappearing with scroll in VirtualizedList ([df7b6ae092](https://github.com/facebook/react-native/commit/df7b6ae092d03385ebd05efd0f068c59e727f723) by [@Tom910](https://github.com/Tom910)) +- **Yoga:** Update YGNodeStyleGetGap to return YGValue ([331d99a941](https://github.com/facebook/react-native/commit/331d99a94154678848628122e8fe3373ee67fb9b) by [@heoblitz](https://github.com/heoblitz)) + +#### Android specific + +- **APIs:** Introduce new public API `ViewManagerInterface` ([40a0cdbc99](https://github.com/facebook/react-native/commit/40a0cdbc99746f18ca15c48f3d8f03cdad1635af) by [@mdvacca](https://github.com/mdvacca)) +- **Deps:** Bumped Android Gradle Plugin (AGP) to 8.8.0 ([4c7c836ebf](https://github.com/facebook/react-native/commit/4c7c836ebf956c13fa327170adaec43a076226e7) by [@cortinico](https://github.com/cortinico)) +- **Deps:** Bump Gradle to 8.12 ([5e6478954c](https://github.com/facebook/react-native/commit/5e6478954c77f64a9086757ed4a879e83a1ab404) by [@cortinico](https://github.com/cortinico)) +- **Deps:** Update Fresco to 3.6.0 ([819b5c2c8d](https://github.com/facebook/react-native/commit/819b5c2c8dfad620152b159838575b6c03e18ffe) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **Deps:** Migrate jsc-android to mavenCentral ([e42a3a6b84](https://github.com/facebook/react-native/commit/e42a3a6b842d71fc25419c02f6015863fa019f05) by [@Kudo](https://github.com/Kudo)) +- **Image:** Replaced custom XML decoder with Fresco's built-in decoder ([6feb90bb29](https://github.com/facebook/react-native/commit/6feb90bb290ab460df8df2f6f01531a77aac9008) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **Kotlin:** Migrate `ComponentNameResolver` to kotlin ([385b9f4265](https://github.com/facebook/react-native/commit/385b9f4265316a1e1cf8627ea7ed3bed790cc8c5) by [@mdvacca](https://github.com/mdvacca)) +- **Kotlin:** Migrate `ReactSwitchManager` to Kotlin ([b886bc4db9](https://github.com/facebook/react-native/commit/b886bc4db970d8c70de1596dc3f88bdc398de482) by [@krozniata](https://github.com/krozniata)) + +#### iOS specific + +- **Accessibility:** Reduce memory allocations when computing `accessibilityLabel` ([74bdab8bd8](https://github.com/facebook/react-native/commit/74bdab8bd8be2413734004145507c0688232053e) by [@sparga](https://github.com/sparga)) +- **CocoaPods:** Properly inherit OTHER_CPLUSPLUSLAGS ([fa03840e68](https://github.com/facebook/react-native/commit/fa03840e688067bf16a7fb60c00efdc9a1813f92) by [@WoLewicki](https://github.com/WoLewicki)) +- **CocoaPods:** Pin 'concurrent-ruby' to a working version ([198adb47af](https://github.com/facebook/react-native/commit/198adb47af3676c85b35adb308c110c1d87120c8) by [@cipolleschi](https://github.com/cipolleschi)) + +### Removed + +#### Android specific + +- **APIs:** Made `ReactCookieJarContainer` internal. ([18ebea533d](https://github.com/facebook/react-native/commit/18ebea533d348329926bd7782bb55469aa228a4a) by [@javache](https://github.com/javache)) +- **Config:** Remove as_const option (on by default) in fbsource ([e5a526ff44](https://github.com/facebook/react-native/commit/e5a526ff44c25afd935d117d6d4d342f210553a6) by [@panagosg7](https://github.com/panagosg7)) +- **Flow:** Remove comment syntax from ReactNativeTypes ([a80baac58e](https://github.com/facebook/react-native/commit/a80baac58e9f2fc62829ab76b929f5c8b21c05a5) by [@hoxyq](https://github.com/hoxyq)) +- **Metro:** Removed `JSCHeapCapture` module, deprecated PackagerCommandListener#onCaptureHeapCommand ([e06fa5d102](https://github.com/facebook/react-native/commit/e06fa5d1026843ec4a2ba3dd209652dc5290c0ba) by [@javache](https://github.com/javache)) + + +### Fixed + +- **Animations:** Removed unnecessary state updates in React to reflect the current state of looping animations. ([6059660c60](https://github.com/facebook/react-native/commit/6059660c607f5b6edba08a12906f0f9d6cb15d34) by [@rubennorte](https://github.com/rubennorte)) +- **Animations:** Animation.stop() executes when `animatedShouldUseSingleOp` is enabled. ([746d584a23](https://github.com/facebook/react-native/commit/746d584a23f303493faa4f9d857ec542257a92ae) by [@javache](https://github.com/javache)) +- **Animations:** Fix buttons becoming unresponsive when transform is animated ([2204ec94d4](https://github.com/facebook/react-native/commit/2204ec94d4b67a9ba559db3f54a5a1ef91e0f233) by [@sammy-SC](https://github.com/sammy-SC)) +- **C++:** `JSBigFileString` fails for non-zero offset arguments ([7d0338cb0b](https://github.com/facebook/react-native/commit/7d0338cb0b24926aff648a4c8ba5d77b052010cc) by [@jwajgelt](https://github.com/jwajgelt)) +- **Config:** Disable `react-in-jsx-scope` rule in eslint config ([ea56c432b7](https://github.com/facebook/react-native/commit/ea56c432b7a577d3805d1a7b4b46596799dd892e) by [@matinzd](https://github.com/matinzd)) +- **Deps:** Fix peer dependencies on React types to React 19 ([4368368ef5](https://github.com/facebook/react-native/commit/4368368ef5c3f3d08a66ee6c13222f6d81a2d2df) by [@cipolleschi](https://github.com/cipolleschi)) +- **Deps:** Add missing `invariant` dependency ([ee8088b615](https://github.com/facebook/react-native/commit/ee8088b6157837c239db47ac5bd3a8603ceefc3c) by [@tido64](https://github.com/tido64)) +- **Fantom:** Fix a bug when fantom tests could not be run in parallel, e.g. in a stress-test. ([8696b79f73](https://github.com/facebook/react-native/commit/8696b79f73fec18a9e3785b9a2c150afc9965d76) by [@mijay](https://github.com/mijay)) +- **Logging:** Modified `console.table` to avoid mutating the received argument. ([caa77fbe2b](https://github.com/facebook/react-native/commit/caa77fbe2b03e6969ae9b542d011f926a0ede3c7) by [@rubennorte](https://github.com/rubennorte)) +- **Text:** Fixed `adjustsFontSizeToFit` not working for text with a single character ([47822e9048](https://github.com/facebook/react-native/commit/47822e90480d61e197a3f223e088ee88a0f38ad7) by [@j-piasecki](https://github.com/j-piasecki)) +- **Text:** Fix `maxFontSizeMultiplier` prop on `Text` and `TextInput` components in Fabric / New Architecture ([ea49d4d1b01107a5ecbbbd4904f1d935e51d6b32](https://github.com/facebook/react-native/commit/ea49d4d1b01107a5ecbbbd4904f1d935e51d6b32) by [@RickardZrinski](https://github.com/RickardZrinski)) + +#### Android specific + +- **APIs** Re-introduce the deprecated constructor on ReactModuleInfo ([734730df75](https://github.com/facebook/react-native/commit/734730df75b3bdddeb5dbe65f4151cc92b988303) by [@cortinico](https://github.com/cortinico)) +- **Dialog:** `FLAG_SECURE` not respected in Modal dialog ([7e029b0dcf](https://github.com/facebook/react-native/commit/7e029b0dcf6d1a6455a8a6343457b70e353d0ff6) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Events:** Fix crash for `setEventEmitterCallback` NoSuchMethodError on API lvl 26 ([7dcbc799eb](https://github.com/facebook/react-native/commit/7dcbc799eb2fb5792512b71320eafed08deec9ea) by [@cortinico](https://github.com/cortinico)) +- **Gradle:** Fixed build issue when including mapbuffer jni headers in library code ([ecf17666ad](https://github.com/facebook/react-native/commit/ecf17666ad84e15d31944962e2d0e846a5670977) by [@hannojg](https://github.com/hannojg)) +- **InteropLayer:** Fix execution of early InteropEvents ([4ed2b35bf6](https://github.com/facebook/react-native/commit/4ed2b35bf61426c81c9f8b30a142d77b44988fdb) by [@mdvacca](https://github.com/mdvacca)) +- **JSC:** Fix JSC Debug instacrashing ([b10491a3c4](https://github.com/facebook/react-native/commit/b10491a3c457c802608758ca1fe659a72c18576b) by [@cortinico](https://github.com/cortinico)) +- **JSC:**Fix JSC by avoiding use of unavailable `str.replaceAll()` ([b5b9e032c2](https://github.com/facebook/react-native/commit/b5b9e032c2b57aa44afb7141a879d83c8b889feb) by [@robhogan](https://github.com/robhogan)) +- **Modal:** Setting `resource-id` from `testID` prop ([52b6592559](https://github.com/facebook/react-native/commit/52b65925595882d9b6c7f354a5ce3bfe3823738e) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Networking:** ReactOkHttpNetworkFetcher – cache control headers getting overwritten by the rest of the headers ([81cb166d10](https://github.com/facebook/react-native/commit/81cb166d103f7caaa5135b5a1c66d4e978f3619f) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **DevTools:** Pass the bundle URL protocol when setting up HMR client on Android ([32fe244744](https://github.com/facebook/react-native/commit/32fe24474495f09f985a2c92e11103dd386f5fe3) by [@byCedric](https://github.com/byCedric)) +- **Runtime:** Fix BackHandle callback undefined cause crash issue ([44705fe11b](https://github.com/facebook/react-native/commit/44705fe11bd9bb12c8f71d1e50a7b48e0af6a38d) by [@BleemIs42](https://github.com/BleemIs42)) +- **Runtime:** Support Long values in WritableMap and WritableArray ([e7f943de2f](https://github.com/facebook/react-native/commit/e7f943de2fd71d2259ab53e7817d2dcf96559f7e) by [@WoLewicki](https://github.com/WoLewicki)) +- **Runtime:** `SetColorScheme` should be called on the UI thread ([2aa79979d3](https://github.com/facebook/react-native/commit/2aa79979d3e4a54008f24c81b6c04553c98ff6b6) by lihaitao) +- **Style:** Fix background getting clipped when border-radius is set ([6d235853fb](https://github.com/facebook/react-native/commit/6d235853fb9e9ad4050ba5611d74921fa1b9c72d) by [@jorge-cab](https://github.com/jorge-cab)) +- **Testing:** Handling `testID` correctly for horizontal scroll view ([81c74cd35f](https://github.com/facebook/react-native/commit/81c74cd35f9e40c8ad4663fc932d0dddeaa4bc19) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **TextInput:** Fix incorrect height of single line TextInputs without definite size ([9b646c8b7b](https://github.com/facebook/react-native/commit/9b646c8b7b9a23645b1563883768a9274897a1cd) by [@NickGerleman](https://github.com/NickGerleman)) + +#### iOS specific + +- **C++:** Exclude Android HorizontalScrollContentView cxx component code ([4adaacb4f7](https://github.com/facebook/react-native/commit/4adaacb4f7cd136d5534c81fb9b8f5f2a0312d7f) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Ccache:** Fix ccache not found error exporting ccache binary path as Xcode user-defined setting to be used by ccache scripts ([d31ac832c5](https://github.com/facebook/react-native/commit/d31ac832c5b866653f7179fd517427f7be11ad45) by [@ste7en](https://github.com/ste7en)) +- **CocoaPods:** Resolve "Your project does not explicitly specify the CocoaPods master specs repo" `pod install` warning ([2f2281718a](https://github.com/facebook/react-native/commit/2f2281718a2ef905ffd15adf3b47a1b6b6fb8d95) by [@noway](https://github.com/noway)) +- **Image:** Load images even when the extension is implicit ([b9f418e9bc](https://github.com/facebook/react-native/commit/b9f418e9bc35372438a34934254db985b7ad1840) by [@cipolleschi](https://github.com/cipolleschi)) +- **Initialization:** Allow multiple RN instances to run at the same time ([444c7d4eff](https://github.com/facebook/react-native/commit/444c7d4eff3d4fbe25452c94cba7ffacb3c366cc) by [@cipolleschi](https://github.com/cipolleschi)) +- **InteropLayer:** Avoid crashing the app when the InteropLayer can't find some methods in the native implementation ([3bd3f101b9](https://github.com/facebook/react-native/commit/3bd3f101b9dcff8551a2f8259ddeed9843fd69b8) by [@cipolleschi](https://github.com/cipolleschi)) +- **InteropLayer:** Properly handle `null` value in TurboModule Interop layer ([ebfd7057af](https://github.com/facebook/react-native/commit/ebfd7057af049ebfbc593448918c70db37e39d48) by [@cipolleschi](https://github.com/cipolleschi)) +- **JSC:** Fix Direct Debugging with JSC ([b04d17afca](https://github.com/facebook/react-native/commit/b04d17afcac82af1a47fd462a04fe4088d19b468) by [@Saadnajmi](https://github.com/Saadnajmi)) +- **Keyboard:** Enable/disable keyboard shortcuts only on iOS ([8b0af4542e](https://github.com/facebook/react-native/commit/8b0af4542e6fd5628fefdc8e1699326c2225c3f0) by [@okwasniewski](https://github.com/okwasniewski)) +- **RefreshControl:** Fix app becoming unresponsive when `RefreshControl` is used inside of ([6cb2684b43](https://github.com/facebook/react-native/commit/6cb2684b4343bd8698b9770c0f6ef8812683c783) by [@sammy-SC](https://github.com/sammy-SC)) +- **DevTools:** Restore "Paused in debugger" overlay icon ([f30c46efbd](https://github.com/facebook/react-native/commit/f30c46efbd964d367f678181589865a3faa931cd) by [@robhogan](https://github.com/robhogan)) +- **Runtime:** Emit `didUpdateDimensions` correctly ([920867d949](https://github.com/facebook/react-native/commit/920867d9494cbfcc9cb0e23607cb339ec1b89ca9) by TobiasH) +- **Runtime:** Fix `applicationDidEnterBackground` not being called ([adaceba546](https://github.com/facebook/react-native/commit/adaceba5462b4ad8676745f34e0be2bf5bb25166) by [@alextoudic](https://github.com/alextoudic)) +- **Runtime:** Fixed problem with accessory view & 3rd party libs ([5fc582783d](https://github.com/facebook/react-native/commit/5fc582783d7f70ca9521e317c93624a8845bfff2) by [@kirillzyusko](https://github.com/kirillzyusko)) +- **Style:** Dashed & dotted borders now work with overflow: hidden ([1b88c5b429](https://github.com/facebook/react-native/commit/1b88c5b429888e109b7acae4808b4b6f8b3f920f) by [@joevilches](https://github.com/joevilches)) +- **Style:** Fixed `centerContent` losing taps and causing jitter ([fe7e97a2fd](https://github.com/facebook/react-native/commit/fe7e97a2fd272db0d9d9aa7d0561337a7c8e2c30) by [@gaearon](https://github.com/gaearon)) +- **Xcode:** Properly escape paths in Xcode build script used when bundling an app. ([2fee13094b](https://github.com/facebook/react-native/commit/2fee13094b3d384c071978776fd8b7cff0b6530f) by [@kraenhansen](https://github.com/kraenhansen)) + +## v0.77.1 + +### Fixed + + - **Dev-Middleware:** Add missing `invariant` dependency ([877e82c1a9](https://github.com/facebook/react-native/commit/877e82c1a97d6c667024a437d993e84af3b820a6) by [@tido64](https://github.com/tido64)) + - **style:** Respect `maxFontSizeMultiplier` prop on `Text` and `TextInput` components in New Architecture ([8baa858412](https://github.com/facebook/react-native/commit/8baa85841209679936938e7759c5be149304843c) by [RickardZrinski](https://github.com/RickardZrinski)) + +#### Android specific + + - **layout:** Fix elevation prop on android has incorrect border-radius ([55d5c44976](https://github.com/facebook/react-native/commit/55d5c4497621a8dfd6545899754451fcf68dce70) by [@NickGerleman](https://github.com/NickGerleman)) + - **Fabric:** Fix execution of early InteropEvents ([d8af0ae3f2](https://github.com/facebook/react-native/commit/d8af0ae3f22c906a9584e1f5d1aaf2dba3cc3fea) by [mdvacca](https://github.com/mdvacca)) + +#### iOS specific + + - **Image:** Load images even when the extension is implicit ([bc35afefd5](https://github.com/facebook/react-native/commit/bc35afefd57a7d0516796dee209881120b82c0b1) by [@cipolleschi](https://github.com/cipolleschi)) + - **Interop Layer:** Avoid crashing the app when the InteropLayer can't find some methods in the native implementation. ([83b986d370](https://github.com/facebook/react-native/commit/83b986d370139266bbbad3e2c356b871c56ae17c) by [@cipolleschi](https://github.com/cipolleschi)) + - **Interop Layer:** Properly handle `null` values coming from NativeModules. ([475f797a51](https://github.com/facebook/react-native/commit/475f797a51237e63e4d2bb4e5718e6aa73157767) by [sammy-SC](https://github.com/sammy-SC)) + +### Added + - **DevX:** Add opt in for legacy Metro log streaming via `--client-logs` flag ([969eb3f007](https://github.com/facebook/react-native/commit/969eb3f0070dc9df2e89ea52a6eb2c68b05aa2d7) by [huntie](https://github.com/huntie)) + +## v0.77.0 + +### Breaking + +- **Animation:** Native looping animation will not send React state update every time it finishes. ([4b035d820d](https://github.com/facebook/react-native/commit/4b035d820d3f1c3c9a98ce4f55bcc95a7ab064bf) by [@dmytrorykun](https://github.com/dmytrorykun)) +- **Dev-Middleware:** Frameworks should specify `serverBaseUrl` relative to the middleware host. ([acf384a72e](https://github.com/facebook/react-native/commit/acf384a72e599691e4c9d53043f1801da01c58fd) by [@robhogan](https://github.com/robhogan)) +- **JS:** Remove ReactFabricInternals module ([0c21db360c](https://github.com/facebook/react-native/commit/0c21db360cecc6a3265eea50d628106c58b67af8) by [@huntie](https://github.com/huntie)) +- **layout:** `position` of sticky headers on `ScrollView` will now be taken into account ([cbab004eb9](https://github.com/facebook/react-native/commit/cbab004eb94f8312e9b10dae1502d3ca8632a006) by [@joevilches](https://github.com/joevilches)) +- **layout:** More spec compliant absolute positioning ([0a2dec175e](https://github.com/facebook/react-native/commit/0a2dec175e92185943907f3e1f6073bae6cd663d) by [@NickGerleman](https://github.com/NickGerleman)) +- **Native Modules:** Bridgeless: Make NativeModules.foo load turbomodules (unset turboModuleProxy in bridgeless). ([cc5f17d5a2](https://github.com/facebook/react-native/commit/cc5f17d5a2b185de1e7dec2a56a97b088e4c7a81) by [@RSNara](https://github.com/RSNara)) + +#### Android specific + +- **APIs:** Removed ReactViewGroup.getBackgroundColor() ([6a472c5cf2](https://github.com/facebook/react-native/commit/6a472c5cf25d72f72ec7e261282d611a5ab0a662) by Thomas Nardone) +- **APIs:** ReadableArray non-primitive getters are now correctly typed as optional ([145c72f816](https://github.com/facebook/react-native/commit/145c72f8163048f0eee30d5ce850911f5dad865c) by [@javache](https://github.com/javache)) +- **APIs:** Remove jsBundleLoader from DefaultReactHost.getDefaultReactHost() ([fbe4c0ed34](https://github.com/facebook/react-native/commit/fbe4c0ed347156a7ea24da29e09083a499c80cf5) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Reduce visibility of TaskCompletionSource class ([4f55161132](https://github.com/facebook/react-native/commit/4f551611326d63b6fb5cd53e63d536c2c6f04647) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Stable API - Make ImageStoreManager internal ([846c4b1ea2](https://github.com/facebook/react-native/commit/846c4b1ea2d139e3f3cbafa2f8ddbf159e3322e4) by [@arushikesarwani94](https://github.com/arushikesarwani94)) +- **APIs:** Stable API - Make SwipeRefreshLayoutManager internal ([d02da992a4](https://github.com/facebook/react-native/commit/d02da992a4c0893313b9f059a8be228f43fffa7a) by Thomas Nardone) +- **APIs:** Stable API - Make classes inside `com.facebook.react.views.progressbar` internal ([46526fc2fe](https://github.com/facebook/react-native/commit/46526fc2fe1dd0ce937fad35469b64b9fb05eaa2) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Stable API - Make OkHttpCallUtil internal ([abd118a719](https://github.com/facebook/react-native/commit/abd118a719fe0aeb13f980729ff9ce5fb8358b83) by [@arushikesarwani94](https://github.com/arushikesarwani94)) +- **APIs:** Stable API - Make SimpleSettableFuture internal ([3dec672398](https://github.com/facebook/react-native/commit/3dec672398729cd668aff92249f1fdde231fb928) by [@arushikesarwani94](https://github.com/arushikesarwani94)) +- **APIs:** Stable API - Make `ClipboardModule` internal ([10f6d5adb5](https://github.com/facebook/react-native/commit/10f6d5adb538a9b20043312fc09b192759100d63) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Reduce visibility of ReactVirtualTextShadowNode to internal ([496b0a8729](https://github.com/facebook/react-native/commit/496b0a8729b41266683fdd84de5618b23d06ce3d) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Reduce visibility of ReactVirtualTextViewManager to internal ([4a119c4c3a](https://github.com/facebook/react-native/commit/4a119c4c3ac9bf4b234e2942a27a6efd68a801cc) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Stable API - Make classes in `com.facebook.react.views.safeareaview` internal ([39dfbadd5d](https://github.com/facebook/react-native/commit/39dfbadd5d3468d079bf3b039401237c6e7f363c) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Stable API - Make ClipboardModule internal ([a72c35f98c](https://github.com/facebook/react-native/commit/a72c35f98ccd1a49d367678b46a29c814ad5de43) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Stable API - Make NativeModulePerfLogger internal ([d7d5de9f96](https://github.com/facebook/react-native/commit/d7d5de9f9630e7dcd0194830d7ccb32f167b619c) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Make ReactDebugOverlayTags, DebugOverlayTags, Printer, PrinterHolder, NoopPrinter internal ([623d481991](https://github.com/facebook/react-native/commit/623d4819915e7e6fafb8006c8e3b3b796e394974) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Make `DevLoadingModule` internal ([8c50bf0beb](https://github.com/facebook/react-native/commit/8c50bf0beb17ced7fdafeae7a734edfc03e6e0b2) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Stable API - Convert to Kotlin and make internal `NotThreadSafeViewHierarchyUpdateDebugListener` ([287e200332](https://github.com/facebook/react-native/commit/287e20033207df5e59d199a347b7ae2b4cd7a59e) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Rename DevSupportManagerBase.getCurrentContext() -> getCurrentReactContext() ([0e7ba9094e](https://github.com/facebook/react-native/commit/0e7ba9094ea573d1512b2dc71e46f55b24201b7a) by [@RSNara](https://github.com/RSNara)) +- **APIs:** Make DevSupportManagerBase.getCurrentReactContext() public ([5a6a42c7d0](https://github.com/facebook/react-native/commit/5a6a42c7d029d44799cb907c0ca3c8aa38fa1770) by [@RSNara](https://github.com/RSNara)) +- **APIs:** Reduce visibility of ReactUnimplementedViewManager to internal ([fe656be26e](https://github.com/facebook/react-native/commit/fe656be26e0d71bf2505032578dbea54af36b2c5) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Stable API - Make InteropModuleRegistry internal ([cba1d4bae7](https://github.com/facebook/react-native/commit/cba1d4bae7285ba160b05f31ca18cfa0b91e9ef5) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Stable API - Make ReactDevToolsSettingsManagerModule and ReactDevToolsRuntimeSettingsModule internal ([d7550293a2](https://github.com/facebook/react-native/commit/d7550293a2530f02f75b4249b7e6003edaf28ac9) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Added JSBundleLoader as parameter of DefaultReactHost ([143b9d172c](https://github.com/facebook/react-native/commit/143b9d172ca755e2457e8dfc6009eeef2475a4a1) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Deleting deprecated CompositeReactPackage ([2cb5198f1b](https://github.com/facebook/react-native/commit/2cb5198f1b589a57a4cfd3cc40a9ed6224fc5d75) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Make ReactHost.createSurface() method non nullable ([70c7616535](https://github.com/facebook/react-native/commit/70c761653564653bdfcb77a8c5ef3608dafcf5d7) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Stable API - Make AppStateModule internal ([dbf09fbe58](https://github.com/facebook/react-native/commit/dbf09fbe5823d77556b451317c14f833735067d9) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Make `AccessibilityInfoModule` internal ([7168a9d1a2](https://github.com/facebook/react-native/commit/7168a9d1a2ed7459ebb056ebe45d86de791013e3) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Add 3 methods to ReactInstanceDevHelper ([c867aba2f3](https://github.com/facebook/react-native/commit/c867aba2f3dd7773be9d2ee0827bcd69481a394e) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Remove Deprecated DefaultDevSupportManagerFactory.create() ([f25abe51ce](https://github.com/facebook/react-native/commit/f25abe51ce93b97ef1fe97af5fc76f13a5a6ff03) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Remove BaseViewManagerInterface ([7fb3d830be](https://github.com/facebook/react-native/commit/7fb3d830beae3daf431ac90e9326b744ff8300a1) by [@NickGerleman](https://github.com/NickGerleman)) +- **APIs:** Remove ReactNativeFlipper object, deprecated in 0.75 ([d1a256f51a](https://github.com/facebook/react-native/commit/d1a256f51a43f465823bdfb8a70fae5f92473d7c) by [@cortinico](https://github.com/cortinico)) +- **APIs:** Use BackgroundStyleApplicator when setting background color in BaseViewManager ([309cdea337](https://github.com/facebook/react-native/commit/309cdea337101cfe2212cfb6abebf1e783e43282) by [@NickGerleman](https://github.com/NickGerleman)) +- **APIs:** Delete useTurboModules, enableFabricRenderer and enableBridgelessArchitecture fields from ReactFeatureFlags class ([10a33e0479](https://github.com/facebook/react-native/commit/10a33e04793befbeab6ae82d4068b1ebd7fdffd0) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Remove ReactViewBackgroundManager and ReactViewBackgroundDrawable ([51673e41ae](https://github.com/facebook/react-native/commit/51673e41ae12f06b2b378e048094ad39ca30c317) by [@NickGerleman](https://github.com/NickGerleman)) + +#### iOS specific + +- **APIs:** Use the RCTDependencyProvider in the RCTAppDelegate, breaking the dependency with Codegen ([b91626af26](https://github.com/facebook/react-native/commit/b91626af2626bf611958b1e7d0dd0b7338ccc29e) by [@cipolleschi](https://github.com/cipolleschi)) +- **APIs:** Delete experimental API RCTConstants.RCTGetMemoryPressureUnloadLevel ([d79dc48abd](https://github.com/facebook/react-native/commit/d79dc48abd2e65e4d203e488f99eb554c473a1fc) by [@mdvacca](https://github.com/mdvacca)) +- **APIs:** Move `UseNativeViewConfigsInBridgelessMode` to a proper feature flag ([6fc500ee99](https://github.com/facebook/react-native/commit/6fc500ee9942e51519545c1ba1026bacad03dc61) by [@philIip](https://github.com/philIip)) +- **APIs:** Delete partialBatchDidFlush ([a777a8937e](https://github.com/facebook/react-native/commit/a777a8937ee165993d7d9b35c7c981fe6698f9dc) by [@philIip](https://github.com/philIip)) +- **APIs:** Remove the deprecated RCTRuntimeExecutor. ([cf8d09b279](https://github.com/facebook/react-native/commit/cf8d09b279c4bd667d96f9445c1c0b9acb0a0dfc) by [@philIip](https://github.com/philIip)) +- **colors:** Replace uses of `CGColorRef` with UIColor to avoid manual memory management ([b70709dbc2](https://github.com/facebook/react-native/commit/b70709dbc27c75c69e9fd2b082ffa27e7e8db7fd) by [@Saadnajmi](https://github.com/Saadnajmi)) +- **infra:** Cocoapods decide the C++ version for iOS pods ([bd50c4a460](https://github.com/facebook/react-native/commit/bd50c4a460a01dad3cd7cade8191273563675d24) by [@cipolleschi](https://github.com/cipolleschi)) +- **Interop Layer:** Remove opt-out mechanism for Native Modules interop layer ([538bff710f](https://github.com/facebook/react-native/commit/538bff710f7afb4afa7ce91f20074668ad5c739d) by [@philIip](https://github.com/philIip)) + +### Added + +- **Codegen:** Support negative values in enums ([177bf4d043](https://github.com/facebook/react-native/commit/177bf4d043ce862911e477e0f0039214d8541cfd) by [@okwasniewski](https://github.com/okwasniewski)) +- **Codegen:** Add NumberLiteralTypeAnnotation support ([dd472101b7](https://github.com/facebook/react-native/commit/dd472101b76a964b7a64f0bb84d967f702500cad) by [@elicwhite](https://github.com/elicwhite)) +- **Codegen:** Add cli --help details to combine-js-toschema-cli.js ([e4814b0d6d](https://github.com/facebook/react-native/commit/e4814b0d6d981cf96eef2803e8f20548263ea0e4) by [@blakef](https://github.com/blakef)) +- **Codegen:** Codegen for Native Modules now supports string literals ([d2f3f06826](https://github.com/facebook/react-native/commit/d2f3f06826e2287ad5f5dc4e27201fc5dc9fcd5c) by [@elicwhite](https://github.com/elicwhite)) +- **Codegen:** Codegen now supports Union Types in NativeModules ([3af126b562](https://github.com/facebook/react-native/commit/3af126b562cf7e0828906a4fe0ac79a886b557e6) by [@elicwhite](https://github.com/elicwhite)) +- **DevMenu:** Export `DevMenu` from `react-native` ([e12c0d9551](https://github.com/facebook/react-native/commit/e12c0d95516924b5e6ca4f0d5ebcadb42bb19f30) by [@frankcalise](https://github.com/frankcalise)) +- **FlatList:** Updated FlatList setNativeProps type ([b0ac99b477](https://github.com/facebook/react-native/commit/b0ac99b47781e3b68bee2ff737b109f58eeeba78) by [@JDMathew](https://github.com/JDMathew)) +- **Flow:** Upgrade Flow to 0.245.2 ([1f65bf9545](https://github.com/facebook/react-native/commit/1f65bf9545cd84bbf1be7a7a91cb0b4f8b4b47ba) by [@SamChou19815](https://github.com/SamChou19815)) +- **Image:** Image `resizeMode` and `objectFit` support for `'none'`. ([d8cfd98070](https://github.com/facebook/react-native/commit/d8cfd98070cbccc5e8a49446d76bdc2cb0c6939f) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **JS:** Eliminate usage of more than 1-arg `React.AbstractComponent` in React codebase ([6205aad81e](https://github.com/facebook/react-native/commit/6205aad81ef8154a106fa253a1f4b00aee568650) by [@SamChou19815](https://github.com/SamChou19815)) +- **layout:** Added support for `display: contents` ([e7a3f479fe](https://github.com/facebook/react-native/commit/e7a3f479fe37a5d503770bafc03c80b1c2dcb8f7) by [@j-piasecki](https://github.com/j-piasecki)) +- **Modal:** Added overlayColor prop to modal component for customisable background overlay ([4e1d7015c1](https://github.com/facebook/react-native/commit/4e1d7015c1d4e2703133b1347ed97a0cc93b1318) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **Perfetto:** Add FuseboxPerfettoDataSource to emit Fusebox traces using Perfetto ([ef0ea4d834](https://github.com/facebook/react-native/commit/ef0ea4d834ec61c5deede487b46a787a363f6a64) by Benoit Girard) +- **ReactNativeDevTools:** Add support for reload-to-profile in Fusebox (Part 2 of 2: JS) ([4df224ca6d](https://github.com/facebook/react-native/commit/4df224ca6df9dc593ab7090520578f27c520f361) by [@EdmondChuiHW](https://github.com/EdmondChuiHW)) +- **ReactNativeDevTools:** Add support for reload-to-profile in Fusebox. (Part 1 of 2: native) ([91a40a28de](https://github.com/facebook/react-native/commit/91a40a28de3f74a389c6e6ad05fb917d58fc072d) by [@EdmondChuiHW](https://github.com/EdmondChuiHW)) +- **runtime:** Add support for `rn_rootThreshold` in Intersection Observer ([a77d8d9d50](https://github.com/facebook/react-native/commit/a77d8d9d50e69a6a4563737c2ce68d26204eda7f) by [@lunaleaps](https://github.com/lunaleaps)) +- **runtime:** Added `HostInstance` type to represent the instance of a `HostComponent`. ([e24f9917c2](https://github.com/facebook/react-native/commit/e24f9917c25ed8c32c6e01d50a5fa49fe66a6ee1) by [@yungsters](https://github.com/yungsters)) +- **style:** Removed `experimental` prefix and fully released `mixBlendMode` prop ([d2c48f3b1a](https://github.com/facebook/react-native/commit/d2c48f3b1a2a15e9832ea3240c19aea5186ceb24) by [@jorge-cab](https://github.com/jorge-cab)) +- **Text:** Add JS layer for new text content type cellular EID and cellular IMEI ([118c1f7035](https://github.com/facebook/react-native/commit/118c1f7035cfcadb567b1ccd40d85c751dd65162) by [@cipolleschi](https://github.com/cipolleschi)) +- **Text:** Expose missing text content type to JS ([d3d48cb357](https://github.com/facebook/react-native/commit/d3d48cb357e55b1f2ae0042a5960451fbe5ff5c7) by [@cipolleschi](https://github.com/cipolleschi)) +- **TypeScript** Use the TypeScript key in syntax to restrict permissions and types of results ([0244710c4b](https://github.com/facebook/react-native/commit/0244710c4b1e5016069ec9f7b8e7116ff51f59f1) by [@qnnp-me](https://github.com/qnnp-me)) + +#### Android specific + +- **Accessibility:** Added `isHighTextContrastEnabled()` to `AccessibilityInfo` to read `ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED` setting value ([d4ea147b41](https://github.com/facebook/react-native/commit/d4ea147b41e4d22253f80be8b74731dcf0439302) by Ariel Lin) +- **APIs:** Marked ReactPackage#getModule as stable. ([8fba7ebb5e](https://github.com/facebook/react-native/commit/8fba7ebb5e874d001dc5c16eb4229054a2ef4812) by [@javache](https://github.com/javache)) +- **C++:** Add cmake arguments to support 16KB page size for native libraries ([65cdd5b82c](https://github.com/facebook/react-native/commit/65cdd5b82ce7652630b1920fa3a48c8f256c7983) by [@alanleedev](https://github.com/alanleedev)) +- **Error Hadling:** Add exceptionHandler as a parameter of DefaultReactHost.getDefaultReactHost() method ([7a5a10c95c](https://github.com/facebook/react-native/commit/7a5a10c95ce6af1964ce5bd273c0c6513fb78a1e) by [@mdvacca](https://github.com/mdvacca)) +- **graphics** Added PixelUtil extensions for Int and Long ([9406a09f87](https://github.com/facebook/react-native/commit/9406a09f871d3efa66e3d10237a6d1fd08ddee0b) by Thomas Nardone) +- **Image:** Image `force-cache` caching control option ([a0be88fd72](https://github.com/facebook/react-native/commit/a0be88fd727898d4626ca51876d0bfb4e50dcb77) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Image:** Enabling basic `Image` cache control for Android ([e5dd7d68bf](https://github.com/facebook/react-native/commit/e5dd7d68bf264669fc5c4ce5e69b24249d28558b) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Image:** Adds a new `resizeMethod`, `none`, which disables downsampling for an image ([6202319ed5](https://github.com/facebook/react-native/commit/6202319ed544e4d23f1f327ff5334c480af3819d) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **Image:** Adds support for importing XML assets as images ([2e80f5acf1](https://github.com/facebook/react-native/commit/2e80f5acf11cd9726921a00a58700cab9e0bb0a7) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **Modal:** Add navigationBarTranslucent prop to Modal component ([7a6c7a462a](https://github.com/facebook/react-native/commit/7a6c7a462a7898e13327438a6603d83a39147abb) by [@zoontek](https://github.com/zoontek)) +- **resources:** Add a new Fresco decoder for XML resource types ([118b7c18a6](https://github.com/facebook/react-native/commit/118b7c18a6f827dabb00522bbd6a2416e1bf99da) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **runtime:** ReactDelegate and ReactActivityDelegate#getCurrentReactContext can be used to access the current context ([fe8cc62824](https://github.com/facebook/react-native/commit/fe8cc62824372229d90445b2769fed9c08604a7e) by [@javache](https://github.com/javache)) +- **runtime:** Trigger Java GC on app reload ([de3c1ee097](https://github.com/facebook/react-native/commit/de3c1ee097f7041d6f9754a55a45cea80fd25813) by [@mrousavy](https://github.com/mrousavy)) +- **runtime:** React Activity exposes ReactHost ([d78cb78b15](https://github.com/facebook/react-native/commit/d78cb78b15a520f3bebcdf00b82b26bf120f4180) by [@shwanton](https://github.com/shwanton)) +- **runtime:** ReactDelegate `unloadApp` methods for unmounting surfaces without destroying ReactHost ([38593c440e](https://github.com/facebook/react-native/commit/38593c440e949a9b52df0a6821b80ac47b19a693) by [@rozele](https://github.com/rozele)) +- **ScrollView:** Add OnLayoutChange API for scroll views ([d825a4d712](https://github.com/facebook/react-native/commit/d825a4d712a1ba53c0f4209c9da5d51578209a6d) by Thomas Nardone) +- **style:** Add overlapping radii resolution logic preventing incorrect rendering ([451ff70da4](https://github.com/facebook/react-native/commit/451ff70da422beefccfff5b87024145003bb49ff) by [@jorge-cab](https://github.com/jorge-cab)) +- **style:** Logic to check for grayscale mode on android ([e70202e606](https://github.com/facebook/react-native/commit/e70202e606be3101da33d28f5403443c3e84749e) by [@oddlyspaced](https://github.com/oddlyspaced)) +- **style:** Add boxShadow support to BaseViewManager ([b69a92e2c9](https://github.com/facebook/react-native/commit/b69a92e2c95990fcfa95a6ab7b7260ac492f942c) by [@NickGerleman](https://github.com/NickGerleman)) +- **style:** Outline properties `outline-width`, `outline-color`, `outline-style` & `outline-offset` ([17faac4170](https://github.com/facebook/react-native/commit/17faac417035f2cc5f12ec60a46270991be0989a) by [@jorge-cab](https://github.com/jorge-cab)) +- **Text:** TextTransform ktx ([7794d7af43](https://github.com/facebook/react-native/commit/7794d7af43b90b581574361af102f67ad7961a5e) by Thomas Nardone) + +#### iOS specific + +- **Accessibility** Added `isDarkerSystemColorsEnabled()` to `AccessibilityInfo` to read "Increase Contrast" setting value ([af3bee6511](https://github.com/facebook/react-native/commit/af3bee6511fe72fda7415bf974f937012b3eefec) by Ariel Lin) +- **ActionSheetIOS:** Added `disabledButtonTintColor` prop to ActionSheetIOS ([089c87e22e](https://github.com/facebook/react-native/commit/089c87e22e9f431d0e7f35292dce2e36fa86d09a) by [@henninghall](https://github.com/henninghall)) +- **Cocoapods:** Extract RCTAppDependencyProvider in the ReactAppDependencyProvider pod ([102062fbc7](https://github.com/facebook/react-native/commit/102062fbc7d6a5c81192562c3ccb87bc4222a0cf) by [@cipolleschi](https://github.com/cipolleschi)) +- **Codegen:** Add RCTDependencyProvider protocol ([f2b3716426](https://github.com/facebook/react-native/commit/f2b371642684682916522dc82adee93464ba31fe) by [@cipolleschi](https://github.com/cipolleschi)) +- **graphics:** Add `systemCyan` and `systemMint` colors on iOS ([4caf548a9f](https://github.com/facebook/react-native/commit/4caf548a9f2e485aef9cbaeeb0a666cf9b9d3e59) by [@EvanBacon](https://github.com/EvanBacon)) +- **Hermes:** TvOS support for Hermes artifacts ([f673759c83](https://github.com/facebook/react-native/commit/f673759c83fed130964ea7dfe677c04608b8e64d) by [@douglowder](https://github.com/douglowder)) +- **Image:** Image `only-if-cached` cache control option ([dc9db01665](https://github.com/facebook/react-native/commit/dc9db01665308ac931967326abfc86deb9ae7e2a) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **infra:** Declare supportedInterfaceOrientations only on iOS ([40c5e6b64a](https://github.com/facebook/react-native/commit/40c5e6b64a1d82b5b481717b9086340eca2aaef9) by [@okwasniewski](https://github.com/okwasniewski)) +- **infra:** User-configurable BUNDLE_NAME when building bundles ([f8287e25e1](https://github.com/facebook/react-native/commit/f8287e25e11d56beb66ace414ca5f8a6a32405a9) by [@fivecar](https://github.com/fivecar)) +- **infra:** User-configurable BUNDLE_NAME when building bundles ([f8287e25e1](https://github.com/facebook/react-native/commit/f8287e25e11d56beb66ace414ca5f8a6a32405a9) by [@fivecar](https://github.com/fivecar)) +- **Layout:** Fix: Correct Layout Behavior for Combined align-content and align-items ([73a2be1243](https://github.com/facebook/react-native/commit/73a2be12437c93bbd138e0d63cd45d834529a3c4) by [@phuccvx12](https://github.com/phuccvx12)) +- **runtime:** Pass the `RCTAppDependencyProvider` to the `RCTAppDelegate` ([95fc906930](https://github.com/facebook/react-native/commit/95fc906930ece9b30482eb1f0924d7e8614af7c6) by [@cipolleschi](https://github.com/cipolleschi)) +- **runtime:** Introduce the RCTAppDependencyProvider to minimize the changes required y the users ([41c2502b36](https://github.com/facebook/react-native/commit/41c2502b3650e238b0a5d86b5044abcb538b76e3) by [@cipolleschi](https://github.com/cipolleschi)) +- **runtime:** Introduce RCTArchConfiguratorProtocol ([ec0dbb729d](https://github.com/facebook/react-native/commit/ec0dbb729d3774184dee83efbff5f9beebce72ce) by [@okwasniewski](https://github.com/okwasniewski)) +- **runtime:** Introduce RCTUIConfiguratorProtocol ([8850736188](https://github.com/facebook/react-native/commit/8850736188321f13c7bdeadedeed15c759ad72c1) by [@okwasniewski](https://github.com/okwasniewski)) +- **runtime:** Add `CallInvoker` to `BindingsInstaller` ([87bae7f734](https://github.com/facebook/react-native/commit/87bae7f7349976cfc269b25584330c4d3d897d79) by [@mrousavy](https://github.com/mrousavy)) +- **ScrollView:** Scroll the cursor into view when text input is focused ([e021e50d53](https://github.com/facebook/react-native/commit/e021e50d537884a55a9f5bea931adb19e9069dd6) by [@dominictb](https://github.com/dominictb)) +- **style:** Outline properties `outline-width`, `outline-color`, `outline-style` & `outline-offset` ([1288e38423](https://github.com/facebook/react-native/commit/1288e38423f93ed57737dd9b40ad55696494d6f4) by [@jorge-cab](https://github.com/jorge-cab)) +- **Swift:** Expose RCT_NEW_ARCH_ENABLED to Swift ([d24507611d](https://github.com/facebook/react-native/commit/d24507611de7fefc71286fd54b2c909d98a4bf27) by [@okwasniewski](https://github.com/okwasniewski)) +- **Text:** New text content type cellular EID and cellular IMEI ([14e0d0dffb](https://github.com/facebook/react-native/commit/14e0d0dffb9ee8b1d41d60ccbcfd63d53bfe4d48) by [@pasc0al](https://github.com/pasc0al)) +- **TextInput:** TextInput `inputAccessoryViewButtonLabel` prop ([32931466ed](https://github.com/facebook/react-native/commit/32931466ed7e3d8d9eeeb65f12ce146e123870ba) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **TextInput:** Line break mode for TextInput components. **This includes JS APIs for the new mode.** ([ce2d34f194](https://github.com/facebook/react-native/commit/ce2d34f19451c91a90f0bd820064208912c86092) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) + +### Changed + +- **Animated:** The `AnimatedNode` graph will not occur during the insertion effect phase, which means animations can now be reliably started during layout effects. ([316170ce8d](https://github.com/facebook/react-native/commit/ +- **Animated:** Optimized the performance of updating `Animated` components. ([f0ffcd4f5d](https://github.com/facebook/react-native/commit/f0ffcd4f5dfeab794fbfa3257bb9a8fd793ff2bc) by [@yungsters](https://github.com/yungsters)) +- **Animated:** Animations started with incompatible `useNativeDriver` and `AnimatedValue` configurations will now synchronously fail. Previously, spring and timing animations with non-zero delays would throw the error asynchronously. ([fd8cf19625](https://github.com/facebook/react-native/commit/fd8cf1962585aa49e8921475d89c1a5c2423c51c) by [@yungsters](https://github.com/yungsters)) +- **Animated:** The `Animation` superclass no longer exposes `__onEnd` as a property. Subclasses must instead invoke `super.start(…)` in their `start()` implementation. ([b3fe06b268](https://github.com/facebook/react-native/commit/b3fe06b2685e526fe2bc420a902a3ccd4e1381df) by [@yungsters](https://github.com/yungsters)) +- **Animated:** Bring back shouldSkipStateUpdatesForLoopingAnimations feature flag ([6e0e712c2a](https://github.com/facebook/react-native/commit/6e0e712c2a680cf4b4de1ee5fb25cc5282b242c5) by [@dmytrorykun](https://github.com/dmytrorykun)) +- **Animated:** AnimatedNode (and its subclasses) once again implement `toJSON()`. ([7bd4a54968](https://github.com/facebook/react-native/commit/7bd4a5496815943b031b68ca46792560d8d798d8) by [@yungsters](https://github.com/yungsters)) +- **Animated:** Improved the performance of unmounting (and updating, when an enclosing Activity becomes hidden) Animated components ([46abda55b9](https://github.com/facebook/react-native/commit/46abda55b9749dc171e0fec551ba83c027818eb7) by Royi Hagigi) +- **Animated:** AnimatedNode (and its subclasses) no longer implement `toJSON()`. ([fe6228512e](https://github.com/facebook/react-native/commit/fe6228512e076820c9c11869cfe24b19d1abfb58) by [@yungsters](https://github.com/yungsters)) +- **Animated:** Animated now resolves `style` to the original prop value if it contains no `AnimatedNode` instances. Previously, it would resolve to a flattened style object. ([ca234ba10e](https://github.com/facebook/react-native/commit/ca234ba10e8d06630da7ea00aac515b222137645) by [@yungsters](https://github.com/yungsters)) +- **AttributedString:** AttributedString `appendFragment` and `prependFragment` take an rval instead of a const ref; append/prependAttributedString have been removed ([2c31fe99e1](https://github.com/facebook/react-native/commit/2c31fe99e1cc5bfdb393d4f5c70231a042ea67ef) by [@javache](https://github.com/javache)) +- **AttributedString:** Improved AttributedText generation for raw text nodes. ([2f7957f2fd](https://github.com/facebook/react-native/commit/2f7957f2fd424fdaa980d99a4ff05eb3237d662e) by [@javache](https://github.com/javache)) +- **Flow:** Simplified Flow types to use `HostInstance` (which changing nominal types). ([177697f539](https://github.com/facebook/react-native/commit/177697f539ec68a47cbb8f57260cebe701589ef1) by [@yungsters](https://github.com/yungsters)) +- **JS:** `useMergeRefs` and components using it (e.g. `Pressable`) now support ref cleanup functions. ([01e210fd28](https://github.com/facebook/react-native/commit/01e210fd28bc961e8c1b5fa454b3c947adda296c) by [@yungsters](https://github.com/yungsters)) +- **JS:** Fix: use public instance in Fiber renderer and expose it from getInspectorDataForViewAtPoint (#31068) ([633ad4933e](https://github.com/facebook/react-native/commit/633ad4933e9514d4168d6dcdb7e56c9a1859482a) by [@hoxyq](https://github.com/hoxyq)) +- **deps:** Bump serve-static to 1.16.2 to fix CVE-2024-43800 ([50e38cc9f1](https://github.com/facebook/react-native/commit/50e38cc9f1e6713228a91ad50f426c4f65e65e1a) by [@cortinico](https://github.com/cortinico)) +- **deps:** Bump Folly to 2024.10.14.00 ([37375d8aba](https://github.com/facebook/react-native/commit/37375d8aba0869531567426466478b0de9a1aea3) by [@alanleedev](https://github.com/alanleedev)) +- **deps:** Update Metro to 0.81.0 ([0902b0af75](https://github.com/facebook/react-native/commit/0902b0af75ba30ec9d4abeda71769d0685637afa) by [@robhogan](https://github.com/robhogan)) +- **deps:** Upgrade React DevTools to 6.0.0. ([ed4f6d6891](https://github.com/facebook/react-native/commit/ed4f6d68910677ab050e3fef5aaa87e42d582fe0) by [@hoxyq](https://github.com/hoxyq)) +- **infra:** Do not print Bridgeless Mode is enabled on console anymore ([f3a969f38d](https://github.com/facebook/react-native/commit/f3a969f38d7a2c74bf63ee05c4c819c0873059a9) by [@cortinico](https://github.com/cortinico)) +- **VirtualizedList:** Fix unnececary rerenders of VirtualizedListCells with strictMode={true} ([aafe696453](https://github.com/facebook/react-native/commit/aafe696453186d0e87ae96d0bca4c6650234d222) by [@Tom910](https://github.com/Tom910)) +316170ce8d0aac1df3261c792b9f768665d134c5) by [@yungsters](https://github.com/yungsters)) + +#### Android specific + +- **deps:** Updating targetSdk to 35 (apps can still choose their own targetSdk regardless of RN version) ([48ea6867a9](https://github.com/facebook/react-native/commit/48ea6867a96bd16dc7aed9af5a8e9ce12a487c22) by [@alanleedev](https://github.com/alanleedev)) +9fa4845136969ec95ce5615b7ea78feaf0f7f109) by [@javache](https://github.com/javache)) +- **deps:** AGP to 8.7.2 ([e1a1cead43](https://github.com/facebook/react-native/commit/e1a1cead434a6856b2b018274876b9ba8eab706a) by [@cortinico](https://github.com/cortinico)) +- **deps:** Android NDK to 27.1 ([ba061a5d18](https://github.com/facebook/react-native/commit/ba061a5d18176fd455c3aa6350127506dac05211) by [@alanleedev](https://github.com/alanleedev)) +- **deps:** Bump fbjni to 0.7.0 ([1c002c7b4e](https://github.com/facebook/react-native/commit/1c002c7b4ea4f22729920e54a9032402247ea350) by [@alanleedev](https://github.com/alanleedev)) +- **deps:** Fresco to 3.4.0 ([091025e18b](https://github.com/facebook/react-native/commit/091025e18b1dc5212031e3ed06bfb6c450e788e2) by [@cortinico](https://github.com/cortinico)) +- **deps:** Bump Kotlin 1.9.x to 2.0.x ([972c2c864c](https://github.com/facebook/react-native/commit/972c2c864c0b563163a36080a13908d1c0a3fb87) by [@cortinico](https://github.com/cortinico)) +- **deps:** Bump Android Gradle Plugin (AGP) to 8.7.0 ([cbc0978bb6](https://github.com/facebook/react-native/commit/cbc0978bb65dcfd2a18a54201c845785a626b1b3) by [@cortinico](https://github.com/cortinico)) +- **deps:** Gradle to 8.10.1 ([90f89a830a](https://github.com/facebook/react-native/commit/90f89a830acced9e6b8e80ef58aefd7e2c9666a8) by [@cortinico](https://github.com/cortinico)) +- **deps:** Gradle to 8.11.1 ([490db92562](https://github.com/facebook/react-native/commit/490db92562df3baf6dc38737778179065f378715) by [@cortinico](https://github.com/cortinico)) +- **Kotlin:** Migrated systeminfo module code from Java to Kotlin ([8dc2c90ce5](https://github.com/facebook/react-native/commit/8dc2c90ce5f4b30f4729560aed2412e6d29f39fa) by [@oddlyspaced](https://github.com/oddlyspaced)) +- **Kotlin:** Migrate ReactFeatureFlags to Kotlin ([4076dbfc86](https://github.com/facebook/react-native/commit/4076dbfc8651fcd193b886bf63b23728fad466d7) by [@mdvacca](https://github.com/mdvacca)) +- **Kotlin:** Migrate MainReactPackage to Kotlin (and make it final) ([7bbac8ee27](https://github.com/facebook/react-native/commit/7bbac8ee27daf092b580b57c2c7ee46d2723cd09) by [@cortinico](https://github.com/cortinico)) +- **Native Modules:** TurboModules marked as requiring eager init will now be constructed on the mqt_native thread to increase concurrency in React Native init. ([663b5f9d19](https://github.com/facebook/react-native/commit/663b5f9d19a905520bd0aef62cda890f76ef9b6e) by [@javache](https://github.com/javache)) +- **ReactViewGroup:** Consolidated ReactViewGroup add/remove overrides ([0b22b955f1](https://github.com/facebook/react-native/commit/0b22b955f1494f0e7441a01dd19b3fdf5e20c3dc) by Thomas Nardone) +- **runtime:** Invocations to JS will now invoke their callbacks immediately if the instance is ready. Surface starts will not wait for the main thread to become available to dispatch the work in JS. ([9fa4845136](https://github.com/facebook/react-native/commit/ +- **runtime:** Update documentation for ReactHost.destroy() APIs ([443bc32dc4](https://github.com/facebook/react-native/commit/443bc32dc49a86534fce1d6ec0e31c97b8f33053) by [@mdvacca](https://github.com/mdvacca)) +- **style:** Disabling `outline` props on Android to stay consistent with iOS ([7ab0002799](https://github.com/facebook/react-native/commit/7ab0002799d52a876a8cdd32f25ebef6d431650e) by [@jorge-cab](https://github.com/jorge-cab)) +- **tracing:** Improve FpsDebugFrameCallback.getTotalTimeMS() accuracy ([d54c25fdae](https://github.com/facebook/react-native/commit/d54c25fdaee4d2642cdbca812b61c6973d3f203d) by [@aamagda](https://github.com/aamagda)) + +#### iOS specific + +- **Codegen:** Change how components automatically register ([8becc2514d](https://github.com/facebook/react-native/commit/8becc2514d484c99b51ea76f479f06a8fcdd8265) by [@cipolleschi](https://github.com/cipolleschi)) +- **Codegen:** Stop generating the RCTThirdPartyLibraryComponentProvider ([60b9d3d89e](https://github.com/facebook/react-native/commit/60b9d3d89eba90a945070646c6220b3c03b3aeba) by [@cipolleschi](https://github.com/cipolleschi)) +- **runtime:** `RCTSurfaceHostingProxyRootView` no longer has different behavior (whether it calls `start` on the provided *surface*) depending on which initializer is used. Call `start` yourself on the *surface* instead. ([13b93cfdda](https://github.com/facebook/react-native/commit/13b93cfddaa559697968ac1c19e55f7aaa053070) by Nolan O'Brien) +- **runtime:** Use `newArchEnabled` flag in RCTAppDelegate and RCTRootViewFactory ([7e1674fc59](https://github.com/facebook/react-native/commit/7e1674fc59abeeb70d946ee082a829fae4c671b7) by [@okwasniewski](https://github.com/okwasniewski)) +- **runtime:** Do not move to the main queue synchronously when starting a new surface ([ab2c47be28](https://github.com/facebook/react-native/commit/ab2c47be285fde99a77d189fd04220ef8ad0933a) by [@cipolleschi](https://github.com/cipolleschi)) +- **APIs**: Rename `RCTUIGraphicsImageRenderer` to `RCTMakeUIGraphicsImageRenderer` ([6a09fc09af](https://github.com/facebook/react-native/commit/6a09fc09af8eedbf409ab870d5714e44892b2a16) by [@Saadnajmi](https://github.com/Saadnajmi)) + +### Deprecated + +#### Android specific + +- **Codegen:** Deprecated shadows for ReadableNative[Map|Array].[Readable|Writable] ([d424bb9d7c](https://github.com/facebook/react-native/commit/d424bb9d7cf101dc5609e8f787ba8af2a33d0262) by [@javache](https://github.com/javache)) +- **Fabric:** ReactContext.getFabricUIManager() method ([fb737ca7d3](https://github.com/facebook/react-native/commit/fb737ca7d34b636a3aa337a0935bf9a5a10c641d) by [@mdvacca](https://github.com/mdvacca)) +- **runtime:** Deprecate CatalystInstance in old architecture ([3e27ef1f6e](https://github.com/facebook/react-native/commit/3e27ef1f6e024bba8725a3bd64e2648ffd6af496) by [@mdvacca](https://github.com/mdvacca)) +- **runtime:** Deprecate BridgelessCatalystInstance class ([72bd840dd3](https://github.com/facebook/react-native/commit/72bd840dd3dc7b6e3e88a74ac9ddb000a0cb3a60) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- **runtime:** Deprecating RCTBridgeModule batchDidComplete and adding configuration to disable it ([731bd95c43](https://github.com/facebook/react-native/commit/731bd95c430c752126aaaa34e4911ba2b87b382f) by [@philIip](https://github.com/philIip)) + +### Removed + +- **DevX:** Remove "run on iOS" and "run on Android" from the dev server key commands ([19b971ff94](https://github.com/facebook/react-native/commit/19b971ff94a0fe353f82363e788c13f86815663b) by [@huntie](https://github.com/huntie)) +- **JS:** Removed type for useConcurrentRoot from AppRegistry, as it was already ignored ([2ec547ad28](https://github.com/facebook/react-native/commit/2ec547ad28ca914c17e276abb91174dfa0dc87b2) by [@javache](https://github.com/javache)) +- **TypeScript:** Removed `refs` property from `NativeMethods` TypeScript definition. ([223e98cc4b](https://github.com/facebook/react-native/commit/223e98cc4b656b94b48c88940114bfdc025f8ddf) by [@yungsters](https://github.com/yungsters)) + +#### Android specific + +- **APIs:** Remove `BackHandler.removeEventListener` ([44d619414c](https://github.com/facebook/react-native/commit/44d619414c1de3dbf17a421afa8dbcec7cdab025) by [@retyui](https://github.com/retyui)) +- **APIs:** DevToolsReactPerfLogger stats gathering now uses an internal API ([f503fe3f10](https://github.com/facebook/react-native/commit/f503fe3f100d96a31fc56451d7846d80ce5c342f) by [@javache](https://github.com/javache)) +- **APIs:** BindingImpl is no longer part of the public interface ([18faf68b48](https://github.com/facebook/react-native/commit/18faf68b4825118253cf247572084c4da8f6366e) by [@javache](https://github.com/javache)) +- **APIs:** FabricComponents is removed from public API ([300db67b27](https://github.com/facebook/react-native/commit/300db67b270a5d6fc85d27188d0d1089675f89c0) by [@javache](https://github.com/javache)) + +### Fixed + +- **Animated:** Correctly pass down isLooping in parallel animation ([4014aa4528](https://github.com/facebook/react-native/commit/4014aa4528d43e905246850c83007a635938d7cb) by [@zeyap](https://github.com/zeyap)) +- **Animated:** Improved types for AnimatedProps ([390925ea39](https://github.com/facebook/react-native/commit/390925ea39eb469768f21cf7069b8f75ccdec09d) by [@javache](https://github.com/javache)) +- **Animated:** Order of operations related to platformConfig propagation in NativeAnimated ([a64183b0c6](https://github.com/facebook/react-native/commit/a64183b0c6a56e9d482c7b8b0f80965493ed87af) by [@rozele](https://github.com/rozele)) +- **Animated:** Replace Object.hasOwn usages to fix Animated on JSC ([e996b3f346](https://github.com/facebook/react-native/commit/e996b3f346462a394012a722ce19990cdf9c3d9a) by [@robhogan](https://github.com/robhogan)) +- **Animated:** Fix buttons becoming unresponsive when transform is animated (Revert #48669) ([c799aa07e2](https://github.com/facebook/react-native/commit/c799aa07e2148a2ca38939cb72468c949ed0c95f) by [@sammy-SC](https://github.com/sammy-SC)) +- **Appearance:** Fixed jest error from Appearance.js ([ce838a4bcf](https://github.com/facebook/react-native/commit/ce838a4bcfb1c08728b637a9addd24cc6e3477e0) by [@Kudo](https://github.com/Kudo)) +- **Appearance:** Fix `Appearance.setColorScheme(null)` not resetting color scheme value ([7d63235086](https://github.com/facebook/react-native/commit/7d63235086352d8c424d634c7039551f0a5025dc) by [@sangonz193](https://github.com/sangonz193)) +- **C++:** Fix C++ bridging template compatibility with MSVC ([e6848ba5ba](https://github.com/facebook/react-native/commit/e6848ba5ba997d102cbaf6181c7c8c73e25a0827) by [@acoates-ms](https://github.com/acoates-ms)) +- **C++** Fix cast and control paths errors on windows ([0794fa909b](https://github.com/facebook/react-native/commit/0794fa909b2e06fad5c40dce402c5f14a24bb946) by [@TatianaKapos](https://github.com/TatianaKapos)) +- **C++** Fix type conversion error in react native windows build. ([13db1cb88b](https://github.com/facebook/react-native/commit/13db1cb88bdd454cf19be358d6f0cd62f5a6d0cc) by [@marlenecota](https://github.com/marlenecota)) +- **Codegen:** Support nested objects in arrays ([13780126d3](https://github.com/facebook/react-native/commit/13780126d3cb17ad00c2954f9830a3623812dc3e) by [@tvanlaerhoven](https://github.com/tvanlaerhoven)) +- **Codegen:** Make Codegen work with local modules ([7b6e8e7765](https://github.com/facebook/react-native/commit/7b6e8e776574e683821133f0c814969d74c4de61) by [@cipolleschi](https://github.com/cipolleschi)) +- **Codegen:** Upgrade Codegen dependency `jscodeshift@17.0.0` to resolve outdated dependencies ([39c98fb8f8](https://github.com/facebook/react-native/commit/39c98fb8f8af98aa40dc89a1580d6c1901fa86cf) by [@byCedric](https://github.com/byCedric)) +- **Codegen:** Fix source mapping for codegenNativeCommands ([8fba154b66](https://github.com/facebook/react-native/commit/8fba154b6655b5d87609d7c9f136997141ea5e99) by [@vzaidman](https://github.com/vzaidman)) +- **Codegen:** Skip hidden folders when looking for third party components. ([8ab524312a](https://github.com/facebook/react-native/commit/8ab524312ab3bf1192b94ae6e30d296a85baa944) by [@cipolleschi](https://github.com/cipolleschi)) +- **Dev-Middleware:** Rewrite URLs in the inspector proxy to cover all configurations, not just Android emulators. ([74995bc90a](https://github.com/facebook/react-native/commit/74995bc90aa039b880e4875ad356d3bce324d902) by [@robhogan](https://github.com/robhogan)) +- **Dev-Middleware:** Fix URL rewriting where device and debugger reach the server on different ports/protocols. ([5da7ebf99a](https://github.com/facebook/react-native/commit/5da7ebf99ae317c104d8e4bfbf36d3d89f66b5c9) by [@robhogan](https://github.com/robhogan)) +- **Dev-Middleware:** Regex-escape IP addresses in urlRegex replacements ([aae3e03e57](https://github.com/facebook/react-native/commit/aae3e03e57096c3dc51589a3de240d49a8b9fadf) by [@robhogan](https://github.com/robhogan)) +- **Dev-middleware:** Remove URL.canParse, restore compat with Node < 18.17 ([99767d43b0](https://github.com/facebook/react-native/commit/99767d43b04e41c83e3bcbfebe267d6fdc284549) by [@robhogan](https://github.com/robhogan)) +- **Error Handling:** Improved error message when no view config is found. ([bca232ad90](https://github.com/facebook/react-native/commit/bca232ad90692da7a87be5e37ee2680380f94bef) by [@javache](https://github.com/javache)) +- **FlatList:** Fixed accuracy of FlatList estimations to determine what elements are visible in the rendering window. ([40aaeb7181](https://github.com/facebook/react-native/commit/40aaeb71814a1987482d97fd3170af0add55bc6a) by [@rubennorte](https://github.com/rubennorte)) +- **FormData:** Remove non compliant `filename*` attribute in a FormData `content-disposition` header ([f791fb9e66](https://github.com/facebook/react-native/commit/f791fb9e660fe15bccf55029045c48f4bbcbc5cb) by [@foyarash](https://github.com/foyarash)) +- **graphics:** Linear gradient start and end point algorithm. ([221d1eceda](https://github.com/facebook/react-native/commit/221d1eceda0e5ab870e96dcdd26e22ab17a3870c) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **Hermes:** Hermes: revert Intl removal ([4cffff35e0](https://github.com/facebook/react-native/commit/4cffff35e030f256c32bf69c5971dfee4e60723f) by [@robhogan](https://github.com/robhogan)) +- **Image:** Passed height and width as native props to support cases where source is an array. ([45b177f50d](https://github.com/facebook/react-native/commit/45b177f50de624eefcb66bb2d8bc1ffb00855863) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **infra:** When using Babel with plain JavaScript files, support for additional user syntax plugins should be fixed (now uses Babel's parser instead of hermes-parser). There is no change for JS files annotated with `flow`, where extended JS syntax remains - unsupported. ([3de9892353](https://github.com/facebook/react-native/commit/3de989235365504468d2b6c0bb194e944bf1ce8e) by [@huntie](https://github.com/huntie)) +- **infra:** Fix npm react-native start when cli-server-api isn't installed ([e0be2efe4e](https://github.com/facebook/react-native/commit/e0be2efe4e80edf99f96a2ae6a25856f6df5e0ca) by [@blakef](https://github.com/blakef)) +- **infra:** Fix "punycode is deprecated" warning by replacing `node-fetch` with native `fetch` ([881d8a720f](https://github.com/facebook/react-native/commit/881d8a720fb24241d7b2127273ca6116833bf176) by [@jbroma](https://github.com/jbroma)) +- **JS:** Do not discard props in the patch when they are not null while using `useNativeProps` ([4c3112c8d8](https://github.com/facebook/react-native/commit/4c3112c8d8685d6c34be9acf07b18871b3cee5b2) by [@cipolleschi](https://github.com/cipolleschi)) +- **KeyboardAvoidingView:** Accessing KeyboardAvoidingEvent event in onLayout handler ([68db74205a](https://github.com/facebook/react-native/commit/68db74205afdd190304eb73ef71710781fa580b9) by [@mhoran](https://github.com/mhoran)) +- **KeyboardAvoidingview:** Fix KeyboardAvoidingView not aware of the keyboard closing it is unmounted ([08bd8ac47d](https://github.com/facebook/react-native/commit/08bd8ac47da60121225e7b281bbf566e2c5a291e) by [@QichenZhu](https://github.com/QichenZhu)) +- **layout:** Plumbing to get boxSizing prop to Yoga round 2 ([3ca796edc3](https://github.com/facebook/react-native/commit/3ca796edc327c5287533dcc8f4394033d5398c2d) by [@joevilches](https://github.com/joevilches)) +- **layout:** Fix TextMeasureCacheKey Throwing Out Some LayoutConstraints ([e7db7a7266](https://github.com/facebook/react-native/commit/e7db7a72661bd49948c13eb46d0f72fbe9e00bf3) by [@NickGerleman +](https://github.com/NickGerleman)) +- **Modal:** Rename overlayColor prop in Modal to backdropColor ([7aeff18970](https://github.com/facebook/react-native/commit/7aeff18970a2b47cbb3fffc1408e4bb21eec6fed) by [@alanleedev](https://github.com/alanleedev)) +- **Native Modules:** TurboModule::get is now a final method, override `create` to customize property lookup ([5b5e150eaf](https://github.com/facebook/react-native/commit/5b5e150eaff015540720225b9e61acb306e1d107) by [@javache](https://github.com/javache)) +- **PointerEvents:** Fixed issues with W3C PointerEvents testsx ([1dcaf823f5](https://github.com/facebook/react-native/commit/1dcaf823f5e7d9b114dd803ce3181aa0b8f827ad) by [@rozele](https://github.com/rozele)) +- **PointerEvents:** Fixed issue with W3C PointerEvents tests ([68a6b69b27](https://github.com/facebook/react-native/commit/68a6b69b27275998b4083797942f3e26a92d3adb) by [@rozele](https://github.com/rozele)) +- **ReactNativeDevTools:** Don't assume 10.0.2.2 is an alias for localhost unless it's used to establish a connection to the server ([69400be4fc](https://github.com/facebook/react-native/commit/69400be4fc0abd38072f6586f3e7d5b6c33e54be) by [@robhogan](https:// +- **ReactNativeDevTools:** Fix fetching sources and source maps when the dev-server is remote and not tunnelled via the same port+protocol. ([d1b0e9a30b](https://github.com/facebook/react-native/commit/d1b0e9a30b3afc56b9355453cf7f6e690bdd8aff) by [@robhogan](https://github.com/robhogan)) +- **runtime:** Fixes typo in ReactHostImpl ([e3f03269c5](https://github.com/facebook/react-native/commit/e3f03269c5cea28977e44ddf5c5125968336b0e6) by [@rozele](https://github.com/rozele)) +- **runtime:** Microtasks are now correctly executed after the code evaluation in Console panel of DevTools. ([3dfe22bd27](https://github.com/facebook/react-native/commit/3dfe22bd27429a43b4648c597b71f7965f31ca65) by [@hoxyq](https://github.com/hoxyq)) +- **runtime:** Fix setImmediate/clearTimeout mismatch in NativeAnimatedHelper that could clear an unrelated setTimeout. ([a5dd1be889](https://github.com/facebook/react-native/commit/a5dd1be889be21f8daefbc609702989ec7c156cf) by Benoit Girard) +- **style:** Fix the nodes' owners not being updated when `display: contents` is used ([aa53bde21b](https://github.com/facebook/react-native/commit/aa53bde21b8952533cf17ffee234b273766f2133) by [@j-piasecki](https://github.com/j-piasecki)) +- **style:** Fix for nodes with `display: contents` not being cleaned in some cases ([a88ddcecc9](https://github.com/facebook/react-native/commit/a88ddcecc93a9fa2d231907439d02b11bac8a944) by [@j-piasecki](https://github.com/j-piasecki)) +- **Text:** Fix text not taking full width ([550b0c0ed1](https://github.com/facebook/react-native/commit/550b0c0ed16a64ce58102f15d4657abe92aac71c) by [@s77rt](https://github.com/s77rt)) +github.com/robhogan)) +- **Text:** AnsiHighlight style in RTL layout ([9a3958a619](https://github.com/facebook/react-native/commit/9a3958a619fddb75ed3c6eddebd94f11c0d00e9f) by [@hexboy](https://github.com/hexboy)) +- **Text:** TextTransform: capitalize better reflects the web behaviour ([dc2000c875](https://github.com/facebook/react-native/commit/dc2000c8750f42b2f01bdad75455750814d567c6) by [@javache](https://github.com/javache)) +- **tracing:** `PerformanceEntryReporter::reportMark` and `PerformanceEntryReporter::reportMeasaure` now return created performance entries. ([32f7b3b4e0](https://github.com/facebook/react-native/commit/32f7b3b4e0b8be1d1138f43c46b3c86d9a64c29a) by [@robik](https://github.com/robik)) +- **TypeScript** The definition of ts of resizeMethod attribute is none. ([758892a7d8](https://github.com/facebook/react-native/commit/758892a7d89cc1e316984f8f522738021410f530) by [@nianxiongdi](https://github.com/nianxiongdi)) +- **VirtualizedList:** Fix onEndReached not being called when getItemLayout is present and we scroll past render window ([3485e9ed87](https://github.com/facebook/react-native/commit/3485e9ed871886b3e7408f90d623da5c018da493) by YunPeng Chong) +- **VirtualizedList** Fix onEndReached not being called when getItemLayout is present and we scroll past render window ([62b7396bf4](https://github.com/facebook/react-native/commit/62b7396bf45c04bd47e74fe4c1e5b5e59918244d) by [@NickGerleman](https://github.com/NickGerleman)) + +#### Android specific + +- **C++:** Fixes C++ TurboModules: Prioritise OnLoad.cpp, falling back to default-app-setup ([5a64bde701](https://github.com/facebook/react-native/commit/5a64bde701e28615a79ad52d0631de62ce6cab92) by [@timbocole](https://github.com/timbocole)) +- **Codegen:** Fix IOException in `BuildCodegenCLITask` ([9147b0753a](https://github.com/facebook/react-native/commit/9147b0753a6c3afb2480b079f91614cd7189a28a) by [@vonovak](https://github.com/vonovak)) +- **Dialog:** Fixed styling on alert dialog titles to wrap two lines and retain bold appearance ([c54b23ff9e](https://github.com/facebook/react-native/commit/c54b23ff9ed7a6bfbb52c081c5afe4b3911d0dd2) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **graphics:** Missing isInvertColorsEnabled implementation for Android ([cc1d2853fb](https://github.com/facebook/react-native/commit/cc1d2853fb2b64adfb884cb30c8d22ce0260be15) by [@oddlyspaced](https://github.com/oddlyspaced)) +- **Headless Tasks:** Fix crash on HeadlessJsTaskService on old architecture ([4560fc0497](https://github.com/facebook/react-native/commit/4560fc049748a345d5945bc08d43f4b61ca51ff3) by [@cortinico](https://github.com/cortinico)) +- **Image:** Apps will no longer fatally crash when trying to draw large images ([483b928224](https://github.com/facebook/react-native/commit/483b92822496fa2e6339f75049a33be1e9567f52) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **Image:** Avoid blocking the main thread when decompressing drawable resources ([420229d669](https://github.com/facebook/react-native/commit/420229d66946320f06485c5a3d3c167eae1a407e) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **JSC:** Fixes RNTester JSC Debug instacrashing ([17a5d2be5a](https://github.com/facebook/react-native/commit/17a5d2be5a96703ed1c76d89990a8f1e37abd4d4) by [@cortinico](https://github.com/cortinico)) +- **layout:** Reenable `setAndroidLayoutDirection` by default ([6cf0cfb5a4](https://github.com/facebook/react-native/commit/6cf0cfb5a47a437b8a17b50b4c70460be15ee1cd) by [@NickGerleman](https://github.com/NickGerleman)) +- **Layout:** Restore layout/invalidate during ReactViewClippingManager.removeViewAt() ([e3970a4bb3](https://github.com/facebook/react-native/commit/e3970a4bb3f39ec5652277d78d8c58c89e87dc30) by [@tdn20](https://github.com/tdn20)) +- **Layoutanimations:** LayoutAnimations work on full new architecture ([43af902693](https://github.com/facebook/react-native/commit/43af902693f0befde802a7f684e26b19ec7126c8) by [@javache](https://github.com/javache)) +- **Modal:** Fix issues with Modals and lifecycle events in multi-surface apps ([1ffef5669c](https://github.com/facebook/react-native/commit/1ffef5669c21f4b2c5fec6bc58a85f95518cf10e) by [@rozele](https://github.com/rozele)) +- **Modal:** Fix crash for Modal not attached to window manager ([eaa780de1c](https://github.com/facebook/react-native/commit/eaa780de1c799bf35fded2914d27b1953b093340) by [@cipolleschi](https://github.com/cipolleschi)) +- **Permissions:** Prevent ArrayIndexOutOfBoundsException in permission check ([6aeca53b3e](https://github.com/facebook/react-native/commit/6aeca53b3ed4530e57a31d7a5593ae16b550b985) by [@antFrancon](https://github.com/antFrancon)) +- **ReactNativeDevTools:** Fix source loading when using an Android emulator connecting to a dev server on the host. ([ca9c56329f](https://github.com/facebook/react-native/commit/ca9c56329fe548b6631934afee0c9be63e1752a1) by [@robhogan](https://github.com/robhogan)) +- **RNGP** Do not attempt to substring to 1024 while logging ([e64513bf4e](https://github.com/facebook/react-native/commit/e64513bf4ecce60aff5c04e3bed91b203429d12f) by [@cortinico](https://github.com/cortinico)) +- **runtime:** Fixes some deadlocks when doing commits and state updates synchronously from the UI thread (e.g.: from reanimated). ([3986eefed1](https://github.com/facebook/react-native/commit/3986eefed1733f305db5410737a96b635f0159e7) by [@rubennorte](https://github.com/rubennorte)) +- **runtime:** Addressed race condition in surface start. ([6ba7cb3102](https://github.com/facebook/react-native/commit/6ba7cb310273a0ecce6a168bf3aae45fb85bf955) by [@javache](https://github.com/javache)) +- **runtime:** Avoid null reference exception in bridgeless ReactDelegate ([0d664100bb](https://github.com/facebook/react-native/commit/0d664100bbf608550a5c42a4e9b02c6c5bd0f5b8) by [@rozele](https://github.com/rozele)) +- **runtime:** Fix Frame Callback not being called after Host Resume ([e8f8ee3c0f](https://github.com/facebook/react-native/commit/e8f8ee3c0f28b8c5751ffaef495adea0b8daf1eb) by [@s77rt](https://github.com/s77rt)) +- **runtime:** Merge Android ViewNativeComponent ViewConfig into BaseViewConfig ([0ba00fc998](https://github.com/facebook/react-native/commit/0ba00fc99891a333d3625db15d9dd832ca7eac88) by [@NickGerleman](https://github.com/NickGerleman)) +- **runtime:** Add missing BaseViewManager props to BaseViewManagerDelegate ([6741fd94ad](https://github.com/facebook/react-native/commit/6741fd94ad26012938caa65a5129f0eca6f2246e) by [@NickGerleman](https://github.com/NickGerleman)) +- **runtime:** Fix issue where `onDropViewInstance` cleanup was not being handled after `ReactRootView.unmountReactApplication` ([0449630612](https://github.com/facebook/react-native/commit/04496306123c46730b46accb2cd6239531e51fef) by [@rozele](https://github.com/rozele)) +- **runtime:** Fix some cases where we override setBackgroundColor on View-level instead of VM level ([0b0ac81fbe](https://github.com/facebook/react-native/commit/0b0ac81fbeebf819e744b6ecc19d549aaab8406d) by [@NickGerleman](https://github.com/NickGerleman)) +- **runtime:** Fix interactions between removeClippedSubviews and RTL ([513e9669e7](https://github.com/facebook/react-native/commit/513e9669e78a4bfd9b0380335c61f581343c4009) by [@NickGerleman](https://github.com/NickGerleman)) +- **runtime:** Fix: ReactDelegate/ReactFragment crashing on New Architecture apps ([12dda31bc1](https://github.com/facebook/react-native/commit/12dda31bc12f4a04ec9df70d30328b1001bb2cec) by [@cortinico](https://github.com/cortinico)) +- **runtime:** ReactFragment should properly instantiate ReactDelegate on Bridgeless ([7176d11ce4](https://github.com/facebook/react-native/commit/7176d11ce468ca37e9cbe8afcc1f6344c250dd0c) by [@cortinico](https://github.com/cortinico)) +- **runtime:** ARG_DISABLE_HOST_LIFECYCLE_EVENTS in ReactFragment to allow unmounting a surface without destroying ReactHost. ([40c875deca](https://github.com/facebook/react-native/commit/40c875decabaa56d6dd45ce03b22e8b3931781ac) by [@vincenzovitale](https://github.com/vincenzovitale)) +- **runtime:** Use appropriate Nullable attribute for ReactRootView field in ReactDelegate ([cbddcfc691](https://github.com/facebook/react-native/commit/cbddcfc6911101608df36f2a8d047768296c63b2) by [@rozele](https://github.com/rozele)) +- **runtime:** Hover events were dispatched incorrectly when multiple ReactRoots were layered. ([533ef2ca37](https://github.com/facebook/react-native/commit/533ef2ca37d3b19fc909315f183e3f30dbf4b93d) by [@javache](https://github.com/javache)) +- **runtime:** Handle removal of in-transition views. ([f402ed17fa](https://github.com/facebook/react-native/commit/f402ed17fa6d75aea24e2ad99a8b8d8ad20840e3) by [@kkafar](https://github.com/kkafar)) +- **ScrollView** Dispatch onMomentumScrollEnd after programmatic scrolling ([c69e330324](https://github.com/facebook/react-native/commit/c69e330324724a1e363f4786b2b03ee7ff4b35c5) by [@Biki-das](https://github.com/Biki-das)) +- **ScrollView:** Fix legacy arch RTL horizontal ScrollView regression ([bfca7cfe7a](https://github.com/facebook/react-native/commit/bfca7cfe7a8e0da10fdb776100fbc706233c0d8d) by [@NickGerleman](https://github.com/NickGerleman)) +- **ScrollView:** Fix RTL ScrollView position when content smaller than container ([0df59d4f03](https://github.com/facebook/react-native/commit/0df59d4f03f79c0fcb9ede2d21bf4d49c97c21ef) by [@NickGerleman](https://github.com/NickGerleman)) +- **ScrollView:** Fixed incorrect scroll event/position for scroll views when doing a smooth scroll animation. ([b4c41ec768](https://github.com/facebook/react-native/commit/b4c41ec7685da6e8ef35c41c30aa402639bc42c1) by [@rubennorte](https://github.com/rubennorte)) +- **Suspense** Fix crash in getViewState when using suspense fallbacks. ([bd133b5dd5](https://github.com/facebook/react-native/commit/bd133b5dd57b18140eae51c6d7aaab02874455c1) by [@javache](https://github.com/javache)) +- **style:** Enable mix-blend-mode on ReactRootView so blending works with app background ([24b0ded3cf](https://github.com/facebook/react-native/commit/24b0ded3cf715bb0e849d9f7ca8cd2d4d42cbf90) by [@jorge-cab](https://github.com/jorge-cab)) +- **style:** BoxShadow now supports platformColor. ([4ede9205a0](https://github.com/facebook/react-native/commit/4ede9205a0559fcaf7ac58a3d70bc902eb23fcb6) by [@javache](https://github.com/javache)) +- **style:** MixBlendMode now properly does state updates ([fae572d815](https://github.com/facebook/react-native/commit/fae572d815c7fb9684fc6c3b7f001de35ea8fb69) by [@jorge-cab](https://github.com/jorge-cab)) +- **style:** Linear gradient with platform colors ([6866968a79](https://github.com/facebook/react-native/commit/6866968a79d44518884965959760983acdadc17c) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **Text:** Ensure setSelection in onAttachedToWindow is within text range ([08759121cd](https://github.com/facebook/react-native/commit/08759121cda3785e4d7ee1f1c82011a3e3a955a9) by [@zeyap](https://github.com/zeyap)) +- **Text:** Fixed crash in legacy ReactFontManager ([3da23f7093](https://github.com/facebook/react-native/commit/3da23f7093730e10aeda6b58f4934a381e226dd2) by [@javache](https://github.com/javache)) +- **Text:** Reimplement Android lineHeight positioning/determination ([41265bac6b](https://github.com/facebook/react-native/commit/41265bac6b83ee0bb92d645ace81e314065bf5e0) by [@NickGerleman](https://github.com/NickGerleman)) +- **Text:** Text without explicit font styles was potentially cut-off. ([95a5d1c628](https://github.com/facebook/react-native/commit/95a5d1c6287c7301265207d1962ba8b50d178b20) by [@javache](https://github.com/javache)) +- **Text:** Fix mising `ANTI_ALIAS_FLAG` when resetting Text Paint ([276e3a7df7](https://github.com/facebook/react-native/commit/276e3a7df7de1b04dec0891fa7ed72917568ee7b) by [@NickGerleman](https://github.com/NickGerleman)) +- **Text:** Properly fix measurement of trailing newlines ([060c594457](https://github.com/facebook/react-native/commit/060c59445740f9b92188d2193623b36c3d859ba7) by [@NickGerleman](https://github.com/NickGerleman)) +- **Text:** Fixed text being measured incorrectly when ending with an empty line on the new architecture ([bd323929dc](https://github.com/facebook/react-native/commit/bd323929dc5be5666ee36043babec7d981a095dc) by [@j-piasecki](https://github.com/j-piasecki)) +- **Text:** Improve text line height calculation ([65d8f66b50](https://github.com/facebook/react-native/commit/65d8f66b50471d2fb4ddd5e63e17fcc808623110) by [@mellyeliu](https://github.com/mellyeliu)) +- **Text:** Fix generating empty line at the end of multiline text view when `textAlign` is set to `justify` ([08e8f6adfd](https://github.com/facebook/react-native/commit/08e8f6adfdcdfec59002f34bb7acf35bb842b331) by [@coado](https://github.com/coado)) +- **TextInput:** Fix TextInput caret moving to the beginning when attached to window ([ca0abd1b9e](https://github.com/facebook/react-native/commit/ca0abd1b9ea164a566b39cb9090eaa75647aad5a) by [@QichenZhu](https://github.com/QichenZhu)) +- **TextInput:** Fix NPE on ReactTextInputManager.setTextDecorationLine ([41c6ad5597](https://github.com/facebook/react-native/commit/41c6ad55978184cad1a32ec63c2d1f07e8282d5e) by [@cortinico](https://github.com/cortinico)) +- **VirtualizedList:** Account for items dynamically scaling with the container when using `maintainVisibleContentPosition` in virtualized lists ([6c19996e10](https://github.com/facebook/react-native/commit/6c19996e10eda97a3501f53a68da246d1f122d01) by [@fabriziocucci](https://github.com/fabriziocucci)) +- **Yoga:** Fix YogaConfig getting garbage collected #1678 ([7dcb10b6e7](https://github.com/facebook/react-native/commit/7dcb10b6e7e226034a496eaed5351601ae0a1ae2) by [@michaeltroger](https://github.com/michaeltroger)) + +#### iOS specific + +- **Accessibility:** Make sure that the Increment and Decrement accessibility actions works on iOS ([303e0ed764](https://github.com/facebook/react-native/commit/303e0ed7641409acf2d852c077f6be426afd7a0c) by [@cipolleschi](https://github.com/cipolleschi)) +- **ActionSheetIOS:** Fix ActionSheetIOS crash `attempt to insert nil object from objects` ([bebd6531b5](https://github.com/facebook/react-native/commit/bebd6531b5f4ef0300aa5a4b6f9d23e60b57a25e) by [@RodolfoGS](https://github.com/RodolfoGS)) +- **AppClips:** Fix launching App Clips with nullish URLs. ([043e2fe14a](https://github.com/facebook/react-native/commit/043e2fe14a6f13885a552211f17d61292001fa76) by [@EvanBacon](https://github.com/EvanBacon)) +- **Cocoapods:** Typo in spm.rb ([5e18f7f788](https://github.com/facebook/react-native/commit/5e18f7f788ccbea60e96b8e7deab29d423ccf1a6) by [@okwasniewski](https://github.com/okwasniewski)) +- **infra:** Fallback to old resolve mechanism when node require fails to resolve react native path ([3cbaddbc16](https://github.com/facebook/react-native/commit/3cbaddbc164b9dc326b2a7ddc0b35ce885bc7d9d) by [@okwasniewski](https://github.com/okwasniewski)) +- **infra:** Enable hermes debugger by configuration type instead of configuration name ([eda4f185b3](https://github.com/facebook/react-native/commit/eda4f185b381f7569a1029b7697f9a1c8bc6d108) by [@benhandanyan](https://github.com/benhandanyan)) +- **ObjC:** Fix numerous class interfaces having incorrect designated initializer patterns ([b98846c2e3](https://github.com/facebook/react-native/commit/b98846c2e37c3ec895536ab942978d7701f51a5e) by Nolan O'Brien) +- **PrivacyInfo:** Don't reference PrivacyInfo.xcprivacy twice for new projects ([cadd41b1a2](https://github.com/facebook/react-native/commit/cadd41b1a2e16b1c77a8d3022f4ccbdbd5ea295f) by [@okwasniewski](https://github.com/okwasniewski)) +- **ReactNativeDevTools:** "Reconnect DevTools" button not working sometimes ([8507204b53](https://github.com/facebook/react-native/commit/8507204b533cf87d1e4345a9c062cd10cf0022c1) by [@EdmondChuiHW](https://github.com/EdmondChuiHW)) +- **ReactNativeDevTools:** Fix `r` & `d` not working from Metro sometimes ([9a60038a40](https://github.com/facebook/react-native/commit/9a60038a40e16925ea1adeb3e3c937c22a615485) by [@EdmondChuiHW](https://github.com/EdmondChuiHW)) +- **ScrollView:** Fixed `onMomentumScrollBegin` event not firing on command-driven scroll events ([5b609cca09](https://github.com/facebook/react-native/commit/5b609cca099b3b0d4fc66d4cf50f69d3c5b7fc8e) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **ScrollView:** AutomaticallyAdjustKeyboardInsets not shifting scrollview content ([2d9933e616](https://github.com/facebook/react-native/commit/2d9933e616c3efe57ed0ca141277638182a69d9c) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **ScrollView:** Fixes scrollIndicatorInsets not work in old arch ([c1178ac208](https://github.com/facebook/react-native/commit/c1178ac2085e073afb07453eefc9095a1f5d530f) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **ScrollView:** fix: vertical scroll views are detected as horizontals ([ab8f3ff3e9](https://github.com/facebook/react-native/commit/ab8f3ff3e9e6445fa9961467e965792908d4c2bd) by [@coado](https://github.com/coado)) +- **style:** Fixes CornerRadiiAreEqualAndSymmetrical error when check topLeftHorizontal == topLeftVertical ([af384a914a](https://github.com/facebook/react-native/commit/af384a914a4e9ef6a5d25b00bc14b0483e5af879) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Text:** Fixes missing char mode of linebreakmode ([77889afa1c](https://github.com/facebook/react-native/commit/77889afa1c9d0bdb966102860a5d1d1d91187ae8) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Text:** Fix possible NSRangeException when updating typing attributes in response to new text content ([6e06a810f0](https://github.com/facebook/react-native/commit/6e06a810f0ab1002f1d10351bc878babde36b1f1) by [@NickGerleman](https://github.com/NickGerleman)) +- **runtime:** Fixed use of view commands from layout effects ([6f1c2a512e](https://github.com/facebook/react-native/commit/6f1c2a512e44d25edefea53e864f688018745c07) by [@sammy-SC](https://github.com/sammy-SC)) +- **runtime:** Fixed crash on promise rejection handler in iOS 18. ([26d8d490e4](https://github.com/facebook/react-native/commit/26d8d490e47bd3fa46dc4a3b8e66e9ec35c15cf7) by David Rickard) +- **runtime:** Cast the UIScene to UIWindowScene only if the scene respond to the selector ([fdee0ebbcb](https://github.com/facebook/react-native/commit/fdee0ebbcb88f40c23b92b07792fbb9d1041c546) by [@cipolleschi](https://github.com/cipolleschi)) +- **runtime:** Fixes the exported synchronous method not being called on the method queue when it's the main queue ([8bfd7e1039](https://github.com/facebook/react-native/commit/8bfd7e10393e649554c7246df430019c4f78d5e0) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **TextInput:** Fixes numeric TextInput not triggering `onSubmitEditing` ([0bcb0c2b2f](https://github.com/facebook/react-native/commit/0bcb0c2b2f460ed1a9d525d1a5b343f4b71f9347) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **TextInput:** Fixed problem with third party libraries overwriting `inputAccessoryView` ([d34032b6c0](https://github.com/facebook/react-native/commit/d34032b6c0bb3564a7b77ef270cc3289d99365f2) by [@kirillzyusko](https://github.com/kirillzyusko)) +- **TextInput:** Workaround for Mac Catalyst TextInput crash due to serialization attempt of WeakEventEmitter ([e04738b7ec](https://github.com/facebook/react-native/commit/e04738b7ecec9e7da3aab49bb24a6336b9496b94) by [@rozele](https://github.com/rozele)) +- **TextInput:** Fix `maxLength` not working in old arch ([4b3ef3b00c](https://github.com/facebook/react-native/commit/4b3ef3b00ce0026c0d1e1f2a5546fcec249255d8) by [@mateoguzmana](https://github.com/mateoguzmana)) + +## v0.76.7 + +### Changed + +#### iOS specific + +- **Deps:** Pin 'concurrent-ruby' to a working version ([198adb47af](https://github.com/facebook/react-native/commit/198adb47af3676c85b35adb308c110c1d87120c8) by [@cipolleschi](https://github.com/cipolleschi)) + +### Fixed + +- **Text** Fix `maxFontSizeMultiplier` prop on `Text` and `TextInput` components in Fabric / New Architecture ([ea49d4d1b01107a5ecbbbd4904f1d935e51d6b32](https://github.com/facebook/react-native/commit/ea49d4d1b01107a5ecbbbd4904f1d935e51d6b32) by [@RickardZrinski](https://github.com/RickardZrinski)) +- **Appearance:** Fix `Appearance.setColorScheme(null)` not resetting color scheme value ([7d63235086](https://github.com/facebook/react-native/commit/7d63235086352d8c424d634c7039551f0a5025dc) by [@sangonz193](https://github.com/sangonz193)) + +#### Android specific + +- **Deps:** Add missing `invariant` dependency ([ee8088b615](https://github.com/facebook/react-native/commit/ee8088b6157837c239db47ac5bd3a8603ceefc3c) by [@tido64](https://github.com/tido64)) +- **Turbomodule** Fix execution of early InteropEvents ([4ed2b35bf6](https://github.com/facebook/react-native/commit/4ed2b35bf61426c81c9f8b30a142d77b44988fdb) by [@mdvacca](https://github.com/mdvacca)) +- **Deps:** Bump Kotlin to 1.9.25 to mitigate #49115 ([f8857ba3b5](https://github.com/facebook/react-native/commit/f8857ba3b51f26871d0a0b82b9581a0c35b6273d) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- **runtime:** `RCTSurfaceHostingProxyRootView` no longer has different behavior (whether it calls `start` on the provided *surface*) depending on which initializer is used. Call `start` yourself on the *surface* instead. ([13b93cfdda](https://github.com/facebook/react-native/commit/13b93cfddaa559697968ac1c19e55f7aaa053070) by Nolan O'Brien) +- Be less strict with method parsing of TurboModule Interop Layer +- **Turbomodule:** Avoid crashing the app when the InteropLayer can't find some methods in the native implementation. ([3bd3f101b9](https://github.com/facebook/react-native/commit/3bd3f101b9dcff8551a2f8259ddeed9843fd69b8) by [@cipolleschi](https://github.com/cipolleschi)) +- **Runtime:** Fix applicationDidEnterBackground not being called ([adaceba546](https://github.com/facebook/react-native/commit/adaceba5462b4ad8676745f34e0be2bf5bb25166) by [@alextoudic](https://github.com/alextoudic)) + +## v0.76.6 + +### Fixed + +- **layout:** Fix TextMeasureCacheKey Throwing Out Some LayoutConstraints ([f7a5db3c06](https://github.com/facebook/react-native/commit/f7a5db3c063b952321826ea431d3d238ef0de65d) by [@NickGerleman](https://github.com/NickGerleman)) + +#### Android specific + +- **layout:** Restore layout/invalidate during ReactViewClippingManager.removeViewAt() ([0683206927](https://github.com/facebook/react-native/commit/068320692748f0c46867625786a780366fdbb1d6) by Thomas Nardone) +- **Native Modules:** Prioritise local OnLoad.cpp, falling back to default-app-setup ([8b1f049879](https://github.com/facebook/react-native/commit/8b1f04987936ab2bc7dcf62adc92bf394d35f77b) by [@timbocole](https://github.com/timbocole)) +- **runtime:** Remove feature flag for allowRecursiveCommitsWithSynchronousMountOnAndroid ([fb7f87ecb2](https://github.com/facebook/react-native/commit/fb7f87ecb27f9006e2018b9622d329feb1ba23a4) by [@cipolleschi](https://github.com/cipolleschi)) + +#### iOS specific + +- **TextInput:** Fixing TextInput `maxLength` not working in old arch ([9ecf290d27](https://github.com/facebook/react-native/commit/9ecf290d270598e45832a75f657d73cf20088a37) by [@mateoguzmana](https://github.com/mateoguzmana)) + +## v0.76.5 + +### Fixed + +- Better support filtering out non linked platforms ([fcbcf80d1c](https://github.com/facebook/react-native/commit/fcbcf80d1c080af42b5277fc8a153059194efb95) by [@cipolleschi](https://github.com/cipolleschi)) + +#### Android specific + +- Fix crash on HeadlessJsTaskService on old architecture ([4560fc0497](https://github.com/facebook/react-native/commit/4560fc049748a345d5945bc08d43f4b61ca51ff3) by [@cortinico](https://github.com/cortinico)) + +## v0.76.4 + +### Added + +- Sync debugger-frontend to latest 0.76-stable (fix Expo node_modules entry points in Sources panel) ([43fe69c315](https://github.com/facebook/react-native/commit/43fe69c315e68aab96c303c7a6c9b3821a6e25e5) by [@huntie](https://github.com/huntie)) +- Exclude unlinked libs from codegen ([3cedb09a65](https://github.com/facebook/react-native/commit/3cedb09a650adda0b3f24e931c25f27730af19b1) by [@cipolleschi](https://github.com/cipolleschi)) + +#### Android specific + +- Avoid NPE when touch event is triggered before SurfaceManager is initiated ([b8095f4692](https://github.com/facebook/react-native/commit/b8095f4692610c7f4631b851dc7d8dc9b149a277) by [@CHOIMINSEOK](https://github.com/CHOIMINSEOK)) + +## v0.76.3 + +### Fixed + +#### Android specific + +- Look for sdkmanager.bat ([6460d2b3e7](https://github.com/facebook/react-native/commit/6460d2b3e74c3a6e4075e9f12304c16427c3b1b2) by [@blakef](https://github.com/blakef)) +- CMake Windows path normalization ([9946838bedd](https://github.com/facebook/react-native/commit/9946838beddac549053a3ba3eb3b1b49c22a3fd9) by [@blakef](https://github.com/blakef)) +- Fix build failure on windows in android ([08b83005481](https://github.com/facebook/react-native/commit/08b830054812f4011becbbacdf1525701225df39) by [@FouadMagdy01](https://github.com/FouadMagdy01)) + +## v0.76.2 + +### Added + +- **TypeScript** Add CodegenTypes for TS ([20b141508b](https://github.com/facebook/react-native/commit/20b141508b30324d52080c255dd3fb318718d746) by [@cipolleschi](https://github.com/cipolleschi)) + +### Changed + +- **infra** Bump CLI to 15.0.1 ([51b98c24bd](https://github.com/facebook/react-native/commit/51b98c24bdc6369ce6fabcacaf8df2d2a706eada) by [@szymonrybczak](https://github.com/szymonrybczak)) + +#### iOS specific + +- **TextInput** Include existing attributes in newly typed text ([557e3447f5](https://github.com/facebook/react-native/commit/557e3447f520e40a1ec0ae344126b4f2836d2e83) by [@NickGerleman](https://github.com/NickGerleman)) + +### Fixed + +- **Hermes** Update Hermes to support Intl ([94d4bfd7c8](https://github.com/facebook/react-native/commit/94d4bfd7c80ba0d55adbff656441b55d59055bcc) by [@blakef](https://github.com/blakef)) +- **infra** Skip hermes-parser under Babel for non-Flow JS code ([ff1261e7dc](https://github.com/facebook/react-native/commit/ff1261e7dc0ab7e241e1f14aa0d6fd17f2ba9328) by [@huntie](https://github.com/huntie)) +- **infra** fix `semver` not being found in pnpm setups ([0def73d1a6](https://github.com/facebook/react-native/commit/0def73d1a6e398d451585032ea1213f96d84fe9c) by [@tido64](https://github.com/tido64)) +- **Error Handling** Fix `setUpErrorHandling` to show early JS errors ([dac6d508af](https://github.com/facebook/react-native/commit/dac6d508afd0f919943d8053330d6314201319c3) by [@cipolleschi](https://github.com/cipolleschi)) + +#### Android specific + +- **infra** Use absolute path when compiling appmodules.so sources ([3956955eaa](https://github.com/facebook/react-native/commit/3956955eaa3cd8c50dfe35a68a6cb8fdcac43155) by [@cortinico](https://github.com/cortinico)) +- **infra** Properly handle paths with spaces in autolinking ([1f62529dc4](https://github.com/facebook/react-native/commit/1f62529dc4583af88ef06bee04c89ce6c2ef737f) by [@cortinico](https://github.com/cortinico)) +- **Modal** Fix Regression - Modal content rendering below system bar on < API 30 when activity is edge-to-edge ([2cd48ef351](https://github.com/facebook/react-native/commit/2cd48ef351d10333a14091188bbe8e3bcd6a7a01) by [@alanleedev](https://github.com/alanleedev)) +- **runtime** Fix timers in headless tasks on bridgeless mode ([ee7b4e2763](https://github.com/facebook/react-native/commit/ee7b4e276355146be53958b402bfb2d5af2dd1bc) by [@j-piasecki](https://github.com/j-piasecki)) + +#### iOS specific + +- **Codegen** Properly stop generating component registration for components defined in app. ([97a4234b6e](https://github.com/facebook/react-native/commit/97a4234b6e51b3c35c82095029ef00270ad02e29) by [@cipolleschi](https://github.com/cipolleschi)) +- **infra** Give apps access to Yoga headers ([e851e73c18](https://github.com/facebook/react-native/commit/e851e73c1806a7b7b898a67716be87f42ced491a) by [@cipolleschi](https://github.com/cipolleschi)) +- **TextInput** Fix missing emitter attributes on iOS TextInput when controlled component value specified using `value` instead of `children` ([52cdedb40e](https://github.com/facebook/react-native/commit/52cdedb40e242c9ed280b821f8493a3872ef2b54) by [@NickGerleman](https://github.com/NickGerleman)) +- **TextInput** Fix cursor moving in iOS controlled single line TextInput on Autocorrection (New Arch) ([36fd5533f6](https://github.com/facebook/react-native/commit/36fd5533f68b0f907a949db87884b58820015ba8) by [@NickGerleman](https://github.com/NickGerleman)) + +## v0.76.1 + +### Fixed + +#### Android specific + +- **runtime** Made AppRegistry callable from Native code in Bridgeless (fixes headless tasks) ([f3fee67c54](https://github.com/facebook/react-native/commit/f3fee67c547ace5e08bc9e119bcb80e0f3454d30) by [@robik](https://github.com/robik)) +- **runtime** Add jsBundleFile to DefaultReactNativeHost.kt ([e56bd89ef](https://github.com/facebook/react-native/commit/e56bd89eff72f1d38d2940b9dbd8f7b97037dc22)) + +#### iOS specific + +- **codegen** Do not generate the ComponentCls function in the RCTThirdPartyFabricComponentsProvider for components deined in the app. ([dc7e9e2d83](https://github.com/facebook/react-native/commit/dc7e9e2d83f5af3d2a970521af4fcc7f86d2168d) by [@cipolleschi](https://github.com/cipolleschi)) +- **infra** Generated NODE_BINARY in .xcode.env.local now supports paths with a space ([eeaa3ff458](https://github.com/facebook/react-native/commit/eeaa3ff458a3e5c902075bb45161d6ccde31fe53) by [@blakef](https://github.com/blakef)) +- **infra** Pin Xcodeproj to < 1.26.0 ([e8776240b41](https://github.com/facebook/react-native/commit/e8776240b41a3147e95713299b69c813be60b8e8)) +- **runtime** Fixed bug where background colors would sometimes animate when changing on Views ([1d6ac09530](https://github.com/facebook/react-native/commit/1d6ac09530145e6d2bf1e4dd9d40f51542d9e7f6) by [@joevilches](https://github.com/joevilches)) +- **runtime** Fixes regression of RCTWindowFrameDidChangeNotification not fired ([e271b23fad](https://github.com/facebook/react-native/commit/e271b23fad89e1e7da2e91a8f1e5cbb295406c74) by [@zhongwuzw](https://github.com/zhongwuzw)) + +## v0.76.0 + +### Breaking + +- **Animation** Stop sending state updates to React in looping animation ([8af5e893c8](https://github.com/facebook/react-native/commit/8af5e893c89b24dca972afe36ef442fd509d5804) by [@dmytrorykun](https://github.com/dmytrorykun)) +- **devtools:** Remove Inspector Panel perf + network tabs under New Arch (see https://github.com/react-native-community/discussions-and-proposals/pull/777) ([f220bde4d7](https://github.com/facebook/react-native/commit/f220bde4d7d556b3be83cccff0eec5da22921aba) by [@huntie](https://github.com/huntie)) +- **flow:** Eliminate a few React.Element type that will be synced to react-native ([39c338ff8d](https://github.com/facebook/react-native/commit/39c338ff8d3a65ec3f7a45f0b8319f70115e2fc1) by [@SamChou19815](https://github.com/SamChou19815)) +- **infra** Projects that intend to use the community CLI will now have to declare that dependency instead of transitively having the react-native package include it. ([bd3a3e3de0](https://github.com/facebook/react-native/commit/bd3a3e3de08e334db6f1f248241df8ea4680724c) by [@blakef](https://github.com/blakef)) +- **infra** Remove react-native-community dependencies from react-native ([9269429bb9](https://github.com/facebook/react-native/commit/9269429bb955d47088793a2e32454fddb712152b) by [@blakef](https://github.com/blakef)) +- **infra:** TurboModules will be looked up as TurboModules first, and fallback to legacy modules after. ([5a62606ab3](https://github.com/facebook/react-native/commit/5a62606ab36edaffb0a5c760d2b0ed0c8e3808a8) by [@javache](https://github.com/javache)) +- **text engine** Always use AttributedStringBox instead of AttributedString in TextLayoutManager ([ee597bfe2bf](https://github.com/facebook/react-native/commit/ee597bfe2bf7f11ac60dab87f47dbcb6e840749c)) by [@NickGerleman](https://github.com/NickGerleman)) + + +#### Android specific + +- **bridging:** Deleted LongArray ([471445eb17](https://github.com/facebook/react-native/commit/471445eb1770dcb773eb463af99c9556cb070abc) by Thomas Nardone) +- **Flipper:** Update ReactNativeFlipper deprecation to ERROR ([531657b394](https://github.com/facebook/react-native/commit/531657b394aa0fac70f26d9facdb32d23a1b05d6) by [@cortinico](https://github.com/cortinico)) +- **infra** Remove several libs from default App CMake setup ([52de8c70f2](https://github.com/facebook/react-native/commit/52de8c70f2d8826789e4118b0c81aa4397e833fc) by [@cortinico](https://github.com/cortinico)) +- **infra:** Merge all the remaining .so libraries into libreactnative.so ([db80d78d7a](https://github.com/facebook/react-native/commit/db80d78d7a3d61d5bd6871258513f778851059f5) by [@cortinico](https://github.com/cortinico)) +- **infra:** Remove several unnecessary android prefab targets. Use ReactAndroid::reactnative instead ([6e5227bd83](https://github.com/facebook/react-native/commit/6e5227bd8357dcbe12038b21066cf414e3f97e03) by [@cortinico](https://github.com/cortinico)) +- **infra:** Do not depend on OSS SoLoader anymore and do not expose Fresco `api` dependency. ([6dc01dad09](https://github.com/facebook/react-native/commit/6dc01dad09c6ee2ac6793db1b11cb98faada9c3b) by [@cortinico](https://github.com/cortinico)) +- **infra:** Updating `minSdkVersion` to API 24 (Android 7) ([270951a212](https://github.com/facebook/react-native/commit/270951a2123b5c51567b72a8f1a8a1608cba43d7) by [@alanleedev](https://github.com/alanleedev)) +- **initialization:** `ReactNativeHost` invalidates the instance manager on `clear()`, rather than merely destroying the instance. ([986cf18dd2](https://github.com/facebook/react-native/commit/986cf18dd2f0d6ea491d521549c0bf9a323e189b) by [@motiz88](https://github.com/motiz88)) +- **layout engine:** Do not implicitly convert parsed LengthPercentage to pixels ([9e48976bc2](https://github.com/facebook/react-native/commit/9e48976bc2864c6ef6995179a7dc8d1c453dcf39) by [@NickGerleman](https://github.com/NickGerleman)) +- **rendering:** Set "enableBackgroundStyleApplicator" by default ([5f14963da0](https://github.com/facebook/react-native/commit/5f14963da081deeac2fb540d58c8667c2d2c5d08) by [@NickGerleman](https://github.com/NickGerleman)) + +#### iOS specific + +- **initialization:** Add ability to control bundle loading on the new architecture similar to `loadSourceForBridge`. Removed some properties from the `RCTRootViewFactory`. ([7487a2c277](https://github.com/facebook/react-native/commit/7487a2c27713a0129ef2db70efc2fa543a8c185e) by [@alanjhughes](https://github.com/alanjhughes)) +- **turbomodule** [iOS] Remove Macro for autolinking pure Cxx module([184646e491](https://github.com/facebook/react-native/commit/184646e49169110842bafa6c02e52f6eec1e0ffa) by [@philIip](https://github.com/philIip)) + + +### Added + +- **style** Add official `filter` CSSProperty. ([6b369a40d9](https://github.com/facebook/react-native/commit/6b369a40d98c2bb7f933415f62b1e2b8f4da86ed) by [@jorge-cab](https://github.com/jorge-cab)) +- **style** Add official `boxShadow` CSSProperty. ([2241c3146f](https://github.com/facebook/react-native/commit/2241c3146ffbfb8b77f54599b7cebb717537c15a) by [@jorge-cab](https://github.com/jorge-cab)) +- **codegen:** Add EventEmitter Code-gen support for Java and ObjC Turbo Modules ([ad3df84668](https://github.com/facebook/react-native/commit/ad3df84668f1624e830396364c331783c6f99948) by [@christophpurrer](https://github.com/christophpurrer)) +- **devtools:** support for rendering Error object previews in Chrome DevTools console ([cae9ae5b48](https://github.com/facebook/react-native/commit/cae9ae5b486d04b889af9d1685bcbbb33557c791) by [@EdmondChuiHW](https://github.com/EdmondChuiHW)) +- **devtools:** support for rendering Error objects in Chrome DevTools console ([1740a56a46](https://github.com/facebook/react-native/commit/1740a56a46ef4a364c88cebe373b4b3a5679248a) by [@EdmondChuiHW](https://github.com/EdmondChuiHW)) +- **devtools** Add upper case keys to the debug key handler ([6390cf67d0](https://github.com/facebook/react-native/commit/6390cf67d065727c810fcf4ef32b0cac7efac8e2) by [@wh201906](https://github.com/wh201906)) +- **devtools:** Debugger: Support text responses to CDP `IO.read` requests ([c085180264](https://github.com/facebook/react-native/commit/c085180264ea68f71b050cbb6b9a8274e36c3fbf) by [@robhogan](https://github.com/robhogan)) +- **devtools:** Debugging: implement common C++ layer of CDP `Network.loadNetworkResource` ([193cdc36f7](https://github.com/facebook/react-native/commit/193cdc36f7de5524b509e38da8feb209d214634c) by [@robhogan](https://github.com/robhogan)) +- **devtools:**: Inspector: Support `/open-debugger` specifying `target` param ([88ba9a6042](https://github.com/facebook/react-native/commit/88ba9a60428697f5957f269e85fbef3d0afc5046) by [@robhogan](https://github.com/robhogan)) +- **infra:** Use PackagerAsset resolver instead of Platform.OS when its provided. ([baa366654e](https://github.com/facebook/react-native/commit/baa366654e9ee98e0400b493e7fc9578851d60d1) by [@andrewdacenko](https://github.com/andrewdacenko)) +- **infra:** Add optional `PackagerAsset.resolver` prop so AssetSourceResolver can use it instead of `Platform.OS` to identify where asset is stored on device. ([3f3a85b3c5](https://github.com/facebook/react-native/commit/3f3a85b3c5be3f9fdbd63a3acfe8456b6adeb100) by [@andrewdacenko](https://github.com/andrewdacenko)) +- **initialization** Add experimental api to JSRuntimeFactory to initialize runtime on js thread ([c9fbc05bbc](https://github.com/facebook/react-native/commit/c9fbc05bbca803032914be4b38ac4c9608852963) by Benoit Girard) +- **metro:** Expose `MetroConfig` type directly from `react-native/metro-config`. ([cc6d1eb844](https://github.com/facebook/react-native/commit/cc6d1eb8449c25fe3c76aaf4da5cd38b3ac0783d) by [@tjzel](https://github.com/tjzel)) +- **rsc** Added support for importing `react-native` in a `react-server` environment for React Server Components support. ([8989c9b71d](https://github.com/facebook/react-native/commit/8989c9b71dcca3f39b37a32945364025732eb2c3) by [@EvanBacon](https://github.com/EvanBacon)) +- **style:** Add support for `texAlignment: 'start'` ([a2cb34371e](https://github.com/facebook/react-native/commit/a2cb34371e6e52305ee58f23d3b2fefc1e8c7157) by [@javache](https://github.com/javache)) +- **style:** Unhide new arch layout props ([2d6c59e1d4](https://github.com/facebook/react-native/commit/2d6c59e1d4f6ddb46373ed10c915aed4ce0c030c) by [@NickGerleman](https://github.com/NickGerleman)) + +#### Android specific + +- **devtools:** Enable React Native DevTools in OSS debug builds ([143f1ad298](https://github.com/facebook/react-native/commit/143f1ad29874c1e8e9561abae263cb08f4859407) by [@robhogan](https://github.com/robhogan)) +- **codegen** Add support for handling `com.facebook.react.bridge.Dynamic` as parameter type in TurboModules ([d01f1b3214](https://github.com/facebook/react-native/commit/d01f1b3214b435d436fd6cf145d8e450a188301c) by [@cortinico](https://github.com/cortinico)) +- **error handling:** Provide default implementation for ReactHostDelegate.handleInstanceException() ([34e3a6cc88](https://github.com/facebook/react-native/commit/34e3a6cc885a68148b1d2209adc70c8109a56a66) by [@alanleedev](https://github.com/alanleedev)) +- **Image** Added support for rendering XML assets provided to `Image` ([aad9240fd4](https://github.com/facebook/react-native/commit/aad9240fd435d549812b5075767c5ea39a8fbb4f) by Peter Abbondanzo) +- **Runtime** Allow DefaultReactHost to load the js bundle via regular file urls ([7522336412](https://github.com/facebook/react-native/commit/752233641210a0b2e6bc1438f82d0aa193c2ef0d) by [@RSNara](https://github.com/RSNara)) +- **runtime** Make ReactInstanceEventListener available on ReactHost ([80e1dd70b0](https://github.com/facebook/react-native/commit/80e1dd70b0b27195b9b71ea531728eef9799caa9) by [@RSNara](https://github.com/RSNara)) +- **runtime** Add `invalidate()` method to ReactHost and ReactInstanceManager that destroys the `ReactHost`, including the `ReactInstance`. ([a3db352e25](https://github.com/facebook/react-native/commit/a3db352e25c01614ade3e42637e3d5726e582308) by [@motiz88](https://github.com/motiz88)) +- **runtime:** Added `onUserLeaveHint` support into `ReactActivityDelegate` ([27ba369f23](https://github.com/facebook/react-native/commit/27ba369f2325db5678aaf6a18927c127921840e0) by [@behenate](https://github.com/behenate)) +- **runtime:** Added a conditional check in the `resolveThemeAttribute` function to reattempt resource resolution with the "android" package name if the resource ID is 0. ([6365df54db](https://github.com/facebook/react-native/commit/6365df54dbd0a7e185cfe113a9cf0026b2bb12ef) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **style** Add BackgroundStyleApplicator for managing view backgrounds ([1a78477ce5](https://github.com/facebook/react-native/commit/1a78477ce528b36a97602d0210bd4ea8446804dc) by [@NickGerleman](https://github.com/NickGerleman)) +- **style:** Linear gradient ([bd0aedc8c3](https://github.com/facebook/react-native/commit/bd0aedc8c3dbebf96e123fd1bd33f515d09e2579) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **style:** Support simple opacity in nested text ([a2d53d5ea0](https://github.com/facebook/react-native/commit/a2d53d5ea08959da0bbce3c494e06634e3d52d2a) by [@NickGerleman](https://github.com/NickGerleman)) + +#### iOS specific + +- **accessibility:** Support LargeContentViewer on iOS for better accessibility ([6cc44d765a](https://github.com/facebook/react-native/commit/6cc44d765a1127aa4998a490e3ff90b741ef9441) by [@bacarybruno](https://github.com/bacarybruno)) +- **Animated:** Declare the `onUserDrivenAnimationEnded` in the old Architecture ([f8c13f601d](https://github.com/facebook/react-native/commit/f8c13f601d5f7f159dd7a0e42b9fcc877d48d69b) by [@cipolleschi](https://github.com/cipolleschi)) +- **Animated:** Retrieve the tags of the nodes connected by the animation and send them to JS ([fd748ae84c](https://github.com/facebook/react-native/commit/fd748ae84cf18c1c204a936af45bb4883d476cd7) by [@cipolleschi](https://github.com/cipolleschi)) +- **brownfield:** Improve RCTAppDelegate usage for brownfield, add `automaticallyLoadReactNativeWindow` flag ([391680fe84](https://github.com/facebook/react-native/commit/391680fe844aad887e497912378c699aed13464b) by [@okwasniewski](https://github.com/okwasniewski)) +- **codegen** Code-generate an optional base class to use for every NativeModule ([ed5f558a6c](https://github.com/facebook/react-native/commit/ed5f558a6cb5ff597870e7013150113b9460c0dc) by [@christophpurrer](https://github.com/christophpurrer)) +- **devtools** Debugger: Implement CDP methods for loading network resources through the debug target. ([c720583f6c](https://github.com/facebook/react-native/commit/c720583f6c071959e7898befb62cd36f84c581dc) by [@robhogan](https://github.com/robhogan)) +- **infra** Enable third-party podspec sources to be fetched from mirrored git repositories ([53969cb8d0](https://github.com/facebook/react-native/commit/53969cb8d0460ccb2e899ec290135f447ed5dc65) by [@RailByteOEBB](https://github.com/RailByteOEBB)) +- **runtime** Added RCTUIInterfaceOrientation helper method ([cf015f93ef](https://github.com/facebook/react-native/commit/cf015f93efa888be61150915b18ae8cd12d11232) by [@Biki-das](https://github.com/Biki-das)) +- **ScrollView** Send onScrollEnded event to NativeTurboAnimatedModule ([7af743236f](https://github.com/facebook/react-native/commit/7af743236f25ee03b674baf46f6506dbbc2e4fc0) by [@cipolleschi](https://github.com/cipolleschi)) +- **ScrollView:** Fire onMomentumScrollEnd when UIScrollView is removed from window ([b98b9f1fa7](https://github.com/facebook/react-native/commit/b98b9f1fa7717283f368eb182a51d971b8776c80) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **style** Linear gradient ([b99675d78a](https://github.com/facebook/react-native/commit/b99675d78a8269403b68d7eae8dc67ec85aea3e6) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **TextInput** Add line break mode for TextInput components. ([fe941a8f4c](https://github.com/facebook/react-native/commit/fe941a8f4c92fa9b1f07d2dd94050c81d63c77e8) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **TextInput** Line break mode for TextInput components. ([6cab6c2a13](https://github.com/facebook/react-native/commit/6cab6c2a13b89cbee1a2c1957ea561f82cb6700a) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **TextInput** Add support for missing text content types ([d7a3e48032](https://github.com/facebook/react-native/commit/d7a3e48032fe76d118c2b5c14032d7a73319adf8) by [@krozniata](https://github.com/krozniata)) +- **TextInput** Added handling of `showSoftInputOnFocus` props for new arch. ([ead50d6b11](https://github.com/facebook/react-native/commit/ead50d6b1180dbe9f8b49d646cc34f83aae41c74) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) + +### Changed + + +- **Animated:** Improved runtime performance of `Animated` ([d1ebe02c19](https://github.com/facebook/react-native/commit/d1ebe02c19a4ae78f54e2647d5b18e6bf93079c1) by [@yungsters](https://github.com/yungsters)) +- **Animated:** Changed `Animated` props validation to soft errors instead of thrown errors ([0a1ba02273](https://github.com/facebook/react-native/commit/0a1ba02273693ffd605ca2aebce90746c1745a9c) by [@yungsters](https://github.com/yungsters)) +- **Appearance:** Improved `Appearance.getColorScheme` performance ([8f0f50f7a1](https://github.com/facebook/react-native/commit/8f0f50f7a1729019b1b0957076edfee58a146c56) by [@yungsters](https://github.com/yungsters)) +- **c++:** Removed using namespace std::placeholders ([194b642633](https://github.com/facebook/react-native/commit/194b642633d944b9e73e55b947284eabd42d55a2) by [@r-barnes](https://github.com/r-barnes)) +- **devtools:** Remove `--experimental-debugger` option from start command ([94e7a87f23](https://github.com/facebook/react-native/commit/94e7a87f2344c2024817ea7e928ab81e7f57aa76) by [@huntie](https://github.com/huntie)) +- **devtools:** Inspector: Enforce device and appId filters if both are given to /open-debugger ([c7970379a1](https://github.com/facebook/react-native/commit/c7970379a1e9be87be22ddcdec38752257059450) by [@robhogan](https://github.com/robhogan)) +- **devtools:** Debugger: `j` opens most recent (not first) target. ([2a6a895b17](https://github.com/facebook/react-native/commit/2a6a895b17fdd4112349853e08a50c4c90886cb8) by [@robhogan](https://github.com/robhogan)) +- **devtools:** Debugger: Make `/json/list` return connection-addition-ordered targets. ([53951d7fec](https://github.com/facebook/react-native/commit/53951d7fec2997487d1ee948304ab904c21338aa) by @robhogan) +- **devtools** Add Fusebox support for saving traces to disk ([1bd4a11736](https://github.com/facebook/react-native/commit/1bd4a11736c2916c9114df55395d474a801ee63b) by Benoit Girard) +- **devtools:** Simplify key handling in start command ([5a0df6d0bf](https://github.com/facebook/react-native/commit/5a0df6d0bf5e84d3f7d2a6f000e617e00b8bef02) by [@huntie](https://github.com/huntie)) +- **error handling:** Improved error message for invalid filter values ([4094ce0718](https://github.com/facebook/react-native/commit/4094ce0718c54a2c9a326cc2962ea00e30b7bdf6) by [@yungsters](https://github.com/yungsters)) +- **error handling:** Improve LogBox safe area insets styling ([18302831c4](https://github.com/facebook/react-native/commit/18302831c49299d326935f875655c439cc4fbe0d) by [@yungsters](https://github.com/yungsters)) +- **infra:** Update all babel packages and fix tests accordingly ([b37101486b](https://github.com/facebook/react-native/commit/b37101486bd4dc26f6ec4e646e12d1484ec9479f) by [@vzaidman](https://github.com/vzaidman)) +- **infra:** Upgrade pretty-format to 29.7.0 ([7bc9244d0c](https://github.com/facebook/react-native/commit/7bc9244d0cbebc310116b6b2a2baf0781073d0f5) by [@dprevost-LMI](https://github.com/dprevost-LMI)) +- **infra:** Move init deprecation notice 30 Sept → 31 Dec, to give users more time to update their infrastructure ([014370d825](https://github.com/facebook/react-native/commit/014370d825b273bc96464e84ba2d57ae5cf37eda) by [@blakef](https://github.com/blakef)) +- **infra:** Drop `node-fetch` in favor of Node's built-in fetch from `undici` in `react-native/dev-middleware` ([30a3e6e8df](https://github.com/facebook/react-native/commit/30a3e6e8dfcfc9597873578b8332ec027ccf1b84) by [@byCedric](https://github.com/byCedric)) +- **infra:** Allow use without @react-native-community/cli-server-api ([24997dc5ae](https://github.com/facebook/react-native/commit/24997dc5ae4ed85d3965cbc6796423f5012e4eb1) by @blakef) +- **infra:** Add CLI selection of multiple debug targets ([6a24df7eaa](https://github.com/facebook/react-native/commit/6a24df7eaab2420e91b9a4fc9202c175c0802441) by [@huntie](https://github.com/huntie)) +- **infra** Update Metro to "^0.81.0" ([3f8d1fa286](https://github.com/facebook/react-native/commit/3f8d1fa2862814cc8e2b091786e80231670bb876) by [@robhogan](https://github.com/robhogan)) +- **initialization:** Improve `Appearance` performance overhead by lazily initializing the NativeModule ([b86e8ef95f](https://github.com/facebook/react-native/commit/b86e8ef95fc6d7e35b2e20529a52bb74780dcf1a) by [@yungsters](https://github.com/yungsters)) +- **metro:** Changed Metro default config to use Hermes parser, enabling the use of advanced Flow syntax in React Native. ([320963c7cb](https://github.com/facebook/react-native/commit/320963c7cb394ccd8768003ad40c9767fdb7f4e3) by [@yungsters](https://github.com/yungsters)) +- **metro:** Use Metro terminal reporter for dev-middleware logs ([2f04dfe795](https://github.com/facebook/react-native/commit/2f04dfe7951e5f4c63f94c74d7ad10cd53969da0) by [@huntie](https://github.com/huntie)) +- **metro:** Fix server.end() usage following Metro bump ([02b879b1e2](https://github.com/facebook/react-native/commit/02b879b1e22dd03f52ff77d82cac3fe167aaea84) by [@huntie](https://github.com/huntie)) +- **runtime:** Timer functions `timeout` argument is now coerced to a number ([af04eb773c](https://github.com/facebook/react-native/commit/af04eb773cf7531323c6a34a276098e84c6041a9) by [@robik](https://github.com/robik)) +- **turbomodules:** Replace TurboReactPackage with BaseReactPackage ([e881a1184c](https://github.com/facebook/react-native/commit/e881a1184cadd45321b781d07c6154a14332c5f6) by [@philIip](https://github.com/philIip)) +- **yoga** Replace YogaConstants.UNDEFINED with Float.NaN ([8bd9952eaf](https://github.com/facebook/react-native/commit/8bd9952eaf28fe8feca7490293656caeefe7897e) by Jingbo Yang) + + +#### Android specific + +- **DevTools** Make PackagerConnectionSettings class open again ([4dd47eeb9e](https://github.com/facebook/react-native/commit/4dd47eeb9ea91455efcd0db23a02162ab338a53f) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- **infra:** Update compileSdk to 35 ([1333e0ee6a](https://github.com/facebook/react-native/commit/1333e0ee6ac78ad856b7f86234ec2606fcc48a7e) by [@alanleedev](https://github.com/alanleedev)) +- **infra:** Expose jsc tooling via prefab ([e91690d929](https://github.com/facebook/react-native/commit/e91690d929d7c8b251964cae282ad8e1d95aa39a) by [@tomekzaw](https://github.com/tomekzaw)) +- **infra:**Expose hermes tooling via prefab ([f41af55958](https://github.com/facebook/react-native/commit/f41af55958dfbc39c536d433c3a27db329dd05f1) by [@cortinico](https://github.com/cortinico)) +- **infra:** Bump AGP to 8.6.0 ([aca31eb610](https://github.com/facebook/react-native/commit/aca31eb610c2c4d433311b1cdaf20af94fd54622) by [@cortinico](https://github.com/cortinico)) +- **infra:** Gradle to 8.10.2 ([60a2706e97](https://github.com/facebook/react-native/commit/60a2706e9716d955fc0d7e15b02ad0d6efe58fc2) by [@cortinico](https://github.com/cortinico)) +- **LogBox:** Modify LogBox to be usable on Android 15 ([5fe7660439](https://github.com/facebook/react-native/commit/5fe76604393a7e931559a3ef82564619885dbe43) by [@alanleedev](https://github.com/alanleedev)) +- **Modal** Fix crash for Modal not attached to window manager ([73ce1984e8](https://github.com/facebook/react-native/commit/73ce1984e8411a6b4aec440a5e7aa9d2b7474984) by [@alanleedev](https://github.com/alanleedev)) +- **style:** Move `experimental_boxShadow` and `experimental_backgroundImage` to BaseViewConfig ([03801f275e](https://github.com/facebook/react-native/commit/03801f275e81c27a09f717bf48322f9ab1a54fc1) by [@NickGerleman](https://github.com/NickGerleman)) +- **style:** Revamp InsetBoxShadowDrawable ([d9f684b1cf](https://github.com/facebook/react-native/commit/d9f684b1cf7fb6824e25e1e948bfb30dec450464) by [@NickGerleman](https://github.com/NickGerleman)) +- **style:** Support OutsetBoxShadowDrawable on Android 9+ ([f905f90468](https://github.com/facebook/react-native/commit/f905f904685cc67a948349e0d58dce8b7f524069) by [@NickGerleman](https://github.com/NickGerleman)) +- **infra:** Merge libuimanagerjni.so inside libreactnative.so ([7916f7e120](https://github.com/facebook/react-native/commit/7916f7e12014c42b2bc9bfcfe053e37358fc39a4) by [@cortinico](https://github.com/cortinico)) +- **infra:** Move libyoga.so and libturbomodulejsijni.so inside libreactnative.so ([80c3aea48d](https://github.com/facebook/react-native/commit/80c3aea48d584b49fab8df3a417558cf5c5c3b12) by [@cortinico](https://github.com/cortinico)) +- **infra:** Move more libraries to so-merging: rninstance, react_featureflagsjni, hermesinstancejni, fabricjni ([e864910a4d](https://github.com/facebook/react-native/commit/e864910a4d805a23244365b96e1f5e207a45a4a9) by [@cortinico](https://github.com/cortinico)) +- **infra:** Move libmapbufferjni.so inside libreactnative.so ([5b761ff15c](https://github.com/facebook/react-native/commit/5b761ff15cdb2501862f07650912cbd26eaafdef) by [@cortinico](https://github.com/cortinico)) +- **infra:** Move libreact_newarchdefaults.so inside libreactnative.so ([0caf3e824d](https://github.com/facebook/react-native/commit/0caf3e824d81689034ddf96d86d2362c9911d389) by [@cortinico](https://github.com/cortinico)) +- **runtime:** Make `setPointerEvents` public ([010e0010a3](https://github.com/facebook/react-native/commit/010e0010a38e111df110584ebacaabe210c3f137) by [@jakex7](https://github.com/jakex7)) +- **runtime:** Avoid image off-screen render ([620b1221fa](https://github.com/facebook/react-native/commit/620b1221fa7d4e0e8e070031f65fdf786e3342d0) by [@NickGerleman](https://github.com/NickGerleman)) +- **kotlin:** Migrated ReactSwitch to Kotlin ([03c0e5e2af](https://github.com/facebook/react-native/commit/03c0e5e2af288e96f39fa044cbbe8ebef91bdb1e) by [@blakef](https://github.com/blakef)) +- **kotlin** Migrated AdditionalAnimatedNode.java to Kotlin ([8689aa48bb](https://github.com/facebook/react-native/commit/8689aa48bb5fac6b96144c08d49b15359ef141a1) by [@blakef](https://github.com/blakef)) +- **turbomodule:** Modules marked with needsEagerInit = true will now be +created on the mqt_native thread. ([c4a6bbc8fd](https://github.com/facebook/react-native/commit/c4a6bbc8fd8992059abdcfae2bc483bd29f31e79) by [@javache](https://github.com/javache)) +- **error handling** Log a SoftException on SurfaceMountingManager.addRootView ([3429dc1ccf](https://github.com/facebook/react-native/commit/3429dc1ccf32b6b23f4f0ad3cfdf0d5697af665f) by [@psionic12](https://github.com/psionic12)) +- **layout:** Extracted common parts related to calculating text layout to a helper ([2eaf0b0848](https://github.com/facebook/react-native/commit/2eaf0b0848d660eb19fde2921570f9e8bd2bd1de) by @j-piasecki) +- **kotlin:** Migrate StyleAnimatedNode.java to Kotlin ([ef9149b4fc](https://github.com/facebook/react-native/commit/ef9149b4fc989827ad4b781fa89f556a1fd20db4) by [@rshest](https://github.com/rshest)) + +#### iOS specific + +- **infra** Don't include C++ bridging header in RCTTurboModule.h ([3fc7ebb311](https://github.com/facebook/react-native/commit/3fc7ebb311e86cf2e3e78efacb1860deadd54216) by [@christophpurrer](https://github.com/christophpurrer)) +- **infra** Bump iOS min version for CI ([b93c2b2412](https://github.com/facebook/react-native/commit/b93c2b241247d0a7d9b79eda76af0a7bca0ac745) by [@realsoelynn](https://github.com/realsoelynn)) +- **infra** Update RNTester and HelloWorld template app to `min iOS 15.1` ([e1a1cdacf2](https://github.com/facebook/react-native/commit/e1a1cdacf2d210353c06e7ab65f971f6592e8c00) by [@realsoelynn](https://github.com/realsoelynn)) +- **infra** Enforce we use the correct C++ version for all, even if dependency tries to set it ([d7a8aae9ac](https://github.com/facebook/react-native/commit/d7a8aae9acc441d9b6c52484e35ba158e90b4b60) by [@Titozzz](https://github.com/Titozzz)) +- **renderer** Changed border display ([94407f56d1](https://github.com/facebook/react-native/commit/94407f56d133b2ba46dc5b31679e9500470e1770) by [@coado](https://github.com/coado)) +- **runtime** Refactor supportedInterfaceOrientations method to use RCTKeyWindow() ([815c415fb9](https://github.com/facebook/react-native/commit/815c415fb90944db89552a503eb53059e9f0d20b) by [@okwasniewski](https://github.com/okwasniewski)) + +### Deprecated + + +#### Android specific + +- **bridging:** Deprecate MapBuilder ([a696d2ed6b](https://github.com/facebook/react-native/commit/a696d2ed6b95c07229bc0fd00aca344951689bbd) by Thomas Nardone) + +#### iOS specific + +- **initialization:** Deprecate turboModuleEnabled, fabricEnabled and bridgelessEnabled for the new newArchEnabled property. ([3621606c44](https://github.com/facebook/react-native/commit/3621606c4486051de8b443c443cd87f6b822d1a0) by [@okwasniewski](https://github.com/okwasniewski)) +- **runtime** Deprecated StatusBar.setNetworkActivityIndicatorVisible ([8a390ba9b8](https://github.com/facebook/react-native/commit/8a390ba9b8c1b8889dd0933fe1477083a24ff71d) by Ingrid Wang) + +### Removed + +- **devtools** Remove sampling profiler from dev menu ([f57740c0fb](https://github.com/facebook/react-native/commit/f57740c0fbd431991bf90f83dac5770fa74d13cf) by [@blakef](https://github.com/blakef)) + +#### Android specific + +- **components** CoreComponentsRegistry is now fully replaced by DefaultComponentRegistry. ([de7976c69d](https://github.com/facebook/react-native/commit/de7976c69d9f837729e8822f2b89e6d08ea6883a) by [@javache](https://github.com/javache)) +- **error handling** Removed HasJavascriptExceptionMetadata as a marker interface. Use JavascriptExecption directly ([cb00ca954d](https://github.com/facebook/react-native/commit/cb00ca954d1a7647900c8ff6b5792eb342735140) by [@javache](https://github.com/javache)) +- **initialization** Unused jsEngineResolutionAlgorithm from ReactHost ([f1b6218608](https://github.com/facebook/react-native/commit/f1b6218608ea968f032f8344d4648651617482cf) by [@javache](https://github.com/javache)) +- **infra** React_newarchdefaults is no longer a prefab, instead use fabricjni ([c68f35d444](https://github.com/facebook/react-native/commit/c68f35d4441c8a03541da17e3adc03f355e8c45e) by [@javache](https://github.com/javache)) + +#### iOS specific + +- **runtime:** Remove `[RCTConvert UIBarStyle:]` ([a557a81f96](https://github.com/facebook/react-native/commit/a557a81f963041351e02f3b79489c6ee394ebe48) by [@Saadnajmi](https://github.com/Saadnajmi)) + +### Fixed + +- **Animated:** Fixed undefined behavior in certain scenarios when `ReactElement` objects are supplied to Animated components ([56937d646c](https://github.com/facebook/react-native/commit/56937d646c741b32826a92a76193eadc8dc59031) by [@yungsters](https://github.com/yungsters)) +- **Animated:** Realign the shadow tree and the native tree when the user finishes interacting with the app. ([a8786fc1df](https://github.com/facebook/react-native/commit/a8786fc1df60426000013bdcfb3a61bd201b6dac) by [@cipolleschi](https://github.com/cipolleschi)) +- **codegen:** Fix codegen failing in a pnpm monorepo because of missing `yargs` ([3e084bc159](https://github.com/facebook/react-native/commit/3e084bc15994cf5b549d1104e906e5dbb2df4417) by [@tido64](https://github.com/tido64)) +- **c++:** Upstream fixes for build errors in React Native Windows ([c722ec7c37](https://github.com/facebook/react-native/commit/c722ec7c372c44ade8439f4765b1b6470c27f470) by [@chiaramooney](https://github.com/chiaramooney)) +- **c++:** Undefined behavior fix in MethodInvoker ([09e88448ce](https://github.com/facebook/react-native/commit/09e88448ce3a3047112b6f71218305d5bfe2e8bc) by Riley Berton) +- **c++:** Fix "C4715 not all control paths return a value" warning in MSVC when building ReactCommon ([c30e35fb44](https://github.com/facebook/react-native/commit/c30e35fb44affb179c9a208cf0a3e4575347e76f) by [@jonthysell](https://github.com/jonthysell)) +- **c++:** Updated comments for `~ShadowNodeWrapper()` and `~ShadowNodeListWrapper()` ([778fcecf35](https://github.com/facebook/react-native/commit/778fcecf357b92f8dd5bab07914aa8563796d0f7) by [@tomekzaw](https://github.com/tomekzaw)) +- **c++:** Change RawPropsParser logs from ERROR level to WARNING ([68c0720e34](https://github.com/facebook/react-native/commit/68c0720e3438f9230f6dc28956c93b58ce1f2482) by Bowen Xie) +- **devtools:** Reconnecting to an unknown inspector page no longer results in a zombie connection ([a7adfef0bb](https://github.com/facebook/react-native/commit/a7adfef0bb3df03517935e446ea0c6b506f7ed90) by [@motiz88](https://github.com/motiz88)) +- **devtools:** Avoid a zombie state when opening a second debugger frontend concurrently. ([e55ea2daf1](https://github.com/facebook/react-native/commit/e55ea2daf11bb527f500323e3f1bb71f10cbe1c5) by [@motiz88](https://github.com/motiz88)) +- **devtools:** Inspector-proxy no longer accidentally detaches connected devices. ([4c6bff01b3](https://github.com/facebook/react-native/commit/4c6bff01b384d7d899dd9d3beef12b878918704e) by @motiz88) +- **devtools:** Throttle reload command ([42bad68220](https://github.com/facebook/react-native/commit/42bad68220d288ef2436609ee50ad993c239b362) by [@coado](https://github.com/coado)) +- **devtools** Respond with status code `200` when successfully launching RNDT ([eeb6122f39](https://github.com/facebook/react-native/commit/eeb6122f390d355191182eaee6cf126468e7b4d4) by [@byCedric](https://github.com/byCedric)) +- **error reporting:** Fix logbox reporting React errors as Warnings ([cbb313253f](https://github.com/facebook/react-native/commit/cbb313253fdf96c4fca06a24ed4cbd3f3df9db80) by [@rickhanlonii](https://github.com/rickhanlonii)) +- **error reporting** Restore Metro log forwarding, change notice to signal future removal ([6047f9cc09](https://github.com/facebook/react-native/commit/6047f9cc09a7a86b79084a3ff1b4303c4583d2ce) by [@huntie](https://github.com/huntie)) +- **flow:** Fix parsing of modern Flow syntax when `transformer.hermesParser = false` is configured in Metro config ([1387f521fd](https://github.com/facebook/react-native/commit/1387f521fdd8f187eab7a4a6a05d4d75a96b4f88) by [@huntie](https://github.com/huntie)) +- **infra:** Removed noisy ENOENT error message upon launching the debugger ([5bbf5a4878](https://github.com/facebook/react-native/commit/5bbf5a4878fd3bab7b70f91e049bb6b986fd183b) by [@EdmondChuiHW](https://github.com/EdmondChuiHW)) +- **infra:** Ensure `--build-output` destination exists ([396bdd87d8](https://github.com/facebook/react-native/commit/396bdd87d8021902ad78b817314fdc5b6207c2ea) by [@szymonrybczak](https://github.com/szymonrybczak)) +- **infra:** Fix Platform.constants.reactNativeVersion type ([95d9cdf228](https://github.com/facebook/react-native/commit/95d9cdf228e33d5651f41ebf5e14e80962fae118) by [@NickGerleman](https://github.com/NickGerleman)) +- **js:** Fixes findNodeAtPoint when views were inverted ([1d1646afd1](https://github.com/facebook/react-native/commit/1d1646afd1ff4f068fc41d8b142b08d53e6cd91a) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **layout:** Fix handling 'auto' checks in absolute layout ([3596019489](https://github.com/facebook/react-native/commit/359601948923baf7304d223260be3926c5b81db0) by [@coado](https://github.com/coado)) +- **runtime** Add missing methods to the WithRuntimeDecorator class. ([993f9fd8db](https://github.com/facebook/react-native/commit/993f9fd8db5fe4df495b3a3454273b0e11fef489) by [@neildhar](https://github.com/neildhar)) +- **runtime:** Undo breaking change on ViewManagerDelegate.kt String params (ce1620616c by @cortinico) +- **runtime:** Undo breaking change on UIManager eventDispatcher accessor (55671c00e5 by @cortinico) +- **Scrollview:** Properly make ScrollView compatible with React 19 ([b395208303](https://github.com/facebook/react-native/commit/b39520830341cae8c3785250cbaf2ec99958ba69) by [@cipolleschi](https://github.com/cipolleschi)) +- **Scrollview:** Make ScrollView compatible with React 19 ([8041e410e3](https://github.com/facebook/react-native/commit/8041e410e3b8ea135dc5f08daddd5ceface24439) by [@cipolleschi](https://github.com/cipolleschi)) +- **SectionList:** Loosen SectionList `renderItem` required return type ([12b64b7824](https://github.com/facebook/react-native/commit/12b64b78247f2db929c6d421262bdec1f6402e0b) by [@NickGerleman](https://github.com/NickGerleman)) +- **style:** Fixed `alignItems: 'baseline'` not working correctly on the new architecture ([2932c0f71f](https://github.com/facebook/react-native/commit/2932c0f71f1882607d9e579e5c09db28e131a4c9) by [@j-piasecki](https://github.com/j-piasecki)) +- **style:** Linear gradient color stop spec. ([1a49892d57](https://github.com/facebook/react-native/commit/1a49892d574e3b77a75df8cfc77307a7d5daab35) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **TextInput:** Fixed fontWeight number value error for text optimized ([2a230694c4](https://github.com/facebook/react-native/commit/2a230694c421bf338699506a0044c26fd4c1eb55) by [@meetdhanani17](https://github.com/meetdhanani17)) +- **typescript:** Allow read only array type for transform property ([c16defaff2](https://github.com/facebook/react-native/commit/c16defaff2964a2b30656def35eb3450cff9cd71) by [@tjzel](https://github.com/tjzel)) +- **typescript:** Add missing `submitBehavior` prop and mark `blurOnSubmit` prop as deprecated in Typescript declaration file of `TextInput` ([1dcbf41725](https://github.com/facebook/react-native/commit/1dcbf41725a7296c0a0f33c4e0cc3a11e8780889) by [@thisisgit](https://github.com/thisisgit)) + +#### Android specific + +- **Animated:** Fix scheduled animated operations not being executed in some cases ([dc8c8ebc5b](https://github.com/facebook/react-native/commit/dc8c8ebc5b7b6315b3c8e79028a80611a796ea7e) by [@j-piasecki](https://github.com/j-piasecki)) +- **Animated** Sync the Shadow Tree and the Native Tree with Native animation when scroll is driving the animation ([394aae1c1c](https://github.com/facebook/react-native/commit/394aae1c1cc354eaefb762455e2bbeeec0503038) by [@cipolleschi](https://github.com/cipolleschi)) +- **Appearance:** Ensure Appearance change listener does not skip events ([7041ed28f0](https://github.com/facebook/react-native/commit/7041ed28f092e7c6c1dac35f0ce6af095cd9a072) by [@vonovak](https://github.com/vonovak)) +- **DevMenu:** Add missing Android implementation for DevMenu Module ([1bdae07d89](https://github.com/facebook/react-native/commit/1bdae07d89fdda486d3f9dbcc4aa5cbb026fc8b6) by [@cortinico](https://github.com/cortinico)) +- **devtools** Fix issue with `NativeDevSettings.setIsDebuggingRemotely` where the app would keep on restarting if remote debugging was invoked from an action / component that was called on app start. ([beebf4a0a3](https://github.com/facebook/react-native/commit/beebf4a0a36c4ee9dc52631afdf2b25745a1b0f2) by [@Sushant-Sardeshpande](https://github.com/Sushant-Sardeshpande)) +- **Image** Make Imagesource `open` for inheritance ([0e805a953d](https://github.com/facebook/react-native/commit/0e805a953d8c2e91790a2f9fa2da7850478231b7) by [@cortinico](https://github.com/cortinico)) +- **Image** Fix ReactImageView.hasOverlappingRendering() ([2bed2ab1a6](https://github.com/facebook/react-native/commit/2bed2ab1a658230cb6fa23fdcb4e5a962f496e18) by [@NickGerleman](https://github.com/NickGerleman)) +- **infra:** Expose `react_timing` headers in `reactnative` prefab ([b1d42c8ef2](https://github.com/facebook/react-native/commit/b1d42c8ef2eb54af48ad27d3dc121e15c07d3dba) by [@tomekzaw](https://github.com/tomekzaw)) +- **infra:** RNGP - Sanitize the output of the config command ([d7884a6bb8](https://github.com/facebook/react-native/commit/d7884a6bb8f2d8fd08dfd7d2817a4fc25f61a57c) by [@cortinico](https://github.com/cortinico)) +- **infra** Fix NPE in FileReaderModule ([fd4531fe23](https://github.com/facebook/react-native/commit/fd4531fe234149f4f078a1e73ec68145f9da20b3) by [@cortinico](https://github.com/cortinico)) +- **infra** Properly set `REACTNATIVE_MERGED_SO` for autolinked libraries ([c005609b01](https://github.com/facebook/react-native/commit/c005609b0155223f3ae778c5cd96bc78c4dfe399) by [@cortinico](https://github.com/cortinico)) +- **logging** Fix LogModule to create view when show is called ([0847384a45](https://github.com/facebook/react-native/commit/0847384a4598d9bbc8987788047bc58d7596881d) by [@fannnzhang](https://github.com/fannnzhang)) +- **Modal**: Deprecating ModalHostShadowNode and ModalHostHelper classes ([77b3a8bdd6](https://github.com/facebook/react-native/commit/77b3a8bdd6164b4c2407e53cb0e27075c3ea7213) by [@alanleedev](https://github.com/alanleedev)) +- **Modal** PointerEvents from Modal would not be dispatched correctly in new architecture. ([75114e3672](https://github.com/facebook/react-native/commit/75114e36726979625674b2c75a77ac330fccc4d6) by [@javache](https://github.com/javache)) +- **networking** Fix uploading GIF URI ([48669af562](https://github.com/facebook/react-native/commit/48669af562d6d3ed7835816d60a2fb400a22a19b) by [@s77rt](https://github.com/s77rt)) +- **RedBox:** RedBox content overlapping with system bars on Android 15 forced edge-to-edge ([97b661c3f0](https://github.com/facebook/react-native/commit/97b661c3f07ab0269b707b209139d5c1648d1e03) by [@alanleedev](https://github.com/alanleedev)) +- **renderer** Fixed black strip coming when hiding status bar ([f6b6d001a0](https://github.com/facebook/react-native/commit/f6b6d001a0e0241a9d637cd5e532f0d8610d9ee1) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **renderer** Fix Android removeClippedSubviews in RTL ([ea6928fcb9](https://github.com/facebook/react-native/commit/ea6928fcb95c19e84f8f2851f28d0cd4343c6a26) by [@NickGerleman](https://github.com/NickGerleman)) +- **runtime:** Fix Headless Crash `Tried to finish non-existent task with id` ([b4532adad4](https://github.com/facebook/react-native/commit/b4532adad4e38e1237631778f7b8c917a9ccf746) by [@RodolfoGS](https://github.com/RodolfoGS)) +- **runtime** Optimize BaseViewManager#setTransform to ignore duplicate values ([3df0f3b9ff](https://github.com/facebook/react-native/commit/3df0f3b9ff4cc9cd6846ef02101baf8e9605d6a0) by [@javache](https://github.com/javache)) +- **runtime** Make getUri and isResource open ([8c81ffa60a](https://github.com/facebook/react-native/commit/8c81ffa60a211e4ae7db50cd04de0e4a4c29df04) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **runtime** Do not destroy views when there is a touch going on for New Architecture ([6b7f68240e](https://github.com/facebook/react-native/commit/6b7f68240e08c64ced29ed3d7a1f95db96a6eef4) by [@cortinico](https://github.com/cortinico)) +- **runtime** Annotate ReactRootView.createRootView with nullable ([6a1ecbb2bb](https://github.com/facebook/react-native/commit/6a1ecbb2bb3942e7487532262f2a4fc55f94fcad) by [@shwanton](https://github.com/shwanton)) +- **runtime** Made several methods in ReactNativeHost.java thread-safe to avoid race conditions ([f9ac5b737a](https://github.com/facebook/react-native/commit/f9ac5b737a0e14c76f35840efcf348f1c7704363) by Jack Su) +- **runtime** Fixed Headless JS tasks in New Architecture ([9a1ae97c22](https://github.com/facebook/react-native/commit/9a1ae97c22868a312000f3ac50dacf9a8125d273) by [@robik](https://github.com/robik)) +- **runtime** Fix default for `showsHorizontalScrollIndicator` and `showsVerticalScrollIndicator` ([3af01a8a44](https://github.com/facebook/react-native/commit/3af01a8a44853246d3deb957c4a1c65e43848bb5) by [@NickGerleman](https://github.com/NickGerleman)) +- **runtime:** Adds a null check in react context getter ([aeb020dfa3](https://github.com/facebook/react-native/commit/aeb020dfa34d06b63fa0151be302287d0a3fb84f) by Peter Abbondanzo) +- **runtime** Fix ReactFragment on New Architecture ([52322fbd0e](https://github.com/facebook/react-native/commit/52322fbd0e641726b224b2b9b89d99d93dbc6e33) by [@cortinico](https://github.com/cortinico)) +- **style** Don't use mGapBetweenPaths if not drawing a border ([8501b6396b](https://github.com/facebook/react-native/commit/8501b6396b0a4fd7a9bd2add2b3c8b9c755c27ae) by [@knappam](https://github.com/knappam)) +- **style** Linear gradient border styles ([20e3f4518f](https://github.com/facebook/react-native/commit/20e3f4518feac70e8ac9b1cc4fc1cbb029df96e4) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- **style** Gracefully handle unexpected overflow values ([82094dd9e3](https://github.com/facebook/react-native/commit/82094dd9e33d94f65fd2548f5b04a19fb89bad0f) by [@NickGerleman](https://github.com/NickGerleman)) +- **style** Fix "setTranslucentBackgroundDrawable()" deprecation version ([35d9a18b81](https://github.com/facebook/react-native/commit/35d9a18b81ff9448459c9fb033f4fea1fa17dab3) by [@NickGerleman](https://github.com/NickGerleman)) +- **style:** Add missing invalidate() to setOverflow() ([087193c98e](https://github.com/facebook/react-native/commit/087193c98ead8f12ec4f839dd077d5bd63075d6f) by [@NickGerleman](https://github.com/NickGerleman)) +- **style:** Add borderStartWidth and borderEndWidth support ([92dca53702](https://github.com/facebook/react-native/commit/92dca5370239f2c9881455b683ff384e2187430f) by [@NickGerleman](https://github.com/NickGerleman)) +- **style** Fixed text shadow rendering with artifacts when `backgroundColor` was set on the `TextInput` ([83716298f8](https://github.com/facebook/react-native/commit/83716298f8dd6a1f3128965225858b4c6d3b2477) by [@j-piasecki](https://github.com/j-piasecki)) +- **Text** Fix measuring text with incorrect hyphenationFrequency ([fc8224036b](https://github.com/facebook/react-native/commit/fc8224036b4b5880c881f471e432ee5b47113b0b) by [@NickGerleman](https://github.com/NickGerleman)) +- **TextInput:** fixed select text on auto focus for TextInput ([18d6028ff9](https://github.com/facebook/react-native/commit/18d6028ff908eef99aae363d8ee9a6789d264284) by [@kunalchavhan](https://github.com/kunalchavhan)) +- **TextInput** TextInput's `contextMenuHidden` prop bug fix ([8a3ffb6d23](https://github.com/facebook/react-native/commit/8a3ffb6d23f169752891eddc7dad9e34cb2d861c) by [@alanleedev](https://github.com/alanleedev)) + +#### iOS specific + +- **devtools** Fix position of RCTPerfMonitor in landscape mode & expanded mode ([258f41a30f](https://github.com/facebook/react-native/commit/258f41a30f5a797c0cfdb256a6824b7284dcc8e2) by [@krozniata](https://github.com/krozniata)) +- **Appearance** Fixes Appearance user interface style when app run from background ([efa9711e35](https://github.com/facebook/react-native/commit/efa9711e35f528245cdfb6c7028129c97ae10192) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **c++** Fixes NSDataBigString length calculation ([bb3c51dc84](https://github.com/facebook/react-native/commit/bb3c51dc84e9514f55ca8a1e3abb1af140563c7b) by Tzvetan Mikov) +- **codegen** Codegen will start looking for codegen-enabled dependencies from the project root. ([46d17efa62](https://github.com/facebook/react-native/commit/46d17efa626cd546e839648e1a95f43a3802051c) by [@dmytrorykun](https://github.com/dmytrorykun)) +- **Hermes**: Exclude dSYM from the archive ([7e14ec5177f](https://github.com/facebook/react-native/commit/7e14ec5177fd17ca9f1db384026b26ae90ab0b00) by [@cipolleschi](https://github.com/cipolleschi)) +- **Image** Fixes race condition when setup image loader ([6b104bbe01](https://github.com/facebook/react-native/commit/6b104bbe015c93a40a73232fdb92a99e3799b7ac) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Image** Fixed crash in RCTImageUtils ([3572ef3f1b](https://github.com/facebook/react-native/commit/3572ef3f1b5b11c1ecfa21f0246cbba5941bbe0f) by [@pavelgurkovskiy](https://github.com/pavelgurkovskiy)) +- **Image** Data race in `RCTImageLoader` related to assignment of cancellation block. ([0f051f6034](https://github.com/facebook/react-native/commit/0f051f603492f97a85e051f112d96180352bba77) by [@hakonk](https://github.com/hakonk)) +- **Image** Fixes Image load event in new arch ([7698cd0953](https://github.com/facebook/react-native/commit/7698cd09536ebf99c3b56696a7bb75d714abfb18) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **infra** Add back the BUNDLE_COMMAND ([cf42288181](https://github.com/facebook/react-native/commit/cf422881819decccdd2b486fbb73f2192b9ec522) by [@Vin-Xi](https://github.com/Vin-Xi)) +- **infra** Resolve Hermes prebuilt version based on react-native package ([b10ed0e19d](https://github.com/facebook/react-native/commit/b10ed0e19d8eec388305962667561e0cb95a3f25) by [@okwasniewski](https://github.com/okwasniewski)) +- **infra** Support bundle install from outside the ios folder using --project-directory ([b22970e3cf](https://github.com/facebook/react-native/commit/b22970e3cfbe603bffea5b1c3bbf150887e3d7b8) by [@blakef](https://github.com/blakef)) +- **infra** Use CONFIG_CMD if set ([774fe0cf6f](https://github.com/facebook/react-native/commit/774fe0cf6f22f832b756c166599973d9db6a93de) by [@krystofwoldrich](https://github.com/krystofwoldrich)) +- **infra** Fixes FORCE_BUNDLING error when bundle js ([089e8289ba](https://github.com/facebook/react-native/commit/089e8289ba6cba0821b76207a2dce316b1621c3d) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Modal** App crash happening when navigate to a new app screen with a displaying modal ([52888c0c1e](https://github.com/facebook/react-native/commit/52888c0c1e722a799f233c2f502e01b9dd4a7174) by Zhi Zhou) +- **Networking:** Fix: on iOS not getting 304 from `If-None-Match` request ([b8ab0fe703](https://github.com/facebook/react-native/commit/b8ab0fe703f1a0aca796bc15641d029a2036105f) by [@huzhanbo1996](https://github.com/huzhanbo1996)) +- **Networking** Fix data race related to access on `RCTNetworkTask.status`. ([b1ec698dc4](https://github.com/facebook/react-native/commit/b1ec698dc4baf34ba2e31b7ad43dff97c229bf99) by [@hakonk](https://github.com/hakonk)) +- **RedBox** Mac Catalyst crash in RCTRedBox ([84fe531952](https://github.com/facebook/react-native/commit/84fe531952d4b97c3cb0d84322abdf8953382ad6) by [@sbuggay](https://github.com/sbuggay)) +- **RedBox** Fix rendering `RCTRedBoxExtraData` ([c9d589dab5](https://github.com/facebook/react-native/commit/c9d589dab5148cbd192078967f743d38b8048c6e) by [@krozniata](https://github.com/krozniata)) +- **rendering:** Properly retain/release backgroundColor in RCTBorderDrawing ([47748c7935](https://github.com/facebook/react-native/commit/47748c7935540014abed03b4d2ff809b471c4fe3) by [@Saadnajmi](https://github.com/Saadnajmi)) +- **RefreshControl:** Fixed an issue where the refresh control would not behave correctly if it was offscreen. ([a8be335a37](https://github.com/facebook/react-native/commit/a8be335a37eb792a7c6ccb7f577459020a2fc43c) by [@deepanshushuklad11](https://github.com/deepanshushuklad11)) +- **RefreshControl:** Fix applying of tintColor and progressViewOffset props for RefreshControl component with New Architecture enabled ([19d468fed9](https://github.com/facebook/react-native/commit/19d468fed966f2adb973ad3f19a97a5ec0372e3a) by [@TuTejsy](https://github.com/TuTejsy)) +- **RefreshControl:** Passed correct title and titleColor prop to updateTitle function ([5c7a166dca](https://github.com/facebook/react-native/commit/5c7a166dcaf5400fbc4c12d4c8b451228157c036) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **runtime** Fixed a crash when navigating away from a screen that contains a scrollView ([c6f32828b9](https://github.com/facebook/react-native/commit/c6f32828b9487381dab27f645aedcdbae9dcbc7e) by [@cipolleschi](https://github.com/cipolleschi)) +- **runtime** Data race related to read/write on `ReactMarker::logTaggedMarkerImpl` ([7e41ea4c9d](https://github.com/facebook/react-native/commit/7e41ea4c9de943a5c73ca9821bf552d39aa49dcd) by [@hakonk](https://github.com/hakonk)) +- **runtime** Fixes typo of function callFunctionOnBufferedRumtimeExecutor ([4e12c2e37c](https://github.com/facebook/react-native/commit/4e12c2e37cb168f09f8768941cb915e4024a1c34) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **runtime** Fixes main thread stuck when reload in bridgeless mode ([a778979ed6](https://github.com/facebook/react-native/commit/a778979ed604d1dc7707faf4a3836e3deba136c6) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **runtime** Fixing maxLength check which was firing onChange multiple times ([d88dd14507](https://github.com/facebook/react-native/commit/d88dd145074ee84de0cc4207de02a3cd79c9ceff) by [@deepanshushuklad11](https://github.com/deepanshushuklad11)) +- **runtime** Use std::atomic for eliminating races in RCTCxxBridge. ([8204134024](https://github.com/facebook/react-native/commit/8204134024e81947969bd8c2ba337dc931e54bd9) by [@hakonk](https://github.com/hakonk)) +- **runtime** Fix legacy view interop apis not available in view method ([19cffab383](https://github.com/facebook/react-native/commit/19cffab3837c24f2e8470a31bbd8e8338d1c1b6c) by [@janicduplessis](https://github.com/janicduplessis)) +- **ScrollView** Implement automicallyAdjustsKeyboardInsets for new arch ([e4e461c9cf](https://github.com/facebook/react-native/commit/e4e461c9cf969e1a1dfca6448ca6084b7f45ef7d) by [@okwasniewski](https://github.com/okwasniewski)) +- **ScrollView** Implement automicallyAdjustsKeyboardInsets for new arch ([21bdce7286](https://github.com/facebook/react-native/commit/21bdce7286fc493b9601add3bf67d549b792d29b) by [@okwasniewski](https://github.com/okwasniewski)) +- **StatusBarManager** Retrieve status bar size using RCTUIStatusBarManager ([34cd195d9f](https://github.com/facebook/react-native/commit/34cd195d9fbd075a161afbfac842f896355991e1) by [@okwasniewski](https://github.com/okwasniewski)) +- **style** fix: background color fix when border is dotted and dashed ([b243d343fa](https://github.com/facebook/react-native/commit/b243d343fa741de94537d8535f76714ff2985101) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **style** Fixes ellipsis carries background from trimmed text ([9e2f8859c4](https://github.com/facebook/react-native/commit/9e2f8859c4d237ae2bee4679da45038405b7074e) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Text** Fixed baseline attachment position in multiline text ([9bfbf948df](https://github.com/facebook/react-native/commit/9bfbf948dfd23c891233e747cbaeeb6480f5fa41) by [@j-piasecki](https://github.com/j-piasecki)) +- **Text** Clean up RCTParagraphComponentView & RCTParagraphTextView ([9239ad1c6b](https://github.com/facebook/react-native/commit/9239ad1c6bac2c2400f940708d823d7b2c2457c4) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Text** Fixes Italic text not work ([9cfd9dd1c7](https://github.com/facebook/react-native/commit/9cfd9dd1c7f8c37c156f1a9ff812183f80d67926) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Text** Fixes ellipsis carries background from trimmed text ([fcb6cdc710](https://github.com/facebook/react-native/commit/fcb6cdc7108103527268aef42a77e530f9482668) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Text** Fixed text baseline being moved upwards in certain cases ([01f7ab814f](https://github.com/facebook/react-native/commit/01f7ab814f847eb3038efa7120d81e92e3ff4187) by [@j-piasecki](https://github.com/j-piasecki)) +- **TextInput** Fixes TextInput crash when undo if text longer than maxLength ([9b9c780cc8](https://github.com/facebook/react-native/commit/9b9c780cc8b54e2c1cd61f9fac0554488f68dea8) by [@zhongwuzw](https://github.com/zhongwuzw)) + +### Security + +- **infra:** Upgrade grpc/grpc-js from 1.7.0 to 1.10.9 (CVE-2024-37168) ([295626bc35](https://github.com/facebook/react-native/commit/295626bc35326cc68c127ff515dcbb8e9d7d44e3) by [@GijsWeterings](https://github.com/GijsWeterings)) +- **infra:** Upgrade braces from 3.0.2 to 3.0.3 (CVE-2024-4068) ([d538879e08](https://github.com/facebook/react-native/commit/d538879e08360b8230410fc893a50489bad5cf60) by [@GijsWeterings](https://github.com/GijsWeterings)) +- **infra:** Update ws from 7.5.1 to 7.5.10 (CVE-2024-37890) ([13f1b9e10f](https://github.com/facebook/react-native/commit/13f1b9e10f6045421808714f7e62aa17bfb3e891) by [@GijsWeterings](https://github.com/GijsWeterings)) +- **infra:** Update ws from 6.2.2 to 6.2.3 (CVE-2024-37890) ([80cfacef78](https://github.com/facebook/react-native/commit/80cfacef78f34d3786d955084a8bf4d42ea37f1b) by [@GijsWeterings](https://github.com/GijsWeterings)) + +## v0.75.5 + +### Added + +- **Hermes:** Implement more missing methods on WithRuntimeDecorator ([80f67ca03c](https://github.com/facebook/react-native/commit/80f67ca03c99c688e2a3127e9b3dddd02625848e) by [@neildhar](https://github.com/neildhar)) + + +### Changed + +#### Android specific + +- **Deps:** Bump Kotlin to 1.9.25 to mitigate [#49115](https://github.com/facebook/react-native/issues/49115) ([25e76a2717](https://github.com/facebook/react-native/commit/25e76a271781b3ffe8002108d8b12aa3d47442b5) by [@riteshshukla04](https://github.com/riteshshukla04)) + +#### iOS specific + +- **Deps:** Pin Xcodeproj to < 1.26.0 ([2922af2e7e](https://github.com/facebook/react-native/commit/2922af2e7e8527a93c7956b10ddb314f25c334fa) by [@cipolleschi](https://github.com/cipolleschi)) +- **Deps:** Pin concurrent-ruby to <= 1.3.4 ([794bf34e60](https://github.com/facebook/react-native/commit/794bf34e60cea8146aebad1fefe051d4140fc28b) by [@cipolleschi](https://github.com/cipolleschi)) + +### Fixed + +- **FormData:** fix: FormData filename in content-disposition ([78ef1e2bc2](https://github.com/facebook/react-native/commit/78ef1e2bc2ed30321745e2505713915b9015d920) by [@foyarash](https://github.com/@foyarash)) + + +#### Android specific + +- **TextInput:** Set TextInput selection correctly when attached to window in Android ([1656394bae](https://github.com/facebook/react-native/commit/1656394bae16cc54fb38687d38bcbf85138c98a2) by [@QichenZhu](https://github.com/QichenZhu)) + +#### iOS specific + +- **Animation:** Fabric: Fixes animations strict weak ordering sorted check failed ([ea0bc54115](https://github.com/facebook/react-native/commit/ea0bc541155700e0973d960c94d01918d6b28c6b) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **Hermes** Exclude dSYM from the archive ([fdb2631b5e](https://github.com/facebook/react-native/commit/fdb2631b5ea27765663046b94f84956d30ebaaeb) by [@cipolleschi](https://github.com/cipolleschi)) +- **Image** Fix images not displayed when extension is implicit ([b6ed0d351e](https://github.com/facebook/react-native/commit/b6ed0d351e246c431bdc88a6c3d154ba35220c25) by [@cipolleschi](https://github.com/cipolleschi)) +- **Xcode:** Fix the generation of .xcode.env.local ([dbffbf72d7](https://github.com/facebook/react-native/commit/dbffbf72d7287e021e965b6639e455e8555bbf2e) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.75.4 + +### Fixed + +#### Android specific + +- Fix Headless Crash `Tried to finish non-existent task with id` ([56a282c44d](https://github.com/facebook/react-native/commit/56a282c44d1a3ee5114c2cba36b902bc9ae123b9) by [@RodolfoGS](https://github.com/RodolfoGS)) +- TextInput's `contextMenuHidden` prop bug fix ([366f1d0df3](https://github.com/facebook/react-native/commit/366f1d0df302af860b1fa9ea5f0bd757f2dec7b3) by [@alanleedev](https://github.com/alanleedev)) +- RNGP - Sanitize the output of the config command ([0265ea0577](https://github.com/facebook/react-native/commit/0265ea0577963cca582682c3fc8ee97f3ebef65e) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- Convert `NSNull` to `nil` before checking `type` in `readAsDataURL` ([99ab845a5c](https://github.com/facebook/react-native/commit/99ab845a5cf0fe3463ff39b03373b95d4f5c0fac) by [@haileyok](https://github.com/haileyok)) +- Add back the BUNDLE_COMMAND ([afd74ad89d](https://github.com/facebook/react-native/commit/afd74ad89de6e632eea776e6d2689e7381c4f78c) by [@Vin-Xi](https://github.com/Vin-Xi)) +- Use CONFIG_CMD if set ([a4ec49cbe6](https://github.com/facebook/react-native/commit/a4ec49cbe6d0157417276731ba1608e482f3f10e) by [@krystofwoldrich](https://github.com/krystofwoldrich)) +- App crash happening when navigate to a new app screen with a displaying modal ([8ec672204d](https://github.com/facebook/react-native/commit/8ec672204d5dee2b967cac08adf03c082e36ad79) by [@zhouzh1](https://github.com/zhouzh1)) + +## v0.75.3 + +### Changed + +- **Infra:** Remove resolution and add commander as devDependency for the monorepo ([cf7b9b9486](https://github.com/facebook/react-native/commit/cf7b9b9486069a8a3cf4443353603fcb2174d012) by [@cipolleschi](https://github.com/cipolleschi)) +- **CLI:** Bump CLI to 14.1.0 ([6a08c38263](https://github.com/facebook/react-native/commit/6a08c38263a544d88157cc3a6b1ee44ed28f7db0) by [@cipolleschi](https://github.com/cipolleschi)) + +### Fixed + +- **TypeScript:** Allow readonly array type for transform property ([c16defaff2](https://github.com/facebook/react-native/commit/c16defaff2964a2b30656def35eb3450cff9cd71) by [@tjzel](https://github.com/tjzel)) + +#### Android specific + +- **Autolinking:** Fix autolinking issues for Pure C++ TurboModules ([833c3a2cf5](https://github.com/facebook/react-native/commit/833c3a2cf5df6b65c6fe75577da2df7c5a085e8d) by [@hsjoberg](https://github.com/hsjoberg)) +- **Renderer:** Don't use mGapBetweenPaths if not drawing a border ([8501b6396b](https://github.com/facebook/react-native/commit/8501b6396b0a4fd7a9bd2add2b3c8b9c755c27ae) by [@knappam](https://github.com/knappam)) +- **Image:** Make getUri and isResource open ([8c81ffa60a](https://github.com/facebook/react-native/commit/8c81ffa60a211e4ae7db50cd04de0e4a4c29df04) by [@shubhamguptadream11](https://github.com/shubhamguptadream11)) +- **RGNP:** Remove unnecessary dependency on `gradle-tooling-api-builders` - serviceOf failure ([1067798a7e](https://github.com/facebook/react-native/commit/1067798a7e9ad06f8a22c1749e582c42348a554d) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- **Infra:** Include x86_64 slice when building for visionOS simulator + ([05dec917f2](https://github.com/facebook/react-native/commit/05dec917f2e5f8288c0d9f31bc50c10bd0c0eab3) by [@okwasniewski](https://github.com/okwasniewski)) +- **Infra:** Support bundle install from outside the ios folder using --project-directory ([b22970e3cf](https://github.com/facebook/react-native/commit/b22970e3cfbe603bffea5b1c3bbf150887e3d7b8) by [@blakef](https://github.com/blakef)) +- **Codegen:** Codegen will start looking for codegen-enabled dependencies from the project root. ([46d17efa62](https://github.com/facebook/react-native/commit/46d17efa626cd546e839648e1a95f43a3802051c) by [@dmytrorykun](https://github.com/dmytrorykun)) + ## v0.75.2 ### Added @@ -360,6 +1383,36 @@ - **turbomodule:** Fixed race condition in native module invalidation. ([b7812a8b6c](https://github.com/facebook/react-native/commit/b7812a8b6c3afbeacaad94779cd010bcc5440785) by [@dmytrorykun](https://github.com/dmytrorykun)) - **xcode:** Do not use temporary node when creating the .xcode.env.local ([8408b8bc96](https://github.com/facebook/react-native/commit/8408b8bc96db15e265ca65fce7875ee65dcfdcec) by [@cipolleschi](https://github.com/cipolleschi)) +## v0.74.7 + +### Fixed + +#### Android specific + +- Fix #41226 by suppressing path adjustment when not actually drawing a border ([8501b6396b](https://github.com/facebook/react-native/commit/8501b6396b0a4fd7a9bd2add2b3c8b9c755c27ae) by [@knappam](https://github.com/knappam)) +- RGNP - Remove unnecessary dependency on `gradle-tooling-api-builders` - serviceOf failure ([b6bdecd309](https://github.com/facebook/react-native/commit/b6bdecd309bf74cfa80b71204d5266667cb3f843) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- Fix iOS crash occurring when navigating to a new app screen with a displaying modal ([52888c0c1e](https://github.com/facebook/react-native/commit/52888c0c1e722a799f233c2f502e01b9dd4a7174) by Zhi Zhou) +- Fix ruby for CI ([1c80702e95](https://github.com/facebook/react-native/commit/1c80702e95a6bcf422f5448b4578d71e8e78071b) by [@cipolleschi](https://github.com/cipolleschi)) +- Fixes animations strict weak ordering sorted check failed ([60889e170c](https://github.com/facebook/react-native/commit/60889e170ca3f6187e15719a3d85da0bc7e974ff) by [@zhongwuzw](https://github.com/zhongwuzw)) + +## v0.74.6 + +### Added + +#### Android specific +- [0.74] Add support for handling `com.facebook.react.bridge.Dynamic` as parameter for TurboModules ([a9588f3718](https://github.com/facebook/react-native/commit/a9588f3718d682cf5b10db708b429885c2a06ee9) by [@cortinico](https://github.com/cortinico)) + +### Changed + +- Bump hermes version ([4e737b0b16](https://github.com/facebook/react-native/commit/4e737b0b1649fcfed68529370f371bc2ae9319e3) by [@blakef](https://github.com/blakef)) + +### Fixed + +- Fix(react-native): fix codegen failing in a pnpm monorepo setup ([a90a17a8b3](https://github.com/facebook/react-native/commit/a90a17a8b3f56c5f2aa84e06c48ccc19339b70eb) by [@tido64](https://github.com/tido64)) + ## v0.74.5 ### Fixed @@ -1026,6 +2079,45 @@ - Bump activesupport to minimum 6.1.7.5 CVE-2023-38037. ([07a159f279](https://github.com/facebook/react-native/commit/07a159f279cdcbed29c9c437dec1c0b8ac2d852f) by [@lunaleaps](https://github.com/lunaleaps)) +## v0.73.11 + +### Fixed + + + +#### Android specific + +- Suppress path adjustment when not actually drawing a border ([c9cf6d4b60](https://github.com/facebook/react-native/commit/c9cf6d4b60b6c5f717b3e5c9f3e3720e8d588707) by [@tjzel](https://github.com/tjzel)) + +#### iOS specific + +- Stop generating dSYM path in Hermes for the framework ([e992405e87](https://github.com/facebook/react-native/commit/e992405e87) by [@cipolleschi](https://github.com/cipolleschi)) +- Pin Xcodeproj to < 1.26.0 ([dfcad7c678](https://github.com/facebook/react-native/commit/dfcad7c678) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.73.10 + +### Removed + +#### Android specific + +- Stop emitting deprecated onTextInput events ([e6ad652c6a](https://github.com/facebook/react-native/commit/e6ad652c6ae2222e95b3dc351f28c0fa3a91d622) by [@javache](https://github.com/javache)) +- RGNP - Remove unnecessary dependency on gradle-tooling-api-builders - serviceOf failure ([069d8fc249](https://github.com/facebook/react-native/commit/069d8fc2495b63a233cb30712e888f29a185098c) by [@cortinico](https://github.com/cortinico)) + +### Fixed + +- fix(TypeScript): Allow readonly arrays in transform ([b4015c1eaa](https://github.com/facebook/react-native/commit/b4015c1eaaed5fe7281314a9c5988a4c1cade3a6) by [@tjzel](https://github.com/tjzel)) + +#### Android specific + +- Fix TextInput 'contextMenuHidden' prop ([08eed9f093](https://github.com/facebook/react-native/commit/08eed9f093d759fadbaef86dcf54c801917b4602) by [@alanleedev](https://github.com/alanleedev)) + +#### iOS specific + +- Fix `` with floating keyboard on iPadOS ([3c54e1ee45](https://github.com/facebook/react-native/commit/3c54e1ee4522b26698bb3f99262a2a621b26fb64) by [@renchap](https://github.com/renchap)) +- Fix the generation of .xcode.env.local ([88fb3daa7e](https://github.com/facebook/react-native/commit/88fb3daa7ef112a9e7500c32168a897d0d409456) by [@cipolleschi](https://github.com/cipolleschi)) +- Fix iOS crash occurring when navigating to a new app screen with a displaying modal ([33ca0204f5](https://github.com/facebook/react-native/commit/33ca0204f5491f27f00686e4eb966eb9fee3f7f9) by [@zhouzh1](https://github.com/zhouzh1)) +- Fabric: Fixes animations strict weak ordering sorted check failed ([f18ed7b6c7](https://github.com/facebook/react-native/commit/f18ed7b6c72d9b9443282b4c169bae56336dad8d) by [@zhongwuzw](https://github.com/zhongwuzw)) + ## v0.73.9 ### Added diff --git a/Gemfile b/Gemfile index 88f17b435ec0..e9b4cc2be6d7 100644 --- a/Gemfile +++ b/Gemfile @@ -5,3 +5,11 @@ ruby ">= 2.6.10" gem 'cocoapods', '~> 1.13', '!= 1.15.0', '!= 1.15.1' gem 'activesupport', '>= 6.1.7.5', '< 7.1.0' +gem 'xcodeproj', '< 1.26.0' +gem 'concurrent-ruby', '<= 1.3.4' + +# Ruby 3.4.0 has removed some libraries from the standard library. +gem 'bigdecimal' +gem 'logger' +gem 'benchmark' +gem 'mutex_m' diff --git a/Gemfile.lock b/Gemfile.lock index 7801444199f7..e304f8287968 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -14,6 +14,8 @@ GEM httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) + benchmark (0.4.0) + bigdecimal (3.1.9) claide (1.1.0) cocoapods (1.14.2) addressable (~> 2.8) @@ -65,8 +67,10 @@ GEM i18n (1.14.1) concurrent-ruby (~> 1.0) json (2.6.3) + logger (1.6.5) minitest (5.20.0) molinillo (0.8.0) + mutex_m (0.3.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) @@ -90,7 +94,13 @@ PLATFORMS DEPENDENCIES activesupport (>= 6.1.7.5, < 7.1.0) + benchmark + bigdecimal cocoapods (~> 1.13, != 1.15.1, != 1.15.0) + concurrent-ruby (<= 1.3.4) + logger + mutex_m + xcodeproj (< 1.26.0) RUBY VERSION ruby 3.2.0p0 diff --git a/LICENSE-docs b/LICENSE-docs deleted file mode 100644 index d21a91a914af..000000000000 --- a/LICENSE-docs +++ /dev/null @@ -1,393 +0,0 @@ -Attribution 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More_considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution 4.0 International Public License ("Public License"). To the -extent this Public License may be interpreted as a contract, You are -granted the Licensed Rights in consideration of Your acceptance of -these terms and conditions, and the Licensor grants You such rights in -consideration of benefits the Licensor receives from making the -Licensed Material available under these terms and conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - d. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - e. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - f. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - g. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - h. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - i. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - j. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - k. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - 4. If You Share Adapted Material You produce, the Adapter's - License You apply must not prevent recipients of the Adapted - Material from complying with this Public License. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material; and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public licenses. -Notwithstanding, Creative Commons may elect to apply one of its public -licenses to material it publishes and in those instances will be -considered the "Licensor." Except for the limited purpose of indicating -that material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the public -licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/README.md b/README.md index 4d8883c511c6..45dc970c97bb 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,6 @@ React Native is released under the MIT license. - - Current CircleCI build status. - Current npm package version. @@ -67,7 +64,7 @@ React Native is developed and supported by many companies and individual core co ## 📋 Requirements -React Native apps may target iOS 13.4 and Android 6.0 (API 23) or newer. You may use Windows, macOS, or Linux as your development operating system, though building and running iOS apps is limited to macOS. Tools like [Expo](https://expo.dev) can be used to work around this. +React Native apps may target iOS 15.1 and Android 7.0 (API 24) or newer. You may use Windows, macOS, or Linux as your development operating system, though building and running iOS apps is limited to macOS. Tools like [Expo](https://expo.dev) can be used to work around this. ## 🎉 Building your first React Native app @@ -87,7 +84,7 @@ The full documentation for React Native can be found on our [website][docs]. The React Native documentation discusses components, APIs, and topics that are specific to React Native. For further documentation on the React API that is shared between React Native and React DOM, refer to the [React documentation][r-docs]. -The source for the React Native documentation and website is hosted on a separate repo, [**@facebook/react-native-website**][repo-website]. +The source for the React Native documentation and website is hosted on a separate repository, [**@facebook/react-native-website**][repo-website]. [docs]: https://reactnative.dev/docs/getting-started [r-docs]: https://react.dev/learn diff --git a/build.gradle.kts b/build.gradle.kts index d848efee0ab6..e71219373530 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -92,7 +92,7 @@ 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 CircleCI is using it via workspace. + // 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") } diff --git a/flow-typed/environment/node.js b/flow-typed/environment/node.js new file mode 100644 index 000000000000..de9f3921fbd5 --- /dev/null +++ b/flow-typed/environment/node.js @@ -0,0 +1,4199 @@ +/** + * 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. + * + * @format + * @oncall flow + */ + +// Adapted from https://github.com/flow-typed/flow-typed/blob/main/definitions/environments/node/flow_v0.261.x-/node.js + +interface ErrnoError extends Error { + address?: string; + code?: string; + dest?: string; + errno?: string | number; + info?: Object; + path?: string; + port?: number; + syscall?: string; +} + +type buffer$NonBufferEncoding = + | 'hex' + | 'HEX' + | 'utf8' + | 'UTF8' + | 'utf-8' + | 'UTF-8' + | 'ascii' + | 'ASCII' + | 'binary' + | 'BINARY' + | 'base64' + | 'BASE64' + | 'ucs2' + | 'UCS2' + | 'ucs-2' + | 'UCS-2' + | 'utf16le' + | 'UTF16LE' + | 'utf-16le' + | 'UTF-16LE' + | 'latin1'; +type buffer$Encoding = buffer$NonBufferEncoding | 'buffer'; +type buffer$ToJSONRet = { + type: string, + data: Array, + ... +}; + +declare class Buffer extends Uint8Array { + constructor( + value: Array | number | string | Buffer | ArrayBuffer, + encoding?: buffer$Encoding, + ): void; + [i: number]: number; + length: number; + + compare(otherBuffer: Buffer): number; + copy( + targetBuffer: Buffer, + targetStart?: number, + sourceStart?: number, + sourceEnd?: number, + ): number; + entries(): Iterator<[number, number]>; + equals(otherBuffer: Buffer): boolean; + fill( + value: string | Buffer | number, + offset?: number, + end?: number, + encoding?: string, + ): this; + fill(value: string, encoding?: string): this; + includes( + value: string | Buffer | number, + offsetOrEncoding?: number | buffer$Encoding, + encoding?: buffer$Encoding, + ): boolean; + indexOf( + value: string | Buffer | number, + offsetOrEncoding?: number | buffer$Encoding, + encoding?: buffer$Encoding, + ): number; + inspect(): string; + keys(): Iterator; + lastIndexOf( + value: string | Buffer | number, + offsetOrEncoding?: number | buffer$Encoding, + encoding?: buffer$Encoding, + ): number; + readDoubleBE(offset?: number, noAssert?: boolean): number; + readDoubleLE(offset?: number, noAssert?: boolean): number; + readFloatBE(offset?: number, noAssert?: boolean): number; + readFloatLE(offset?: number, noAssert?: boolean): number; + readInt16BE(offset?: number, noAssert?: boolean): number; + readInt16LE(offset?: number, noAssert?: boolean): number; + readInt32BE(offset?: number, noAssert?: boolean): number; + readInt32LE(offset?: number, noAssert?: boolean): number; + readInt8(offset?: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt16BE(offset?: number, noAssert?: boolean): number; + readUInt16LE(offset?: number, noAssert?: boolean): number; + readUInt32BE(offset?: number, noAssert?: boolean): number; + readUInt32LE(offset?: number, noAssert?: boolean): number; + readUInt8(offset?: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + slice(start?: number, end?: number): this; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + toJSON(): buffer$ToJSONRet; + toString(encoding?: buffer$Encoding, start?: number, end?: number): string; + values(): Iterator; + write( + string: string, + offset?: number, + length?: number, + encoding?: buffer$Encoding, + ): number; + writeDoubleBE(value: number, offset?: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset?: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset?: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset?: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset?: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset?: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset?: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset?: number, noAssert?: boolean): number; + writeInt8(value: number, offset?: number, noAssert?: boolean): number; + writeIntBE( + value: number, + offset: number, + byteLength: number, + noAssert?: boolean, + ): number; + writeIntLE( + value: number, + offset: number, + byteLength: number, + noAssert?: boolean, + ): number; + writeUInt16BE(value: number, offset?: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset?: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset?: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset?: number, noAssert?: boolean): number; + writeUInt8(value: number, offset?: number, noAssert?: boolean): number; + writeUIntBE( + value: number, + offset: number, + byteLength: number, + noAssert?: boolean, + ): number; + writeUIntLE( + value: number, + offset: number, + byteLength: number, + noAssert?: boolean, + ): number; + + static alloc( + size: number, + fill?: string | number, + encoding?: buffer$Encoding, + ): Buffer; + static allocUnsafe(size: number): Buffer; + static allocUnsafeSlow(size: number): Buffer; + static byteLength( + string: string | Buffer | $TypedArray | DataView | ArrayBuffer, + encoding?: buffer$Encoding, + ): number; + static compare(buf1: Buffer, buf2: Buffer): number; + static concat(list: Array, totalLength?: number): Buffer; + + static from(value: Buffer): Buffer; + static from(value: string, encoding?: buffer$Encoding): Buffer; + static from( + value: ArrayBuffer | SharedArrayBuffer, + byteOffset?: number, + length?: number, + ): Buffer; + static from(value: Iterable): this; + static isBuffer(obj: any): boolean; + static isEncoding(encoding: string): boolean; +} + +declare type Node$Buffer = typeof Buffer; + +declare module 'buffer' { + declare var kMaxLength: number; + declare var INSPECT_MAX_BYTES: number; + declare function transcode( + source: Node$Buffer, + fromEnc: buffer$Encoding, + toEnc: buffer$Encoding, + ): Node$Buffer; + declare var Buffer: Node$Buffer; +} + +type child_process$execOpts = { + cwd?: string, + env?: Object, + encoding?: string, + shell?: string, + timeout?: number, + maxBuffer?: number, + killSignal?: string | number, + uid?: number, + gid?: number, + windowsHide?: boolean, + ... +}; + +declare class child_process$Error extends Error { + code: number | string | null; + errno?: string; + syscall?: string; + path?: string; + spawnargs?: Array; + killed?: boolean; + signal?: string | null; + cmd: string; +} + +type child_process$execCallback = ( + error: ?child_process$Error, + stdout: string | Buffer, + stderr: string | Buffer, +) => void; + +type child_process$execSyncOpts = { + cwd?: string, + input?: string | Buffer | $TypedArray | DataView, + stdio?: string | Array, + env?: Object, + shell?: string, + uid?: number, + gid?: number, + timeout?: number, + killSignal?: string | number, + maxBuffer?: number, + encoding?: string, + windowsHide?: boolean, + ... +}; + +type child_process$execFileOpts = { + cwd?: string, + env?: Object, + encoding?: string, + timeout?: number, + maxBuffer?: number, + killSignal?: string | number, + uid?: number, + gid?: number, + windowsHide?: boolean, + windowsVerbatimArguments?: boolean, + shell?: boolean | string, + ... +}; + +type child_process$execFileCallback = ( + error: ?child_process$Error, + stdout: string | Buffer, + stderr: string | Buffer, +) => void; + +type child_process$execFileSyncOpts = { + cwd?: string, + input?: string | Buffer | $TypedArray | DataView, + stdio?: string | Array, + env?: Object, + uid?: number, + gid?: number, + timeout?: number, + killSignal?: string | number, + maxBuffer?: number, + encoding?: string, + windowsHide?: boolean, + shell?: boolean | string, + ... +}; + +type child_process$forkOpts = { + cwd?: string, + env?: Object, + execPath?: string, + execArgv?: Array, + silent?: boolean, + stdio?: Array | string, + windowsVerbatimArguments?: boolean, + uid?: number, + gid?: number, + ... +}; + +type child_process$Handle = any; // TODO + +type child_process$spawnOpts = { + cwd?: string, + env?: Object, + argv0?: string, + stdio?: string | Array, + detached?: boolean, + uid?: number, + gid?: number, + shell?: boolean | string, + windowsVerbatimArguments?: boolean, + windowsHide?: boolean, + ... +}; + +type child_process$spawnRet = { + pid: number, + output: Array, + stdout: Buffer | string, + stderr: Buffer | string, + status: number, + signal: string, + error: Error, + ... +}; + +type child_process$spawnSyncOpts = { + cwd?: string, + input?: string | Buffer, + stdio?: string | Array, + env?: Object, + uid?: number, + gid?: number, + timeout?: number, + killSignal?: string, + maxBuffer?: number, + encoding?: 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; + + disconnect(): void; + kill(signal?: string): void; + send( + message: Object, + sendHandleOrCallback?: child_process$Handle, + optionsOrCallback?: Object | Function, + callback?: Function, + ): boolean; + unref(): void; + ref(): void; +} + +declare module 'child_process' { + declare var ChildProcess: typeof child_process$ChildProcess; + + declare function exec( + command: string, + optionsOrCallback?: child_process$execOpts | child_process$execCallback, + callback?: child_process$execCallback, + ): child_process$ChildProcess; + + declare function execSync( + command: string, + options: { + encoding: buffer$NonBufferEncoding, + ... + } & child_process$execSyncOpts, + ): string; + + declare function execSync( + command: string, + options?: child_process$execSyncOpts, + ): Buffer; + + 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; + + declare function execFileSync( + command: string, + argsOrOptions?: Array | child_process$execFileSyncOpts, + options?: child_process$execFileSyncOpts, + ): Buffer | string; + + declare function fork( + modulePath: string, + argsOrOptions?: Array | child_process$forkOpts, + options?: child_process$forkOpts, + ): child_process$ChildProcess; + + declare function spawn( + command: string, + argsOrOptions?: Array | child_process$spawnOpts, + options?: child_process$spawnOpts, + ): child_process$ChildProcess; + + declare function spawnSync( + command: string, + argsOrOptions?: Array | child_process$spawnSyncOpts, + options?: child_process$spawnSyncOpts, + ): child_process$spawnSyncRet; +} + +declare module 'cluster' { + declare type ClusterSettings = { + execArgv: Array, + exec: string, + args: Array, + cwd: string, + serialization: 'json' | 'advanced', + silent: boolean, + stdio: Array, + uid: number, + gid: number, + inspectPort: number | (() => number), + windowsHide: boolean, + ... + }; + + declare type ClusterSettingsOpt = { + execArgv?: Array, + exec?: string, + args?: Array, + cwd?: string, + serialization?: 'json' | 'advanced', + silent?: boolean, + stdio?: Array, + uid?: number, + gid?: number, + inspectPort?: number | (() => number), + windowsHide?: boolean, + ... + }; + + declare class Worker extends events$EventEmitter { + id: number; + process: child_process$ChildProcess; + suicide: boolean; + + disconnect(): void; + isConnected(): boolean; + isDead(): boolean; + kill(signal?: string): void; + send( + message: Object, + sendHandleOrCallback?: child_process$Handle | Function, + callback?: Function, + ): boolean; + } + + declare class Cluster extends events$EventEmitter { + isMaster: boolean; + isWorker: boolean; + settings: ClusterSettings; + worker: Worker; + workers: {[id: number]: Worker}; + + disconnect(callback?: () => void): void; + fork(env?: Object): Worker; + setupMaster(settings?: ClusterSettingsOpt): void; + } + + declare module.exports: Cluster; +} + +type crypto$createCredentialsDetails = any; // TODO + +declare class crypto$Cipher extends stream$Duplex { + final(output_encoding: 'latin1' | 'binary' | 'base64' | 'hex'): string; + final(output_encoding: void): Buffer; + getAuthTag(): Buffer; + setAAD(buffer: Buffer): crypto$Cipher; + setAuthTag(buffer: Buffer): void; + setAutoPadding(auto_padding?: boolean): crypto$Cipher; + update( + data: string, + input_encoding: 'utf8' | 'ascii' | 'latin1' | 'binary', + output_encoding: 'latin1' | 'binary' | 'base64' | 'hex', + ): string; + update( + data: string, + input_encoding: 'utf8' | 'ascii' | 'latin1' | 'binary', + output_encoding: void, + ): Buffer; + update( + data: Buffer, + input_encoding: void | 'utf8' | 'ascii' | 'latin1' | 'binary', + output_encoding: 'latin1' | 'binary' | 'base64' | 'hex', + ): string; + update(data: Buffer, input_encoding: void, output_encoding: void): Buffer; +} + +type crypto$Credentials = {...}; + +type crypto$DiffieHellman = { + computeSecret( + other_public_key: string, + input_encoding?: string, + output_encoding?: string, + ): any, + generateKeys(encoding?: string): any, + getGenerator(encoding?: string): any, + getPrime(encoding?: string): any, + getPrivateKey(encoding?: string): any, + getPublicKey(encoding?: string): any, + setPrivateKey(private_key: any, encoding?: string): void, + setPublicKey(public_key: any, encoding?: string): void, + ... +}; + +type crypto$ECDH$Encoding = 'latin1' | 'hex' | 'base64'; +type crypto$ECDH$Format = 'compressed' | 'uncompressed'; + +declare class crypto$ECDH { + computeSecret(other_public_key: Buffer | $TypedArray | DataView): Buffer; + computeSecret( + other_public_key: string, + input_encoding: crypto$ECDH$Encoding, + ): Buffer; + computeSecret( + other_public_key: Buffer | $TypedArray | DataView, + output_encoding: crypto$ECDH$Encoding, + ): string; + computeSecret( + other_public_key: string, + input_encoding: crypto$ECDH$Encoding, + output_encoding: crypto$ECDH$Encoding, + ): string; + generateKeys(format?: crypto$ECDH$Format): Buffer; + generateKeys( + encoding: crypto$ECDH$Encoding, + format?: crypto$ECDH$Format, + ): string; + getPrivateKey(): Buffer; + getPrivateKey(encoding: crypto$ECDH$Encoding): string; + getPublicKey(format?: crypto$ECDH$Format): Buffer; + getPublicKey( + encoding: crypto$ECDH$Encoding, + format?: crypto$ECDH$Format, + ): string; + setPrivateKey(private_key: Buffer | $TypedArray | DataView): void; + setPrivateKey(private_key: string, encoding: crypto$ECDH$Encoding): void; +} + +declare class crypto$Decipher extends stream$Duplex { + final(output_encoding: 'latin1' | 'binary' | 'ascii' | 'utf8'): string; + final(output_encoding: void): Buffer; + getAuthTag(): Buffer; + setAAD(buffer: Buffer): void; + setAuthTag(buffer: Buffer): void; + setAutoPadding(auto_padding?: boolean): crypto$Cipher; + update( + data: string, + input_encoding: 'latin1' | 'binary' | 'base64' | 'hex', + output_encoding: 'latin1' | 'binary' | 'ascii' | 'utf8', + ): string; + update( + data: string, + input_encoding: 'latin1' | 'binary' | 'base64' | 'hex', + output_encoding: void, + ): Buffer; + update( + data: Buffer, + input_encoding: void, + output_encoding: 'latin1' | 'binary' | 'ascii' | 'utf8', + ): string; + update(data: Buffer, input_encoding: void, output_encoding: void): Buffer; +} + +declare class crypto$Hash extends stream$Duplex { + digest(encoding: 'hex' | 'latin1' | 'binary' | 'base64'): string; + digest(encoding: 'buffer'): Buffer; + digest(encoding: void): Buffer; + update( + data: string | Buffer, + input_encoding?: 'utf8' | 'ascii' | 'latin1' | 'binary', + ): crypto$Hash; +} + +declare class crypto$Hmac extends stream$Duplex { + digest(encoding: 'hex' | 'latin1' | 'binary' | 'base64'): string; + digest(encoding: 'buffer'): Buffer; + digest(encoding: void): Buffer; + update( + data: string | Buffer, + input_encoding?: 'utf8' | 'ascii' | 'latin1' | 'binary', + ): crypto$Hmac; +} + +type crypto$Sign$private_key = + | string + | { + key: string, + passphrase: string, + ... + }; +declare class crypto$Sign extends stream$Writable { + static (algorithm: string, options?: writableStreamOptions): crypto$Sign; + constructor(algorithm: string, options?: writableStreamOptions): void; + sign( + private_key: crypto$Sign$private_key, + output_format: 'latin1' | 'binary' | 'hex' | 'base64', + ): string; + sign(private_key: crypto$Sign$private_key, output_format: void): Buffer; + update( + data: string | Buffer, + input_encoding?: 'utf8' | 'ascii' | 'latin1' | 'binary', + ): crypto$Sign; +} + +declare class crypto$Verify extends stream$Writable { + static (algorithm: string, options?: writableStreamOptions): crypto$Verify; + constructor(algorithm: string, options?: writableStreamOptions): void; + update( + data: string | Buffer, + input_encoding?: 'utf8' | 'ascii' | 'latin1' | 'binary', + ): crypto$Verify; + verify( + object: string, + signature: string | Buffer | $TypedArray | DataView, + signature_format: 'latin1' | 'binary' | 'hex' | 'base64', + ): boolean; + verify(object: string, signature: Buffer, signature_format: void): boolean; +} + +type crypto$key = + | string + | { + key: string, + passphrase?: string, + // TODO: enum type in crypto.constants + padding?: string, + ... + }; + +declare module 'crypto' { + declare var DEFAULT_ENCODING: string; + + declare class Sign extends crypto$Sign {} + declare class Verify extends crypto$Verify {} + + declare function createCipher( + algorithm: string, + password: string | Buffer, + ): crypto$Cipher; + declare function createCipheriv( + algorithm: string, + key: string | Buffer, + iv: string | Buffer, + ): crypto$Cipher; + declare function createCredentials( + details?: crypto$createCredentialsDetails, + ): crypto$Credentials; + declare function createDecipher( + algorithm: string, + password: string | Buffer, + ): crypto$Decipher; + declare function createDecipheriv( + algorithm: string, + key: string | Buffer, + iv: string | Buffer, + ): crypto$Decipher; + declare function createDiffieHellman( + prime_length: number, + ): crypto$DiffieHellman; + declare function createDiffieHellman( + prime: number, + encoding?: string, + ): crypto$DiffieHellman; + declare function createECDH(curveName: string): crypto$ECDH; + declare function createHash(algorithm: string): crypto$Hash; + declare function createHmac( + algorithm: string, + key: string | Buffer, + ): crypto$Hmac; + declare function createSign(algorithm: string): crypto$Sign; + declare function createVerify(algorithm: string): crypto$Verify; + declare function getCiphers(): Array; + declare function getCurves(): Array; + declare function getDiffieHellman(group_name: string): crypto$DiffieHellman; + declare function getHashes(): Array; + declare function pbkdf2( + password: string | Buffer, + salt: string | Buffer, + iterations: number, + keylen: number, + digest: string, + callback: (err: ?Error, derivedKey: Buffer) => void, + ): void; + declare function pbkdf2( + password: string | Buffer, + salt: string | Buffer, + iterations: number, + keylen: number, + callback: (err: ?Error, derivedKey: Buffer) => void, + ): void; + declare function pbkdf2Sync( + password: string | Buffer, + salt: string | Buffer, + iterations: number, + keylen: number, + digest?: string, + ): Buffer; + declare function scrypt( + password: string | Buffer, + salt: string | Buffer, + keylen: number, + options: + | {|N?: number, r?: number, p?: number, maxmem?: number|} + | {| + cost?: number, + blockSize?: number, + parallelization?: number, + maxmem?: number, + |}, + callback: (err: ?Error, derivedKey: Buffer) => void, + ): void; + declare function scrypt( + password: string | Buffer, + salt: string | Buffer, + keylen: number, + callback: (err: ?Error, derivedKey: Buffer) => void, + ): void; + declare function scryptSync( + password: string | Buffer, + salt: string | Buffer, + keylen: number, + options?: + | {|N?: number, r?: number, p?: number, maxmem?: number|} + | {| + cost?: number, + blockSize?: number, + parallelization?: number, + maxmem?: number, + |}, + ): Buffer; + declare function privateDecrypt( + private_key: crypto$key, + buffer: Buffer, + ): Buffer; + declare function privateEncrypt( + private_key: crypto$key, + buffer: Buffer, + ): Buffer; + declare function publicDecrypt(key: crypto$key, buffer: Buffer): Buffer; + declare function publicEncrypt(key: crypto$key, buffer: Buffer): Buffer; + // `UNUSED` argument strictly enforces arity to enable overloading this + // function with 1-arg and 2-arg variants. + declare function pseudoRandomBytes(size: number, UNUSED: void): Buffer; + declare function pseudoRandomBytes( + size: number, + callback: (err: ?Error, buffer: Buffer) => void, + ): void; + // `UNUSED` argument strictly enforces arity to enable overloading this + // function with 1-arg and 2-arg variants. + declare function randomBytes(size: number, UNUSED: void): Buffer; + declare function randomBytes( + size: number, + callback: (err: ?Error, buffer: Buffer) => void, + ): void; + declare function randomFillSync( + buffer: Buffer | $TypedArray | DataView, + ): void; + declare function randomFillSync( + buffer: Buffer | $TypedArray | DataView, + offset: number, + ): void; + declare function randomFillSync( + buffer: Buffer | $TypedArray | DataView, + offset: number, + size: number, + ): void; + declare function randomFill( + buffer: Buffer | $TypedArray | DataView, + callback: (err: ?Error, buffer: Buffer) => void, + ): void; + declare function randomFill( + buffer: Buffer | $TypedArray | DataView, + offset: number, + callback: (err: ?Error, buffer: Buffer) => void, + ): void; + declare function randomFill( + buffer: Buffer | $TypedArray | DataView, + offset: number, + size: number, + callback: (err: ?Error, buffer: Buffer) => void, + ): void; + declare function randomUUID( + options?: $ReadOnly<{|disableEntropyCache?: boolean|}>, + ): string; + declare function timingSafeEqual( + a: Buffer | $TypedArray | DataView, + b: Buffer | $TypedArray | DataView, + ): boolean; +} + +type net$Socket$address = { + address: string, + family: string, + port: number, + ... +}; +type dgram$Socket$rinfo = { + address: string, + family: 'IPv4' | 'IPv6', + port: number, + size: number, + ... +}; + +declare class dgram$Socket extends events$EventEmitter { + addMembership(multicastAddress: string, multicastInterface?: string): void; + address(): net$Socket$address; + bind(port?: number, address?: string, callback?: () => void): void; + close(callback?: () => void): void; + dropMembership(multicastAddress: string, multicastInterface?: string): void; + ref(): void; + send( + msg: Buffer, + port: number, + address: string, + callback?: (err: ?Error, bytes: any) => mixed, + ): void; + send( + msg: Buffer, + offset: number, + length: number, + port: number, + address: string, + callback?: (err: ?Error, bytes: any) => mixed, + ): void; + setBroadcast(flag: boolean): void; + setMulticastLoopback(flag: boolean): void; + setMulticastTTL(ttl: number): void; + setTTL(ttl: number): void; + unref(): void; +} + +declare module 'dgram' { + declare function createSocket( + options: string | {type: string, ...}, + callback?: () => void, + ): dgram$Socket; +} + +declare module 'dns' { + declare var ADDRGETNETWORKPARAMS: string; + declare var BADFAMILY: string; + declare var BADFLAGS: string; + declare var BADHINTS: string; + declare var BADQUERY: string; + declare var BADNAME: string; + declare var BADRESP: string; + declare var BADSTR: string; + declare var CANCELLED: string; + declare var CONNREFUSED: string; + declare var DESTRUCTION: string; + declare var EOF: string; + declare var FILE: string; + declare var FORMER: string; + declare var LOADIPHLPAPI: string; + declare var NODATA: string; + declare var NOMEM: string; + declare var NONAME: string; + declare var NOTFOUND: string; + declare var NOTIMP: string; + declare var NOTINITIALIZED: string; + declare var REFUSED: string; + declare var SERVFAIL: string; + declare var TIMEOUT: string; + declare var ADDRCONFIG: number; + declare var V4MAPPED: number; + + declare type LookupOptions = { + family?: number, + hints?: number, + verbatim?: boolean, + all?: boolean, + ... + }; + + declare function lookup( + domain: string, + options: number | LookupOptions, + callback: (err: ?Error, address: string, family: number) => void, + ): void; + declare function lookup( + domain: string, + callback: (err: ?Error, address: string, family: number) => void, + ): void; + + declare function resolve( + domain: string, + rrtype?: string, + callback?: (err: ?Error, addresses: Array) => void, + ): void; + + declare function resolve4( + domain: string, + callback: (err: ?Error, addresses: Array) => void, + ): void; + + declare function resolve6( + domain: string, + callback: (err: ?Error, addresses: Array) => void, + ): void; + + declare function resolveCname( + domain: string, + callback: (err: ?Error, addresses: Array) => void, + ): void; + + declare function resolveMx( + domain: string, + callback: (err: ?Error, addresses: Array) => void, + ): void; + + declare function resolveNs( + domain: string, + callback: (err: ?Error, addresses: Array) => void, + ): void; + + declare function resolveSrv( + domain: string, + callback: (err: ?Error, addresses: Array) => void, + ): void; + + declare function resolveTxt( + domain: string, + callback: (err: ?Error, addresses: Array) => void, + ): void; + + declare function reverse( + ip: string, + callback: (err: ?Error, domains: Array) => void, + ): void; + declare function timingSafeEqual( + a: Buffer | $TypedArray | DataView, + b: Buffer | $TypedArray | DataView, + ): boolean; +} + +declare class events$EventEmitter { + // deprecated + static listenerCount(emitter: events$EventEmitter, event: string): number; + static defaultMaxListeners: number; + + addListener(event: string, listener: Function): this; + emit(event: string, ...args: Array): boolean; + eventNames(): Array; + listeners(event: string): Array; + listenerCount(event: string): number; + on(event: string, listener: Function): this; + once(event: string, listener: Function): this; + prependListener(event: string, listener: Function): this; + prependOnceListener(event: string, listener: Function): this; + removeAllListeners(event?: string): this; + removeListener(event: string, listener: Function): this; + off(event: string, listener: Function): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + rawListeners(event: string): Array; +} + +declare module 'events' { + // TODO: See the comment above the events$EventEmitter declaration + declare class EventEmitter extends events$EventEmitter { + static EventEmitter: typeof EventEmitter; + } + + declare module.exports: typeof EventEmitter; +} + +declare class domain$Domain extends events$EventEmitter { + members: Array; + + add(emitter: events$EventEmitter): void; + bind(callback: Function): Function; + dispose(): void; + enter(): void; + exit(): void; + intercept(callback: Function): Function; + remove(emitter: events$EventEmitter): void; + run(fn: Function): void; +} + +declare module 'domain' { + declare function create(): domain$Domain; +} + +declare module 'fs' { + declare class Stats { + dev: number; + ino: number; + mode: number; + nlink: number; + uid: number; + gid: number; + rdev: number; + size: number; + blksize: number; + blocks: number; + atimeMs: number; + mtimeMs: number; + ctimeMs: number; + birthtimeMs: number; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; + + isFile(): boolean; + isDirectory(): boolean; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isSymbolicLink(): boolean; + isFIFO(): boolean; + isSocket(): boolean; + } + + declare type PathLike = string | Buffer | URL; + + declare class FSWatcher extends events$EventEmitter { + close(): void; + } + + declare class ReadStream extends stream$Readable { + close(): void; + } + + declare class WriteStream extends stream$Writable { + close(): void; + bytesWritten: number; + } + + declare class Dirent { + name: string | Buffer; + + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isDirectory(): boolean; + isFIFO(): boolean; + isFile(): boolean; + isSocket(): boolean; + isSymbolicLink(): boolean; + } + + declare function rename( + oldPath: string, + newPath: string, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function renameSync(oldPath: string, newPath: string): void; + declare function ftruncate( + fd: number, + len: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function ftruncateSync(fd: number, len: number): void; + declare function truncate( + path: string, + len: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function truncateSync(path: string, len: number): void; + declare function chown( + path: string, + uid: number, + gid: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function chownSync(path: string, uid: number, gid: number): void; + declare function fchown( + fd: number, + uid: number, + gid: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function fchownSync(fd: number, uid: number, gid: number): void; + declare function lchown( + path: string, + uid: number, + gid: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function lchownSync(path: string, uid: number, gid: number): void; + declare function chmod( + path: string, + mode: number | string, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function chmodSync(path: string, mode: number | string): void; + declare function fchmod( + fd: number, + mode: number | string, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function fchmodSync(fd: number, mode: number | string): void; + declare function lchmod( + path: string, + mode: number | string, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function lchmodSync(path: string, mode: number | string): void; + declare function stat( + path: string, + callback?: (err: ?ErrnoError, stats: Stats) => any, + ): void; + declare function statSync(path: string): Stats; + declare function fstat( + fd: number, + callback?: (err: ?ErrnoError, stats: Stats) => any, + ): void; + declare function fstatSync(fd: number): Stats; + declare function lstat( + path: string, + callback?: (err: ?ErrnoError, stats: Stats) => any, + ): void; + declare function lstatSync(path: string): Stats; + declare function link( + srcpath: string, + dstpath: string, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function linkSync(srcpath: string, dstpath: string): void; + declare function symlink( + srcpath: string, + dtspath: string, + type?: string, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function symlinkSync( + srcpath: string, + dstpath: string, + type?: string, + ): void; + declare function readlink( + path: string, + callback: (err: ?ErrnoError, linkString: string) => void, + ): void; + declare function readlinkSync(path: string): string; + declare function realpath( + path: string, + cache?: Object, + callback?: (err: ?ErrnoError, resolvedPath: string) => void, + ): void; + declare function realpathSync(path: string, cache?: Object): string; + declare function unlink( + path: string, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function unlinkSync(path: string): void; + + declare type RmDirOptions = {| + /** + * If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + * `EPERM` error is encountered, Node.js will retry the operation with a linear + * backoff wait of `retryDelay` ms longer on each try. This option represents the + * number of retries. This option is ignored if the `recursive` option is not + * `true`. + * @default 0 + */ + maxRetries?: number | void, + /** + * @deprecated since v14.14.0 In future versions of Node.js and will trigger a warning + * `fs.rmdir(path, { recursive: true })` will throw if `path` does not exist or is a file. + * Use `fs.rm(path, { recursive: true, force: true })` instead. + * + * If `true`, perform a recursive directory removal. In + * recursive mode soperations are retried on failure. + * @default false + */ + recursive?: boolean | void, + /** + * The amount of time in milliseconds to wait between retries. + * This option is ignored if the `recursive` option is not `true`. + * @default 100 + */ + retryDelay?: number | void, + |}; + + declare function rmdir( + path: PathLike, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function rmdir( + path: PathLike, + options: RmDirOptions, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function rmdirSync(path: PathLike, options?: RmDirOptions): void; + + declare type RmOptions = {| + /** + * When `true`, exceptions will be ignored if `path` does not exist. + * @default false + */ + force?: boolean | void, + /** + * If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + * `EPERM` error is encountered, Node.js will retry the operation with a linear + * backoff wait of `retryDelay` ms longer on each try. This option represents the + * number of retries. This option is ignored if the `recursive` option is not + * `true`. + * @default 0 + */ + maxRetries?: number | void, + /** + * If `true`, perform a recursive directory removal. In + * recursive mode, operations are retried on failure. + * @default false + */ + recursive?: boolean | void, + /** + * The amount of time in milliseconds to wait between retries. + * This option is ignored if the `recursive` option is not `true`. + * @default 100 + */ + retryDelay?: number | void, + |}; + + /** + * Asynchronously removes files and directories (modeled on the standard POSIX `rm`utility). No arguments other than a possible exception are given to the + * completion callback. + * @since v14.14.0 + */ + declare function rm( + path: PathLike, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function rm( + path: PathLike, + options: RmOptions, + callback?: (err: ?ErrnoError) => void, + ): void; + + /** + * Synchronously removes files and directories (modeled on the standard POSIX `rm`utility). Returns `undefined`. + * @since v14.14.0 + */ + declare function rmSync(path: PathLike, options?: RmOptions): void; + + declare function mkdir( + path: string, + mode?: + | number + | { + recursive?: boolean, + mode?: number, + ... + }, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function mkdirSync( + path: string, + mode?: + | number + | { + recursive?: boolean, + mode?: number, + ... + }, + ): void; + declare function mkdtemp( + prefix: string, + callback: (err: ?ErrnoError, folderPath: string) => void, + ): void; + declare function mkdtempSync(prefix: string): string; + declare function readdir( + path: string, + options: string | {encoding?: string, withFileTypes?: false, ...}, + callback: (err: ?ErrnoError, files: Array) => void, + ): void; + declare function readdir( + path: string, + options: {encoding?: string, withFileTypes: true, ...}, + callback: (err: ?ErrnoError, files: Array) => void, + ): void; + declare function readdir( + path: string, + callback: (err: ?ErrnoError, files: Array) => void, + ): void; + declare function readdirSync( + path: string, + options?: string | {encoding?: string, withFileTypes?: false, ...}, + ): Array; + declare function readdirSync( + path: string, + options?: string | {encoding?: string, withFileTypes: true, ...}, + ): Array; + declare function close( + fd: number, + callback: (err: ?ErrnoError) => void, + ): void; + declare function closeSync(fd: number): void; + declare function open( + path: string | Buffer | URL, + flags: string | number, + mode: number, + callback: (err: ?ErrnoError, fd: number) => void, + ): void; + declare function open( + path: string | Buffer | URL, + flags: string | number, + callback: (err: ?ErrnoError, fd: number) => void, + ): void; + declare function openSync( + path: string | Buffer, + flags: string | number, + mode?: number, + ): number; + declare function utimes( + path: string, + atime: number, + mtime: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function utimesSync(path: string, atime: number, mtime: number): void; + declare function futimes( + fd: number, + atime: number, + mtime: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function futimesSync(fd: number, atime: number, mtime: number): void; + declare function fsync( + fd: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function fsyncSync(fd: number): void; + declare function write( + fd: number, + buffer: Buffer, + offset: number, + length: number, + position: number, + callback: (err: ?ErrnoError, write: number, buf: Buffer) => void, + ): void; + declare function write( + fd: number, + buffer: Buffer, + offset: number, + length: number, + callback: (err: ?ErrnoError, write: number, buf: Buffer) => void, + ): void; + declare function write( + fd: number, + buffer: Buffer, + offset: number, + callback: (err: ?ErrnoError, write: number, buf: Buffer) => void, + ): void; + declare function write( + fd: number, + buffer: Buffer, + callback: (err: ?ErrnoError, write: number, buf: Buffer) => void, + ): void; + declare function write( + fd: number, + data: string, + position: number, + encoding: string, + callback: (err: ?ErrnoError, write: number, str: string) => void, + ): void; + declare function write( + fd: number, + data: string, + position: number, + callback: (err: ?ErrnoError, write: number, str: string) => void, + ): void; + declare function write( + fd: number, + data: string, + callback: (err: ?ErrnoError, write: number, str: string) => void, + ): void; + declare function writeSync( + fd: number, + buffer: Buffer, + offset: number, + length: number, + position: number, + ): number; + declare function writeSync( + fd: number, + buffer: Buffer, + offset: number, + length: number, + ): number; + declare function writeSync( + fd: number, + buffer: Buffer, + offset?: number, + ): number; + declare function writeSync( + fd: number, + str: string, + position: number, + encoding: string, + ): number; + declare function writeSync( + fd: number, + str: string, + position?: number, + ): number; + declare function read( + fd: number, + buffer: Buffer, + offset: number, + length: number, + position: ?number, + callback: (err: ?ErrnoError, bytesRead: number, buffer: Buffer) => void, + ): void; + declare function readSync( + fd: number, + buffer: Buffer, + offset: number, + length: number, + position: number, + ): number; + declare function readFile( + path: string | Buffer | URL | number, + callback: (err: ?ErrnoError, data: Buffer) => void, + ): void; + declare function readFile( + path: string | Buffer | URL | number, + encoding: string, + callback: (err: ?ErrnoError, data: string) => void, + ): void; + declare function readFile( + path: string | Buffer | URL | number, + options: { + encoding: string, + flag?: string, + ... + }, + callback: (err: ?ErrnoError, data: string) => void, + ): void; + declare function readFile( + path: string | Buffer | URL | number, + options: {encoding?: null | void, flag?: string, ...}, + callback: (err: ?ErrnoError, data: Buffer) => void, + ): void; + declare function readFileSync(path: string | Buffer | URL | number): Buffer; + declare function readFileSync( + path: string | Buffer | URL | number, + encoding: string, + ): string; + declare function readFileSync( + path: string | Buffer | URL | number, + options: { + encoding: string, + flag?: string, + ... + }, + ): string; + declare function readFileSync( + path: string | Buffer | URL | number, + options: { + encoding?: void, + flag?: string, + ... + }, + ): Buffer; + declare function writeFile( + filename: string | Buffer | number, + data: Buffer | string, + options: + | string + | { + encoding?: ?string, + mode?: number, + flag?: string, + ... + }, + callback: (err: ?ErrnoError) => void, + ): void; + declare function writeFile( + filename: string | Buffer | number, + data: Buffer | string, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function writeFileSync( + filename: string, + data: Buffer | string, + options?: + | string + | { + encoding?: ?string, + mode?: number, + flag?: string, + ... + }, + ): void; + declare function appendFile( + filename: string | Buffer | number, + data: string | Buffer, + options: + | string + | { + encoding?: ?string, + mode?: number, + flag?: string, + ... + }, + callback: (err: ?ErrnoError) => void, + ): void; + declare function appendFile( + filename: string | Buffer | number, + data: string | Buffer, + callback: (err: ?ErrnoError) => void, + ): void; + declare function appendFileSync( + filename: string | Buffer | number, + data: string | Buffer, + options?: + | string + | { + encoding?: ?string, + mode?: number, + flag?: string, + ... + }, + ): void; + declare function watchFile( + filename: string, + options?: Object, + listener?: (curr: Stats, prev: Stats) => void, + ): void; + declare function unwatchFile( + filename: string, + listener?: (curr: Stats, prev: Stats) => void, + ): void; + declare function watch( + filename: string, + options?: Object, + listener?: (event: string, filename: string) => void, + ): FSWatcher; + declare function exists( + path: string, + callback?: (exists: boolean) => void, + ): void; + declare function existsSync(path: string): boolean; + declare function access( + path: string, + mode?: number, + callback?: (err: ?ErrnoError) => void, + ): void; + declare function accessSync(path: string, mode?: number): void; + declare function createReadStream(path: string, options?: Object): ReadStream; + declare function createWriteStream( + path: string, + options?: Object, + ): WriteStream; + declare function fdatasync( + fd: number, + callback: (err: ?ErrnoError) => void, + ): void; + declare function fdatasyncSync(fd: number): void; + declare function copyFile( + src: string, + dest: string, + callback: (err: ErrnoError) => void, + ): void; + declare function copyFile( + src: string, + dest: string, + flags?: number, + callback: (err: ErrnoError) => void, + ): void; + declare function copyFileSync( + src: string, + dest: string, + flags?: number, + ): void; + + declare var F_OK: number; + declare var R_OK: number; + declare var W_OK: number; + declare var X_OK: number; + // new var from node 6.x + // https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_constants_1 + declare var constants: { + F_OK: number, // 0 + R_OK: number, // 4 + W_OK: number, // 2 + X_OK: number, // 1 + COPYFILE_EXCL: number, // 1 + COPYFILE_FICLONE: number, // 2 + COPYFILE_FICLONE_FORCE: number, // 4 + O_RDONLY: number, // 0 + O_WRONLY: number, // 1 + O_RDWR: number, // 2 + S_IFMT: number, // 61440 + S_IFREG: number, // 32768 + S_IFDIR: number, // 16384 + S_IFCHR: number, // 8192 + S_IFBLK: number, // 24576 + S_IFIFO: number, // 4096 + S_IFLNK: number, // 40960 + S_IFSOCK: number, // 49152 + O_CREAT: number, // 64 + O_EXCL: number, // 128 + O_NOCTTY: number, // 256 + O_TRUNC: number, // 512 + O_APPEND: number, // 1024 + O_DIRECTORY: number, // 65536 + O_NOATIME: number, // 262144 + O_NOFOLLOW: number, // 131072 + O_SYNC: number, // 1052672 + O_DSYNC: number, // 4096 + O_SYMLINK: number, // 2097152 + O_DIRECT: number, // 16384 + O_NONBLOCK: number, // 2048 + S_IRWXU: number, // 448 + S_IRUSR: number, // 256 + S_IWUSR: number, // 128 + S_IXUSR: number, // 64 + S_IRWXG: number, // 56 + S_IRGRP: number, // 32 + S_IWGRP: number, // 16 + S_IXGRP: number, // 8 + S_IRWXO: number, // 7 + S_IROTH: number, // 4 + S_IWOTH: number, // 2 + S_IXOTH: number, // 1 + ... + }; + + declare type BufferEncoding = 'buffer' | {encoding: 'buffer', ...}; + declare type EncodingOptions = {encoding?: string, ...}; + declare type EncodingFlag = EncodingOptions & {flag?: string, ...}; + declare type WriteOptions = EncodingFlag & {mode?: number, ...}; + declare type RemoveOptions = { + force?: boolean, + maxRetries?: number, + recursive?: boolean, + retryDelay?: number, + ... + }; + declare class FileHandle { + appendFile( + data: string | Buffer, + options: WriteOptions | string, + ): Promise; + chmod(mode: number): Promise; + chown(uid: number, guid: number): Promise; + close(): Promise; + datasync(): Promise; + fd: number; + read( + buffer: T, + offset: number, + length: number, + position: number, + ): Promise<{ + bytesRead: number, + buffer: T, + ... + }>; + readFile(options: EncodingFlag): Promise; + readFile(options: string): Promise; + stat(): Promise; + sync(): Promise; + truncate(len?: number): Promise; + utimes( + atime: number | string | Date, + mtime: number | string | Date, + ): Promise; + write( + buffer: Buffer | Uint8Array, + offset: number, + length: number, + position: number, + ): Promise; + writeFile( + data: string | Buffer | Uint8Array, + options: WriteOptions | string, + ): Promise; + } + + declare type FSPromisePath = string | Buffer | URL; + declare type FSPromise = { + access(path: FSPromisePath, mode?: number): Promise, + appendFile( + path: FSPromisePath | FileHandle, + data: string | Buffer, + options?: WriteOptions | string, + ): Promise, + chmod(path: FSPromisePath, mode: number): Promise, + chown(path: FSPromisePath, uid: number, gid: number): Promise, + copyFile( + src: FSPromisePath, + dest: FSPromisePath, + flags?: number, + ): Promise, + fchmod(filehandle: FileHandle, mode: number): Promise, + fchown(filehandle: FileHandle, uid: number, guid: number): Promise, + fdatasync(filehandle: FileHandle): Promise, + fstat(filehandle: FileHandle): Promise, + fsync(filehandle: FileHandle): Promise, + ftruncate(filehandle: FileHandle, len?: number): Promise, + futimes( + filehandle: FileHandle, + atime: number | string | Date, + mtime: number | string | Date, + ): Promise, + lchmod(path: FSPromisePath, mode: number): Promise, + lchown(path: FSPromisePath, uid: number, guid: number): Promise, + link(existingPath: FSPromisePath, newPath: FSPromisePath): Promise, + lstat(path: FSPromisePath): Promise, + mkdir( + path: FSPromisePath, + mode?: + | number + | { + recursive?: boolean, + mode?: number, + ... + }, + ): Promise, + mkdtemp(prefix: string, options?: EncodingOptions): Promise, + open( + path: FSPromisePath, + flags?: string | number, + mode?: number, + ): Promise, + read( + filehandle: FileHandle, + buffer: T, + offset: number, + length: number, + position?: number, + ): Promise<{ + bytesRead: number, + buffer: T, + ... + }>, + readdir: (( + path: FSPromisePath, + options: string | {encoding?: string, withFileTypes?: false, ...}, + ) => Promise>) & + (( + path: FSPromisePath, + options: {encoding?: string, withFileTypes: true, ...}, + ) => Promise>) & + ((path: FSPromisePath) => Promise>), + readFile: (( + path: FSPromisePath | FileHandle, + options: string, + ) => Promise) & + (( + path: FSPromisePath | FileHandle, + options?: EncodingFlag, + ) => Promise), + readlink: (( + path: FSPromisePath, + options: BufferEncoding, + ) => Promise) & + (( + path: FSPromisePath, + options?: string | EncodingOptions, + ) => Promise), + realpath: (( + path: FSPromisePath, + options: BufferEncoding, + ) => Promise) & + (( + path: FSPromisePath, + options?: string | EncodingOptions, + ) => Promise), + rename(oldPath: FSPromisePath, newPath: FSPromisePath): Promise, + rm(path: FSPromisePath, options?: RemoveOptions): Promise, + rmdir(path: FSPromisePath): Promise, + stat(path: FSPromisePath): Promise, + symlink( + target: FSPromisePath, + path: FSPromisePath, + type?: 'dir' | 'file' | 'junction', + ): Promise, + truncate(path: FSPromisePath, len?: number): Promise, + unlink(path: FSPromisePath): Promise, + utimes( + path: FSPromisePath, + atime: number | string | Date, + mtime: number | string | Date, + ): Promise, + write( + filehandle: FileHandle, + buffer: T, + offset: number, + length: number, + position?: number, + ): Promise<{ + bytesRead: number, + buffer: T, + ... + }>, + writeFile( + FSPromisePath | FileHandle, + data: string | Buffer | Uint8Array, + options?: string | WriteOptions, + ): Promise, + ... + }; + + declare var promises: FSPromise; +} + +type http$agentOptions = { + keepAlive?: boolean, + keepAliveMsecs?: number, + maxSockets?: number, + maxFreeSockets?: number, + ... +}; + +declare class http$Agent<+SocketT = net$Socket> { + constructor(options: http$agentOptions): void; + destroy(): void; + freeSockets: {[name: string]: $ReadOnlyArray, ...}; + getName(options: { + host: string, + port: number, + localAddress: string, + ... + }): string; + maxFreeSockets: number; + maxSockets: number; + requests: {[name: string]: $ReadOnlyArray>, ...}; + sockets: {[name: string]: $ReadOnlyArray, ...}; +} + +declare class http$IncomingMessage + extends stream$Readable +{ + headers: Object; + rawHeaders: Array; + httpVersion: string; + method: string; + trailers: Object; + setTimeout(msecs: number, callback: Function): void; + socket: SocketT; + statusCode: number; + statusMessage: string; + url: string; + aborted: boolean; + complete: boolean; + rawTrailers: Array; +} + +declare class http$ClientRequest<+SocketT = net$Socket> + extends stream$Writable +{ + abort(): void; + aborted: boolean; + +connection: SocketT | null; + flushHeaders(): void; + getHeader(name: string): string; + removeHeader(name: string): void; + setHeader(name: string, value: string | Array): void; + setNoDelay(noDelay?: boolean): void; + setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; + setTimeout(msecs: number, callback?: Function): void; + +socket: SocketT | null; +} + +declare class http$ServerResponse extends stream$Writable { + addTrailers(headers: {[key: string]: string, ...}): void; + connection: net$Socket; + finished: boolean; + flushHeaders(): void; + getHeader(name: string): string; + getHeaderNames(): Array; + getHeaders(): {[key: string]: string | Array, ...}; + hasHeader(name: string): boolean; + headersSent: boolean; + removeHeader(name: string): void; + sendDate: boolean; + setHeader(name: string, value: string | Array): void; + setTimeout(msecs: number, callback?: Function): http$ServerResponse; + socket: net$Socket; + statusCode: number; + statusMessage: string; + writeContinue(): void; + writeHead( + status: number, + statusMessage?: string, + headers?: {[key: string]: string, ...}, + ): void; + writeHead(status: number, headers?: {[key: string]: string, ...}): void; + writeProcessing(): void; +} + +declare class http$Server extends net$Server { + listen( + port?: number, + hostname?: string, + backlog?: number, + callback?: Function, + ): this; + // The following signatures are added to allow omitting intermediate arguments + listen(port?: number, backlog?: number, callback?: Function): this; + listen(port?: number, hostname?: string, callback?: Function): this; + listen(port?: number, callback?: Function): this; + listen(path: string, callback?: Function): this; + listen( + handle: { + port?: number, + host?: string, + path?: string, + backlog?: number, + exclusive?: boolean, + readableAll?: boolean, + writableAll?: boolean, + ipv6Only?: boolean, + ... + }, + callback?: Function, + ): this; + listening: boolean; + close(callback?: (error: ?Error) => mixed): this; + closeAllConnections(): void; + closeIdleConnections(): void; + maxHeadersCount: number; + keepAliveTimeout: number; + headersTimeout: number; + setTimeout(msecs: number, callback: Function): this; + timeout: number; +} + +declare class https$Server extends tls$Server { + listen( + port?: number, + hostname?: string, + backlog?: number, + callback?: Function, + ): this; + // The following signatures are added to allow omitting intermediate arguments + listen(port?: number, backlog?: number, callback?: Function): this; + listen(port?: number, hostname?: string, callback?: Function): this; + listen(port?: number, callback?: Function): this; + listen(path: string, callback?: Function): this; + listen( + handle: { + port?: number, + host?: string, + path?: string, + backlog?: number, + exclusive?: boolean, + readableAll?: boolean, + writableAll?: boolean, + ipv6Only?: boolean, + ... + }, + callback?: Function, + ): this; + close(callback?: (error: ?Error) => mixed): this; + closeAllConnections(): void; + closeIdleConnections(): void; + keepAliveTimeout: number; + headersTimeout: number; + setTimeout(msecs: number, callback: Function): this; + timeout: number; +} + +type requestOptions = {| + auth?: string, + defaultPort?: number, + family?: number, + headers?: {[key: string]: mixed, ...}, + host?: string, + hostname?: string, + localAddress?: string, + method?: string, + path?: string, + port?: number, + protocol?: string, + setHost?: boolean, + socketPath?: string, + timeout?: number, +|}; + +type http$requestOptions = { + ...requestOptions, + agent?: boolean | http$Agent, + createConnection?: ( + options: net$connectOptions, + callback?: Function, + ) => net$Socket, + ... +}; + +declare module 'http' { + declare class Server extends http$Server {} + declare class Agent extends http$Agent { + createConnection( + options: net$connectOptions, + callback?: Function, + ): net$Socket; + } + declare class ClientRequest extends http$ClientRequest {} + declare class IncomingMessage extends http$IncomingMessage {} + declare class ServerResponse extends http$ServerResponse {} + + declare function createServer( + requestListener?: ( + request: IncomingMessage, + response: ServerResponse, + ) => void, + ): Server; + declare function request( + options: http$requestOptions, + callback?: (response: IncomingMessage) => void, + ): ClientRequest; + declare function request( + url: string, + options?: http$requestOptions, + callback?: (response: IncomingMessage) => void, + ): ClientRequest; + declare function get( + options: http$requestOptions, + callback?: (response: IncomingMessage) => void, + ): ClientRequest; + declare function get( + url: string, + options?: http$requestOptions, + callback?: (response: IncomingMessage) => void, + ): ClientRequest; + + declare var METHODS: Array; + declare var STATUS_CODES: {[key: number]: string, ...}; + declare var globalAgent: Agent; +} + +type https$requestOptions = { + ...requestOptions, + agent?: boolean | http$Agent, + createConnection?: ( + options: tls$connectOptions, + callback?: Function, + ) => tls$TLSSocket, + ... +}; + +declare module 'https' { + declare class Server extends https$Server {} + declare class Agent extends http$Agent { + createConnection( + port: ?number, + host: ?string, + options: tls$connectOptions, + ): tls$TLSSocket; + createConnection(port: ?number, options: tls$connectOptions): tls$TLSSocket; + createConnection(options: tls$connectOptions): tls$TLSSocket; + } + + declare class ClientRequest extends http$ClientRequest {} + declare class IncomingMessage extends http$IncomingMessage {} + declare class ServerResponse extends http$ServerResponse {} + + declare function createServer( + options: Object, + requestListener?: ( + request: IncomingMessage, + response: ServerResponse, + ) => void, + ): Server; + declare function request( + options: https$requestOptions, + callback?: (response: IncomingMessage) => void, + ): ClientRequest; + declare function request( + url: string, + options?: https$requestOptions, + callback?: (response: IncomingMessage) => void, + ): ClientRequest; + declare function get( + options: https$requestOptions, + callback?: (response: IncomingMessage) => void, + ): ClientRequest; + declare function get( + url: string, + options?: https$requestOptions, + callback?: (response: IncomingMessage) => void, + ): ClientRequest; + + declare var globalAgent: Agent; +} + +type module$Module = { + builtinModules: Array, + createRequire(filename: string | URL): typeof require, + syncBuiltinESMExports(): void, + Module: module$Module, + ... +}; + +declare module 'module' { + declare module.exports: module$Module; +} + +declare class net$Socket extends stream$Duplex { + constructor(options?: Object): void; + address(): net$Socket$address; + bufferSize: number; + bytesRead: number; + bytesWritten: number; + connect(path: string, connectListener?: () => mixed): net$Socket; + connect( + port: number, + host?: string, + connectListener?: () => mixed, + ): net$Socket; + connect(port: number, connectListener?: () => mixed): net$Socket; + connect(options: Object, connectListener?: () => mixed): net$Socket; + destroyed: boolean; + end( + chunkOrEncodingOrCallback?: + | Buffer + | Uint8Array + | string + | ((data: any) => void), + encodingOrCallback?: string | ((data: any) => void), + callback?: (data: any) => void, + ): this; + localAddress: string; + localPort: number; + pause(): this; + ref(): this; + remoteAddress: string | void; + remoteFamily: string; + remotePort: number; + resume(): this; + setEncoding(encoding?: string): this; + setKeepAlive(enable?: boolean, initialDelay?: number): this; + setNoDelay(noDelay?: boolean): this; + setTimeout(timeout: number, callback?: Function): this; + unref(): this; + write( + chunk: Buffer | Uint8Array | string, + encodingOrCallback?: string | ((data: any) => void), + callback?: (data: any) => void, + ): boolean; +} + +declare class net$Server extends events$EventEmitter { + listen( + port?: number, + hostname?: string, + backlog?: number, + callback?: Function, + ): net$Server; + listen(path: string, callback?: Function): net$Server; + listen(handle: Object, callback?: Function): net$Server; + listening: boolean; + close(callback?: Function): net$Server; + address(): net$Socket$address; + connections: number; + maxConnections: number; + getConnections(callback: Function): void; + ref(): net$Server; + unref(): net$Server; +} + +type net$connectOptions = { + port?: number, + host?: string, + localAddress?: string, + localPort?: number, + family?: number, + lookup?: ( + domain: string, + options?: ?number | ?Object, + callback?: (err: ?Error, address: string, family: number) => void, + ) => mixed, + path?: string, + ... +}; + +declare module 'net' { + declare class Server extends net$Server {} + declare class Socket extends net$Socket {} + + declare function isIP(input: string): number; + declare function isIPv4(input: string): boolean; + declare function isIPv6(input: string): boolean; + + declare type connectionListener = (socket: Socket) => any; + declare function createServer( + options?: + | { + allowHalfOpen?: boolean, + pauseOnConnect?: boolean, + ... + } + | connectionListener, + connectionListener?: connectionListener, + ): Server; + + declare type connectListener = () => any; + declare function connect( + pathOrPortOrOptions: string | number | net$connectOptions, + hostOrConnectListener?: string | connectListener, + connectListener?: connectListener, + ): Socket; + + declare function createConnection( + pathOrPortOrOptions: string | number | net$connectOptions, + hostOrConnectListener?: string | connectListener, + connectListener?: connectListener, + ): Socket; +} + +type os$CPU = { + model: string, + speed: number, + times: { + idle: number, + irq: number, + nice: number, + sys: number, + user: number, + ... + }, + ... +}; + +type os$NetIFAddr = { + address: string, + family: string, + internal: boolean, + mac: string, + netmask: string, + ... +}; + +type os$UserInfo$buffer = { + uid: number, + gid: number, + username: Buffer, + homedir: Buffer, + shell: ?Buffer, + ... +}; + +type os$UserInfo$string = { + uid: number, + gid: number, + username: string, + homedir: string, + shell: ?string, + ... +}; + +declare module 'os' { + declare function arch(): 'x64' | 'arm' | 'ia32'; + declare function availableParallelism(): number; + declare function cpus(): Array; + declare function endianness(): 'BE' | 'LE'; + declare function freemem(): number; + declare function homedir(): string; + declare function hostname(): string; + declare function loadavg(): [number, number, number]; + declare function networkInterfaces(): { + [ifName: string]: Array, + ... + }; + declare function platform(): string; + declare function release(): string; + 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 var EOL: string; +} + +declare module 'path' { + declare function normalize(path: string): string; + declare function join(...parts: Array): string; + declare function resolve(...parts: Array): string; + declare function isAbsolute(path: string): boolean; + declare function relative(from: string, to: string): string; + declare function dirname(path: string): string; + declare function basename(path: string, ext?: string): string; + declare function extname(path: string): string; + declare var sep: string; + declare var delimiter: string; + declare function parse(pathString: string): { + root: string, + dir: string, + 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 module 'punycode' { + declare function decode(string: string): string; + declare function encode(string: string): string; + declare function toASCII(domain: string): string; + declare function toUnicode(domain: string): string; + declare var ucs2: { + decode: (str: string) => Array, + encode: (codePoints: Array) => string, + ... + }; + declare var version: string; +} + +declare module 'querystring' { + declare function stringify( + obj: Object, + separator?: string, + equal?: string, + options?: {encodeURIComponent?: (str: string) => string, ...}, + ): string; + declare function parse( + str: string, + separator: ?string, + equal: ?string, + options?: { + decodeURIComponent?: (str: string) => string, + maxKeys?: number, + ... + }, + ): any; + declare function escape(str: string): string; + declare function unescape(str: string, decodeSpaces?: boolean): string; +} + +type readline$InterfaceCompleter = ( + line: string, +) => + | [Array, string] + | (( + line: string, + ((err: ?Error, data: [Array, string]) => void), + ) => void); + +declare class readline$Interface extends events$EventEmitter { + close(): void; + pause(): void; + prompt(preserveCursor?: boolean): void; + question(query: string, callback: (answer: string) => void): void; + resume(): void; + setPrompt(prompt: string): void; + write( + val: string | void | null, + key?: { + name: string, + ctrl?: boolean, + shift?: boolean, + meta?: boolean, + ... + }, + ): void; + @@asyncIterator(): AsyncIterator; +} + +declare module 'readline' { + declare var Interface: typeof readline$Interface; + declare function clearLine(stream: stream$Stream, dir: -1 | 1 | 0): void; + declare function clearScreenDown(stream: stream$Stream): void; + declare function createInterface(opts: { + input: stream$Readable, + output?: ?stream$Stream, + completer?: readline$InterfaceCompleter, + terminal?: boolean, + historySize?: number, + prompt?: string, + crlfDelay?: number, + removeHistoryDuplicates?: boolean, + escapeCodeTimeout?: number, + ... + }): readline$Interface; + declare function cursorTo( + stream: stream$Stream, + x?: number, + y?: number, + ): void; + declare function moveCursor( + stream: stream$Stream, + dx: number, + dy: number, + ): void; + declare function emitKeypressEvents( + stream: stream$Stream, + readlineInterface?: readline$Interface, + ): void; +} + +declare class stream$Stream extends events$EventEmitter {} + +type readableStreamOptions = { + highWaterMark?: number, + encoding?: string, + objectMode?: boolean, + read?: (size: number) => void, + destroy?: (error: ?Error, callback: (error?: Error) => void) => void, + autoDestroy?: boolean, + ... +}; +declare class stream$Readable extends stream$Stream { + static from( + iterable: Iterable | AsyncIterable, + options?: readableStreamOptions, + ): stream$Readable; + + constructor(options?: readableStreamOptions): void; + destroy(error?: Error): this; + isPaused(): boolean; + pause(): this; + pipe(dest: T, options?: {end?: boolean, ...}): T; + read(size?: number): ?(string | Buffer); + readable: boolean; + readableHighWaterMark: number; + readableLength: number; + resume(): this; + setEncoding(encoding: string): this; + unpipe(dest?: stream$Writable): this; + unshift(chunk: Buffer | Uint8Array | string): void; + wrap(oldReadable: stream$Stream): this; + _read(size: number): void; + _destroy(error: ?Error, callback: (error?: Error) => void): void; + push(chunk: ?(Buffer | Uint8Array | string), encoding?: string): boolean; + @@asyncIterator(): AsyncIterator; +} + +type writableStreamOptions = { + highWaterMark?: number, + decodeStrings?: boolean, + defaultEncoding?: string, + objectMode?: boolean, + emitClose?: boolean, + write?: ( + chunk: Buffer | string, + encoding: string, + callback: (error?: Error) => void, + ) => void, + writev?: ( + chunks: Array<{ + chunk: Buffer | string, + encoding: string, + ... + }>, + callback: (error?: Error) => void, + ) => void, + destroy?: (error: ?Error, callback: (error?: Error) => void) => void, + final?: (callback: (error?: Error) => void) => void, + autoDestroy?: boolean, + ... +}; +declare class stream$Writable extends stream$Stream { + constructor(options?: writableStreamOptions): void; + cork(): void; + destroy(error?: Error): this; + end(callback?: () => void): this; + end(chunk?: string | Buffer | Uint8Array, callback?: () => void): this; + end( + chunk?: string | Buffer | Uint8Array, + encoding?: string, + callback?: () => void, + ): this; + setDefaultEncoding(encoding: string): this; + uncork(): void; + writable: boolean; + writableHighWaterMark: number; + writableLength: number; + write( + chunk: string | Buffer | Uint8Array, + callback?: (error?: Error) => void, + ): boolean; + write( + chunk: string | Buffer | Uint8Array, + encoding?: string, + callback?: (error?: Error) => void, + ): boolean; + _write( + chunk: Buffer | string, + encoding: string, + callback: (error?: Error) => void, + ): void; + _writev( + chunks: Array<{ + chunk: Buffer | string, + encoding: string, + ... + }>, + callback: (error?: Error) => void, + ): void; + _destroy(error: ?Error, callback: (error?: Error) => void): void; + _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: void) => void, + transform?: ( + chunk: Buffer | string, + encoding: string, + callback: (error: ?Error, data: ?(Buffer | string)) => void, + ) => void, + ... +}; +declare class stream$Transform extends stream$Duplex { + constructor(options?: transformStreamOptions): void; + _flush(callback: (error: ?Error, data: ?(Buffer | string)) => void): void; + _transform( + chunk: Buffer | string, + encoding: string, + callback: (error: ?Error, data: ?(Buffer | string)) => void, + ): void; +} +declare class stream$PassThrough extends stream$Transform {} + +declare module 'stream' { + declare var Stream: typeof stream$Stream; + declare var Readable: typeof stream$Readable; + declare var Writable: typeof stream$Writable; + declare var Duplex: typeof stream$Duplex; + declare var Transform: typeof stream$Transform; + declare var PassThrough: typeof stream$PassThrough; + declare function finished( + stream: stream$Stream, + callback: (error?: Error) => void, + ): () => void; + declare function finished( + stream: stream$Stream, + options: ?{ + error?: boolean, + readable?: boolean, + writable?: boolean, + ... + }, + callback: (error?: Error) => void, + ): () => void; + declare function pipeline( + s1: stream$Readable, + last: T, + cb: (error?: Error) => void, + ): T; + declare function pipeline( + s1: stream$Readable, + s2: stream$Duplex, + last: T, + cb: (error?: Error) => void, + ): T; + declare function pipeline( + s1: stream$Readable, + s2: stream$Duplex, + s3: stream$Duplex, + last: T, + cb: (error?: Error) => void, + ): T; + declare function pipeline( + s1: stream$Readable, + s2: stream$Duplex, + s3: stream$Duplex, + s4: stream$Duplex, + last: T, + cb: (error?: Error) => void, + ): T; + declare function pipeline( + s1: stream$Readable, + s2: stream$Duplex, + s3: stream$Duplex, + s4: stream$Duplex, + s5: stream$Duplex, + last: T, + cb: (error?: Error) => void, + ): T; + declare function pipeline( + s1: stream$Readable, + s2: stream$Duplex, + s3: stream$Duplex, + s4: stream$Duplex, + s5: stream$Duplex, + s6: stream$Duplex, + last: T, + cb: (error?: Error) => void, + ): T; + declare function pipeline( + streams: Array, + cb: (error?: Error) => void, + ): stream$Stream; + + declare interface StreamPipelineOptions { + +signal?: AbortSignal; + +end?: boolean; + } + + declare type StreamPromise = { + pipeline( + s1: stream$Readable, + last: stream$Writable, + options?: StreamPipelineOptions, + ): Promise, + pipeline( + s1: stream$Readable, + s2: stream$Duplex, + last: stream$Writable, + options?: StreamPipelineOptions, + ): Promise, + pipeline( + s1: stream$Readable, + s2: stream$Duplex, + s3: stream$Duplex, + last: stream$Writable, + options?: StreamPipelineOptions, + ): Promise, + pipeline( + s1: stream$Readable, + s2: stream$Duplex, + s3: stream$Duplex, + s4: stream$Duplex, + last: stream$Writable, + options?: StreamPipelineOptions, + ): Promise, + pipeline( + s1: stream$Readable, + s2: stream$Duplex, + s3: stream$Duplex, + s4: stream$Duplex, + s5: stream$Duplex, + last: stream$Writable, + options?: StreamPipelineOptions, + ): Promise, + pipeline( + s1: stream$Readable, + s2: stream$Duplex, + s3: stream$Duplex, + s4: stream$Duplex, + s5: stream$Duplex, + s6: stream$Duplex, + last: stream$Writable, + options?: StreamPipelineOptions, + ): Promise, + pipeline( + streams: $ReadOnlyArray, + options?: StreamPipelineOptions, + ): Promise, + ... + }; + + declare var promises: StreamPromise; +} + +declare class tty$ReadStream extends net$Socket { + constructor(fd: number, options?: Object): void; + isRaw: boolean; + setRawMode(mode: boolean): void; + isTTY: true; +} +declare class tty$WriteStream extends net$Socket { + constructor(fd: number): void; + /** + * Clears the current line of this `WriteStream` in a direction identified by `dir`. + * + * TODO: takes a callback and returns `boolean` in v12+ + */ + clearLine(dir: -1 | 0 | 1): void; + columns: number; + /** + * Moves this WriteStream's cursor to the specified position + * + * TODO: takes a callback and returns `boolean` in v12+ + */ + cursorTo(x: number, y?: number): void; + isTTY: true; + /** + * Moves this WriteStream's cursor relative to its current position + * + * TODO: takes a callback and returns `boolean` in v12+ + */ + moveCursor(dx: number, dy: number): void; + rows: number; + + /** + * Clears this WriteStream from the current cursor down. + */ + clearScreenDown(callback?: () => void): boolean; + + /** + * Use this to determine what colors the terminal supports. Due to the nature of colors in terminals it is possible to either have false positives or false negatives. It depends on process information and the environment variables that may lie about what terminal is used. It is possible to pass in an env object to simulate the usage of a specific terminal. This can be useful to check how specific environment settings behave. + * To enforce a specific color support, use one of the below environment settings. + * + * 2 colors: FORCE_COLOR = 0 (Disables colors) + * 16 colors: FORCE_COLOR = 1 + * 256 colors: FORCE_COLOR = 2 + * 16,777,216 colors: FORCE_COLOR = 3 + * Disabling color support is also possible by using the NO_COLOR and NODE_DISABLE_COLORS environment variables. + */ + getColorDepth(env?: typeof process.env): + | 1 // 2 + | 4 // 16 + | 8 // 256 + | 24; // 16,777,216 + + /** + * Returns the size of the TTY corresponding to this WriteStream. The array is of the type [numColumns, numRows] where numColumns and numRows represent the number of columns and rows in the corresponding TTY. + */ + getWindowSize(): [ + number, // columns + number, // rows + ]; + + /** + * - count The number of colors that are requested (minimum 2). Default: 16. + * - env An object containing the environment variables to check. This enables simulating the usage of a specific terminal. Default: process.env. + * - Returns: + * + * Returns true if the writeStream supports at least as many colors as provided in count. Minimum support is 2 (black and white). + * + * This has the same false positives and negatives as described in tty$WriteStream#getColorDepth(). + */ + hasColors(count?: number, env?: typeof process.env): boolean; +} + +declare module 'tty' { + declare function isatty(fd: number): boolean; + declare function setRawMode(mode: boolean): void; + declare var ReadStream: typeof tty$ReadStream; + declare var WriteStream: typeof tty$WriteStream; +} + +declare class string_decoder$StringDecoder { + constructor(encoding?: 'utf8' | 'ucs2' | 'utf16le' | 'base64'): void; + end(): string; + write(buffer: Buffer): string; +} + +declare module 'string_decoder' { + declare var StringDecoder: typeof string_decoder$StringDecoder; +} + +type tls$connectOptions = { + port?: number, + host?: string, + socket?: net$Socket, + rejectUnauthorized?: boolean, + path?: string, + lookup?: ( + domain: string, + options?: ?number | ?Object, + callback?: (err: ?Error, address: string, family: number) => void, + ) => mixed, + requestOCSP?: boolean, + ... +}; + +type tls$Certificate$Subject = { + C?: string, + ST?: string, + L?: string, + O?: string, + OU?: string, + CN?: string, + ... +}; + +type tls$Certificate = { + raw: Buffer, + subject: tls$Certificate$Subject, + issuer: tls$Certificate$Subject, + valid_from: string, + valid_to: string, + serialNumber: string, + fingerprint: string, + fingerprint256: string, + ext_key_usage?: Array, + subjectaltname?: string, + infoAccess?: {[string]: Array, ...}, + issuerCertificate?: tls$Certificate, + ... +}; + +declare class tls$TLSSocket extends net$Socket { + constructor(socket: net$Socket, options?: Object): void; + authorized: boolean; + authorizationError: string | null; + encrypted: true; + getCipher(): { + name: string, + version: string, + ... + } | null; + getEphemeralKeyInfo(): + | { + type: 'DH', + size: number, + ... + } + | { + type: 'EDHC', + name: string, + size: number, + ... + } + | null; + getPeerCertificate(detailed?: boolean): tls$Certificate | null; + getSession(): ?Buffer; + getTLSTicket(): Buffer | void; + renegotiate(options: Object, callback: Function): boolean | void; + setMaxSendFragment(size: number): boolean; +} + +declare class tls$Server extends net$Server { + listen( + port?: number, + hostname?: string, + backlog?: number, + callback?: Function, + ): tls$Server; + listen(path: string, callback?: Function): tls$Server; + listen(handle: Object, callback?: Function): tls$Server; + close(callback?: Function): tls$Server; + addContext(hostname: string, context: Object): void; + getTicketKeys(): Buffer; + setTicketKeys(keys: Buffer): void; +} + +declare module 'tls' { + declare var CLIENT_RENEG_LIMIT: number; + declare var CLIENT_RENEG_WINDOW: number; + declare var SLAB_BUFFER_SIZE: number; + declare var DEFAULT_CIPHERS: string; + declare var DEFAULT_ECDH_CURVE: string; + declare function getCiphers(): Array; + declare function convertNPNProtocols( + NPNProtocols: Array, + out: Object, + ): void; + declare function checkServerIdentity( + servername: string, + cert: string, + ): Error | void; + declare function parseCertString(s: string): Object; + declare function createSecureContext(details: Object): Object; + declare var SecureContext: Object; + declare var TLSSocket: typeof tls$TLSSocket; + declare var Server: typeof tls$Server; + declare function createServer( + options: Object, + secureConnectionListener?: Function, + ): tls$Server; + declare function connect( + options: tls$connectOptions, + callback?: Function, + ): tls$TLSSocket; + declare function connect( + port: number, + host?: string, + options?: tls$connectOptions, + callback?: Function, + ): tls$TLSSocket; + declare function createSecurePair( + context?: Object, + isServer?: boolean, + requestCert?: boolean, + rejectUnauthorized?: boolean, + options?: Object, + ): Object; +} + +type url$urlObject = { + +href?: string, + +protocol?: string | null, + +slashes?: boolean | null, + +auth?: string | null, + +hostname?: string | null, + +port?: string | number | null, + +host?: string | null, + +pathname?: string | null, + +search?: string | null, + +query?: Object | null, + +hash?: string | null, + ... +}; + +declare module 'url' { + declare type Url = {| + protocol: string | null, + slashes: boolean | null, + auth: string | null, + host: string | null, + port: string | null, + hostname: string | null, + hash: string | null, + search: string | null, + query: string | null | {[string]: string, ...}, + pathname: string | null, + path: string | null, + href: string, + |}; + + declare type UrlWithStringQuery = {| + ...Url, + query: string | null, + |}; + + declare type UrlWithParsedQuery = {| + ...Url, + query: {[string]: string, ...}, + |}; + + declare function parse( + urlStr: string, + parseQueryString: true, + slashesDenoteHost?: boolean, + ): UrlWithParsedQuery; + declare function parse( + urlStr: string, + parseQueryString?: false | void, + slashesDenoteHost?: boolean, + ): UrlWithStringQuery; + declare function parse( + urlStr: string, + parseQueryString?: boolean, + slashesDenoteHost?: boolean, + ): Url; + declare function format(urlObj: url$urlObject): string; + 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 class URLSearchParams { + @@iterator(): Iterator<[string, string]>; + + size: number; + + constructor( + init?: + | string + | URLSearchParams + | Array<[string, string]> + | {[string]: string, ...}, + ): void; + append(name: string, value: string): void; + delete(name: string, value?: void): void; + entries(): Iterator<[string, string]>; + forEach( + callback: ( + this: This, + value: string, + name: string, + searchParams: URLSearchParams, + ) => mixed, + thisArg?: This, + ): void; + get(name: string): string | null; + getAll(name: string): string[]; + has(name: string, value?: string): boolean; + keys(): Iterator; + set(name: string, value: string): void; + sort(): void; + values(): Iterator; + toString(): string; + } + declare class URL { + static canParse(url: string, base?: string): boolean; + static createObjectURL(blob: Blob): string; + static createObjectURL(mediaSource: MediaSource): string; + static revokeObjectURL(url: string): void; + constructor(input: string, base?: string | URL): void; + hash: string; + host: string; + hostname: string; + href: string; + +origin: string; + password: string; + pathname: string; + port: string; + protocol: string; + search: string; + +searchParams: URLSearchParams; + username: string; + toString(): string; + toJSON(): string; + } +} + +type util$InspectOptions = { + showHidden?: boolean, + depth?: ?number, + colors?: boolean, + customInspect?: boolean, + ... +}; + +declare type util$ParseArgsOption = + | {| + type: 'boolean', + multiple?: false, + short?: string, + default?: boolean, + |} + | {| + type: 'boolean', + multiple: true, + short?: string, + default?: Array, + |} + | {| + type: 'string', + multiple?: false, + short?: string, + default?: string, + |} + | {| + type: 'string', + multiple: true, + short?: string, + default?: Array, + |}; + +type util$ParseArgsOptionToValue = TOption['type'] extends 'boolean' + ? TOption['multiple'] extends true + ? Array + : boolean + : TOption['type'] extends 'string' + ? TOption['multiple'] extends true + ? Array + : string + : empty; + +type util$ParseArgsOptionsToValues = { + [key in keyof TOptions]: util$ParseArgsOptionToValue<{| + multiple: false, + ...TOptions[key], + |}>, +}; + +type util$ParseArgsToken = + | {| + kind: 'option', + index: number, + name: string, + rawName: string, + value?: string, + inlineValue?: boolean, + |} + | {| + kind: 'positional', + index: number, + value: string, + |} + | {| + kind: 'option-terminator', + index: number, + |}; + +declare module 'util' { + declare function debuglog(section: string): (data: any, ...args: any) => void; + declare function format(format: string, ...placeholders: any): string; + declare function log(string: string): void; + declare function inspect(object: any, options?: util$InspectOptions): string; + declare function isArray(object: any): boolean; + declare function isRegExp(object: any): boolean; + declare function isDate(object: any): boolean; + declare function isError(object: any): boolean; + declare function inherits( + constructor: Function, + superConstructor: Function, + ): void; + declare function deprecate(f: Function, string: string): Function; + declare function promisify(f: Function): Function; + declare function callbackify(f: Function): Function; + declare function stripVTControlCharacters(str: string): string; + + declare function parseArgs< + TOptions: {[string]: util$ParseArgsOption} = {||}, + >(config: {| + args?: Array, + options?: TOptions, + strict?: boolean, + allowPositionals?: boolean, + tokens?: false, + |}): {| + values: util$ParseArgsOptionsToValues, + positionals: Array, + |}; + + declare function parseArgs< + TOptions: {[string]: util$ParseArgsOption} = {||}, + >(config: {| + args?: Array, + options?: TOptions, + strict?: boolean, + allowPositionals?: boolean, + tokens: true, + |}): {| + values: util$ParseArgsOptionsToValues, + positionals: Array, + tokens: Array, + |}; + + declare class TextDecoder { + constructor( + encoding?: string, + options: { + fatal?: boolean, + ignoreBOM?: boolean, + ... + }, + ): void; + decode( + input?: ArrayBuffer | DataView | $TypedArray, + options?: {stream?: boolean, ...}, + ): string; + encoding: string; + fatal: boolean; + ignoreBOM: boolean; + } + + declare class TextEncoder { + constructor(): void; + encode(input?: string): Uint8Array; + encoding: string; + } + + 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, + ... + }; +} + +type vm$ScriptOptions = { + cachedData?: Buffer, + columnOffset?: number, + displayErrors?: boolean, + filename?: string, + lineOffset?: number, + produceCachedData?: boolean, + timeout?: number, + ... +}; + +type vm$CreateContextOptions = { + name?: string, + origin?: string, + codeGeneration?: { + strings?: boolean, + wasm?: boolean, + ... + }, + ... +}; + +type vm$CompileFunctionOptions = { + filename?: string, + lineOffset?: number, + columnOffset?: number, + cachedData?: Buffer, + produceCachedData?: boolean, + parsingContext?: {[key: string]: any, ...}, + contextExtensions?: Array<{[key: string]: any, ...}>, + ... +}; + +declare class vm$Script { + constructor(code: string, options?: vm$ScriptOptions | string): void; + cachedData: ?Buffer; + cachedDataRejected: ?boolean; + cachedDataProduced: ?boolean; + runInContext( + contextifiedSandbox: vm$Context, + options?: vm$ScriptOptions, + ): any; + runInNewContext( + sandbox?: {[key: string]: any, ...}, + options?: vm$ScriptOptions, + ): any; + runInThisContext(options?: vm$ScriptOptions): any; + createCachedData(): Buffer; +} + +declare class vm$Context {} + +declare module 'vm' { + declare var Script: typeof vm$Script; + declare function createContext( + sandbox?: interface {[key: string]: any}, + options?: vm$CreateContextOptions, + ): vm$Context; + declare function isContext(sandbox: {[key: string]: any, ...}): boolean; + declare function runInContext( + code: string, + contextifiedSandbox: vm$Context, + options?: vm$ScriptOptions | string, + ): any; + declare function runInDebugContext(code: string): any; + declare function runInNewContext( + code: string, + sandbox?: {[key: string]: any, ...}, + options?: vm$ScriptOptions | string, + ): any; + declare function runInThisContext( + code: string, + options?: vm$ScriptOptions | string, + ): any; + declare function compileFunction( + code: string, + params: string[], + options: vm$CompileFunctionOptions, + ): Function; +} + +type zlib$options = { + flush?: number, + chunkSize?: number, + windowBits?: number, + level?: number, + memLevel?: number, + strategy?: number, + dictionary?: Buffer, + ... +}; + +type zlib$brotliOptions = { + flush?: number, + finishFlush?: number, + chunkSize?: number, + params?: { + [number]: boolean | number, + ... + }, + maxOutputLength?: number, + ... +}; + +type zlib$syncFn = ( + buffer: Buffer | $TypedArray | DataView | ArrayBuffer | string, + options?: zlib$options, +) => Buffer; + +type zlib$asyncFn = ( + buffer: Buffer | $TypedArray | DataView | ArrayBuffer | string, + options?: zlib$options, + callback?: (error: ?Error, result: Buffer) => void, +) => void; + +type zlib$brotliSyncFn = ( + buffer: Buffer | $TypedArray | DataView | ArrayBuffer | string, + options?: zlib$brotliOptions, +) => Buffer; + +type zlib$brotliAsyncFn = ( + buffer: Buffer | $TypedArray | DataView | ArrayBuffer | string, + options?: zlib$brotliOptions, + callback?: (error: ?Error, result: Buffer) => void, +) => void; + +// Accessing the constants directly from the module is currently still +// possible but should be considered deprecated. +// ref: https://github.com/nodejs/node/blob/master/doc/api/zlib.md +declare module 'zlib' { + declare var Z_NO_FLUSH: number; + declare var Z_PARTIAL_FLUSH: number; + declare var Z_SYNC_FLUSH: number; + declare var Z_FULL_FLUSH: number; + declare var Z_FINISH: number; + declare var Z_BLOCK: number; + declare var Z_TREES: number; + declare var Z_OK: number; + declare var Z_STREAM_END: number; + declare var Z_NEED_DICT: number; + declare var Z_ERRNO: number; + declare var Z_STREAM_ERROR: number; + declare var Z_DATA_ERROR: number; + declare var Z_MEM_ERROR: number; + declare var Z_BUF_ERROR: number; + declare var Z_VERSION_ERROR: number; + declare var Z_NO_COMPRESSION: number; + declare var Z_BEST_SPEED: number; + declare var Z_BEST_COMPRESSION: number; + declare var Z_DEFAULT_COMPRESSION: number; + declare var Z_FILTERED: number; + declare var Z_HUFFMAN_ONLY: number; + declare var Z_RLE: number; + declare var Z_FIXED: number; + declare var Z_DEFAULT_STRATEGY: number; + declare var Z_BINARY: number; + declare var Z_TEXT: number; + declare var Z_ASCII: number; + declare var Z_UNKNOWN: number; + declare var Z_DEFLATED: number; + declare var Z_NULL: number; + declare var Z_DEFAULT_CHUNK: number; + declare var Z_DEFAULT_LEVEL: number; + declare var Z_DEFAULT_MEMLEVEL: number; + declare var Z_DEFAULT_WINDOWBITS: number; + declare var Z_MAX_CHUNK: number; + declare var Z_MAX_LEVEL: number; + declare var Z_MAX_MEMLEVEL: number; + declare var Z_MAX_WINDOWBITS: number; + declare var Z_MIN_CHUNK: number; + declare var Z_MIN_LEVEL: number; + declare var Z_MIN_MEMLEVEL: number; + declare var Z_MIN_WINDOWBITS: number; + declare var constants: { + Z_NO_FLUSH: number, + Z_PARTIAL_FLUSH: number, + Z_SYNC_FLUSH: number, + Z_FULL_FLUSH: number, + Z_FINISH: number, + Z_BLOCK: number, + Z_TREES: number, + Z_OK: number, + Z_STREAM_END: number, + Z_NEED_DICT: number, + Z_ERRNO: number, + Z_STREAM_ERROR: number, + Z_DATA_ERROR: number, + Z_MEM_ERROR: number, + Z_BUF_ERROR: number, + Z_VERSION_ERROR: number, + Z_NO_COMPRESSION: number, + Z_BEST_SPEED: number, + Z_BEST_COMPRESSION: number, + Z_DEFAULT_COMPRESSION: number, + Z_FILTERED: number, + Z_HUFFMAN_ONLY: number, + Z_RLE: number, + Z_FIXED: number, + Z_DEFAULT_STRATEGY: number, + Z_BINARY: number, + Z_TEXT: number, + Z_ASCII: number, + Z_UNKNOWN: number, + Z_DEFLATED: number, + Z_NULL: number, + Z_DEFAULT_CHUNK: number, + Z_DEFAULT_LEVEL: number, + Z_DEFAULT_MEMLEVEL: number, + Z_DEFAULT_WINDOWBITS: number, + Z_MAX_CHUNK: number, + Z_MAX_LEVEL: number, + Z_MAX_MEMLEVEL: number, + Z_MAX_WINDOWBITS: number, + Z_MIN_CHUNK: number, + Z_MIN_LEVEL: number, + Z_MIN_MEMLEVEL: number, + Z_MIN_WINDOWBITS: number, + + BROTLI_DECODE: number, + BROTLI_ENCODE: number, + BROTLI_OPERATION_PROCESS: number, + BROTLI_OPERATION_FLUSH: number, + BROTLI_OPERATION_FINISH: number, + BROTLI_OPERATION_EMIT_METADATA: number, + BROTLI_PARAM_MODE: number, + BROTLI_MODE_GENERIC: number, + BROTLI_MODE_TEXT: number, + BROTLI_MODE_FONT: number, + BROTLI_DEFAULT_MODE: number, + BROTLI_PARAM_QUALITY: number, + BROTLI_MIN_QUALITY: number, + BROTLI_MAX_QUALITY: number, + BROTLI_DEFAULT_QUALITY: number, + BROTLI_PARAM_LGWIN: number, + BROTLI_MIN_WINDOW_BITS: number, + BROTLI_MAX_WINDOW_BITS: number, + BROTLI_LARGE_MAX_WINDOW_BITS: number, + BROTLI_DEFAULT_WINDOW: number, + BROTLI_PARAM_LGBLOCK: number, + BROTLI_MIN_INPUT_BLOCK_BITS: number, + BROTLI_MAX_INPUT_BLOCK_BITS: number, + BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: number, + BROTLI_PARAM_SIZE_HINT: number, + BROTLI_PARAM_LARGE_WINDOW: number, + BROTLI_PARAM_NPOSTFIX: number, + BROTLI_PARAM_NDIRECT: number, + BROTLI_DECODER_RESULT_ERROR: number, + BROTLI_DECODER_RESULT_SUCCESS: number, + BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: number, + BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: number, + BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: number, + BROTLI_DECODER_PARAM_LARGE_WINDOW: number, + BROTLI_DECODER_NO_ERROR: number, + BROTLI_DECODER_SUCCESS: number, + BROTLI_DECODER_NEEDS_MORE_INPUT: number, + BROTLI_DECODER_NEEDS_MORE_OUTPUT: number, + BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: number, + BROTLI_DECODER_ERROR_FORMAT_RESERVED: number, + BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: number, + BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: number, + BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: number, + BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: number, + BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: number, + BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: number, + BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: number, + BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: number, + BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: number, + BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: number, + BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: number, + BROTLI_DECODER_ERROR_FORMAT_PADDING_1: number, + BROTLI_DECODER_ERROR_FORMAT_PADDING_2: number, + BROTLI_DECODER_ERROR_FORMAT_DISTANCE: number, + BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: number, + BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: number, + BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: number, + BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: number, + BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: number, + BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: number, + BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: number, + BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: number, + BROTLI_DECODER_ERROR_UNREACHABL: number, + ... + }; + declare var codes: { + Z_OK: number, + Z_STREAM_END: number, + Z_NEED_DICT: number, + Z_ERRNO: number, + Z_STREAM_ERROR: number, + Z_DATA_ERROR: number, + Z_MEM_ERROR: number, + Z_BUF_ERROR: number, + Z_VERSION_ERROR: number, + ... + }; + declare class Zlib extends stream$Duplex { + // TODO + } + declare class BrotliCompress extends Zlib {} + declare class BrotliDecompress extends Zlib {} + declare class Deflate extends Zlib {} + declare class Inflate extends Zlib {} + declare class Gzip extends Zlib {} + declare class Gunzip extends Zlib {} + declare class DeflateRaw extends Zlib {} + declare class InflateRaw extends Zlib {} + declare class Unzip extends Zlib {} + declare function createBrotliCompress( + options?: zlib$brotliOptions, + ): BrotliCompress; + declare function createBrotliDecompress( + options?: zlib$brotliOptions, + ): BrotliDecompress; + declare function createDeflate(options?: zlib$options): Deflate; + declare function createInflate(options?: zlib$options): Inflate; + declare function createDeflateRaw(options?: zlib$options): DeflateRaw; + declare function createInflateRaw(options?: zlib$options): InflateRaw; + declare function createGzip(options?: zlib$options): Gzip; + declare function createGunzip(options?: zlib$options): Gunzip; + declare function createUnzip(options?: zlib$options): Unzip; + declare var brotliCompress: zlib$brotliAsyncFn; + declare var brotliCompressSync: zlib$brotliSyncFn; + declare var brotliDeompress: zlib$brotliAsyncFn; + declare var brotliDecompressSync: zlib$brotliSyncFn; + declare var deflate: zlib$asyncFn; + declare var deflateSync: zlib$syncFn; + declare var gzip: zlib$asyncFn; + declare var gzipSync: zlib$syncFn; + declare var deflateRaw: zlib$asyncFn; + declare var deflateRawSync: zlib$syncFn; + declare var unzip: zlib$asyncFn; + declare var unzipSync: zlib$syncFn; + declare var inflate: zlib$asyncFn; + declare var inflateSync: zlib$syncFn; + declare var gunzip: zlib$asyncFn; + declare var gunzipSync: zlib$syncFn; + declare var inflateRaw: zlib$asyncFn; + declare var inflateRawSync: zlib$syncFn; +} + +declare module 'assert' { + declare class AssertionError extends Error {} + declare type AssertStrict = { + (value: any, message?: string): void, + ok(value: any, message?: string): void, + fail(message?: string | Error): void, + // deprecated since v10.15 + fail(actual: any, expected: any, message: string, operator: string): void, + equal(actual: any, expected: any, message?: string): void, + notEqual(actual: any, expected: any, message?: string): void, + deepEqual(actual: any, expected: any, message?: string): void, + notDeepEqual(actual: any, expected: any, message?: string): void, + throws( + block: Function, + error?: Function | RegExp | ((err: any) => boolean), + message?: string, + ): void, + doesNotThrow(block: Function, message?: string): void, + ifError(value: any): void, + AssertionError: typeof AssertionError, + strict: AssertStrict, + ... + }; + declare module.exports: { + (value: any, message?: string): void, + ok(value: any, message?: string): void, + fail(message?: string | Error): void, + // deprecated since v10.15 + fail(actual: any, expected: any, message: string, operator: string): void, + equal(actual: any, expected: any, message?: string): void, + notEqual(actual: any, expected: any, message?: string): void, + deepEqual(actual: any, expected: any, message?: string): void, + notDeepEqual(actual: any, expected: any, message?: string): void, + strictEqual(actual: any, expected: any, message?: string): void, + notStrictEqual(actual: any, expected: any, message?: string): void, + deepStrictEqual(actual: any, expected: any, message?: string): void, + notDeepStrictEqual(actual: any, expected: any, message?: string): void, + throws( + block: Function, + error?: Function | RegExp | ((err: any) => boolean), + message?: string, + ): void, + doesNotThrow(block: Function, message?: string): void, + ifError(value: any): void, + AssertionError: typeof AssertionError, + strict: AssertStrict, + ... + }; +} + +type HeapCodeStatistics = { + code_and_metadata_size: number, + bytecode_and_metadata_size: number, + external_script_source_size: number, + ... +}; + +type HeapStatistics = { + total_heap_size: number, + total_heap_size_executable: number, + total_physical_size: number, + total_available_size: number, + used_heap_size: number, + heap_size_limit: number, + malloced_memory: number, + peak_malloced_memory: number, + does_zap_garbage: 0 | 1, + number_of_native_contexts: number, + number_of_detached_contexts: number, + ... +}; + +type HeapSpaceStatistics = { + space_name: string, + space_size: number, + space_used_size: number, + space_available_size: number, + physical_space_size: number, + ... +}; + +// Adapted from DefinitelyTyped for Node v14: +// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/dea4d99dc302a0b0a25270e46e72c1fe9b741a17/types/node/v14/v8.d.ts +declare module 'v8' { + /** + * Returns an integer representing a "version tag" derived from the V8 version, command line flags and detected CPU features. + * This is useful for determining whether a vm.Script cachedData buffer is compatible with this instance of V8. + */ + declare function cachedDataVersionTag(): number; + + /** + * Generates a snapshot of the current V8 heap and returns a Readable + * Stream that may be used to read the JSON serialized representation. + * This conversation was marked as resolved by joyeecheung + * This JSON stream format is intended to be used with tools such as + * Chrome DevTools. The JSON schema is undocumented and specific to the + * V8 engine, and may change from one version of V8 to the next. + */ + declare function getHeapSnapshot(): stream$Readable; + + /** + * + * @param fileName The file path where the V8 heap snapshot is to be + * saved. If not specified, a file name with the pattern + * `'Heap-${yyyymmdd}-${hhmmss}-${pid}-${thread_id}.heapsnapshot'` will be + * generated, where `{pid}` will be the PID of the Node.js process, + * `{thread_id}` will be `0` when `writeHeapSnapshot()` is called from + * the main Node.js thread or the id of a worker thread. + */ + declare function writeHeapSnapshot(fileName?: string): string; + + declare function getHeapCodeStatistics(): HeapCodeStatistics; + + declare function getHeapStatistics(): HeapStatistics; + declare function getHeapSpaceStatistics(): Array; + declare function setFlagsFromString(flags: string): void; + + declare class Serializer { + constructor(): void; + + /** + * Writes out a header, which includes the serialization format version. + */ + writeHeader(): void; + + /** + * Serializes a JavaScript value and adds the serialized representation to the internal buffer. + * This throws an error if value cannot be serialized. + */ + writeValue(val: any): boolean; + + /** + * Returns the stored internal buffer. + * This serializer should not be used once the buffer is released. + * Calling this method results in undefined behavior if a previous write has failed. + */ + releaseBuffer(): Buffer; + + /** + * Marks an ArrayBuffer as having its contents transferred out of band.\ + * Pass the corresponding ArrayBuffer in the deserializing context to deserializer.transferArrayBuffer(). + */ + transferArrayBuffer(id: number, arrayBuffer: ArrayBuffer): void; + + /** + * Write a raw 32-bit unsigned integer. + */ + writeUint32(value: number): void; + + /** + * Write a raw 64-bit unsigned integer, split into high and low 32-bit parts. + */ + writeUint64(hi: number, lo: number): void; + + /** + * Write a JS number value. + */ + writeDouble(value: number): void; + + /** + * Write raw bytes into the serializer’s internal buffer. + * The deserializer will require a way to compute the length of the buffer. + */ + writeRawBytes(buffer: Buffer | $TypedArray | DataView): void; + } + + /** + * A subclass of `Serializer` that serializes `TypedArray` (in particular `Buffer`) and `DataView` objects as host objects, + * and only stores the part of their underlying `ArrayBuffers` that they are referring to. + */ + declare class DefaultSerializer extends Serializer {} + + declare class Deserializer { + constructor(data: Buffer | $TypedArray | DataView): void; + + /** + * Reads and validates a header (including the format version). + * May, for example, reject an invalid or unsupported wire format. + * In that case, an Error is thrown. + */ + readHeader(): boolean; + + /** + * Deserializes a JavaScript value from the buffer and returns it. + */ + readValue(): any; + + /** + * Marks an ArrayBuffer as having its contents transferred out of band. + * Pass the corresponding `ArrayBuffer` in the serializing context to serializer.transferArrayBuffer() + * (or return the id from serializer._getSharedArrayBufferId() in the case of SharedArrayBuffers). + */ + transferArrayBuffer(id: number, arrayBuffer: ArrayBuffer): void; + + /** + * Reads the underlying wire format version. + * Likely mostly to be useful to legacy code reading old wire format versions. + * May not be called before .readHeader(). + */ + getWireFormatVersion(): number; + + /** + * Read a raw 32-bit unsigned integer and return it. + */ + readUint32(): number; + + /** + * Read a raw 64-bit unsigned integer and return it as an array [hi, lo] with two 32-bit unsigned integer entries. + */ + readUint64(): [number, number]; + + /** + * Read a JS number value. + */ + readDouble(): number; + + /** + * Read raw bytes from the deserializer’s internal buffer. + * The length parameter must correspond to the length of the buffer that was passed to serializer.writeRawBytes(). + */ + readRawBytes(length: number): Buffer; + } + + /** + * A subclass of `Serializer` that serializes `TypedArray` (in particular `Buffer`) and `DataView` objects as host objects, + * and only stores the part of their underlying `ArrayBuffers` that they are referring to. + */ + declare class DefaultDeserializer extends Deserializer {} + + /** + * Uses a `DefaultSerializer` to serialize value into a buffer. + */ + declare function serialize(value: any): Buffer; + + /** + * Uses a `DefaultDeserializer` with default options to read a JS value from a buffer. + */ + declare function deserialize(data: Buffer | $TypedArray | DataView): any; +} + +type repl$DefineCommandOptions = (...args: Array) => void | { + action: (...args: Array) => void, + help?: string, + ... +}; + +declare class $SymbolReplModeMagic mixins Symbol {} +declare class $SymbolReplModeSloppy mixins Symbol {} +declare class $SymbolReplModeStrict mixins Symbol {} + +declare module 'repl' { + declare var REPL_MODE_MAGIC: $SymbolReplModeMagic; + declare var REPL_MODE_SLOPPY: $SymbolReplModeSloppy; + declare var REPL_MODE_STRICT: $SymbolReplModeStrict; + + declare class REPLServer extends readline$Interface { + context: vm$Context; + defineCommand(command: string, options: repl$DefineCommandOptions): void; + displayPrompt(preserveCursor?: boolean): void; + } + + declare function start(prompt: string): REPLServer; + declare function start(options: { + prompt?: string, + input?: stream$Readable, + output?: stream$Writable, + terminal?: boolean, + eval?: Function, + useColors?: boolean, + useGlobal?: boolean, + ignoreUndefined?: boolean, + writer?: (object: any, options?: util$InspectOptions) => string, + completer?: readline$InterfaceCompleter, + replMode?: + | $SymbolReplModeMagic + | $SymbolReplModeSloppy + | $SymbolReplModeStrict, + breakEvalOnSigint?: boolean, + ... + }): REPLServer; + + declare class Recoverable extends SyntaxError { + constructor(err: Error): void; + } +} + +declare module 'inspector' { + declare function open(port?: number, host?: string, wait?: boolean): void; + + declare function close(): void; + declare function url(): string | void; + declare var console: Object; + declare function waitForDebugger(): void; + + declare class Session extends events$EventEmitter { + constructor(): void; + connect(): void; + connectToMainThread(): void; + disconnect(): void; + post(method: string, params?: Object, callback?: Function): void; + } +} + +/* globals: https://nodejs.org/api/globals.html */ + +type process$CPUUsage = { + user: number, + system: number, + ... +}; + +declare class Process extends events$EventEmitter { + abort(): void; + allowedNodeEnvironmentFlags: Set; + arch: string; + argv: Array; + chdir(directory: string): void; + config: Object; + connected: boolean; + cpuUsage(previousValue?: process$CPUUsage): process$CPUUsage; + cwd(): string; + disconnect?: () => void; + domain?: domain$Domain; + env: {[key: string]: string | void, ...}; + emitWarning(warning: string | Error): void; + emitWarning( + warning: string, + typeOrCtor: string | ((...empty) => mixed), + ): void; + emitWarning( + warning: string, + type: string, + codeOrCtor: string | ((...empty) => mixed), + ): void; + emitWarning( + warning: string, + type: string, + code: string, + ctor?: (...empty) => mixed, + ): void; + execArgv: Array; + execPath: string; + exit(code?: number): empty; + exitCode?: number; + getegid?: () => number; + geteuid?: () => number; + getgid?: () => number; + getgroups?: () => Array; + getuid?: () => number; + hrtime: { + (time?: [number, number]): [number, number], + bigint: () => bigint, + ... + }; + 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, + ... + }; + nextTick: (cb: (...T) => mixed, ...T) => void; + pid: number; + platform: string; + release: { + name: string, + lts?: string, + sourceUrl: string, + headersUrl: string, + libUrl: string, + ... + }; + send?: ( + message: any, + sendHandleOrCallback?: net$Socket | net$Server | Function, + callback?: Function, + ) => void; + setegid?: (id: number | string) => void; + seteuid?: (id: number | string) => void; + setgid?: (id: number | string) => void; + setgroups?: (groups: Array) => void; + setuid?: (id: number | string) => void; + stderr: stream$Writable | tty$WriteStream; + stdin: stream$Readable | tty$ReadStream; + stdout: stream$Writable | tty$WriteStream; + title: string; + umask(mask?: number): number; + uptime(): number; + version: string; + versions: { + [key: string]: ?string, + node: string, + v8: string, + ... + }; +} +declare var process: Process; + +declare var __filename: string; +declare var __dirname: string; + +declare function setImmediate( + callback: (...args: Array) => mixed, + ...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; + declare var threadId: number; + declare var workerData: any; + + declare class MessageChannel { + +port1: MessagePort; + +port2: MessagePort; + } + + declare class MessagePort extends events$EventEmitter { + close(): void; + postMessage( + value: any, + transferList?: Array, + ): void; + ref(): void; + unref(): void; + start(): void; + + addListener(event: 'close', listener: () => void): this; + addListener(event: 'message', listener: (value: any) => void): this; + addListener( + event: string | Symbol, + listener: (...args: any[]) => void, + ): this; + + emit(event: 'close'): boolean; + emit(event: 'message', value: any): boolean; + emit(event: string | Symbol, ...args: any[]): boolean; + + on(event: 'close', listener: () => void): this; + on(event: 'message', listener: (value: any) => void): this; + on(event: string | Symbol, listener: (...args: any[]) => void): this; + + once(event: 'close', listener: () => void): this; + once(event: 'message', listener: (value: any) => void): this; + once(event: string | Symbol, listener: (...args: any[]) => void): this; + + prependListener(event: 'close', listener: () => void): this; + prependListener(event: 'message', listener: (value: any) => void): this; + prependListener( + event: string | Symbol, + listener: (...args: any[]) => void, + ): this; + + prependOnceListener(event: 'close', listener: () => void): this; + prependOnceListener(event: 'message', listener: (value: any) => void): this; + prependOnceListener( + event: string | Symbol, + listener: (...args: any[]) => void, + ): this; + + removeListener(event: 'close', listener: () => void): this; + removeListener(event: 'message', listener: (value: any) => void): this; + removeListener( + event: string | Symbol, + listener: (...args: any[]) => void, + ): this; + + off(event: 'close', listener: () => void): this; + off(event: 'message', listener: (value: any) => void): this; + off(event: string | Symbol, listener: (...args: any[]) => void): this; + } + + declare type WorkerOptions = {| + env?: Object, + eval?: boolean, + workerData?: any, + stdin?: boolean, + stdout?: boolean, + stderr?: boolean, + execArgv?: string[], + |}; + + declare class Worker extends events$EventEmitter { + +stdin: stream$Writable | null; + +stdout: stream$Readable; + +stderr: stream$Readable; + +threadId: number; + + constructor(filename: string, options?: WorkerOptions): void; + + postMessage( + value: any, + transferList?: Array, + ): void; + ref(): void; + unref(): void; + terminate(callback?: (err: Error, exitCode: number) => void): void; + /** + * Transfer a `MessagePort` to a different `vm` Context. The original `port` + * object will be rendered unusable, and the returned `MessagePort` instance will + * take its place. + * + * The returned `MessagePort` will be an object in the target context, and will + * inherit from its global `Object` class. Objects passed to the + * `port.onmessage()` listener will also be created in the target context + * and inherit from its global `Object` class. + * + * However, the created `MessagePort` will no longer inherit from + * `EventEmitter`, and only `port.onmessage()` can be used to receive + * events using it. + */ + moveMessagePortToContext( + port: MessagePort, + context: vm$Context, + ): MessagePort; + + addListener(event: 'error', listener: (err: Error) => void): this; + addListener(event: 'exit', listener: (exitCode: number) => void): this; + addListener(event: 'message', listener: (value: any) => void): this; + addListener(event: 'online', listener: () => void): this; + addListener( + event: string | Symbol, + listener: (...args: any[]) => void, + ): this; + + emit(event: 'error', err: Error): boolean; + emit(event: 'exit', exitCode: number): boolean; + emit(event: 'message', value: any): boolean; + emit(event: 'online'): boolean; + emit(event: string | Symbol, ...args: any[]): boolean; + + on(event: 'error', listener: (err: Error) => void): this; + on(event: 'exit', listener: (exitCode: number) => void): this; + on(event: 'message', listener: (value: any) => void): this; + on(event: 'online', listener: () => void): this; + on(event: string | Symbol, listener: (...args: any[]) => void): this; + + once(event: 'error', listener: (err: Error) => void): this; + once(event: 'exit', listener: (exitCode: number) => void): this; + once(event: 'message', listener: (value: any) => void): this; + once(event: 'online', listener: () => void): this; + once(event: string | Symbol, listener: (...args: any[]) => void): this; + + prependListener(event: 'error', listener: (err: Error) => void): this; + prependListener(event: 'exit', listener: (exitCode: number) => void): this; + prependListener(event: 'message', listener: (value: any) => void): this; + prependListener(event: 'online', listener: () => void): this; + prependListener( + event: string | Symbol, + listener: (...args: any[]) => void, + ): this; + + prependOnceListener(event: 'error', listener: (err: Error) => void): this; + prependOnceListener( + event: 'exit', + listener: (exitCode: number) => void, + ): this; + prependOnceListener(event: 'message', listener: (value: any) => void): this; + prependOnceListener(event: 'online', listener: () => void): this; + prependOnceListener( + event: string | Symbol, + listener: (...args: any[]) => void, + ): this; + + removeListener(event: 'error', listener: (err: Error) => void): this; + removeListener(event: 'exit', listener: (exitCode: number) => void): this; + removeListener(event: 'message', listener: (value: any) => void): this; + removeListener(event: 'online', listener: () => void): this; + removeListener( + event: string | Symbol, + listener: (...args: any[]) => void, + ): this; + + off(event: 'error', listener: (err: Error) => void): this; + off(event: 'exit', listener: (exitCode: number) => void): this; + off(event: 'message', listener: (value: any) => void): this; + off(event: 'online', listener: () => void): this; + off(event: string | Symbol, listener: (...args: any[]) => void): this; + } +} + +declare module 'node:worker_threads' { + declare module.exports: $Exports<'worker_threads'>; +} diff --git a/flow-typed/npm/data-uri-to-buffer_v6.x.x.js b/flow-typed/npm/data-uri-to-buffer_v6.x.x.js deleted file mode 100644 index b8d97331050f..000000000000 --- a/flow-typed/npm/data-uri-to-buffer_v6.x.x.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * 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 - * @oncall react_native - */ - -declare module 'data-uri-to-buffer' { - declare interface ParsedDataURI { - type: string; - typeFull: string; - charset: TextDecoder$availableEncodings; - buffer: ArrayBuffer; - } - - declare export function dataUriToBuffer(uri: string | URL): ParsedDataURI; -} diff --git a/flow-typed/npm/debug_v2.x.x.js b/flow-typed/npm/debug_v2.x.x.js index 0a42108058db..675c2fe6fcea 100644 --- a/flow-typed/npm/debug_v2.x.x.js +++ b/flow-typed/npm/debug_v2.x.x.js @@ -11,6 +11,18 @@ // https://github.com/visionmedia/debug // https://www.npmjs.com/package/debug +interface DebugFN { + (...args: Array): void; + enable(match: string): void; + disable(): void; + enabled: () => boolean; +} + declare module 'debug' { - declare module.exports: (namespace: string) => (...Array) => void; + declare module.exports: { + (namespace: string): DebugFN, + enable(match: string): void, + disable(): void, + enabled: () => boolean, + }; } diff --git a/flow-typed/npm/deep-equal_v1.x.x.js b/flow-typed/npm/deep-equal_v1.x.x.js new file mode 100644 index 000000000000..215eb356778f --- /dev/null +++ b/flow-typed/npm/deep-equal_v1.x.x.js @@ -0,0 +1,17 @@ +/** + * 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 + * @format + */ + +declare module 'deep-equal' { + declare module.exports: ( + actual: mixed, + expected: mixed, + options?: {strict: boolean}, + ) => boolean; +} diff --git a/flow-typed/npm/ini_v5.x.x.js b/flow-typed/npm/ini_v5.x.x.js new file mode 100644 index 000000000000..4eb2b2cd9403 --- /dev/null +++ b/flow-typed/npm/ini_v5.x.x.js @@ -0,0 +1,32 @@ +/** + * (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary. + * + * @flow strict + * @format + */ + +// Built to match the API @ 5.0.0 +declare module 'ini' { + export type Options = { + whitespace?: boolean, + align?: boolean, + section?: string, + sort?: boolean, + newline?: boolean, + platform?: 'win32' | 'linux' | 'darwin', + bracketedArrays?: boolean, + }; + + declare type Ini = { + parse: (string: string, options?: Options) => T, + decode: (string: string) => T, + stringify: ( + object: {[key: string]: string, ...}, + section: string, + ) => string, + safe: (string: string) => string, + unsafe: (string: string) => string, + }; + + declare module.exports: Ini; +} diff --git a/flow-typed/npm/jest-diff_v29.x.x.js b/flow-typed/npm/jest-diff_v29.x.x.js new file mode 100644 index 000000000000..9efb74b1f098 --- /dev/null +++ b/flow-typed/npm/jest-diff_v29.x.x.js @@ -0,0 +1,40 @@ +/** + * (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary. + * + * @flow strict + * @format + * @oncall react_native + */ + +declare module 'jest-diff' { + import type {CompareKeys} from 'pretty-format'; + + declare export type DiffOptionsColor = (arg: string) => string; // subset of Chalk type + + declare export type DiffOptions = { + aAnnotation?: string, + aColor?: DiffOptionsColor, + aIndicator?: string, + bAnnotation?: string, + bColor?: DiffOptionsColor, + bIndicator?: string, + changeColor?: DiffOptionsColor, + changeLineTrailingSpaceColor?: DiffOptionsColor, + commonColor?: DiffOptionsColor, + commonIndicator?: string, + commonLineTrailingSpaceColor?: DiffOptionsColor, + contextLines?: number, + emptyFirstOrLastLinePlaceholder?: string, + expand?: boolean, + includeChangeCounts?: boolean, + omitAnnotationLines?: boolean, + patchColor?: DiffOptionsColor, + compareKeys?: CompareKeys, + }; + + declare export function diff( + a: mixed, + b: mixed, + 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 new file mode 100644 index 000000000000..0f549003144e --- /dev/null +++ b/flow-typed/npm/jest-snapshot_v29.x.x.js @@ -0,0 +1,77 @@ +/** + * 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 + * @format + * @oncall react_native + */ + +declare module 'jest-snapshot' { + type SnapshotFormat = {...}; + + type UpdateSnapshot = 'all' | 'new' | 'none'; + + type ProjectConfig = { + rootDir: string, + prettierPath: string, + snapshotFormat: SnapshotFormat, + ... + }; + + type SnapshotResolver = { + /** Resolves from `testPath` to snapshot path. */ + resolveSnapshotPath(testPath: string, snapshotExtension?: string): string, + /** Resolves from `snapshotPath` to test path. */ + resolveTestPath(snapshotPath: string, snapshotExtension?: string): string, + /** Example test path, used for preflight consistency check of the implementation above. */ + testPathForConsistencyCheck: string, + }; + + declare export var EXTENSION: 'snap'; + + declare export function isSnapshotPath(path: string): boolean; + + type LocalRequire = (module: string) => mixed; + + declare export function buildSnapshotResolver( + config: ProjectConfig, + localRequire?: Promise | LocalRequire, + ): Promise; + + type SnapshotStateOptions = { + updateSnapshot: UpdateSnapshot, + prettierPath?: string | null, + expand?: boolean, + snapshotFormat: SnapshotFormat, + rootDir: string, + }; + + type SnapshotData = Record; + + type SaveStatus = { + deleted: boolean, + saved: boolean, + }; + + declare export class SnapshotState { + _dirty: boolean; + _updateSnapshot: UpdateSnapshot; + _snapshotData: SnapshotData; + _initialData: SnapshotData; + _uncheckedKeys: Set; + + added: number; + expand: boolean; + matched: number; + unmatched: number; + updated: number; + constructor(testPath: string, options: SnapshotStateOptions): void; + save(): SaveStatus; + getUncheckedCount(): number; + getUncheckedKeys(): Array; + removeUncheckedKeys(): void; + } +} diff --git a/flow-typed/npm/mkdirp_v0.5.x.js b/flow-typed/npm/mkdirp_v0.5.x.js deleted file mode 100644 index 79522197f961..000000000000 --- a/flow-typed/npm/mkdirp_v0.5.x.js +++ /dev/null @@ -1,18 +0,0 @@ -// flow-typed signature: b1b274e8ae71623bf11c20224c446842 -// flow-typed version: c6154227d1/mkdirp_v0.5.x/flow_>=v0.104.x - -declare module 'mkdirp' { - declare type Options = number | { - mode?: number, - fs?: mixed, - ... - }; - - declare type Callback = (err: ?Error, path: ?string) => void; - - declare module.exports: { - (path: string, options?: Options | Callback, callback?: Callback): void, - sync(path: string, options?: Options): void, - ... - }; -} diff --git a/flow-typed/npm/parseargs_v0.11.x.js b/flow-typed/npm/parseargs_v0.11.x.js deleted file mode 100644 index 51832ac1caa3..000000000000 --- a/flow-typed/npm/parseargs_v0.11.x.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * 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 - * @format - * @oncall react_native - */ - -declare module '@pkgjs/parseargs' { - declare export function parseArgs< - TOptions: {[string]: util$ParseArgsOption} = {}, - >(config: { - args?: Array, - options?: TOptions, - strict?: boolean, - allowPositionals?: boolean, - tokens?: false, - }): { - values: util$ParseArgsOptionsToValues, - positionals: Array, - }; - - declare export function parseArgs< - TOptions: {[string]: util$ParseArgsOption} = {}, - >(config: { - args?: Array, - options?: TOptions, - strict?: boolean, - allowPositionals?: boolean, - tokens: true, - }): { - values: util$ParseArgsOptionsToValues, - positionals: Array, - tokens: Array, - }; -} diff --git a/flow-typed/npm/pretty-format_v29.x.x.js b/flow-typed/npm/pretty-format_v29.x.x.js index e1654971a219..dd4fd66abf3b 100644 --- a/flow-typed/npm/pretty-format_v29.x.x.js +++ b/flow-typed/npm/pretty-format_v29.x.x.js @@ -19,7 +19,6 @@ declare type Colors = { tag: {close: string, open: string}, value: {close: string, open: string}, }; -declare type CompareKeys = ((a: string, b: string) => number) | null | void; declare type PrettyFormatPlugin = | { @@ -38,6 +37,10 @@ declare type PrettyFormatPlugin = }; declare module 'pretty-format' { + declare export type CompareKeys = + | ((a: string, b: string) => number) + | null + | void; declare export function format( value: mixed, options?: ?{ diff --git a/flow-typed/npm/react-dom_v17.x.x.js b/flow-typed/npm/react-dom_v17.x.x.js index 7c5fe5329e92..cc2f334626fe 100644 --- a/flow-typed/npm/react-dom_v17.x.x.js +++ b/flow-typed/npm/react-dom_v17.x.x.js @@ -1,29 +1,28 @@ -// flow-typed signature: e556c06e721548417501c08b01fec911 -// flow-typed version: ad3adf2de8/react-dom_v17.x.x/flow_>=v0.127.x - declare module 'react-dom' { + import type {Component} from 'react'; + declare var version: string; declare function findDOMNode( - componentOrElement: Element | ?React$Component + componentOrElement: Element | ?Component ): null | Element | Text; - declare function render( - element: React$Element, + declare function render( + element: ExactReactElement_DEPRECATED, container: Element, callback?: () => void - ): React$ElementRef; + ): React.ElementRef; - declare function hydrate( - element: React$Element, + declare function hydrate( + element: ExactReactElement_DEPRECATED, container: Element, callback?: () => void - ): React$ElementRef; + ): React.ElementRef; declare function createPortal( - node: React$Node, + node: React.Node, container: Element - ): React$Portal; + ): React.Portal; declare function unmountComponentAtNode(container: any): boolean; @@ -37,30 +36,32 @@ declare module 'react-dom' { ): void; declare function unstable_renderSubtreeIntoContainer< - ElementType: React$ElementType + ElementType: React.ElementType >( - parentComponent: React$Component, - nextElement: React$Element, + parentComponent: Component, + nextElement: ExactReactElement_DEPRECATED, container: any, callback?: () => void - ): React$ElementRef; + ): React.ElementRef; } declare module 'react-dom/server' { declare var version: string; - declare function renderToString(element: React$Node): string; + declare function renderToString(element: React.Node): string; - declare function renderToStaticMarkup(element: React$Node): string; + declare function renderToStaticMarkup(element: React.Node): string; - declare function renderToNodeStream(element: React$Node): stream$Readable; + declare function renderToNodeStream(element: React.Node): stream$Readable; declare function renderToStaticNodeStream( - element: React$Node + element: React.Node ): stream$Readable; } declare module 'react-dom/test-utils' { + import type {Component} from 'react'; + declare interface Thenable { then(resolve: () => mixed, reject?: () => mixed): mixed, } @@ -74,66 +75,66 @@ declare module 'react-dom/test-utils' { }; declare function renderIntoDocument( - instance: React$Element - ): React$Component; + instance: React.MixedElement + ): Component; declare function mockComponent( - componentClass: React$ElementType, + componentClass: React.ElementType, mockTagName?: string ): { [key: string]: mixed, ... }; - declare function isElement(element: React$Element): boolean; + declare function isElement(element: React.MixedElement): boolean; declare function isElementOfType( - element: React$Element, - componentClass: React$ElementType + element: React.MixedElement, + componentClass: React.ElementType ): boolean; declare function isDOMComponent(instance: any): boolean; declare function isCompositeComponent( - instance: React$Component + instance: Component ): boolean; declare function isCompositeComponentWithType( - instance: React$Component, - componentClass: React$ElementType + instance: Component, + componentClass: React.ElementType ): boolean; declare function findAllInRenderedTree( - tree: React$Component, - test: (child: React$Component) => boolean - ): Array>; + tree: Component, + test: (child: Component) => boolean + ): Array>; declare function scryRenderedDOMComponentsWithClass( - tree: React$Component, + tree: Component, className: string ): Array; declare function findRenderedDOMComponentWithClass( - tree: React$Component, + tree: Component, className: string ): ?Element; declare function scryRenderedDOMComponentsWithTag( - tree: React$Component, + tree: Component, tagName: string ): Array; declare function findRenderedDOMComponentWithTag( - tree: React$Component, + tree: Component, tagName: string ): ?Element; declare function scryRenderedComponentsWithType( - tree: React$Component, - componentClass: React$ElementType - ): Array>; + tree: Component, + componentClass: React.ElementType + ): Array>; declare function findRenderedComponentWithType( - tree: React$Component, - componentClass: React$ElementType - ): ?React$Component; + tree: Component, + 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 406dbafc0bf4..e27d1a6d2114 100644 --- a/flow-typed/npm/react-test-renderer_v16.x.x.js +++ b/flow-typed/npm/react-test-renderer_v16.x.x.js @@ -1,50 +1,52 @@ // Type definitions for react-test-renderer 16.x.x // Ported from: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react-test-renderer -type ReactComponentInstance = React$Component; +type TestRendererOptions = { createNodeMock(element: React.MixedElement): any, ... }; -type ReactTestRendererJSON = { - type: string, - props: { [propName: string]: any, ... }, - children: null | ReactTestRendererJSON[], - ... -}; +declare module "react-test-renderer" { + import type {Component as ReactComponent} from 'react'; -type ReactTestRendererTree = ReactTestRendererJSON & { - nodeType: "component" | "host", - instance: ?ReactComponentInstance, - rendered: null | ReactTestRendererTree, - ... -}; + type ReactComponentInstance = ReactComponent; -type ReactTestInstance = { - instance: ?ReactComponentInstance, - type: string, - 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, - findAll( - predicate: (node: ReactTestInstance) => boolean, - options?: { deep: boolean, ... } - ): ReactTestInstance[], - findAllByType( - type: React$ElementType, - options?: { deep: boolean, ... } - ): ReactTestInstance[], - findAllByProps( + export type ReactTestRendererJSON = { + type: string, props: { [propName: string]: any, ... }, - options?: { deep: boolean, ... } - ): ReactTestInstance[], - ... -}; + children: null | ReactTestRendererJSON[], + ... + }; -type TestRendererOptions = { createNodeMock(element: React.MixedElement): any, ... }; + export type ReactTestRendererTree = ReactTestRendererJSON & { + nodeType: "component" | "host", + instance: ?ReactComponentInstance, + rendered: null | ReactTestRendererTree, + ... + }; -declare module "react-test-renderer" { - declare export type ReactTestRenderer = { + export type ReactTestInstance = { + instance: ?ReactComponentInstance, + type: string, + 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, + findAll( + predicate: (node: ReactTestInstance) => boolean, + options?: { deep: boolean, ... } + ): ReactTestInstance[], + findAllByType( + type: React.ElementType, + options?: { deep: boolean, ... } + ): ReactTestInstance[], + findAllByProps( + props: { [propName: string]: any, ... }, + options?: { deep: boolean, ... } + ): ReactTestInstance[], + ... + }; + + export type ReactTestRenderer = { toJSON(): null | ReactTestRendererJSON, toTree(): null | ReactTestRendererTree, unmount(nextElement?: React.MixedElement): void, @@ -65,6 +67,8 @@ declare module "react-test-renderer" { } declare module "react-test-renderer/shallow" { + import type {ReactTestInstance} from 'react-test-renderer'; + declare export default class ShallowRenderer { static createRenderer(): ShallowRenderer; getMountedInstance(): ReactTestInstance; diff --git a/flow-typed/npm/tinybench_v3.1.x.js b/flow-typed/npm/tinybench_v3.1.x.js new file mode 100644 index 000000000000..ce884b5b94dd --- /dev/null +++ b/flow-typed/npm/tinybench_v3.1.x.js @@ -0,0 +1,121 @@ +/** + * 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 + * @format + * @oncall react_native + */ + +declare module 'tinybench' { + declare export class Task extends EventTarget { + name: string; + result: void | $ReadOnly; + runs: number; + + reset(): void; + run(): Promise; + runSync(): Task; + warmup(): Promise; + } + + export type Hook = ( + task: Task, + mode: 'run' | 'warmup', + ) => Promise | void; + + export type BenchOptions = { + iterations?: number, + name?: string, + now?: () => number, + setup?: Hook, + signal?: AbortSignal, + teardown?: Hook, + throws?: boolean, + time?: number, + warmup?: boolean, + warmupIterations?: number, + warmupTime?: number, + }; + + export interface Statistics { + aad: void | number; + critical: number; + df: number; + mad: void | number; + max: number; + mean: number; + min: number; + moe: number; + p50: void | number; + p75: void | number; + p99: void | number; + p995: void | number; + p999: void | number; + rme: number; + samples: number[]; + sd: number; + sem: number; + variance: number; + } + + export interface TaskResult { + critical: number; + df: number; + error?: Error; + hz: number; + latency: Statistics; + max: number; + mean: number; + min: number; + moe: number; + p75: number; + p99: number; + p995: number; + p999: number; + period: number; + rme: number; + samples: number[]; + sd: number; + sem: number; + throughput: Statistics; + totalTime: number; + variance: number; + } + + export type FnOptions = { + afterAll?: (this: Task) => void | Promise, + afterEach?: (this: Task) => void | Promise, + beforeAll?: (this: Task) => void | Promise, + beforeEach?: (this: Task) => void | Promise, + }; + + export type Fn = () => Promise | mixed; + + declare export class Bench extends EventTarget { + concurrency: null | 'task' | 'bench'; + name?: string; + opts: $ReadOnly; + threshold: number; + + constructor(options?: BenchOptions): this; + + // $FlowExpectedError[unsafe-getters-setters] + get results(): Array<$ReadOnly>; + + // $FlowExpectedError[unsafe-getters-setters] + get tasks(): Array; + + add(name: string, fn: Fn, fnOpts?: FnOptions): this; + getTask(name: string): void | Task; + remove(name: string): this; + reset(): void; + run(): Promise>; + runSync(): Array; + table( + convert?: (task: Task) => Record, + ): void | Array>; + } +} diff --git a/flow-typed/npm/undici_v5.x.x.js b/flow-typed/npm/undici_v5.x.x.js index 48360acd2330..59bdbdb9b83c 100644 --- a/flow-typed/npm/undici_v5.x.x.js +++ b/flow-typed/npm/undici_v5.x.x.js @@ -16,6 +16,13 @@ declare interface undici$Agent$Options { } declare module 'undici' { + declare export type RequestOptions = $ReadOnly<{ + dispatcher?: Dispatcher, + method?: string, + headers?: HeadersInit, + ... + }>; + declare export class Dispatcher extends events$EventEmitter { constructor(): void; } @@ -23,4 +30,17 @@ declare module 'undici' { declare export class Agent extends Dispatcher { constructor(opts?: undici$Agent$Options): void; } + + declare export function request( + url: string | URL, + options: RequestOptions, + ): Promise<{ + statusCode: number, + headers: Headers, + body: { + read(): Promise, + ... + }, + ... + }>; } diff --git a/flow-typed/npm/yargs_v17.x.x.js b/flow-typed/npm/yargs_v17.x.x.js index ea049a3ba5b3..9f614e41f16f 100644 --- a/flow-typed/npm/yargs_v17.x.x.js +++ b/flow-typed/npm/yargs_v17.x.x.js @@ -323,6 +323,7 @@ declare module "yargs" { 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; version(): this; version(version: string | false): this; diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d6..9bbc975c742b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 66cd5a0e49b5..37f853b1c84d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d6b11..faf93008b77e 100755 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/gradlew.bat b/gradlew.bat index 16302dedeb52..9b42019c7915 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,8 +1,3 @@ -@REM Copyright (c) Meta Platforms, Inc. and affiliates. -@REM -@REM This source code is licensed under the MIT license found in the -@REM LICENSE file in the root directory of this source tree. - @rem @rem Copyright 2015 the original author or authors. @rem diff --git a/jest.config.js b/jest.config.js index d4ac1188db34..3fb2cd09000f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -11,6 +11,11 @@ const {defaults} = require('jest-config'); +const PODS_LOCATIONS = [ + 'packages/rn-tester/Pods', + 'packages/helloworld/ios/Pods', +]; + module.exports = { transform: { '^.+\\.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp)$': @@ -32,7 +37,8 @@ module.exports = { '/node_modules/', '/packages/react-native/sdks', '/packages/react-native/Libraries/Renderer', - '/packages/react-native-test-renderer/src', + '/packages/react-native/sdks/hermes/', + ...PODS_LOCATIONS, ], transformIgnorePatterns: ['node_modules/(?!@react-native/)'], haste: { @@ -40,7 +46,11 @@ module.exports = { platforms: ['ios', 'android'], }, moduleFileExtensions: ['fb.js'].concat(defaults.moduleFileExtensions), - modulePathIgnorePatterns: ['scripts/.*/__fixtures__/'], + modulePathIgnorePatterns: [ + 'scripts/.*/__fixtures__/', + '/packages/react-native/sdks/hermes/', + ...PODS_LOCATIONS, + ], unmockedModulePathPatterns: [ 'node_modules/react/', 'packages/react-native/Libraries/Renderer', diff --git a/jest/preprocessor.js b/jest/preprocessor.js index 940806557638..63b9f9aeec2e 100644 --- a/jest/preprocessor.js +++ b/jest/preprocessor.js @@ -12,18 +12,31 @@ 'use strict'; -/* eslint-disable lint/sort-imports */ - -const metroBabelRegister = require('metro-babel-register'); -const nullthrows = require('nullthrows'); -const createCacheKeyFunction = - require('@jest/create-cache-key-function').default; - +// eslint-disable-next-line lint/sort-imports const { - transformSync: babelTransformSync, transformFromAstSync: babelTransformFromAstSync, + transformSync: babelTransformSync, } = require('@babel/core'); const generate = require('@babel/generator').default; +const createCacheKeyFunction = + require('@jest/create-cache-key-function').default; +const metroBabelRegister = require('metro-babel-register'); +const nullthrows = require('nullthrows'); + +if (process.env.FBSOURCE_ENV === '1') { + // If we're running in the Meta-internal monorepo, use the central Babel + // registration, which registers all of the relevant source directories + // including Metro's root. + // + // $FlowExpectedError[cannot-resolve-module] - Won't resolve in OSS + require('@fb-tools/babel-register'); +} else { + // Register Babel to allow local packages to be loaded from source + require('../scripts/babel-register').registerForMonorepo(); +} + +const transformer = require('@react-native/metro-babel-transformer'); +const metroTransformPlugins = require('metro-transform-plugins'); // Files matching this pattern will be transformed with the Node JS Babel // transformer, rather than with the React Native Babel transformer. Scripts @@ -34,10 +47,6 @@ const nodeFiles = /[\\/]metro(?:-[^/]*)[\\/]/; // hook. This is used below to configure babelTransformSync under Jest. const {only: _, ...nodeBabelOptions} = metroBabelRegister.config([]); -// Register Babel to allow the transformer itself to be loaded from source. -require('../scripts/build/babel-register').registerForMonorepo(); -const transformer = require('@react-native/metro-babel-transformer'); - // Set BUILD_EXCLUDE_BABEL_REGISTER (see ../scripts/build/babel-register.js) to // prevent inline Babel registration in code under test, normally required when // running from source, but not in combination with the Jest transformer. @@ -90,8 +99,7 @@ module.exports = { ast: true, retainLines: true, plugins: [ - // TODO(moti): Replace with require('metro-transform-plugins').inlineRequiresPlugin when available in OSS - require('babel-preset-fbjs/plugins/inline-requires'), + metroTransformPlugins.inlineRequiresPlugin, babelPluginPreventBabelRegister, ], sourceType: 'module', diff --git a/package.json b/package.json index 1c7fcef692c6..6168e2890ca7 100644 --- a/package.json +++ b/package.json @@ -3,25 +3,26 @@ "private": true, "version": "1000.0.0", "license": "MIT", + "packageManager": "yarn@1.22.22", "scripts": { - "android": "cd packages/rn-tester && npm run android", + "android": "yarn --cwd packages/rn-tester android", "build-android": "./gradlew :packages:react-native:ReactAndroid:build", "build": "node ./scripts/build/build.js", + "build-types": "node ./scripts/build/build-types.js", "clang-format": "clang-format -i --glob=*/**/*.{h,cpp,m,mm}", "clean": "node ./scripts/build/clean.js", "flow-check": "flow check", "flow": "flow", "format-check": "prettier --list-different \"./**/*.{js,md,yml,ts,tsx}\"", "format": "npm run prettier && npm run clang-format", - "featureflags-check": "cd packages/react-native && yarn featureflags-check", - "featureflags-update": "cd packages/react-native && yarn featureflags-update", - "lint-ci": "./scripts/circleci/analyze_code.sh && yarn shellcheck", + "featureflags": "yarn --cwd packages/react-native featureflags", + "lint-ci": "./.github/workflow-scripts/analyze_code.sh && yarn shellcheck", "lint-java": "node ./scripts/lint-java.js", "lint": "eslint .", "prettier": "prettier --write \"./**/*.{js,md,yml,ts,tsx}\"", "print-packages": "node ./scripts/monorepo/print", - "shellcheck": "./scripts/circleci/analyze_scripts.sh", - "start": "cd packages/rn-tester && npm run start", + "shellcheck": "./.github/workflow-scripts/analyze_scripts.sh", + "start": "yarn --cwd packages/rn-tester start", "set-version": "node ./scripts/releases/set-version.js", "test-android": "./gradlew :packages:react-native:ReactAndroid:test", "test-ci": "jest --maxWorkers=2 --ci --reporters=\"default\" --reporters=\"jest-junit\"", @@ -31,9 +32,9 @@ "test-typescript-offline": "dtslint --localTs node_modules/typescript/lib packages/react-native/types", "test-typescript": "dtslint packages/react-native/types", "test": "jest", + "fantom": "JS_DIR='..' yarn jest --config packages/react-native-fantom/config/jest.config.js", "trigger-react-native-release": "node ./scripts/releases-local/trigger-react-native-release.js", - "update-lock": "npx yarn-deduplicate", - "postinstall": "cd packages/react-native-codegen && yarn build" + "update-lock": "npx yarn-deduplicate" }, "workspaces": [ "packages/*", @@ -44,26 +45,27 @@ "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", "@babel/generator": "^7.25.0", + "@babel/plugin-syntax-typescript": "^7.25.4", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/preset-env": "^7.25.3", "@babel/preset-flow": "^7.24.7", "@definitelytyped/dtslint": "^0.0.127", - "@jest/create-cache-key-function": "^29.6.3", - "@pkgjs/parseargs": "^0.11.0", - "@react-native/metro-babel-transformer": "0.76.0-main", - "@react-native/metro-config": "0.76.0-main", + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/metro-babel-transformer": "0.79.0-rc.1", + "@react-native/metro-config": "0.79.0-rc.1", "@tsconfig/node18": "1.0.1", - "@types/react": "^18.2.6", + "@types/react": "^19.0.0", "@typescript-eslint/parser": "^7.1.1", "ansi-styles": "^4.2.1", "babel-plugin-minify-dead-code-elimination": "^0.5.2", - "babel-plugin-syntax-hermes-parser": "0.23.1", + "babel-plugin-syntax-hermes-parser": "0.25.1", "babel-plugin-transform-define": "^2.1.4", "babel-plugin-transform-flow-enums": "^0.0.2", - "babel-preset-fbjs": "^3.4.0", "chalk": "^4.0.0", "clang-format": "^1.8.0", "connect": "^3.6.5", + "debug": "^2.2.0", + "deep-equal": "1.1.1", "eslint": "^8.57.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-babel": "^5.3.1", @@ -72,39 +74,41 @@ "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.6.0", "eslint-plugin-lint": "^1.0.0", - "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-native": "^4.0.0", "eslint-plugin-redundant-undefined": "^0.4.0", "eslint-plugin-relay": "^1.8.3", - "flow-api-translator": "0.23.1", - "flow-bin": "^0.245.2", + "flow-api-translator": "0.25.1", + "flow-bin": "^0.262.0", "glob": "^7.1.1", - "hermes-eslint": "0.23.1", - "hermes-transform": "0.23.1", + "hermes-eslint": "0.25.1", + "hermes-transform": "0.25.1", "inquirer": "^7.1.0", - "jest": "^29.6.3", + "jest": "^29.7.0", + "jest-diff": "^29.7.0", "jest-junit": "^10.0.0", + "jest-snapshot": "^29.7.0", "jscodeshift": "^0.14.0", - "metro-babel-register": "^0.80.10", - "metro-memory-fs": "^0.80.10", + "metro-babel-register": "^0.82.0", + "metro-memory-fs": "^0.82.0", + "metro-transform-plugins": "^0.82.0", "micromatch": "^4.0.4", - "mkdirp": "^0.5.1", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", "prettier": "2.8.8", - "prettier-plugin-hermes-parser": "0.23.1", - "react": "19.0.0-rc-fb9a90fa48-20240614", - "react-test-renderer": "19.0.0-rc-fb9a90fa48-20240614", + "prettier-plugin-hermes-parser": "0.25.1", + "react": "19.0.0", + "react-test-renderer": "19.0.0", "rimraf": "^3.0.2", "shelljs": "^0.8.5", "signedsource": "^1.0.0", "supports-color": "^7.1.0", + "tinybench": "^3.1.0", "typescript": "5.0.4", "ws": "^6.2.3" }, "resolutions": { - "react-is": "19.0.0-rc-fb9a90fa48-20240614" + "react-is": "19.0.0" } } diff --git a/packages/assets/package.json b/packages/assets/package.json index 3f5350a2410f..52548c77c470 100644 --- a/packages/assets/package.json +++ b/packages/assets/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/assets-registry", - "version": "0.76.0-main", + "version": "0.79.0-rc.1", "description": "Asset support code for React Native.", "license": "MIT", "repository": { diff --git a/packages/assets/path-support.js b/packages/assets/path-support.js index 7d9388ad1256..bdf2acc3491b 100644 --- a/packages/assets/path-support.js +++ b/packages/assets/path-support.js @@ -4,13 +4,13 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @format * @flow strict + * @format */ 'use strict'; -import type {PackagerAsset} from './registry.js'; +/*:: import type {PackagerAsset} from './registry.js'; */ const androidScaleSuffix = { '0.75': 'ldpi', @@ -27,7 +27,7 @@ const ANDROID_BASE_DENSITY = 160; * FIXME: using number to represent discrete scale numbers is fragile in essence because of * floating point numbers imprecision. */ -function getAndroidAssetSuffix(scale: number): string { +function getAndroidAssetSuffix(scale /*: number */) /*: string */ { if (scale.toString() in androidScaleSuffix) { // $FlowFixMe[invalid-computed-prop] return androidScaleSuffix[scale.toString()]; @@ -47,15 +47,14 @@ const drawableFileTypes = new Set([ 'jpg', 'ktx', 'png', - 'svg', 'webp', 'xml', ]); function getAndroidResourceFolderName( - asset: PackagerAsset, - scale: number, -): string | $TEMPORARY$string<'raw'> { + asset /*: PackagerAsset */, + scale /*: number */, +) /*: string */ { if (!drawableFileTypes.has(asset.type)) { return 'raw'; } @@ -73,15 +72,17 @@ function getAndroidResourceFolderName( return 'drawable-' + suffix; } -function getAndroidResourceIdentifier(asset: PackagerAsset): string { +function getAndroidResourceIdentifier( + asset /*: PackagerAsset */, +) /*: string */ { return (getBasePath(asset) + '/' + asset.name) .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 { +function getBasePath(asset /*: PackagerAsset */) /*: string */ { const basePath = asset.httpServerLocation; return basePath.startsWith('/') ? basePath.slice(1) : basePath; } diff --git a/packages/assets/registry.js b/packages/assets/registry.js index 64b2735d3bb5..14d17d1b9f77 100644 --- a/packages/assets/registry.js +++ b/packages/assets/registry.js @@ -10,6 +10,7 @@ 'use strict'; +/*:: export type AssetDestPathResolver = 'android' | 'generic'; export type PackagerAsset = { @@ -25,16 +26,17 @@ export type PackagerAsset = { +resolver?: AssetDestPathResolver, ... }; +*/ -const assets: Array = []; +const assets /*: Array */ = []; -function registerAsset(asset: PackagerAsset): number { +function registerAsset(asset /*: PackagerAsset */) /*: number */ { // `push` returns new array length, so the first asset will // get id 1 (not 0) to make the value truthy return assets.push(asset); } -function getAssetByID(assetId: number): PackagerAsset { +function getAssetByID(assetId /*: number */) /*: PackagerAsset */ { return assets[assetId - 1]; } diff --git a/packages/babel-plugin-codegen/index.js b/packages/babel-plugin-codegen/index.js index 77de6b77b33a..494688379d3c 100644 --- a/packages/babel-plugin-codegen/index.js +++ b/packages/babel-plugin-codegen/index.js @@ -11,6 +11,7 @@ let FlowParser, TypeScriptParser, RNCodegen; +const {cheap: traverseCheap} = require('@babel/traverse').default; const {basename} = require('path'); try { @@ -168,16 +169,32 @@ module.exports = function ({parse, types: t}) { exit(path) { if (this.defaultExport) { const viewConfig = generateViewConfig(this.filename, this.code); - this.defaultExport.replaceWithMultiple( - parse(viewConfig, { - babelrc: false, - browserslistConfigFile: false, - configFile: false, - }).program.body, - ); + + const ast = parse(viewConfig, { + babelrc: false, + browserslistConfigFile: false, + configFile: false, + }); + + // Almost the whole file is replaced with the viewConfig generated code that doesn't + // have a clear equivalent code on the source file when the user debugs, so we point + // it to the location of the default export that in that file, which is the closest + // to representing the code that is being generated. + // This is mostly useful when that generated code throws an error. + traverseCheap(ast, node => { + if (node?.loc) { + node.loc = this.defaultExport.node.loc; + node.start = this.defaultExport.node.start; + node.end = this.defaultExport.node.end; + } + }); + + this.defaultExport.replaceWithMultiple(ast.program.body); + if (this.commandsExport != null) { this.commandsExport.remove(); } + this.codeInserted = true; } }, diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index 57e7fc4854fd..cd1e08ba529b 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.76.0-main", + "version": "0.79.0-rc.1", "description": "Babel plugin to generate native module and view manager code for React Native.", "license": "MIT", "repository": { @@ -25,7 +25,8 @@ "index.js" ], "dependencies": { - "@react-native/codegen": "0.76.0-main" + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.79.0-rc.1" }, "devDependencies": { "@babel/core": "^7.25.2" diff --git a/packages/community-cli-plugin/README.md b/packages/community-cli-plugin/README.md index 12fcffb9c026..dc4c687208c3 100644 --- a/packages/community-cli-plugin/README.md +++ b/packages/community-cli-plugin/README.md @@ -15,7 +15,7 @@ Start the React Native development server. #### Usage ```sh -npx react-native start [options] +npx @react-native-community/cli start [options] ``` #### Options @@ -37,6 +37,7 @@ npx react-native start [options] | `--cert ` | Specify path to a custom SSL cert. | | `--config ` | Path to the CLI configuration file. | | `--no-interactive` | Disable interactive mode. | +| `--client-logs` | **[Deprecated]** Enable plain text JavaScript log streaming for all connected apps. | ### `bundle` @@ -45,7 +46,7 @@ Build the bundle for the provided JavaScript entry file. #### Usage ```sh -npx react-native bundle --entry-file [options] +npx @react-native-community/cli bundle --entry-file [options] ``` #### Options diff --git a/packages/community-cli-plugin/index.js.flow b/packages/community-cli-plugin/index.js.flow deleted file mode 100644 index 17ae7ce0503d..000000000000 --- a/packages/community-cli-plugin/index.js.flow +++ /dev/null @@ -1,12 +0,0 @@ -/** - * 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 - * @format - * @oncall react_native - */ - -export * from './src'; diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index df5f7a5d7fb7..b3f26ff46b12 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.76.0-main", + "version": "0.79.0-rc.1", "description": "Core CLI commands for React Native", "keywords": [ "react-native", @@ -22,24 +22,23 @@ "dist" ], "dependencies": { - "@react-native/dev-middleware": "0.76.0-main", - "@react-native/metro-babel-transformer": "0.76.0-main", + "@react-native/dev-middleware": "0.79.0-rc.1", "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.10", - "metro-config": "^0.80.10", - "metro-core": "^0.80.10", - "node-fetch": "^2.2.0", - "readline": "^1.3.0" + "debug": "^2.2.0", + "invariant": "^2.2.4", + "metro": "^0.82.0", + "metro-config": "^0.82.0", + "metro-core": "^0.82.0", + "semver": "^7.1.3" }, "devDependencies": { - "metro-resolver": "^0.80.10" + "metro-resolver": "^0.82.0" }, "peerDependencies": { - "@react-native-community/cli-server-api": "*" + "@react-native-community/cli": "*" }, "peerDependenciesMeta": { - "@react-native-community/cli-server-api": { + "@react-native-community/cli": { "optional": true } }, diff --git a/packages/community-cli-plugin/src/commands/bundle/buildBundle.js b/packages/community-cli-plugin/src/commands/bundle/buildBundle.js index 8cfce1f1699c..c18aa9bc06ca 100644 --- a/packages/community-cli-plugin/src/commands/bundle/buildBundle.js +++ b/packages/community-cli-plugin/src/commands/bundle/buildBundle.js @@ -14,7 +14,6 @@ import type {ConfigT} from 'metro-config'; import type {RequestOptions} from 'metro/src/shared/types.flow'; import loadMetroConfig from '../../utils/loadMetroConfig'; -import {logger} from '../../utils/logger'; import parseKeyValueParamArray from '../../utils/parseKeyValueParamArray'; import saveAssets from './saveAssets'; import chalk from 'chalk'; @@ -72,13 +71,13 @@ async function buildBundleWithConfig( ); if (config.resolver.platforms.indexOf(args.platform) === -1) { - logger.error( - `Invalid platform ${ + console.error( + `${chalk.red('error')}: Invalid platform ${ args.platform ? `"${chalk.bold(args.platform)}" ` : '' }selected.`, ); - logger.info( + console.info( `Available platforms are: ${config.resolver.platforms .map(x => `"${chalk.bold(x)}"`) .join( @@ -123,7 +122,7 @@ async function buildBundleWithConfig( // $FlowIgnore[incompatible-call] // $FlowIgnore[prop-missing] // $FlowIgnore[incompatible-exact] - await bundleImpl.save(bundle, args, logger.info); + await bundleImpl.save(bundle, args, console.info); // Save the assets of the bundle const outputAssets = await server.getAssets({ @@ -140,7 +139,7 @@ async function buildBundleWithConfig( args.assetCatalogDest, ); } finally { - server.end(); + await server.end(); } } diff --git a/packages/community-cli-plugin/src/commands/bundle/saveAssets.js b/packages/community-cli-plugin/src/commands/bundle/saveAssets.js index a92e718182ad..cb40997c3223 100644 --- a/packages/community-cli-plugin/src/commands/bundle/saveAssets.js +++ b/packages/community-cli-plugin/src/commands/bundle/saveAssets.js @@ -11,7 +11,6 @@ import type {AssetData} from 'metro/src/Assets'; -import {logger} from '../../utils/logger'; import { cleanAssetCatalog, getImageSet, @@ -21,6 +20,7 @@ import { import filterPlatformAssetScales from './filterPlatformAssetScales'; import getAssetDestPathAndroid from './getAssetDestPathAndroid'; import getAssetDestPathIOS from './getAssetDestPathIOS'; +import chalk from 'chalk'; import fs from 'fs'; import path from 'path'; @@ -35,7 +35,7 @@ async function saveAssets( assetCatalogDest?: string, ): Promise { if (assetsDest == null) { - logger.warn('Assets destination folder is not set, skipping...'); + console.warn('Warning: Assets destination folder is not set, skipping...'); return; } @@ -64,13 +64,13 @@ async function saveAssets( // remove unused scales from the optimized bundle. const catalogDir = path.join(assetCatalogDest, 'RNAssets.xcassets'); if (!fs.existsSync(catalogDir)) { - logger.error( - `Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`, + console.error( + `${chalk.red('error')}: Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`, ); return; } - logger.info('Adding images to asset catalog', catalogDir); + console.info('Adding images to asset catalog', catalogDir); cleanAssetCatalog(catalogDir); for (const asset of assets) { if (isCatalogAsset(asset)) { @@ -84,7 +84,7 @@ async function saveAssets( addAssetToCopy(asset); } } - logger.info('Done adding images to asset catalog'); + console.info('Done adding images to asset catalog'); } else { assets.forEach(addAssetToCopy); } @@ -98,7 +98,7 @@ function copyAll(filesToCopy: CopiedFiles) { return Promise.resolve(); } - logger.info(`Copying ${queue.length} asset files`); + console.info(`Copying ${queue.length} asset files`); return new Promise((resolve, reject) => { const copyNext = (error?: Error) => { if (error) { @@ -106,7 +106,7 @@ function copyAll(filesToCopy: CopiedFiles) { return; } if (queue.length === 0) { - logger.info('Done copying assets'); + console.info('Done copying assets'); resolve(); } else { // queue.length === 0 is checked in previous branch, so this is string diff --git a/packages/community-cli-plugin/src/commands/start/OpenDebuggerKeyboardHandler.js b/packages/community-cli-plugin/src/commands/start/OpenDebuggerKeyboardHandler.js new file mode 100644 index 000000000000..fafc6e94d82b --- /dev/null +++ b/packages/community-cli-plugin/src/commands/start/OpenDebuggerKeyboardHandler.js @@ -0,0 +1,175 @@ +/** + * 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 + * @oncall react_native + */ + +import type TerminalReporter from 'metro/src/lib/TerminalReporter'; + +import chalk from 'chalk'; + +type PageDescription = $ReadOnly<{ + id: string, + title: string, + description: string, + ... +}>; + +export default class OpenDebuggerKeyboardHandler { + #devServerUrl: string; + #reporter: TerminalReporter; + #targetsShownForSelection: ?$ReadOnlyArray = null; + + constructor({ + devServerUrl, + reporter, + }: { + devServerUrl: string, + reporter: TerminalReporter, + }) { + this.#devServerUrl = devServerUrl; + this.#reporter = reporter; + } + + async #tryOpenDebuggerForTarget(target: PageDescription): Promise { + this.#targetsShownForSelection = null; + this.#clearTerminalMenu(); + + try { + await fetch( + new URL( + '/open-debugger?target=' + encodeURIComponent(target.id), + this.#devServerUrl, + ).href, + {method: 'POST'}, + ); + } catch (e) { + this.#log( + 'error', + 'Failed to open debugger for %s (%s): %s', + target.title, + target.description, + 'Network error', + ); + if (e.cause != null) { + this.#log('error', 'Cause: %s', e.cause); + } + this.#clearTerminalMenu(); + } + } + + /** + * Used in response to 'j' to debug - fetch the available debug targets and: + * - If no targets, warn + * - If one target, open it + * - If more, show a list. The keyboard listener should run subsequent key + * presses through maybeHandleTargetSelection, which will launch the + * debugger if a match is made. + */ + async handleOpenDebugger(): Promise { + this.#setTerminalMenu('Fetching available debugging targets...'); + this.#targetsShownForSelection = null; + + try { + const res = await fetch(this.#devServerUrl + '/json/list', { + method: 'POST', + }); + + if (res.status !== 200) { + throw new Error(`Unexpected status code: ${res.status}`); + } + const targets = (await res.json()) as $ReadOnlyArray; + if (!Array.isArray(targets)) { + throw new Error('Expected array.'); + } + + if (targets.length === 0) { + this.#log('warn', 'No connected targets'); + this.#clearTerminalMenu(); + } else if (targets.length === 1) { + const target = targets[0]; + // eslint-disable-next-line no-void + 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.', + ); + } + + this.#setTerminalMenu( + `Multiple debug targets available, please select:\n ${targets + .slice(0, 9) + .map( + ({title}, i) => + `${chalk.white.inverse(` ${i + 1} `)} - "${title}"`, + ) + .join('\n ')}`, + ); + } + } catch (e) { + this.#log('error', `Failed to fetch debug targets: ${e.message}`); + this.#clearTerminalMenu(); + } + } + + /** + * Handle key presses that correspond to a valid selection from a visible + * selection list. + * + * @return true if we've handled the key as a target selection, false if the + * caller should handle the key. + */ + maybeHandleTargetSelection(keyName: string): boolean { + if (keyName >= '1' && keyName <= '9') { + const targetIndex = Number(keyName) - 1; + if ( + this.#targetsShownForSelection != null && + targetIndex < this.#targetsShownForSelection.length + ) { + const target = this.#targetsShownForSelection[targetIndex]; + // eslint-disable-next-line no-void + void this.#tryOpenDebuggerForTarget(target); + return true; + } + } + return false; + } + + /** + * Dismiss any target selection UI, if shown. + */ + dismiss() { + this.#clearTerminalMenu(); + this.#targetsShownForSelection = null; + } + + #log(level: 'info' | 'warn' | 'error', ...data: Array): void { + this.#reporter.update({ + type: 'unstable_server_log', + level, + data, + }); + } + + #setTerminalMenu(message: string) { + this.#reporter.update({ + type: 'unstable_server_menu_updated', + message, + }); + } + + #clearTerminalMenu() { + this.#reporter.update({ + type: 'unstable_server_menu_cleared', + }); + } +} diff --git a/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js b/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js index fcb387691e40..bc87bf1958f2 100644 --- a/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js +++ b/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js @@ -9,98 +9,127 @@ * @oncall react_native */ -import type {Config} from '@react-native-community/cli-types'; +import type TerminalReporter from 'metro/src/lib/TerminalReporter'; -import {KeyPressHandler} from '../../utils/KeyPressHandler'; -import {logger} from '../../utils/logger'; +import OpenDebuggerKeyboardHandler from './OpenDebuggerKeyboardHandler'; import chalk from 'chalk'; -import execa from 'execa'; -import fetch from 'node-fetch'; +import invariant from 'invariant'; +import readline from 'readline'; +import {ReadStream} from 'tty'; const CTRL_C = '\u0003'; const CTRL_D = '\u0004'; +const RELOAD_TIMEOUT = 500; + +const throttle = (callback: () => void, timeout: number) => { + let previousCallTimestamp = 0; + return () => { + const currentCallTimestamp = new Date().getTime(); + if (currentCallTimestamp - previousCallTimestamp > timeout) { + previousCallTimestamp = currentCallTimestamp; + callback(); + } + }; +}; + +type KeyEvent = { + sequence: string, + name: string, + ctrl: boolean, + meta: boolean, + shift: boolean, +}; export default function attachKeyHandlers({ - cliConfig, devServerUrl, messageSocket, + reporter, }: { - cliConfig: Config, devServerUrl: string, messageSocket: $ReadOnly<{ broadcast: (type: string, params?: Record | null) => void, ... }>, + reporter: TerminalReporter, }) { if (process.stdin.isTTY !== true) { - logger.debug('Interactive mode is not supported in this environment'); + reporter.update({ + type: 'unstable_server_log', + level: 'info', + data: 'Interactive mode is not supported in this environment', + }); return; } - const execaOptions = { - env: {FORCE_COLOR: chalk.supportsColor ? 'true' : 'false'}, - }; + readline.emitKeypressEvents(process.stdin); + setRawMode(true); + + const reload = throttle(() => { + reporter.update({ + type: 'unstable_server_log', + level: 'info', + data: 'Reloading connected app(s)...', + }); + messageSocket.broadcast('reload', null); + }, RELOAD_TIMEOUT); + + const openDebuggerKeyboardHandler = new OpenDebuggerKeyboardHandler({ + reporter, + devServerUrl, + }); - const onPress = async (key: string) => { - switch (key.toLowerCase()) { + process.stdin.on('keypress', (str: string, key: KeyEvent) => { + if (openDebuggerKeyboardHandler.maybeHandleTargetSelection(key.name)) { + return; + } + + switch (key.sequence) { case 'r': - logger.info('Reloading connected app(s)...'); - messageSocket.broadcast('reload', null); + reload(); break; case 'd': - logger.info('Opening Dev Menu...'); + reporter.update({ + type: 'unstable_server_log', + level: 'info', + data: 'Opening Dev Menu...', + }); messageSocket.broadcast('devMenu', null); break; - case 'i': - logger.info('Opening app on iOS...'); - execa( - 'npx', - [ - 'react-native', - 'run-ios', - ...(cliConfig.project.ios?.watchModeCommandParams ?? []), - ], - execaOptions, - ).stdout?.pipe(process.stdout); - break; - case 'a': - logger.info('Opening app on Android...'); - execa( - 'npx', - [ - 'react-native', - 'run-android', - ...(cliConfig.project.android?.watchModeCommandParams ?? []), - ], - execaOptions, - ).stdout?.pipe(process.stdout); - break; case 'j': - // TODO(T192878199): Add multi-target selection - await fetch(devServerUrl + '/open-debugger', {method: 'POST'}); + // eslint-disable-next-line no-void + void openDebuggerKeyboardHandler.handleOpenDebugger(); break; case CTRL_C: case CTRL_D: - logger.info('Stopping server'); - keyPressHandler.stopInterceptingKeyStrokes(); + openDebuggerKeyboardHandler.dismiss(); + reporter.update({ + type: 'unstable_server_log', + level: 'info', + data: 'Stopping server', + }); + setRawMode(false); + process.stdin.pause(); process.emit('SIGINT'); process.exit(); } - }; + }); + + reporter.update({ + type: 'unstable_server_log', + level: 'info', + data: `Key commands available: - const keyPressHandler = new KeyPressHandler(onPress); - keyPressHandler.createInteractionListener(); - keyPressHandler.startInterceptingKeyStrokes(); + ${chalk.bold.inverse(' r ')} - reload app(s) + ${chalk.bold.inverse(' d ')} - open Dev Menu + ${chalk.bold.inverse(' j ')} - open DevTools +`, + }); +} - logger.log( - [ - '', - `${chalk.bold('i')} - run on iOS`, - `${chalk.bold('a')} - run on Android`, - `${chalk.bold('r')} - reload app`, - `${chalk.bold('d')} - open Dev Menu`, - `${chalk.bold('j')} - open DevTools`, - '', - ].join('\n'), +function setRawMode(enable: boolean) { + invariant( + process.stdin instanceof ReadStream, + 'process.stdin must be a readable stream to modify raw mode', ); + process.stdin.setRawMode(enable); } diff --git a/packages/community-cli-plugin/src/commands/start/index.js b/packages/community-cli-plugin/src/commands/start/index.js index cd438b2115fe..7b5ba161dd3c 100644 --- a/packages/community-cli-plugin/src/commands/start/index.js +++ b/packages/community-cli-plugin/src/commands/start/index.js @@ -95,6 +95,14 @@ const startCommand: Command = { name: '--no-interactive', description: 'Disables interactive mode', }, + { + name: '--client-logs', + description: + '[Deprecated] Enable plain text JavaScript log streaming for all ' + + 'connected apps. This feature is deprecated and will be removed in ' + + 'future.', + default: false, + }, ], }; diff --git a/packages/community-cli-plugin/src/commands/start/middleware.js b/packages/community-cli-plugin/src/commands/start/middleware.js index bd2235c3c7f5..e88698bcf852 100644 --- a/packages/community-cli-plugin/src/commands/start/middleware.js +++ b/packages/community-cli-plugin/src/commands/start/middleware.js @@ -9,10 +9,12 @@ * @oncall react_native */ -import type {NextHandleFunction, Server} from 'connect'; +import type {Server} from 'connect'; import type {TerminalReportableEvent} from 'metro/src/lib/TerminalReporter'; -import {logger} from '../../utils/logger'; +import {typeof createDevServerMiddleware as CreateDevServerMiddleware} from '@react-native-community/cli-server-api'; + +const debug = require('debug')('ReactNative:CommunityCliPlugin'); type MiddlewareReturn = { middleware: Server, @@ -30,10 +32,6 @@ type MiddlewareReturn = { ... }; -const noopNextHandle: NextHandleFunction = (req, res, next) => { - next(); -}; - // $FlowFixMe const unusedStubWSServer: ws$WebSocketServer = {}; // $FlowFixMe @@ -45,6 +43,12 @@ const communityMiddlewareFallback = { port: number, watchFolders: $ReadOnlyArray, }): MiddlewareReturn => ({ + // FIXME: Several features will break without community middleware and + // should be migrated into core. + // e.g. used by Libraries/Core/Devtools: + // - /open-stack-frame + // - /open-url + // - /symbolicate middleware: unusedMiddlewareStub, websocketEndpoints: {}, messageSocketEndpoint: { @@ -59,23 +63,32 @@ const communityMiddlewareFallback = { reportEvent: (event: TerminalReportableEvent) => {}, }, }), - indexPageMiddleware: noopNextHandle, }; // Attempt to use the community middleware if it exists, but fallback to // the stubs if it doesn't. try { - const community = require('@react-native-community/cli-server-api'); - communityMiddlewareFallback.indexPageMiddleware = - community.indexPageMiddleware; - communityMiddlewareFallback.createDevServerMiddleware = - community.createDevServerMiddleware; + // `@react-native-community/cli` is an optional peer dependency of this + // package, and should be a dev dependency of the host project (via the + // community template's package.json). + const communityCliPath = require.resolve('@react-native-community/cli'); + + // Until https://github.com/react-native-community/cli/pull/2605 lands, + // we need to find `@react-native-community/cli-server-api` via + // `@react-native-community/cli`. Once that lands, we can simply + // require('@react-native-community/cli'). + const communityCliServerApiPath = require.resolve( + '@react-native-community/cli-server-api', + {paths: [communityCliPath]}, + ); + // $FlowIgnore[unsupported-syntax] dynamic import + communityMiddlewareFallback.createDevServerMiddleware = require( + communityCliServerApiPath, + ).createDevServerMiddleware as CreateDevServerMiddleware; } catch { - logger.debug(`⚠️ Unable to find @react-native-community/cli-server-api + debug(`⚠️ Unable to find @react-native-community/cli-server-api Starting the server without the community middleware.`); } export const createDevServerMiddleware = communityMiddlewareFallback.createDevServerMiddleware; -export const indexPageMiddleware = - communityMiddlewareFallback.indexPageMiddleware; diff --git a/packages/community-cli-plugin/src/commands/start/runServer.js b/packages/community-cli-plugin/src/commands/start/runServer.js index 407800a72ead..d4a8636ac45d 100644 --- a/packages/community-cli-plugin/src/commands/start/runServer.js +++ b/packages/community-cli-plugin/src/commands/start/runServer.js @@ -14,15 +14,12 @@ import type {Reporter} from 'metro/src/lib/reporting'; import type {TerminalReportableEvent} from 'metro/src/lib/TerminalReporter'; import typeof TerminalReporter from 'metro/src/lib/TerminalReporter'; +import createDevMiddlewareLogger from '../../utils/createDevMiddlewareLogger'; import isDevServerRunning from '../../utils/isDevServerRunning'; import loadMetroConfig from '../../utils/loadMetroConfig'; -import {logger} from '../../utils/logger'; import * as version from '../../utils/version'; import attachKeyHandlers from './attachKeyHandlers'; -import { - createDevServerMiddleware, - indexPageMiddleware, -} from '@react-native-community/cli-server-api'; +import {createDevServerMiddleware} from './middleware'; import {createDevMiddleware} from '@react-native/dev-middleware'; import chalk from 'chalk'; import Metro from 'metro'; @@ -47,14 +44,15 @@ export type StartCommandArgs = { config?: string, projectRoot?: string, interactive: boolean, + clientLogs: boolean, }; async function runServer( _argv: Array, - ctx: Config, + cliConfig: Config, args: StartCommandArgs, ) { - const metroConfig = await loadMetroConfig(ctx, { + const metroConfig = await loadMetroConfig(cliConfig, { config: args.config, maxWorkers: args.maxWorkers, port: args.port, @@ -72,24 +70,26 @@ async function runServer( const protocol = args.https === true ? 'https' : 'http'; const devServerUrl = url.format({protocol, hostname, port}); - logger.info(`Welcome to React Native v${ctx.reactNativeVersion}`); + console.info( + chalk.blue(`\nWelcome to React Native v${cliConfig.reactNativeVersion}`), + ); const serverStatus = await isDevServerRunning(devServerUrl, projectRoot); if (serverStatus === 'matched_server_running') { - logger.info( + console.info( `A dev server is already running for this project on port ${port}. Exiting.`, ); return; } else if (serverStatus === 'port_taken') { - logger.error( - `Another process is running on port ${port}. Please terminate this ` + + console.error( + `${chalk.red('error')}: Another process is running on port ${port}. Please terminate this ` + 'process and try again, or use another port with "--port".', ); return; } - logger.info(`Starting dev server on port ${chalk.bold(String(port))}...`); + console.info(`Starting dev server on ${devServerUrl}\n`); if (args.assetPlugins) { // $FlowIgnore[cannot-write] Assigning to readonly property @@ -97,6 +97,16 @@ async function runServer( require.resolve(plugin), ); } + // TODO(T214991636): Remove legacy Metro log forwarding + if (!args.clientLogs) { + // $FlowIgnore[cannot-write] Assigning to readonly property + metroConfig.server.forwardClientLogs = false; + } + + let reportEvent: (event: TerminalReportableEvent) => void; + const terminal = new Terminal(process.stdout); + const ReporterImpl = getReporterImpl(args.customLogReporterPath); + const terminalReporter = new ReporterImpl(terminal); const { middleware: communityMiddleware, @@ -111,13 +121,9 @@ async function runServer( const {middleware, websocketEndpoints} = createDevMiddleware({ projectRoot, serverBaseUrl: devServerUrl, - logger, + logger: createDevMiddlewareLogger(terminalReporter), }); - let reportEvent: (event: TerminalReportableEvent) => void; - const terminal = new Terminal(process.stdout); - const ReporterImpl = getReporterImpl(args.customLogReporterPath); - const terminalReporter = new ReporterImpl(terminal); const reporter: Reporter = { update(event: TerminalReportableEvent) { terminalReporter.update(event); @@ -125,11 +131,15 @@ async function runServer( reportEvent(event); } if (args.interactive && event.type === 'initialize_done') { - logger.info('Dev server ready'); + terminalReporter.update({ + type: 'unstable_server_log', + level: 'info', + data: `Dev server ready. ${chalk.dim('Press Ctrl+C to exit.')}`, + }); attachKeyHandlers({ - cliConfig: ctx, devServerUrl, messageSocket: messageSocketEndpoint, + reporter: terminalReporter, }); } }, @@ -142,11 +152,7 @@ async function runServer( secure: args.https, secureCert: args.cert, secureKey: args.key, - unstable_extraMiddleware: [ - communityMiddleware, - indexPageMiddleware, - middleware, - ], + unstable_extraMiddleware: [communityMiddleware, middleware], websocketEndpoints: { ...communityWebsocketEndpoints, ...websocketEndpoints, @@ -167,7 +173,7 @@ async function runServer( // serverInstance.keepAliveTimeout = 30000; - await version.logIfUpdateAvailable(ctx.root); + await version.logIfUpdateAvailable(cliConfig, terminalReporter); } function getReporterImpl(customLogReporterPath?: string): TerminalReporter { diff --git a/packages/community-cli-plugin/src/index.js b/packages/community-cli-plugin/src/index.js index c95fbd8400e1..82b4e1d8f883 100644 --- a/packages/community-cli-plugin/src/index.js +++ b/packages/community-cli-plugin/src/index.js @@ -14,7 +14,7 @@ export type * from './index.flow'; */ if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) { - require('../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../scripts/babel-register').registerForMonorepo(); } module.exports = require('./index.flow'); diff --git a/packages/community-cli-plugin/src/utils/KeyPressHandler.js b/packages/community-cli-plugin/src/utils/KeyPressHandler.js deleted file mode 100644 index af3609f8da44..000000000000 --- a/packages/community-cli-plugin/src/utils/KeyPressHandler.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * 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 - * @oncall react_native - */ - -import {CLIError} from './errors'; -import {logger} from './logger'; - -const CTRL_C = '\u0003'; - -/** An abstract key stroke interceptor. */ -export class KeyPressHandler { - _isInterceptingKeyStrokes = false; - _isHandlingKeyPress = false; - _onPress: (key: string) => Promise; - - constructor(onPress: (key: string) => Promise) { - this._onPress = onPress; - } - - /** Start observing interaction pause listeners. */ - createInteractionListener(): ({pause: boolean, ...}) => void { - // Support observing prompts. - let wasIntercepting = false; - - const listener = ({pause}: {pause: boolean, ...}) => { - if (pause) { - // Track if we were already intercepting key strokes before pausing, so we can - // resume after pausing. - wasIntercepting = this._isInterceptingKeyStrokes; - this.stopInterceptingKeyStrokes(); - } else if (wasIntercepting) { - // Only start if we were previously intercepting. - this.startInterceptingKeyStrokes(); - } - }; - - return listener; - } - - _handleKeypress = async (key: string): Promise => { - // Prevent sending another event until the previous event has finished. - if (this._isHandlingKeyPress && key !== CTRL_C) { - return; - } - this._isHandlingKeyPress = true; - try { - logger.debug(`Key pressed: ${key}`); - await this._onPress(key); - } catch (error) { - return new CLIError('There was an error with the key press handler.'); - } finally { - this._isHandlingKeyPress = false; - return; - } - }; - - /** Start intercepting all key strokes and passing them to the input `onPress` method. */ - startInterceptingKeyStrokes() { - if (this._isInterceptingKeyStrokes) { - return; - } - this._isInterceptingKeyStrokes = true; - const {stdin} = process; - // $FlowFixMe[prop-missing] - stdin.setRawMode(true); - stdin.resume(); - stdin.setEncoding('utf8'); - stdin.on('data', this._handleKeypress); - } - - /** Stop intercepting all key strokes. */ - stopInterceptingKeyStrokes() { - if (!this._isInterceptingKeyStrokes) { - return; - } - this._isInterceptingKeyStrokes = false; - const {stdin} = process; - stdin.removeListener('data', this._handleKeypress); - // $FlowFixMe[prop-missing] - stdin.setRawMode(false); - stdin.resume(); - } -} diff --git a/packages/community-cli-plugin/src/utils/createDevMiddlewareLogger.js b/packages/community-cli-plugin/src/utils/createDevMiddlewareLogger.js new file mode 100644 index 000000000000..2bbc0487b231 --- /dev/null +++ b/packages/community-cli-plugin/src/utils/createDevMiddlewareLogger.js @@ -0,0 +1,44 @@ +/** + * 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 + * @oncall react_native + */ + +import type TerminalReporter from 'metro/src/lib/TerminalReporter'; + +type LoggerFn = (...message: $ReadOnlyArray) => void; + +/** + * Create a dev-middleware logger object that will emit logs via Metro's + * terminal reporter. + */ +export default function createDevMiddlewareLogger( + reporter: TerminalReporter, +): $ReadOnly<{ + info: LoggerFn, + error: LoggerFn, + warn: LoggerFn, +}> { + return { + info: makeLogger(reporter, 'info'), + warn: makeLogger(reporter, 'warn'), + error: makeLogger(reporter, 'error'), + }; +} + +function makeLogger( + reporter: TerminalReporter, + level: 'info' | 'warn' | 'error', +): LoggerFn { + return (...data: Array) => + reporter.update({ + type: 'unstable_server_log', + level, + data, + }); +} diff --git a/packages/community-cli-plugin/src/utils/isDevServerRunning.js b/packages/community-cli-plugin/src/utils/isDevServerRunning.js index 7f154afd0799..0d4cbe7aa75f 100644 --- a/packages/community-cli-plugin/src/utils/isDevServerRunning.js +++ b/packages/community-cli-plugin/src/utils/isDevServerRunning.js @@ -10,7 +10,6 @@ */ import net from 'net'; -import fetch from 'node-fetch'; /** * Determine whether we can run the dev server. diff --git a/packages/community-cli-plugin/src/utils/loadMetroConfig.js b/packages/community-cli-plugin/src/utils/loadMetroConfig.js index 3d116c4946b6..6a6c7a4b7f5a 100644 --- a/packages/community-cli-plugin/src/utils/loadMetroConfig.js +++ b/packages/community-cli-plugin/src/utils/loadMetroConfig.js @@ -13,11 +13,12 @@ import type {Config} from '@react-native-community/cli-types'; import type {ConfigT, InputConfigT, YargArguments} from 'metro-config'; import {CLIError} from './errors'; -import {logger} from './logger'; import {reactNativePlatformResolver} from './metroPlatformResolver'; import {loadConfig, mergeConfig, resolveConfig} from 'metro-config'; import path from 'path'; +const debug = require('debug')('ReactNative:CommunityCliPlugin'); + export type {Config}; export type ConfigLoadingContext = $ReadOnly<{ @@ -92,7 +93,7 @@ export default async function loadMetroConfig( throw new CLIError(`No Metro config found in ${cwd}`); } - logger.debug(`Reading Metro config from ${projectConfig.filepath}`); + debug(`Reading Metro config from ${projectConfig.filepath}`); if (!global.__REACT_NATIVE_METRO_CONFIG_LOADED) { const warning = ` @@ -105,7 +106,7 @@ This warning will be removed in future (https://github.com/facebook/metro/issues `; for (const line of warning.trim().split('\n')) { - logger.warn(line); + console.warn(line); } } diff --git a/packages/community-cli-plugin/src/utils/logger.js b/packages/community-cli-plugin/src/utils/logger.js deleted file mode 100644 index 6b30a5287ebe..000000000000 --- a/packages/community-cli-plugin/src/utils/logger.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * 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 - * @oncall react_native - */ - -import chalk from 'chalk'; - -const SEPARATOR = ', '; - -let verbose: boolean = process.argv.includes('--verbose'); -let disabled: boolean = false; -let hidden: boolean = false; - -const formatMessages = (messages: Array) => - chalk.reset(messages.join(SEPARATOR)); - -const success = (...messages: Array) => { - if (!disabled) { - console.log(`${chalk.green.bold('success')} ${formatMessages(messages)}`); - } -}; - -const info = (...messages: Array) => { - if (!disabled) { - console.log(`${chalk.cyan.bold('info')} ${formatMessages(messages)}`); - } -}; - -const warn = (...messages: Array) => { - if (!disabled) { - console.warn(`${chalk.yellow.bold('warn')} ${formatMessages(messages)}`); - } -}; - -const error = (...messages: Array) => { - if (!disabled) { - console.error(`${chalk.red.bold('error')} ${formatMessages(messages)}`); - } -}; - -const debug = (...messages: Array) => { - if (verbose && !disabled) { - console.log(`${chalk.gray.bold('debug')} ${formatMessages(messages)}`); - } else { - hidden = true; - } -}; - -const log = (...messages: Array) => { - if (!disabled) { - console.log(`${formatMessages(messages)}`); - } -}; - -const setVerbose = (level: boolean) => { - verbose = level; -}; - -const isVerbose = (): boolean => verbose; - -const disable = () => { - disabled = true; -}; - -const enable = () => { - disabled = false; -}; - -const hasDebugMessages = (): boolean => hidden; - -let communityLogger; -try { - const {logger} = require('@react-native-community/cli-tools'); - logger.debug("Using @react-naive-community/cli-tools' logger"); - communityLogger = logger; -} catch { - // This is no longer a required dependency in react-native projects, but use it instead of - // our forked version if it's available. Fail silently otherwise. -} - -type Logger = $ReadOnly<{ - debug: (...message: Array) => void, - error: (...message: Array) => void, - log: (...message: Array) => void, - info: (...message: Array) => void, - warn: (...message: Array) => void, - ... -}>; - -export const logger: Logger = communityLogger ?? { - success, - info, - warn, - error, - debug, - log, - setVerbose, - isVerbose, - hasDebugMessages, - disable, - enable, -}; - -if (communityLogger == null) { - logger.debug("Using @react-native/communityu-cli-plugin's logger"); -} diff --git a/packages/community-cli-plugin/src/utils/version.js b/packages/community-cli-plugin/src/utils/version.js index bfbefc799c9a..15e5f3852275 100644 --- a/packages/community-cli-plugin/src/utils/version.js +++ b/packages/community-cli-plugin/src/utils/version.js @@ -9,12 +9,14 @@ * @oncall react_native */ -import {logger} from './logger'; +import type {Config} from '@react-native-community/cli-types'; +import type TerminalReporter from 'metro/src/lib/TerminalReporter'; + import chalk from 'chalk'; -import {readFileSync} from 'fs'; -import path from 'path'; import semver from 'semver'; +const debug = require('debug')('ReactNative:CommunityCliPlugin'); + type Release = { // The current stable release stable: string, @@ -35,15 +37,6 @@ interface DiffPurge { node_id: string; } -type Update = { - // Only populated if an upgrade is available - upgrade?: Release, - // The project's package's current version - current: string, - // The project's package's name - name: string, -}; - type LatestVersions = { candidate?: string, stable: string, @@ -54,74 +47,52 @@ type Headers = { [header: string]: string, }; -function getReactNativeVersion(projectRoot: string): string | void { - try { - const resolvedPath: string = require.resolve('react-native/package.json', { - paths: [projectRoot], - }); - logger.debug( - `Found 'react-native' from '${projectRoot}' -> '${resolvedPath}'`, - ); - return JSON.parse(readFileSync(resolvedPath, 'utf8')).version; - } catch { - logger.debug("Couldn't read the version of 'react-native'"); - return; - } -} - /** * Logs out a message if the user's version is behind a stable version of React Native */ -export async function logIfUpdateAvailable(projectRoot: string): Promise { - const versions = await latest(projectRoot); - if (!versions?.upgrade) { - return; - } - if (semver.gt(versions.upgrade.stable, versions.current)) { - logger.info( - `React Native v${versions.upgrade.stable} is now available (your project is running on v${versions.name}). -Changelog: ${chalk.dim.underline(versions.upgrade?.changelogUrl ?? 'none')} -Diff: ${chalk.dim.underline(versions.upgrade?.diffUrl ?? 'none')} -`, - ); - } -} +export async function logIfUpdateAvailable( + cliConfig: Config, + reporter: TerminalReporter, +): Promise { + const {reactNativeVersion: currentVersion} = cliConfig; + let newVersion = null; -/** - * Finds the latest stables version of React Native > current version - */ -async function latest(projectRoot: string): Promise { try { - const currentVersion = getReactNativeVersion(projectRoot); - if (currentVersion == null) { - return; - } - const {name} = JSON.parse( - readFileSync(path.join(projectRoot, 'package.json'), 'utf8'), - ); - const upgrade = await getLatestRelease(name, currentVersion); + const upgrade = await getLatestRelease(currentVersion); if (upgrade) { - return { - name, - current: currentVersion, - upgrade, - }; + newVersion = upgrade; } } catch (e) { // We let the flow continue as this component is not vital for the rest of // the CLI. - logger.debug( + debug( 'Cannot detect current version of React Native, ' + 'skipping check for a newer release', ); - logger.debug(e); + debug(e); + } + + if (newVersion == null) { + return; + } + + if (semver.gt(newVersion.stable, currentVersion)) { + reporter.update({ + type: 'unstable_server_log', + level: 'info', + data: `React Native v${newVersion.stable} is now available (your project is running on v${currentVersion}). +Changelog: ${chalk.dim.underline(newVersion?.changelogUrl ?? 'none')} +Diff: ${chalk.dim.underline(newVersion?.diffUrl ?? 'none')} +`, + }); } } // $FlowFixMe function isDiffPurgeEntry(data: Partial): data is DiffPurge { return ( + // $FlowFixMe[incompatible-type-guard] [data.name, data.zipball_url, data.tarball_url, data.node_id].filter( e => typeof e !== 'undefined', ).length === 0 @@ -136,12 +107,11 @@ function isDiffPurgeEntry(data: Partial): data is DiffPurge { * will return undefined. */ export default async function getLatestRelease( - name: string, currentVersion: string, ): Promise { - logger.debug('Checking for a newer version of React Native'); + debug('Checking for a newer version of React Native'); try { - logger.debug(`Current version: ${currentVersion}`); + debug(`Current version: ${currentVersion}`); // if the version is a nightly/canary build, we want to bail // since they are nightlies or unreleased versions @@ -149,14 +119,14 @@ export default async function getLatestRelease( return; } - logger.debug('Checking for newer releases on GitHub'); - const latestVersion = await getLatestRnDiffPurgeVersion(name); + debug('Checking for newer releases on GitHub'); + const latestVersion = await getLatestRnDiffPurgeVersion(); if (latestVersion == null) { - logger.debug('Failed to get latest release'); + debug('Failed to get latest release'); return; } const {stable, candidate} = latestVersion; - logger.debug(`Latest release: ${stable} (${candidate ?? ''})`); + debug(`Latest release: ${stable} (${candidate ?? ''})`); if (semver.compare(stable, currentVersion) >= 0) { return { @@ -167,10 +137,8 @@ export default async function getLatestRelease( }; } } catch (e) { - logger.debug( - 'Something went wrong with remote version checking, moving on', - ); - logger.debug(e); + debug('Something went wrong with remote version checking, moving on'); + debug(e); } } @@ -185,9 +153,7 @@ function buildDiffUrl(oldVersion: string, newVersion: string) { /** * Returns the most recent React Native version available to upgrade to. */ -async function getLatestRnDiffPurgeVersion( - name: string, -): Promise { +async function getLatestRnDiffPurgeVersion(): Promise { const options = { // https://developer.github.com/v3/#user-agent-required headers: {'User-Agent': '@react-native/community-cli-plugin'} as Headers, diff --git a/packages/core-cli-utils/package.json b/packages/core-cli-utils/package.json index 629ca36e9982..f50e39b9b18b 100644 --- a/packages/core-cli-utils/package.json +++ b/packages/core-cli-utils/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/core-cli-utils", - "version": "0.76.0-main", + "version": "0.79.0-rc.1", "description": "React Native CLI library for Frameworks to build on", "license": "MIT", "main": "./src/index.flow.js", diff --git a/packages/core-cli-utils/src/index.js b/packages/core-cli-utils/src/index.js index 092239e58a61..baa362979221 100644 --- a/packages/core-cli-utils/src/index.js +++ b/packages/core-cli-utils/src/index.js @@ -14,7 +14,7 @@ export type * from './index.flow'; */ if (process.env.BUILD_EXCLUDE_BABEL_REGISTER == null) { - require('../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../scripts/babel-register').registerForMonorepo(); } module.exports = require('./index.flow'); diff --git a/packages/core-cli-utils/src/private/apple.js b/packages/core-cli-utils/src/private/apple.js index c6a41b743705..6363092cea0d 100644 --- a/packages/core-cli-utils/src/private/apple.js +++ b/packages/core-cli-utils/src/private/apple.js @@ -71,7 +71,14 @@ function checkPodfileInSyncWithManifest( const FIRST = 1, SECOND = 2, - THIRD = 3; + THIRD = 3, + FOURTH = 4, + FIFTH = 5; + +function getNodePackagePath(packageName: string): string { + // $FlowIgnore[prop-missing] type definition is incomplete + return require.resolve(packageName, {cwd: [process.cwd(), ...module.paths]}); +} /* eslint sort-keys: "off" */ export const tasks = { @@ -79,26 +86,51 @@ export const tasks = { bootstrap: ( options: AppleBootstrapOption, ): { + cleanupBuildFolder: Task, + runCodegen: Task, validate: Task, installRubyGems: Task, installDependencies: Task, } => ({ - validate: task(FIRST, 'Check Cocoapods and bundle are available', () => { + cleanupBuildFolder: task(FIRST, 'Cleanup build folder', () => { + execa.sync('rm', ['-rf', 'build'], { + cwd: options.cwd, + }); + }), + runCodegen: task(SECOND, 'Run codegen', () => { + const reactNativePath = path.dirname(getNodePackagePath('react-native')); + const codegenScript = path.join( + reactNativePath, + 'scripts', + 'generate-codegen-artifacts.js', + ); + execa.sync('node', [ + codegenScript, + '-p', + process.cwd(), + '-o', + options.cwd, + '-t', + 'ios', + ]); + }), + validate: task(THIRD, 'Check Cocoapods and bundle are available', () => { assertDependencies( isOnPath('pod', 'CocoaPods'), isOnPath('bundle', "Bundler to manage Ruby's gems"), ); }), - installRubyGems: task(SECOND, 'Install Ruby Gems', () => + installRubyGems: task(FOURTH, 'Install Ruby Gems', () => execa('bundle', ['install'], { cwd: options.cwd, }), ), - installDependencies: task(THIRD, 'Install CocoaPods dependencies', () => { + installDependencies: task(FIFTH, 'Install CocoaPods dependencies', () => { const env = { RCT_NEW_ARCH_ENABLED: options.newArchitecture ? '1' : '0', USE_FRAMEWORKS: options.frameworks, USE_HERMES: options.hermes ? '1' : '0', + RCT_IGNORE_PODS_DEPRECATION: '1', }; if (options.frameworks == null) { delete env.USE_FRAMEWORKS; diff --git a/packages/core-cli-utils/src/public/version.js b/packages/core-cli-utils/src/public/version.js index 56ecb01ba751..4b22c1e3f972 100644 --- a/packages/core-cli-utils/src/public/version.js +++ b/packages/core-cli-utils/src/public/version.js @@ -14,7 +14,7 @@ export type * from './version.flow'; */ if (process.env.BUILD_EXCLUDE_BABEL_REGISTER == null) { - require('../../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../../scripts/babel-register').registerForMonorepo(); } module.exports = require('./version.flow'); diff --git a/packages/debugger-frontend/BUILD_INFO b/packages/debugger-frontend/BUILD_INFO index 61f0f52efcbc..683a8a053430 100644 --- a/packages/debugger-frontend/BUILD_INFO +++ b/packages/debugger-frontend/BUILD_INFO @@ -1,5 +1,5 @@ -@generated SignedSource<> -Git revision: a556d261a5e2131864f4e38ded62d8f90e81c39a +@generated SignedSource<<347069bf171def94f2e48bf1e82bb02d>> +Git revision: 97e9912605ce73b06f67fc607c1a5c434a67d6de Built with --nohooks: false Is local checkout: false Remote URL: https://github.com/facebookexperimental/rn-chrome-devtools-frontend diff --git a/packages/debugger-frontend/README.md b/packages/debugger-frontend/README.md index 741ba72a3011..5860f8268d1e 100644 --- a/packages/debugger-frontend/README.md +++ b/packages/debugger-frontend/README.md @@ -20,7 +20,7 @@ const frontendPath = require('@react-native/debugger-frontend'); ### Source repo -Source code for this package lives in the [facebookexperimental/rn-chrome-devtools-frontend](https://github.com/facebookexperimental/rn-chrome-devtools-frontend) repo. See below for how we build and check in changes. +Source code for this package lives in the [facebook/react-native-devtools-frontend](https://github.com/facebook/react-native-devtools-frontend) repo. See below for how we build and check in changes. ### Updating the frontend assets @@ -34,4 +34,4 @@ node scripts/debugger-frontend/sync-and-build --branch main node scripts/debugger-frontend/sync-and-build --branch 0.73-stable ``` -By default, this will clone and build from [facebookexperimental/rn-chrome-devtools-frontend](https://github.com/facebookexperimental/rn-chrome-devtools-frontend). +By default, this will clone and build from [facebook/react-native-devtools-frontend](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 33484bf15215..102484e30d89 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,7 +20,6 @@ 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/learn-react-devtools', 'url(\"' + new URL('./react_native/learn-react-devtools.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() + '\")'); @@ -100,6 +99,7 @@ style.setProperty('--image-file-database', 'url(\"' + new URL(new URL('database. style.setProperty('--image-file-deployed', 'url(\"' + new URL(new URL('deployed.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-device-fold', 'url(\"' + new URL(new URL('device-fold.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-devices', 'url(\"' + new URL(new URL('devices.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-devtools', 'url(\"' + new URL(new URL('devtools.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-dock-bottom', 'url(\"' + new URL(new URL('dock-bottom.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-dock-left', 'url(\"' + new URL(new URL('dock-left.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-dock-right', 'url(\"' + new URL(new URL('dock-right.svg', import.meta.url).href, import.meta.url).toString() + '\")'); @@ -152,6 +152,7 @@ style.setProperty('--image-file-help', 'url(\"' + new URL(new URL('help.svg', im style.setProperty('--image-file-iframe-crossed', 'url(\"' + new URL(new URL('iframe-crossed.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-iframe', 'url(\"' + new URL(new URL('iframe.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-import', 'url(\"' + new URL(new URL('import.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-indeterminate-question-box', 'url(\"' + new URL(new URL('indeterminate-question-box.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-info-filled', 'url(\"' + new URL(new URL('info-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-info', 'url(\"' + new URL(new URL('info.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-issue-cross-filled', 'url(\"' + new URL(new URL('issue-cross-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")'); @@ -168,7 +169,9 @@ style.setProperty('--image-file-justify-items-center', 'url(\"' + new URL(new UR style.setProperty('--image-file-justify-items-end', 'url(\"' + new URL(new URL('justify-items-end.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-justify-items-start', 'url(\"' + new URL(new URL('justify-items-start.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-justify-items-stretch', 'url(\"' + new URL(new URL('justify-items-stretch.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-keyboard-arrow-right', 'url(\"' + new URL(new URL('keyboard-arrow-right.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-keyboard-pen', 'url(\"' + new URL(new URL('keyboard-pen.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-keyboard', 'url(\"' + new URL(new URL('keyboard.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-large-arrow-right-filled', 'url(\"' + new URL(new URL('large-arrow-right-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-layers-filled', 'url(\"' + new URL(new URL('layers-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-layers', 'url(\"' + new URL(new URL('layers.svg', import.meta.url).href, import.meta.url).toString() + '\")'); @@ -177,6 +180,9 @@ style.setProperty('--image-file-left-panel-open', 'url(\"' + new URL(new URL('le style.setProperty('--image-file-lightbulb-spark', 'url(\"' + new URL(new URL('lightbulb-spark.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-lighthouse_logo', 'url(\"' + new URL(new URL('lighthouse_logo.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-list', 'url(\"' + new URL(new URL('list.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-location-on', 'url(\"' + new URL(new URL('location-on.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-lock', 'url(\"' + new URL(new URL('lock.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-match-case', 'url(\"' + new URL(new URL('match-case.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-match-whole-word', 'url(\"' + new URL(new URL('match-whole-word.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-memory', 'url(\"' + new URL(new URL('memory.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-minus', 'url(\"' + new URL(new URL('minus.svg', import.meta.url).href, import.meta.url).toString() + '\")'); @@ -196,8 +202,10 @@ style.setProperty('--image-file-record-start', 'url(\"' + new URL(new URL('recor style.setProperty('--image-file-record-stop', 'url(\"' + new URL(new URL('record-stop.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-redo', 'url(\"' + new URL(new URL('redo.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-refresh', 'url(\"' + new URL(new URL('refresh.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-regular-expression', 'url(\"' + new URL(new URL('regular-expression.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-replace', 'url(\"' + new URL(new URL('replace.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-replay', 'url(\"' + new URL(new URL('replay.svg', import.meta.url).href, import.meta.url).toString() + '\")'); +style.setProperty('--image-file-report', 'url(\"' + new URL(new URL('report.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-resizeDiagonal', 'url(\"' + new URL(new URL('resizeDiagonal.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-resizeHorizontal', 'url(\"' + new URL(new URL('resizeHorizontal.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-resizeVertical', 'url(\"' + new URL(new URL('resizeVertical.svg', import.meta.url).href, import.meta.url).toString() + '\")'); @@ -208,7 +216,6 @@ style.setProperty('--image-file-right-panel-open', 'url(\"' + new URL(new URL('r style.setProperty('--image-file-scissors', 'url(\"' + new URL(new URL('scissors.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-screen-rotation', 'url(\"' + new URL(new URL('screen-rotation.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-search', 'url(\"' + new URL(new URL('search.svg', import.meta.url).href, import.meta.url).toString() + '\")'); -style.setProperty('--image-file-securityIcons', 'url(\"' + new URL(new URL('securityIcons.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-select-element', 'url(\"' + new URL(new URL('select-element.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-send', 'url(\"' + new URL(new URL('send.svg', import.meta.url).href, import.meta.url).toString() + '\")'); style.setProperty('--image-file-shadow', 'url(\"' + new URL(new URL('shadow.svg', import.meta.url).href, import.meta.url).toString() + '\")'); diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/devtools.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/devtools.svg new file mode 100644 index 000000000000..f08375d44094 --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/devtools.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/indeterminate-question-box.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/indeterminate-question-box.svg new file mode 100644 index 000000000000..7ad02410f19c --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/indeterminate-question-box.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/keyboard-arrow-right.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/keyboard-arrow-right.svg new file mode 100644 index 000000000000..6535967dd4de --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/keyboard-arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/keyboard.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/keyboard.svg new file mode 100644 index 000000000000..3464a7d57e8c --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/keyboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/location-on.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/location-on.svg new file mode 100644 index 000000000000..9591a48ebb1d --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/location-on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/lock.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/lock.svg new file mode 100644 index 000000000000..595e5d3655ae --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/match-case.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/match-case.svg new file mode 100644 index 000000000000..80ca5a9b73ad --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/match-case.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/mouse.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/mouse.svg index 1fc20959d110..c228ef836cdb 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/Images/mouse.svg +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/mouse.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-react-devtools.jpg b/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-react-devtools.jpg deleted file mode 100644 index 123481f6c61a..000000000000 Binary files a/packages/debugger-frontend/dist/third-party/front_end/Images/react_native/learn-react-devtools.jpg and /dev/null differ diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/regular-expression.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/regular-expression.svg new file mode 100644 index 000000000000..026d1435ebaf --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/regular-expression.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/report.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/report.svg new file mode 100644 index 000000000000..cd40abd86931 --- /dev/null +++ b/packages/debugger-frontend/dist/third-party/front_end/Images/report.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Images/securityIcons.svg b/packages/debugger-frontend/dist/third-party/front_end/Images/securityIcons.svg deleted file mode 100644 index 9e14a4172674..000000000000 --- a/packages/debugger-frontend/dist/third-party/front_end/Images/securityIcons.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/debugger-frontend/dist/third-party/front_end/Tests.js b/packages/debugger-frontend/dist/third-party/front_end/Tests.js index 01e84c9bfe7d..f37eb4c84e4f 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/Tests.js +++ b/packages/debugger-frontend/dist/third-party/front_end/Tests.js @@ -942,7 +942,7 @@ function step1() { testPreset( - MobileThrottling.networkPresets[2], + MobileThrottling.networkPresets[3], [ 'offline event: online = false', 'connection change event: type = none; downlinkMax = 0; effectiveType = 4g' ], @@ -951,7 +951,7 @@ function step2() { testPreset( - MobileThrottling.networkPresets[1], + MobileThrottling.networkPresets[2], [ 'online event: online = true', 'connection change event: type = cellular; downlinkMax = 0.3814697265625; effectiveType = 2g' @@ -960,9 +960,15 @@ } function step3() { + testPreset( + MobileThrottling.networkPresets[1], + ['connection change event: type = cellular; downlinkMax = 1.373291015625; effectiveType = 3g'], step4); + } + + function step4() { testPreset( MobileThrottling.networkPresets[0], - ['connection change event: type = cellular; downlinkMax = 1.373291015625; effectiveType = 3g'], + ['connection change event: type = cellular; downlinkMax = 7.724761962890625; effectiveType = 4g'], test.releaseControl.bind(test)); } }; diff --git a/packages/debugger-frontend/dist/third-party/front_end/core/common/common.js b/packages/debugger-frontend/dist/third-party/front_end/core/common/common.js index 45d230e7964d..754cda7acc77 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/core/common/common.js +++ b/packages/debugger-frontend/dist/third-party/front_end/core/common/common.js @@ -1 +1 @@ -import*as t from"../root/root.js";import*as e from"../platform/platform.js";export{UIString}from"../platform/platform.js";import*as r from"../i18n/i18n.js";var s=Object.freeze({__proto__:null});const n=[];var i=Object.freeze({__proto__:null,registerAppProvider:function(t){n.push(t)},getRegisteredAppProviders:function(){return n.filter((e=>t.Runtime.Runtime.isDescriptorEnabled({experiment:void 0,condition:e.condition}))).sort(((t,e)=>(t.order||0)-(e.order||0)))}});const a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=new Uint8Array(123);for(let t=0;t<64;++t)o[a.charCodeAt(t)]=t;var l=Object.freeze({__proto__:null,BASE64_CHARS:a,BASE64_CODES:o,decode:function(t){let e=3*t.length/4>>>0;61===t.charCodeAt(t.length-2)?e-=2:61===t.charCodeAt(t.length-1)&&(e-=1);const r=new Uint8Array(e);for(let e=0,s=0;e>4,r[s++]=(15&i)<<4|a>>2,r[s++]=(3&a)<<6|63&l}return r.buffer}});var h=Object.freeze({__proto__:null,CharacterIdMap:class{#t;#e;#r;constructor(){this.#t=new Map,this.#e=new Map,this.#r=33}toChar(t){let e=this.#t.get(t);if(!e){if(this.#r>=65535)throw new Error("CharacterIdMap ran out of capacity!");e=String.fromCharCode(this.#r++),this.#t.set(t,e),this.#e.set(e,t)}return e}fromChar(t){const e=this.#e.get(t);return void 0===e?null:e}}});const c=.9642,u=.8251;class g{values=[0,0,0];constructor(t){t&&(this.values=t)}}class d{values=[[0,0,0],[0,0,0],[0,0,0]];constructor(t){t&&(this.values=t)}multiply(t){const e=new g;for(let r=0;r<3;++r)e.values[r]=this.values[r][0]*t.values[0]+this.values[r][1]*t.values[1]+this.values[r][2]*t.values[2];return e}}class p{g;a;b;c;d;e;f;constructor(t,e,r=0,s=0,n=0,i=0,a=0){this.g=t,this.a=e,this.b=r,this.c=s,this.d=n,this.e=i,this.f=a}eval(t){const e=t<0?-1:1,r=t*e;return rF?t:t+Math.pow(F-t,D)}function J(t,e){if(t=K(t),e=K(e),Math.abs(t-e)t?(r=(Math.pow(e,V)-Math.pow(t,W))*U,r=r-H?0:r+$),100*r}function Q(t,e,r){function s(){return r?Math.pow(Math.abs(Math.pow(t,M)-(-e-$)/j),1/X):Math.pow(Math.abs(Math.pow(t,V)-(e+$)/U),1/W)}t=K(t),e/=100;let n=s();return(n<0||n>1)&&(r=!r,n=s()),n}const tt=[[12,-1,-1,-1,-1,100,90,80,-1,-1],[14,-1,-1,-1,100,90,80,60,60,-1],[16,-1,-1,100,90,80,60,55,50,50],[18,-1,-1,90,80,60,55,50,40,40],[24,-1,100,80,60,55,50,40,38,35],[30,-1,90,70,55,50,40,38,35,40],[36,-1,80,60,50,40,38,35,30,25],[48,100,70,55,40,38,35,30,25,20],[60,90,60,50,38,35,30,25,20,20],[72,80,55,40,35,30,25,20,20,20],[96,70,50,35,30,25,20,20,20,20],[120,60,40,30,25,20,20,20,20,20]];function et(t,e){const r=72*parseFloat(t.replace("px",""))/96;return(isNaN(Number(e))?["bold","bolder"].includes(e):Number(e)>=600)?r>=14:r>=18}tt.reverse();const rt={aa:3,aaa:4.5},st={aa:4.5,aaa:7};var nt=Object.freeze({__proto__:null,blendColors:E,rgbToHsl:B,rgbaToHsla:C,rgbToHwb:_,rgbaToHwba:O,luminance:G,contrastRatio:function(t,e){const r=G(E(t,e)),s=G(e);return(Math.max(r,s)+.05)/(Math.min(r,s)+.05)},luminanceAPCA:Z,contrastRatioAPCA:Y,contrastRatioByLuminanceAPCA:J,desiredLuminanceAPCA:Q,getAPCAThreshold:function(t,e){const r=parseFloat(t.replace("px","")),s=parseFloat(e);for(const[t,...e]of tt)if(r>=t)for(const[t,r]of[900,800,700,600,500,400,300,200,100].entries())if(s>=r){const r=e[e.length-1-t];return-1===r?null:r}return null},isLargeFont:et,getContrastThreshold:function(t,e){return et(t,e)?rt:st}});function it(t){return(t%360+360)%360}function at(t){const e=t.replace(/(deg|g?rad|turn)$/,"");if(isNaN(e)||t.match(/\s+(deg|g?rad|turn)/))return null;const r=parseFloat(e);return t.includes("turn")?360*r:t.includes("grad")?9*r/10:t.includes("rad")?180*r/Math.PI:r}function ot(t){switch(t){case"srgb":return"srgb";case"srgb-linear":return"srgb-linear";case"display-p3":return"display-p3";case"a98-rgb":return"a98-rgb";case"prophoto-rgb":return"prophoto-rgb";case"rec2020":return"rec2020";case"xyz":return"xyz";case"xyz-d50":return"xyz-d50";case"xyz-d65":return"xyz-d65"}return null}function lt(t,e){const r=Math.sign(t),s=Math.abs(t),[n,i]=e;return r*(s*(i-n)/100+n)}function ht(t,{min:e,max:r}){return null===t||(void 0!==e&&(t=Math.max(t,e)),void 0!==r&&(t=Math.min(t,r))),t}function ct(t,e){if(!t.endsWith("%"))return null;const r=parseFloat(t.substr(0,t.length-1));return isNaN(r)?null:lt(r,e)}function ut(t){const e=parseFloat(t);return isNaN(e)?null:e}function gt(t){return void 0===t?null:ht(ct(t,[0,1])??ut(t),{min:0,max:1})}function dt(t,e=[0,1]){if(isNaN(t.replace("%","")))return null;const r=parseFloat(t);return-1!==t.indexOf("%")?t.indexOf("%")!==t.length-1?null:lt(r,e):r}function pt(t){const e=dt(t);return null===e?null:-1!==t.indexOf("%")?e:e/255}function mt(t){const e=t.replace(/(deg|g?rad|turn)$/,"");if(isNaN(e)||t.match(/\s+(deg|g?rad|turn)/))return null;const r=parseFloat(e);return-1!==t.indexOf("turn")?r%1:-1!==t.indexOf("grad")?r/400%1:-1!==t.indexOf("rad")?r/(2*Math.PI)%1:r/360%1}function yt(t){if(t.indexOf("%")!==t.length-1||isNaN(t.replace("%","")))return null;return parseFloat(t)/100}function ft(t){const e=t[0];let r=t[1];const s=t[2];function n(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}let i;r<0&&(r=0),i=s<=.5?s*(1+r):s+r-s*r;const a=2*s-i,o=e,l=e-1/3;return[n(a,i,e+1/3),n(a,i,o),n(a,i,l),t[3]]}function bt(t){return ft(function(t){const e=t[0];let r=t[1];const s=t[2],n=(2-r)*s;return 0===s||0===r?r=0:r*=s/(n<1?n:2-n),[e,r,n/2,t[3]]}(t))}function wt(t,e,r){function s(){return r?(t+.05)*e-.05:(t+.05)/e-.05}let n=s();return(n<0||n>1)&&(r=!r,n=s()),n}function St(t,e,r,s,n){let i=t[r],a=1,o=n(t)-s,l=Math.sign(o);for(let e=100;e;e--){if(Math.abs(o)<2e-4)return t[r]=i,i;const e=Math.sign(o);if(e!==l)a/=2,l=e;else if(i<0||i>1)return null;i+=a*(2===r?-o:o),t[r]=i,o=n(t)-s}return null}function xt(t,e,r=.01){if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return!1;for(const r in t)if(!xt(t[r],e[r]))return!1;return!0}return!Array.isArray(t)&&!Array.isArray(e)&&(null===t||null===e?t===e:Math.abs(t-e)new Lt(t.#a(!1),"nickname"),hex:t=>new Lt(t.#a(!1),"hex"),shorthex:t=>new Lt(t.#a(!1),"shorthex"),hexa:t=>new Lt(t.#a(!0),"hexa"),shorthexa:t=>new Lt(t.#a(!0),"shorthexa"),rgb:t=>new Lt(t.#a(!1),"rgb"),rgba:t=>new Lt(t.#a(!0),"rgba"),hsl:t=>new Pt(...B(t.#a(!1)),t.alpha),hsla:t=>new Pt(...B(t.#a(!1)),t.alpha),hwb:t=>new kt(..._(t.#a(!1)),t.alpha),hwba:t=>new kt(..._(t.#a(!1)),t.alpha),lch:t=>new Rt(...P.labToLch(t.l,t.a,t.b),t.alpha),oklch:t=>new At(...P.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>t,oklab:t=>new zt(...P.xyzd65ToOklab(...P.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new It("srgb",...P.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new It("srgb-linear",...P.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new It("display-p3",...P.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new It("a98-rgb",...P.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new It("prophoto-rgb",...P.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new It("rec2020",...P.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new It("xyz",...P.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new It("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new It("xyz-d65",...P.xyzd50ToD65(...t.#o()),t.alpha)};#o(){return P.labToXyzd50(this.l,this.a,this.b)}#a(t=!0){const e=P.xyzd50ToSrgb(...this.#o());return t?[...e,this.alpha??void 0]:e}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(t,{min:0,max:100}),(xt(this.l,0,1)||xt(this.l,100,1))&&(e=r=0),this.a=e,this.b=r,this.alpha=ht(s,{min:0,max:1}),this.#s=n}is(t){return t===this.format()}as(t){return Tt.#i[t](this)}asLegacyColor(){return this.as("rgba")}equal(t){const e=t.as("lab");return xt(e.l,this.l,1)&&xt(e.a,this.a)&&xt(e.b,this.b)&&xt(e.alpha,this.alpha)}format(){return"lab"}setAlpha(t){return new Tt(this.l,this.a,this.b,t,void 0)}asString(t){return t?this.as(t).asString():this.#l(this.l,this.a,this.b)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`lab(${e.StringUtilities.stringifyWithPrecision(t,0)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!1}static fromSpec(t,e){const r=ct(t[0],[0,100])??ut(t[0]);if(null===r)return null;const s=ct(t[1],[0,125])??ut(t[1]);if(null===s)return null;const n=ct(t[2],[0,125])??ut(t[2]);if(null===n)return null;const i=gt(t[3]);return new Tt(r,s,n,i,e)}}class Rt{#n;l;c;h;alpha;#s;static#i={nickname:t=>new Lt(t.#a(!1),"nickname"),hex:t=>new Lt(t.#a(!1),"hex"),shorthex:t=>new Lt(t.#a(!1),"shorthex"),hexa:t=>new Lt(t.#a(!0),"hexa"),shorthexa:t=>new Lt(t.#a(!0),"shorthexa"),rgb:t=>new Lt(t.#a(!1),"rgb"),rgba:t=>new Lt(t.#a(!0),"rgba"),hsl:t=>new Pt(...B(t.#a(!1)),t.alpha),hsla:t=>new Pt(...B(t.#a(!1)),t.alpha),hwb:t=>new kt(..._(t.#a(!1)),t.alpha),hwba:t=>new kt(..._(t.#a(!1)),t.alpha),lch:t=>t,oklch:t=>new At(...P.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...P.lchToLab(t.l,t.c,t.h),t.alpha),oklab:t=>new zt(...P.xyzd65ToOklab(...P.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new It("srgb",...P.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new It("srgb-linear",...P.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new It("display-p3",...P.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new It("a98-rgb",...P.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new It("prophoto-rgb",...P.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new It("rec2020",...P.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new It("xyz",...P.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new It("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new It("xyz-d65",...P.xyzd50ToD65(...t.#o()),t.alpha)};#o(){return P.labToXyzd50(...P.lchToLab(this.l,this.c,this.h))}#a(t=!0){const e=P.xyzd50ToSrgb(...this.#o());return t?[...e,this.alpha??void 0]:e}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(t,{min:0,max:100}),e=xt(this.l,0,1)||xt(this.l,100,1)?0:e,this.c=ht(e,{min:0}),r=xt(e,0)?0:r,this.h=it(r),this.alpha=ht(s,{min:0,max:1}),this.#s=n}asLegacyColor(){return this.as("rgba")}is(t){return t===this.format()}as(t){return Rt.#i[t](this)}equal(t){const e=t.as("lch");return xt(e.l,this.l,1)&&xt(e.c,this.c)&&xt(e.h,this.h)&&xt(e.alpha,this.alpha)}format(){return"lch"}setAlpha(t){return new Rt(this.l,this.c,this.h,t)}asString(t){return t?this.as(t).asString():this.#l(this.l,this.c,this.h)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`lch(${e.StringUtilities.stringifyWithPrecision(t,0)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!1}isHuePowerless(){return xt(this.c,0)}static fromSpec(t,e){const r=ct(t[0],[0,100])??ut(t[0]);if(null===r)return null;const s=ct(t[1],[0,150])??ut(t[1]);if(null===s)return null;const n=at(t[2]);if(null===n)return null;const i=gt(t[3]);return new Rt(r,s,n,i,e)}}class zt{#n;l;a;b;alpha;#s;static#i={nickname:t=>new Lt(t.#a(!1),"nickname"),hex:t=>new Lt(t.#a(!1),"hex"),shorthex:t=>new Lt(t.#a(!1),"shorthex"),hexa:t=>new Lt(t.#a(!0),"hexa"),shorthexa:t=>new Lt(t.#a(!0),"shorthexa"),rgb:t=>new Lt(t.#a(!1),"rgb"),rgba:t=>new Lt(t.#a(!0),"rgba"),hsl:t=>new Pt(...B(t.#a(!1)),t.alpha),hsla:t=>new Pt(...B(t.#a(!1)),t.alpha),hwb:t=>new kt(..._(t.#a(!1)),t.alpha),hwba:t=>new kt(..._(t.#a(!1)),t.alpha),lch:t=>new Rt(...P.labToLch(...P.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new At(...P.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...P.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>t,srgb:t=>new It("srgb",...P.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new It("srgb-linear",...P.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new It("display-p3",...P.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new It("a98-rgb",...P.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new It("prophoto-rgb",...P.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new It("rec2020",...P.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new It("xyz",...P.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new It("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new It("xyz-d65",...P.xyzd50ToD65(...t.#o()),t.alpha)};#o(){return P.xyzd65ToD50(...P.oklabToXyzd65(this.l,this.a,this.b))}#a(t=!0){const e=P.xyzd50ToSrgb(...this.#o());return t?[...e,this.alpha??void 0]:e}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(t,{min:0,max:1}),(xt(this.l,0)||xt(this.l,1))&&(e=r=0),this.a=e,this.b=r,this.alpha=ht(s,{min:0,max:1}),this.#s=n}asLegacyColor(){return this.as("rgba")}is(t){return t===this.format()}as(t){return zt.#i[t](this)}equal(t){const e=t.as("oklab");return xt(e.l,this.l)&&xt(e.a,this.a)&&xt(e.b,this.b)&&xt(e.alpha,this.alpha)}format(){return"oklab"}setAlpha(t){return new zt(this.l,this.a,this.b,t)}asString(t){return t?this.as(t).asString():this.#l(this.l,this.a,this.b)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`oklab(${e.StringUtilities.stringifyWithPrecision(t)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!1}static fromSpec(t,e){const r=ct(t[0],[0,1])??ut(t[0]);if(null===r)return null;const s=ct(t[1],[0,.4])??ut(t[1]);if(null===s)return null;const n=ct(t[2],[0,.4])??ut(t[2]);if(null===n)return null;const i=gt(t[3]);return new zt(r,s,n,i,e)}}class At{#n;l;c;h;alpha;#s;static#i={nickname:t=>new Lt(t.#a(!1),"nickname"),hex:t=>new Lt(t.#a(!1),"hex"),shorthex:t=>new Lt(t.#a(!1),"shorthex"),hexa:t=>new Lt(t.#a(!0),"hexa"),shorthexa:t=>new Lt(t.#a(!0),"shorthexa"),rgb:t=>new Lt(t.#a(!1),"rgb"),rgba:t=>new Lt(t.#a(!0),"rgba"),hsl:t=>new Pt(...B(t.#a(!1)),t.alpha),hsla:t=>new Pt(...B(t.#a(!1)),t.alpha),hwb:t=>new kt(..._(t.#a(!1)),t.alpha),hwba:t=>new kt(..._(t.#a(!1)),t.alpha),lch:t=>new Rt(...P.labToLch(...P.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>t,lab:t=>new Tt(...P.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new zt(...P.xyzd65ToOklab(...P.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new It("srgb",...P.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new It("srgb-linear",...P.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new It("display-p3",...P.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new It("a98-rgb",...P.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new It("prophoto-rgb",...P.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new It("rec2020",...P.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new It("xyz",...P.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new It("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new It("xyz-d65",...P.xyzd50ToD65(...t.#o()),t.alpha)};#o(){return P.oklchToXyzd50(this.l,this.c,this.h)}#a(t=!0){const e=P.xyzd50ToSrgb(...this.#o());return t?[...e,this.alpha??void 0]:e}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(t,{min:0,max:1}),e=xt(this.l,0)||xt(this.l,1)?0:e,this.c=ht(e,{min:0}),r=xt(e,0)?0:r,this.h=it(r),this.alpha=ht(s,{min:0,max:1}),this.#s=n}asLegacyColor(){return this.as("rgba")}is(t){return t===this.format()}as(t){return At.#i[t](this)}equal(t){const e=t.as("oklch");return xt(e.l,this.l)&&xt(e.c,this.c)&&xt(e.h,this.h)&&xt(e.alpha,this.alpha)}format(){return"oklch"}setAlpha(t){return new At(this.l,this.c,this.h,t)}asString(t){return t?this.as(t).asString():this.#l(this.l,this.c,this.h)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`oklch(${e.StringUtilities.stringifyWithPrecision(t)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!1}static fromSpec(t,e){const r=ct(t[0],[0,1])??ut(t[0]);if(null===r)return null;const s=ct(t[1],[0,.4])??ut(t[1]);if(null===s)return null;const n=at(t[2]);if(null===n)return null;const i=gt(t[3]);return new At(r,s,n,i,e)}}class It{#n;p0;p1;p2;alpha;colorSpace;#s;static#i={nickname:t=>new Lt(t.#a(!1),"nickname"),hex:t=>new Lt(t.#a(!1),"hex"),shorthex:t=>new Lt(t.#a(!1),"shorthex"),hexa:t=>new Lt(t.#a(!0),"hexa"),shorthexa:t=>new Lt(t.#a(!0),"shorthexa"),rgb:t=>new Lt(t.#a(!1),"rgb"),rgba:t=>new Lt(t.#a(!0),"rgba"),hsl:t=>new Pt(...B(t.#a(!1)),t.alpha),hsla:t=>new Pt(...B(t.#a(!1)),t.alpha),hwb:t=>new kt(..._(t.#a(!1)),t.alpha),hwba:t=>new kt(..._(t.#a(!1)),t.alpha),lch:t=>new Rt(...P.labToLch(...P.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new At(...P.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...P.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new zt(...P.xyzd65ToOklab(...P.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new It("srgb",...P.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new It("srgb-linear",...P.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new It("display-p3",...P.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new It("a98-rgb",...P.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new It("prophoto-rgb",...P.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new It("rec2020",...P.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new It("xyz",...P.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new It("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new It("xyz-d65",...P.xyzd50ToD65(...t.#o()),t.alpha)};#o(){const[t,e,r]=this.#n;switch(this.colorSpace){case"srgb":return P.srgbToXyzd50(t,e,r);case"srgb-linear":return P.srgbLinearToXyzd50(t,e,r);case"display-p3":return P.displayP3ToXyzd50(t,e,r);case"a98-rgb":return P.adobeRGBToXyzd50(t,e,r);case"prophoto-rgb":return P.proPhotoToXyzd50(t,e,r);case"rec2020":return P.rec2020ToXyzd50(t,e,r);case"xyz-d50":return[t,e,r];case"xyz":case"xyz-d65":return P.xyzd65ToD50(t,e,r)}throw new Error("Invalid color space")}#a(t=!0){const[e,r,s]=this.#n,n="srgb"===this.colorSpace?[e,r,s]:[...P.xyzd50ToSrgb(...this.#o())];return t?[...n,this.alpha??void 0]:n}constructor(t,e,r,s,n,i){this.#n=[e,r,s],this.colorSpace=t,this.#s=i,"xyz-d50"!==this.colorSpace&&"xyz-d65"!==this.colorSpace&&"xyz"!==this.colorSpace&&(e=ht(e,{min:0,max:1}),r=ht(r,{min:0,max:1}),s=ht(s,{min:0,max:1})),this.p0=e,this.p1=r,this.p2=s,this.alpha=ht(n,{min:0,max:1})}asLegacyColor(){return this.as("rgba")}is(t){return t===this.format()}as(t){return this.colorSpace===t?this:It.#i[t](this)}equal(t){const e=t.as(this.colorSpace);return xt(this.p0,e.p0)&&xt(this.p1,e.p1)&&xt(this.p2,e.p2)&&xt(this.alpha,e.alpha)}format(){return this.colorSpace}setAlpha(t){return new It(this.colorSpace,this.p0,this.p1,this.p2,t)}asString(t){return t?this.as(t).asString():this.#l(this.p0,this.p1,this.p2)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`color(${this.colorSpace} ${e.StringUtilities.stringifyWithPrecision(t)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return"xyz-d50"!==this.colorSpace&&"xyz-d65"!==this.colorSpace&&"xyz"!==this.colorSpace&&!xt(this.#n,[this.p0,this.p1,this.p2])}static fromSpec(t,e){const[r,s]=e.split("/",2),n=r.trim().split(/\s+/),[i,...a]=n,o=ot(i);if(!o)return null;if(0===a.length&&void 0===s)return new It(o,0,0,0,null,t);if(0===a.length&&void 0!==s&&s.trim().split(/\s+/).length>1)return null;if(a.length>3)return null;const l=a.map((t=>"none"===t?"0":t)).map((t=>dt(t,[0,1])));if(l.includes(null))return null;const h=s?dt(s,[0,1])??1:1,c=[l[0]??0,l[1]??0,l[2]??0,h];return new It(o,...c,t)}}class Pt{h;s;l;alpha;#n;#s;static#i={nickname:t=>new Lt(t.#a(!1),"nickname"),hex:t=>new Lt(t.#a(!1),"hex"),shorthex:t=>new Lt(t.#a(!1),"shorthex"),hexa:t=>new Lt(t.#a(!0),"hexa"),shorthexa:t=>new Lt(t.#a(!0),"shorthexa"),rgb:t=>new Lt(t.#a(!1),"rgb"),rgba:t=>new Lt(t.#a(!0),"rgba"),hsl:t=>t,hsla:t=>t,hwb:t=>new kt(..._(t.#a(!1)),t.alpha),hwba:t=>new kt(..._(t.#a(!1)),t.alpha),lch:t=>new Rt(...P.labToLch(...P.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new At(...P.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...P.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new zt(...P.xyzd65ToOklab(...P.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new It("srgb",...P.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new It("srgb-linear",...P.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new It("display-p3",...P.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new It("a98-rgb",...P.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new It("prophoto-rgb",...P.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new It("rec2020",...P.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new It("xyz",...P.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new It("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new It("xyz-d65",...P.xyzd50ToD65(...t.#o()),t.alpha)};#a(t=!0){const e=ft([this.h,this.s,this.l,0]);return t?[e[0],e[1],e[2],this.alpha??void 0]:[e[0],e[1],e[2]]}#o(){const t=this.#a(!1);return P.srgbToXyzd50(t[0],t[1],t[2])}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(r,{min:0,max:1}),e=xt(this.l,0)||xt(this.l,1)?0:e,this.s=ht(e,{min:0,max:1}),t=xt(this.s,0)?0:t,this.h=it(360*t)/360,this.alpha=ht(s??null,{min:0,max:1}),this.#s=n}equal(t){const e=t.as("hsl");return xt(this.h,e.h)&&xt(this.s,e.s)&&xt(this.l,e.l)&&xt(this.alpha,e.alpha)}asString(t){return t?this.as(t).asString():this.#l(this.h,this.s,this.l)}#l(t,r,s){const n=e.StringUtilities.sprintf("hsl(%sdeg %s% %s%",e.StringUtilities.stringifyWithPrecision(360*t),e.StringUtilities.stringifyWithPrecision(100*r),e.StringUtilities.stringifyWithPrecision(100*s));return null!==this.alpha&&1!==this.alpha?n+e.StringUtilities.sprintf(" / %s%)",e.StringUtilities.stringifyWithPrecision(100*this.alpha)):n+")"}setAlpha(t){return new Pt(this.h,this.s,this.l,t)}format(){return null===this.alpha||1===this.alpha?"hsl":"hsla"}is(t){return t===this.format()}as(t){return t===this.format()?this:Pt.#i[t](this)}asLegacyColor(){return this.as("rgba")}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!vt(this.#n[1],1)||!vt(0,this.#n[1])}static fromSpec(t,e){const r=mt(t[0]);if(null===r)return null;const s=yt(t[1]);if(null===s)return null;const n=yt(t[2]);if(null===n)return null;const i=gt(t[3]);return new Pt(r,s,n,i,e)}hsva(){const t=this.s*(this.l<.5?this.l:1-this.l);return[this.h,0!==t?2*t/(this.l+t):0,this.l+t,this.alpha??1]}canonicalHSLA(){return[Math.round(360*this.h),Math.round(100*this.s),Math.round(100*this.l),this.alpha??1]}}class kt{h;w;b;alpha;#n;#s;static#i={nickname:t=>new Lt(t.#a(!1),"nickname"),hex:t=>new Lt(t.#a(!1),"hex"),shorthex:t=>new Lt(t.#a(!1),"shorthex"),hexa:t=>new Lt(t.#a(!0),"hexa"),shorthexa:t=>new Lt(t.#a(!0),"shorthexa"),rgb:t=>new Lt(t.#a(!1),"rgb"),rgba:t=>new Lt(t.#a(!0),"rgba"),hsl:t=>new Pt(...B(t.#a(!1)),t.alpha),hsla:t=>new Pt(...B(t.#a(!1)),t.alpha),hwb:t=>t,hwba:t=>t,lch:t=>new Rt(...P.labToLch(...P.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new At(...P.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...P.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new zt(...P.xyzd65ToOklab(...P.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new It("srgb",...P.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new It("srgb-linear",...P.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new It("display-p3",...P.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new It("a98-rgb",...P.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new It("prophoto-rgb",...P.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new It("rec2020",...P.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new It("xyz",...P.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new It("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new It("xyz-d65",...P.xyzd50ToD65(...t.#o()),t.alpha)};#a(t=!0){const e=function(t){const e=t[0],r=t[1],s=t[2],n=r/(r+s);let i=[n,n,n,t[3]];if(r+s<1){i=ft([e,1,.5,t[3]]);for(let t=0;t<3;++t)i[t]+=r-(r+s)*i[t]}return i}([this.h,this.w,this.b,0]);return t?[e[0],e[1],e[2],this.alpha??void 0]:[e[0],e[1],e[2]]}#o(){const t=this.#a(!1);return P.srgbToXyzd50(t[0],t[1],t[2])}constructor(t,e,r,s,n){if(this.#n=[t,e,r],this.w=ht(e,{min:0,max:1}),this.b=ht(r,{min:0,max:1}),t=vt(1,this.w+this.b)?0:t,this.h=it(360*t)/360,this.alpha=ht(s,{min:0,max:1}),vt(1,this.w+this.b)){const t=this.w/this.b;this.b=1/(1+t),this.w=1-this.b}this.#s=n}equal(t){const e=t.as("hwb");return xt(this.h,e.h)&&xt(this.w,e.w)&&xt(this.b,e.b)&&xt(this.alpha,e.alpha)}asString(t){return t?this.as(t).asString():this.#l(this.h,this.w,this.b)}#l(t,r,s){const n=e.StringUtilities.sprintf("hwb(%sdeg %s% %s%",e.StringUtilities.stringifyWithPrecision(360*t),e.StringUtilities.stringifyWithPrecision(100*r),e.StringUtilities.stringifyWithPrecision(100*s));return null!==this.alpha&&1!==this.alpha?n+e.StringUtilities.sprintf(" / %s%)",e.StringUtilities.stringifyWithPrecision(100*this.alpha)):n+")"}setAlpha(t){return new kt(this.h,this.w,this.b,t,this.#s)}format(){return null===this.alpha||xt(this.alpha,1)?"hwb":"hwba"}is(t){return t===this.format()}as(t){return t===this.format()?this:kt.#i[t](this)}asLegacyColor(){return this.as("rgba")}getAuthoredText(){return this.#s??null}canonicalHWBA(){return[Math.round(360*this.h),Math.round(100*this.w),Math.round(100*this.b),this.alpha??1]}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!(vt(this.#n[1],1)&&vt(0,this.#n[1])&&vt(this.#n[2],1)&&vt(0,this.#n[2]))}static fromSpec(t,e){const r=mt(t[0]);if(null===r)return null;const s=yt(t[1]);if(null===s)return null;const n=yt(t[2]);if(null===n)return null;const i=gt(t[3]);return new kt(r,s,n,i,e)}}function Et(t){return Math.round(255*t)}class Lt{#n;#h;#s;#c;static#i={nickname:t=>new Lt(t.#h,"nickname"),hex:t=>new Lt(t.#h,"hex"),shorthex:t=>new Lt(t.#h,"shorthex"),hexa:t=>new Lt(t.#h,"hexa"),shorthexa:t=>new Lt(t.#h,"shorthexa"),rgb:t=>new Lt(t.#h,"rgb"),rgba:t=>new Lt(t.#h,"rgba"),hsl:t=>new Pt(...B([t.#h[0],t.#h[1],t.#h[2]]),t.alpha),hsla:t=>new Pt(...B([t.#h[0],t.#h[1],t.#h[2]]),t.alpha),hwb:t=>new kt(..._([t.#h[0],t.#h[1],t.#h[2]]),t.alpha),hwba:t=>new kt(..._([t.#h[0],t.#h[1],t.#h[2]]),t.alpha),lch:t=>new Rt(...P.labToLch(...P.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new At(...P.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...P.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new zt(...P.xyzd65ToOklab(...P.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new It("srgb",...P.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new It("srgb-linear",...P.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new It("display-p3",...P.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new It("a98-rgb",...P.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new It("prophoto-rgb",...P.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new It("rec2020",...P.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new It("xyz",...P.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new It("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new It("xyz-d65",...P.xyzd50ToD65(...t.#o()),t.alpha)};#o(){const[t,e,r]=this.#h;return P.srgbToXyzd50(t,e,r)}get alpha(){switch(this.format()){case"hexa":case"shorthexa":case"rgba":return this.#h[3];default:return null}}asLegacyColor(){return this}constructor(t,e,r){this.#s=r||null,this.#c=e,this.#n=[t[0],t[1],t[2]],this.#h=[ht(t[0],{min:0,max:1}),ht(t[1],{min:0,max:1}),ht(t[2],{min:0,max:1}),ht(t[3]??1,{min:0,max:1})]}static fromHex(t,e){let r;3===(t=t.toLowerCase()).length?(r="shorthex",t=t.charAt(0)+t.charAt(0)+t.charAt(1)+t.charAt(1)+t.charAt(2)+t.charAt(2)):4===t.length?(r="shorthexa",t=t.charAt(0)+t.charAt(0)+t.charAt(1)+t.charAt(1)+t.charAt(2)+t.charAt(2)+t.charAt(3)+t.charAt(3)):r=6===t.length?"hex":"hexa";const s=parseInt(t.substring(0,2),16),n=parseInt(t.substring(2,4),16),i=parseInt(t.substring(4,6),16);let a=1;return 8===t.length&&(a=parseInt(t.substring(6,8),16)/255),new Lt([s/255,n/255,i/255,a],r,e)}static fromName(t,e){const r=t.toLowerCase(),s=Ct.get(r);if(void 0!==s){const t=Lt.fromRGBA(s,e);return t.#c="nickname",t}return null}static fromRGBAFunction(t,r,s,n,i){const a=[pt(t),pt(r),pt(s),n?(o=n,dt(o)):1];var o;return e.ArrayUtilities.arrayDoesNotContainNullOrUndefined(a)?new Lt(a,n?"rgba":"rgb",i):null}static fromRGBA(t,e){return new Lt([t[0]/255,t[1]/255,t[2]/255,t[3]],"rgba",e)}static fromHSVA(t){const e=bt(t);return new Lt(e,"rgba")}is(t){return t===this.format()}as(t){return t===this.format()?this:Lt.#i[t](this)}format(){return this.#c}hasAlpha(){return 1!==this.#h[3]}detectHEXFormat(){let t=!0;for(let e=0;e<4;++e){if(Math.round(255*this.#h[e])%17){t=!1;break}}const e=this.hasAlpha();return t?e?"shorthexa":"shorthex":e?"hexa":"hex"}asString(t){return t?this.as(t).asString():this.#l(t,this.#h[0],this.#h[1],this.#h[2])}#l(t,r,s,n){function i(t){const e=Math.round(255*t).toString(16);return 1===e.length?"0"+e:e}function a(t){return(Math.round(255*t)/17).toString(16)}switch(t||(t=this.#c),t){case"rgb":case"rgba":{const t=e.StringUtilities.sprintf("rgb(%d %d %d",Et(r),Et(s),Et(n));return this.hasAlpha()?t+e.StringUtilities.sprintf(" / %d%)",Math.round(100*this.#h[3])):t+")"}case"hexa":return e.StringUtilities.sprintf("#%s%s%s%s",i(r),i(s),i(n),i(this.#h[3])).toLowerCase();case"hex":return this.hasAlpha()?null:e.StringUtilities.sprintf("#%s%s%s",i(r),i(s),i(n)).toLowerCase();case"shorthexa":{const t=this.detectHEXFormat();return"shorthexa"!==t&&"shorthex"!==t?null:e.StringUtilities.sprintf("#%s%s%s%s",a(r),a(s),a(n),a(this.#h[3])).toLowerCase()}case"shorthex":return this.hasAlpha()||"shorthex"!==this.detectHEXFormat()?null:e.StringUtilities.sprintf("#%s%s%s",a(r),a(s),a(n)).toLowerCase();case"nickname":return this.nickname()}return null}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(t,...this.#n)}isGamutClipped(){return!xt(this.#n.map(Et),[this.#h[0],this.#h[1],this.#h[2]].map(Et),1)}rgba(){return[...this.#h]}canonicalRGBA(){const t=new Array(4);for(let e=0;e<3;++e)t[e]=Math.round(255*this.#h[e]);return t[3]=this.#h[3],t}nickname(){return _t.get(String(this.canonicalRGBA()))||null}toProtocolRGBA(){const t=this.canonicalRGBA(),e={r:t[0],g:t[1],b:t[2],a:void 0};return 1!==t[3]&&(e.a=t[3]),e}invert(){const t=[0,0,0,0];return t[0]=1-this.#h[0],t[1]=1-this.#h[1],t[2]=1-this.#h[2],t[3]=this.#h[3],new Lt(t,"rgba")}setAlpha(t){const e=[...this.#h];return e[3]=t,new Lt(e,"rgba")}blendWith(t){const e=E(t.#h,this.#h);return new Lt(e,"rgba")}blendWithAlpha(t){const e=[...this.#h];return e[3]*=t,new Lt(e,"rgba")}setFormat(t){this.#c=t}equal(t){const e=t.as(this.#c);return xt(Et(this.#h[0]),Et(e.#h[0]),1)&&xt(Et(this.#h[1]),Et(e.#h[1]),1)&&xt(Et(this.#h[2]),Et(e.#h[2]),1)&&xt(this.#h[3],e.#h[3])}}const Bt=[["aliceblue",[240,248,255]],["antiquewhite",[250,235,215]],["aqua",[0,255,255]],["aquamarine",[127,255,212]],["azure",[240,255,255]],["beige",[245,245,220]],["bisque",[255,228,196]],["black",[0,0,0]],["blanchedalmond",[255,235,205]],["blue",[0,0,255]],["blueviolet",[138,43,226]],["brown",[165,42,42]],["burlywood",[222,184,135]],["cadetblue",[95,158,160]],["chartreuse",[127,255,0]],["chocolate",[210,105,30]],["coral",[255,127,80]],["cornflowerblue",[100,149,237]],["cornsilk",[255,248,220]],["crimson",[237,20,61]],["cyan",[0,255,255]],["darkblue",[0,0,139]],["darkcyan",[0,139,139]],["darkgoldenrod",[184,134,11]],["darkgray",[169,169,169]],["darkgrey",[169,169,169]],["darkgreen",[0,100,0]],["darkkhaki",[189,183,107]],["darkmagenta",[139,0,139]],["darkolivegreen",[85,107,47]],["darkorange",[255,140,0]],["darkorchid",[153,50,204]],["darkred",[139,0,0]],["darksalmon",[233,150,122]],["darkseagreen",[143,188,143]],["darkslateblue",[72,61,139]],["darkslategray",[47,79,79]],["darkslategrey",[47,79,79]],["darkturquoise",[0,206,209]],["darkviolet",[148,0,211]],["deeppink",[255,20,147]],["deepskyblue",[0,191,255]],["dimgray",[105,105,105]],["dimgrey",[105,105,105]],["dodgerblue",[30,144,255]],["firebrick",[178,34,34]],["floralwhite",[255,250,240]],["forestgreen",[34,139,34]],["fuchsia",[255,0,255]],["gainsboro",[220,220,220]],["ghostwhite",[248,248,255]],["gold",[255,215,0]],["goldenrod",[218,165,32]],["gray",[128,128,128]],["grey",[128,128,128]],["green",[0,128,0]],["greenyellow",[173,255,47]],["honeydew",[240,255,240]],["hotpink",[255,105,180]],["indianred",[205,92,92]],["indigo",[75,0,130]],["ivory",[255,255,240]],["khaki",[240,230,140]],["lavender",[230,230,250]],["lavenderblush",[255,240,245]],["lawngreen",[124,252,0]],["lemonchiffon",[255,250,205]],["lightblue",[173,216,230]],["lightcoral",[240,128,128]],["lightcyan",[224,255,255]],["lightgoldenrodyellow",[250,250,210]],["lightgreen",[144,238,144]],["lightgray",[211,211,211]],["lightgrey",[211,211,211]],["lightpink",[255,182,193]],["lightsalmon",[255,160,122]],["lightseagreen",[32,178,170]],["lightskyblue",[135,206,250]],["lightslategray",[119,136,153]],["lightslategrey",[119,136,153]],["lightsteelblue",[176,196,222]],["lightyellow",[255,255,224]],["lime",[0,255,0]],["limegreen",[50,205,50]],["linen",[250,240,230]],["magenta",[255,0,255]],["maroon",[128,0,0]],["mediumaquamarine",[102,205,170]],["mediumblue",[0,0,205]],["mediumorchid",[186,85,211]],["mediumpurple",[147,112,219]],["mediumseagreen",[60,179,113]],["mediumslateblue",[123,104,238]],["mediumspringgreen",[0,250,154]],["mediumturquoise",[72,209,204]],["mediumvioletred",[199,21,133]],["midnightblue",[25,25,112]],["mintcream",[245,255,250]],["mistyrose",[255,228,225]],["moccasin",[255,228,181]],["navajowhite",[255,222,173]],["navy",[0,0,128]],["oldlace",[253,245,230]],["olive",[128,128,0]],["olivedrab",[107,142,35]],["orange",[255,165,0]],["orangered",[255,69,0]],["orchid",[218,112,214]],["palegoldenrod",[238,232,170]],["palegreen",[152,251,152]],["paleturquoise",[175,238,238]],["palevioletred",[219,112,147]],["papayawhip",[255,239,213]],["peachpuff",[255,218,185]],["peru",[205,133,63]],["pink",[255,192,203]],["plum",[221,160,221]],["powderblue",[176,224,230]],["purple",[128,0,128]],["rebeccapurple",[102,51,153]],["red",[255,0,0]],["rosybrown",[188,143,143]],["royalblue",[65,105,225]],["saddlebrown",[139,69,19]],["salmon",[250,128,114]],["sandybrown",[244,164,96]],["seagreen",[46,139,87]],["seashell",[255,245,238]],["sienna",[160,82,45]],["silver",[192,192,192]],["skyblue",[135,206,235]],["slateblue",[106,90,205]],["slategray",[112,128,144]],["slategrey",[112,128,144]],["snow",[255,250,250]],["springgreen",[0,255,127]],["steelblue",[70,130,180]],["tan",[210,180,140]],["teal",[0,128,128]],["thistle",[216,191,216]],["tomato",[255,99,71]],["turquoise",[64,224,208]],["violet",[238,130,238]],["wheat",[245,222,179]],["white",[255,255,255]],["whitesmoke",[245,245,245]],["yellow",[255,255,0]],["yellowgreen",[154,205,50]],["transparent",[0,0,0,0]]];console.assert(Bt.every((([t])=>t.toLowerCase()===t)),"All color nicknames must be lowercase.");const Ct=new Map(Bt),_t=new Map(Bt.map((([t,[e,r,s,n=1]])=>[String([e,r,s,n]),t]))),Ot=[127,32,210],Gt={Content:Lt.fromRGBA([111,168,220,.66]),ContentLight:Lt.fromRGBA([111,168,220,.5]),ContentOutline:Lt.fromRGBA([9,83,148]),Padding:Lt.fromRGBA([147,196,125,.55]),PaddingLight:Lt.fromRGBA([147,196,125,.4]),Border:Lt.fromRGBA([255,229,153,.66]),BorderLight:Lt.fromRGBA([255,229,153,.5]),Margin:Lt.fromRGBA([246,178,107,.66]),MarginLight:Lt.fromRGBA([246,178,107,.5]),EventTarget:Lt.fromRGBA([255,196,196,.66]),Shape:Lt.fromRGBA([96,82,177,.8]),ShapeMargin:Lt.fromRGBA([96,82,127,.6]),CssGrid:Lt.fromRGBA([75,0,130,1]),LayoutLine:Lt.fromRGBA([...Ot,1]),GridBorder:Lt.fromRGBA([...Ot,1]),GapBackground:Lt.fromRGBA([...Ot,.3]),GapHatch:Lt.fromRGBA([...Ot,.8]),GridAreaBorder:Lt.fromRGBA([26,115,232,1])},Nt={ParentOutline:Lt.fromRGBA([224,90,183,1]),ChildOutline:Lt.fromRGBA([0,120,212,1])},Vt={Resizer:Lt.fromRGBA([222,225,230,1]),ResizerHandle:Lt.fromRGBA([166,166,166,1]),Mask:Lt.fromRGBA([248,249,249,1])};var Wt=Object.freeze({__proto__:null,getFormat:function(t){switch(t){case"nickname":return"nickname";case"hex":return"hex";case"shorthex":return"shorthex";case"hexa":return"hexa";case"shorthexa":return"shorthexa";case"rgb":return"rgb";case"rgba":return"rgba";case"hsl":return"hsl";case"hsla":return"hsla";case"hwb":return"hwb";case"hwba":return"hwba";case"lch":return"lch";case"oklch":return"oklch";case"lab":return"lab";case"oklab":return"oklab"}return ot(t)},parse:function(t){if(!t.match(/\s/)){const e=t.toLowerCase().match(/^(?:#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})|(\w+))$/i);if(e)return e[1]?Lt.fromHex(e[1],t):e[2]?Lt.fromName(e[2],t):null}const e=t.toLowerCase().match(/^\s*(?:(rgba?)|(hsla?)|(hwba?)|(lch)|(oklch)|(lab)|(oklab)|(color))\((.*)\)\s*$/);if(e){const r=Boolean(e[1]),s=Boolean(e[2]),n=Boolean(e[3]),i=Boolean(e[4]),a=Boolean(e[5]),o=Boolean(e[6]),l=Boolean(e[7]),h=Boolean(e[8]),c=e[9];if(h)return It.fromSpec(t,c);const u=function(t,{allowCommas:e,convertNoneToZero:r}){const s=t.trim();let n=[];e&&(n=s.split(/\s*,\s*/));if(!e||1===n.length)if(n=s.split(/\s+/),"/"===n[3]){if(n.splice(3,1),4!==n.length)return null}else if(n.length>2&&-1!==n[2].indexOf("/")||n.length>3&&-1!==n[3].indexOf("/")){const t=n.slice(2,4).join("");n=n.slice(0,2).concat(t.split(/\//)).concat(n.slice(4))}else if(n.length>=4)return null;if(3!==n.length&&4!==n.length||n.indexOf("")>-1)return null;if(r)return n.map((t=>"none"===t?"0":t));return n}(c,{allowCommas:r||s,convertNoneToZero:!(r||s||n)});if(!u)return null;const g=[u[0],u[1],u[2],u[3]];if(r)return Lt.fromRGBAFunction(u[0],u[1],u[2],u[3],t);if(s)return Pt.fromSpec(g,t);if(n)return kt.fromSpec(g,t);if(i)return Rt.fromSpec(g,t);if(a)return At.fromSpec(g,t);if(o)return Tt.fromSpec(g,t);if(l)return zt.fromSpec(g,t)}return null},parseHueNumeric:mt,hsl2rgb:ft,hsva2rgba:bt,rgb2hsv:function(t){const e=B(t),r=e[0];let s=e[1];const n=e[2];return s*=n<.5?n:1-n,[r,0!==s?2*s/(n+s):0,n+s]},desiredLuminance:wt,approachColorValue:St,findFgColorForContrast:function(t,e,r){const s=t.as("hsl").hsva(),n=e.rgba(),i=t=>G(E(Lt.fromHSVA(t).rgba(),n)),a=G(e.rgba()),o=wt(a,r,i(s)>a);return St(s,0,2,o,i)?Lt.fromHSVA(s):(s[2]=1,St(s,0,1,o,i)?Lt.fromHSVA(s):null)},findFgColorForContrastAPCA:function(t,e,r){const s=t.as("hsl").hsva(),n=(e.rgba(),t=>Z(Lt.fromHSVA(t).rgba())),i=Z(e.rgba()),a=Q(i,r,n(s)>=i);if(St(s,0,2,a,n)){const t=Lt.fromHSVA(s);if(Math.abs(Y(e.rgba(),t.rgba()))>=r)return t}if(s[2]=1,St(s,0,1,a,n)){const t=Lt.fromHSVA(s);if(Math.abs(Y(e.rgba(),t.rgba()))>=r)return t}return null},Lab:Tt,LCH:Rt,Oklab:zt,Oklch:At,ColorFunction:It,HSL:Pt,HWB:kt,Legacy:Lt,Regex:/((?:rgba?|hsla?|hwba?|lab|lch|oklab|oklch|color)\([^)]+\)|#[0-9a-fA-F]{8}|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3,4}|\b[a-zA-Z]+\b(?!-))/g,ColorMixRegex:/color-mix\(.*,\s*(?.+)\s*,\s*(?.+)\s*\)/g,Nicknames:Ct,PageHighlight:Gt,SourceOrderHighlight:Nt,IsolationModeHighlight:Vt,Generator:class{#u;#g;#d;#p;#m;constructor(t,e,r,s){this.#u=t||{min:0,max:360,count:void 0},this.#g=e||67,this.#d=r||80,this.#p=s||1,this.#m=new Map}setColorForID(t,e){this.#m.set(t,e)}colorForID(t){let e=this.#m.get(t);return e||(e=this.generateColorForID(t),this.#m.set(t,e)),e}generateColorForID(t){const r=e.StringUtilities.hashCode(t),s=this.indexToValueInSpace(r,this.#u),n=this.indexToValueInSpace(r>>8,this.#g),i=this.indexToValueInSpace(r>>16,this.#d),a=this.indexToValueInSpace(r>>24,this.#p),o=`hsl(${s}deg ${n}% ${i}%`;return 1!==a?`${o} / ${Math.floor(100*a)}%)`:`${o})`}indexToValueInSpace(t,e){if("number"==typeof e)return e;const r=e.count||e.max-e.min;return t%=r,e.min+Math.floor(t/(r-1)*(e.max-e.min))}}});class Mt{listeners;addEventListener(t,e,r){this.listeners||(this.listeners=new Map);let s=this.listeners.get(t);return s||(s=new Set,this.listeners.set(t,s)),s.add({thisObject:r,listener:e}),{eventTarget:this,eventType:t,thisObject:r,listener:e}}once(t){return new Promise((e=>{const r=this.addEventListener(t,(s=>{this.removeEventListener(t,r.listener),e(s.data)}))}))}removeEventListener(t,e,r){const s=this.listeners?.get(t);if(s){for(const t of s)t.listener===e&&t.thisObject===r&&(t.disposed=!0,s.delete(t));s.size||this.listeners?.delete(t)}}hasEventListeners(t){return Boolean(this.listeners&&this.listeners.has(t))}dispatchEventToListeners(t,...[e]){const r=this.listeners?.get(t);if(!r)return;const s={data:e,source:this};for(const t of[...r])t.disposed||t.listener.call(t.thisObject,s)}}var Xt=Object.freeze({__proto__:null,ObjectWrapper:Mt,eventMixin:function(t){return class extends t{#y=new Mt;addEventListener(t,e,r){return this.#y.addEventListener(t,e,r)}once(t){return this.#y.once(t)}removeEventListener(t,e,r){this.#y.removeEventListener(t,e,r)}hasEventListeners(t){return this.#y.hasEventListeners(t)}dispatchEventToListeners(t,...e){this.#y.dispatchEventToListeners(t,...e)}}}});const Ft={elementsPanel:"Elements panel",stylesSidebar:"styles sidebar",changesDrawer:"Changes drawer",issuesView:"Issues view",networkPanel:"Network panel",applicationPanel:"Application panel",sourcesPanel:"Sources panel",memoryInspectorPanel:"Memory inspector panel"},Dt=r.i18n.registerUIStrings("core/common/Revealer.ts",Ft),Ut=r.i18n.getLazilyComputedLocalizedString.bind(void 0,Dt);let jt;class $t{registeredRevealers=[];static instance(){return void 0===jt&&(jt=new $t),jt}static removeInstance(){jt=void 0}register(t){this.registeredRevealers.push(t)}async reveal(t,e){const r=await Promise.all(this.getApplicableRegisteredRevealers(t).map((t=>t.loadRevealer())));if(r.length<1)throw new Error(`No revealers found for ${t}`);if(r.length>1)throw new Error(`Conflicting reveals found for ${t}`);return await r[0].reveal(t,e)}getApplicableRegisteredRevealers(t){return this.registeredRevealers.filter((e=>{for(const r of e.contextTypes())if(t instanceof r)return!0;return!1}))}}async function Ht(t,e=!1){await $t.instance().reveal(t,e)}const qt={ELEMENTS_PANEL:Ut(Ft.elementsPanel),STYLES_SIDEBAR:Ut(Ft.stylesSidebar),CHANGES_DRAWER:Ut(Ft.changesDrawer),ISSUES_VIEW:Ut(Ft.issuesView),NETWORK_PANEL:Ut(Ft.networkPanel),APPLICATION_PANEL:Ut(Ft.applicationPanel),SOURCES_PANEL:Ut(Ft.sourcesPanel),MEMORY_INSPECTOR_PANEL:Ut(Ft.memoryInspectorPanel)};var Zt=Object.freeze({__proto__:null,RevealerRegistry:$t,revealDestination:function(t){const e=$t.instance().getApplicableRegisteredRevealers(t);for(const{destination:t}of e)if(t)return t();return null},registerRevealer:function(t){$t.instance().register(t)},reveal:Ht,RevealerDestination:qt});let Yt;class Kt extends Mt{#f;constructor(){super(),this.#f=[]}static instance(t){return Yt&&!t?.forceNew||(Yt=new Kt),Yt}static removeInstance(){Yt=void 0}addMessage(t,e,r){const s=new Jt(t,e||"info",Date.now(),r||!1);this.#f.push(s),this.dispatchEventToListeners("messageAdded",s)}log(t){this.addMessage(t,"info")}warn(t){this.addMessage(t,"warning")}error(t){this.addMessage(t,"error",!0)}messages(){return this.#f}show(){this.showPromise()}showPromise(){return Ht(this)}}class Jt{text;level;timestamp;show;constructor(t,e,r,s){this.text=t,this.level=e,this.timestamp="number"==typeof r?r:Date.now(),this.show=s}}var Qt=Object.freeze({__proto__:null,Console:Kt,Message:Jt});var te=Object.freeze({__proto__:null,debounce:function(t,e){let r=0;return()=>{clearTimeout(r),r=window.setTimeout((()=>t()),e)}}});var ee=Object.freeze({__proto__:null,removeEventListeners:function(t){for(const e of t)e.eventTarget.removeEventListener(e.eventType,e.listener,e.thisObject);t.splice(0)},fireEvent:function(t,e={},r=window){const s=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:e});r.dispatchEvent(s)}}),re=Object.freeze({__proto__:null});const se=Symbol("uninitialized"),ne=Symbol("error");var ie=Object.freeze({__proto__:null,lazy:function(t){let e=se,r=null;return()=>{if(e===ne)throw r;if(e!==se)return e;try{return e=t(),e}catch(t){throw r=t,e=ne,r}}}});const ae=[];function oe(t){return ae.filter((function(e){if(!e.contextTypes)return!0;for(const r of e.contextTypes())if(t instanceof r)return!0;return!1}))}var le=Object.freeze({__proto__:null,Linkifier:class{static async linkify(t,e){if(!t)throw new Error("Can't linkify "+t);const r=oe(t)[0];if(!r)throw new Error("No linkifiers registered for object "+t);return(await r.loadLinkifier()).linkify(t,e)}},registerLinkifier:function(t){ae.push(t)},getApplicableRegisteredlinkifiers:oe});var he=Object.freeze({__proto__:null,Mutex:class{#b=!1;#w=[];acquire(){const t={resolved:!1};return this.#b?new Promise((e=>{this.#w.push((()=>e(this.#S.bind(this,t))))})):(this.#b=!0,Promise.resolve(this.#S.bind(this,t)))}#S(t){if(t.resolved)throw new Error("Cannot release more than once.");t.resolved=!0;const e=this.#w.shift();e?e():this.#b=!1}async run(t){const e=await this.acquire();try{return await t()}finally{e()}}}});function ce(t){if(-1===t.indexOf("..")&&-1===t.indexOf("."))return t;const e=("/"===t[0]?t.substring(1):t).split("/"),r=[];for(const t of e)"."!==t&&(".."===t?r.pop():r.push(t));let s=r.join("/");return"/"===t[0]&&s&&(s="/"+s),"/"===s[s.length-1]||"/"!==t[t.length-1]&&"."!==e[e.length-1]&&".."!==e[e.length-1]||(s+="/"),s}class ue{isValid;url;scheme;user;host;port;path;queryParams;fragment;folderPathComponents;lastPathComponent;blobInnerScheme;#x;#v;constructor(t){this.isValid=!1,this.url=t,this.scheme="",this.user="",this.host="",this.port="",this.path="",this.queryParams="",this.fragment="",this.folderPathComponents="",this.lastPathComponent="";const e=this.url.startsWith("blob:"),r=(e?t.substring(5):t).match(ue.urlRegex());if(r)this.isValid=!0,e?(this.blobInnerScheme=r[2].toLowerCase(),this.scheme="blob"):this.scheme=r[2].toLowerCase(),this.user=r[3]??"",this.host=r[4]??"",this.port=r[5]??"",this.path=r[6]??"/",this.queryParams=r[7]??"",this.fragment=r[8]??"";else{if(this.url.startsWith("data:"))return void(this.scheme="data");if(this.url.startsWith("blob:"))return void(this.scheme="blob");if("about:blank"===this.url)return void(this.scheme="about");this.path=this.url}const s=this.path.lastIndexOf("/",this.path.length-2);this.lastPathComponent=-1!==s?this.path.substring(s+1):this.path;const n=this.path.lastIndexOf("/");-1!==n&&(this.folderPathComponents=this.path.substring(0,n))}static fromString(t){const e=new ue(t.toString());return e.isValid?e:null}static preEncodeSpecialCharactersInPath(t){for(const e of["%",";","#","?"," "])t=t.replaceAll(e,encodeURIComponent(e));return t}static rawPathToEncodedPathString(t){const e=ue.preEncodeSpecialCharactersInPath(t);return t.startsWith("/")?new URL(e,"file:///").pathname:new URL("/"+e,"file:///").pathname.substr(1)}static encodedFromParentPathAndName(t,e){return ue.concatenate(t,"/",ue.preEncodeSpecialCharactersInPath(e))}static urlFromParentUrlAndName(t,e){return ue.concatenate(t,"/",ue.preEncodeSpecialCharactersInPath(e))}static encodedPathToRawPathString(t){return decodeURIComponent(t)}static rawPathToUrlString(t){let e=ue.preEncodeSpecialCharactersInPath(t.replace(/\\/g,"/"));return e=e.replace(/\\/g,"/"),e.startsWith("file://")||(e=e.startsWith("/")?"file://"+e:"file:///"+e),new URL(e).toString()}static relativePathToUrlString(t,e){const r=ue.preEncodeSpecialCharactersInPath(t.replace(/\\/g,"/"));return new URL(r,e).toString()}static urlToRawPathString(t,e){console.assert(t.startsWith("file://"),"This must be a file URL.");const r=decodeURIComponent(t);return e?r.substr(8).replace(/\//g,"\\"):r.substr(7)}static sliceUrlToEncodedPathString(t,e){return t.substring(e)}static substr(t,e,r){return t.substr(e,r)}static substring(t,e,r){return t.substring(e,r)}static prepend(t,e){return t+e}static concatenate(t,...e){return t.concat(...e)}static trim(t){return t.trim()}static slice(t,e,r){return t.slice(e,r)}static join(t,e){return t.join(e)}static split(t,e,r){return t.split(e,r)}static toLowerCase(t){return t.toLowerCase()}static isValidUrlString(t){return new ue(t).isValid}static urlWithoutHash(t){const e=t.indexOf("#");return-1!==e?t.substr(0,e):t}static urlRegex(){if(ue.urlRegexInstance)return ue.urlRegexInstance;return ue.urlRegexInstance=new RegExp("^("+/([A-Za-z][A-Za-z0-9+.-]*):\/\//.source+/(?:([A-Za-z0-9\-._~%!$&'()*+,;=:]*)@)?/.source+/((?:\[::\d?\])|(?:[^\s\/:]*))/.source+/(?::([\d]+))?/.source+")"+/(\/[^#?]*)?/.source+/(?:\?([^#]*))?/.source+/(?:#(.*))?/.source+"$"),ue.urlRegexInstance}static extractPath(t){const e=this.fromString(t);return e?e.path:""}static extractOrigin(t){const r=this.fromString(t);return r?r.securityOrigin():e.DevToolsPath.EmptyUrlString}static extractExtension(t){const e=(t=ue.urlWithoutHash(t)).indexOf("?");-1!==e&&(t=t.substr(0,e));const r=t.lastIndexOf("/");-1!==r&&(t=t.substr(r+1));const s=t.lastIndexOf(".");if(-1!==s){const e=(t=t.substr(s+1)).indexOf("%");return-1!==e?t.substr(0,e):t}return""}static extractName(t){let e=t.lastIndexOf("/");const r=-1!==e?t.substr(e+1):t;return e=r.indexOf("?"),e<0?r:r.substr(0,e)}static completeURL(t,e){const r=e.trim();if(r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("javascript:")||r.startsWith("mailto:"))return e;const s=this.fromString(r);if(s&&s.scheme){return s.securityOrigin()+ce(s.path)+(s.queryParams&&`?${s.queryParams}`)+(s.fragment&&`#${s.fragment}`)}const n=this.fromString(t);if(!n)return null;if(n.isDataURL())return e;if(e.length>1&&"/"===e.charAt(0)&&"/"===e.charAt(1))return n.scheme+":"+e;const i=n.securityOrigin(),a=n.path,o=n.queryParams?"?"+n.queryParams:"";if(!e.length)return i+a+o;if("#"===e.charAt(0))return i+a+o+e;if("?"===e.charAt(0))return i+a+e;const l=e.match(/^[^#?]*/);if(!l||!e.length)throw new Error("Invalid href");let h=l[0];const c=e.substring(h.length);return"/"!==h.charAt(0)&&(h=n.folderPathComponents+"/"+h),i+ce(h)+c}static splitLineAndColumn(t){const e=t.match(ue.urlRegex());let r="",s=t;e&&(r=e[1],s=t.substring(e[1].length));const n=/(?::(\d+))?(?::(\d+))?$/.exec(s);let i,a;if(console.assert(Boolean(n)),!n)return{url:t,lineNumber:0,columnNumber:0};"string"==typeof n[1]&&(i=parseInt(n[1],10),i=isNaN(i)?void 0:i-1),"string"==typeof n[2]&&(a=parseInt(n[2],10),a=isNaN(a)?void 0:a-1);let o=r+s.substring(0,s.length-n[0].length);if(void 0===n[1]&&void 0===n[2]){const t=/wasm-function\[\d+\]:0x([a-z0-9]+)$/g.exec(s);t&&"string"==typeof t[1]&&(o=ue.removeWasmFunctionInfoFromURL(o),a=parseInt(t[1],16),a=isNaN(a)?void 0:a)}return{url:o,lineNumber:i,columnNumber:a}}static removeWasmFunctionInfoFromURL(t){const e=t.search(/:wasm-function\[\d+\]/);return-1===e?t:ue.substring(t,0,e)}static beginsWithWindowsDriveLetter(t){return/^[A-Za-z]:/.test(t)}static beginsWithScheme(t){return/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}static isRelativeURL(t){return!this.beginsWithScheme(t)||this.beginsWithWindowsDriveLetter(t)}get displayName(){return this.#x?this.#x:this.isDataURL()?this.dataURLDisplayName():this.isBlobURL()||this.isAboutBlank()?this.url:(this.#x=this.lastPathComponent,this.#x||(this.#x=(this.host||"")+"/"),"/"===this.#x&&(this.#x=this.url),this.#x)}dataURLDisplayName(){return this.#v?this.#v:this.isDataURL()?(this.#v=e.StringUtilities.trimEndWithMaxLength(this.url,20),this.#v):""}isAboutBlank(){return"about:blank"===this.url}isDataURL(){return"data"===this.scheme}isHttpOrHttps(){return"http"===this.scheme||"https"===this.scheme}isBlobURL(){return this.url.startsWith("blob:")}lastPathComponentWithFragment(){return this.lastPathComponent+(this.fragment?"#"+this.fragment:"")}domain(){return this.isDataURL()?"data:":this.host+(this.port?":"+this.port:"")}securityOrigin(){if(this.isDataURL())return"data:";return(this.isBlobURL()?this.blobInnerScheme:this.scheme)+"://"+this.domain()}urlWithoutScheme(){return this.scheme&&this.url.startsWith(this.scheme+"://")?this.url.substring(this.scheme.length+3):this.url}static urlRegexInstance=null}var ge=Object.freeze({__proto__:null,normalizePath:ce,schemeIs:function(t,e){try{return new URL(t).protocol===e}catch(t){return!1}},ParsedURL:ue});class de{#T;#R;#z;#A;constructor(t,e){this.#T=t,this.#R=e||1,this.#z=0,this.#A=0}isCanceled(){return this.#T.parent.isCanceled()}setTitle(t){this.#T.parent.setTitle(t)}done(){this.setWorked(this.#A),this.#T.childDone()}setTotalWork(t){this.#A=t,this.#T.update()}setWorked(t,e){this.#z=t,void 0!==e&&this.setTitle(e),this.#T.update()}incrementWorked(t){this.setWorked(this.#z+(t||1))}getWeight(){return this.#R}getWorked(){return this.#z}getTotalWork(){return this.#A}}var pe=Object.freeze({__proto__:null,Progress:class{setTotalWork(t){}setTitle(t){}setWorked(t,e){}incrementWorked(t){}done(){}isCanceled(){return!1}},CompositeProgress:class{parent;#I;#P;constructor(t){this.parent=t,this.#I=[],this.#P=0,this.parent.setTotalWork(1),this.parent.setWorked(0)}childDone(){++this.#P===this.#I.length&&this.parent.done()}createSubProgress(t){const e=new de(this,t);return this.#I.push(e),e}update(){let t=0,e=0;for(let r=0;r{};return this.getOrCreatePromise(t).catch(r).then((t=>{t&&e(t)})),null}return r}clear(){this.stopListening();for(const[t,{reject:e}]of this.#L.entries())e(new Error(`Object with ${t} never resolved.`));this.#L.clear()}getOrCreatePromise(t){const e=this.#L.get(t);if(e)return e.promise;let r=()=>{},s=()=>{};const n=new Promise(((t,e)=>{r=t,s=e}));return this.#L.set(t,{promise:n,resolve:r,reject:s}),this.startListening(),n}onResolve(t,e){const r=this.#L.get(t);this.#L.delete(t),0===this.#L.size&&this.stopListening(),r?.resolve(e)}}});const fe={fetchAndXHR:"`Fetch` and `XHR`",javascript:"JavaScript",js:"JS",css:"CSS",img:"Img",media:"Media",font:"Font",doc:"Doc",ws:"WS",webassembly:"WebAssembly",wasm:"Wasm",manifest:"Manifest",other:"Other",document:"Document",stylesheet:"Stylesheet",image:"Image",script:"Script",texttrack:"TextTrack",fetch:"Fetch",eventsource:"EventSource",websocket:"WebSocket",webtransport:"WebTransport",signedexchange:"SignedExchange",ping:"Ping",cspviolationreport:"CSPViolationReport",preflight:"Preflight",webbundle:"WebBundle"},be=r.i18n.registerUIStrings("core/common/ResourceType.ts",fe),we=r.i18n.getLazilyComputedLocalizedString.bind(void 0,be);class Se{#B;#C;#_;#O;constructor(t,e,r,s){this.#B=t,this.#C=e,this.#_=r,this.#O=s}static fromMimeType(t){return t?t.startsWith("text/html")?Te.Document:t.startsWith("text/css")?Te.Stylesheet:t.startsWith("image/")?Te.Image:t.startsWith("text/")?Te.Script:t.includes("font")?Te.Font:t.includes("script")?Te.Script:t.includes("octet")?Te.Other:t.includes("application")?Te.Script:Te.Other:Te.Other}static fromMimeTypeOverride(t){return"application/manifest+json"===t?Te.Manifest:"application/wasm"===t?Te.Wasm:"application/webbundle"===t?Te.WebBundle:null}static fromURL(t){return ze.get(ue.extractExtension(t))||null}static fromName(t){for(const e in Te){const r=Te[e];if(r.name()===t)return r}return null}static mimeFromURL(t){const e=ue.extractName(t);if(Re.has(e))return Re.get(e);let r=ue.extractExtension(t).toLowerCase();return"html"===r&&e.endsWith(".component.html")&&(r="component.html"),Ae.get(r)}static mimeFromExtension(t){return Ae.get(t)}static simplifyContentType(t){return new RegExp("^application(.*json$|/json+.*)").test(t)?"application/json":t}static mediaTypeForMetrics(t,e,r){return"text/javascript"!==t?t:e?"text/javascript+sourcemapped":r?"text/javascript+minified":"text/javascript+plain"}name(){return this.#B}title(){return this.#C()}category(){return this.#_}isTextType(){return this.#O}isScript(){return"script"===this.#B||"sm-script"===this.#B}hasScripts(){return this.isScript()||this.isDocument()}isStyleSheet(){return"stylesheet"===this.#B||"sm-stylesheet"===this.#B}hasStyleSheets(){return this.isStyleSheet()||this.isDocument()}isDocument(){return"document"===this.#B}isDocumentOrScriptOrStyleSheet(){return this.isDocument()||this.isScript()||this.isStyleSheet()}isFont(){return"font"===this.#B}isImage(){return"image"===this.#B}isFromSourceMap(){return this.#B.startsWith("sm-")}isWebbundle(){return"webbundle"===this.#B}toString(){return this.#B}canonicalMimeType(){return this.isDocument()?"text/html":this.isScript()?"text/javascript":this.isStyleSheet()?"text/css":""}}class xe{title;shortTitle;constructor(t,e){this.title=t,this.shortTitle=e}static categoryByTitle(t){return Object.values(ve).find((e=>e.title()===t))||null}}const ve={XHR:new xe(we(fe.fetchAndXHR),r.i18n.lockedLazyString("Fetch/XHR")),Document:new xe(we(fe.document),we(fe.doc)),Stylesheet:new xe(we(fe.css),we(fe.css)),Script:new xe(we(fe.javascript),we(fe.js)),Font:new xe(we(fe.font),we(fe.font)),Image:new xe(we(fe.image),we(fe.img)),Media:new xe(we(fe.media),we(fe.media)),Manifest:new xe(we(fe.manifest),we(fe.manifest)),WebSocket:new xe(we(fe.websocket),we(fe.ws)),Wasm:new xe(we(fe.webassembly),we(fe.wasm)),Other:new xe(we(fe.other),we(fe.other))},Te={Document:new Se("document",we(fe.document),ve.Document,!0),Stylesheet:new Se("stylesheet",we(fe.stylesheet),ve.Stylesheet,!0),Image:new Se("image",we(fe.image),ve.Image,!1),Media:new Se("media",we(fe.media),ve.Media,!1),Font:new Se("font",we(fe.font),ve.Font,!1),Script:new Se("script",we(fe.script),ve.Script,!0),TextTrack:new Se("texttrack",we(fe.texttrack),ve.Other,!0),XHR:new Se("xhr",r.i18n.lockedLazyString("XHR"),ve.XHR,!0),Fetch:new Se("fetch",we(fe.fetch),ve.XHR,!0),Prefetch:new Se("prefetch",r.i18n.lockedLazyString("Prefetch"),ve.Document,!0),EventSource:new Se("eventsource",we(fe.eventsource),ve.XHR,!0),WebSocket:new Se("websocket",we(fe.websocket),ve.WebSocket,!1),WebTransport:new Se("webtransport",we(fe.webtransport),ve.WebSocket,!1),Wasm:new Se("wasm",we(fe.wasm),ve.Wasm,!1),Manifest:new Se("manifest",we(fe.manifest),ve.Manifest,!0),SignedExchange:new Se("signed-exchange",we(fe.signedexchange),ve.Other,!1),Ping:new Se("ping",we(fe.ping),ve.Other,!1),CSPViolationReport:new Se("csp-violation-report",we(fe.cspviolationreport),ve.Other,!1),Other:new Se("other",we(fe.other),ve.Other,!1),Preflight:new Se("preflight",we(fe.preflight),ve.Other,!0),SourceMapScript:new Se("sm-script",we(fe.script),ve.Script,!0),SourceMapStyleSheet:new Se("sm-stylesheet",we(fe.stylesheet),ve.Stylesheet,!0),WebBundle:new Se("webbundle",we(fe.webbundle),ve.Other,!1)},Re=new Map([["Cakefile","text/x-coffeescript"]]),ze=new Map([["js",Te.Script],["mjs",Te.Script],["css",Te.Stylesheet],["xsl",Te.Stylesheet],["avif",Te.Image],["bmp",Te.Image],["gif",Te.Image],["ico",Te.Image],["jpeg",Te.Image],["jpg",Te.Image],["jxl",Te.Image],["png",Te.Image],["svg",Te.Image],["tif",Te.Image],["tiff",Te.Image],["vue",Te.Document],["webmanifest",Te.Manifest],["webp",Te.Media],["otf",Te.Font],["ttc",Te.Font],["ttf",Te.Font],["woff",Te.Font],["woff2",Te.Font],["wasm",Te.Wasm]]),Ae=new Map([["js","text/javascript"],["mjs","text/javascript"],["css","text/css"],["html","text/html"],["htm","text/html"],["xml","application/xml"],["xsl","application/xml"],["wasm","application/wasm"],["webmanifest","application/manifest+json"],["asp","application/x-aspx"],["aspx","application/x-aspx"],["jsp","application/x-jsp"],["c","text/x-c++src"],["cc","text/x-c++src"],["cpp","text/x-c++src"],["h","text/x-c++src"],["m","text/x-c++src"],["mm","text/x-c++src"],["coffee","text/x-coffeescript"],["dart","application/vnd.dart"],["ts","text/typescript"],["tsx","text/typescript-jsx"],["json","application/json"],["gyp","application/json"],["gypi","application/json"],["map","application/json"],["cs","text/x-csharp"],["go","text/x-go"],["java","text/x-java"],["kt","text/x-kotlin"],["scala","text/x-scala"],["less","text/x-less"],["php","application/x-httpd-php"],["phtml","application/x-httpd-php"],["py","text/x-python"],["sh","text/x-sh"],["gss","text/x-gss"],["sass","text/x-sass"],["scss","text/x-scss"],["vtt","text/vtt"],["ls","text/x-livescript"],["md","text/markdown"],["cljs","text/x-clojure"],["cljc","text/x-clojure"],["cljx","text/x-clojure"],["styl","text/x-styl"],["jsx","text/jsx"],["avif","image/avif"],["bmp","image/bmp"],["gif","image/gif"],["ico","image/ico"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["jxl","image/jxl"],["png","image/png"],["svg","image/svg+xml"],["tif","image/tif"],["tiff","image/tiff"],["webp","image/webp"],["otf","font/otf"],["ttc","font/collection"],["ttf","font/ttf"],["woff","font/woff"],["woff2","font/woff2"],["component.html","text/x.angular"],["svelte","text/x.svelte"],["vue","text/x.vue"]]);var Ie=Object.freeze({__proto__:null,ResourceType:Se,ResourceCategory:xe,resourceCategories:ve,resourceTypes:Te,resourceTypeByExtension:ze,mimeTypeByExtension:Ae});const Pe=new Map;const ke=[];var Ee=Object.freeze({__proto__:null,registerLateInitializationRunnable:function(t){const{id:e,loadRunnable:r}=t;if(Pe.has(e))throw new Error(`Duplicate late Initializable runnable id '${e}'`);Pe.set(e,r)},maybeRemoveLateInitializationRunnable:function(t){return Pe.delete(t)},lateInitializationRunnables:function(){return[...Pe.values()]},registerEarlyInitializationRunnable:function(t){ke.push(t)},earlyInitializationRunnables:function(){return ke}});class Le{begin;end;data;constructor(t,e,r){if(t>e)throw new Error("Invalid segment");this.begin=t,this.end=e,this.data=r}intersects(t){return this.begint.begin-e.begin)),s=r,n=null;if(r>0){const e=this.#G[r-1];n=this.tryMerge(e,t),n?(--r,t=n):this.#G[r-1].end>=t.begin&&(t.endthis.append(t)))}segments(){return this.#G}tryMerge(t,e){const r=this.#N&&this.#N(t,e);return r?(r.begin=t.begin,r.end=Math.max(t.end,e.end),r):null}}});const Ce={elements:"Elements",appearance:"Appearance",sources:"Sources",network:"Network",performance:"Performance",console:"Console",persistence:"Persistence",debugger:"Debugger",global:"Global",rendering:"Rendering",grid:"Grid",mobile:"Mobile",memory:"Memory",extension:"Extension",adorner:"Adorner",sync:"Sync"},_e=r.i18n.registerUIStrings("core/common/SettingRegistration.ts",Ce),Oe=r.i18n.getLocalizedString.bind(void 0,_e);let Ge=[];const Ne=new Set;function Ve(t){const e=t.settingName;if(Ne.has(e))throw new Error(`Duplicate setting name '${e}'`);Ne.add(e),Ge.push(t)}function We(){return Ge.filter((e=>t.Runtime.Runtime.isDescriptorEnabled({experiment:e.experiment,condition:e.condition})))}function Me(t,e=!1){if(0===Ge.length||e){Ge=t,Ne.clear();for(const e of t){const t=e.settingName;if(Ne.has(t))throw new Error(`Duplicate setting name '${t}'`);Ne.add(t)}}}function Xe(){Ge=[],Ne.clear()}function Fe(t){const e=Ge.findIndex((e=>e.settingName===t));return!(e<0||!Ne.delete(t))&&(Ge.splice(e,1),!0)}function De(t){switch(t){case"ELEMENTS":return Oe(Ce.elements);case"APPEARANCE":return Oe(Ce.appearance);case"SOURCES":return Oe(Ce.sources);case"NETWORK":return Oe(Ce.network);case"PERFORMANCE":return Oe(Ce.performance);case"CONSOLE":case"EMULATION":return Oe(Ce.console);case"PERSISTENCE":return Oe(Ce.persistence);case"DEBUGGER":return Oe(Ce.debugger);case"GLOBAL":return Oe(Ce.global);case"RENDERING":return Oe(Ce.rendering);case"GRID":return Oe(Ce.grid);case"MOBILE":return Oe(Ce.mobile);case"MEMORY":return Oe(Ce.memory);case"EXTENSIONS":return Oe(Ce.extension);case"ADORNER":return Oe(Ce.adorner);case"":return r.i18n.lockedString("");case"SYNC":return Oe(Ce.sync)}}var Ue=Object.freeze({__proto__:null,registerSettingExtension:Ve,getRegisteredSettings:We,registerSettingsForTest:Me,resetSettings:Xe,maybeRemoveSettingExtension:Fe,getLocalizedSettingsCategory:De});let je;class $e{syncedStorage;globalStorage;localStorage;#V;settingNameSet;orderValuesBySettingCategory;#W;#M;moduleSettings;constructor(e,r,s){this.syncedStorage=e,this.globalStorage=r,this.localStorage=s,this.#V=new qe({}),this.settingNameSet=new Set,this.orderValuesBySettingCategory=new Map,this.#W=new Mt,this.#M=new Map,this.moduleSettings=new Map;for(const e of We()){const{settingName:r,defaultValue:s,storageType:n}=e,i="regex"===e.settingType&&"string"==typeof s?this.createRegExpSetting(r,s,void 0,n):this.createSetting(r,s,n);i.setTitleFunction(e.title),e.userActionCondition&&i.setRequiresUserAction(Boolean(t.Runtime.Runtime.queryParam(e.userActionCondition))),i.setRegistration(e),this.registerModuleSetting(i)}}static hasInstance(){return void 0!==je}static instance(t={forceNew:null,syncedStorage:null,globalStorage:null,localStorage:null}){const{forceNew:e,syncedStorage:r,globalStorage:s,localStorage:n}=t;if(!je||e){if(!r||!s||!n)throw new Error(`Unable to create settings: global and local storage must be provided: ${(new Error).stack}`);je=new $e(r,s,n)}return je}static removeInstance(){je=void 0}registerModuleSetting(t){const e=t.name,r=t.category(),s=t.order();if(this.settingNameSet.has(e))throw new Error(`Duplicate Setting name '${e}'`);if(r&&s){const t=this.orderValuesBySettingCategory.get(r)||new Set;if(t.has(s))throw new Error(`Duplicate order value '${s}' for settings category '${r}'`);t.add(s),this.orderValuesBySettingCategory.set(r,t)}this.settingNameSet.add(e),this.moduleSettings.set(t.name,t)}static normalizeSettingName(t){return[Qe.GLOBAL_VERSION_SETTING_NAME,Qe.SYNCED_VERSION_SETTING_NAME,Qe.LOCAL_VERSION_SETTING_NAME,"currentDockState","isUnderTest"].includes(t)?t:e.StringUtilities.toKebabCase(t)}moduleSetting(t){const e=this.moduleSettings.get(t);if(!e)throw new Error("No setting registered: "+t);return e}settingForTest(t){const e=this.#M.get(t);if(!e)throw new Error("No setting registered: "+t);return e}createSetting(t,e,r){const s=this.storageFromType(r);let n=this.#M.get(t);return n||(n=new Ke(t,e,this.#W,s),this.#M.set(t,n)),n}createLocalSetting(t,e){return this.createSetting(t,e,"Local")}createRegExpSetting(t,e,r,s){return this.#M.get(t)||this.#M.set(t,new Je(t,e,this.#W,this.storageFromType(s),r)),this.#M.get(t)}clearAll(){this.globalStorage.removeAll(),this.syncedStorage.removeAll(),this.localStorage.removeAll(),(new Qe).resetToCurrent()}storageFromType(t){switch(t){case"Local":return this.localStorage;case"Session":return this.#V;case"Global":return this.globalStorage;case"Synced":return this.syncedStorage}return this.globalStorage}getRegistry(){return this.#M}}const He={register:()=>{},set:()=>{},get:()=>Promise.resolve(""),remove:()=>{},clear:()=>{}};class qe{object;backingStore;storagePrefix;constructor(t,e=He,r=""){this.object=t,this.backingStore=e,this.storagePrefix=r}register(t){t=this.storagePrefix+t,this.backingStore.register(t)}set(t,e){t=this.storagePrefix+t,this.object[t]=e,this.backingStore.set(t,e)}has(t){return(t=this.storagePrefix+t)in this.object}get(t){return t=this.storagePrefix+t,this.object[t]}async forceGet(t){const e=this.storagePrefix+t,r=await this.backingStore.get(e);return r&&r!==this.object[e]?this.set(t,r):r||this.remove(t),r}remove(t){t=this.storagePrefix+t,delete this.object[t],this.backingStore.remove(t)}removeAll(){this.object={},this.backingStore.clear()}keys(){return Object.keys(this.object)}dumpSizes(){Kt.instance().log("Ten largest settings: ");const t={__proto__:null};for(const e in this.object)t[e]=this.object[e].length;const e=Object.keys(t);e.sort((function(e,r){return t[r]-t[e]}));for(let r=0;r<10&&rt.name===e.experiment)):void 0}}class Ke{name;defaultValue;eventSupport;storage;#X;#C;#F=null;#D;#U;#j=JSON;#$;#H;#q=null;constructor(t,e,r,s){this.name=t,this.defaultValue=e,this.eventSupport=r,this.storage=s,s.register(this.name)}setSerializer(t){this.#j=t}addChangeListener(t,e){return this.eventSupport.addEventListener(this.name,t,e)}removeChangeListener(t,e){this.eventSupport.removeEventListener(this.name,t,e)}title(){return this.#C?this.#C:this.#X?this.#X():""}setTitleFunction(t){t&&(this.#X=t)}setTitle(t){this.#C=t}setRequiresUserAction(t){this.#D=t}disabled(){if(this.#F?.disabledCondition){const{disabled:t}=this.#F.disabledCondition();if(t)return!0}return this.#H||!1}disabledReason(){if(this.#F?.disabledCondition){const t=this.#F.disabledCondition();if(t.disabled)return t.reason}}setDisabled(t){this.#H=t,this.eventSupport.dispatchEventToListeners(this.name)}get(){if(this.#D&&!this.#$)return this.defaultValue;if(void 0!==this.#U)return this.#U;if(this.#U=this.defaultValue,this.storage.has(this.name))try{this.#U=this.#j.parse(this.storage.get(this.name))}catch(t){this.storage.remove(this.name)}return this.#U}async forceGet(){const t=this.name,e=this.storage.get(t),r=await this.storage.forceGet(t);if(this.#U=this.defaultValue,r)try{this.#U=this.#j.parse(r)}catch(t){this.storage.remove(this.name)}return e!==r&&this.eventSupport.dispatchEventToListeners(this.name,this.#U),this.#U}set(t){this.#$=!0,this.#U=t;try{const e=this.#j.stringify(t);try{this.storage.set(this.name,e)}catch(t){this.printSettingsSavingError(t.message,this.name,e)}}catch(t){Kt.instance().error("Cannot stringify setting with name: "+this.name+", error: "+t.message)}this.eventSupport.dispatchEventToListeners(this.name,t)}setRegistration(e){this.#F=e;const{deprecationNotice:r}=e;if(r?.disabled){const e=r.experiment?t.Runtime.experiments.allConfigurableExperiments().find((t=>t.name===r.experiment)):void 0;e&&!e.isEnabled()||(this.set(this.defaultValue),this.setDisabled(!0))}}type(){return this.#F?this.#F.settingType:null}options(){return this.#F&&this.#F.options?this.#F.options.map((t=>{const{value:e,title:r,text:s,raw:n}=t;return{value:e,title:r(),text:"function"==typeof s?s():s,raw:n}})):[]}reloadRequired(){return this.#F&&this.#F.reloadRequired||null}category(){return this.#F&&this.#F.category||null}tags(){return this.#F&&this.#F.tags?this.#F.tags.map((t=>t())).join("\0"):null}order(){return this.#F&&this.#F.order||null}get deprecation(){return this.#F&&this.#F.deprecationNotice?(this.#q||(this.#q=new Ye(this.#F)),this.#q):null}printSettingsSavingError(t,e,r){const s="Error saving setting with name: "+this.name+", value length: "+r.length+". Error: "+t;console.error(s),Kt.instance().error(s),this.storage.dumpSizes()}}class Je extends Ke{#Z;#Y;constructor(t,e,r,s,n){super(t,e?[{pattern:e}]:[],r,s),this.#Z=n}get(){const t=[],e=this.getAsArray();for(let r=0;r`-url:${t}`)).join(" ");if(e){const t=$e.instance().createSetting("console.textFilter",""),r=t.get()?` ${t.get()}`:"";t.set(`${e}${r}`)}Ze(t)}updateVersionFrom26To27(){function t(t,e,r){const s=$e.instance().createSetting(t,{}),n=s.get();e in n&&(n[r]=n[e],delete n[e],s.set(n))}t("panel-tabOrder","audits2","audits"),t("panel-closeableTabs","audits2","audits"),function(t,e,r){const s=$e.instance().createSetting(t,"");s.get()===e&&s.set(r)}("panel-selectedTab","audits2","audits")}updateVersionFrom27To28(){const t=$e.instance().createSetting("uiTheme","systemPreferred");"default"===t.get()&&t.set("systemPreferred")}updateVersionFrom28To29(){function t(t,e,r){const s=$e.instance().createSetting(t,{}),n=s.get();e in n&&(n[r]=n[e],delete n[e],s.set(n))}t("panel-tabOrder","audits","lighthouse"),t("panel-closeableTabs","audits","lighthouse"),function(t,e,r){const s=$e.instance().createSetting(t,"");s.get()===e&&s.set(r)}("panel-selectedTab","audits","lighthouse")}updateVersionFrom29To30(){const t=$e.instance().createSetting("closeableTabs",{}),e=$e.instance().createSetting("panel-closeableTabs",{}),r=$e.instance().createSetting("drawer-view-closeableTabs",{}),s=e.get(),n=e.get(),i=Object.assign(n,s);t.set(i),Ze(e),Ze(r)}updateVersionFrom30To31(){Ze($e.instance().createSetting("recorder_recordings",[]))}updateVersionFrom31To32(){const t=$e.instance().createLocalSetting("breakpoints",[]),e=t.get();for(const t of e)t.resourceTypeName="script";t.set(e)}updateVersionFrom32To33(){const t=$e.instance().createLocalSetting("previouslyViewedFiles",[]);let e=t.get();e=e.filter((t=>"url"in t));for(const t of e)t.resourceTypeName="script";t.set(e)}updateVersionFrom33To34(){const t=$e.instance().createLocalSetting("breakpoints",[]),e=t.get();for(const t of e){const e=t.condition.startsWith("/** DEVTOOLS_LOGPOINT */ console.log(")&&t.condition.endsWith(")");t.isLogpoint=e}t.set(e)}updateVersionFrom34To35(){const t=$e.instance().createLocalSetting("breakpoints",[]),e=t.get();for(const t of e){const{condition:e,isLogpoint:r}=t;r&&(t.condition=e.slice(37,e.length-1))}t.set(e)}updateVersionFrom35To36(){$e.instance().createSetting("showThirdPartyIssues",!0).set(!0)}updateVersionFrom36To37(){const t=t=>{for(const e of t.keys()){const r=$e.normalizeSettingName(e);r!==e&&(t.set(r,t.get(e)),Ze({name:e,storage:t}))}};t($e.instance().globalStorage),t($e.instance().syncedStorage),t($e.instance().localStorage);for(const t of $e.instance().globalStorage.keys()){if(t.startsWith("data-grid-")&&t.endsWith("-column-weights")||t.endsWith("-tab-order")||"views-location-override"===t||"closeable-tabs"===t){const r=$e.instance().createSetting(t,{});r.set(e.StringUtilities.toKebabCaseKeys(r.get()))}if(t.endsWith("-selected-tab")){const r=$e.instance().createSetting(t,"");r.set(e.StringUtilities.toKebabCase(r.get()))}}}migrateSettingsFromLocalStorage(){const t=new Set(["advancedSearchConfig","breakpoints","consoleHistory","domBreakpoints","eventListenerBreakpoints","fileSystemMapping","lastSelectedSourcesSidebarPaneTab","previouslyViewedFiles","savedURLs","watchExpressions","workspaceExcludedFolders","xhrBreakpoints"]);if(window.localStorage)for(const e in window.localStorage){if(t.has(e))continue;const r=window.localStorage[e];window.localStorage.removeItem(e),$e.instance().globalStorage.set(e,r)}}clearBreakpointsWhenTooMany(t,e){t.get().length>e&&t.set([])}}function tr(t){return $e.instance().moduleSetting(t)}var er=Object.freeze({__proto__:null,Settings:$e,NOOP_STORAGE:He,SettingsStorage:qe,Deprecation:Ye,Setting:Ke,RegExpSetting:Je,VersionController:Qe,moduleSetting:tr,settingForTest:function(t){return $e.instance().settingForTest(t)},getLocalizedSettingsCategory:De,getRegisteredSettings:We,maybeRemoveSettingExtension:Fe,registerSettingExtension:Ve,registerSettingsForTest:Me,resetSettings:Xe});var rr=Object.freeze({__proto__:null,SimpleHistoryManager:class{#tt;#et;#rt;#st;constructor(t){this.#tt=[],this.#et=-1,this.#rt=0,this.#st=t}readOnlyLock(){++this.#rt}releaseReadOnlyLock(){--this.#rt}getPreviousValidIndex(){if(this.empty())return-1;let t=this.#et-1;for(;t>=0&&!this.#tt[t].valid();)--t;return t<0?-1:t}getNextValidIndex(){let t=this.#et+1;for(;t=this.#tt.length?-1:t}readOnly(){return Boolean(this.#rt)}filterOut(t){if(this.readOnly())return;const e=[];let r=0;for(let s=0;sthis.#st&&this.#tt.shift(),this.#et=this.#tt.length-1)}canRollback(){return this.getPreviousValidIndex()>=0}canRollover(){return this.getNextValidIndex()>=0}rollback(){const t=this.getPreviousValidIndex();return-1!==t&&(this.readOnlyLock(),this.#et=t,this.#tt[t].reveal(),this.releaseReadOnlyLock(),!0)}rollover(){const t=this.getNextValidIndex();return-1!==t&&(this.readOnlyLock(),this.#et=t,this.#tt[t].reveal(),this.releaseReadOnlyLock(),!0)}}});var sr=Object.freeze({__proto__:null,StringOutputStream:class{#nt;constructor(){this.#nt=""}async write(t){this.#nt+=t}async close(){}data(){return this.#nt}}});class nr{#it;#at;#ot;#lt;#ht;#ct;#ut;constructor(t){this.#at=0,this.#ut=t,this.clear()}static newStringTrie(){return new nr({empty:()=>"",append:(t,e)=>t+e,slice:(t,e,r)=>t.slice(e,r)})}static newArrayTrie(){return new nr({empty:()=>[],append:(t,e)=>t.concat([e]),slice:(t,e,r)=>t.slice(e,r)})}add(t){let e=this.#at;++this.#ht[this.#at];for(let r=0;r{this.#bt=t}))}processCompleted(){this.#yt=this.getTime(),this.#dt=!1,this.#mt&&this.innerSchedule(!1),this.processCompletedForTests()}processCompletedForTests(){}get process(){return this.#mt}onTimeout(){this.#wt=void 0,this.#pt=!1,this.#dt=!0,Promise.resolve().then(this.#mt).catch(console.error.bind(console)).then(this.processCompleted.bind(this)).then(this.#bt),this.#ft=new Promise((t=>{this.#bt=t})),this.#mt=null}schedule(t,e){this.#mt=t;const r=Boolean(this.#wt)||this.#dt,s=this.getTime()-this.#yt>this.#gt,n=(e=Boolean(e)||!r&&s)&&!this.#pt;return this.#pt=this.#pt||e,this.innerSchedule(n),this.#ft}innerSchedule(t){if(this.#dt)return;if(this.#wt&&!t)return;this.#wt&&this.clearTimeout(this.#wt);const e=this.#pt?0:this.#gt;this.#wt=this.setTimeout(this.onTimeout.bind(this),e)}clearTimeout(t){clearTimeout(t)}setTimeout(t,e){return window.setTimeout(t,e)}getTime(){return window.performance.now()}}});var lr=Object.freeze({__proto__:null,WasmDisassembly:class{lines;#St;#xt;constructor(t,e,r){if(t.length!==e.length)throw new Error("Lines and offsets don't match");this.lines=t,this.#St=e,this.#xt=r}get lineNumbers(){return this.#St.length}bytecodeOffsetToLineNumber(t){return e.ArrayUtilities.upperBound(this.#St,t,e.ArrayUtilities.DEFAULT_COMPARATOR)-1}lineNumberToBytecodeOffset(t){return this.#St[t]}*nonBreakableLineNumbers(){let t=0,e=0;for(;t=this.#xt[e].start){t=this.bytecodeOffsetToLineNumber(this.#xt[e++].end)+1;continue}}yield t++}}}});class hr{#vt;#Tt;constructor(t){this.#vt=new Promise((e=>{const r=new Worker(t,{type:"module"});r.onmessage=t=>{console.assert("workerReady"===t.data),r.onmessage=null,e(r)}}))}static fromURL(t){return new hr(t)}postMessage(t){this.#vt.then((e=>{this.#Tt||e.postMessage(t)}))}dispose(){this.#Tt=!0,this.#vt.then((t=>t.terminate()))}terminate(){this.dispose()}set onmessage(t){this.#vt.then((e=>{e.onmessage=t}))}set onerror(t){this.#vt.then((e=>{e.onerror=t}))}}var cr=Object.freeze({__proto__:null,WorkerWrapper:hr});export{s as App,i as AppProvider,l as Base64,h as CharacterIdMap,Wt as Color,k as ColorConverter,nt as ColorUtils,Qt as Console,te as Debouncer,ee as EventTarget,re as JavaScriptMetaData,ie as Lazy,le as Linkifier,he as Mutex,Xt as ObjectWrapper,ge as ParsedURL,pe as Progress,me as QueryParamHandler,ye as ResolverBase,Ie as ResourceType,Zt as Revealer,Ee as Runnable,Be as SegmentedRange,Ue as SettingRegistration,er as Settings,rr as SimpleHistoryManager,sr as StringOutputStream,ar as TextDictionary,or as Throttler,ir as Trie,lr as WasmDisassembly,cr as Worker}; +import*as t from"../root/root.js";import*as e from"../platform/platform.js";export{UIString}from"../platform/platform.js";import*as r from"../i18n/i18n.js";var s=Object.freeze({__proto__:null});const n=[];var i=Object.freeze({__proto__:null,registerAppProvider:function(t){n.push(t)},getRegisteredAppProviders:function(){return n.filter((e=>t.Runtime.Runtime.isDescriptorEnabled({experiment:void 0,condition:e.condition}))).sort(((t,e)=>(t.order||0)-(e.order||0)))}});const a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=new Uint8Array(123);for(let t=0;t<64;++t)o[a.charCodeAt(t)]=t;var l=Object.freeze({__proto__:null,BASE64_CHARS:a,BASE64_CODES:o,decode:function(t){let e=3*t.length/4>>>0;61===t.charCodeAt(t.length-2)?e-=2:61===t.charCodeAt(t.length-1)&&(e-=1);const r=new Uint8Array(e);for(let e=0,s=0;e>4,r[s++]=(15&i)<<4|a>>2,r[s++]=(3&a)<<6|63&l}return r.buffer},encode:function(t){return new Promise(((e,r)=>{const s=new FileReader;s.onerror=()=>r(new Error("failed to convert to base64")),s.onload=()=>{const t=s.result,[,r]=t.split(",",2);e(r)},s.readAsDataURL(new Blob([t]))}))}});var h=Object.freeze({__proto__:null,CharacterIdMap:class{#t;#e;#r;constructor(){this.#t=new Map,this.#e=new Map,this.#r=33}toChar(t){let e=this.#t.get(t);if(!e){if(this.#r>=65535)throw new Error("CharacterIdMap ran out of capacity!");e=String.fromCharCode(this.#r++),this.#t.set(t,e),this.#e.set(e,t)}return e}fromChar(t){const e=this.#e.get(t);return void 0===e?null:e}}});const c=.9642,u=.8251;class g{values=[0,0,0];constructor(t){t&&(this.values=t)}}class d{values=[[0,0,0],[0,0,0],[0,0,0]];constructor(t){t&&(this.values=t)}multiply(t){const e=new g;for(let r=0;r<3;++r)e.values[r]=this.values[r][0]*t.values[0]+this.values[r][1]*t.values[1]+this.values[r][2]*t.values[2];return e}}class p{g;a;b;c;d;e;f;constructor(t,e,r=0,s=0,n=0,i=0,a=0){this.g=t,this.a=e,this.b=r,this.c=s,this.d=n,this.e=i,this.f=a}eval(t){const e=t<0?-1:1,r=t*e;return rF?t:t+Math.pow(F-t,D)}function J(t,e){if(t=K(t),e=K(e),Math.abs(t-e)t?(r=(Math.pow(e,G)-Math.pow(t,M))*U,r=r-H?0:r+$),100*r}function Q(t,e,r){function s(){return r?Math.pow(Math.abs(Math.pow(t,W)-(-e-$)/j),1/X):Math.pow(Math.abs(Math.pow(t,G)-(e+$)/U),1/M)}t=K(t),e/=100;let n=s();return(n<0||n>1)&&(r=!r,n=s()),n}const tt=[[12,-1,-1,-1,-1,100,90,80,-1,-1],[14,-1,-1,-1,100,90,80,60,60,-1],[16,-1,-1,100,90,80,60,55,50,50],[18,-1,-1,90,80,60,55,50,40,40],[24,-1,100,80,60,55,50,40,38,35],[30,-1,90,70,55,50,40,38,35,40],[36,-1,80,60,50,40,38,35,30,25],[48,100,70,55,40,38,35,30,25,20],[60,90,60,50,38,35,30,25,20,20],[72,80,55,40,35,30,25,20,20,20],[96,70,50,35,30,25,20,20,20,20],[120,60,40,30,25,20,20,20,20,20]];function et(t,e){const r=72*parseFloat(t.replace("px",""))/96;return(isNaN(Number(e))?["bold","bolder"].includes(e):Number(e)>=600)?r>=14:r>=18}tt.reverse();const rt={aa:3,aaa:4.5},st={aa:4.5,aaa:7};var nt=Object.freeze({__proto__:null,blendColors:k,rgbToHsl:L,rgbaToHsla:_,rgbToHwb:O,rgbaToHwba:B,luminance:N,contrastRatio:function(t,e){const r=N(k(t,e)),s=N(e);return(Math.max(r,s)+.05)/(Math.min(r,s)+.05)},luminanceAPCA:Z,contrastRatioAPCA:Y,contrastRatioByLuminanceAPCA:J,desiredLuminanceAPCA:Q,getAPCAThreshold:function(t,e){const r=parseFloat(t.replace("px","")),s=parseFloat(e);for(const[t,...e]of tt)if(r>=t)for(const[t,r]of[900,800,700,600,500,400,300,200,100].entries())if(s>=r){const r=e[e.length-1-t];return-1===r?null:r}return null},isLargeFont:et,getContrastThreshold:function(t,e){return et(t,e)?rt:st}});function it(t){return(t%360+360)%360}function at(t){const e=t.replace(/(deg|g?rad|turn)$/,"");if(isNaN(e)||t.match(/\s+(deg|g?rad|turn)/))return null;const r=parseFloat(e);return t.includes("turn")?360*r:t.includes("grad")?9*r/10:t.includes("rad")?180*r/Math.PI:r}function ot(t){switch(t){case"srgb":return"srgb";case"srgb-linear":return"srgb-linear";case"display-p3":return"display-p3";case"a98-rgb":return"a98-rgb";case"prophoto-rgb":return"prophoto-rgb";case"rec2020":return"rec2020";case"xyz":return"xyz";case"xyz-d50":return"xyz-d50";case"xyz-d65":return"xyz-d65"}return null}function lt(t,e){const r=Math.sign(t),s=Math.abs(t),[n,i]=e;return r*(s*(i-n)/100+n)}function ht(t,{min:e,max:r}){return null===t||(void 0!==e&&(t=Math.max(t,e)),void 0!==r&&(t=Math.min(t,r))),t}function ct(t,e){if(!t.endsWith("%"))return null;const r=parseFloat(t.substr(0,t.length-1));return isNaN(r)?null:lt(r,e)}function ut(t){const e=parseFloat(t);return isNaN(e)?null:e}function gt(t){return void 0===t?null:ht(ct(t,[0,1])??ut(t),{min:0,max:1})}function dt(t,e=[0,1]){if(isNaN(t.replace("%","")))return null;const r=parseFloat(t);return-1!==t.indexOf("%")?t.indexOf("%")!==t.length-1?null:lt(r,e):r}function pt(t){const e=dt(t);return null===e?null:-1!==t.indexOf("%")?e:e/255}function mt(t){const e=t.replace(/(deg|g?rad|turn)$/,"");if(isNaN(e)||t.match(/\s+(deg|g?rad|turn)/))return null;const r=parseFloat(e);return-1!==t.indexOf("turn")?r%1:-1!==t.indexOf("grad")?r/400%1:-1!==t.indexOf("rad")?r/(2*Math.PI)%1:r/360%1}function yt(t){if(t.indexOf("%")!==t.length-1||isNaN(t.replace("%","")))return null;return parseFloat(t)/100}function ft(t){const e=t[0];let r=t[1];const s=t[2];function n(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}let i;r<0&&(r=0),i=s<=.5?s*(1+r):s+r-s*r;const a=2*s-i,o=e,l=e-1/3;return[n(a,i,e+1/3),n(a,i,o),n(a,i,l),t[3]]}function bt(t){return ft(function(t){const e=t[0];let r=t[1];const s=t[2],n=(2-r)*s;return 0===s||0===r?r=0:r*=s/(n<1?n:2-n),[e,r,n/2,t[3]]}(t))}function wt(t,e,r){function s(){return r?(t+.05)*e-.05:(t+.05)/e-.05}let n=s();return(n<0||n>1)&&(r=!r,n=s()),n}function St(t,e,r,s,n){let i=t[r],a=1,o=n(t)-s,l=Math.sign(o);for(let e=100;e;e--){if(Math.abs(o)<2e-4)return t[r]=i,i;const e=Math.sign(o);if(e!==l)a/=2,l=e;else if(i<0||i>1)return null;i+=a*(2===r?-o:o),t[r]=i,o=n(t)-s}return null}function xt(t,e,r=.01){if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return!1;for(const r in t)if(!xt(t[r],e[r]))return!1;return!0}return!Array.isArray(t)&&!Array.isArray(e)&&(null===t||null===e?t===e:Math.abs(t-e)new Ot(t.#a(!1),"hex"),hexa:t=>new Ot(t.#a(!0),"hexa"),rgb:t=>new Ot(t.#a(!1),"rgb"),rgba:t=>new Ot(t.#a(!0),"rgba"),hsl:t=>new At(...L(t.#a(!1)),t.alpha),hsla:t=>new At(...L(t.#a(!1)),t.alpha),hwb:t=>new Et(...O(t.#a(!1)),t.alpha),hwba:t=>new Et(...O(t.#a(!1)),t.alpha),lch:t=>new zt(...A.labToLch(t.l,t.a,t.b),t.alpha),oklch:t=>new It(...A.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>t,oklab:t=>new Rt(...A.xyzd65ToOklab(...A.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new Pt("srgb",...A.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new Pt("srgb-linear",...A.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new Pt("display-p3",...A.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new Pt("a98-rgb",...A.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new Pt("prophoto-rgb",...A.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new Pt("rec2020",...A.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new Pt("xyz",...A.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new Pt("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new Pt("xyz-d65",...A.xyzd50ToD65(...t.#o()),t.alpha)};#o(){return A.labToXyzd50(this.l,this.a,this.b)}#a(t=!0){const e=A.xyzd50ToSrgb(...this.#o());return t?[...e,this.alpha??void 0]:e}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(t,{min:0,max:100}),(xt(this.l,0,1)||xt(this.l,100,1))&&(e=r=0),this.a=e,this.b=r,this.alpha=ht(s,{min:0,max:1}),this.#s=n}is(t){return t===this.format()}as(t){return Tt.#i[t](this)}asLegacyColor(){return this.as("rgba")}equal(t){const e=t.as("lab");return xt(e.l,this.l,1)&&xt(e.a,this.a)&&xt(e.b,this.b)&&xt(e.alpha,this.alpha)}format(){return"lab"}setAlpha(t){return new Tt(this.l,this.a,this.b,t,void 0)}asString(t){return t?this.as(t).asString():this.#l(this.l,this.a,this.b)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`lab(${e.StringUtilities.stringifyWithPrecision(t,0)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!1}static fromSpec(t,e){const r=ct(t[0],[0,100])??ut(t[0]);if(null===r)return null;const s=ct(t[1],[0,125])??ut(t[1]);if(null===s)return null;const n=ct(t[2],[0,125])??ut(t[2]);if(null===n)return null;const i=gt(t[3]);return new Tt(r,s,n,i,e)}}class zt{#n;l;c;h;alpha;#s;static#i={hex:t=>new Ot(t.#a(!1),"hex"),hexa:t=>new Ot(t.#a(!0),"hexa"),rgb:t=>new Ot(t.#a(!1),"rgb"),rgba:t=>new Ot(t.#a(!0),"rgba"),hsl:t=>new At(...L(t.#a(!1)),t.alpha),hsla:t=>new At(...L(t.#a(!1)),t.alpha),hwb:t=>new Et(...O(t.#a(!1)),t.alpha),hwba:t=>new Et(...O(t.#a(!1)),t.alpha),lch:t=>t,oklch:t=>new It(...A.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...A.lchToLab(t.l,t.c,t.h),t.alpha),oklab:t=>new Rt(...A.xyzd65ToOklab(...A.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new Pt("srgb",...A.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new Pt("srgb-linear",...A.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new Pt("display-p3",...A.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new Pt("a98-rgb",...A.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new Pt("prophoto-rgb",...A.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new Pt("rec2020",...A.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new Pt("xyz",...A.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new Pt("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new Pt("xyz-d65",...A.xyzd50ToD65(...t.#o()),t.alpha)};#o(){return A.labToXyzd50(...A.lchToLab(this.l,this.c,this.h))}#a(t=!0){const e=A.xyzd50ToSrgb(...this.#o());return t?[...e,this.alpha??void 0]:e}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(t,{min:0,max:100}),e=xt(this.l,0,1)||xt(this.l,100,1)?0:e,this.c=ht(e,{min:0}),r=xt(e,0)?0:r,this.h=it(r),this.alpha=ht(s,{min:0,max:1}),this.#s=n}asLegacyColor(){return this.as("rgba")}is(t){return t===this.format()}as(t){return zt.#i[t](this)}equal(t){const e=t.as("lch");return xt(e.l,this.l,1)&&xt(e.c,this.c)&&xt(e.h,this.h)&&xt(e.alpha,this.alpha)}format(){return"lch"}setAlpha(t){return new zt(this.l,this.c,this.h,t)}asString(t){return t?this.as(t).asString():this.#l(this.l,this.c,this.h)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`lch(${e.StringUtilities.stringifyWithPrecision(t,0)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!1}isHuePowerless(){return xt(this.c,0)}static fromSpec(t,e){const r=ct(t[0],[0,100])??ut(t[0]);if(null===r)return null;const s=ct(t[1],[0,150])??ut(t[1]);if(null===s)return null;const n=at(t[2]);if(null===n)return null;const i=gt(t[3]);return new zt(r,s,n,i,e)}}class Rt{#n;l;a;b;alpha;#s;static#i={hex:t=>new Ot(t.#a(!1),"hex"),hexa:t=>new Ot(t.#a(!0),"hexa"),rgb:t=>new Ot(t.#a(!1),"rgb"),rgba:t=>new Ot(t.#a(!0),"rgba"),hsl:t=>new At(...L(t.#a(!1)),t.alpha),hsla:t=>new At(...L(t.#a(!1)),t.alpha),hwb:t=>new Et(...O(t.#a(!1)),t.alpha),hwba:t=>new Et(...O(t.#a(!1)),t.alpha),lch:t=>new zt(...A.labToLch(...A.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new It(...A.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...A.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>t,srgb:t=>new Pt("srgb",...A.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new Pt("srgb-linear",...A.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new Pt("display-p3",...A.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new Pt("a98-rgb",...A.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new Pt("prophoto-rgb",...A.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new Pt("rec2020",...A.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new Pt("xyz",...A.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new Pt("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new Pt("xyz-d65",...A.xyzd50ToD65(...t.#o()),t.alpha)};#o(){return A.xyzd65ToD50(...A.oklabToXyzd65(this.l,this.a,this.b))}#a(t=!0){const e=A.xyzd50ToSrgb(...this.#o());return t?[...e,this.alpha??void 0]:e}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(t,{min:0,max:1}),(xt(this.l,0)||xt(this.l,1))&&(e=r=0),this.a=e,this.b=r,this.alpha=ht(s,{min:0,max:1}),this.#s=n}asLegacyColor(){return this.as("rgba")}is(t){return t===this.format()}as(t){return Rt.#i[t](this)}equal(t){const e=t.as("oklab");return xt(e.l,this.l)&&xt(e.a,this.a)&&xt(e.b,this.b)&&xt(e.alpha,this.alpha)}format(){return"oklab"}setAlpha(t){return new Rt(this.l,this.a,this.b,t)}asString(t){return t?this.as(t).asString():this.#l(this.l,this.a,this.b)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`oklab(${e.StringUtilities.stringifyWithPrecision(t)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!1}static fromSpec(t,e){const r=ct(t[0],[0,1])??ut(t[0]);if(null===r)return null;const s=ct(t[1],[0,.4])??ut(t[1]);if(null===s)return null;const n=ct(t[2],[0,.4])??ut(t[2]);if(null===n)return null;const i=gt(t[3]);return new Rt(r,s,n,i,e)}}class It{#n;l;c;h;alpha;#s;static#i={hex:t=>new Ot(t.#a(!1),"hex"),hexa:t=>new Ot(t.#a(!0),"hexa"),rgb:t=>new Ot(t.#a(!1),"rgb"),rgba:t=>new Ot(t.#a(!0),"rgba"),hsl:t=>new At(...L(t.#a(!1)),t.alpha),hsla:t=>new At(...L(t.#a(!1)),t.alpha),hwb:t=>new Et(...O(t.#a(!1)),t.alpha),hwba:t=>new Et(...O(t.#a(!1)),t.alpha),lch:t=>new zt(...A.labToLch(...A.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>t,lab:t=>new Tt(...A.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new Rt(...A.xyzd65ToOklab(...A.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new Pt("srgb",...A.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new Pt("srgb-linear",...A.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new Pt("display-p3",...A.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new Pt("a98-rgb",...A.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new Pt("prophoto-rgb",...A.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new Pt("rec2020",...A.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new Pt("xyz",...A.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new Pt("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new Pt("xyz-d65",...A.xyzd50ToD65(...t.#o()),t.alpha)};#o(){return A.oklchToXyzd50(this.l,this.c,this.h)}#a(t=!0){const e=A.xyzd50ToSrgb(...this.#o());return t?[...e,this.alpha??void 0]:e}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(t,{min:0,max:1}),e=xt(this.l,0)||xt(this.l,1)?0:e,this.c=ht(e,{min:0}),r=xt(e,0)?0:r,this.h=it(r),this.alpha=ht(s,{min:0,max:1}),this.#s=n}asLegacyColor(){return this.as("rgba")}is(t){return t===this.format()}as(t){return It.#i[t](this)}equal(t){const e=t.as("oklch");return xt(e.l,this.l)&&xt(e.c,this.c)&&xt(e.h,this.h)&&xt(e.alpha,this.alpha)}format(){return"oklch"}setAlpha(t){return new It(this.l,this.c,this.h,t)}asString(t){return t?this.as(t).asString():this.#l(this.l,this.c,this.h)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`oklch(${e.StringUtilities.stringifyWithPrecision(t)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!1}static fromSpec(t,e){const r=ct(t[0],[0,1])??ut(t[0]);if(null===r)return null;const s=ct(t[1],[0,.4])??ut(t[1]);if(null===s)return null;const n=at(t[2]);if(null===n)return null;const i=gt(t[3]);return new It(r,s,n,i,e)}}class Pt{#n;p0;p1;p2;alpha;colorSpace;#s;static#i={hex:t=>new Ot(t.#a(!1),"hex"),hexa:t=>new Ot(t.#a(!0),"hexa"),rgb:t=>new Ot(t.#a(!1),"rgb"),rgba:t=>new Ot(t.#a(!0),"rgba"),hsl:t=>new At(...L(t.#a(!1)),t.alpha),hsla:t=>new At(...L(t.#a(!1)),t.alpha),hwb:t=>new Et(...O(t.#a(!1)),t.alpha),hwba:t=>new Et(...O(t.#a(!1)),t.alpha),lch:t=>new zt(...A.labToLch(...A.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new It(...A.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...A.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new Rt(...A.xyzd65ToOklab(...A.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new Pt("srgb",...A.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new Pt("srgb-linear",...A.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new Pt("display-p3",...A.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new Pt("a98-rgb",...A.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new Pt("prophoto-rgb",...A.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new Pt("rec2020",...A.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new Pt("xyz",...A.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new Pt("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new Pt("xyz-d65",...A.xyzd50ToD65(...t.#o()),t.alpha)};#o(){const[t,e,r]=this.#n;switch(this.colorSpace){case"srgb":return A.srgbToXyzd50(t,e,r);case"srgb-linear":return A.srgbLinearToXyzd50(t,e,r);case"display-p3":return A.displayP3ToXyzd50(t,e,r);case"a98-rgb":return A.adobeRGBToXyzd50(t,e,r);case"prophoto-rgb":return A.proPhotoToXyzd50(t,e,r);case"rec2020":return A.rec2020ToXyzd50(t,e,r);case"xyz-d50":return[t,e,r];case"xyz":case"xyz-d65":return A.xyzd65ToD50(t,e,r)}throw new Error("Invalid color space")}#a(t=!0){const[e,r,s]=this.#n,n="srgb"===this.colorSpace?[e,r,s]:[...A.xyzd50ToSrgb(...this.#o())];return t?[...n,this.alpha??void 0]:n}constructor(t,e,r,s,n,i){this.#n=[e,r,s],this.colorSpace=t,this.#s=i,"xyz-d50"!==this.colorSpace&&"xyz-d65"!==this.colorSpace&&"xyz"!==this.colorSpace&&(e=ht(e,{min:0,max:1}),r=ht(r,{min:0,max:1}),s=ht(s,{min:0,max:1})),this.p0=e,this.p1=r,this.p2=s,this.alpha=ht(n,{min:0,max:1})}asLegacyColor(){return this.as("rgba")}is(t){return t===this.format()}as(t){return this.colorSpace===t?this:Pt.#i[t](this)}equal(t){const e=t.as(this.colorSpace);return xt(this.p0,e.p0)&&xt(this.p1,e.p1)&&xt(this.p2,e.p2)&&xt(this.alpha,e.alpha)}format(){return this.colorSpace}setAlpha(t){return new Pt(this.colorSpace,this.p0,this.p1,this.p2,t)}asString(t){return t?this.as(t).asString():this.#l(this.p0,this.p1,this.p2)}#l(t,r,s){const n=null===this.alpha||xt(this.alpha,1)?"":` / ${e.StringUtilities.stringifyWithPrecision(this.alpha)}`;return`color(${this.colorSpace} ${e.StringUtilities.stringifyWithPrecision(t)} ${e.StringUtilities.stringifyWithPrecision(r)} ${e.StringUtilities.stringifyWithPrecision(s)}${n})`}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return"xyz-d50"!==this.colorSpace&&"xyz-d65"!==this.colorSpace&&"xyz"!==this.colorSpace&&!xt(this.#n,[this.p0,this.p1,this.p2])}static fromSpec(t,e){const[r,s]=e.split("/",2),n=r.trim().split(/\s+/),[i,...a]=n,o=ot(i);if(!o)return null;if(0===a.length&&void 0===s)return new Pt(o,0,0,0,null,t);if(0===a.length&&void 0!==s&&s.trim().split(/\s+/).length>1)return null;if(a.length>3)return null;const l=a.map((t=>"none"===t?"0":t)).map((t=>dt(t,[0,1])));if(l.includes(null))return null;const h=s?dt(s,[0,1])??1:1,c=[l[0]??0,l[1]??0,l[2]??0,h];return new Pt(o,...c,t)}}class At{h;s;l;alpha;#n;#s;static#i={hex:t=>new Ot(t.#a(!1),"hex"),hexa:t=>new Ot(t.#a(!0),"hexa"),rgb:t=>new Ot(t.#a(!1),"rgb"),rgba:t=>new Ot(t.#a(!0),"rgba"),hsl:t=>t,hsla:t=>t,hwb:t=>new Et(...O(t.#a(!1)),t.alpha),hwba:t=>new Et(...O(t.#a(!1)),t.alpha),lch:t=>new zt(...A.labToLch(...A.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new It(...A.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...A.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new Rt(...A.xyzd65ToOklab(...A.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new Pt("srgb",...A.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new Pt("srgb-linear",...A.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new Pt("display-p3",...A.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new Pt("a98-rgb",...A.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new Pt("prophoto-rgb",...A.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new Pt("rec2020",...A.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new Pt("xyz",...A.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new Pt("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new Pt("xyz-d65",...A.xyzd50ToD65(...t.#o()),t.alpha)};#a(t=!0){const e=ft([this.h,this.s,this.l,0]);return t?[e[0],e[1],e[2],this.alpha??void 0]:[e[0],e[1],e[2]]}#o(){const t=this.#a(!1);return A.srgbToXyzd50(t[0],t[1],t[2])}constructor(t,e,r,s,n){this.#n=[t,e,r],this.l=ht(r,{min:0,max:1}),e=xt(this.l,0)||xt(this.l,1)?0:e,this.s=ht(e,{min:0,max:1}),t=xt(this.s,0)?0:t,this.h=it(360*t)/360,this.alpha=ht(s??null,{min:0,max:1}),this.#s=n}equal(t){const e=t.as("hsl");return xt(this.h,e.h)&&xt(this.s,e.s)&&xt(this.l,e.l)&&xt(this.alpha,e.alpha)}asString(t){return t?this.as(t).asString():this.#l(this.h,this.s,this.l)}#l(t,r,s){const n=e.StringUtilities.sprintf("hsl(%sdeg %s% %s%",e.StringUtilities.stringifyWithPrecision(360*t),e.StringUtilities.stringifyWithPrecision(100*r),e.StringUtilities.stringifyWithPrecision(100*s));return null!==this.alpha&&1!==this.alpha?n+e.StringUtilities.sprintf(" / %s%)",e.StringUtilities.stringifyWithPrecision(100*this.alpha)):n+")"}setAlpha(t){return new At(this.h,this.s,this.l,t)}format(){return null===this.alpha||1===this.alpha?"hsl":"hsla"}is(t){return t===this.format()}as(t){return t===this.format()?this:At.#i[t](this)}asLegacyColor(){return this.as("rgba")}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!vt(this.#n[1],1)||!vt(0,this.#n[1])}static fromSpec(t,e){const r=mt(t[0]);if(null===r)return null;const s=yt(t[1]);if(null===s)return null;const n=yt(t[2]);if(null===n)return null;const i=gt(t[3]);return new At(r,s,n,i,e)}hsva(){const t=this.s*(this.l<.5?this.l:1-this.l);return[this.h,0!==t?2*t/(this.l+t):0,this.l+t,this.alpha??1]}canonicalHSLA(){return[Math.round(360*this.h),Math.round(100*this.s),Math.round(100*this.l),this.alpha??1]}}class Et{h;w;b;alpha;#n;#s;static#i={hex:t=>new Ot(t.#a(!1),"hex"),hexa:t=>new Ot(t.#a(!0),"hexa"),rgb:t=>new Ot(t.#a(!1),"rgb"),rgba:t=>new Ot(t.#a(!0),"rgba"),hsl:t=>new At(...L(t.#a(!1)),t.alpha),hsla:t=>new At(...L(t.#a(!1)),t.alpha),hwb:t=>t,hwba:t=>t,lch:t=>new zt(...A.labToLch(...A.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new It(...A.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...A.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new Rt(...A.xyzd65ToOklab(...A.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new Pt("srgb",...A.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new Pt("srgb-linear",...A.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new Pt("display-p3",...A.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new Pt("a98-rgb",...A.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new Pt("prophoto-rgb",...A.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new Pt("rec2020",...A.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new Pt("xyz",...A.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new Pt("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new Pt("xyz-d65",...A.xyzd50ToD65(...t.#o()),t.alpha)};#a(t=!0){const e=function(t){const e=t[0],r=t[1],s=t[2],n=r/(r+s);let i=[n,n,n,t[3]];if(r+s<1){i=ft([e,1,.5,t[3]]);for(let t=0;t<3;++t)i[t]+=r-(r+s)*i[t]}return i}([this.h,this.w,this.b,0]);return t?[e[0],e[1],e[2],this.alpha??void 0]:[e[0],e[1],e[2]]}#o(){const t=this.#a(!1);return A.srgbToXyzd50(t[0],t[1],t[2])}constructor(t,e,r,s,n){if(this.#n=[t,e,r],this.w=ht(e,{min:0,max:1}),this.b=ht(r,{min:0,max:1}),t=vt(1,this.w+this.b)?0:t,this.h=it(360*t)/360,this.alpha=ht(s,{min:0,max:1}),vt(1,this.w+this.b)){const t=this.w/this.b;this.b=1/(1+t),this.w=1-this.b}this.#s=n}equal(t){const e=t.as("hwb");return xt(this.h,e.h)&&xt(this.w,e.w)&&xt(this.b,e.b)&&xt(this.alpha,e.alpha)}asString(t){return t?this.as(t).asString():this.#l(this.h,this.w,this.b)}#l(t,r,s){const n=e.StringUtilities.sprintf("hwb(%sdeg %s% %s%",e.StringUtilities.stringifyWithPrecision(360*t),e.StringUtilities.stringifyWithPrecision(100*r),e.StringUtilities.stringifyWithPrecision(100*s));return null!==this.alpha&&1!==this.alpha?n+e.StringUtilities.sprintf(" / %s%)",e.StringUtilities.stringifyWithPrecision(100*this.alpha)):n+")"}setAlpha(t){return new Et(this.h,this.w,this.b,t,this.#s)}format(){return null===this.alpha||xt(this.alpha,1)?"hwb":"hwba"}is(t){return t===this.format()}as(t){return t===this.format()?this:Et.#i[t](this)}asLegacyColor(){return this.as("rgba")}getAuthoredText(){return this.#s??null}canonicalHWBA(){return[Math.round(360*this.h),Math.round(100*this.w),Math.round(100*this.b),this.alpha??1]}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(...this.#n)}isGamutClipped(){return!(vt(this.#n[1],1)&&vt(0,this.#n[1])&&vt(this.#n[2],1)&&vt(0,this.#n[2]))}static fromSpec(t,e){const r=mt(t[0]);if(null===r)return null;const s=yt(t[1]);if(null===s)return null;const n=yt(t[2]);if(null===n)return null;const i=gt(t[3]);return new Et(r,s,n,i,e)}}function kt(t){return Math.round(255*t)}class Ct{color;constructor(t){this.color=t}get alpha(){return this.color.alpha}equal(t){return this.color.equal(t)}setAlpha(t){return this.color.setAlpha(t)}format(){return 1!==(this.alpha??1)?"hexa":"hex"}as(t){return this.color.as(t)}is(t){return this.color.is(t)}asLegacyColor(){return this.color.asLegacyColor()}getAuthoredText(){return this.color.getAuthoredText()}getRawParameters(){return this.color.getRawParameters()}isGamutClipped(){return this.color.isGamutClipped()}asString(t){if(t)return this.as(t).asString();const[e,r,s]=this.color.rgba();return this.stringify(e,r,s)}getAsRawString(t){if(t)return this.as(t).getAsRawString();const[e,r,s]=this.getRawParameters();return this.stringify(e,r,s)}}class Lt extends Ct{setAlpha(t){return new Lt(this.color.setAlpha(t))}asString(t){return t&&t!==this.format()?super.as(t).asString():super.asString()}stringify(t,r,s){function n(t){return(Math.round(255*t)/17).toString(16)}return this.color.hasAlpha()?e.StringUtilities.sprintf("#%s%s%s%s",n(t),n(r),n(s),n(this.alpha??1)).toLowerCase():e.StringUtilities.sprintf("#%s%s%s",n(t),n(r),n(s)).toLowerCase()}}class _t extends Ct{nickname;constructor(t,e){super(e),this.nickname=t}static fromName(t,e){const r=t.toLowerCase(),s=Nt.get(r);return void 0!==s?new _t(r,Ot.fromRGBA(s,e)):null}stringify(){return this.nickname}getAsRawString(t){return this.color.getAsRawString(t)}}class Ot{#n;#h;#s;#c;static#i={hex:t=>new Ot(t.#h,"hex"),hexa:t=>new Ot(t.#h,"hexa"),rgb:t=>new Ot(t.#h,"rgb"),rgba:t=>new Ot(t.#h,"rgba"),hsl:t=>new At(...L([t.#h[0],t.#h[1],t.#h[2]]),t.alpha),hsla:t=>new At(...L([t.#h[0],t.#h[1],t.#h[2]]),t.alpha),hwb:t=>new Et(...O([t.#h[0],t.#h[1],t.#h[2]]),t.alpha),hwba:t=>new Et(...O([t.#h[0],t.#h[1],t.#h[2]]),t.alpha),lch:t=>new zt(...A.labToLch(...A.xyzd50ToLab(...t.#o())),t.alpha),oklch:t=>new It(...A.xyzd50ToOklch(...t.#o()),t.alpha),lab:t=>new Tt(...A.xyzd50ToLab(...t.#o()),t.alpha),oklab:t=>new Rt(...A.xyzd65ToOklab(...A.xyzd50ToD65(...t.#o())),t.alpha),srgb:t=>new Pt("srgb",...A.xyzd50ToSrgb(...t.#o()),t.alpha),"srgb-linear":t=>new Pt("srgb-linear",...A.xyzd50TosRGBLinear(...t.#o()),t.alpha),"display-p3":t=>new Pt("display-p3",...A.xyzd50ToDisplayP3(...t.#o()),t.alpha),"a98-rgb":t=>new Pt("a98-rgb",...A.xyzd50ToAdobeRGB(...t.#o()),t.alpha),"prophoto-rgb":t=>new Pt("prophoto-rgb",...A.xyzd50ToProPhoto(...t.#o()),t.alpha),rec2020:t=>new Pt("rec2020",...A.xyzd50ToRec2020(...t.#o()),t.alpha),xyz:t=>new Pt("xyz",...A.xyzd50ToD65(...t.#o()),t.alpha),"xyz-d50":t=>new Pt("xyz-d50",...t.#o(),t.alpha),"xyz-d65":t=>new Pt("xyz-d65",...A.xyzd50ToD65(...t.#o()),t.alpha)};#o(){const[t,e,r]=this.#h;return A.srgbToXyzd50(t,e,r)}get alpha(){switch(this.format()){case"hexa":case"rgba":return this.#h[3];default:return null}}asLegacyColor(){return this}nickname(){const t=Vt.get(String(this.canonicalRGBA()));return t?new _t(t,this):null}shortHex(){for(let t=0;t<4;++t){if(Math.round(255*this.#h[t])%17)return null}return new Lt(this)}constructor(t,e,r){this.#s=r||null,this.#c=e,this.#n=[t[0],t[1],t[2]],this.#h=[ht(t[0],{min:0,max:1}),ht(t[1],{min:0,max:1}),ht(t[2],{min:0,max:1}),ht(t[3]??1,{min:0,max:1})]}static fromHex(t,e){const r=4===(t=t.toLowerCase()).length||8===t.length?"hexa":"hex",s=t.length<=4;s&&(t=t.charAt(0)+t.charAt(0)+t.charAt(1)+t.charAt(1)+t.charAt(2)+t.charAt(2)+t.charAt(3)+t.charAt(3));const n=parseInt(t.substring(0,2),16),i=parseInt(t.substring(2,4),16),a=parseInt(t.substring(4,6),16);let o=1;8===t.length&&(o=parseInt(t.substring(6,8),16)/255);const l=new Ot([n/255,i/255,a/255,o],r,e);return s?new Lt(l):l}static fromRGBAFunction(t,r,s,n,i){const a=[pt(t),pt(r),pt(s),n?(o=n,dt(o)):1];var o;return e.ArrayUtilities.arrayDoesNotContainNullOrUndefined(a)?new Ot(a,n?"rgba":"rgb",i):null}static fromRGBA(t,e){return new Ot([t[0]/255,t[1]/255,t[2]/255,t[3]],"rgba",e)}static fromHSVA(t){const e=bt(t);return new Ot(e,"rgba")}is(t){return t===this.format()}as(t){return t===this.format()?this:Ot.#i[t](this)}format(){return this.#c}hasAlpha(){return 1!==this.#h[3]}detectHEXFormat(){return this.hasAlpha()?"hexa":"hex"}asString(t){return t?this.as(t).asString():this.#l(t,this.#h[0],this.#h[1],this.#h[2])}#l(t,r,s,n){function i(t){const e=Math.round(255*t).toString(16);return 1===e.length?"0"+e:e}switch(t||(t=this.#c),t){case"rgb":case"rgba":{const t=e.StringUtilities.sprintf("rgb(%d %d %d",kt(r),kt(s),kt(n));return this.hasAlpha()?t+e.StringUtilities.sprintf(" / %d%)",Math.round(100*this.#h[3])):t+")"}case"hex":case"hexa":return this.hasAlpha()?e.StringUtilities.sprintf("#%s%s%s%s",i(r),i(s),i(n),i(this.#h[3])).toLowerCase():e.StringUtilities.sprintf("#%s%s%s",i(r),i(s),i(n)).toLowerCase()}}getAuthoredText(){return this.#s??null}getRawParameters(){return[...this.#n]}getAsRawString(t){return t?this.as(t).getAsRawString():this.#l(t,...this.#n)}isGamutClipped(){return!xt(this.#n.map(kt),[this.#h[0],this.#h[1],this.#h[2]].map(kt),1)}rgba(){return[...this.#h]}canonicalRGBA(){const t=new Array(4);for(let e=0;e<3;++e)t[e]=Math.round(255*this.#h[e]);return t[3]=this.#h[3],t}toProtocolRGBA(){const t=this.canonicalRGBA(),e={r:t[0],g:t[1],b:t[2],a:void 0};return 1!==t[3]&&(e.a=t[3]),e}invert(){const t=[0,0,0,0];return t[0]=1-this.#h[0],t[1]=1-this.#h[1],t[2]=1-this.#h[2],t[3]=this.#h[3],new Ot(t,"rgba")}setAlpha(t){const e=[...this.#h];return e[3]=t,new Ot(e,"rgba")}blendWith(t){const e=k(t.#h,this.#h);return new Ot(e,"rgba")}blendWithAlpha(t){const e=[...this.#h];return e[3]*=t,new Ot(e,"rgba")}setFormat(t){this.#c=t}equal(t){const e=t.as(this.#c);return xt(kt(this.#h[0]),kt(e.#h[0]),1)&&xt(kt(this.#h[1]),kt(e.#h[1]),1)&&xt(kt(this.#h[2]),kt(e.#h[2]),1)&&xt(this.#h[3],e.#h[3])}}const Bt=[["aliceblue",[240,248,255]],["antiquewhite",[250,235,215]],["aqua",[0,255,255]],["aquamarine",[127,255,212]],["azure",[240,255,255]],["beige",[245,245,220]],["bisque",[255,228,196]],["black",[0,0,0]],["blanchedalmond",[255,235,205]],["blue",[0,0,255]],["blueviolet",[138,43,226]],["brown",[165,42,42]],["burlywood",[222,184,135]],["cadetblue",[95,158,160]],["chartreuse",[127,255,0]],["chocolate",[210,105,30]],["coral",[255,127,80]],["cornflowerblue",[100,149,237]],["cornsilk",[255,248,220]],["crimson",[237,20,61]],["cyan",[0,255,255]],["darkblue",[0,0,139]],["darkcyan",[0,139,139]],["darkgoldenrod",[184,134,11]],["darkgray",[169,169,169]],["darkgrey",[169,169,169]],["darkgreen",[0,100,0]],["darkkhaki",[189,183,107]],["darkmagenta",[139,0,139]],["darkolivegreen",[85,107,47]],["darkorange",[255,140,0]],["darkorchid",[153,50,204]],["darkred",[139,0,0]],["darksalmon",[233,150,122]],["darkseagreen",[143,188,143]],["darkslateblue",[72,61,139]],["darkslategray",[47,79,79]],["darkslategrey",[47,79,79]],["darkturquoise",[0,206,209]],["darkviolet",[148,0,211]],["deeppink",[255,20,147]],["deepskyblue",[0,191,255]],["dimgray",[105,105,105]],["dimgrey",[105,105,105]],["dodgerblue",[30,144,255]],["firebrick",[178,34,34]],["floralwhite",[255,250,240]],["forestgreen",[34,139,34]],["fuchsia",[255,0,255]],["gainsboro",[220,220,220]],["ghostwhite",[248,248,255]],["gold",[255,215,0]],["goldenrod",[218,165,32]],["gray",[128,128,128]],["grey",[128,128,128]],["green",[0,128,0]],["greenyellow",[173,255,47]],["honeydew",[240,255,240]],["hotpink",[255,105,180]],["indianred",[205,92,92]],["indigo",[75,0,130]],["ivory",[255,255,240]],["khaki",[240,230,140]],["lavender",[230,230,250]],["lavenderblush",[255,240,245]],["lawngreen",[124,252,0]],["lemonchiffon",[255,250,205]],["lightblue",[173,216,230]],["lightcoral",[240,128,128]],["lightcyan",[224,255,255]],["lightgoldenrodyellow",[250,250,210]],["lightgreen",[144,238,144]],["lightgray",[211,211,211]],["lightgrey",[211,211,211]],["lightpink",[255,182,193]],["lightsalmon",[255,160,122]],["lightseagreen",[32,178,170]],["lightskyblue",[135,206,250]],["lightslategray",[119,136,153]],["lightslategrey",[119,136,153]],["lightsteelblue",[176,196,222]],["lightyellow",[255,255,224]],["lime",[0,255,0]],["limegreen",[50,205,50]],["linen",[250,240,230]],["magenta",[255,0,255]],["maroon",[128,0,0]],["mediumaquamarine",[102,205,170]],["mediumblue",[0,0,205]],["mediumorchid",[186,85,211]],["mediumpurple",[147,112,219]],["mediumseagreen",[60,179,113]],["mediumslateblue",[123,104,238]],["mediumspringgreen",[0,250,154]],["mediumturquoise",[72,209,204]],["mediumvioletred",[199,21,133]],["midnightblue",[25,25,112]],["mintcream",[245,255,250]],["mistyrose",[255,228,225]],["moccasin",[255,228,181]],["navajowhite",[255,222,173]],["navy",[0,0,128]],["oldlace",[253,245,230]],["olive",[128,128,0]],["olivedrab",[107,142,35]],["orange",[255,165,0]],["orangered",[255,69,0]],["orchid",[218,112,214]],["palegoldenrod",[238,232,170]],["palegreen",[152,251,152]],["paleturquoise",[175,238,238]],["palevioletred",[219,112,147]],["papayawhip",[255,239,213]],["peachpuff",[255,218,185]],["peru",[205,133,63]],["pink",[255,192,203]],["plum",[221,160,221]],["powderblue",[176,224,230]],["purple",[128,0,128]],["rebeccapurple",[102,51,153]],["red",[255,0,0]],["rosybrown",[188,143,143]],["royalblue",[65,105,225]],["saddlebrown",[139,69,19]],["salmon",[250,128,114]],["sandybrown",[244,164,96]],["seagreen",[46,139,87]],["seashell",[255,245,238]],["sienna",[160,82,45]],["silver",[192,192,192]],["skyblue",[135,206,235]],["slateblue",[106,90,205]],["slategray",[112,128,144]],["slategrey",[112,128,144]],["snow",[255,250,250]],["springgreen",[0,255,127]],["steelblue",[70,130,180]],["tan",[210,180,140]],["teal",[0,128,128]],["thistle",[216,191,216]],["tomato",[255,99,71]],["turquoise",[64,224,208]],["violet",[238,130,238]],["wheat",[245,222,179]],["white",[255,255,255]],["whitesmoke",[245,245,245]],["yellow",[255,255,0]],["yellowgreen",[154,205,50]],["transparent",[0,0,0,0]]];console.assert(Bt.every((([t])=>t.toLowerCase()===t)),"All color nicknames must be lowercase.");const Nt=new Map(Bt),Vt=new Map(Bt.map((([t,[e,r,s,n=1]])=>[String([e,r,s,n]),t]))),Gt=[127,32,210],Mt={Content:Ot.fromRGBA([111,168,220,.66]),ContentLight:Ot.fromRGBA([111,168,220,.5]),ContentOutline:Ot.fromRGBA([9,83,148]),Padding:Ot.fromRGBA([147,196,125,.55]),PaddingLight:Ot.fromRGBA([147,196,125,.4]),Border:Ot.fromRGBA([255,229,153,.66]),BorderLight:Ot.fromRGBA([255,229,153,.5]),Margin:Ot.fromRGBA([246,178,107,.66]),MarginLight:Ot.fromRGBA([246,178,107,.5]),EventTarget:Ot.fromRGBA([255,196,196,.66]),Shape:Ot.fromRGBA([96,82,177,.8]),ShapeMargin:Ot.fromRGBA([96,82,127,.6]),CssGrid:Ot.fromRGBA([75,0,130,1]),LayoutLine:Ot.fromRGBA([...Gt,1]),GridBorder:Ot.fromRGBA([...Gt,1]),GapBackground:Ot.fromRGBA([...Gt,.3]),GapHatch:Ot.fromRGBA([...Gt,.8]),GridAreaBorder:Ot.fromRGBA([26,115,232,1])},Wt={ParentOutline:Ot.fromRGBA([224,90,183,1]),ChildOutline:Ot.fromRGBA([0,120,212,1])},Xt={Resizer:Ot.fromRGBA([222,225,230,1]),ResizerHandle:Ot.fromRGBA([166,166,166,1]),Mask:Ot.fromRGBA([248,249,249,1])};var Ft=Object.freeze({__proto__:null,getFormat:function(t){switch(t){case"hex":return"hex";case"hexa":return"hexa";case"rgb":return"rgb";case"rgba":return"rgba";case"hsl":return"hsl";case"hsla":return"hsla";case"hwb":return"hwb";case"hwba":return"hwba";case"lch":return"lch";case"oklch":return"oklch";case"lab":return"lab";case"oklab":return"oklab"}return ot(t)},parse:function(t){if(!t.match(/\s/)){const e=t.toLowerCase().match(/^(?:#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})|(\w+))$/i);if(e)return e[1]?Ot.fromHex(e[1],t):e[2]?_t.fromName(e[2],t):null}const e=t.toLowerCase().match(/^\s*(?:(rgba?)|(hsla?)|(hwba?)|(lch)|(oklch)|(lab)|(oklab)|(color))\((.*)\)\s*$/);if(e){const r=Boolean(e[1]),s=Boolean(e[2]),n=Boolean(e[3]),i=Boolean(e[4]),a=Boolean(e[5]),o=Boolean(e[6]),l=Boolean(e[7]),h=Boolean(e[8]),c=e[9];if(h)return Pt.fromSpec(t,c);const u=function(t,{allowCommas:e,convertNoneToZero:r}){const s=t.trim();let n=[];e&&(n=s.split(/\s*,\s*/));if(!e||1===n.length)if(n=s.split(/\s+/),"/"===n[3]){if(n.splice(3,1),4!==n.length)return null}else if(n.length>2&&-1!==n[2].indexOf("/")||n.length>3&&-1!==n[3].indexOf("/")){const t=n.slice(2,4).join("");n=n.slice(0,2).concat(t.split(/\//)).concat(n.slice(4))}else if(n.length>=4)return null;if(3!==n.length&&4!==n.length||n.indexOf("")>-1)return null;if(r)return n.map((t=>"none"===t?"0":t));return n}(c,{allowCommas:r||s,convertNoneToZero:!(r||s||n)});if(!u)return null;const g=[u[0],u[1],u[2],u[3]];if(r)return Ot.fromRGBAFunction(u[0],u[1],u[2],u[3],t);if(s)return At.fromSpec(g,t);if(n)return Et.fromSpec(g,t);if(i)return zt.fromSpec(g,t);if(a)return It.fromSpec(g,t);if(o)return Tt.fromSpec(g,t);if(l)return Rt.fromSpec(g,t)}return null},parseHueNumeric:mt,hsl2rgb:ft,hsva2rgba:bt,rgb2hsv:function(t){const e=L(t),r=e[0];let s=e[1];const n=e[2];return s*=n<.5?n:1-n,[r,0!==s?2*s/(n+s):0,n+s]},desiredLuminance:wt,approachColorValue:St,findFgColorForContrast:function(t,e,r){const s=t.as("hsl").hsva(),n=e.rgba(),i=t=>N(k(Ot.fromHSVA(t).rgba(),n)),a=N(e.rgba()),o=wt(a,r,i(s)>a);return St(s,0,2,o,i)?Ot.fromHSVA(s):(s[2]=1,St(s,0,1,o,i)?Ot.fromHSVA(s):null)},findFgColorForContrastAPCA:function(t,e,r){const s=t.as("hsl").hsva(),n=(e.rgba(),t=>Z(Ot.fromHSVA(t).rgba())),i=Z(e.rgba()),a=Q(i,r,n(s)>=i);if(St(s,0,2,a,n)){const t=Ot.fromHSVA(s);if(Math.abs(Y(e.rgba(),t.rgba()))>=r)return t}if(s[2]=1,St(s,0,1,a,n)){const t=Ot.fromHSVA(s);if(Math.abs(Y(e.rgba(),t.rgba()))>=r)return t}return null},Lab:Tt,LCH:zt,Oklab:Rt,Oklch:It,ColorFunction:Pt,HSL:At,HWB:Et,ShortHex:Lt,Nickname:_t,Legacy:Ot,Regex:/((?:rgba?|hsla?|hwba?|lab|lch|oklab|oklch|color)\([^)]+\)|#[0-9a-fA-F]{8}|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3,4}|\b[a-zA-Z]+\b(?!-))/g,ColorMixRegex:/color-mix\(.*,\s*(?.+)\s*,\s*(?.+)\s*\)/g,Nicknames:Nt,PageHighlight:Mt,SourceOrderHighlight:Wt,IsolationModeHighlight:Xt,Generator:class{#u;#g;#d;#p;#m;constructor(t,e,r,s){this.#u=t||{min:0,max:360,count:void 0},this.#g=e||67,this.#d=r||80,this.#p=s||1,this.#m=new Map}setColorForID(t,e){this.#m.set(t,e)}colorForID(t){let e=this.#m.get(t);return e||(e=this.generateColorForID(t),this.#m.set(t,e)),e}generateColorForID(t){const r=e.StringUtilities.hashCode(t),s=this.indexToValueInSpace(r,this.#u),n=this.indexToValueInSpace(r>>8,this.#g),i=this.indexToValueInSpace(r>>16,this.#d),a=this.indexToValueInSpace(r>>24,this.#p),o=`hsl(${s}deg ${n}% ${i}%`;return 1!==a?`${o} / ${Math.floor(100*a)}%)`:`${o})`}indexToValueInSpace(t,e){if("number"==typeof e)return e;const r=e.count||e.max-e.min;return t%=r,e.min+Math.floor(t/(r-1)*(e.max-e.min))}}});class Dt{listeners;addEventListener(t,e,r){this.listeners||(this.listeners=new Map);let s=this.listeners.get(t);return s||(s=new Set,this.listeners.set(t,s)),s.add({thisObject:r,listener:e}),{eventTarget:this,eventType:t,thisObject:r,listener:e}}once(t){return new Promise((e=>{const r=this.addEventListener(t,(s=>{this.removeEventListener(t,r.listener),e(s.data)}))}))}removeEventListener(t,e,r){const s=this.listeners?.get(t);if(s){for(const t of s)t.listener===e&&t.thisObject===r&&(t.disposed=!0,s.delete(t));s.size||this.listeners?.delete(t)}}hasEventListeners(t){return Boolean(this.listeners&&this.listeners.has(t))}dispatchEventToListeners(t,...[e]){const r=this.listeners?.get(t);if(!r)return;const s={data:e,source:this};for(const t of[...r])t.disposed||t.listener.call(t.thisObject,s)}}var Ut=Object.freeze({__proto__:null,ObjectWrapper:Dt,eventMixin:function(t){return class extends t{#y=new Dt;addEventListener(t,e,r){return this.#y.addEventListener(t,e,r)}once(t){return this.#y.once(t)}removeEventListener(t,e,r){this.#y.removeEventListener(t,e,r)}hasEventListeners(t){return this.#y.hasEventListeners(t)}dispatchEventToListeners(t,...e){this.#y.dispatchEventToListeners(t,...e)}}}});const jt={elementsPanel:"Elements panel",stylesSidebar:"styles sidebar",changesDrawer:"Changes drawer",issuesView:"Issues view",networkPanel:"Network panel",applicationPanel:"Application panel",sourcesPanel:"Sources panel",memoryInspectorPanel:"Memory inspector panel",developerResourcesPanel:"Developer Resources panel"},$t=r.i18n.registerUIStrings("core/common/Revealer.ts",jt),Ht=r.i18n.getLazilyComputedLocalizedString.bind(void 0,$t);let qt;class Zt{registeredRevealers=[];static instance(){return void 0===qt&&(qt=new Zt),qt}static removeInstance(){qt=void 0}register(t){this.registeredRevealers.push(t)}async reveal(t,e){const r=await Promise.all(this.getApplicableRegisteredRevealers(t).map((t=>t.loadRevealer())));if(r.length<1)throw new Error(`No revealers found for ${t}`);if(r.length>1)throw new Error(`Conflicting reveals found for ${t}`);return await r[0].reveal(t,e)}getApplicableRegisteredRevealers(t){return this.registeredRevealers.filter((e=>{for(const r of e.contextTypes())if(t instanceof r)return!0;return!1}))}}async function Yt(t,e=!1){await Zt.instance().reveal(t,e)}const Kt={DEVELOPER_RESOURCES_PANEL:Ht(jt.developerResourcesPanel),ELEMENTS_PANEL:Ht(jt.elementsPanel),STYLES_SIDEBAR:Ht(jt.stylesSidebar),CHANGES_DRAWER:Ht(jt.changesDrawer),ISSUES_VIEW:Ht(jt.issuesView),NETWORK_PANEL:Ht(jt.networkPanel),APPLICATION_PANEL:Ht(jt.applicationPanel),SOURCES_PANEL:Ht(jt.sourcesPanel),MEMORY_INSPECTOR_PANEL:Ht(jt.memoryInspectorPanel)};var Jt=Object.freeze({__proto__:null,RevealerRegistry:Zt,revealDestination:function(t){const e=Zt.instance().getApplicableRegisteredRevealers(t);for(const{destination:t}of e)if(t)return t();return null},registerRevealer:function(t){Zt.instance().register(t)},reveal:Yt,RevealerDestination:Kt});let Qt;class te extends Dt{#f;constructor(){super(),this.#f=[]}static instance(t){return Qt&&!t?.forceNew||(Qt=new te),Qt}static removeInstance(){Qt=void 0}addMessage(t,e,r,s){const n=new re(t,e||"info",Date.now(),r||!1,s);this.#f.push(n),this.dispatchEventToListeners("messageAdded",n)}log(t){this.addMessage(t,"info")}warn(t,e){this.addMessage(t,"warning",void 0,e)}error(t){this.addMessage(t,"error",!0)}messages(){return this.#f}show(){this.showPromise()}showPromise(){return Yt(this)}}var ee;!function(t){t.CSS="css",t.ConsoleAPI="console-api",t.IssuePanel="issue-panel",t.SelfXss="self-xss"}(ee||(ee={}));class re{text;level;timestamp;show;source;constructor(t,e,r,s,n){this.text=t,this.level=e,this.timestamp="number"==typeof r?r:Date.now(),this.show=s,n&&(this.source=n)}}var se=Object.freeze({__proto__:null,Console:te,get FrontendMessageSource(){return ee},Message:re});var ne=Object.freeze({__proto__:null,debounce:function(t,e){let r=0;return()=>{clearTimeout(r),r=window.setTimeout((()=>t()),e)}}});var ie=Object.freeze({__proto__:null,removeEventListeners:function(t){for(const e of t)e.eventTarget.removeEventListener(e.eventType,e.listener,e.thisObject);t.splice(0)},fireEvent:function(t,e={},r=window){const s=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:e});r.dispatchEvent(s)}}),ae=Object.freeze({__proto__:null});const oe=Symbol("uninitialized"),le=Symbol("error");var he=Object.freeze({__proto__:null,lazy:function(t){let e=oe,r=null;return()=>{if(e===le)throw r;if(e!==oe)return e;try{return e=t(),e}catch(t){throw r=t,e=le,r}}}});const ce=[];function ue(t){return ce.filter((function(e){if(!e.contextTypes)return!0;for(const r of e.contextTypes())if(t instanceof r)return!0;return!1}))}var ge=Object.freeze({__proto__:null,Linkifier:class{static async linkify(t,e){if(!t)throw new Error("Can't linkify "+t);const r=ue(t)[0];if(!r)throw new Error("No linkifiers registered for object "+t);return(await r.loadLinkifier()).linkify(t,e)}},registerLinkifier:function(t){ce.push(t)},getApplicableRegisteredlinkifiers:ue});var de=Object.freeze({__proto__:null,Mutex:class{#b=!1;#w=[];acquire(){const t={resolved:!1};return this.#b?new Promise((e=>{this.#w.push((()=>e(this.#S.bind(this,t))))})):(this.#b=!0,Promise.resolve(this.#S.bind(this,t)))}#S(t){if(t.resolved)throw new Error("Cannot release more than once.");t.resolved=!0;const e=this.#w.shift();e?e():this.#b=!1}async run(t){const e=await this.acquire();try{return await t()}finally{e()}}}});function pe(t){if(-1===t.indexOf("..")&&-1===t.indexOf("."))return t;const e=("/"===t[0]?t.substring(1):t).split("/"),r=[];for(const t of e)"."!==t&&(".."===t?r.pop():r.push(t));let s=r.join("/");return"/"===t[0]&&s&&(s="/"+s),"/"===s[s.length-1]||"/"!==t[t.length-1]&&"."!==e[e.length-1]&&".."!==e[e.length-1]||(s+="/"),s}class me{isValid;url;scheme;user;host;port;path;queryParams;fragment;folderPathComponents;lastPathComponent;blobInnerScheme;#x;#v;constructor(t){this.isValid=!1,this.url=t,this.scheme="",this.user="",this.host="",this.port="",this.path="",this.queryParams="",this.fragment="",this.folderPathComponents="",this.lastPathComponent="";const e=this.url.startsWith("blob:"),r=(e?t.substring(5):t).match(me.urlRegex());if(r)this.isValid=!0,e?(this.blobInnerScheme=r[2].toLowerCase(),this.scheme="blob"):this.scheme=r[2].toLowerCase(),this.user=r[3]??"",this.host=r[4]??"",this.port=r[5]??"",this.path=r[6]??"/",this.queryParams=r[7]??"",this.fragment=r[8]??"";else{if(this.url.startsWith("data:"))return void(this.scheme="data");if(this.url.startsWith("blob:"))return void(this.scheme="blob");if("about:blank"===this.url)return void(this.scheme="about");this.path=this.url}const s=this.path.lastIndexOf("/",this.path.length-2);this.lastPathComponent=-1!==s?this.path.substring(s+1):this.path;const n=this.path.lastIndexOf("/");-1!==n&&(this.folderPathComponents=this.path.substring(0,n))}static fromString(t){const e=new me(t.toString());return e.isValid?e:null}static preEncodeSpecialCharactersInPath(t){for(const e of["%",";","#","?"," "])t=t.replaceAll(e,encodeURIComponent(e));return t}static rawPathToEncodedPathString(t){const e=me.preEncodeSpecialCharactersInPath(t);return t.startsWith("/")?new URL(e,"file:///").pathname:new URL("/"+e,"file:///").pathname.substr(1)}static encodedFromParentPathAndName(t,e){return me.concatenate(t,"/",me.preEncodeSpecialCharactersInPath(e))}static urlFromParentUrlAndName(t,e){return me.concatenate(t,"/",me.preEncodeSpecialCharactersInPath(e))}static encodedPathToRawPathString(t){return decodeURIComponent(t)}static rawPathToUrlString(t){let e=me.preEncodeSpecialCharactersInPath(t.replace(/\\/g,"/"));return e=e.replace(/\\/g,"/"),e.startsWith("file://")||(e=e.startsWith("/")?"file://"+e:"file:///"+e),new URL(e).toString()}static relativePathToUrlString(t,e){const r=me.preEncodeSpecialCharactersInPath(t.replace(/\\/g,"/"));return new URL(r,e).toString()}static urlToRawPathString(t,e){console.assert(t.startsWith("file://"),"This must be a file URL.");const r=decodeURIComponent(t);return e?r.substr(8).replace(/\//g,"\\"):r.substr(7)}static sliceUrlToEncodedPathString(t,e){return t.substring(e)}static substr(t,e,r){return t.substr(e,r)}static substring(t,e,r){return t.substring(e,r)}static prepend(t,e){return t+e}static concatenate(t,...e){return t.concat(...e)}static trim(t){return t.trim()}static slice(t,e,r){return t.slice(e,r)}static join(t,e){return t.join(e)}static split(t,e,r){return t.split(e,r)}static toLowerCase(t){return t.toLowerCase()}static isValidUrlString(t){return new me(t).isValid}static urlWithoutHash(t){const e=t.indexOf("#");return-1!==e?t.substr(0,e):t}static urlRegex(){if(me.urlRegexInstance)return me.urlRegexInstance;return me.urlRegexInstance=new RegExp("^("+/([A-Za-z][A-Za-z0-9+.-]*):\/\//.source+/(?:([A-Za-z0-9\-._~%!$&'()*+,;=:]*)@)?/.source+/((?:\[::\d?\])|(?:[^\s\/:]*))/.source+/(?::([\d]+))?/.source+")"+/(\/[^#?]*)?/.source+/(?:\?([^#]*))?/.source+/(?:#(.*))?/.source+"$"),me.urlRegexInstance}static extractPath(t){const e=this.fromString(t);return e?e.path:""}static extractOrigin(t){const r=this.fromString(t);return r?r.securityOrigin():e.DevToolsPath.EmptyUrlString}static extractExtension(t){const e=(t=me.urlWithoutHash(t)).indexOf("?");-1!==e&&(t=t.substr(0,e));const r=t.lastIndexOf("/");-1!==r&&(t=t.substr(r+1));const s=t.lastIndexOf(".");if(-1!==s){const e=(t=t.substr(s+1)).indexOf("%");return-1!==e?t.substr(0,e):t}return""}static extractName(t){let e=t.lastIndexOf("/");const r=-1!==e?t.substr(e+1):t;return e=r.indexOf("?"),e<0?r:r.substr(0,e)}static completeURL(t,e){const r=e.trim();if(r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("javascript:")||r.startsWith("mailto:"))return e;const s=this.fromString(r);if(s&&s.scheme){return s.securityOrigin()+pe(s.path)+(s.queryParams&&`?${s.queryParams}`)+(s.fragment&&`#${s.fragment}`)}const n=this.fromString(t);if(!n)return null;if(n.isDataURL())return e;if(e.length>1&&"/"===e.charAt(0)&&"/"===e.charAt(1))return n.scheme+":"+e;const i=n.securityOrigin(),a=n.path,o=n.queryParams?"?"+n.queryParams:"";if(!e.length)return i+a+o;if("#"===e.charAt(0))return i+a+o+e;if("?"===e.charAt(0))return i+a+e;const l=e.match(/^[^#?]*/);if(!l||!e.length)throw new Error("Invalid href");let h=l[0];const c=e.substring(h.length);return"/"!==h.charAt(0)&&(h=n.folderPathComponents+"/"+h),i+pe(h)+c}static splitLineAndColumn(t){const e=t.match(me.urlRegex());let r="",s=t;e&&(r=e[1],s=t.substring(e[1].length));const n=/(?::(\d+))?(?::(\d+))?$/.exec(s);let i,a;if(console.assert(Boolean(n)),!n)return{url:t,lineNumber:0,columnNumber:0};"string"==typeof n[1]&&(i=parseInt(n[1],10),i=isNaN(i)?void 0:i-1),"string"==typeof n[2]&&(a=parseInt(n[2],10),a=isNaN(a)?void 0:a-1);let o=r+s.substring(0,s.length-n[0].length);if(void 0===n[1]&&void 0===n[2]){const t=/wasm-function\[\d+\]:0x([a-z0-9]+)$/g.exec(s);t&&"string"==typeof t[1]&&(o=me.removeWasmFunctionInfoFromURL(o),a=parseInt(t[1],16),a=isNaN(a)?void 0:a)}return{url:o,lineNumber:i,columnNumber:a}}static removeWasmFunctionInfoFromURL(t){const e=t.search(/:wasm-function\[\d+\]/);return-1===e?t:me.substring(t,0,e)}static beginsWithWindowsDriveLetter(t){return/^[A-Za-z]:/.test(t)}static beginsWithScheme(t){return/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}static isRelativeURL(t){return!this.beginsWithScheme(t)||this.beginsWithWindowsDriveLetter(t)}get displayName(){return this.#x?this.#x:this.isDataURL()?this.dataURLDisplayName():this.isBlobURL()||this.isAboutBlank()?this.url:(this.#x=this.lastPathComponent,this.#x||(this.#x=(this.host||"")+"/"),"/"===this.#x&&(this.#x=this.url),this.#x)}dataURLDisplayName(){return this.#v?this.#v:this.isDataURL()?(this.#v=e.StringUtilities.trimEndWithMaxLength(this.url,20),this.#v):""}isAboutBlank(){return"about:blank"===this.url}isDataURL(){return"data"===this.scheme}isHttpOrHttps(){return"http"===this.scheme||"https"===this.scheme}isBlobURL(){return this.url.startsWith("blob:")}lastPathComponentWithFragment(){return this.lastPathComponent+(this.fragment?"#"+this.fragment:"")}domain(){return this.isDataURL()?"data:":this.host+(this.port?":"+this.port:"")}securityOrigin(){if(this.isDataURL())return"data:";return(this.isBlobURL()?this.blobInnerScheme:this.scheme)+"://"+this.domain()}urlWithoutScheme(){return this.scheme&&this.url.startsWith(this.scheme+"://")?this.url.substring(this.scheme.length+3):this.url}static urlRegexInstance=null}var ye=Object.freeze({__proto__:null,normalizePath:pe,schemeIs:function(t,e){try{return new URL(t).protocol===e}catch(t){return!1}},ParsedURL:me});class fe{#T;#z;#R;#I;constructor(t,e){this.#T=t,this.#z=e||1,this.#R=0,this.#I=0}isCanceled(){return this.#T.parent.isCanceled()}setTitle(t){this.#T.parent.setTitle(t)}done(){this.setWorked(this.#I),this.#T.childDone()}setTotalWork(t){this.#I=t,this.#T.update()}setWorked(t,e){this.#R=t,void 0!==e&&this.setTitle(e),this.#T.update()}incrementWorked(t){this.setWorked(this.#R+(t||1))}getWeight(){return this.#z}getWorked(){return this.#R}getTotalWork(){return this.#I}}var be=Object.freeze({__proto__:null,Progress:class{setTotalWork(t){}setTitle(t){}setWorked(t,e){}incrementWorked(t){}done(){}isCanceled(){return!1}},CompositeProgress:class{parent;#P;#A;constructor(t){this.parent=t,this.#P=[],this.#A=0,this.parent.setTotalWork(1),this.parent.setWorked(0)}childDone(){++this.#A===this.#P.length&&this.parent.done()}createSubProgress(t){const e=new fe(this,t);return this.#P.push(e),e}update(){let t=0,e=0;for(let r=0;r{};return this.getOrCreatePromise(t).catch(r).then((t=>{t&&e(t)})),null}return r}clear(){this.stopListening();for(const[t,{reject:e}]of this.#C.entries())e(new Error(`Object with ${t} never resolved.`));this.#C.clear()}getOrCreatePromise(t){const e=this.#C.get(t);if(e)return e.promise;let r=()=>{},s=()=>{};const n=new Promise(((t,e)=>{r=t,s=e}));return this.#C.set(t,{promise:n,resolve:r,reject:s}),this.startListening(),n}onResolve(t,e){const r=this.#C.get(t);this.#C.delete(t),0===this.#C.size&&this.stopListening(),r?.resolve(e)}}});const xe={fetchAndXHR:"`Fetch` and `XHR`",javascript:"JavaScript",js:"JS",css:"CSS",img:"Img",media:"Media",font:"Font",doc:"Doc",ws:"WS",webassembly:"WebAssembly",wasm:"Wasm",manifest:"Manifest",other:"Other",document:"Document",stylesheet:"Stylesheet",image:"Image",script:"Script",texttrack:"TextTrack",fetch:"Fetch",eventsource:"EventSource",websocket:"WebSocket",webtransport:"WebTransport",signedexchange:"SignedExchange",ping:"Ping",cspviolationreport:"CSPViolationReport",preflight:"Preflight",webbundle:"WebBundle"},ve=r.i18n.registerUIStrings("core/common/ResourceType.ts",xe),Te=r.i18n.getLazilyComputedLocalizedString.bind(void 0,ve);class ze{#L;#_;#O;#B;constructor(t,e,r,s){this.#L=t,this.#_=e,this.#O=r,this.#B=s}static fromMimeType(t){return t?t.startsWith("text/html")?Pe.Document:t.startsWith("text/css")?Pe.Stylesheet:t.startsWith("image/")?Pe.Image:t.startsWith("text/")?Pe.Script:t.includes("font")?Pe.Font:t.includes("script")?Pe.Script:t.includes("octet")?Pe.Other:t.includes("application")?Pe.Script:Pe.Other:Pe.Other}static fromMimeTypeOverride(t){return"application/manifest+json"===t?Pe.Manifest:"application/wasm"===t?Pe.Wasm:"application/webbundle"===t?Pe.WebBundle:null}static fromURL(t){return Ee.get(me.extractExtension(t))||null}static fromName(t){for(const e in Pe){const r=Pe[e];if(r.name()===t)return r}return null}static mimeFromURL(t){const e=me.extractName(t);if(Ae.has(e))return Ae.get(e);let r=me.extractExtension(t).toLowerCase();return"html"===r&&e.endsWith(".component.html")&&(r="component.html"),ke.get(r)}static mimeFromExtension(t){return ke.get(t)}static simplifyContentType(t){return new RegExp("^application(.*json$|/json+.*)").test(t)?"application/json":t}static mediaTypeForMetrics(t,e,r){return"text/javascript"!==t?t:e?"text/javascript+sourcemapped":r?"text/javascript+minified":"text/javascript+plain"}name(){return this.#L}title(){return this.#_()}category(){return this.#O}isTextType(){return this.#B}isScript(){return"script"===this.#L||"sm-script"===this.#L}hasScripts(){return this.isScript()||this.isDocument()}isStyleSheet(){return"stylesheet"===this.#L||"sm-stylesheet"===this.#L}hasStyleSheets(){return this.isStyleSheet()||this.isDocument()}isDocument(){return"document"===this.#L}isDocumentOrScriptOrStyleSheet(){return this.isDocument()||this.isScript()||this.isStyleSheet()}isFont(){return"font"===this.#L}isImage(){return"image"===this.#L}isFromSourceMap(){return this.#L.startsWith("sm-")}isWebbundle(){return"webbundle"===this.#L}toString(){return this.#L}canonicalMimeType(){return this.isDocument()?"text/html":this.isScript()?"text/javascript":this.isStyleSheet()?"text/css":""}}class Re{title;shortTitle;constructor(t,e){this.title=t,this.shortTitle=e}static categoryByTitle(t){return Object.values(Ie).find((e=>e.title()===t))||null}}const Ie={XHR:new Re(Te(xe.fetchAndXHR),r.i18n.lockedLazyString("Fetch/XHR")),Document:new Re(Te(xe.document),Te(xe.doc)),Stylesheet:new Re(Te(xe.css),Te(xe.css)),Script:new Re(Te(xe.javascript),Te(xe.js)),Font:new Re(Te(xe.font),Te(xe.font)),Image:new Re(Te(xe.image),Te(xe.img)),Media:new Re(Te(xe.media),Te(xe.media)),Manifest:new Re(Te(xe.manifest),Te(xe.manifest)),WebSocket:new Re(Te(xe.websocket),Te(xe.ws)),Wasm:new Re(Te(xe.webassembly),Te(xe.wasm)),Other:new Re(Te(xe.other),Te(xe.other))},Pe={Document:new ze("document",Te(xe.document),Ie.Document,!0),Stylesheet:new ze("stylesheet",Te(xe.stylesheet),Ie.Stylesheet,!0),Image:new ze("image",Te(xe.image),Ie.Image,!1),Media:new ze("media",Te(xe.media),Ie.Media,!1),Font:new ze("font",Te(xe.font),Ie.Font,!1),Script:new ze("script",Te(xe.script),Ie.Script,!0),TextTrack:new ze("texttrack",Te(xe.texttrack),Ie.Other,!0),XHR:new ze("xhr",r.i18n.lockedLazyString("XHR"),Ie.XHR,!0),Fetch:new ze("fetch",Te(xe.fetch),Ie.XHR,!0),Prefetch:new ze("prefetch",r.i18n.lockedLazyString("Prefetch"),Ie.Document,!0),EventSource:new ze("eventsource",Te(xe.eventsource),Ie.XHR,!0),WebSocket:new ze("websocket",Te(xe.websocket),Ie.WebSocket,!1),WebTransport:new ze("webtransport",Te(xe.webtransport),Ie.WebSocket,!1),Wasm:new ze("wasm",Te(xe.wasm),Ie.Wasm,!1),Manifest:new ze("manifest",Te(xe.manifest),Ie.Manifest,!0),SignedExchange:new ze("signed-exchange",Te(xe.signedexchange),Ie.Other,!1),Ping:new ze("ping",Te(xe.ping),Ie.Other,!1),CSPViolationReport:new ze("csp-violation-report",Te(xe.cspviolationreport),Ie.Other,!1),Other:new ze("other",Te(xe.other),Ie.Other,!1),Preflight:new ze("preflight",Te(xe.preflight),Ie.Other,!0),SourceMapScript:new ze("sm-script",Te(xe.script),Ie.Script,!0),SourceMapStyleSheet:new ze("sm-stylesheet",Te(xe.stylesheet),Ie.Stylesheet,!0),WebBundle:new ze("webbundle",Te(xe.webbundle),Ie.Other,!1)},Ae=new Map([["Cakefile","text/x-coffeescript"]]),Ee=new Map([["js",Pe.Script],["mjs",Pe.Script],["css",Pe.Stylesheet],["xsl",Pe.Stylesheet],["avif",Pe.Image],["bmp",Pe.Image],["gif",Pe.Image],["ico",Pe.Image],["jpeg",Pe.Image],["jpg",Pe.Image],["jxl",Pe.Image],["png",Pe.Image],["svg",Pe.Image],["tif",Pe.Image],["tiff",Pe.Image],["vue",Pe.Document],["webmanifest",Pe.Manifest],["webp",Pe.Media],["otf",Pe.Font],["ttc",Pe.Font],["ttf",Pe.Font],["woff",Pe.Font],["woff2",Pe.Font],["wasm",Pe.Wasm]]),ke=new Map([["js","text/javascript"],["mjs","text/javascript"],["css","text/css"],["html","text/html"],["htm","text/html"],["xml","application/xml"],["xsl","application/xml"],["wasm","application/wasm"],["webmanifest","application/manifest+json"],["asp","application/x-aspx"],["aspx","application/x-aspx"],["jsp","application/x-jsp"],["c","text/x-c++src"],["cc","text/x-c++src"],["cpp","text/x-c++src"],["h","text/x-c++src"],["m","text/x-c++src"],["mm","text/x-c++src"],["coffee","text/x-coffeescript"],["dart","application/vnd.dart"],["ts","text/typescript"],["tsx","text/typescript-jsx"],["json","application/json"],["gyp","application/json"],["gypi","application/json"],["map","application/json"],["cs","text/x-csharp"],["go","text/x-go"],["java","text/x-java"],["kt","text/x-kotlin"],["scala","text/x-scala"],["less","text/x-less"],["php","application/x-httpd-php"],["phtml","application/x-httpd-php"],["py","text/x-python"],["sh","text/x-sh"],["gss","text/x-gss"],["sass","text/x-sass"],["scss","text/x-scss"],["vtt","text/vtt"],["ls","text/x-livescript"],["md","text/markdown"],["cljs","text/x-clojure"],["cljc","text/x-clojure"],["cljx","text/x-clojure"],["styl","text/x-styl"],["jsx","text/jsx"],["avif","image/avif"],["bmp","image/bmp"],["gif","image/gif"],["ico","image/ico"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["jxl","image/jxl"],["png","image/png"],["svg","image/svg+xml"],["tif","image/tif"],["tiff","image/tiff"],["webp","image/webp"],["otf","font/otf"],["ttc","font/collection"],["ttf","font/ttf"],["woff","font/woff"],["woff2","font/woff2"],["component.html","text/x.angular"],["svelte","text/x.svelte"],["vue","text/x.vue"]]);var Ce=Object.freeze({__proto__:null,ResourceType:ze,ResourceCategory:Re,resourceCategories:Ie,resourceTypes:Pe,resourceTypeByExtension:Ee,mimeTypeByExtension:ke});const Le=new Map;const _e=[];var Oe=Object.freeze({__proto__:null,registerLateInitializationRunnable:function(t){const{id:e,loadRunnable:r}=t;if(Le.has(e))throw new Error(`Duplicate late Initializable runnable id '${e}'`);Le.set(e,r)},maybeRemoveLateInitializationRunnable:function(t){return Le.delete(t)},lateInitializationRunnables:function(){return[...Le.values()]},registerEarlyInitializationRunnable:function(t){_e.push(t)},earlyInitializationRunnables:function(){return _e}});class Be{begin;end;data;constructor(t,e,r){if(t>e)throw new Error("Invalid segment");this.begin=t,this.end=e,this.data=r}intersects(t){return this.begint.begin-e.begin)),s=r,n=null;if(r>0){const e=this.#N[r-1];n=this.tryMerge(e,t),n?(--r,t=n):this.#N[r-1].end>=t.begin&&(t.endthis.append(t)))}segments(){return this.#N}tryMerge(t,e){const r=this.#V&&this.#V(t,e);return r?(r.begin=t.begin,r.end=Math.max(t.end,e.end),r):null}}});const Ve={elements:"Elements",appearance:"Appearance",sources:"Sources",network:"Network",performance:"Performance",console:"Console",persistence:"Persistence",debugger:"Debugger",global:"Global",rendering:"Rendering",grid:"Grid",mobile:"Mobile",memory:"Memory",extension:"Extension",adorner:"Adorner",sync:"Sync"},Ge=r.i18n.registerUIStrings("core/common/SettingRegistration.ts",Ve),Me=r.i18n.getLocalizedString.bind(void 0,Ge);let We=[];const Xe=new Set;function Fe(t){const e=t.settingName;if(Xe.has(e))throw new Error(`Duplicate setting name '${e}'`);Xe.add(e),We.push(t)}function De(e){return We.filter((r=>t.Runtime.Runtime.isDescriptorEnabled({experiment:r.experiment,condition:r.condition},e)))}function Ue(t,e=!1){if(0===We.length||e){We=t,Xe.clear();for(const e of t){const t=e.settingName;if(Xe.has(t))throw new Error(`Duplicate setting name '${t}'`);Xe.add(t)}}}function je(){We=[],Xe.clear()}function $e(t){const e=We.findIndex((e=>e.settingName===t));return!(e<0||!Xe.delete(t))&&(We.splice(e,1),!0)}function He(t){switch(t){case"ELEMENTS":return Me(Ve.elements);case"APPEARANCE":return Me(Ve.appearance);case"SOURCES":return Me(Ve.sources);case"NETWORK":return Me(Ve.network);case"PERFORMANCE":return Me(Ve.performance);case"CONSOLE":case"EMULATION":return Me(Ve.console);case"PERSISTENCE":return Me(Ve.persistence);case"DEBUGGER":return Me(Ve.debugger);case"GLOBAL":return Me(Ve.global);case"RENDERING":return Me(Ve.rendering);case"GRID":return Me(Ve.grid);case"MOBILE":return Me(Ve.mobile);case"MEMORY":return Me(Ve.memory);case"EXTENSIONS":return Me(Ve.extension);case"ADORNER":return Me(Ve.adorner);case"":return r.i18n.lockedString("");case"SYNC":return Me(Ve.sync)}}var qe=Object.freeze({__proto__:null,registerSettingExtension:Fe,getRegisteredSettings:De,registerSettingsForTest:Ue,resetSettings:je,maybeRemoveSettingExtension:$e,getLocalizedSettingsCategory:He});let Ze;class Ye{syncedStorage;globalStorage;localStorage;#G;settingNameSet;orderValuesBySettingCategory;#M;#W;moduleSettings;#X;constructor(e,r,s,n){this.syncedStorage=e,this.globalStorage=r,this.localStorage=s,this.#G=new Je({}),this.settingNameSet=new Set,this.orderValuesBySettingCategory=new Map,this.#M=new Dt,this.#W=new Map,this.moduleSettings=new Map,this.#X=n;for(const e of this.getRegisteredSettings()){const{settingName:r,defaultValue:s,storageType:n}=e,i="regex"===e.settingType,a="function"==typeof s?s(this.#X):s,o=i&&"string"==typeof a?this.createRegExpSetting(r,a,void 0,n):this.createSetting(r,a,n);o.setTitleFunction(e.title),e.userActionCondition&&o.setRequiresUserAction(Boolean(t.Runtime.Runtime.queryParam(e.userActionCondition))),o.setRegistration(e),this.registerModuleSetting(o)}}getRegisteredSettings(){return De(this.#X)}static hasInstance(){return void 0!==Ze}static instance(t={forceNew:null,syncedStorage:null,globalStorage:null,localStorage:null}){const{forceNew:e,syncedStorage:r,globalStorage:s,localStorage:n,config:i}=t;if(!Ze||e){if(!r||!s||!n)throw new Error(`Unable to create settings: global and local storage must be provided: ${(new Error).stack}`);Ze=new Ye(r,s,n,i)}return Ze}static removeInstance(){Ze=void 0}getHostConfig(){return this.#X}registerModuleSetting(t){const e=t.name,r=t.category(),s=t.order();if(this.settingNameSet.has(e))throw new Error(`Duplicate Setting name '${e}'`);if(r&&s){const t=this.orderValuesBySettingCategory.get(r)||new Set;if(t.has(s))throw new Error(`Duplicate order value '${s}' for settings category '${r}'`);t.add(s),this.orderValuesBySettingCategory.set(r,t)}this.settingNameSet.add(e),this.moduleSettings.set(t.name,t)}static normalizeSettingName(t){return[sr.GLOBAL_VERSION_SETTING_NAME,sr.SYNCED_VERSION_SETTING_NAME,sr.LOCAL_VERSION_SETTING_NAME,"currentDockState","isUnderTest"].includes(t)?t:e.StringUtilities.toKebabCase(t)}moduleSetting(t){const e=this.moduleSettings.get(t);if(!e)throw new Error("No setting registered: "+t);return e}settingForTest(t){const e=this.#W.get(t);if(!e)throw new Error("No setting registered: "+t);return e}createSetting(t,e,r){const s=this.storageFromType(r);let n=this.#W.get(t);return n||(n=new er(t,e,this.#M,s),this.#W.set(t,n)),n}createLocalSetting(t,e){return this.createSetting(t,e,"Local")}createRegExpSetting(t,e,r,s){return this.#W.get(t)||this.#W.set(t,new rr(t,e,this.#M,this.storageFromType(s),r)),this.#W.get(t)}clearAll(){this.globalStorage.removeAll(),this.syncedStorage.removeAll(),this.localStorage.removeAll(),(new sr).resetToCurrent()}storageFromType(t){switch(t){case"Local":return this.localStorage;case"Session":return this.#G;case"Global":return this.globalStorage;case"Synced":return this.syncedStorage}return this.globalStorage}getRegistry(){return this.#W}}const Ke={register:()=>{},set:()=>{},get:()=>Promise.resolve(""),remove:()=>{},clear:()=>{}};class Je{object;backingStore;storagePrefix;constructor(t,e=Ke,r=""){this.object=t,this.backingStore=e,this.storagePrefix=r}register(t){t=this.storagePrefix+t,this.backingStore.register(t)}set(t,e){t=this.storagePrefix+t,this.object[t]=e,this.backingStore.set(t,e)}has(t){return(t=this.storagePrefix+t)in this.object}get(t){return t=this.storagePrefix+t,this.object[t]}async forceGet(t){const e=this.storagePrefix+t,r=await this.backingStore.get(e);return r&&r!==this.object[e]?this.set(t,r):r||this.remove(t),r}remove(t){t=this.storagePrefix+t,delete this.object[t],this.backingStore.remove(t)}removeAll(){this.object={},this.backingStore.clear()}keys(){return Object.keys(this.object)}dumpSizes(){te.instance().log("Ten largest settings: ");const t={__proto__:null};for(const e in this.object)t[e]=this.object[e].length;const e=Object.keys(t);e.sort((function(e,r){return t[r]-t[e]}));for(let r=0;r<10&&rt.name===e.experiment)):void 0}}class er{name;defaultValue;eventSupport;storage;#F;#_;#D=null;#U;#j;#$=JSON;#H;#q;#Z=null;constructor(t,e,r,s){this.name=t,this.defaultValue=e,this.eventSupport=r,this.storage=s,s.register(this.name)}setSerializer(t){this.#$=t}addChangeListener(t,e){return this.eventSupport.addEventListener(this.name,t,e)}removeChangeListener(t,e){this.eventSupport.removeEventListener(this.name,t,e)}title(){return this.#_?this.#_:this.#F?this.#F():""}setTitleFunction(t){t&&(this.#F=t)}setTitle(t){this.#_=t}setRequiresUserAction(t){this.#U=t}disabled(){if(this.#D?.disabledCondition){const{disabled:t}=this.#D.disabledCondition(Ye.instance().getHostConfig());if(t)return!0}return this.#q||!1}disabledReason(){if(this.#D?.disabledCondition){const t=this.#D.disabledCondition(Ye.instance().getHostConfig());if(t.disabled)return t.reason}}setDisabled(t){this.#q=t,this.eventSupport.dispatchEventToListeners(this.name)}get(){if(this.#U&&!this.#H)return this.defaultValue;if(void 0!==this.#j)return this.#j;if(this.#j=this.defaultValue,this.storage.has(this.name))try{this.#j=this.#$.parse(this.storage.get(this.name))}catch(t){this.storage.remove(this.name)}return this.#j}async forceGet(){const t=this.name,e=this.storage.get(t),r=await this.storage.forceGet(t);if(this.#j=this.defaultValue,r)try{this.#j=this.#$.parse(r)}catch(t){this.storage.remove(this.name)}return e!==r&&this.eventSupport.dispatchEventToListeners(this.name,this.#j),this.#j}set(t){this.#H=!0,this.#j=t;try{const e=this.#$.stringify(t);try{this.storage.set(this.name,e)}catch(t){this.printSettingsSavingError(t.message,this.name,e)}}catch(t){te.instance().error("Cannot stringify setting with name: "+this.name+", error: "+t.message)}this.eventSupport.dispatchEventToListeners(this.name,t)}setRegistration(e){this.#D=e;const{deprecationNotice:r}=e;if(r?.disabled){const e=r.experiment?t.Runtime.experiments.allConfigurableExperiments().find((t=>t.name===r.experiment)):void 0;e&&!e.isEnabled()||(this.set(this.defaultValue),this.setDisabled(!0))}}type(){return this.#D?this.#D.settingType:null}options(){return this.#D&&this.#D.options?this.#D.options.map((t=>{const{value:e,title:r,text:s,raw:n}=t;return{value:e,title:r(),text:"function"==typeof s?s():s,raw:n}})):[]}reloadRequired(){return this.#D&&this.#D.reloadRequired||null}category(){return this.#D&&this.#D.category||null}tags(){return this.#D&&this.#D.tags?this.#D.tags.map((t=>t())).join("\0"):null}order(){return this.#D&&this.#D.order||null}get deprecation(){return this.#D&&this.#D.deprecationNotice?(this.#Z||(this.#Z=new tr(this.#D)),this.#Z):null}printSettingsSavingError(t,e,r){const s="Error saving setting with name: "+this.name+", value length: "+r.length+". Error: "+t;console.error(s),te.instance().error(s),this.storage.dumpSizes()}}class rr extends er{#Y;#K;constructor(t,e,r,s,n){super(t,e?[{pattern:e}]:[],r,s),this.#Y=n}get(){const t=[],e=this.getAsArray();for(let r=0;r`-url:${t}`)).join(" ");if(e){const t=Ye.instance().createSetting("console.textFilter",""),r=t.get()?` ${t.get()}`:"";t.set(`${e}${r}`)}Qe(t)}updateVersionFrom26To27(){function t(t,e,r){const s=Ye.instance().createSetting(t,{}),n=s.get();e in n&&(n[r]=n[e],delete n[e],s.set(n))}t("panel-tabOrder","audits2","audits"),t("panel-closeableTabs","audits2","audits"),function(t,e,r){const s=Ye.instance().createSetting(t,"");s.get()===e&&s.set(r)}("panel-selectedTab","audits2","audits")}updateVersionFrom27To28(){const t=Ye.instance().createSetting("uiTheme","systemPreferred");"default"===t.get()&&t.set("systemPreferred")}updateVersionFrom28To29(){function t(t,e,r){const s=Ye.instance().createSetting(t,{}),n=s.get();e in n&&(n[r]=n[e],delete n[e],s.set(n))}t("panel-tabOrder","audits","lighthouse"),t("panel-closeableTabs","audits","lighthouse"),function(t,e,r){const s=Ye.instance().createSetting(t,"");s.get()===e&&s.set(r)}("panel-selectedTab","audits","lighthouse")}updateVersionFrom29To30(){const t=Ye.instance().createSetting("closeableTabs",{}),e=Ye.instance().createSetting("panel-closeableTabs",{}),r=Ye.instance().createSetting("drawer-view-closeableTabs",{}),s=e.get(),n=e.get(),i=Object.assign(n,s);t.set(i),Qe(e),Qe(r)}updateVersionFrom30To31(){Qe(Ye.instance().createSetting("recorder_recordings",[]))}updateVersionFrom31To32(){const t=Ye.instance().createLocalSetting("breakpoints",[]),e=t.get();for(const t of e)t.resourceTypeName="script";t.set(e)}updateVersionFrom32To33(){const t=Ye.instance().createLocalSetting("previouslyViewedFiles",[]);let e=t.get();e=e.filter((t=>"url"in t));for(const t of e)t.resourceTypeName="script";t.set(e)}updateVersionFrom33To34(){const t=Ye.instance().createLocalSetting("breakpoints",[]),e=t.get();for(const t of e){const e=t.condition.startsWith("/** DEVTOOLS_LOGPOINT */ console.log(")&&t.condition.endsWith(")");t.isLogpoint=e}t.set(e)}updateVersionFrom34To35(){const t=Ye.instance().createLocalSetting("breakpoints",[]),e=t.get();for(const t of e){const{condition:e,isLogpoint:r}=t;r&&(t.condition=e.slice(37,e.length-1))}t.set(e)}updateVersionFrom35To36(){Ye.instance().createSetting("showThirdPartyIssues",!0).set(!0)}updateVersionFrom36To37(){const t=t=>{for(const e of t.keys()){const r=Ye.normalizeSettingName(e);if(r!==e){const s=t.get(e);Qe({name:e,storage:t}),t.set(r,s)}}};t(Ye.instance().globalStorage),t(Ye.instance().syncedStorage),t(Ye.instance().localStorage);for(const t of Ye.instance().globalStorage.keys()){if(t.startsWith("data-grid-")&&t.endsWith("-column-weights")||t.endsWith("-tab-order")||"views-location-override"===t||"closeable-tabs"===t){const r=Ye.instance().createSetting(t,{});r.set(e.StringUtilities.toKebabCaseKeys(r.get()))}if(t.endsWith("-selected-tab")){const r=Ye.instance().createSetting(t,"");r.set(e.StringUtilities.toKebabCase(r.get()))}}}migrateSettingsFromLocalStorage(){const t=new Set(["advancedSearchConfig","breakpoints","consoleHistory","domBreakpoints","eventListenerBreakpoints","fileSystemMapping","lastSelectedSourcesSidebarPaneTab","previouslyViewedFiles","savedURLs","watchExpressions","workspaceExcludedFolders","xhrBreakpoints"]);if(window.localStorage)for(const e in window.localStorage){if(t.has(e))continue;const r=window.localStorage[e];window.localStorage.removeItem(e),Ye.instance().globalStorage.set(e,r)}}clearBreakpointsWhenTooMany(t,e){t.get().length>e&&t.set([])}}function nr(t){return Ye.instance().moduleSetting(t)}var ir=Object.freeze({__proto__:null,Settings:Ye,NOOP_STORAGE:Ke,SettingsStorage:Je,Deprecation:tr,Setting:er,RegExpSetting:rr,VersionController:sr,moduleSetting:nr,settingForTest:function(t){return Ye.instance().settingForTest(t)},getLocalizedSettingsCategory:He,maybeRemoveSettingExtension:$e,registerSettingExtension:Fe,registerSettingsForTest:Ue,resetSettings:je});var ar=Object.freeze({__proto__:null,SimpleHistoryManager:class{#et;#rt;#st;#nt;constructor(t){this.#et=[],this.#rt=-1,this.#st=0,this.#nt=t}readOnlyLock(){++this.#st}releaseReadOnlyLock(){--this.#st}getPreviousValidIndex(){if(this.empty())return-1;let t=this.#rt-1;for(;t>=0&&!this.#et[t].valid();)--t;return t<0?-1:t}getNextValidIndex(){let t=this.#rt+1;for(;t=this.#et.length?-1:t}readOnly(){return Boolean(this.#st)}filterOut(t){if(this.readOnly())return;const e=[];let r=0;for(let s=0;sthis.#nt&&this.#et.shift(),this.#rt=this.#et.length-1)}canRollback(){return this.getPreviousValidIndex()>=0}canRollover(){return this.getNextValidIndex()>=0}rollback(){const t=this.getPreviousValidIndex();return-1!==t&&(this.readOnlyLock(),this.#rt=t,this.#et[t].reveal(),this.releaseReadOnlyLock(),!0)}rollover(){const t=this.getNextValidIndex();return-1!==t&&(this.readOnlyLock(),this.#rt=t,this.#et[t].reveal(),this.releaseReadOnlyLock(),!0)}}});var or=Object.freeze({__proto__:null,StringOutputStream:class{#it;constructor(){this.#it=""}async write(t){this.#it+=t}async close(){}data(){return this.#it}}});class lr{#at;#ot;#lt;#ht;#ct;#ut;#gt;constructor(t){this.#ot=0,this.#gt=t,this.clear()}static newStringTrie(){return new lr({empty:()=>"",append:(t,e)=>t+e,slice:(t,e,r)=>t.slice(e,r)})}static newArrayTrie(){return new lr({empty:()=>[],append:(t,e)=>t.concat([e]),slice:(t,e,r)=>t.slice(e,r)})}add(t){let e=this.#ot;++this.#ct[this.#ot];for(let r=0;r{this.#wt=t}))}#xt(){this.#ft=this.getTime(),this.#pt=!1,this.#yt&&this.innerSchedule(!1),this.processCompletedForTests()}processCompletedForTests(){}get process(){return this.#yt}get processCompleted(){return this.#yt?this.#bt:null}onTimeout(){this.#St=void 0,this.#mt=!1,this.#pt=!0,Promise.resolve().then(this.#yt).catch(console.error.bind(console)).then(this.#xt.bind(this)).then(this.#wt),this.#bt=new Promise((t=>{this.#wt=t})),this.#yt=null}schedule(t,e="Default"){this.#yt=t;const r=Boolean(this.#St)||this.#pt,s=this.getTime()-this.#ft>this.#dt,n="AsSoonAsPossible"===e||"Default"===e&&!r&&s,i=n&&!this.#mt;return this.#mt=this.#mt||n,this.innerSchedule(i),this.#bt}innerSchedule(t){if(this.#pt)return;if(this.#St&&!t)return;this.#St&&this.clearTimeout(this.#St);const e=this.#mt?0:this.#dt;this.#St=this.setTimeout(this.onTimeout.bind(this),e)}clearTimeout(t){clearTimeout(t)}setTimeout(t,e){return window.setTimeout(t,e)}getTime(){return window.performance.now()}}});class gr{#vt;#Tt;constructor(t){this.#vt=new Promise((e=>{const r=new Worker(t,{type:"module"});r.onmessage=t=>{console.assert("workerReady"===t.data),r.onmessage=null,e(r)}}))}static fromURL(t){return new gr(t)}postMessage(t){this.#vt.then((e=>{this.#Tt||e.postMessage(t)}))}dispose(){this.#Tt=!0,this.#vt.then((t=>t.terminate()))}terminate(){this.dispose()}set onmessage(t){this.#vt.then((e=>{e.onmessage=t}))}set onerror(t){this.#vt.then((e=>{e.onerror=t}))}}var dr=Object.freeze({__proto__:null,WorkerWrapper:gr});export{s as App,i as AppProvider,l as Base64,h as CharacterIdMap,Ft as Color,E as ColorConverter,nt as ColorUtils,se as Console,ne as Debouncer,ie as EventTarget,ae as JavaScriptMetaData,he as Lazy,ge as Linkifier,de as Mutex,Ut as ObjectWrapper,ye as ParsedURL,be as Progress,we as QueryParamHandler,Se as ResolverBase,Ce as ResourceType,Jt as Revealer,Oe as Runnable,Ne as SegmentedRange,qe as SettingRegistration,ir as Settings,ar as SimpleHistoryManager,or as StringOutputStream,cr as TextDictionary,ur as Throttler,hr as Trie,dr as Worker}; diff --git a/packages/debugger-frontend/dist/third-party/front_end/core/dom_extension/dom_extension.js b/packages/debugger-frontend/dist/third-party/front_end/core/dom_extension/dom_extension.js index 22e8afd61ffd..5e45d8bfde8e 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/core/dom_extension/dom_extension.js +++ b/packages/debugger-frontend/dist/third-party/front_end/core/dom_extension/dom_extension.js @@ -1 +1 @@ -import*as t from"../platform/platform.js";Node.prototype.traverseNextTextNode=function(t){let e=this.traverseNextNode(t);if(!e)return null;const o={STYLE:1,SCRIPT:1,"#document-fragment":1};for(;e&&(e.nodeType!==Node.TEXT_NODE||o[e.parentNode?e.parentNode.nodeName:""]);)e=e.traverseNextNode(t);return e},Element.prototype.positionAt=function(t,e,o){let n={x:0,y:0};o&&(n=o.boxInWindow(this.ownerDocument.defaultView)),"number"==typeof t?this.style.setProperty("left",n.x+t+"px"):this.style.removeProperty("left"),"number"==typeof e?this.style.setProperty("top",n.y+e+"px"):this.style.removeProperty("top"),"number"==typeof t||"number"==typeof e?this.style.setProperty("position","absolute"):this.style.removeProperty("position")},Node.prototype.enclosingNodeOrSelfWithClass=function(t,e){return this.enclosingNodeOrSelfWithClassList([t],e)},Node.prototype.enclosingNodeOrSelfWithClassList=function(t,e){for(let o=this;o&&o!==e&&o!==this.ownerDocument;o=o.parentNodeOrShadowHost())if(o.nodeType===Node.ELEMENT_NODE){let e=!0;for(let n=0;nt.hasSelection())))return!0}const t=this.getComponentSelection();return"Range"===t.type&&(t.containsNode(this,!0)||t.anchorNode.isSelfOrDescendant(this)||t.focusNode.isSelfOrDescendant(this))},Node.prototype.window=function(){return this.ownerDocument.defaultView},Element.prototype.removeChildren=function(){this.firstChild&&(this.textContent="")},self.createElement=function(t,e){return document.createElement(t,{is:e})},self.createTextNode=function(t){return document.createTextNode(t)},self.createDocumentFragment=function(){return document.createDocumentFragment()},Element.prototype.createChild=function(t,e,o){const n=document.createElement(t,{is:o});return e&&(n.className=e),this.appendChild(n),n},DocumentFragment.prototype.createChild=Element.prototype.createChild,self.AnchorBox=class{constructor(t,e,o,n){this.x=t||0,this.y=e||0,this.width=o||0,this.height=n||0}contains(t,e){return t>=this.x&&t<=this.x+this.width&&e>=this.y&&e<=this.y+this.height}relativeTo(t){return new AnchorBox(this.x-t.x,this.y-t.y,this.width,this.height)}relativeToElement(t){return this.relativeTo(t.boxInWindow(t.ownerDocument.defaultView))}equals(t){return Boolean(t)&&this.x===t.x&&this.y===t.y&&this.width===t.width&&this.height===t.height}},Element.prototype.boxInWindow=function(t){t=t||this.ownerDocument.defaultView;const e=new AnchorBox;let o=this,n=this.ownerDocument.defaultView;for(;n&&o&&(e.x+=o.getBoundingClientRect().left,e.y+=o.getBoundingClientRect().top,n!==t);)o=n.frameElement,n=n.parent;return e.width=Math.min(this.offsetWidth,t.innerWidth-e.x),e.height=Math.min(this.offsetHeight,t.innerHeight-e.y),e},Event.prototype.consume=function(t){this.stopImmediatePropagation(),t&&this.preventDefault(),this.handled=!0},Node.prototype.deepTextContent=function(){return this.childTextNodes().map((function(t){return t.textContent})).join("")},Node.prototype.childTextNodes=function(){let t=this.traverseNextTextNode(this);const e=[],o={STYLE:1,SCRIPT:1,"#document-fragment":1};for(;t;)o[t.parentNode?t.parentNode.nodeName:""]||e.push(t),t=t.traverseNextTextNode(this);return e},Node.prototype.isAncestor=function(t){if(!t)return!1;let e=t.parentNodeOrShadowHost();for(;e;){if(this===e)return!0;e=e.parentNodeOrShadowHost()}return!1},Node.prototype.isDescendant=function(t){return Boolean(t)&&t.isAncestor(this)},Node.prototype.isSelfOrAncestor=function(t){return Boolean(t)&&(t===this||this.isAncestor(t))},Node.prototype.isSelfOrDescendant=function(t){return Boolean(t)&&(t===this||this.isDescendant(t))},Node.prototype.traverseNextNode=function(t,e=!1){if(!e&&this.shadowRoot)return this.shadowRoot;const o=this instanceof HTMLSlotElement?this.assignedNodes():[];if(o.length)return o[0];if(this.firstChild)return this.firstChild;let n=this;for(;n;){if(t&&n===t)return null;const e=r(n);if(e)return e;n=n.assignedSlot||n.parentNodeOrShadowHost()}function r(t){if(!t.assignedSlot)return t.nextSibling;const e=t.assignedSlot.assignedNodes(),o=Array.prototype.indexOf.call(e,t);return o+11e4?(this.textContent="string"==typeof o?o:t.StringUtilities.trimMiddle(e,1e4),!0):(this.textContent=e,!1)},Element.prototype.hasFocus=function(){const t=this.getComponentRoot();return Boolean(t)&&this.isSelfOrAncestor(t.activeElement)},Node.prototype.getComponentRoot=function(){let t=this;for(;t&&t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&t.nodeType!==Node.DOCUMENT_NODE;)t=t.parentNode;return t},self.onInvokeElement=function(e,o){e.addEventListener("keydown",(e=>{t.KeyboardUtilities.isEnterOrSpaceKey(e)&&o(e)})),e.addEventListener("click",(t=>o(t)))},function(){const t=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(e,o){return 1===arguments.length&&(o=!this.contains(e)),t.call(this,e,Boolean(o))}}();const e=Element.prototype.appendChild,o=Element.prototype.insertBefore,n=Element.prototype.removeChild,r=Element.prototype.removeChildren;Element.prototype.appendChild=function(t){if(t.__widget&&t.parentElement!==this)throw new Error("Attempt to add widget via regular DOM operation.");return e.call(this,t)},Element.prototype.insertBefore=function(t,e){if(t.__widget&&t.parentElement!==this)throw new Error("Attempt to add widget via regular DOM operation.");return o.call(this,t,e)},Element.prototype.removeChild=function(t){if(t.__widgetCounter||t.__widget)throw new Error("Attempt to remove element containing widget via regular DOM operation");return n.call(this,t)},Element.prototype.removeChildren=function(){if(this.__widgetCounter)throw new Error("Attempt to remove element containing widget via regular DOM operation");r.call(this)};var i=Object.freeze({__proto__:null,originalAppendChild:e,originalInsertBefore:o,originalRemoveChild:n,originalRemoveChildren:r});export{i as DOMExtension}; +import*as t from"../platform/platform.js";Node.prototype.traverseNextTextNode=function(t){let e=this.traverseNextNode(t);if(!e)return null;const o={STYLE:1,SCRIPT:1,"#document-fragment":1};for(;e&&(e.nodeType!==Node.TEXT_NODE||o[e.parentNode?e.parentNode.nodeName:""]);)e=e.traverseNextNode(t);return e},Element.prototype.positionAt=function(t,e,o){let n={x:0,y:0};o&&(n=o.boxInWindow(this.ownerDocument.defaultView)),"number"==typeof t?this.style.setProperty("left",n.x+t+"px"):this.style.removeProperty("left"),"number"==typeof e?this.style.setProperty("top",n.y+e+"px"):this.style.removeProperty("top"),"number"==typeof t||"number"==typeof e?this.style.setProperty("position","absolute"):this.style.removeProperty("position")},Node.prototype.enclosingNodeOrSelfWithClass=function(t,e){return this.enclosingNodeOrSelfWithClassList([t],e)},Node.prototype.enclosingNodeOrSelfWithClassList=function(t,e){for(let o=this;o&&o!==e&&o!==this.ownerDocument;o=o.parentNodeOrShadowHost())if(o.nodeType===Node.ELEMENT_NODE){let e=!0;for(let n=0;nt.hasSelection())))return!0}const t=this.getComponentSelection();return"Range"===t.type&&(t.containsNode(this,!0)||t.anchorNode.isSelfOrDescendant(this)||t.focusNode.isSelfOrDescendant(this))},Node.prototype.window=function(){return this.ownerDocument.defaultView},Element.prototype.removeChildren=function(){this.firstChild&&(this.textContent="")},self.createElement=function(t,e){return document.createElement(t,{is:e})},self.createTextNode=function(t){return document.createTextNode(t)},self.createDocumentFragment=function(){return document.createDocumentFragment()},Element.prototype.createChild=function(t,e,o){const n=document.createElement(t,{is:o});return e&&(n.className=e),this.appendChild(n),n},DocumentFragment.prototype.createChild=Element.prototype.createChild,self.AnchorBox=class{constructor(t,e,o,n){this.x=t||0,this.y=e||0,this.width=o||0,this.height=n||0}contains(t,e){return t>=this.x&&t<=this.x+this.width&&e>=this.y&&e<=this.y+this.height}relativeTo(t){return new AnchorBox(this.x-t.x,this.y-t.y,this.width,this.height)}relativeToElement(t){return this.relativeTo(t.boxInWindow(t.ownerDocument.defaultView))}equals(t){return Boolean(t)&&this.x===t.x&&this.y===t.y&&this.width===t.width&&this.height===t.height}},Element.prototype.boxInWindow=function(t){t=t||this.ownerDocument.defaultView;const e=new AnchorBox;let o=this,n=this.ownerDocument.defaultView;for(;n&&o&&(e.x+=o.getBoundingClientRect().left,e.y+=o.getBoundingClientRect().top,n!==t);)o=n.frameElement,n=n.parent;return e.width=Math.min(this.offsetWidth,t.innerWidth-e.x),e.height=Math.min(this.offsetHeight,t.innerHeight-e.y),e},Event.prototype.consume=function(t){this.stopImmediatePropagation(),t&&this.preventDefault(),this.handled=!0},Node.prototype.deepTextContent=function(){return this.childTextNodes().map((function(t){return t.textContent})).join("")},Node.prototype.childTextNodes=function(){let t=this.traverseNextTextNode(this);const e=[],o={STYLE:1,SCRIPT:1,"#document-fragment":1};for(;t;)o[t.parentNode?t.parentNode.nodeName:""]||e.push(t),t=t.traverseNextTextNode(this);return e},Node.prototype.isAncestor=function(t){if(!t)return!1;let e=t.parentNodeOrShadowHost();for(;e;){if(this===e)return!0;e=e.parentNodeOrShadowHost()}return!1},Node.prototype.isDescendant=function(t){return Boolean(t)&&t.isAncestor(this)},Node.prototype.isSelfOrAncestor=function(t){return Boolean(t)&&(t===this||this.isAncestor(t))},Node.prototype.isSelfOrDescendant=function(t){return Boolean(t)&&(t===this||this.isDescendant(t))},Node.prototype.traverseNextNode=function(t,e=!1){if(!e&&this.shadowRoot)return this.shadowRoot;const o=this instanceof HTMLSlotElement?this.assignedNodes():[];if(o.length)return o[0];if(this.firstChild)return this.firstChild;let n=this;for(;n;){if(t&&n===t)return null;const e=r(n);if(e)return e;n=n.assignedSlot||n.parentNodeOrShadowHost()}function r(t){if(!t.assignedSlot)return t.nextSibling;const e=t.assignedSlot.assignedNodes(),o=Array.prototype.indexOf.call(e,t);return o+11e4?(this.textContent="string"==typeof o?o:t.StringUtilities.trimMiddle(e,1e4),!0):(this.textContent=e,!1)},Element.prototype.hasFocus=function(){const t=this.getComponentRoot();return Boolean(t)&&this.isSelfOrAncestor(t.activeElement)},Node.prototype.getComponentRoot=function(){let t=this;for(;t&&t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&t.nodeType!==Node.DOCUMENT_NODE;)t=t.parentNode;return t},self.onInvokeElement=function(e,o){e.addEventListener("keydown",(e=>{t.KeyboardUtilities.isEnterOrSpaceKey(e)&&o(e)})),e.addEventListener("click",(t=>o(t)))},function(){const t=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(e,o){return 1===arguments.length&&(o=!this.contains(e)),t.call(this,e,Boolean(o))}}();var e=Object.freeze({__proto__:null});export{e as DOMExtension}; 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 44d7e9814a1c..38f4508cf733 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"../platform/platform.js";import*as r from"../root/root.js";import*as o from"../common/common.js";import*as t from"../i18n/i18n.js";var n;!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.ReattachRootTarget="reattachMainTarget",e.ReloadInspectedPage="reloadInspectedPage",e.RevealSourceLine="revealSourceLine",e.SavedURL="savedURL",e.SearchCompleted="searchCompleted",e.SetInspectedTabId="setInspectedTabId",e.SetUseSoftMenu="setUseSoftMenu",e.ShowPanel="showPanel"}(n||(n={}));const s=[[n.AppendedToURL,"appendedToURL",["url"]],[n.CanceledSaveURL,"canceledSaveURL",["url"]],[n.ColorThemeChanged,"colorThemeChanged",[]],[n.ContextMenuCleared,"contextMenuCleared",[]],[n.ContextMenuItemSelected,"contextMenuItemSelected",["id"]],[n.DeviceCountUpdated,"deviceCountUpdated",["count"]],[n.DevicesDiscoveryConfigChanged,"devicesDiscoveryConfigChanged",["config"]],[n.DevicesPortForwardingStatusChanged,"devicesPortForwardingStatusChanged",["status"]],[n.DevicesUpdated,"devicesUpdated",["devices"]],[n.DispatchMessage,"dispatchMessage",["messageObject"]],[n.DispatchMessageChunk,"dispatchMessageChunk",["messageChunk","messageSize"]],[n.EnterInspectElementMode,"enterInspectElementMode",[]],[n.EyeDropperPickedColor,"eyeDropperPickedColor",["color"]],[n.FileSystemsLoaded,"fileSystemsLoaded",["fileSystems"]],[n.FileSystemRemoved,"fileSystemRemoved",["fileSystemPath"]],[n.FileSystemAdded,"fileSystemAdded",["errorMessage","fileSystem"]],[n.FileSystemFilesChangedAddedRemoved,"fileSystemFilesChangedAddedRemoved",["changed","added","removed"]],[n.IndexingTotalWorkCalculated,"indexingTotalWorkCalculated",["requestId","fileSystemPath","totalWork"]],[n.IndexingWorked,"indexingWorked",["requestId","fileSystemPath","worked"]],[n.IndexingDone,"indexingDone",["requestId","fileSystemPath"]],[n.KeyEventUnhandled,"keyEventUnhandled",["event"]],[n.ReattachRootTarget,"reattachMainTarget",[]],[n.ReloadInspectedPage,"reloadInspectedPage",["hard"]],[n.RevealSourceLine,"revealSourceLine",["url","lineNumber","columnNumber"]],[n.SavedURL,"savedURL",["url","fileSystemPath"]],[n.SearchCompleted,"searchCompleted",["requestId","fileSystemPath","files"]],[n.SetInspectedTabId,"setInspectedTabId",["tabId"]],[n.SetUseSoftMenu,"setUseSoftMenu",["useSoftMenu"]],[n.ShowPanel,"showPanel",["panelName"]]];var i=Object.freeze({__proto__:null,get Events(){return n},EventDescriptors:s});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)};let h=function(e,r,t,n){const s=new o.StringOutputStream.StringOutputStream;w(e,r,s,(function(e,r,o){t(e,r,s.data(),o)}),n)};function v(e,r,o){if(void 0===e||void 0===o)return null;if(0!==e){if(function(e){return e<=-300&&e>-400}(e))return c(a.httpErrorStatusCodeSS,{PH1:String(r),PH2:o});const t=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`${t}: ${o}`}return null}const w=function(e,r,t,n,s){const i=m(t);if(new o.ParsedURL.ParsedURL(e).isDataURL())return void(e=>new Promise(((r,o)=>{const t=new XMLHttpRequest;t.withCredentials=!1,t.open("GET",e,!0),t.onreadystatechange=function(){if(t.readyState===XMLHttpRequest.DONE){if(200!==t.status)return t.onreadystatechange=null,void o(new Error(String(t.status)));t.onreadystatechange=null,r(t.responseText)}},t.send(null)})))(e).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(e){return!1}}(e))return void(n&&n(!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(r)for(const e in r)d.push(e+": "+r[e]);function l(e){if(n){const{success:r,description:o}=function(e){const{statusCode:r,netError:o,netErrorName:t,urlValid:n,messageOverride:s}=e;let i="";const d=r>=200&&r<300;if("string"==typeof s)i=s;else if(!d)if(void 0===o)i=c(!1===n?a.invalidUrl:a.unknownError);else{const e=v(o,r,t);e&&(i=e)}return console.assert(d===(0===i.length)),{success:d,description:{statusCode:r,netError:o,netErrorName:t,urlValid:n,message:i}}}(e);n(r,e.headers||{},o)}g(i)}I.loadNetworkResource(e,d.join("\r\n"),i,l)};var C=Object.freeze({__proto__:null,ResourceLoader:{},bindOutputStream:m,discardOutputStream:g,streamWrite:p,get load(){return h},setLoadForTest:function(e){h=e},netErrorToMessage:v,loadAsStream:w});const k={devtoolsS:"DevTools - {PH1}"},S=t.i18n.registerUIStrings("core/host/InspectorFrontendHost.ts",k),f=t.i18n.getLocalizedString.bind(void 0,S),y="/overrides";class b{#e;events;#r=null;recordedCountHistograms=[];recordedEnumeratedHistograms=[];recordedPerformanceHistograms=[];constructor(){function e(e){!("mac"===this.platform()?e.metaKey:e.ctrlKey)||"+"!==e.key&&"-"!==e.key||e.stopPropagation()}this.#e=new Map,"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=f(k.devtoolsS,{PH1:e.replace(/^https?:\/\//,"")})}copyText(e){null!=e&&navigator.clipboard.writeText(e)}openInNewTab(e){window.open(e,"_blank")}openSearchResultsInNewTab(e){o.Console.Console.instance().error("Search is not enabled in hosted mode. Please inspect using chrome://inspect")}showItemInFolder(e){o.Console.Console.instance().error("Show item in folder is not enabled in hosted mode. Please inspect using chrome://inspect")}save(e,r,o){let t=this.#e.get(e);t||(t=[],this.#e.set(e,t)),t.push(r),this.events.dispatchEventToListeners(n.SavedURL,{url:e,fileSystemPath:e})}append(e,r){const o=this.#e.get(e);o&&(o.push(r),this.events.dispatchEventToListeners(n.AppendedToURL,e))}close(r){const o=this.#e.get(r)||[];this.#e.delete(r);let t="";if(r)try{const o=e.StringUtilities.trimURL(r);t=e.StringUtilities.removeURLFragment(o)}catch(e){t=r}const n=document.createElement("a");n.download=t;const s=new Blob([o.join("")],{type:"text/plain"}),i=URL.createObjectURL(s);n.href=i,n.click(),URL.revokeObjectURL(i)}sendMessageToBackend(e){}recordCountHistogram(e,r,o,t,n){this.recordedCountHistograms.length>=100&&this.recordedCountHistograms.shift(),this.recordedCountHistograms.push({histogramName:e,sample:r,min:o,exclusiveMax:t,bucketSize:n})}recordEnumeratedHistogram(e,r,o){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){}requestFileSystems(){this.events.dispatchEventToListeners(n.FileSystemsLoaded,[])}addFileSystem(e){window.webkitRequestFileSystem(window.TEMPORARY,1048576,(e=>{this.#r=e;const r={fileSystemName:"sandboxedRequestedFileSystem",fileSystemPath:y,rootURL:"filesystem:devtools://devtools/isolated/",type:"overrides"};this.events.dispatchEventToListeners(n.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(n.FileSystemRemoved,y)}isolatedFileSystem(e,r){return this.#r}loadNetworkResource(e,r,o,t){fetch(e).then((async e=>{const r=await e.arrayBuffer();let o=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"),t=e.writable.getWriter();t.write(r),t.close(),o=e.readable}return await new Response(o).text()})).then((function(e){p(o,e),t({statusCode:200,headers:void 0,messageOverride:void 0,netError:void 0,netErrorName:void 0,urlValid:void 0})})).catch((function(){t({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){e({isSyncActive:!1,arePreferencesSynced:!1})}upgradeDraggedFileSystemPermissions(e){}indexPath(e,r,o){}stopIndexing(e){}searchInPath(e,r,o){}zoomFactor(){return 1}zoomIn(){}zoomOut(){}resetZoom(){}setWhitelistedShortcuts(e){}setEyeDropperActive(e){}showCertificateViewer(e){}reattach(e){e()}readyForTest(){}connectionReady(){}setOpenNewWindowForPopups(e){}setDevicesDiscoveryConfig(e){}setDevicesUpdatesEnabled(e){}performActionOnRemotePage(e,r){}openRemotePage(e,r){}openNodeFrontend(){}showContextMenuAtPoint(e,r,o,t){throw"Soft context menu should be used"}isHostedMode(){return!0}setAddExtensionCallback(e){}async initialTargetId(){return null}doAidaConversation(e,r,o){o({error:"Not implemened"})}registerAidaClientEvent(e){}recordImpression(e){}recordResize(e){}recordClick(e){}recordHover(e){}recordDrag(e){}recordChange(e){}recordKeyDown(e){}}let I=globalThis.InspectorFrontendHost;class x{constructor(){for(const e of s)this[e[1]]=this.dispatch.bind(this,e[0],e[2],e[3])}dispatch(e,r,o,...t){if(r.length<2){try{I.events.dispatchEventToListeners(e,t[0])}catch(e){console.error(e+" "+e.stack)}return}const n={};for(let e=0;e{let{promise:r,resolve:o,reject:t}=e.PromiseUtilities.promiseWithResolvers();return{write:async n=>{o(n),({promise:r,resolve:o,reject:t}=e.PromiseUtilities.promiseWithResolvers())},close:async()=>{o(null)},read:()=>r,fail:e=>t(e)}})(),t=m(o);let n;I.doAidaConversation(JSON.stringify(P.buildApiRequest(r)),t,(e=>{403===e.statusCode?o.fail(new Error("Server responded: permission denied")):e.error?o.fail(new Error(`Cannot send request: ${e.error} ${e.detail||""}`)):200!==e.statusCode?o.fail(new Error(`Request failed: ${JSON.stringify(e)}`)):o.close()}));const s=[];let i=!1;for(;n=await o.read();){if(!n.length)continue;let e;n.startsWith(",")&&(n=n.slice(1)),n.startsWith("[")||(n="["+n),n.endsWith("]")||(n+="]");try{e=JSON.parse(n)}catch(e){throw new Error("Cannot parse chunk: "+n,{cause:e})}const r="\n`````\n";for(const o of e)if("textChunk"in o)i&&(s.push(r),i=!1),s.push(o.textChunk.text);else{if(!("codeChunk"in o))throw"error"in o?new Error(`Server responded: ${JSON.stringify(o)}`):new Error("Unknown chunk result");i||(s.push(r),i=!0),s.push(o.codeChunk.code)}yield{explanation:s.join("")+(i?r:""),metadata:{rpcGlobalId:e[0]?.metadata?.rpcGlobalId}}}}}var T=Object.freeze({__proto__:null,AidaClient:P});let M,F,R,D,O;function _(){return M||(M=I.platform()),M}var A=Object.freeze({__proto__:null,platform:_,isMac:function(){return void 0===F&&(F="mac"===_()),F},isWin:function(){return void 0===R&&(R="windows"===_()),R},setPlatformForTests:function(e){M=e,F=void 0,R=void 0},isCustomDevtoolsFrontend:function(){return void 0===D&&(D=window.location.toString().startsWith("devtools://devtools/custom/")),D},fontFamily:function(){if(O)return O;switch(_()){case"linux":O="Roboto, Ubuntu, Arial, sans-serif";break;case"mac":O="'Lucida Grande', sans-serif";break;case"windows":O="'Segoe UI', Tahoma, sans-serif"}return O}});let H=null;function N(){return null===H&&(H=new L),H}class L{#o="error";#t=new Set;#n=null;addEventListener(e){this.#t.add(e);return()=>{this.#t.delete(e)}}removeAllEventListeners(){this.#t.clear()}sendEvent(e){if(!0!==globalThis.enableReactNativePerfMetrics)return;const r=this.#s(e),o=[];for(const e of this.#t)try{e(r)}catch(e){o.push(e)}if(o.length>0){const e=new AggregateError(o);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,o]=W(`[RNPerfMetrics] uncaught error: ${e.message}`,e.error);this.sendEvent({eventName:"Browser.Error",params:{type:"error",message:r,error:o}})}),{passive:!0}),window.addEventListener("unhandledrejection",(e=>{const[r,o]=W("[RNPerfMetrics] unhandled promise rejection",e.reason);this.sendEvent({eventName:"Browser.Error",params:{type:"rejectedPromise",message:r,error:o}})}),{passive:!0});const e=globalThis.console,r=e[this.#o];e[this.#o]=(...o)=>{try{const e=o[0],[r,t]=W("[RNPerfMetrics] console.error",e);this.sendEvent({eventName:"Browser.Error",params:{message:r,error:t,type:"consoleError"}})}catch(e){const[r,o]=W("[RNPerfMetrics] Error handling console.error",e);this.sendEvent({eventName:"Browser.Error",params:{message:r,error:o,type:"consoleError"}})}finally{r.apply(e,o)}}}setLaunchId(e){this.#n=e}entryPointLoadingStarted(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:{reason:e}})}developerResourceLoadingStarted(e,r){const o=U(e);this.sendEvent({eventName:"DeveloperResource.LoadingStarted",params:{url:o,loadingMethod:r}})}developerResourceLoadingFinished(e,r,o){const t=U(e);this.sendEvent({eventName:"DeveloperResource.LoadingFinished",params:{url:t,loadingMethod:r,success:o.success,errorMessage:o.errorDescription?.message}})}fuseboxSetClientMetadataStarted(){this.sendEvent({eventName:"FuseboxSetClientMetadataStarted"})}fuseboxSetClientMetadataFinished(e,r){if(e)this.sendEvent({eventName:"FuseboxSetClientMetadataFinished",params:{success:!0}});else{const[e,o]=W("[RNPerfMetrics] Fusebox setClientMetadata failed",r);this.sendEvent({eventName:"FuseboxSetClientMetadataFinished",params:{success:!1,error:o,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}})}#s(e){return{...e,...{timestamp:performance.timeOrigin+performance.now(),launchId:this.#n}}}}function U(e){const{url:r}=e;return e.isHttpOrHttps()?r:`${r.slice(0,100)} …(omitted ${r.length-100} characters)`}function W(e,r){if(r instanceof Error){return[`${e}: ${r.message}`,r]}const o=`${e}: ${String(r)}`;return[o,new Error(o,{cause:r})]}var V,B,j,q,G,z,$,X,K,Q,J,Y,Z,ee,re,oe,te=Object.freeze({__proto__:null,getInstance:N});class ne{#i;#a;#d;constructor(){this.#i=!1,this.#a=!1,this.#d=""}breakpointWithConditionAdded(e){e>=2||I.recordEnumeratedHistogram("DevTools.BreakpointWithConditionAdded",e,2)}breakpointEditDialogRevealedFrom(e){e>=7||I.recordEnumeratedHistogram("DevTools.BreakpointEditDialogRevealedFrom",e,7)}panelShown(e,r){const o=B[e]||0;I.recordEnumeratedHistogram("DevTools.PanelShown",o,B.MaxValue),I.recordUserMetricsAction("DevTools_PanelShown_"+e),r||(this.#i=!0)}panelClosed(e){const r=B[e]||0;I.recordEnumeratedHistogram("DevTools.PanelClosed",r,B.MaxValue),this.#i=!0}panelShownInLocation(e,r){const o=j[`${e}-${r}`]||0;I.recordEnumeratedHistogram("DevTools.PanelShownInLocation",o,j.MaxValue)}elementsSidebarTabShown(e){const r=q[e]||0;I.recordEnumeratedHistogram("DevTools.Elements.SidebarTabShown",r,q.MaxValue)}sourcesSidebarTabShown(e){const r=G[e]||0;I.recordEnumeratedHistogram("DevTools.Sources.SidebarTabShown",r,G.MaxValue)}settingsPanelShown(e){this.panelShown("settings-"+e)}sourcesPanelFileDebugged(e){const r=e&&z[e]||z.Unknown;I.recordEnumeratedHistogram("DevTools.SourcesPanelFileDebugged",r,z.MaxValue)}sourcesPanelFileOpened(e){const r=e&&z[e]||z.Unknown;I.recordEnumeratedHistogram("DevTools.SourcesPanelFileOpened",r,z.MaxValue)}networkPanelResponsePreviewOpened(e){const r=e&&z[e]||z.Unknown;I.recordEnumeratedHistogram("DevTools.NetworkPanelResponsePreviewOpened",r,z.MaxValue)}actionTaken(e){I.recordEnumeratedHistogram("DevTools.ActionTaken",e,V.MaxValue)}panelLoaded(e,r){this.#a||e!==this.#d||(this.#a=!0,requestAnimationFrame((()=>{window.setTimeout((()=>{performance.mark(r),this.#i||I.recordPerformanceHistogram(r,performance.now())}),0)})))}setLaunchPanel(e){this.#d=e}performanceTraceLoad(e){I.recordPerformanceHistogram("DevTools.TraceLoad",e.duration)}keybindSetSettingChanged(e){const r=$[e]||0;I.recordEnumeratedHistogram("DevTools.KeybindSetSettingChanged",r,$.MaxValue)}keyboardShortcutFired(e){const r=X[e]||X.OtherShortcut;I.recordEnumeratedHistogram("DevTools.KeyboardShortcutFired",r,X.MaxValue)}issuesPanelOpenedFrom(e){I.recordEnumeratedHistogram("DevTools.IssuesPanelOpenedFrom",e,6)}issuesPanelIssueExpanded(e){if(void 0===e)return;const r=Q[e];void 0!==r&&I.recordEnumeratedHistogram("DevTools.IssuesPanelIssueExpanded",r,Q.MaxValue)}issuesPanelResourceOpened(e,r){const o=J[e+r];void 0!==o&&I.recordEnumeratedHistogram("DevTools.IssuesPanelResourceOpened",o,J.MaxValue)}issueCreated(e){const r=Y[e];void 0!==r&&I.recordEnumeratedHistogram("DevTools.IssueCreated",r,Y.MaxValue)}experimentEnabledAtLaunch(e){const r=K[e];void 0!==r&&I.recordEnumeratedHistogram("DevTools.ExperimentEnabledAtLaunch",r,K.MaxValue)}experimentDisabledAtLaunch(e){const r=K[e];void 0!==r&&I.recordEnumeratedHistogram("DevTools.ExperimentDisabledAtLaunch",r,K.MaxValue)}experimentChanged(e,r){const o=K[e];if(void 0===o)return;const t=r?"DevTools.ExperimentEnabled":"DevTools.ExperimentDisabled";I.recordEnumeratedHistogram(t,o,K.MaxValue)}developerResourceLoaded(e){e>=8||I.recordEnumeratedHistogram("DevTools.DeveloperResourceLoaded",e,8)}developerResourceScheme(e){e>=9||I.recordEnumeratedHistogram("DevTools.DeveloperResourceScheme",e,9)}inlineScriptParsed(e){e>=2||I.recordEnumeratedHistogram("DevTools.InlineScriptParsed",e,2)}vmInlineScriptContentShown(e){e>=2||I.recordEnumeratedHistogram("DevTools.VMInlineScriptShown",e,2)}language(e){const r=re[e];void 0!==r&&I.recordEnumeratedHistogram("DevTools.Language",r,re.MaxValue)}syncSetting(e){I.getSyncInformation((r=>{let o=1;r.isSyncActive&&!r.arePreferencesSynced?o=2:r.isSyncActive&&r.arePreferencesSynced&&(o=e?4:3),I.recordEnumeratedHistogram("DevTools.SyncSetting",o,5)}))}recordingAssertion(e){I.recordEnumeratedHistogram("DevTools.RecordingAssertion",e,4)}recordingToggled(e){I.recordEnumeratedHistogram("DevTools.RecordingToggled",e,3)}recordingReplayFinished(e){I.recordEnumeratedHistogram("DevTools.RecordingReplayFinished",e,5)}recordingReplaySpeed(e){I.recordEnumeratedHistogram("DevTools.RecordingReplaySpeed",e,5)}recordingReplayStarted(e){I.recordEnumeratedHistogram("DevTools.RecordingReplayStarted",e,4)}recordingEdited(e){I.recordEnumeratedHistogram("DevTools.RecordingEdited",e,11)}recordingExported(e){I.recordEnumeratedHistogram("DevTools.RecordingExported",e,6)}recordingCodeToggled(e){I.recordEnumeratedHistogram("DevTools.RecordingCodeToggled",e,3)}recordingCopiedToClipboard(e){I.recordEnumeratedHistogram("DevTools.RecordingCopiedToClipboard",e,9)}styleTextCopied(e){I.recordEnumeratedHistogram("DevTools.StyleTextCopied",e,11)}manifestSectionSelected(e){const r=oe[e]||oe.OtherSection;I.recordEnumeratedHistogram("DevTools.ManifestSectionSelected",r,oe.MaxValue)}cssHintShown(e){I.recordEnumeratedHistogram("DevTools.CSSHintShown",e,14)}lighthouseModeRun(e){I.recordEnumeratedHistogram("DevTools.LighthouseModeRun",e,4)}lighthouseCategoryUsed(e){I.recordEnumeratedHistogram("DevTools.LighthouseCategoryUsed",e,6)}colorConvertedFrom(e){I.recordEnumeratedHistogram("DevTools.ColorConvertedFrom",e,2)}colorPickerOpenedFrom(e){I.recordEnumeratedHistogram("DevTools.ColorPickerOpenedFrom",e,2)}cssPropertyDocumentation(e){I.recordEnumeratedHistogram("DevTools.CSSPropertyDocumentation",e,3)}swatchActivated(e){I.recordEnumeratedHistogram("DevTools.SwatchActivated",e,10)}badgeActivated(e){I.recordEnumeratedHistogram("DevTools.BadgeActivated",e,9)}breakpointsRestoredFromStorage(e){const r=this.#c(e);I.recordEnumeratedHistogram("DevTools.BreakpointsRestoredFromStorageCount",r,10)}animationPlaybackRateChanged(e){I.recordEnumeratedHistogram("DevTools.AnimationPlaybackRateChanged",e,4)}animationPointDragged(e){I.recordEnumeratedHistogram("DevTools.AnimationPointDragged",e,5)}#c(e){return e<100?0:e<300?1:e<1e3?2:e<3e3?3:e<1e4?4:e<3e4?5:e<1e5?6:e<3e5?7:e<1e6?8:9}workspacesPopulated(e){I.recordPerformanceHistogram("DevTools.Workspaces.PopulateWallClocktime",e)}visualLoggingProcessingDone(e){I.recordPerformanceHistogram("DevTools.VisualLogging.ProcessingTime",e)}legacyResourceTypeFilterNumberOfSelectedChanged(e){const r=Math.max(Math.min(e,Z.MaxValue-1),1);I.recordEnumeratedHistogram("DevTools.LegacyResourceTypeFilterNumberOfSelectedChanged",r,Z.MaxValue)}legacyResourceTypeFilterItemSelected(e){const r=Z[e];void 0!==r&&I.recordEnumeratedHistogram("DevTools.LegacyResourceTypeFilterItemSelected",r,Z.MaxValue)}resourceTypeFilterNumberOfSelectedChanged(e){const r=Math.max(Math.min(e,Z.MaxValue-1),1);I.recordEnumeratedHistogram("DevTools.ResourceTypeFilterNumberOfSelectedChanged",r,Z.MaxValue)}resourceTypeFilterItemSelected(e){const r=Z[e];void 0!==r&&I.recordEnumeratedHistogram("DevTools.ResourceTypeFilterItemSelected",r,Z.MaxValue)}networkPanelMoreFiltersNumberOfSelectedChanged(e){const r=Math.max(Math.min(e,ee.MaxValue),0);I.recordEnumeratedHistogram("DevTools.NetworkPanelMoreFiltersNumberOfSelectedChanged",r,ee.MaxValue)}networkPanelMoreFiltersItemSelected(e){const r=ee[e];void 0!==r&&I.recordEnumeratedHistogram("DevTools.NetworkPanelMoreFiltersItemSelected",r,ee.MaxValue)}}!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.MaxValue=140]="MaxValue"}(V||(V={})),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.MaxValue=68]="MaxValue"}(B||(B={})),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["js_profiler-main"]=31]="js_profiler-main",e[e["js_profiler-drawer"]=32]="js_profiler-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.MaxValue=133]="MaxValue"}(j||(j={})),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.MaxValue=8]="MaxValue"}(q||(q={})),function(e){e[e.OtherSidebarPane=0]="OtherSidebarPane",e[e["navigator-network"]=1]="navigator-network",e[e["navigator-files"]=2]="navigator-files",e[e["navigator-overrides"]=3]="navigator-overrides",e[e["navigator-content-scripts"]=4]="navigator-content-scripts",e[e["navigator-snippets"]=5]="navigator-snippets",e[e.MaxValue=6]="MaxValue"}(G||(G={})),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.MaxValue=36]="MaxValue"}(z||(z={})),function(e){e[e.devToolsDefault=0]="devToolsDefault",e[e.vsCode=1]="vsCode",e[e.MaxValue=2]="MaxValue"}($||($={})),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.MaxValue=118]="MaxValue"}(X||(X={})),function(e){e[e["apply-custom-stylesheet"]=0]="apply-custom-stylesheet",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["ignore-list-js-frames-on-timeline"]=43]="ignore-list-js-frames-on-timeline",e[e["contrast-issues"]=44]="contrast-issues",e[e["experimental-cookie-features"]=45]="experimental-cookie-features",e[e["styles-pane-css-changes"]=55]="styles-pane-css-changes",e[e["evaluate-expressions-with-source-maps"]=58]="evaluate-expressions-with-source-maps",e[e["instrumentation-breakpoints"]=61]="instrumentation-breakpoints",e[e["authored-deployed-grouping"]=63]="authored-deployed-grouping",e[e["important-dom-properties"]=64]="important-dom-properties",e[e["just-my-code"]=65]="just-my-code",e[e["timeline-as-console-profile-result-panel"]=67]="timeline-as-console-profile-result-panel",e[e["preloading-status-panel"]=68]="preloading-status-panel",e[e["outermost-target-selector"]=71]="outermost-target-selector",e[e["js-profiler-temporarily-enable"]=72]="js-profiler-temporarily-enable",e[e["highlight-errors-elements-panel"]=73]="highlight-errors-elements-panel",e[e["set-all-breakpoints-eagerly"]=74]="set-all-breakpoints-eagerly",e[e["self-xss-warning"]=75]="self-xss-warning",e[e["use-source-map-scopes"]=76]="use-source-map-scopes",e[e["storage-buckets-tree"]=77]="storage-buckets-tree",e[e["network-panel-filter-bar-redesign"]=79]="network-panel-filter-bar-redesign",e[e["track-context-menu"]=81]="track-context-menu",e[e["autofill-view"]=82]="autofill-view",e[e["sources-frame-indentation-markers-temporarily-disable"]=83]="sources-frame-indentation-markers-temporarily-disable",e[e["heap-snapshot-treat-backing-store-as-containing-object"]=84]="heap-snapshot-treat-backing-store-as-containing-object",e[e["css-type-component-length-deprecate"]=85]="css-type-component-length-deprecate",e[e.MaxValue=86]="MaxValue"}(K||(K={})),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.MaxValue=9]="MaxValue"}(Q||(Q={})),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.MaxValue=13]="MaxValue"}(J||(J={})),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.MaxValue=86]="MaxValue"}(Y||(Y={})),function(e){e[e.all=0]="all",e[e.Documents=1]="Documents",e[e.Scripts=2]="Scripts",e[e["Fetch and XHR"]=3]="Fetch and XHR",e[e.Stylesheets=4]="Stylesheets",e[e.Fonts=5]="Fonts",e[e.Images=6]="Images",e[e.Media=7]="Media",e[e.Manifest=8]="Manifest",e[e.WebSockets=9]="WebSockets",e[e.WebAssembly=10]="WebAssembly",e[e.Other=11]="Other",e[e.MaxValue=12]="MaxValue"}(Z||(Z={})),function(e){e[e["Hide data URLs"]=0]="Hide data URLs",e[e["Hide extension URLs"]=1]="Hide extension URLs",e[e["Blocked response cookies"]=2]="Blocked response cookies",e[e["Blocked requests"]=3]="Blocked requests",e[e["3rd-party requests"]=4]="3rd-party requests",e[e.MaxValue=5]="MaxValue"}(ee||(ee={})),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.MaxValue=83]="MaxValue"}(re||(re={})),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.MaxValue=6]="MaxValue"}(oe||(oe={}));var se=Object.freeze({__proto__:null,UserMetrics:ne,get Action(){return V},get PanelCodes(){return B},get PanelWithLocation(){return j},get ElementsSidebarTabCodes(){return q},get SourcesSidebarTabCodes(){return G},get MediaTypes(){return z},get KeybindSetSettings(){return $},get KeyboardShortcutAction(){return X},get DevtoolsExperiments(){return K},get IssueExpanded(){return Q},get IssueResourceOpened(){return J},get IssueCreated(){return Y},get ResourceType(){return Z},get NetworkPanelMoreFilters(){return ee},get Language(){return re},get ManifestSectionCodes(){return oe}});const ie=new ne,ae=N();export{T as AidaClient,E as InspectorFrontendHost,i as InspectorFrontendHostAPI,A as Platform,te as RNPerfMetrics,C as ResourceLoader,se as UserMetrics,ae as rnPerfMetrics,ie as userMetrics}; +import*as e from"../common/common.js";import*as r from"../platform/platform.js";import*as o from"../i18n/i18n.js";import*as t from"../root/root.js";var n;!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"}(n||(n={}));const s=[[n.AppendedToURL,"appendedToURL",["url"]],[n.CanceledSaveURL,"canceledSaveURL",["url"]],[n.ColorThemeChanged,"colorThemeChanged",[]],[n.ContextMenuCleared,"contextMenuCleared",[]],[n.ContextMenuItemSelected,"contextMenuItemSelected",["id"]],[n.DeviceCountUpdated,"deviceCountUpdated",["count"]],[n.DevicesDiscoveryConfigChanged,"devicesDiscoveryConfigChanged",["config"]],[n.DevicesPortForwardingStatusChanged,"devicesPortForwardingStatusChanged",["status"]],[n.DevicesUpdated,"devicesUpdated",["devices"]],[n.DispatchMessage,"dispatchMessage",["messageObject"]],[n.DispatchMessageChunk,"dispatchMessageChunk",["messageChunk","messageSize"]],[n.EnterInspectElementMode,"enterInspectElementMode",[]],[n.EyeDropperPickedColor,"eyeDropperPickedColor",["color"]],[n.FileSystemsLoaded,"fileSystemsLoaded",["fileSystems"]],[n.FileSystemRemoved,"fileSystemRemoved",["fileSystemPath"]],[n.FileSystemAdded,"fileSystemAdded",["errorMessage","fileSystem"]],[n.FileSystemFilesChangedAddedRemoved,"fileSystemFilesChangedAddedRemoved",["changed","added","removed"]],[n.IndexingTotalWorkCalculated,"indexingTotalWorkCalculated",["requestId","fileSystemPath","totalWork"]],[n.IndexingWorked,"indexingWorked",["requestId","fileSystemPath","worked"]],[n.IndexingDone,"indexingDone",["requestId","fileSystemPath"]],[n.KeyEventUnhandled,"keyEventUnhandled",["event"]],[n.ReloadInspectedPage,"reloadInspectedPage",["hard"]],[n.RevealSourceLine,"revealSourceLine",["url","lineNumber","columnNumber"]],[n.SavedURL,"savedURL",["url","fileSystemPath"]],[n.SearchCompleted,"searchCompleted",["requestId","fileSystemPath","files"]],[n.SetInspectedTabId,"setInspectedTabId",["tabId"]],[n.SetUseSoftMenu,"setUseSoftMenu",["useSoftMenu"]],[n.ShowPanel,"showPanel",["panelName"]]];var i=Object.freeze({__proto__:null,get Events(){return n},EventDescriptors:s});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=o.i18n.registerUIStrings("core/host/ResourceLoader.ts",a),c=o.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)};let h=function(r,o,t,n){const s=new e.StringOutputStream.StringOutputStream;C(r,o,s,(function(e,r,o){t(e,r,s.data(),o)}),n)};function v(e,r,o){if(void 0===e||void 0===o)return null;if(0!==e){if(function(e){return e<=-300&&e>-400}(e))return c(a.httpErrorStatusCodeSS,{PH1:String(r),PH2:o});const t=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`${t}: ${o}`}return null}const C=function(r,o,t,n,s){const i=m(t);if(new e.ParsedURL.ParsedURL(r).isDataURL())return void(e=>new Promise(((r,o)=>{const t=new XMLHttpRequest;t.withCredentials=!1,t.open("GET",e,!0),t.onreadystatechange=function(){if(t.readyState===XMLHttpRequest.DONE){if(200!==t.status)return t.onreadystatechange=null,void o(new Error(String(t.status)));t.onreadystatechange=null,r(t.responseText)}},t.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(e){return!1}}(r))return void(n&&n(!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(o)for(const e in o)d.push(e+": "+o[e]);function l(e){if(n){const{success:r,description:o}=function(e){const{statusCode:r,netError:o,netErrorName:t,urlValid:n,messageOverride:s}=e;let i="";const d=r>=200&&r<300;if("string"==typeof s)i=s;else if(!d)if(void 0===o)i=c(!1===n?a.invalidUrl:a.unknownError);else{const e=v(o,r,t);e&&(i=e)}return console.assert(d===(0===i.length)),{success:d,description:{statusCode:r,netError:o,netErrorName:t,urlValid:n,message:i}}}(e);n(r,e.headers||{},o)}g(i)}b.loadNetworkResource(r,d.join("\r\n"),i,l)};var S=Object.freeze({__proto__:null,ResourceLoader:{},bindOutputStream:m,discardOutputStream:g,streamWrite:p,get load(){return h},setLoadForTest:function(e){h=e},netErrorToMessage:v,loadAsStream:C});const w={devtoolsS:"DevTools - {PH1}"},k=o.i18n.registerUIStrings("core/host/InspectorFrontendHost.ts",w),f=o.i18n.getLocalizedString.bind(void 0,k),I="/overrides";class y{#e;events;#r=null;recordedCountHistograms=[];recordedEnumeratedHistograms=[];recordedPerformanceHistograms=[];constructor(){function e(e){!("mac"===this.platform()?e.metaKey:e.ctrlKey)||"+"!==e.key&&"-"!==e.key||e.stopPropagation()}this.#e=new Map,"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=f(w.devtoolsS,{PH1:e.replace(/^https?:\/\//,"")})}copyText(e){null!=e&&navigator.clipboard.writeText(e)}openInNewTab(e){window.open(e,"_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,o,t){let s=this.#e.get(e);s||(s=[],this.#e.set(e,s)),s.push(r),this.events.dispatchEventToListeners(n.SavedURL,{url:e,fileSystemPath:e})}append(e,r){const o=this.#e.get(e);o&&(o.push(r),this.events.dispatchEventToListeners(n.AppendedToURL,e))}close(e){const o=this.#e.get(e)||[];this.#e.delete(e);let t="";if(e)try{const o=r.StringUtilities.trimURL(e);t=r.StringUtilities.removeURLFragment(o)}catch(r){t=e}const n=document.createElement("a");n.download=t;const s=new Blob([o.join("")],{type:"text/plain"}),i=URL.createObjectURL(s);n.href=i,n.click(),URL.revokeObjectURL(i)}sendMessageToBackend(e){}recordCountHistogram(e,r,o,t,n){this.recordedCountHistograms.length>=100&&this.recordedCountHistograms.shift(),this.recordedCountHistograms.push({histogramName:e,sample:r,min:o,exclusiveMax:t,bucketSize:n})}recordEnumeratedHistogram(e,r,o){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){}requestFileSystems(){this.events.dispatchEventToListeners(n.FileSystemsLoaded,[])}addFileSystem(e){window.webkitRequestFileSystem(window.TEMPORARY,1048576,(e=>{this.#r=e;const r={fileSystemName:"sandboxedRequestedFileSystem",fileSystemPath:I,rootURL:"filesystem:devtools://devtools/isolated/",type:"overrides"};this.events.dispatchEventToListeners(n.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(n.FileSystemRemoved,I)}isolatedFileSystem(e,r){return this.#r}loadNetworkResource(e,r,o,t){fetch(e).then((async e=>{const r=await e.arrayBuffer();let o=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"),t=e.writable.getWriter();t.write(r),t.close(),o=e.readable}return await new Response(o).text()})).then((function(e){p(o,e),t({statusCode:200,headers:void 0,messageOverride:void 0,netError:void 0,netErrorName:void 0,urlValid:void 0})})).catch((function(){t({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){e({isSyncActive:!1,arePreferencesSynced:!1})}getHostConfig(e){const r={devToolsConsoleInsights:{aidaModelId:"",aidaTemperature:0,blocked:!0,blockedByAge:!1,blockedByEnterprisePolicy:!1,blockedByFeatureFlag:!0,blockedByGeo:!1,blockedByRollout:!1,disallowLogging:!1,enabled:!1,optIn:!1},devToolsFreestylerDogfood:{aidaModelId:"",aidaTemperature:0,enabled:!1},devToolsVeLogging:{enabled:!0,testing:!1}};if("hostConfigForTesting"in globalThis){const{hostConfigForTesting:e}=globalThis;for(const o of Object.keys(e)){const t=o=>{r[o]={...r[o],...e[o]}};t(o)}}e(r)}upgradeDraggedFileSystemPermissions(e){}indexPath(e,r,o){}stopIndexing(e){}searchInPath(e,r,o){}zoomFactor(){return 1}zoomIn(){}zoomOut(){}resetZoom(){}setWhitelistedShortcuts(e){}setEyeDropperActive(e){}showCertificateViewer(e){}reattach(e){e()}readyForTest(){}connectionReady(){}setOpenNewWindowForPopups(e){}setDevicesDiscoveryConfig(e){}setDevicesUpdatesEnabled(e){}performActionOnRemotePage(e,r){}openRemotePage(e,r){}openNodeFrontend(){}showContextMenuAtPoint(e,r,o,t){throw"Soft context menu should be used"}isHostedMode(){return!0}setAddExtensionCallback(e){}async initialTargetId(){return null}doAidaConversation(e,r,o){o({error:"Not implemented"})}registerAidaClientEvent(e,r){}recordImpression(e){}recordResize(e){}recordClick(e){}recordHover(e){}recordDrag(e){}recordChange(e){}recordKeyDown(e){}}let b=globalThis.InspectorFrontendHost;class E{constructor(){for(const e of s)this[e[1]]=this.dispatch.bind(this,e[0],e[2],e[3])}dispatch(e,r,o,...t){if(r.length<2){try{b.events.dispatchEventToListeners(e,t[0])}catch(e){console.error(e+" "+e.stack)}return}const n={};for(let e=0;eb.getSyncInformation((r=>e(r)))));return e.accountEmail?e.isSyncActive?R.AVAILABLE:R.NO_ACTIVE_SYNC:R.NO_ACCOUNT_EMAIL}async*fetch(e){if(!b.doAidaConversation)throw new Error("doAidaConversation is not available");const o=(()=>{let{promise:e,resolve:o,reject:t}=r.PromiseUtilities.promiseWithResolvers();return{write:async n=>{o(n),({promise:e,resolve:o,reject:t}=r.PromiseUtilities.promiseWithResolvers())},close:async()=>{o(null)},read:()=>e,fail:e=>t(e)}})(),t=m(o);let n;b.doAidaConversation(JSON.stringify(e),t,(e=>{403===e.statusCode?o.fail(new Error("Server responded: permission denied")):e.error?o.fail(new Error(`Cannot send request: ${e.error} ${e.detail||""}`)):200!==e.statusCode?o.fail(new Error(`Request failed: ${JSON.stringify(e)}`)):o.close()}));const s=[];let i=!1;const a={rpcGlobalId:0};for(;n=await o.read();){let e,r=!1;if(!n.length)continue;n.startsWith(",")&&(n=n.slice(1)),n.startsWith("[")||(n="["+n),n.endsWith("]")||(n+="]");try{e=JSON.parse(n)}catch(e){throw new Error("Cannot parse chunk: "+n,{cause:e})}const o="\n`````\n";for(const t of e)if("metadata"in t&&(a.rpcGlobalId=t.metadata.rpcGlobalId,"attributionMetadata"in t.metadata&&(a.attributionMetadata||(a.attributionMetadata=[]),a.attributionMetadata.push(t.metadata.attributionMetadata))),"textChunk"in t)i&&(s.push(o),i=!1),s.push(t.textChunk.text),r=!0;else{if(!("codeChunk"in t))throw"error"in t?new Error(`Server responded: ${JSON.stringify(t)}`):new Error("Unknown chunk result");i||(s.push(o),i=!0),s.push(t.codeChunk.code),r=!0}r&&(yield{explanation:s.join("")+(i?o:""),metadata:a})}}registerClientEvent(e){const{promise:o,resolve:t}=r.PromiseUtilities.promiseWithResolvers();return b.registerAidaClientEvent(JSON.stringify({client:O,event_time:(new Date).toISOString(),...e}),t),o}}});let _,A,D,L,H;function U(){return _||(_=b.platform()),_}var W=Object.freeze({__proto__:null,platform:U,isMac:function(){return void 0===A&&(A="mac"===U()),A},isWin:function(){return void 0===D&&(D="windows"===U()),D},setPlatformForTests:function(e){_=e,A=void 0,D=void 0},isCustomDevtoolsFrontend:function(){return void 0===L&&(L=window.location.toString().startsWith("devtools://devtools/custom/")),L},fontFamily:function(){if(H)return H;switch(U()){case"linux":H="Roboto, Ubuntu, Arial, sans-serif";break;case"mac":H="'Lucida Grande', sans-serif";break;case"windows":H="'Segoe UI', Tahoma, sans-serif"}return H}});let V=null;function B(){return null===V&&(V=new G),V}class G{#o="error";#t=new Set;#n=null;#s=new Map;addEventListener(e){this.#t.add(e);return()=>{this.#t.delete(e)}}removeAllEventListeners(){this.#t.clear()}sendEvent(e){if(!0!==globalThis.enableReactNativePerfMetrics)return;const r=this.#i(e),o=[];for(const e of this.#t)try{e(r)}catch(e){o.push(e)}if(o.length>0){const e=new AggregateError(o);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,o]=q(`[RNPerfMetrics] uncaught error: ${e.message}`,e.error);this.sendEvent({eventName:"Browser.Error",params:{type:"error",message:r,error:o}})}),{passive:!0}),window.addEventListener("unhandledrejection",(e=>{const[r,o]=q("[RNPerfMetrics] unhandled promise rejection",e.reason);this.sendEvent({eventName:"Browser.Error",params:{type:"rejectedPromise",message:r,error:o}})}),{passive:!0});const e=globalThis.console,r=e[this.#o];e[this.#o]=(...o)=>{try{const e=o[0],[r,t]=q("[RNPerfMetrics] console.error",e);this.sendEvent({eventName:"Browser.Error",params:{message:r,error:t,type:"consoleError"}})}catch(e){const[r,o]=q("[RNPerfMetrics] Error handling console.error",e);this.sendEvent({eventName:"Browser.Error",params:{message:r,error:o,type:"consoleError"}})}finally{r.apply(e,o)}}}setLaunchId(e){this.#n=e}entryPointLoadingStarted(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:{reason:e}})}developerResourceLoadingStarted(e,r){const o=j(e);this.sendEvent({eventName:"DeveloperResource.LoadingStarted",params:{url:o,loadingMethod:r}})}developerResourceLoadingFinished(e,r,o){const t=j(e);this.sendEvent({eventName:"DeveloperResource.LoadingFinished",params:{url:t,loadingMethod:r,success:o.success,errorMessage:o.errorDescription?.message}})}fuseboxSetClientMetadataStarted(){this.sendEvent({eventName:"FuseboxSetClientMetadataStarted"})}fuseboxSetClientMetadataFinished(e,r){if(e)this.sendEvent({eventName:"FuseboxSetClientMetadataFinished",params:{success:!0}});else{const[e,o]=q("[RNPerfMetrics] Fusebox setClientMetadata failed",r);this.sendEvent({eventName:"FuseboxSetClientMetadataFinished",params:{success:!1,error:o,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}})}panelShown(e,r){}panelShownInLocation(e,r){this.sendEvent({eventName:"PanelShown",params:{location:r,newPanelName:e}}),this.#s.set(r,e)}#i(e){return{...e,...{timestamp:performance.timeOrigin+performance.now(),launchId:this.#n,currentPanels:this.#s}}}}function j(e){const{url:r}=e;return e.isHttpOrHttps()?r:`${r.slice(0,100)} …(omitted ${r.length-100} characters)`}function q(e,r){if(r instanceof Error){return[`${e}: ${r.message}`,r]}const o=`${e}: ${String(r)}`;return[o,new Error(o,{cause:r})]}var z,X,K,$,Y,J,Q,Z,ee,re,oe,te,ne,se,ie,ae,de=Object.freeze({__proto__:null,getInstance:B});class ce{#a;#d;#c;constructor(){this.#a=!1,this.#d=!1,this.#c=""}panelShown(e,r){const o=X[e]||0;b.recordEnumeratedHistogram("DevTools.PanelShown",o,X.MaxValue),b.recordUserMetricsAction("DevTools_PanelShown_"+e),r||(this.#a=!0),B().panelShown(e,r)}panelShownInLocation(e,r){const o=K[`${e}-${r}`]||0;b.recordEnumeratedHistogram("DevTools.PanelShownInLocation",o,K.MaxValue),B().panelShownInLocation(e,r)}sourcesSidebarTabShown(e){const r=Y[e]||0;b.recordEnumeratedHistogram("DevTools.Sources.SidebarTabShown",r,Y.MaxValue)}settingsPanelShown(e){this.panelShown("settings-"+e)}sourcesPanelFileDebugged(e){const r=e&&J[e]||J.Unknown;b.recordEnumeratedHistogram("DevTools.SourcesPanelFileDebugged",r,J.MaxValue)}sourcesPanelFileOpened(e){const r=e&&J[e]||J.Unknown;b.recordEnumeratedHistogram("DevTools.SourcesPanelFileOpened",r,J.MaxValue)}networkPanelResponsePreviewOpened(e){const r=e&&J[e]||J.Unknown;b.recordEnumeratedHistogram("DevTools.NetworkPanelResponsePreviewOpened",r,J.MaxValue)}actionTaken(e){b.recordEnumeratedHistogram("DevTools.ActionTaken",e,z.MaxValue)}panelLoaded(e,r){this.#d||e!==this.#c||(this.#d=!0,requestAnimationFrame((()=>{window.setTimeout((()=>{performance.mark(r),this.#a||b.recordPerformanceHistogram(r,performance.now())}),0)})))}setLaunchPanel(e){this.#c=e}performanceTraceLoad(e){b.recordPerformanceHistogram("DevTools.TraceLoad",e.duration)}keybindSetSettingChanged(e){const r=Q[e]||0;b.recordEnumeratedHistogram("DevTools.KeybindSetSettingChanged",r,Q.MaxValue)}keyboardShortcutFired(e){const r=Z[e]||Z.OtherShortcut;b.recordEnumeratedHistogram("DevTools.KeyboardShortcutFired",r,Z.MaxValue)}issuesPanelOpenedFrom(e){b.recordEnumeratedHistogram("DevTools.IssuesPanelOpenedFrom",e,6)}issuesPanelIssueExpanded(e){if(void 0===e)return;const r=re[e];void 0!==r&&b.recordEnumeratedHistogram("DevTools.IssuesPanelIssueExpanded",r,re.MaxValue)}issuesPanelResourceOpened(e,r){const o=oe[e+r];void 0!==o&&b.recordEnumeratedHistogram("DevTools.IssuesPanelResourceOpened",o,oe.MaxValue)}issueCreated(e){const r=te[e];void 0!==r&&b.recordEnumeratedHistogram("DevTools.IssueCreated",r,te.MaxValue)}experimentEnabledAtLaunch(e){const r=ee[e];void 0!==r&&b.recordEnumeratedHistogram("DevTools.ExperimentEnabledAtLaunch",r,ee.MaxValue)}experimentDisabledAtLaunch(e){const r=ee[e];void 0!==r&&b.recordEnumeratedHistogram("DevTools.ExperimentDisabledAtLaunch",r,ee.MaxValue)}experimentChanged(e,r){const o=ee[e];if(void 0===o)return;const t=r?"DevTools.ExperimentEnabled":"DevTools.ExperimentDisabled";b.recordEnumeratedHistogram(t,o,ee.MaxValue)}developerResourceLoaded(e){e>=8||b.recordEnumeratedHistogram("DevTools.DeveloperResourceLoaded",e,8)}developerResourceScheme(e){e>=9||b.recordEnumeratedHistogram("DevTools.DeveloperResourceScheme",e,9)}language(e){const r=ie[e];void 0!==r&&b.recordEnumeratedHistogram("DevTools.Language",r,ie.MaxValue)}syncSetting(e){b.getSyncInformation((r=>{let o=1;r.isSyncActive&&!r.arePreferencesSynced?o=2:r.isSyncActive&&r.arePreferencesSynced&&(o=e?4:3),b.recordEnumeratedHistogram("DevTools.SyncSetting",o,5)}))}recordingAssertion(e){b.recordEnumeratedHistogram("DevTools.RecordingAssertion",e,4)}recordingToggled(e){b.recordEnumeratedHistogram("DevTools.RecordingToggled",e,3)}recordingReplayFinished(e){b.recordEnumeratedHistogram("DevTools.RecordingReplayFinished",e,5)}recordingReplaySpeed(e){b.recordEnumeratedHistogram("DevTools.RecordingReplaySpeed",e,5)}recordingReplayStarted(e){b.recordEnumeratedHistogram("DevTools.RecordingReplayStarted",e,4)}recordingEdited(e){b.recordEnumeratedHistogram("DevTools.RecordingEdited",e,11)}recordingExported(e){b.recordEnumeratedHistogram("DevTools.RecordingExported",e,6)}recordingCodeToggled(e){b.recordEnumeratedHistogram("DevTools.RecordingCodeToggled",e,3)}recordingCopiedToClipboard(e){b.recordEnumeratedHistogram("DevTools.RecordingCopiedToClipboard",e,9)}styleTextCopied(e){b.recordEnumeratedHistogram("DevTools.StyleTextCopied",e,11)}manifestSectionSelected(e){const r=ae[e]||ae.OtherSection;b.recordEnumeratedHistogram("DevTools.ManifestSectionSelected",r,ae.MaxValue)}cssHintShown(e){b.recordEnumeratedHistogram("DevTools.CSSHintShown",e,14)}lighthouseModeRun(e){b.recordEnumeratedHistogram("DevTools.LighthouseModeRun",e,4)}lighthouseCategoryUsed(e){b.recordEnumeratedHistogram("DevTools.LighthouseCategoryUsed",e,6)}colorConvertedFrom(e){b.recordEnumeratedHistogram("DevTools.ColorConvertedFrom",e,2)}colorPickerOpenedFrom(e){b.recordEnumeratedHistogram("DevTools.ColorPickerOpenedFrom",e,2)}cssPropertyDocumentation(e){b.recordEnumeratedHistogram("DevTools.CSSPropertyDocumentation",e,3)}swatchActivated(e){b.recordEnumeratedHistogram("DevTools.SwatchActivated",e,11)}animationPlaybackRateChanged(e){b.recordEnumeratedHistogram("DevTools.AnimationPlaybackRateChanged",e,4)}animationPointDragged(e){b.recordEnumeratedHistogram("DevTools.AnimationPointDragged",e,5)}workspacesPopulated(e){b.recordPerformanceHistogram("DevTools.Workspaces.PopulateWallClocktime",e)}visualLoggingProcessingDone(e){b.recordPerformanceHistogram("DevTools.VisualLogging.ProcessingTime",e)}legacyResourceTypeFilterNumberOfSelectedChanged(e){const r=Math.max(Math.min(e,ne.MaxValue-1),1);b.recordEnumeratedHistogram("DevTools.LegacyResourceTypeFilterNumberOfSelectedChanged",r,ne.MaxValue)}legacyResourceTypeFilterItemSelected(e){const r=ne[e];void 0!==r&&b.recordEnumeratedHistogram("DevTools.LegacyResourceTypeFilterItemSelected",r,ne.MaxValue)}resourceTypeFilterNumberOfSelectedChanged(e){const r=Math.max(Math.min(e,ne.MaxValue-1),1);b.recordEnumeratedHistogram("DevTools.ResourceTypeFilterNumberOfSelectedChanged",r,ne.MaxValue)}resourceTypeFilterItemSelected(e){const r=ne[e];void 0!==r&&b.recordEnumeratedHistogram("DevTools.ResourceTypeFilterItemSelected",r,ne.MaxValue)}networkPanelMoreFiltersNumberOfSelectedChanged(e){const r=Math.max(Math.min(e,se.MaxValue),0);b.recordEnumeratedHistogram("DevTools.NetworkPanelMoreFiltersNumberOfSelectedChanged",r,se.MaxValue)}networkPanelMoreFiltersItemSelected(e){const r=se[e];void 0!==r&&b.recordEnumeratedHistogram("DevTools.NetworkPanelMoreFiltersItemSelected",r,se.MaxValue)}}!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.FreestylerOpenedFromElementsPanel=145]="FreestylerOpenedFromElementsPanel",e[e.FreestylerOpenedFromStylesTab=146]="FreestylerOpenedFromStylesTab",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.MaxValue=160]="MaxValue"}(z||(z={})),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.MaxValue=68]="MaxValue"}(X||(X={})),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.MaxValue=133]="MaxValue"}(K||(K={})),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.MaxValue=8]="MaxValue"}($||($={})),function(e){e[e.OtherSidebarPane=0]="OtherSidebarPane",e[e["navigator-network"]=1]="navigator-network",e[e["navigator-files"]=2]="navigator-files",e[e["navigator-overrides"]=3]="navigator-overrides",e[e["navigator-content-scripts"]=4]="navigator-content-scripts",e[e["navigator-snippets"]=5]="navigator-snippets",e[e.MaxValue=6]="MaxValue"}(Y||(Y={})),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.MaxValue=36]="MaxValue"}(J||(J={})),function(e){e[e.devToolsDefault=0]="devToolsDefault",e[e.vsCode=1]="vsCode",e[e.MaxValue=2]="MaxValue"}(Q||(Q={})),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.MaxValue=118]="MaxValue"}(Z||(Z={})),function(e){e[e["apply-custom-stylesheet"]=0]="apply-custom-stylesheet",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["styles-pane-css-changes"]=55]="styles-pane-css-changes",e[e["instrumentation-breakpoints"]=61]="instrumentation-breakpoints",e[e["authored-deployed-grouping"]=63]="authored-deployed-grouping",e[e["important-dom-properties"]=64]="important-dom-properties",e[e["just-my-code"]=65]="just-my-code",e[e["preloading-status-panel"]=68]="preloading-status-panel",e[e["outermost-target-selector"]=71]="outermost-target-selector",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["autofill-view"]=82]="autofill-view",e[e["sources-frame-indentation-markers-temporarily-disable"]=83]="sources-frame-indentation-markers-temporarily-disable",e[e["css-type-component-length-deprecate"]=85]="css-type-component-length-deprecate",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["perf-panel-annotations"]=94]="perf-panel-annotations",e[e["timeline-rpp-sidebar"]=95]="timeline-rpp-sidebar",e[e["timeline-observations"]=96]="timeline-observations",e[e.MaxValue=97]="MaxValue"}(ee||(ee={})),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.MaxValue=9]="MaxValue"}(re||(re={})),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.MaxValue=13]="MaxValue"}(oe||(oe={})),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.MaxValue=86]="MaxValue"}(te||(te={})),function(e){e[e.all=0]="all",e[e.Document=1]="Document",e[e.JavaScript=2]="JavaScript",e[e["Fetch and XHR"]=3]="Fetch and XHR",e[e.CSS=4]="CSS",e[e.Font=5]="Font",e[e.Image=6]="Image",e[e.Media=7]="Media",e[e.Manifest=8]="Manifest",e[e.WebSocket=9]="WebSocket",e[e.WebAssembly=10]="WebAssembly",e[e.Other=11]="Other",e[e.MaxValue=12]="MaxValue"}(ne||(ne={})),function(e){e[e["Hide data URLs"]=0]="Hide data URLs",e[e["Hide extension URLs"]=1]="Hide extension URLs",e[e["Blocked response cookies"]=2]="Blocked response cookies",e[e["Blocked requests"]=3]="Blocked requests",e[e["3rd-party requests"]=4]="3rd-party requests",e[e.MaxValue=5]="MaxValue"}(se||(se={})),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.MaxValue=83]="MaxValue"}(ie||(ie={})),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.MaxValue=6]="MaxValue"}(ae||(ae={}));var le=Object.freeze({__proto__:null,UserMetrics:ce,get Action(){return z},get PanelCodes(){return X},get PanelWithLocation(){return K},get ElementsSidebarTabCodes(){return $},get SourcesSidebarTabCodes(){return Y},get MediaTypes(){return J},get KeybindSetSettings(){return Q},get KeyboardShortcutAction(){return Z},get DevtoolsExperiments(){return ee},get IssueExpanded(){return re},get IssueResourceOpened(){return oe},get IssueCreated(){return te},get ResourceType(){return ne},get NetworkPanelMoreFilters(){return se},get Language(){return ie},get ManifestSectionCodes(){return ae}});const ue=new ce,me=B();export{N as AidaClient,M as InspectorFrontendHost,i as InspectorFrontendHostAPI,W as Platform,de as RNPerfMetrics,S as ResourceLoader,le as UserMetrics,me as rnPerfMetrics,ue as userMetrics}; diff --git a/packages/debugger-frontend/dist/third-party/front_end/core/i18n/i18n.js b/packages/debugger-frontend/dist/third-party/front_end/core/i18n/i18n.js index 901e1c79d3aa..f72fa2d95d78 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/core/i18n/i18n.js +++ b/packages/debugger-frontend/dist/third-party/front_end/core/i18n/i18n.js @@ -1 +1 @@ -import*as e from"../../third_party/i18n/i18n.js";import*as t from"../root/root.js";let o=null;class n{locale;lookupClosestDevToolsLocale;constructor(e){this.lookupClosestDevToolsLocale=e.lookupClosestDevToolsLocale,"browserLanguage"===e.settingLanguage?this.locale=e.navigatorLanguage||"en-US":this.locale=e.settingLanguage,this.locale=this.lookupClosestDevToolsLocale(this.locale)}static instance(e={create:!1}){if(!o&&!e.create)throw new Error("No LanguageSelector instance exists yet.");return e.create&&(o=new n(e.data)),o}static removeInstance(){o=null}forceFallbackLocale(){this.locale="en-US"}languageIsSupportedByDevTools(e){return r(e,this.lookupClosestDevToolsLocale(e))}}function r(e,t){const o=new Intl.Locale(e),n=new Intl.Locale(t);return o.language===n.language}var s=Object.freeze({__proto__:null,DevToolsLocale:n,localeLanguagesMatch:r});const i="@HOST@/remote/serve_file/@VERSION@/core/i18n/locales/@LOCALE@.json",l="./locales/@LOCALE@.json",a=new e.I18n.I18n(["af","am","ar","as","az","be","bg","bn","bs","ca","cs","cy","da","de","el","en-GB","es-419","es","et","eu","fa","fi","fil","fr-CA","fr","gl","gu","he","hi","hr","hu","hy","id","is","it","ja","ka","kk","km","kn","ko","ky","lo","lt","lv","mk","ml","mn","mr","ms","my","ne","nl","no","or","pa","pl","pt-PT","pt","ro","ru","si","sk","sl","sq","sr-Latn","sr","sv","sw","ta","te","th","tr","uk","ur","uz","vi","zh-HK","zh-TW","zu","en-US","zh"],"en-US"),c=new Set(["en-US","zh"]);function u(e,t,o={}){return e.getLocalizedStringSetFor(n.instance().locale).getLocalizedString(t,o)}function g(e,t){return a.registerFileStrings(e,t)}var f=Object.freeze({__proto__:null,lookupClosestSupportedDevToolsLocale:function(e){return a.lookupClosestSupportedLocale(e)},getAllSupportedDevToolsLocales:function(){return[...a.supportedLocales]},fetchAndRegisterLocaleData:async function(e,o=self.location.toString()){const n=fetch(function(e,o){const n=t.Runtime.getRemoteBase(o);if(n&&n.version&&!c.has(e))return i.replace("@HOST@","devtools://devtools").replace("@VERSION@",n.version).replace("@LOCALE@",e);const r=l.replace("@LOCALE@",e);return new URL(r,import.meta.url).toString()}(e,o)).then((e=>e.json())),r=new Promise(((e,t)=>window.setTimeout((()=>t(new Error("timed out fetching locale"))),5e3))),s=await Promise.race([r,n]);a.registerLocaleData(e,s)},getLazilyComputedLocalizedString:function(e,t,o={}){return()=>u(e,t,o)},getLocalizedString:u,registerUIStrings:g,getFormatLocalizedString:function(e,t,o){const r=e.getLocalizedStringSetFor(n.instance().locale).getMessageFormatterFor(t),s=document.createElement("span");for(const e of r.getAst())if(1===e.type){const t=o[e.value];t&&s.append(t)}else"value"in e&&s.append(String(e.value));return s},serializeUIString:function(e,t={}){const o={string:e,values:t};return JSON.stringify(o)},deserializeUIString:function(e){return e?JSON.parse(e):{string:"",values:{}}},lockedString:function(e){return e},lockedLazyString:function(e){return()=>e},getLocalizedLanguageRegion:function(e,t){const o=new Intl.Locale(e),{language:n,baseName:r}=o,s=n===new Intl.Locale(t.locale).language?"en":r,i=new Intl.DisplayNames([t.locale],{type:"language"}).of(n),l=new Intl.DisplayNames([s],{type:"language"}).of(n);let a="",c="";if(o.region){a=` (${new Intl.DisplayNames([t.locale],{type:"region",style:"short"}).of(o.region)})`,c=` (${new Intl.DisplayNames([s],{type:"region",style:"short"}).of(o.region)})`}return`${i}${a} - ${l}${c}`}});const p={fmms:"{PH1} μs",fms:"{PH1} ms",fs:"{PH1} s",fmin:"{PH1} min",fhrs:"{PH1} hrs",fdays:"{PH1} days"},m=g("core/i18n/time-utilities.ts",p),L=u.bind(void 0,m),d=function(e,t){if(!isFinite(e))return"-";if(0===e)return"0";if(t&&e<.1)return L(p.fmms,{PH1:(1e3*e).toFixed(0)});if(t&&e<1e3)return L(p.fms,{PH1:e.toFixed(2)});if(e<1e3)return L(p.fms,{PH1:e.toFixed(0)});const o=e/1e3;if(o<60)return L(p.fs,{PH1:o.toFixed(2)});const n=o/60;if(n<60)return L(p.fmin,{PH1:n.toFixed(1)});const r=n/60;if(r<24)return L(p.fhrs,{PH1:r.toFixed(1)});return L(p.fdays,{PH1:(r/24).toFixed(1)})};var S=Object.freeze({__proto__:null,preciseMillisToString:function(e,t){return t=t||0,L(p.fms,{PH1:e.toFixed(t)})},millisToString:d,secondsToString:function(e,t){return isFinite(e)?d(1e3*e,t):"-"}});export{s as DevToolsLocale,S as TimeUtilities,f as i18n}; +import*as e from"../../third_party/i18n/i18n.js";import*as t from"../root/root.js";import*as o from"../platform/platform.js";let n=null;class r{locale;lookupClosestDevToolsLocale;constructor(e){this.lookupClosestDevToolsLocale=e.lookupClosestDevToolsLocale,"browserLanguage"===e.settingLanguage?this.locale=e.navigatorLanguage||"en-US":this.locale=e.settingLanguage,this.locale=this.lookupClosestDevToolsLocale(this.locale)}static instance(e={create:!1}){if(!n&&!e.create)throw new Error("No LanguageSelector instance exists yet.");return e.create&&(n=new r(e.data)),n}static removeInstance(){n=null}forceFallbackLocale(){this.locale="en-US"}languageIsSupportedByDevTools(e){return s(e,this.lookupClosestDevToolsLocale(e))}}function s(e,t){const o=new Intl.Locale(e),n=new Intl.Locale(t);return o.language===n.language}var i=Object.freeze({__proto__:null,DevToolsLocale:r,localeLanguagesMatch:s});const a="@HOST@/remote/serve_file/@VERSION@/core/i18n/locales/@LOCALE@.json",l="./locales/@LOCALE@.json",c=new e.I18n.I18n(["af","am","ar","as","az","be","bg","bn","bs","ca","cs","cy","da","de","el","en-GB","es-419","es","et","eu","fa","fi","fil","fr-CA","fr","gl","gu","he","hi","hr","hu","hy","id","is","it","ja","ka","kk","km","kn","ko","ky","lo","lt","lv","mk","ml","mn","mr","ms","my","ne","nl","no","or","pa","pl","pt-PT","pt","ro","ru","si","sk","sl","sq","sr-Latn","sr","sv","sw","ta","te","th","tr","uk","ur","uz","vi","zh-HK","zh-TW","zu","en-US","zh"],"en-US"),u=new Set(["en-US","zh"]);function g(e,t,o={}){return e.getLocalizedStringSetFor(r.instance().locale).getLocalizedString(t,o)}function f(e,t){return c.registerFileStrings(e,t)}var m=Object.freeze({__proto__:null,lookupClosestSupportedDevToolsLocale:function(e){return c.lookupClosestSupportedLocale(e)},getAllSupportedDevToolsLocales:function(){return[...c.supportedLocales]},fetchAndRegisterLocaleData:async function(e,o=self.location.toString()){const n=fetch(function(e,o){const n=t.Runtime.getRemoteBase(o);if(n&&n.version&&!u.has(e))return a.replace("@HOST@","devtools://devtools").replace("@VERSION@",n.version).replace("@LOCALE@",e);const r=l.replace("@LOCALE@",e);return new URL(r,import.meta.url).toString()}(e,o)).then((e=>e.json())),r=new Promise(((e,t)=>window.setTimeout((()=>t(new Error("timed out fetching locale"))),5e3))),s=await Promise.race([r,n]);c.registerLocaleData(e,s)},hasLocaleDataForTest:function(e){return c.hasLocaleDataForTest(e)},resetLocaleDataForTest:function(){c.resetLocaleDataForTest()},getLazilyComputedLocalizedString:function(e,t,o={}){return()=>g(e,t,o)},getLocalizedString:g,registerUIStrings:f,getFormatLocalizedString:function(e,t,o){const n=e.getLocalizedStringSetFor(r.instance().locale).getMessageFormatterFor(t),s=document.createElement("span");for(const e of n.getAst())if(1===e.type){const t=o[e.value];t&&s.append(t)}else"value"in e&&s.append(String(e.value));return s},serializeUIString:function(e,t={}){const o={string:e,values:t};return JSON.stringify(o)},deserializeUIString:function(e){return e?JSON.parse(e):{string:"",values:{}}},lockedString:function(e){return e},lockedLazyString:function(e){return()=>e},getLocalizedLanguageRegion:function(e,t){const o=new Intl.Locale(e),{language:n,baseName:r}=o,s=n===new Intl.Locale(t.locale).language?"en":r,i=new Intl.DisplayNames([t.locale],{type:"language"}).of(n),a=new Intl.DisplayNames([s],{type:"language"}).of(n);let l="",c="";if(o.region){l=` (${new Intl.DisplayNames([t.locale],{type:"region",style:"short"}).of(o.region)})`,c=` (${new Intl.DisplayNames([s],{type:"region",style:"short"}).of(o.region)})`}return`${i}${l} - ${a}${c}`}});const d={fmms:"{PH1} μs",fms:"{PH1} ms",fs:"{PH1} s",fmin:"{PH1} min",fhrs:"{PH1} hrs",fdays:"{PH1} days"},p=f("core/i18n/time-utilities.ts",d),L=g.bind(void 0,p);const S=function(e,t){if(!isFinite(e))return"-";if(0===e)return"0";if(t&&e<.1)return L(d.fmms,{PH1:(1e3*e).toFixed(0)});if(t&&e<1e3)return L(d.fms,{PH1:e.toFixed(2)});if(e<1e3)return L(d.fms,{PH1:e.toFixed(0)});const o=e/1e3;if(o<60)return L(d.fs,{PH1:o.toFixed(2)});const n=o/60;if(n<60)return L(d.fmin,{PH1:n.toFixed(1)});const r=n/60;if(r<24)return L(d.fhrs,{PH1:r.toFixed(1)});return L(d.fdays,{PH1:(r/24).toFixed(1)})};var h=Object.freeze({__proto__:null,preciseMillisToString:function(e,t){return t=t||0,L(d.fms,{PH1:e.toFixed(t)})},formatMicroSecondsTime:function(e){return S(o.Timing.microSecondsToMilliSeconds(e),!0)},formatMicroSecondsAsSeconds:function(e){const t=o.Timing.microSecondsToMilliSeconds(e),n=o.Timing.milliSecondsToSeconds(t);return L(d.fs,{PH1:n.toFixed(2)})},millisToString:S,secondsToString:function(e,t){return isFinite(e)?S(1e3*e,t):"-"}});export{i as DevToolsLocale,h as TimeUtilities,m as i18n}; 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 3934ef44faca..73c1768a3abd 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 | 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 | 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/ResourceType.ts | ws":{"message":"WS"},"core/common/Revealer.ts | applicationPanel":{"message":"Application panel"},"core/common/Revealer.ts | changesDrawer":{"message":"Changes drawer"},"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 | sourcesPanel":{"message":"Sources panel"},"core/common/Revealer.ts | stylesSidebar":{"message":"styles sidebar"},"core/common/SettingRegistration.ts | adorner":{"message":"Adorner"},"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 | 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/i18n/time-utilities.ts | fdays":{"message":"{PH1} days"},"core/i18n/time-utilities.ts | fhrs":{"message":"{PH1} hrs"},"core/i18n/time-utilities.ts | fmin":{"message":"{PH1} min"},"core/i18n/time-utilities.ts | fmms":{"message":"{PH1} μs"},"core/i18n/time-utilities.ts | fms":{"message":"{PH1} ms"},"core/i18n/time-utilities.ts | fs":{"message":"{PH1} s"},"core/sdk/ChildTargetManager.ts | main":{"message":"Main"},"core/sdk/CompilerSourceMappingContentProvider.ts | couldNotLoadContentForSS":{"message":"Could not load content for {PH1} ({PH2})"},"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/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 | 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 | script":{"message":"Script"},"core/sdk/DebuggerModel.ts | withBlock":{"message":"With block"},"core/sdk/NetworkManager.ts | fastG":{"message":"Fast 3G"},"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":"Slow 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 | exemptionReasonCorsOptIn":{"message":"This cookie is allowed by CORS opt-in. Learn more: goo.gle/cors"},"core/sdk/NetworkRequest.ts | exemptionReasonEnterprisePolicy":{"message":"This cookie is allowed by Chrome Enterprise policy. Learn more: goo.gle/ce-3pc"},"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 | exemptionReasonTPCDDeprecationTrial":{"message":"This cookie is allowed by third-party cookie phaseout deprecation trial."},"core/sdk/NetworkRequest.ts | exemptionReasonTPCDHeuristics":{"message":"This cookie is allowed by third-party cookie phaseout 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/ps-dt."},"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 due to third-party cookie phaseout. Learn more in the Issues tab."},"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 due to third-party cookie phaseout. Learn more in the Issues tab."},"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/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 | hideCoreWebVitalsOverlay":{"message":"Hide Core Web Vitals overlay"},"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 | 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 | showCoreWebVitalsOverlay":{"message":"Show Core Web Vitals overlay"},"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"},"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 | coreWebVitals":{"message":"Core Web Vitals"},"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 | showsAnOverlayWithCoreWebVitals":{"message":"Shows an overlay with Core Web Vitals."},"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 | 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 | 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 | 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 | switchToDarkTheme":{"message":"Switch to dark theme"},"entrypoints/main/main-meta.ts | switchToLightTheme":{"message":"Switch to light theme"},"entrypoints/main/main-meta.ts | switchToSystemPreferredColor":{"message":"Switch to system preferred color theme"},"entrypoints/main/main-meta.ts | systemPreference":{"message":"System preference"},"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/rn_fusebox/rn_fusebox.ts | connectionStatusDisconnectedLabel":{"message":"Reconnect DevTools"},"entrypoints/rn_fusebox/rn_fusebox.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 | CSSCustomStateDeprecatedSyntax":{"message":":--customstatename is deprecated. Please use the :state(customstatename) syntax instead."},"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 | CSSValueAppearanceNonStandard":{"message":"CSS appearance values inner-spin-button, media-slider, media-sliderthumb, media-volume-slider, media-volume-sliderthumb, push-button, searchfield-cancel-button, slider-horizontal, sliderthumb-horizontal, sliderthumb-vertical, square-button are not standardized and will be removed."},"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 | DocumentDomainSettingWithoutOriginAgentClusterHeader":{"message":"Relaxing the same-origin policy by setting document.domain is deprecated, and will be disabled by default. To continue using this feature, please opt-out of origin-keyed agent clusters by sending an Origin-Agent-Cluster: ?0 header along with the HTTP response for the document and frames. See https://developer.chrome.com/blog/immutable-document-domain/ for more details."},"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 | HostCandidateAttributeGetter":{"message":"RTCPeerConnectionIceErrorEvent.hostCandidate is deprecated. Please use RTCPeerConnectionIceErrorEvent.address or RTCPeerConnectionIceErrorEvent.port instead."},"generated/Deprecation.ts | IdentityInCanMakePaymentEvent":{"message":"The merchant origin and arbitrary data from the canmakepayment service worker event are deprecated and will be removed: topOrigin, paymentRequestOrigin, methodData, modifiers."},"generated/Deprecation.ts | InsecurePrivateNetworkSubresourceRequest":{"message":"The website requested a subresource from a network that it could only access because of its users' privileged network position. These requests expose non-public devices and servers to the internet, increasing the risk of a cross-site request forgery (CSRF) attack, and/or information leakage. To mitigate these risks, Chrome deprecates requests to non-public subresources when initiated from non-secure contexts, and will start blocking them."},"generated/Deprecation.ts | InterestGroupDailyUpdateUrl":{"message":"The dailyUpdateUrl field of InterestGroups passed to joinAdInterestGroup() has been renamed to updateUrl, to more accurately reflect its behavior."},"generated/Deprecation.ts | LocalCSSFileExtensionRejected":{"message":"CSS cannot be loaded from file: URLs unless they end in a .css file extension."},"generated/Deprecation.ts | MediaSourceAbortRemove":{"message":"Using SourceBuffer.abort() to abort remove()'s asynchronous range removal is deprecated due to specification change. Support will be removed in the future. You should listen to the updateend event instead. abort() is intended to only abort an asynchronous media append or reset parser state."},"generated/Deprecation.ts | MediaSourceDurationTruncatingBuffered":{"message":"Setting MediaSource.duration below the highest presentation timestamp of any buffered coded frames is deprecated due to specification change. Support for implicit removal of truncated buffered media will be removed in the future. You should instead perform explicit remove(newDuration, oldDuration) on all sourceBuffers, where newDuration < oldDuration."},"generated/Deprecation.ts | NoSysexWebMIDIWithoutPermission":{"message":"Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions."},"generated/Deprecation.ts | NotificationInsecureOrigin":{"message":"The Notification API may no longer be used from insecure origins. 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 | NotificationPermissionRequestedIframe":{"message":"Permission for the Notification API may no longer be requested from a cross-origin iframe. You should consider requesting permission from a top-level frame or opening a new window instead."},"generated/Deprecation.ts | ObsoleteCreateImageBitmapImageOrientationNone":{"message":"Option imageOrientation: 'none' in createImageBitmap is deprecated. Please use createImageBitmap with option {imageOrientation: 'from-image'} instead."},"generated/Deprecation.ts | ObsoleteWebRtcCipherSuite":{"message":"Your partner is negotiating an obsolete (D)TLS version. Please check with your partner to have this fixed."},"generated/Deprecation.ts | OverflowVisibleOnReplacedElement":{"message":"Specifying overflow: visible on img, video and canvas tags may cause them to produce visual content outside of the element bounds. See https://github.com/WICG/shared-element-transitions/blob/main/debugging_overflow_on_images.md."},"generated/Deprecation.ts | PaymentInstruments":{"message":"paymentManager.instruments is deprecated. Please use just-in-time install for payment handlers instead."},"generated/Deprecation.ts | PaymentRequestCSPViolation":{"message":"Your PaymentRequest call bypassed Content-Security-Policy (CSP) connect-src directive. This bypass is deprecated. Please add the payment method identifier from the PaymentRequest API (in supportedMethods field) to your CSP connect-src directive."},"generated/Deprecation.ts | PersistentQuotaType":{"message":"StorageType.persistent is deprecated. Please use standardized navigator.storage instead."},"generated/Deprecation.ts | PictureSourceSrc":{"message":" with a parent is invalid and therefore ignored. Please use instead."},"generated/Deprecation.ts | PrefixedCancelAnimationFrame":{"message":"webkitCancelAnimationFrame is vendor-specific. Please use the standard cancelAnimationFrame instead."},"generated/Deprecation.ts | PrefixedRequestAnimationFrame":{"message":"webkitRequestAnimationFrame is vendor-specific. Please use the standard requestAnimationFrame instead."},"generated/Deprecation.ts | PrefixedVideoDisplayingFullscreen":{"message":"HTMLVideoElement.webkitDisplayingFullscreen is deprecated. Please use Document.fullscreenElement instead."},"generated/Deprecation.ts | PrefixedVideoEnterFullscreen":{"message":"HTMLVideoElement.webkitEnterFullscreen() is deprecated. Please use Element.requestFullscreen() instead."},"generated/Deprecation.ts | PrefixedVideoEnterFullScreen":{"message":"HTMLVideoElement.webkitEnterFullScreen() is deprecated. Please use Element.requestFullscreen() instead."},"generated/Deprecation.ts | PrefixedVideoExitFullscreen":{"message":"HTMLVideoElement.webkitExitFullscreen() is deprecated. Please use Document.exitFullscreen() instead."},"generated/Deprecation.ts | PrefixedVideoExitFullScreen":{"message":"HTMLVideoElement.webkitExitFullScreen() is deprecated. Please use Document.exitFullscreen() instead."},"generated/Deprecation.ts | PrefixedVideoSupportsFullscreen":{"message":"HTMLVideoElement.webkitSupportsFullscreen is deprecated. Please use Document.fullscreenEnabled instead."},"generated/Deprecation.ts | PrivacySandboxExtensionsAPI":{"message":"We're deprecating the API chrome.privacy.websites.privacySandboxEnabled, though it will remain active for backward compatibility until release M113. Instead, please use chrome.privacy.websites.topicsEnabled, chrome.privacy.websites.fledgeEnabled and chrome.privacy.websites.adMeasurementEnabled. See https://developer.chrome.com/docs/extensions/reference/privacy/#property-websites-privacySandboxEnabled."},"generated/Deprecation.ts | RangeExpand":{"message":"Range.expand() is deprecated. Please use Selection.modify() instead."},"generated/Deprecation.ts | RequestedSubresourceWithEmbeddedCredentials":{"message":"Subresource requests whose URLs contain embedded credentials (e.g. https://user:pass@host/) are blocked."},"generated/Deprecation.ts | RTCConstraintEnableDtlsSrtpFalse":{"message":"The constraint DtlsSrtpKeyAgreement is removed. You have specified a false value for this constraint, which is interpreted as an attempt to use the removed SDES key negotiation method. This functionality is removed; use a service that supports DTLS key negotiation instead."},"generated/Deprecation.ts | RTCConstraintEnableDtlsSrtpTrue":{"message":"The constraint DtlsSrtpKeyAgreement is removed. You have specified a true value for this constraint, which had no effect, but you can remove this constraint for tidiness."},"generated/Deprecation.ts | RTCPeerConnectionGetStatsLegacyNonCompliant":{"message":"The callback-based getStats() is deprecated and will be removed. Use the spec-compliant getStats() instead."},"generated/Deprecation.ts | RtcpMuxPolicyNegotiate":{"message":"The rtcpMuxPolicy option is deprecated and will be removed."},"generated/Deprecation.ts | SharedArrayBufferConstructedWithoutIsolation":{"message":"SharedArrayBuffer will require cross-origin isolation. See https://developer.chrome.com/blog/enabling-shared-array-buffer/ for more details."},"generated/Deprecation.ts | TextToSpeech_DisallowedByAutoplay":{"message":"speechSynthesis.speak() without user activation is deprecated and will be removed."},"generated/Deprecation.ts | UnloadHandler":{"message":"Unload event listeners are deprecated and will be removed."},"generated/Deprecation.ts | V8SharedArrayBufferConstructedInExtensionWithoutIsolation":{"message":"Extensions should opt into cross-origin isolation to continue using SharedArrayBuffer. See https://developer.chrome.com/docs/extensions/mv3/cross-origin-isolation/."},"generated/Deprecation.ts | WebSQL":{"message":"Web SQL is deprecated. Please use SQLite WebAssembly or Indexed Database"},"generated/Deprecation.ts | WindowPlacementPermissionDescriptorUsed":{"message":"The permission descriptor window-placement is deprecated. Use window-management instead. For more help, check https://bit.ly/window-placement-rename."},"generated/Deprecation.ts | WindowPlacementPermissionPolicyParsed":{"message":"The permission policy window-placement is deprecated. Use window-management instead. For more help, check https://bit.ly/window-placement-rename."},"generated/Deprecation.ts | XHRJSONEncodingDetection":{"message":"UTF-16 is not supported by response json in XMLHttpRequest"},"generated/Deprecation.ts | XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload":{"message":"Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/."},"generated/Deprecation.ts | XRSupportsSession":{"message":"supportsSession() is deprecated. Please use isSessionSupported() and check the resolved boolean value instead."},"models/bindings/ContentProviderBasedProject.ts | unknownErrorLoadingFile":{"message":"Unknown error loading file"},"models/bindings/DebuggerLanguagePlugins.ts | debugSymbolsIncomplete":{"message":"The debug information for function {PH1} is incomplete"},"models/bindings/DebuggerLanguagePlugins.ts | errorInDebuggerLanguagePlugin":{"message":"Error in debugger language plugin: {PH1}"},"models/bindings/DebuggerLanguagePlugins.ts | failedToLoadDebugSymbolsFor":{"message":"[{PH1}] Failed to load debug symbols for {PH2} ({PH3})"},"models/bindings/DebuggerLanguagePlugins.ts | failedToLoadDebugSymbolsForFunction":{"message":"No debug information for function \"{PH1}\""},"models/bindings/DebuggerLanguagePlugins.ts | loadedDebugSymbolsForButDidnt":{"message":"[{PH1}] Loaded debug symbols for {PH2}, but didn't find any source files"},"models/bindings/DebuggerLanguagePlugins.ts | loadedDebugSymbolsForFound":{"message":"[{PH1}] Loaded debug symbols for {PH2}, found {PH3} source file(s)"},"models/bindings/DebuggerLanguagePlugins.ts | loadingDebugSymbolsFor":{"message":"[{PH1}] Loading debug symbols for {PH2}..."},"models/bindings/DebuggerLanguagePlugins.ts | loadingDebugSymbolsForVia":{"message":"[{PH1}] Loading debug symbols for {PH2} (via {PH3})..."},"models/bindings/IgnoreListManager.ts | addAllContentScriptsToIgnoreList":{"message":"Add all extension scripts to ignore list"},"models/bindings/IgnoreListManager.ts | addAllThirdPartyScriptsToIgnoreList":{"message":"Add all third-party scripts to ignore list"},"models/bindings/IgnoreListManager.ts | addDirectoryToIgnoreList":{"message":"Add directory to ignore list"},"models/bindings/IgnoreListManager.ts | addScriptToIgnoreList":{"message":"Add script to ignore list"},"models/bindings/IgnoreListManager.ts | removeFromIgnoreList":{"message":"Remove from ignore list"},"models/bindings/ResourceScriptMapping.ts | liveEditCompileFailed":{"message":"LiveEdit compile failed: {PH1}"},"models/bindings/ResourceScriptMapping.ts | liveEditFailed":{"message":"LiveEdit failed: {PH1}"},"models/emulation/DeviceModeModel.ts | devicePixelRatioMustBeANumberOr":{"message":"Device pixel ratio must be a number or blank."},"models/emulation/DeviceModeModel.ts | devicePixelRatioMustBeGreater":{"message":"Device pixel ratio must be greater than or equal to {PH1}."},"models/emulation/DeviceModeModel.ts | devicePixelRatioMustBeLessThanOr":{"message":"Device pixel ratio must be less than or equal to {PH1}."},"models/emulation/DeviceModeModel.ts | heightCannotBeEmpty":{"message":"Height cannot be empty."},"models/emulation/DeviceModeModel.ts | heightMustBeANumber":{"message":"Height must be a number."},"models/emulation/DeviceModeModel.ts | heightMustBeGreaterThanOrEqualTo":{"message":"Height must be greater than or equal to {PH1}."},"models/emulation/DeviceModeModel.ts | heightMustBeLessThanOrEqualToS":{"message":"Height must be less than or equal to {PH1}."},"models/emulation/DeviceModeModel.ts | widthCannotBeEmpty":{"message":"Width cannot be empty."},"models/emulation/DeviceModeModel.ts | widthMustBeANumber":{"message":"Width must be a number."},"models/emulation/DeviceModeModel.ts | widthMustBeGreaterThanOrEqualToS":{"message":"Width must be greater than or equal to {PH1}."},"models/emulation/DeviceModeModel.ts | widthMustBeLessThanOrEqualToS":{"message":"Width must be less than or equal to {PH1}."},"models/emulation/EmulatedDevices.ts | laptopWithHiDPIScreen":{"message":"Laptop with HiDPI screen"},"models/emulation/EmulatedDevices.ts | laptopWithMDPIScreen":{"message":"Laptop with MDPI screen"},"models/emulation/EmulatedDevices.ts | laptopWithTouch":{"message":"Laptop with touch"},"models/har/Writer.ts | collectingContent":{"message":"Collecting content…"},"models/har/Writer.ts | writingFile":{"message":"Writing file…"},"models/issues_manager/BounceTrackingIssue.ts | bounceTrackingMitigations":{"message":"Bounce tracking mitigations"},"models/issues_manager/ClientHintIssue.ts | clientHintsInfrastructure":{"message":"Client Hints Infrastructure"},"models/issues_manager/ContentSecurityPolicyIssue.ts | contentSecurityPolicyEval":{"message":"Content Security Policy - Eval"},"models/issues_manager/ContentSecurityPolicyIssue.ts | contentSecurityPolicyInlineCode":{"message":"Content Security Policy - Inline Code"},"models/issues_manager/ContentSecurityPolicyIssue.ts | contentSecurityPolicySource":{"message":"Content Security Policy - Source Allowlists"},"models/issues_manager/ContentSecurityPolicyIssue.ts | trustedTypesFixViolations":{"message":"Trusted Types - Fix violations"},"models/issues_manager/ContentSecurityPolicyIssue.ts | trustedTypesPolicyViolation":{"message":"Trusted Types - Policy violation"},"models/issues_manager/CookieDeprecationMetadataIssue.ts | thirdPartyPhaseoutExplained":{"message":"Prepare for phasing out third-party cookies"},"models/issues_manager/CookieIssue.ts | anInsecure":{"message":"an insecure"},"models/issues_manager/CookieIssue.ts | aSecure":{"message":"a secure"},"models/issues_manager/CookieIssue.ts | fileCrosSiteRedirectBug":{"message":"File a bug"},"models/issues_manager/CookieIssue.ts | firstPartySetsExplained":{"message":"First-Party Sets and the SameParty attribute"},"models/issues_manager/CookieIssue.ts | howSchemefulSamesiteWorks":{"message":"How Schemeful Same-Site Works"},"models/issues_manager/CookieIssue.ts | samesiteCookiesExplained":{"message":"SameSite cookies explained"},"models/issues_manager/CookieIssue.ts | thirdPartyPhaseoutExplained":{"message":"Prepare for phasing out third-party cookies"},"models/issues_manager/CorsIssue.ts | CORS":{"message":"Cross-Origin Resource Sharing (CORS)"},"models/issues_manager/CorsIssue.ts | corsPrivateNetworkAccess":{"message":"Private Network Access"},"models/issues_manager/CrossOriginEmbedderPolicyIssue.ts | coopAndCoep":{"message":"COOP and COEP"},"models/issues_manager/CrossOriginEmbedderPolicyIssue.ts | samesiteAndSameorigin":{"message":"Same-Site and Same-Origin"},"models/issues_manager/DeprecationIssue.ts | feature":{"message":"Check the feature status page for more details."},"models/issues_manager/DeprecationIssue.ts | milestone":{"message":"This change will go into effect with milestone {milestone}."},"models/issues_manager/DeprecationIssue.ts | title":{"message":"Deprecated feature used"},"models/issues_manager/FederatedAuthRequestIssue.ts | fedCm":{"message":"Federated Credential Management API"},"models/issues_manager/FederatedAuthUserInfoRequestIssue.ts | fedCmUserInfo":{"message":"Federated Credential Management User Info API"},"models/issues_manager/GenericIssue.ts | autocompleteAttributePageTitle":{"message":"HTML attribute: autocomplete"},"models/issues_manager/GenericIssue.ts | corbExplainerPageTitle":{"message":"CORB explainer"},"models/issues_manager/GenericIssue.ts | crossOriginPortalPostMessage":{"message":"Portals - Same-origin communication channels"},"models/issues_manager/GenericIssue.ts | howDoesAutofillWorkPageTitle":{"message":"How does autofill work?"},"models/issues_manager/GenericIssue.ts | inputFormElementPageTitle":{"message":"The form input element"},"models/issues_manager/GenericIssue.ts | labelFormlementsPageTitle":{"message":"The label elements"},"models/issues_manager/HeavyAdIssue.ts | handlingHeavyAdInterventions":{"message":"Handling Heavy Ad Interventions"},"models/issues_manager/Issue.ts | breakingChangeIssue":{"message":"A breaking change issue: the page may stop working in an upcoming version of Chrome"},"models/issues_manager/Issue.ts | breakingChanges":{"message":"Breaking Changes"},"models/issues_manager/Issue.ts | improvementIssue":{"message":"An improvement issue: there is an opportunity to improve the page"},"models/issues_manager/Issue.ts | improvements":{"message":"Improvements"},"models/issues_manager/Issue.ts | pageErrorIssue":{"message":"A page error issue: the page is not working correctly"},"models/issues_manager/Issue.ts | pageErrors":{"message":"Page Errors"},"models/issues_manager/LowTextContrastIssue.ts | colorAndContrastAccessibility":{"message":"Color and contrast accessibility"},"models/issues_manager/MixedContentIssue.ts | preventingMixedContent":{"message":"Preventing mixed content"},"models/issues_manager/QuirksModeIssue.ts | documentCompatibilityMode":{"message":"Document compatibility mode"},"models/issues_manager/SharedArrayBufferIssue.ts | enablingSharedArrayBuffer":{"message":"Enabling SharedArrayBuffer"},"models/logs/logs-meta.ts | clear":{"message":"clear"},"models/logs/logs-meta.ts | doNotPreserveLogOnPageReload":{"message":"Do not preserve log on page reload / navigation"},"models/logs/logs-meta.ts | preserve":{"message":"preserve"},"models/logs/logs-meta.ts | preserveLog":{"message":"Preserve log"},"models/logs/logs-meta.ts | preserveLogOnPageReload":{"message":"Preserve log on page reload / navigation"},"models/logs/logs-meta.ts | recordNetworkLog":{"message":"Record network log"},"models/logs/logs-meta.ts | reset":{"message":"reset"},"models/logs/NetworkLog.ts | anonymous":{"message":""},"models/persistence/EditFileSystemView.ts | add":{"message":"Add"},"models/persistence/EditFileSystemView.ts | enterAPath":{"message":"Enter a path"},"models/persistence/EditFileSystemView.ts | enterAUniquePath":{"message":"Enter a unique path"},"models/persistence/EditFileSystemView.ts | excludedFolders":{"message":"Excluded folders"},"models/persistence/EditFileSystemView.ts | folderPath":{"message":"Folder path"},"models/persistence/EditFileSystemView.ts | none":{"message":"None"},"models/persistence/EditFileSystemView.ts | sViaDevtools":{"message":"{PH1} (via .devtools)"},"models/persistence/IsolatedFileSystem.ts | blobCouldNotBeLoaded":{"message":"Blob could not be loaded."},"models/persistence/IsolatedFileSystem.ts | cantReadFileSS":{"message":"Can't read file: {PH1}: {PH2}"},"models/persistence/IsolatedFileSystem.ts | fileSystemErrorS":{"message":"File system error: {PH1}"},"models/persistence/IsolatedFileSystem.ts | linkedToS":{"message":"Linked to {PH1}"},"models/persistence/IsolatedFileSystem.ts | unknownErrorReadingFileS":{"message":"Unknown error reading file: {PH1}"},"models/persistence/IsolatedFileSystemManager.ts | unableToAddFilesystemS":{"message":"Unable to add filesystem: {PH1}"},"models/persistence/persistence-meta.ts | disableOverrideNetworkRequests":{"message":"Disable override network requests"},"models/persistence/persistence-meta.ts | enableLocalOverrides":{"message":"Enable Local Overrides"},"models/persistence/persistence-meta.ts | enableOverrideNetworkRequests":{"message":"Enable override network requests"},"models/persistence/persistence-meta.ts | interception":{"message":"interception"},"models/persistence/persistence-meta.ts | network":{"message":"network"},"models/persistence/persistence-meta.ts | override":{"message":"override"},"models/persistence/persistence-meta.ts | request":{"message":"request"},"models/persistence/persistence-meta.ts | rewrite":{"message":"rewrite"},"models/persistence/persistence-meta.ts | showWorkspace":{"message":"Show Workspace settings"},"models/persistence/persistence-meta.ts | workspace":{"message":"Workspace"},"models/persistence/PersistenceActions.ts | openInContainingFolder":{"message":"Open in containing folder"},"models/persistence/PersistenceActions.ts | overrideContent":{"message":"Override content"},"models/persistence/PersistenceActions.ts | overrideSourceMappedFileExplanation":{"message":"‘{PH1}’ is a source mapped file and cannot be overridden."},"models/persistence/PersistenceActions.ts | overrideSourceMappedFileWarning":{"message":"Override ‘{PH1}’ instead?"},"models/persistence/PersistenceActions.ts | saveAs":{"message":"Save as..."},"models/persistence/PersistenceActions.ts | saveImage":{"message":"Save image"},"models/persistence/PersistenceActions.ts | showOverrides":{"message":"Show all overrides"},"models/persistence/PersistenceUtils.ts | linkedToS":{"message":"Linked to {PH1}"},"models/persistence/PersistenceUtils.ts | linkedToSourceMapS":{"message":"Linked to source map: {PH1}"},"models/persistence/PlatformFileSystem.ts | unableToReadFilesWithThis":{"message":"PlatformFileSystem cannot read files."},"models/persistence/WorkspaceSettingsTab.ts | addFolder":{"message":"Add folder…"},"models/persistence/WorkspaceSettingsTab.ts | folderExcludePattern":{"message":"Folder exclude pattern"},"models/persistence/WorkspaceSettingsTab.ts | mappingsAreInferredAutomatically":{"message":"Mappings are inferred automatically."},"models/persistence/WorkspaceSettingsTab.ts | remove":{"message":"Remove"},"models/persistence/WorkspaceSettingsTab.ts | workspace":{"message":"Workspace"},"models/timeline_model/TimelineJSProfile.ts | threadS":{"message":"Thread {PH1}"},"models/timeline_model/TimelineModel.ts | dedicatedWorker":{"message":"Dedicated Worker"},"models/timeline_model/TimelineModel.ts | threadS":{"message":"Thread {PH1}"},"models/timeline_model/TimelineModel.ts | workerS":{"message":"Worker — {PH1}"},"models/timeline_model/TimelineModel.ts | workerSS":{"message":"Worker: {PH1} — {PH2}"},"models/workspace/UISourceCode.ts | index":{"message":"(index)"},"models/workspace/UISourceCode.ts | thisFileWasChangedExternally":{"message":"This file was changed externally. Would you like to reload it?"},"panels/accessibility/accessibility-meta.ts | accessibility":{"message":"Accessibility"},"panels/accessibility/accessibility-meta.ts | shoAccessibility":{"message":"Show Accessibility"},"panels/accessibility/AccessibilityNodeView.ts | accessibilityNodeNotExposed":{"message":"Accessibility node not exposed"},"panels/accessibility/AccessibilityNodeView.ts | ancestorChildrenAreAll":{"message":"Ancestor's children are all presentational: "},"panels/accessibility/AccessibilityNodeView.ts | computedProperties":{"message":"Computed Properties"},"panels/accessibility/AccessibilityNodeView.ts | elementHasEmptyAltText":{"message":"Element has empty alt text."},"panels/accessibility/AccessibilityNodeView.ts | elementHasPlaceholder":{"message":"Element has {PH1}."},"panels/accessibility/AccessibilityNodeView.ts | elementIsHiddenBy":{"message":"Element is hidden by active modal dialog: "},"panels/accessibility/AccessibilityNodeView.ts | elementIsHiddenByChildTree":{"message":"Element is hidden by child tree: "},"panels/accessibility/AccessibilityNodeView.ts | elementIsInAnInertSubTree":{"message":"Element is in an inert subtree from "},"panels/accessibility/AccessibilityNodeView.ts | elementIsInert":{"message":"Element is inert."},"panels/accessibility/AccessibilityNodeView.ts | elementIsNotRendered":{"message":"Element is not rendered."},"panels/accessibility/AccessibilityNodeView.ts | elementIsNotVisible":{"message":"Element is not visible."},"panels/accessibility/AccessibilityNodeView.ts | elementIsPlaceholder":{"message":"Element is {PH1}."},"panels/accessibility/AccessibilityNodeView.ts | elementIsPresentational":{"message":"Element is presentational."},"panels/accessibility/AccessibilityNodeView.ts | elementNotInteresting":{"message":"Element not interesting for accessibility."},"panels/accessibility/AccessibilityNodeView.ts | elementsInheritsPresentational":{"message":"Element inherits presentational role from "},"panels/accessibility/AccessibilityNodeView.ts | invalidSource":{"message":"Invalid source."},"panels/accessibility/AccessibilityNodeView.ts | labelFor":{"message":"Label for "},"panels/accessibility/AccessibilityNodeView.ts | noAccessibilityNode":{"message":"No accessibility node"},"panels/accessibility/AccessibilityNodeView.ts | noNodeWithThisId":{"message":"No node with this ID."},"panels/accessibility/AccessibilityNodeView.ts | noTextContent":{"message":"No text content."},"panels/accessibility/AccessibilityNodeView.ts | notSpecified":{"message":"Not specified"},"panels/accessibility/AccessibilityNodeView.ts | partOfLabelElement":{"message":"Part of label element: "},"panels/accessibility/AccessibilityNodeView.ts | placeholderIsPlaceholderOnAncestor":{"message":"{PH1} is {PH2} on ancestor: "},"panels/accessibility/AccessibilityStrings.ts | activeDescendant":{"message":"Active descendant"},"panels/accessibility/AccessibilityStrings.ts | aHumanreadableVersionOfTheValue":{"message":"A human-readable version of the value of a range widget (where necessary)."},"panels/accessibility/AccessibilityStrings.ts | atomicLiveRegions":{"message":"Atomic (live regions)"},"panels/accessibility/AccessibilityStrings.ts | busyLiveRegions":{"message":"Busy (live regions)"},"panels/accessibility/AccessibilityStrings.ts | canSetValue":{"message":"Can set value"},"panels/accessibility/AccessibilityStrings.ts | checked":{"message":"Checked"},"panels/accessibility/AccessibilityStrings.ts | contents":{"message":"Contents"},"panels/accessibility/AccessibilityStrings.ts | controls":{"message":"Controls"},"panels/accessibility/AccessibilityStrings.ts | describedBy":{"message":"Described by"},"panels/accessibility/AccessibilityStrings.ts | description":{"message":"Description"},"panels/accessibility/AccessibilityStrings.ts | disabled":{"message":"Disabled"},"panels/accessibility/AccessibilityStrings.ts | editable":{"message":"Editable"},"panels/accessibility/AccessibilityStrings.ts | elementOrElementsWhichFormThe":{"message":"Element or elements which form the description of this element."},"panels/accessibility/AccessibilityStrings.ts | elementOrElementsWhichMayFormThe":{"message":"Element or elements which may form the name of this element."},"panels/accessibility/AccessibilityStrings.ts | elementOrElementsWhichShouldBe":{"message":"Element or elements which should be considered descendants of this element, despite not being descendants in the DOM."},"panels/accessibility/AccessibilityStrings.ts | elementOrElementsWhoseContentOr":{"message":"Element or elements whose content or presence is/are controlled by this widget."},"panels/accessibility/AccessibilityStrings.ts | elementToWhichTheUserMayChooseTo":{"message":"Element to which the user may choose to navigate after this one, instead of the next element in the DOM order."},"panels/accessibility/AccessibilityStrings.ts | expanded":{"message":"Expanded"},"panels/accessibility/AccessibilityStrings.ts | focusable":{"message":"Focusable"},"panels/accessibility/AccessibilityStrings.ts | focused":{"message":"Focused"},"panels/accessibility/AccessibilityStrings.ts | forARangeWidgetTheMaximumAllowed":{"message":"For a range widget, the maximum allowed value."},"panels/accessibility/AccessibilityStrings.ts | forARangeWidgetTheMinimumAllowed":{"message":"For a range widget, the minimum allowed value."},"panels/accessibility/AccessibilityStrings.ts | fromAttribute":{"message":"From attribute"},"panels/accessibility/AccessibilityStrings.ts | fromCaption":{"message":"From caption"},"panels/accessibility/AccessibilityStrings.ts | fromDescription":{"message":"From description"},"panels/accessibility/AccessibilityStrings.ts | fromLabel":{"message":"From label"},"panels/accessibility/AccessibilityStrings.ts | fromLabelFor":{"message":"From label (for= attribute)"},"panels/accessibility/AccessibilityStrings.ts | fromLabelWrapped":{"message":"From label (wrapped)"},"panels/accessibility/AccessibilityStrings.ts | fromLegend":{"message":"From legend"},"panels/accessibility/AccessibilityStrings.ts | fromNativeHtml":{"message":"From native HTML"},"panels/accessibility/AccessibilityStrings.ts | fromPlaceholderAttribute":{"message":"From placeholder attribute"},"panels/accessibility/AccessibilityStrings.ts | fromRubyAnnotation":{"message":"From ruby annotation"},"panels/accessibility/AccessibilityStrings.ts | fromStyle":{"message":"From style"},"panels/accessibility/AccessibilityStrings.ts | fromTitle":{"message":"From title"},"panels/accessibility/AccessibilityStrings.ts | hasAutocomplete":{"message":"Has autocomplete"},"panels/accessibility/AccessibilityStrings.ts | hasPopup":{"message":"Has popup"},"panels/accessibility/AccessibilityStrings.ts | help":{"message":"Help"},"panels/accessibility/AccessibilityStrings.ts | ifAndHowThisElementCanBeEdited":{"message":"If and how this element can be edited."},"panels/accessibility/AccessibilityStrings.ts | ifThisElementMayReceiveLive":{"message":"If this element may receive live updates, whether the entire live region should be presented to the user on changes, or only changed nodes."},"panels/accessibility/AccessibilityStrings.ts | ifThisElementMayReceiveLiveUpdates":{"message":"If this element may receive live updates, what type of updates should trigger a notification."},"panels/accessibility/AccessibilityStrings.ts | ifThisElementMayReceiveLiveUpdatesThe":{"message":"If this element may receive live updates, the root element of the containing live region."},"panels/accessibility/AccessibilityStrings.ts | ifTrueThisElementCanReceiveFocus":{"message":"If true, this element can receive focus."},"panels/accessibility/AccessibilityStrings.ts | ifTrueThisElementCurrentlyCannot":{"message":"If true, this element currently cannot be interacted with."},"panels/accessibility/AccessibilityStrings.ts | ifTrueThisElementCurrentlyHas":{"message":"If true, this element currently has focus."},"panels/accessibility/AccessibilityStrings.ts | ifTrueThisElementMayBeInteracted":{"message":"If true, this element may be interacted with, but its value cannot be changed."},"panels/accessibility/AccessibilityStrings.ts | ifTrueThisElementsUserentered":{"message":"If true, this element's user-entered value does not conform to validation requirement."},"panels/accessibility/AccessibilityStrings.ts | implicit":{"message":"Implicit"},"panels/accessibility/AccessibilityStrings.ts | implicitValue":{"message":"Implicit value."},"panels/accessibility/AccessibilityStrings.ts | indicatesThePurposeOfThisElement":{"message":"Indicates the purpose of this element, such as a user interface idiom for a widget, or structural role within a document."},"panels/accessibility/AccessibilityStrings.ts | invalidUserEntry":{"message":"Invalid user entry"},"panels/accessibility/AccessibilityStrings.ts | labeledBy":{"message":"Labeled by"},"panels/accessibility/AccessibilityStrings.ts | level":{"message":"Level"},"panels/accessibility/AccessibilityStrings.ts | liveRegion":{"message":"Live region"},"panels/accessibility/AccessibilityStrings.ts | liveRegionRoot":{"message":"Live region root"},"panels/accessibility/AccessibilityStrings.ts | maximumValue":{"message":"Maximum value"},"panels/accessibility/AccessibilityStrings.ts | minimumValue":{"message":"Minimum value"},"panels/accessibility/AccessibilityStrings.ts | multiline":{"message":"Multi-line"},"panels/accessibility/AccessibilityStrings.ts | multiselectable":{"message":"Multi-selectable"},"panels/accessibility/AccessibilityStrings.ts | orientation":{"message":"Orientation"},"panels/accessibility/AccessibilityStrings.ts | pressed":{"message":"Pressed"},"panels/accessibility/AccessibilityStrings.ts | readonlyString":{"message":"Read-only"},"panels/accessibility/AccessibilityStrings.ts | relatedElement":{"message":"Related element"},"panels/accessibility/AccessibilityStrings.ts | relevantLiveRegions":{"message":"Relevant (live regions)"},"panels/accessibility/AccessibilityStrings.ts | requiredString":{"message":"Required"},"panels/accessibility/AccessibilityStrings.ts | role":{"message":"Role"},"panels/accessibility/AccessibilityStrings.ts | selectedString":{"message":"Selected"},"panels/accessibility/AccessibilityStrings.ts | theAccessibleDescriptionForThis":{"message":"The accessible description for this element."},"panels/accessibility/AccessibilityStrings.ts | theComputedHelpTextForThis":{"message":"The computed help text for this element."},"panels/accessibility/AccessibilityStrings.ts | theComputedNameOfThisElement":{"message":"The computed name of this element."},"panels/accessibility/AccessibilityStrings.ts | theDescendantOfThisElementWhich":{"message":"The descendant of this element which is active; i.e. the element to which focus should be delegated."},"panels/accessibility/AccessibilityStrings.ts | theHierarchicalLevelOfThis":{"message":"The hierarchical level of this element."},"panels/accessibility/AccessibilityStrings.ts | theValueOfThisElementThisMayBe":{"message":"The value of this element; this may be user-provided or developer-provided, depending on the element."},"panels/accessibility/AccessibilityStrings.ts | value":{"message":"Value"},"panels/accessibility/AccessibilityStrings.ts | valueDescription":{"message":"Value description"},"panels/accessibility/AccessibilityStrings.ts | valueFromAttribute":{"message":"Value from attribute."},"panels/accessibility/AccessibilityStrings.ts | valueFromDescriptionElement":{"message":"Value from description element."},"panels/accessibility/AccessibilityStrings.ts | valueFromElementContents":{"message":"Value from element contents."},"panels/accessibility/AccessibilityStrings.ts | valueFromFigcaptionElement":{"message":"Value from figcaption element."},"panels/accessibility/AccessibilityStrings.ts | valueFromLabelElement":{"message":"Value from label element."},"panels/accessibility/AccessibilityStrings.ts | valueFromLabelElementWithFor":{"message":"Value from label element with for= attribute."},"panels/accessibility/AccessibilityStrings.ts | valueFromLabelElementWrapped":{"message":"Value from a wrapping label element."},"panels/accessibility/AccessibilityStrings.ts | valueFromLegendElement":{"message":"Value from legend element."},"panels/accessibility/AccessibilityStrings.ts | valueFromNativeHtmlRuby":{"message":"Value from plain HTML ruby annotation."},"panels/accessibility/AccessibilityStrings.ts | valueFromNativeHtmlUnknownSource":{"message":"Value from native HTML (unknown source)."},"panels/accessibility/AccessibilityStrings.ts | valueFromPlaceholderAttribute":{"message":"Value from placeholder attribute."},"panels/accessibility/AccessibilityStrings.ts | valueFromRelatedElement":{"message":"Value from related element."},"panels/accessibility/AccessibilityStrings.ts | valueFromStyle":{"message":"Value from style."},"panels/accessibility/AccessibilityStrings.ts | valueFromTableCaption":{"message":"Value from table caption."},"panels/accessibility/AccessibilityStrings.ts | valueFromTitleAttribute":{"message":"Value from title attribute."},"panels/accessibility/AccessibilityStrings.ts | whetherAndWhatPriorityOfLive":{"message":"Whether and what priority of live updates may be expected for this element."},"panels/accessibility/AccessibilityStrings.ts | whetherAndWhatTypeOfAutocomplete":{"message":"Whether and what type of autocomplete suggestions are currently provided by this element."},"panels/accessibility/AccessibilityStrings.ts | whetherAUserMaySelectMoreThanOne":{"message":"Whether a user may select more than one option from this widget."},"panels/accessibility/AccessibilityStrings.ts | whetherTheOptionRepresentedBy":{"message":"Whether the option represented by this element is currently selected."},"panels/accessibility/AccessibilityStrings.ts | whetherTheValueOfThisElementCan":{"message":"Whether the value of this element can be set."},"panels/accessibility/AccessibilityStrings.ts | whetherThisCheckboxRadioButtonOr":{"message":"Whether this checkbox, radio button or tree item is checked, unchecked, or mixed (e.g. has both checked and un-checked children)."},"panels/accessibility/AccessibilityStrings.ts | whetherThisElementHasCausedSome":{"message":"Whether this element has caused some kind of pop-up (such as a menu) to appear."},"panels/accessibility/AccessibilityStrings.ts | whetherThisElementIsARequired":{"message":"Whether this element is a required field in a form."},"panels/accessibility/AccessibilityStrings.ts | whetherThisElementOrAnother":{"message":"Whether this element, or another grouping element it controls, is expanded."},"panels/accessibility/AccessibilityStrings.ts | whetherThisElementOrItsSubtree":{"message":"Whether this element or its subtree are currently being updated (and thus may be in an inconsistent state)."},"panels/accessibility/AccessibilityStrings.ts | whetherThisLinearElements":{"message":"Whether this linear element's orientation is horizontal or vertical."},"panels/accessibility/AccessibilityStrings.ts | whetherThisTextBoxMayHaveMore":{"message":"Whether this text box may have more than one line."},"panels/accessibility/AccessibilityStrings.ts | whetherThisToggleButtonIs":{"message":"Whether this toggle button is currently in a pressed state."},"panels/accessibility/ARIAAttributesView.ts | ariaAttributes":{"message":"ARIA Attributes"},"panels/accessibility/ARIAAttributesView.ts | noAriaAttributes":{"message":"No ARIA attributes"},"panels/accessibility/AXBreadcrumbsPane.ts | accessibilityTree":{"message":"Accessibility Tree"},"panels/accessibility/AXBreadcrumbsPane.ts | fullTreeExperimentDescription":{"message":"The accessibility tree moved to the top right corner of the DOM tree."},"panels/accessibility/AXBreadcrumbsPane.ts | fullTreeExperimentName":{"message":"Enable full-page accessibility tree"},"panels/accessibility/AXBreadcrumbsPane.ts | ignored":{"message":"Ignored"},"panels/accessibility/AXBreadcrumbsPane.ts | reloadRequired":{"message":"Reload required before the change takes effect."},"panels/accessibility/AXBreadcrumbsPane.ts | scrollIntoView":{"message":"Scroll into view"},"panels/accessibility/SourceOrderView.ts | noSourceOrderInformation":{"message":"No source order information available"},"panels/accessibility/SourceOrderView.ts | showSourceOrder":{"message":"Show source order"},"panels/accessibility/SourceOrderView.ts | sourceOrderViewer":{"message":"Source Order Viewer"},"panels/accessibility/SourceOrderView.ts | thereMayBeADelayInDisplaying":{"message":"There may be a delay in displaying source order for elements with many children"},"panels/animation/animation-meta.ts | animations":{"message":"Animations"},"panels/animation/animation-meta.ts | showAnimations":{"message":"Show Animations"},"panels/animation/AnimationTimeline.ts | animationPreviews":{"message":"Animation previews"},"panels/animation/AnimationTimeline.ts | animationPreviewS":{"message":"Animation Preview {PH1}"},"panels/animation/AnimationTimeline.ts | clearAll":{"message":"Clear all"},"panels/animation/AnimationTimeline.ts | pause":{"message":"Pause"},"panels/animation/AnimationTimeline.ts | pauseAll":{"message":"Pause all"},"panels/animation/AnimationTimeline.ts | pauseTimeline":{"message":"Pause timeline"},"panels/animation/AnimationTimeline.ts | playbackRatePlaceholder":{"message":"{PH1}%"},"panels/animation/AnimationTimeline.ts | playbackRates":{"message":"Playback rates"},"panels/animation/AnimationTimeline.ts | playTimeline":{"message":"Play timeline"},"panels/animation/AnimationTimeline.ts | replayTimeline":{"message":"Replay timeline"},"panels/animation/AnimationTimeline.ts | resumeAll":{"message":"Resume all"},"panels/animation/AnimationTimeline.ts | selectAnEffectAboveToInspectAnd":{"message":"Select an effect above to inspect and modify."},"panels/animation/AnimationTimeline.ts | setSpeedToS":{"message":"Set speed to {PH1}"},"panels/animation/AnimationTimeline.ts | waitingForAnimations":{"message":"Waiting for animations..."},"panels/animation/AnimationUI.ts | animationEndpointSlider":{"message":"Animation Endpoint slider"},"panels/animation/AnimationUI.ts | animationKeyframeSlider":{"message":"Animation Keyframe slider"},"panels/animation/AnimationUI.ts | sSlider":{"message":"{PH1} slider"},"panels/application/application-meta.ts | application":{"message":"Application"},"panels/application/application-meta.ts | clearSiteData":{"message":"Clear site data"},"panels/application/application-meta.ts | clearSiteDataIncludingThirdparty":{"message":"Clear site data (including third-party cookies)"},"panels/application/application-meta.ts | pwa":{"message":"pwa"},"panels/application/application-meta.ts | showApplication":{"message":"Show Application"},"panels/application/application-meta.ts | startRecordingEvents":{"message":"Start recording events"},"panels/application/application-meta.ts | stopRecordingEvents":{"message":"Stop recording events"},"panels/application/ApplicationPanelSidebar.ts | application":{"message":"Application"},"panels/application/ApplicationPanelSidebar.ts | applicationSidebarPanel":{"message":"Application panel sidebar"},"panels/application/ApplicationPanelSidebar.ts | appManifest":{"message":"App Manifest"},"panels/application/ApplicationPanelSidebar.ts | backgroundServices":{"message":"Background services"},"panels/application/ApplicationPanelSidebar.ts | beforeInvokeAlert":{"message":"{PH1}: Invoke to scroll to this section in manifest"},"panels/application/ApplicationPanelSidebar.ts | clear":{"message":"Clear"},"panels/application/ApplicationPanelSidebar.ts | cookies":{"message":"Cookies"},"panels/application/ApplicationPanelSidebar.ts | cookiesUsedByFramesFromS":{"message":"Cookies used by frames from {PH1}"},"panels/application/ApplicationPanelSidebar.ts | documentNotAvailable":{"message":"Document not available"},"panels/application/ApplicationPanelSidebar.ts | frames":{"message":"Frames"},"panels/application/ApplicationPanelSidebar.ts | indexeddb":{"message":"IndexedDB"},"panels/application/ApplicationPanelSidebar.ts | keyPathS":{"message":"Key path: {PH1}"},"panels/application/ApplicationPanelSidebar.ts | localFiles":{"message":"Local Files"},"panels/application/ApplicationPanelSidebar.ts | localStorage":{"message":"Local storage"},"panels/application/ApplicationPanelSidebar.ts | manifest":{"message":"Manifest"},"panels/application/ApplicationPanelSidebar.ts | noManifestDetected":{"message":"No manifest detected"},"panels/application/ApplicationPanelSidebar.ts | onInvokeAlert":{"message":"Scrolled to {PH1}"},"panels/application/ApplicationPanelSidebar.ts | onInvokeManifestAlert":{"message":"Manifest: Invoke to scroll to the top of manifest"},"panels/application/ApplicationPanelSidebar.ts | openedWindows":{"message":"Opened Windows"},"panels/application/ApplicationPanelSidebar.ts | refreshIndexeddb":{"message":"Refresh IndexedDB"},"panels/application/ApplicationPanelSidebar.ts | sessionStorage":{"message":"Session storage"},"panels/application/ApplicationPanelSidebar.ts | storage":{"message":"Storage"},"panels/application/ApplicationPanelSidebar.ts | theContentOfThisDocumentHasBeen":{"message":"The content of this document has been generated dynamically via 'document.write()'."},"panels/application/ApplicationPanelSidebar.ts | thirdPartyPhaseout":{"message":"Cookies from {PH1} may have been blocked due to third-party cookie phaseout."},"panels/application/ApplicationPanelSidebar.ts | versionS":{"message":"Version: {PH1}"},"panels/application/ApplicationPanelSidebar.ts | versionSEmpty":{"message":"Version: {PH1} (empty)"},"panels/application/ApplicationPanelSidebar.ts | webWorkers":{"message":"Web Workers"},"panels/application/ApplicationPanelSidebar.ts | windowWithoutTitle":{"message":"Window without title"},"panels/application/ApplicationPanelSidebar.ts | worker":{"message":"worker"},"panels/application/AppManifestView.ts | actualHeightSpxOfSSDoesNotMatch":{"message":"Actual height ({PH1}px) of {PH2} {PH3} does not match specified height ({PH4}px)"},"panels/application/AppManifestView.ts | actualSizeSspxOfSSDoesNotMatch":{"message":"Actual size ({PH1}×{PH2})px of {PH3} {PH4} does not match specified size ({PH5}×{PH6}px)"},"panels/application/AppManifestView.ts | actualWidthSpxOfSSDoesNotMatch":{"message":"Actual width ({PH1}px) of {PH2} {PH3} does not match specified width ({PH4}px)"},"panels/application/AppManifestView.ts | appIdExplainer":{"message":"This is used by the browser to know whether the manifest should be updating an existing application, or whether it refers to a new web app that can be installed."},"panels/application/AppManifestView.ts | appIdNote":{"message":"{PH1} {PH2} is not specified in the manifest, {PH3} is used instead. To specify an App ID that matches the current identity, set the {PH4} field to {PH5} {PH6}."},"panels/application/AppManifestView.ts | aUrlInTheManifestContainsA":{"message":"A URL in the manifest contains a username, password, or port"},"panels/application/AppManifestView.ts | avoidPurposeAnyAndMaskable":{"message":"Declaring an icon with 'purpose' of 'any maskable' is discouraged. It is likely to look incorrect on some platforms due to too much or too little padding."},"panels/application/AppManifestView.ts | backgroundColor":{"message":"Background color"},"panels/application/AppManifestView.ts | computedAppId":{"message":"Computed App ID"},"panels/application/AppManifestView.ts | copiedToClipboard":{"message":"Copied suggested ID {PH1} to clipboard"},"panels/application/AppManifestView.ts | copyToClipboard":{"message":"Copy suggested ID to clipboard"},"panels/application/AppManifestView.ts | couldNotCheckServiceWorker":{"message":"Could not check service worker without a 'start_url' field in the manifest"},"panels/application/AppManifestView.ts | couldNotDownloadARequiredIcon":{"message":"Could not download a required icon from the manifest"},"panels/application/AppManifestView.ts | customizePwaTitleBar":{"message":"Customize the window controls overlay of your PWA's title bar"},"panels/application/AppManifestView.ts | darkBackgroundColor":{"message":"Dark background color"},"panels/application/AppManifestView.ts | darkThemeColor":{"message":"Dark theme color"},"panels/application/AppManifestView.ts | description":{"message":"Description"},"panels/application/AppManifestView.ts | descriptionMayBeTruncated":{"message":"Description may be truncated."},"panels/application/AppManifestView.ts | display":{"message":"Display"},"panels/application/AppManifestView.ts | documentationOnMaskableIcons":{"message":"documentation on maskable icons"},"panels/application/AppManifestView.ts | downloadedIconWasEmptyOr":{"message":"Downloaded icon was empty or corrupted"},"panels/application/AppManifestView.ts | errorsAndWarnings":{"message":"Errors and warnings"},"panels/application/AppManifestView.ts | formFactor":{"message":"Form factor"},"panels/application/AppManifestView.ts | icon":{"message":"Icon"},"panels/application/AppManifestView.ts | icons":{"message":"Icons"},"panels/application/AppManifestView.ts | identity":{"message":"Identity"},"panels/application/AppManifestView.ts | imageFromS":{"message":"Image from {PH1}"},"panels/application/AppManifestView.ts | installability":{"message":"Installability"},"panels/application/AppManifestView.ts | label":{"message":"Label"},"panels/application/AppManifestView.ts | learnMore":{"message":"Learn more"},"panels/application/AppManifestView.ts | manifestContainsDisplayoverride":{"message":"Manifest contains 'display_override' field, and the first supported display mode must be one of 'standalone', 'fullscreen', or 'minimal-ui'"},"panels/application/AppManifestView.ts | manifestCouldNotBeFetchedIsEmpty":{"message":"Manifest could not be fetched, is empty, or could not be parsed"},"panels/application/AppManifestView.ts | manifestDisplayPropertyMustBeOne":{"message":"Manifest 'display' property must be one of 'standalone', 'fullscreen', or 'minimal-ui'"},"panels/application/AppManifestView.ts | manifestDoesNotContainANameOr":{"message":"Manifest does not contain a 'name' or 'short_name' field"},"panels/application/AppManifestView.ts | manifestDoesNotContainASuitable":{"message":"Manifest does not contain a suitable icon—PNG, SVG, or WebP format of at least {PH1}px is required, the 'sizes' attribute must be set, and the 'purpose' attribute, if set, must include 'any'."},"panels/application/AppManifestView.ts | manifestSpecifies":{"message":"Manifest specifies 'prefer_related_applications: true'"},"panels/application/AppManifestView.ts | manifestStartUrlIsNotValid":{"message":"Manifest 'start_url' is not valid"},"panels/application/AppManifestView.ts | name":{"message":"Name"},"panels/application/AppManifestView.ts | needHelpReadOurS":{"message":"Need help? Read the {PH1}."},"panels/application/AppManifestView.ts | newNoteUrl":{"message":"New note URL"},"panels/application/AppManifestView.ts | noPlayStoreIdProvided":{"message":"No Play store ID provided"},"panels/application/AppManifestView.ts | noScreenshotsForRicherPWAInstallOnDesktop":{"message":"Richer PWA Install UI won’t be available on desktop. Please add at least one screenshot with the form_factor set to wide."},"panels/application/AppManifestView.ts | noScreenshotsForRicherPWAInstallOnMobile":{"message":"Richer PWA Install UI won’t be available on mobile. Please add at least one screenshot for which form_factor is not set or set to a value other than wide."},"panels/application/AppManifestView.ts | noSuppliedIconIsAtLeastSpxSquare":{"message":"No supplied icon is at least {PH1} pixels square in PNG, SVG, or WebP format, with the purpose attribute unset or set to 'any'."},"panels/application/AppManifestView.ts | note":{"message":"Note:"},"panels/application/AppManifestView.ts | orientation":{"message":"Orientation"},"panels/application/AppManifestView.ts | pageDoesNotWorkOffline":{"message":"Page does not work offline"},"panels/application/AppManifestView.ts | pageDoesNotWorkOfflineThePage":{"message":"Page does not work offline. Starting in Chrome 93, the installability criteria are changing, and this site will not be installable. See {PH1} for more information."},"panels/application/AppManifestView.ts | pageHasNoManifestLinkUrl":{"message":"Page has no manifest URL"},"panels/application/AppManifestView.ts | pageIsLoadedInAnIncognitoWindow":{"message":"Page is loaded in an incognito window"},"panels/application/AppManifestView.ts | pageIsNotLoadedInTheMainFrame":{"message":"Page is not loaded in the main frame"},"panels/application/AppManifestView.ts | pageIsNotServedFromASecureOrigin":{"message":"Page is not served from a secure origin"},"panels/application/AppManifestView.ts | platform":{"message":"Platform"},"panels/application/AppManifestView.ts | preferrelatedapplicationsIsOnly":{"message":"'prefer_related_applications' is only supported on Chrome Beta and Stable channels on Android."},"panels/application/AppManifestView.ts | presentation":{"message":"Presentation"},"panels/application/AppManifestView.ts | protocolHandlers":{"message":"Protocol Handlers"},"panels/application/AppManifestView.ts | screenshot":{"message":"Screenshot"},"panels/application/AppManifestView.ts | screenshotPixelSize":{"message":"Screenshot {url} should specify a pixel size [width]x[height] instead of any as first size."},"panels/application/AppManifestView.ts | screenshotS":{"message":"Screenshot #{PH1}"},"panels/application/AppManifestView.ts | screenshotsMustHaveSameAspectRatio":{"message":"All screenshots with the same form_factor must have the same aspect ratio as the first screenshot with that form_factor. Some screenshots will be ignored."},"panels/application/AppManifestView.ts | selectWindowControlsOverlayEmulationOs":{"message":"Emulate the Window Controls Overlay on"},"panels/application/AppManifestView.ts | shortcutS":{"message":"Shortcut #{PH1}"},"panels/application/AppManifestView.ts | shortcutsMayBeNotAvailable":{"message":"The maximum number of shortcuts is platform dependent. Some shortcuts may be not available."},"panels/application/AppManifestView.ts | shortcutSShouldIncludeAXPixel":{"message":"Shortcut #{PH1} should include a 96×96 pixel icon"},"panels/application/AppManifestView.ts | shortName":{"message":"Short name"},"panels/application/AppManifestView.ts | showOnlyTheMinimumSafeAreaFor":{"message":"Show only the minimum safe area for maskable icons"},"panels/application/AppManifestView.ts | sSDoesNotSpecifyItsSizeInThe":{"message":"{PH1} {PH2} does not specify its size in the manifest"},"panels/application/AppManifestView.ts | sSFailedToLoad":{"message":"{PH1} {PH2} failed to load"},"panels/application/AppManifestView.ts | sSHeightDoesNotComplyWithRatioRequirement":{"message":"{PH1} {PH2} height can't be more than 2.3 times as long as the width"},"panels/application/AppManifestView.ts | sSrcIsNotSet":{"message":"{PH1} 'src' is not set"},"panels/application/AppManifestView.ts | sSShouldHaveSquareIcon":{"message":"Most operating systems require square icons. Please include at least one square icon in the array."},"panels/application/AppManifestView.ts | sSShouldSpecifyItsSizeAs":{"message":"{PH1} {PH2} should specify its size as [width]x[height]"},"panels/application/AppManifestView.ts | sSSizeShouldBeAtLeast320":{"message":"{PH1} {PH2} size should be at least 320×320"},"panels/application/AppManifestView.ts | sSSizeShouldBeAtMost3840":{"message":"{PH1} {PH2} size should be at most 3840×3840"},"panels/application/AppManifestView.ts | sSWidthDoesNotComplyWithRatioRequirement":{"message":"{PH1} {PH2} width can't be more than 2.3 times as long as the height"},"panels/application/AppManifestView.ts | startUrl":{"message":"Start URL"},"panels/application/AppManifestView.ts | sUrlSFailedToParse":{"message":"{PH1} URL ''{PH2}'' failed to parse"},"panels/application/AppManifestView.ts | theAppIsAlreadyInstalled":{"message":"The app is already installed"},"panels/application/AppManifestView.ts | themeColor":{"message":"Theme color"},"panels/application/AppManifestView.ts | thePlayStoreAppUrlAndPlayStoreId":{"message":"The Play Store app URL and Play Store ID do not match"},"panels/application/AppManifestView.ts | theSpecifiedApplicationPlatform":{"message":"The specified application platform is not supported on Android"},"panels/application/AppManifestView.ts | tooManyScreenshotsForDesktop":{"message":"No more than 8 screenshots will be displayed on desktop. The rest will be ignored."},"panels/application/AppManifestView.ts | tooManyScreenshotsForMobile":{"message":"No more than 5 screenshots will be displayed on mobile. The rest will be ignored."},"panels/application/AppManifestView.ts | url":{"message":"URL"},"panels/application/AppManifestView.ts | wcoFound":{"message":"Chrome has successfully found the {PH1} value for the {PH2} field in the {PH3}."},"panels/application/AppManifestView.ts | wcoNeedHelpReadMore":{"message":"Need help? Read {PH1}."},"panels/application/AppManifestView.ts | wcoNotFound":{"message":"Define {PH1} in the manifest to use the Window Controls Overlay API and customize your app's title bar."},"panels/application/AppManifestView.ts | windowControlsOverlay":{"message":"Window Controls Overlay"},"panels/application/BackForwardCacheTreeElement.ts | backForwardCache":{"message":"Back/forward cache"},"panels/application/BackgroundServiceView.ts | backgroundFetch":{"message":"Background fetch"},"panels/application/BackgroundServiceView.ts | backgroundServices":{"message":"Background services"},"panels/application/BackgroundServiceView.ts | backgroundSync":{"message":"Background sync"},"panels/application/BackgroundServiceView.ts | clear":{"message":"Clear"},"panels/application/BackgroundServiceView.ts | clickTheRecordButtonSOrHitSTo":{"message":"Click the record button {PH1} or hit {PH2} to start recording."},"panels/application/BackgroundServiceView.ts | devtoolsWillRecordAllSActivity":{"message":"DevTools will record all {PH1} activity for up to 3 days, even when closed."},"panels/application/BackgroundServiceView.ts | empty":{"message":"empty"},"panels/application/BackgroundServiceView.ts | event":{"message":"Event"},"panels/application/BackgroundServiceView.ts | instanceId":{"message":"Instance ID"},"panels/application/BackgroundServiceView.ts | learnMore":{"message":"Learn more"},"panels/application/BackgroundServiceView.ts | noMetadataForThisEvent":{"message":"No metadata for this event"},"panels/application/BackgroundServiceView.ts | notifications":{"message":"Notifications"},"panels/application/BackgroundServiceView.ts | origin":{"message":"Origin"},"panels/application/BackgroundServiceView.ts | paymentHandler":{"message":"Payment handler"},"panels/application/BackgroundServiceView.ts | periodicBackgroundSync":{"message":"Periodic background sync"},"panels/application/BackgroundServiceView.ts | pushMessaging":{"message":"Push messaging"},"panels/application/BackgroundServiceView.ts | recordingSActivity":{"message":"Recording {PH1} activity..."},"panels/application/BackgroundServiceView.ts | saveEvents":{"message":"Save events"},"panels/application/BackgroundServiceView.ts | selectAnEntryToViewMetadata":{"message":"Select an entry to view metadata"},"panels/application/BackgroundServiceView.ts | showEventsForOtherStorageKeys":{"message":"Show events from other storage partitions"},"panels/application/BackgroundServiceView.ts | showEventsFromOtherDomains":{"message":"Show events from other domains"},"panels/application/BackgroundServiceView.ts | startRecordingEvents":{"message":"Start recording events"},"panels/application/BackgroundServiceView.ts | stopRecordingEvents":{"message":"Stop recording events"},"panels/application/BackgroundServiceView.ts | storageKey":{"message":"Storage Key"},"panels/application/BackgroundServiceView.ts | swScope":{"message":"Service Worker Scope"},"panels/application/BackgroundServiceView.ts | timestamp":{"message":"Timestamp"},"panels/application/BounceTrackingMitigationsTreeElement.ts | bounceTrackingMitigations":{"message":"Bounce tracking mitigations"},"panels/application/components/BackForwardCacheStrings.ts | appBanner":{"message":"Pages that requested an AppBanner are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | backForwardCacheDisabled":{"message":"Back/forward cache is disabled by flags. Visit chrome://flags/#back-forward-cache to enable it locally on this device."},"panels/application/components/BackForwardCacheStrings.ts | backForwardCacheDisabledByCommandLine":{"message":"Back/forward cache is disabled by the command line."},"panels/application/components/BackForwardCacheStrings.ts | backForwardCacheDisabledByLowMemory":{"message":"Back/forward cache is disabled due to insufficient memory."},"panels/application/components/BackForwardCacheStrings.ts | backForwardCacheDisabledForDelegate":{"message":"Back/forward cache is not supported by delegate."},"panels/application/components/BackForwardCacheStrings.ts | backForwardCacheDisabledForPrerender":{"message":"Back/forward cache is disabled for prerenderer."},"panels/application/components/BackForwardCacheStrings.ts | broadcastChannel":{"message":"The page cannot be cached because it has a BroadcastChannel instance with registered listeners."},"panels/application/components/BackForwardCacheStrings.ts | cacheControlNoStore":{"message":"Pages with cache-control:no-store header cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | cacheFlushed":{"message":"The cache was intentionally cleared."},"panels/application/components/BackForwardCacheStrings.ts | cacheLimit":{"message":"The page was evicted from the cache to allow another page to be cached."},"panels/application/components/BackForwardCacheStrings.ts | containsPlugins":{"message":"Pages containing plugins are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentFileChooser":{"message":"Pages that use FileChooser API are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentFileSystemAccess":{"message":"Pages that use File System Access API are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentMediaDevicesDispatcherHost":{"message":"Pages that use Media Device Dispatcher are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentMediaPlay":{"message":"A media player was playing upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | contentMediaSession":{"message":"Pages that use MediaSession API and set a playback state are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentMediaSessionService":{"message":"Pages that use MediaSession API and set action handlers are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentScreenReader":{"message":"Back/forward cache is disabled due to screen reader."},"panels/application/components/BackForwardCacheStrings.ts | contentSecurityHandler":{"message":"Pages that use SecurityHandler are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentSerial":{"message":"Pages that use Serial API are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentWebAuthenticationAPI":{"message":"Pages that use WebAuthetication API are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentWebBluetooth":{"message":"Pages that use WebBluetooth API are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | contentWebUSB":{"message":"Pages that use WebUSB API are not eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | cookieDisabled":{"message":"Back/forward cache is disabled because cookies are disabled on a page that uses Cache-Control: no-store."},"panels/application/components/BackForwardCacheStrings.ts | CookieFlushed":{"message":"Undefined"},"panels/application/components/BackForwardCacheStrings.ts | dedicatedWorkerOrWorklet":{"message":"Pages that use a dedicated worker or worklet are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | documentLoaded":{"message":"The document did not finish loading before navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderAppBannerManager":{"message":"App Banner was present upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderChromePasswordManagerClientBindCredentialManager":{"message":"Chrome Password Manager was present upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderDomDistillerSelfDeletingRequestDelegate":{"message":"DOM distillation was in progress upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderDomDistillerViewerSource":{"message":"DOM Distiller Viewer was present upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderExtensionMessaging":{"message":"Back/forward cache is disabled due to extensions using messaging API."},"panels/application/components/BackForwardCacheStrings.ts | embedderExtensionMessagingForOpenPort":{"message":"Extensions with long-lived connection should close the connection before entering back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | embedderExtensions":{"message":"Back/forward cache is disabled due to extensions."},"panels/application/components/BackForwardCacheStrings.ts | embedderExtensionSentMessageToCachedFrame":{"message":"Extensions with long-lived connection attempted to send messages to frames in back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | embedderModalDialog":{"message":"Modal dialog such as form resubmission or http password dialog was shown for the page upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderOfflinePage":{"message":"The offline page was shown upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderOomInterventionTabHelper":{"message":"Out-Of-Memory Intervention bar was present upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderPermissionRequestManager":{"message":"There were permission requests upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderPopupBlockerTabHelper":{"message":"Popup blocker was present upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderSafeBrowsingThreatDetails":{"message":"Safe Browsing details were shown upon navigating away."},"panels/application/components/BackForwardCacheStrings.ts | embedderSafeBrowsingTriggeredPopupBlocker":{"message":"Safe Browsing considered this page to be abusive and blocked popup."},"panels/application/components/BackForwardCacheStrings.ts | enteredBackForwardCacheBeforeServiceWorkerHostAdded":{"message":"A service worker was activated while the page was in back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | errorDocument":{"message":"Back/forward cache is disabled due to a document error."},"panels/application/components/BackForwardCacheStrings.ts | fencedFramesEmbedder":{"message":"Pages using FencedFrames cannot be stored in bfcache."},"panels/application/components/BackForwardCacheStrings.ts | foregroundCacheLimit":{"message":"The page was evicted from the cache to allow another page to be cached."},"panels/application/components/BackForwardCacheStrings.ts | grantedMediaStreamAccess":{"message":"Pages that have granted media stream access are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | haveInnerContents":{"message":"Pages that use portals are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | HTTPAuthRequired":{"message":"Undefined"},"panels/application/components/BackForwardCacheStrings.ts | HTTPMethodNotGET":{"message":"Only pages loaded via a GET request are eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | HTTPStatusNotOK":{"message":"Only pages with a status code of 2XX can be cached."},"panels/application/components/BackForwardCacheStrings.ts | idleManager":{"message":"Pages that use IdleManager are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | indexedDBConnection":{"message":"Pages that have an open IndexedDB connection are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | indexedDBEvent":{"message":"Back/forward cache is disabled due to an IndexedDB event."},"panels/application/components/BackForwardCacheStrings.ts | ineligibleAPI":{"message":"Ineligible APIs were used."},"panels/application/components/BackForwardCacheStrings.ts | injectedJavascript":{"message":"Pages that JavaScript is injected into by extensions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | injectedStyleSheet":{"message":"Pages that a StyleSheet is injected into by extensions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | internalError":{"message":"Internal error."},"panels/application/components/BackForwardCacheStrings.ts | JavaScriptExecution":{"message":"Chrome detected an attempt to execute JavaScript while in the cache."},"panels/application/components/BackForwardCacheStrings.ts | jsNetworkRequestReceivedCacheControlNoStoreResource":{"message":"Back/forward cache is disabled because some JavaScript network request received resource with Cache-Control: no-store header."},"panels/application/components/BackForwardCacheStrings.ts | keepaliveRequest":{"message":"Back/forward cache is disabled due to a keepalive request."},"panels/application/components/BackForwardCacheStrings.ts | keyboardLock":{"message":"Pages that use Keyboard lock are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | LiveMediaStreamTrack":{"message":"Undefined"},"panels/application/components/BackForwardCacheStrings.ts | loading":{"message":"The page did not finish loading before navigating away."},"panels/application/components/BackForwardCacheStrings.ts | mainResourceHasCacheControlNoCache":{"message":"Pages whose main resource has cache-control:no-cache cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | mainResourceHasCacheControlNoStore":{"message":"Pages whose main resource has cache-control:no-store cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | navigationCancelledWhileRestoring":{"message":"Navigation was cancelled before the page could be restored from back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | networkExceedsBufferLimit":{"message":"The page was evicted from the cache because an active network connection received too much data. Chrome limits the amount of data that a page may receive while cached."},"panels/application/components/BackForwardCacheStrings.ts | networkRequestDatapipeDrainedAsBytesConsumer":{"message":"Pages that have inflight fetch() or XHR are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | networkRequestRedirected":{"message":"The page was evicted from back/forward cache because an active network request involved a redirect."},"panels/application/components/BackForwardCacheStrings.ts | networkRequestTimeout":{"message":"The page was evicted from the cache because a network connection was open too long. Chrome limits the amount of time that a page may receive data while cached."},"panels/application/components/BackForwardCacheStrings.ts | noResponseHead":{"message":"Pages that do not have a valid response head cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | notMainFrame":{"message":"Navigation happened in a frame other than the main frame."},"panels/application/components/BackForwardCacheStrings.ts | outstandingIndexedDBTransaction":{"message":"Page with ongoing indexed DB transactions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | outstandingNetworkRequestDirectSocket":{"message":"Pages with an in-flight network request are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | outstandingNetworkRequestFetch":{"message":"Pages with an in-flight fetch network request are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | outstandingNetworkRequestOthers":{"message":"Pages with an in-flight network request are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | outstandingNetworkRequestXHR":{"message":"Pages with an in-flight XHR network request are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | ParserAborted":{"message":"Undefined"},"panels/application/components/BackForwardCacheStrings.ts | paymentManager":{"message":"Pages that use PaymentManager are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | pictureInPicture":{"message":"Pages that use Picture-in-Picture are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | portal":{"message":"Pages that use portals are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | printing":{"message":"Pages that show Printing UI are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | relatedActiveContentsExist":{"message":"The page was opened using 'window.open()' and another tab has a reference to it, or the page opened a window."},"panels/application/components/BackForwardCacheStrings.ts | rendererProcessCrashed":{"message":"The renderer process for the page in back/forward cache crashed."},"panels/application/components/BackForwardCacheStrings.ts | rendererProcessKilled":{"message":"The renderer process for the page in back/forward cache was killed."},"panels/application/components/BackForwardCacheStrings.ts | requestedAudioCapturePermission":{"message":"Pages that have requested audio capture permissions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | requestedBackForwardCacheBlockedSensors":{"message":"Pages that have requested sensor permissions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | requestedBackgroundWorkPermission":{"message":"Pages that have requested background sync or fetch permissions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | requestedMIDIPermission":{"message":"Pages that have requested MIDI permissions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | requestedNotificationsPermission":{"message":"Pages that have requested notifications permissions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | requestedStorageAccessGrant":{"message":"Pages that have requested storage access are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | requestedVideoCapturePermission":{"message":"Pages that have requested video capture permissions are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | schemeNotHTTPOrHTTPS":{"message":"Only pages whose URL scheme is HTTP / HTTPS can be cached."},"panels/application/components/BackForwardCacheStrings.ts | serviceWorkerClaim":{"message":"The page was claimed by a service worker while it is in back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | serviceWorkerPostMessage":{"message":"A service worker attempted to send the page in back/forward cache a MessageEvent."},"panels/application/components/BackForwardCacheStrings.ts | serviceWorkerUnregistration":{"message":"ServiceWorker was unregistered while a page was in back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | serviceWorkerVersionActivation":{"message":"The page was evicted from back/forward cache due to a service worker activation."},"panels/application/components/BackForwardCacheStrings.ts | sessionRestored":{"message":"Chrome restarted and cleared the back/forward cache entries."},"panels/application/components/BackForwardCacheStrings.ts | sharedWorker":{"message":"Pages that use SharedWorker are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | SmartCard":{"message":"Undefined"},"panels/application/components/BackForwardCacheStrings.ts | speechRecognizer":{"message":"Pages that use SpeechRecognizer are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | speechSynthesis":{"message":"Pages that use SpeechSynthesis are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | subframeIsNavigating":{"message":"An iframe on the page started a navigation that did not complete."},"panels/application/components/BackForwardCacheStrings.ts | subresourceHasCacheControlNoCache":{"message":"Pages whose subresource has cache-control:no-cache cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | subresourceHasCacheControlNoStore":{"message":"Pages whose subresource has cache-control:no-store cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | timeout":{"message":"The page exceeded the maximum time in back/forward cache and was expired."},"panels/application/components/BackForwardCacheStrings.ts | timeoutPuttingInCache":{"message":"The page timed out entering back/forward cache (likely due to long-running pagehide handlers)."},"panels/application/components/BackForwardCacheStrings.ts | UnloadHandler":{"message":"Undefined"},"panels/application/components/BackForwardCacheStrings.ts | unloadHandlerExistsInMainFrame":{"message":"The page has an unload handler in the main frame."},"panels/application/components/BackForwardCacheStrings.ts | unloadHandlerExistsInSubFrame":{"message":"The page has an unload handler in a sub frame."},"panels/application/components/BackForwardCacheStrings.ts | userAgentOverrideDiffers":{"message":"Browser has changed the user agent override header."},"panels/application/components/BackForwardCacheStrings.ts | wasGrantedMediaAccess":{"message":"Pages that have granted access to record video or audio are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | webDatabase":{"message":"Pages that use WebDatabase are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | webHID":{"message":"Pages that use WebHID are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | webLocks":{"message":"Pages that use WebLocks are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | webNfc":{"message":"Pages that use WebNfc are not currently eligible for back/forwad cache."},"panels/application/components/BackForwardCacheStrings.ts | webOTPService":{"message":"Pages that use WebOTPService are not currently eligible for bfcache."},"panels/application/components/BackForwardCacheStrings.ts | webRTC":{"message":"Pages with WebRTC cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | webRTCSticky":{"message":"Back/forward cache is disabled because WebRTC has been used."},"panels/application/components/BackForwardCacheStrings.ts | webShare":{"message":"Pages that use WebShare are not currently eligible for back/forwad cache."},"panels/application/components/BackForwardCacheStrings.ts | webSocket":{"message":"Pages with WebSocket cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | webSocketSticky":{"message":"Back/forward cache is disabled because WebSocket has been used."},"panels/application/components/BackForwardCacheStrings.ts | webTransport":{"message":"Pages with WebTransport cannot enter back/forward cache."},"panels/application/components/BackForwardCacheStrings.ts | webTransportSticky":{"message":"Back/forward cache is disabled because WebTransport has been used."},"panels/application/components/BackForwardCacheStrings.ts | webXR":{"message":"Pages that use WebXR are not currently eligible for back/forward cache."},"panels/application/components/BackForwardCacheView.ts | backForwardCacheTitle":{"message":"Back/forward cache"},"panels/application/components/BackForwardCacheView.ts | blankURLTitle":{"message":"Blank URL [{PH1}]"},"panels/application/components/BackForwardCacheView.ts | blockingExtensionId":{"message":"Extension id: "},"panels/application/components/BackForwardCacheView.ts | circumstantial":{"message":"Not Actionable"},"panels/application/components/BackForwardCacheView.ts | circumstantialExplanation":{"message":"These reasons are not actionable i.e. caching was prevented by something outside of the direct control of the page."},"panels/application/components/BackForwardCacheView.ts | filesPerIssue":{"message":"{n, plural, =1 {# file} other {# files}}"},"panels/application/components/BackForwardCacheView.ts | framesPerIssue":{"message":"{n, plural, =1 {# frame} other {# frames}}"},"panels/application/components/BackForwardCacheView.ts | framesTitle":{"message":"Frames"},"panels/application/components/BackForwardCacheView.ts | issuesInMultipleFrames":{"message":"{n, plural, =1 {# issue found in {m} frames.} other {# issues found in {m} frames.}}"},"panels/application/components/BackForwardCacheView.ts | issuesInSingleFrame":{"message":"{n, plural, =1 {# issue found in 1 frame.} other {# issues found in 1 frame.}}"},"panels/application/components/BackForwardCacheView.ts | learnMore":{"message":"Learn more: back/forward cache eligibility"},"panels/application/components/BackForwardCacheView.ts | mainFrame":{"message":"Main Frame"},"panels/application/components/BackForwardCacheView.ts | neverUseUnload":{"message":"Learn more: Never use unload handler"},"panels/application/components/BackForwardCacheView.ts | normalNavigation":{"message":"Not served from back/forward cache: to trigger back/forward cache, use Chrome's back/forward buttons, or use the test button below to automatically navigate away and back."},"panels/application/components/BackForwardCacheView.ts | pageSupportNeeded":{"message":"Actionable"},"panels/application/components/BackForwardCacheView.ts | pageSupportNeededExplanation":{"message":"These reasons are actionable i.e. they can be cleaned up to make the page eligible for back/forward cache."},"panels/application/components/BackForwardCacheView.ts | restoredFromBFCache":{"message":"Successfully served from back/forward cache."},"panels/application/components/BackForwardCacheView.ts | runningTest":{"message":"Running test"},"panels/application/components/BackForwardCacheView.ts | runTest":{"message":"Test back/forward cache"},"panels/application/components/BackForwardCacheView.ts | supportPending":{"message":"Pending Support"},"panels/application/components/BackForwardCacheView.ts | supportPendingExplanation":{"message":"Chrome support for these reasons is pending i.e. they will not prevent the page from being eligible for back/forward cache in a future version of Chrome."},"panels/application/components/BackForwardCacheView.ts | unavailable":{"message":"unavailable"},"panels/application/components/BackForwardCacheView.ts | unknown":{"message":"Unknown Status"},"panels/application/components/BackForwardCacheView.ts | url":{"message":"URL:"},"panels/application/components/BounceTrackingMitigationsView.ts | bounceTrackingMitigationsTitle":{"message":"Bounce tracking mitigations"},"panels/application/components/BounceTrackingMitigationsView.ts | checkingPotentialTrackers":{"message":"Checking for potential bounce tracking sites."},"panels/application/components/BounceTrackingMitigationsView.ts | featureDisabled":{"message":"Bounce tracking mitigations are disabled. To enable them, set the flag at {PH1} to \"Enabled With Deletion\"."},"panels/application/components/BounceTrackingMitigationsView.ts | featureFlag":{"message":"Bounce Tracking Mitigations Feature Flag"},"panels/application/components/BounceTrackingMitigationsView.ts | forceRun":{"message":"Force run"},"panels/application/components/BounceTrackingMitigationsView.ts | learnMore":{"message":"Learn more: Bounce Tracking Mitigations"},"panels/application/components/BounceTrackingMitigationsView.ts | noPotentialBounceTrackersIdentified":{"message":"State was not cleared for any potential bounce tracking sites. Either none were identified or third-party cookies are not blocked."},"panels/application/components/BounceTrackingMitigationsView.ts | runningMitigations":{"message":"Running"},"panels/application/components/BounceTrackingMitigationsView.ts | stateDeletedFor":{"message":"State was deleted for the following sites:"},"panels/application/components/EndpointsGrid.ts | noEndpointsToDisplay":{"message":"No endpoints to display"},"panels/application/components/FrameDetailsView.ts | additionalInformation":{"message":"Additional Information"},"panels/application/components/FrameDetailsView.ts | adStatus":{"message":"Ad Status"},"panels/application/components/FrameDetailsView.ts | aFrameAncestorIsAnInsecure":{"message":"A frame ancestor is an insecure context"},"panels/application/components/FrameDetailsView.ts | apiAvailability":{"message":"API availability"},"panels/application/components/FrameDetailsView.ts | availabilityOfCertainApisDepends":{"message":"Availability of certain APIs depends on the document being cross-origin isolated."},"panels/application/components/FrameDetailsView.ts | available":{"message":"available"},"panels/application/components/FrameDetailsView.ts | availableNotTransferable":{"message":"available, not transferable"},"panels/application/components/FrameDetailsView.ts | availableTransferable":{"message":"available, transferable"},"panels/application/components/FrameDetailsView.ts | child":{"message":"child"},"panels/application/components/FrameDetailsView.ts | childDescription":{"message":"This frame has been identified as a child frame of an ad"},"panels/application/components/FrameDetailsView.ts | clickToRevealInElementsPanel":{"message":"Click to reveal in Elements panel"},"panels/application/components/FrameDetailsView.ts | clickToRevealInNetworkPanel":{"message":"Click to reveal in Network panel"},"panels/application/components/FrameDetailsView.ts | clickToRevealInNetworkPanelMight":{"message":"Click to reveal in Network panel (might require page reload)"},"panels/application/components/FrameDetailsView.ts | clickToRevealInSourcesPanel":{"message":"Click to reveal in Sources panel"},"panels/application/components/FrameDetailsView.ts | contentSecurityPolicy":{"message":"Content Security Policy (CSP)"},"panels/application/components/FrameDetailsView.ts | createdByAdScriptExplanation":{"message":"There was an ad script in the (async) stack when this frame was created. Examining the creation stack trace of this frame might provide more insight."},"panels/application/components/FrameDetailsView.ts | creationStackTrace":{"message":"Frame Creation Stack Trace"},"panels/application/components/FrameDetailsView.ts | creationStackTraceExplanation":{"message":"This frame was created programmatically. The stack trace shows where this happened."},"panels/application/components/FrameDetailsView.ts | creatorAdScript":{"message":"Creator Ad Script"},"panels/application/components/FrameDetailsView.ts | crossoriginIsolated":{"message":"Cross-Origin Isolated"},"panels/application/components/FrameDetailsView.ts | document":{"message":"Document"},"panels/application/components/FrameDetailsView.ts | frameId":{"message":"Frame ID"},"panels/application/components/FrameDetailsView.ts | learnMore":{"message":"Learn more"},"panels/application/components/FrameDetailsView.ts | localhostIsAlwaysASecureContext":{"message":"Localhost is always a secure context"},"panels/application/components/FrameDetailsView.ts | matchedBlockingRuleExplanation":{"message":"This frame is considered an ad frame because its current (or previous) main document is an ad resource."},"panels/application/components/FrameDetailsView.ts | measureMemory":{"message":"Measure Memory"},"panels/application/components/FrameDetailsView.ts | no":{"message":"No"},"panels/application/components/FrameDetailsView.ts | none":{"message":"None"},"panels/application/components/FrameDetailsView.ts | origin":{"message":"Origin"},"panels/application/components/FrameDetailsView.ts | originTrialsExplanation":{"message":"Origin trials give you access to a new or experimental feature."},"panels/application/components/FrameDetailsView.ts | ownerElement":{"message":"Owner Element"},"panels/application/components/FrameDetailsView.ts | parentIsAdExplanation":{"message":"This frame is considered an ad frame because its parent frame is an ad frame."},"panels/application/components/FrameDetailsView.ts | reportingTo":{"message":"reporting to"},"panels/application/components/FrameDetailsView.ts | requiresCrossoriginIsolated":{"message":"requires cross-origin isolated context"},"panels/application/components/FrameDetailsView.ts | root":{"message":"root"},"panels/application/components/FrameDetailsView.ts | rootDescription":{"message":"This frame has been identified as the root frame of an ad"},"panels/application/components/FrameDetailsView.ts | secureContext":{"message":"Secure Context"},"panels/application/components/FrameDetailsView.ts | securityIsolation":{"message":"Security & Isolation"},"panels/application/components/FrameDetailsView.ts | sharedarraybufferConstructorIs":{"message":"SharedArrayBuffer constructor is available and SABs can be transferred via postMessage"},"panels/application/components/FrameDetailsView.ts | sharedarraybufferConstructorIsAvailable":{"message":"SharedArrayBuffer constructor is available but SABs cannot be transferred via postMessage"},"panels/application/components/FrameDetailsView.ts | theFramesSchemeIsInsecure":{"message":"The frame's scheme is insecure"},"panels/application/components/FrameDetailsView.ts | thePerformanceAPI":{"message":"The performance.measureUserAgentSpecificMemory() API is available"},"panels/application/components/FrameDetailsView.ts | thePerformancemeasureuseragentspecificmemory":{"message":"The performance.measureUserAgentSpecificMemory() API is not available"},"panels/application/components/FrameDetailsView.ts | thisAdditionalDebugging":{"message":"This additional (debugging) information is shown because the 'Protocol Monitor' experiment is enabled."},"panels/application/components/FrameDetailsView.ts | transferRequiresCrossoriginIsolatedPermission":{"message":"SharedArrayBuffer transfer requires enabling the permission policy:"},"panels/application/components/FrameDetailsView.ts | unavailable":{"message":"unavailable"},"panels/application/components/FrameDetailsView.ts | unreachableUrl":{"message":"Unreachable URL"},"panels/application/components/FrameDetailsView.ts | url":{"message":"URL"},"panels/application/components/FrameDetailsView.ts | willRequireCrossoriginIsolated":{"message":"⚠️ will require cross-origin isolated context in the future"},"panels/application/components/FrameDetailsView.ts | yes":{"message":"Yes"},"panels/application/components/InterestGroupAccessGrid.ts | allInterestGroupStorageEvents":{"message":"All interest group storage events."},"panels/application/components/InterestGroupAccessGrid.ts | eventTime":{"message":"Event Time"},"panels/application/components/InterestGroupAccessGrid.ts | eventType":{"message":"Access Type"},"panels/application/components/InterestGroupAccessGrid.ts | groupName":{"message":"Name"},"panels/application/components/InterestGroupAccessGrid.ts | groupOwner":{"message":"Owner"},"panels/application/components/InterestGroupAccessGrid.ts | noEvents":{"message":"No interest group events recorded."},"panels/application/components/OriginTrialTreeView.ts | expiryTime":{"message":"Expiry Time"},"panels/application/components/OriginTrialTreeView.ts | isThirdParty":{"message":"Third Party"},"panels/application/components/OriginTrialTreeView.ts | matchSubDomains":{"message":"Subdomain Matching"},"panels/application/components/OriginTrialTreeView.ts | noTrialTokens":{"message":"No trial tokens"},"panels/application/components/OriginTrialTreeView.ts | origin":{"message":"Origin"},"panels/application/components/OriginTrialTreeView.ts | rawTokenText":{"message":"Raw Token"},"panels/application/components/OriginTrialTreeView.ts | status":{"message":"Token Status"},"panels/application/components/OriginTrialTreeView.ts | token":{"message":"Token"},"panels/application/components/OriginTrialTreeView.ts | tokens":{"message":"{PH1} tokens"},"panels/application/components/OriginTrialTreeView.ts | trialName":{"message":"Trial Name"},"panels/application/components/OriginTrialTreeView.ts | usageRestriction":{"message":"Usage Restriction"},"panels/application/components/PermissionsPolicySection.ts | allowedFeatures":{"message":"Allowed Features"},"panels/application/components/PermissionsPolicySection.ts | clickToShowHeader":{"message":"Click to reveal the request whose \"Permissions-Policy\" HTTP header disables this feature."},"panels/application/components/PermissionsPolicySection.ts | clickToShowIframe":{"message":"Click to reveal the top-most iframe which does not allow this feature in the elements panel."},"panels/application/components/PermissionsPolicySection.ts | disabledByFencedFrame":{"message":"disabled inside a fencedframe"},"panels/application/components/PermissionsPolicySection.ts | disabledByHeader":{"message":"disabled by \"Permissions-Policy\" header"},"panels/application/components/PermissionsPolicySection.ts | disabledByIframe":{"message":"missing in iframe \"allow\" attribute"},"panels/application/components/PermissionsPolicySection.ts | disabledFeatures":{"message":"Disabled Features"},"panels/application/components/PermissionsPolicySection.ts | hideDetails":{"message":"Hide details"},"panels/application/components/PermissionsPolicySection.ts | showDetails":{"message":"Show details"},"panels/application/components/ProtocolHandlersView.ts | dropdownLabel":{"message":"Select protocol handler"},"panels/application/components/ProtocolHandlersView.ts | manifest":{"message":"manifest"},"panels/application/components/ProtocolHandlersView.ts | needHelpReadOur":{"message":"Need help? Read {PH1}."},"panels/application/components/ProtocolHandlersView.ts | protocolDetected":{"message":"Found valid protocol handler registration in the {PH1}. With the app installed, test the registered protocols."},"panels/application/components/ProtocolHandlersView.ts | protocolHandlerRegistrations":{"message":"URL protocol handler registration for PWAs"},"panels/application/components/ProtocolHandlersView.ts | protocolNotDetected":{"message":"Define protocol handlers in the {PH1} to register your app as a handler for custom protocols when your app is installed."},"panels/application/components/ProtocolHandlersView.ts | testProtocol":{"message":"Test protocol"},"panels/application/components/ProtocolHandlersView.ts | textboxLabel":{"message":"Query parameter or endpoint for protocol handler"},"panels/application/components/ProtocolHandlersView.ts | textboxPlaceholder":{"message":"Enter URL"},"panels/application/components/ReportsGrid.ts | destination":{"message":"Destination"},"panels/application/components/ReportsGrid.ts | generatedAt":{"message":"Generated at"},"panels/application/components/ReportsGrid.ts | noReportsToDisplay":{"message":"No reports to display"},"panels/application/components/ReportsGrid.ts | status":{"message":"Status"},"panels/application/components/SharedStorageAccessGrid.ts | allSharedStorageEvents":{"message":"All shared storage events for this page."},"panels/application/components/SharedStorageAccessGrid.ts | eventParams":{"message":"Optional Event Params"},"panels/application/components/SharedStorageAccessGrid.ts | eventTime":{"message":"Event Time"},"panels/application/components/SharedStorageAccessGrid.ts | eventType":{"message":"Access Type"},"panels/application/components/SharedStorageAccessGrid.ts | mainFrameId":{"message":"Main Frame ID"},"panels/application/components/SharedStorageAccessGrid.ts | noEvents":{"message":"No shared storage events recorded."},"panels/application/components/SharedStorageAccessGrid.ts | ownerOrigin":{"message":"Owner Origin"},"panels/application/components/SharedStorageAccessGrid.ts | sharedStorage":{"message":"Shared storage"},"panels/application/components/SharedStorageMetadataView.ts | budgetExplanation":{"message":"Remaining data leakage allowed within a 24-hour period for this origin in bits of entropy"},"panels/application/components/SharedStorageMetadataView.ts | creation":{"message":"Creation Time"},"panels/application/components/SharedStorageMetadataView.ts | entropyBudget":{"message":"Entropy Budget for Fenced Frames"},"panels/application/components/SharedStorageMetadataView.ts | notYetCreated":{"message":"Not yet created"},"panels/application/components/SharedStorageMetadataView.ts | numBytesUsed":{"message":"Number of Bytes Used"},"panels/application/components/SharedStorageMetadataView.ts | numEntries":{"message":"Number of Entries"},"panels/application/components/SharedStorageMetadataView.ts | resetBudget":{"message":"Reset Budget"},"panels/application/components/SharedStorageMetadataView.ts | sharedStorage":{"message":"Shared storage"},"panels/application/components/StackTrace.ts | cannotRenderStackTrace":{"message":"Cannot render stack trace"},"panels/application/components/StackTrace.ts | creationStackTrace":{"message":"Frame Creation Stack Trace"},"panels/application/components/StackTrace.ts | showLess":{"message":"Show less"},"panels/application/components/StackTrace.ts | showSMoreFrames":{"message":"{n, plural, =1 {Show # more frame} other {Show # more frames}}"},"panels/application/components/StorageMetadataView.ts | bucketName":{"message":"Bucket name"},"panels/application/components/StorageMetadataView.ts | confirmBucketDeletion":{"message":"Delete the \"{PH1}\" bucket?"},"panels/application/components/StorageMetadataView.ts | defaultBucket":{"message":"Default bucket"},"panels/application/components/StorageMetadataView.ts | deleteBucket":{"message":"Delete bucket"},"panels/application/components/StorageMetadataView.ts | durability":{"message":"Durability"},"panels/application/components/StorageMetadataView.ts | expiration":{"message":"Expiration"},"panels/application/components/StorageMetadataView.ts | isOpaque":{"message":"Is opaque"},"panels/application/components/StorageMetadataView.ts | isThirdParty":{"message":"Is third-party"},"panels/application/components/StorageMetadataView.ts | loading":{"message":"Loading…"},"panels/application/components/StorageMetadataView.ts | no":{"message":"No"},"panels/application/components/StorageMetadataView.ts | none":{"message":"None"},"panels/application/components/StorageMetadataView.ts | opaque":{"message":"(opaque)"},"panels/application/components/StorageMetadataView.ts | origin":{"message":"Origin"},"panels/application/components/StorageMetadataView.ts | persistent":{"message":"Is persistent"},"panels/application/components/StorageMetadataView.ts | quota":{"message":"Quota"},"panels/application/components/StorageMetadataView.ts | topLevelSite":{"message":"Top-level site"},"panels/application/components/StorageMetadataView.ts | yes":{"message":"Yes"},"panels/application/components/StorageMetadataView.ts | yesBecauseAncestorChainHasCrossSite":{"message":"Yes, because the ancestry chain contains a third-party origin"},"panels/application/components/StorageMetadataView.ts | yesBecauseKeyIsOpaque":{"message":"Yes, because the storage key is opaque"},"panels/application/components/StorageMetadataView.ts | yesBecauseOriginNotInTopLevelSite":{"message":"Yes, because the origin is outside of the top-level site"},"panels/application/components/StorageMetadataView.ts | yesBecauseTopLevelIsOpaque":{"message":"Yes, because the top-level site is opaque"},"panels/application/components/TrustTokensView.ts | allStoredTrustTokensAvailableIn":{"message":"All stored private state tokens available in this browser instance."},"panels/application/components/TrustTokensView.ts | deleteTrustTokens":{"message":"Delete all stored private state tokens issued by {PH1}."},"panels/application/components/TrustTokensView.ts | issuer":{"message":"Issuer"},"panels/application/components/TrustTokensView.ts | noTrustTokensStored":{"message":"No private state tokens are currently stored."},"panels/application/components/TrustTokensView.ts | storedTokenCount":{"message":"Stored token count"},"panels/application/components/TrustTokensView.ts | trustTokens":{"message":"Private state tokens"},"panels/application/CookieItemsView.ts | clearAllCookies":{"message":"Clear all cookies"},"panels/application/CookieItemsView.ts | clearFilteredCookies":{"message":"Clear filtered cookies"},"panels/application/CookieItemsView.ts | cookies":{"message":"Cookies"},"panels/application/CookieItemsView.ts | numberOfCookiesShownInTableS":{"message":"Number of cookies shown in table: {PH1}"},"panels/application/CookieItemsView.ts | onlyShowCookiesWhichHaveAn":{"message":"Only show cookies that have an associated issue"},"panels/application/CookieItemsView.ts | onlyShowCookiesWithAnIssue":{"message":"Only show cookies with an issue"},"panels/application/CookieItemsView.ts | selectACookieToPreviewItsValue":{"message":"Select a cookie to preview its value"},"panels/application/CookieItemsView.ts | showUrlDecoded":{"message":"Show URL-decoded"},"panels/application/DOMStorageItemsView.ts | domStorage":{"message":"DOM Storage"},"panels/application/DOMStorageItemsView.ts | domStorageItemDeleted":{"message":"The storage item was deleted."},"panels/application/DOMStorageItemsView.ts | domStorageItems":{"message":"DOM Storage Items"},"panels/application/DOMStorageItemsView.ts | domStorageItemsCleared":{"message":"DOM Storage Items cleared"},"panels/application/DOMStorageItemsView.ts | domStorageNumberEntries":{"message":"Number of entries shown in table: {PH1}"},"panels/application/DOMStorageItemsView.ts | key":{"message":"Key"},"panels/application/DOMStorageItemsView.ts | selectAValueToPreview":{"message":"Select a value to preview"},"panels/application/DOMStorageItemsView.ts | value":{"message":"Value"},"panels/application/IndexedDBViews.ts | clearObjectStore":{"message":"Clear object store"},"panels/application/IndexedDBViews.ts | collapse":{"message":"Collapse"},"panels/application/IndexedDBViews.ts | dataMayBeStale":{"message":"Data may be stale"},"panels/application/IndexedDBViews.ts | deleteDatabase":{"message":"Delete database"},"panels/application/IndexedDBViews.ts | deleteSelected":{"message":"Delete selected"},"panels/application/IndexedDBViews.ts | expandRecursively":{"message":"Expand Recursively"},"panels/application/IndexedDBViews.ts | idb":{"message":"IDB"},"panels/application/IndexedDBViews.ts | indexedDb":{"message":"Indexed DB"},"panels/application/IndexedDBViews.ts | keyGeneratorValueS":{"message":"Key generator value: {PH1}"},"panels/application/IndexedDBViews.ts | keyPath":{"message":"Key path: "},"panels/application/IndexedDBViews.ts | keyString":{"message":"Key"},"panels/application/IndexedDBViews.ts | objectStores":{"message":"Object stores"},"panels/application/IndexedDBViews.ts | pleaseConfirmDeleteOfSDatabase":{"message":"Please confirm delete of \"{PH1}\" database."},"panels/application/IndexedDBViews.ts | primaryKey":{"message":"Primary key"},"panels/application/IndexedDBViews.ts | refresh":{"message":"Refresh"},"panels/application/IndexedDBViews.ts | refreshDatabase":{"message":"Refresh database"},"panels/application/IndexedDBViews.ts | showNextPage":{"message":"Show next page"},"panels/application/IndexedDBViews.ts | showPreviousPage":{"message":"Show previous page"},"panels/application/IndexedDBViews.ts | someEntriesMayHaveBeenModified":{"message":"Some entries may have been modified"},"panels/application/IndexedDBViews.ts | startFromKey":{"message":"Start from key"},"panels/application/IndexedDBViews.ts | totalEntriesS":{"message":"Total entries: {PH1}"},"panels/application/IndexedDBViews.ts | valueString":{"message":"Value"},"panels/application/IndexedDBViews.ts | version":{"message":"Version"},"panels/application/InterestGroupStorageView.ts | clickToDisplayBody":{"message":"Click on any interest group event to display the group's current state"},"panels/application/InterestGroupStorageView.ts | noDataAvailable":{"message":"No details available for the selected interest group. The browser may have left the group."},"panels/application/InterestGroupTreeElement.ts | interestGroups":{"message":"Interest groups"},"panels/application/OpenedWindowDetailsView.ts | accessToOpener":{"message":"Access to opener"},"panels/application/OpenedWindowDetailsView.ts | clickToRevealInElementsPanel":{"message":"Click to reveal in Elements panel"},"panels/application/OpenedWindowDetailsView.ts | closed":{"message":"closed"},"panels/application/OpenedWindowDetailsView.ts | crossoriginEmbedderPolicy":{"message":"Cross-Origin Embedder Policy"},"panels/application/OpenedWindowDetailsView.ts | document":{"message":"Document"},"panels/application/OpenedWindowDetailsView.ts | no":{"message":"No"},"panels/application/OpenedWindowDetailsView.ts | openerFrame":{"message":"Opener Frame"},"panels/application/OpenedWindowDetailsView.ts | reportingTo":{"message":"reporting to"},"panels/application/OpenedWindowDetailsView.ts | security":{"message":"Security"},"panels/application/OpenedWindowDetailsView.ts | securityIsolation":{"message":"Security & Isolation"},"panels/application/OpenedWindowDetailsView.ts | showsWhetherTheOpenedWindowIs":{"message":"Shows whether the opened window is able to access its opener and vice versa"},"panels/application/OpenedWindowDetailsView.ts | type":{"message":"Type"},"panels/application/OpenedWindowDetailsView.ts | unknown":{"message":"Unknown"},"panels/application/OpenedWindowDetailsView.ts | url":{"message":"URL"},"panels/application/OpenedWindowDetailsView.ts | webWorker":{"message":"Web Worker"},"panels/application/OpenedWindowDetailsView.ts | windowWithoutTitle":{"message":"Window without title"},"panels/application/OpenedWindowDetailsView.ts | worker":{"message":"worker"},"panels/application/OpenedWindowDetailsView.ts | yes":{"message":"Yes"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | action":{"message":"Action"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | status":{"message":"Status"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | statusFailure":{"message":"Failure"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | statusNotTriggered":{"message":"Not triggered"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | statusPending":{"message":"Pending"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | statusReady":{"message":"Ready"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | statusRunning":{"message":"Running"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | statusSuccess":{"message":"Success"},"panels/application/preloading/components/MismatchedPreloadingGrid.ts | url":{"message":"URL"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | buttonClickToInspect":{"message":"Click to inspect prerendered page"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | buttonClickToRevealRuleSet":{"message":"Click to reveal rule set"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | buttonInspect":{"message":"Inspect"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailedStatusFailure":{"message":"Speculative load failed."},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailedStatusNotTriggered":{"message":"Speculative load attempt is not yet triggered."},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailedStatusPending":{"message":"Speculative load attempt is eligible but pending."},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailedStatusReady":{"message":"Speculative load finished and the result is ready for the next navigation."},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailedStatusRunning":{"message":"Speculative load is running."},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailedStatusSuccess":{"message":"Speculative load finished and used for a navigation."},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailsAction":{"message":"Action"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailsDetailedInformation":{"message":"Detailed information"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailsFailureReason":{"message":"Failure reason"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailsRuleSet":{"message":"Rule set"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | detailsStatus":{"message":"Status"},"panels/application/preloading/components/PreloadingDetailsReportView.ts | selectAnElementForMoreDetails":{"message":"Select an element for more details"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | descriptionDisabledByBatterySaver":{"message":"Speculative loading is disabled because of the operating system's Battery Saver mode."},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | descriptionDisabledByDataSaver":{"message":"Speculative loading is disabled because of the operating system's Data Saver mode."},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | descriptionDisabledByHoldbackPrefetchSpeculationRules":{"message":"Prefetch is forced-enabled because DevTools is open. When DevTools is closed, prefetch will be disabled because this browser session is part of a holdback group used for performance comparisons."},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | descriptionDisabledByHoldbackPrerenderSpeculationRules":{"message":"Prerendering is forced-enabled because DevTools is open. When DevTools is closed, prerendering will be disabled because this browser session is part of a holdback group used for performance comparisons."},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | descriptionDisabledByPreference":{"message":"Speculative loading is disabled because of user settings or an extension. Go to {PH1} to update your preference. Go to {PH2} to disable any extension that blocks speculative loading."},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | extensionsSettings":{"message":"Extensions settings"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | footerLearnMore":{"message":"Learn more"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | headerDisabledByBatterySaver":{"message":"Battery Saver"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | headerDisabledByDataSaver":{"message":"Data Saver"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | headerDisabledByHoldbackPrefetchSpeculationRules":{"message":"Prefetch was disabled, but is force-enabled now"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | headerDisabledByHoldbackPrerenderSpeculationRules":{"message":"Prerendering was disabled, but is force-enabled now"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | headerDisabledByPreference":{"message":"User settings or extensions"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | infobarPreloadingIsDisabled":{"message":"Speculative loading is disabled"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | infobarPreloadingIsForceEnabled":{"message":"Speculative loading is force-enabled"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | preloadingPagesSettings":{"message":"Preload pages settings"},"panels/application/preloading/components/PreloadingDisabledInfobar.ts | titleReasonsPreventingPreloading":{"message":"Reasons preventing speculative loading"},"panels/application/preloading/components/PreloadingGrid.ts | action":{"message":"Action"},"panels/application/preloading/components/PreloadingGrid.ts | ruleSet":{"message":"Rule set"},"panels/application/preloading/components/PreloadingGrid.ts | status":{"message":"Status"},"panels/application/preloading/components/PreloadingMismatchedHeadersGrid.ts | activationNavigationValue":{"message":"Value in activation navigation"},"panels/application/preloading/components/PreloadingMismatchedHeadersGrid.ts | headerName":{"message":"Header name"},"panels/application/preloading/components/PreloadingMismatchedHeadersGrid.ts | initialNavigationValue":{"message":"Value in initial navigation"},"panels/application/preloading/components/PreloadingMismatchedHeadersGrid.ts | missing":{"message":"(missing)"},"panels/application/preloading/components/PreloadingString.ts | PrefetchEvictedAfterCandidateRemoved":{"message":"The prefetch was discarded because no speculation rule in the initating page triggers a prefetch for this URL anymore."},"panels/application/preloading/components/PreloadingString.ts | PrefetchEvictedForNewerPrefetch":{"message":"The prefetch was discarded because the initiating page has too many prefetches ongoing, and this was one of the oldest."},"panels/application/preloading/components/PreloadingString.ts | PrefetchFailedIneligibleRedirect":{"message":"The prefetch was redirected, but the redirect URL is not eligible for prefetch."},"panels/application/preloading/components/PreloadingString.ts | PrefetchFailedInvalidRedirect":{"message":"The prefetch was redirected, but there was a problem with the redirect."},"panels/application/preloading/components/PreloadingString.ts | PrefetchFailedMIMENotSupported":{"message":"The prefetch failed because the response's Content-Type header was not supported."},"panels/application/preloading/components/PreloadingString.ts | PrefetchFailedNetError":{"message":"The prefetch failed because of a network error."},"panels/application/preloading/components/PreloadingString.ts | PrefetchFailedNon2XX":{"message":"The prefetch failed because of a non-2xx HTTP response status code."},"panels/application/preloading/components/PreloadingString.ts | PrefetchFailedPerPageLimitExceeded":{"message":"The prefetch was not performed because the initiating page already has too many prefetches ongoing."},"panels/application/preloading/components/PreloadingString.ts | PrefetchIneligibleRetryAfter":{"message":"A previous prefetch to the origin got a HTTP 503 response with an Retry-After header that has not elapsed yet."},"panels/application/preloading/components/PreloadingString.ts | PrefetchIsPrivacyDecoy":{"message":"The URL was not eligible to be prefetched because there was a registered service worker or cross-site cookies for that origin, but the prefetch was put on the network anyways and not used, to disguise that the user had some kind of previous relationship with the origin."},"panels/application/preloading/components/PreloadingString.ts | PrefetchIsStale":{"message":"Too much time elapsed between the prefetch and usage, so the prefetch was discarded."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleBatterySaverEnabled":{"message":"The prefetch was not performed because the Battery Saver setting was enabled."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleBrowserContextOffTheRecord":{"message":"The prefetch was not performed because the browser is in Incognito or Guest mode."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleDataSaverEnabled":{"message":"The prefetch was not performed because the operating system is in Data Saver mode."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleExistingProxy":{"message":"The URL is not eligible to be prefetched, because in the default network context it is configured to use a proxy server."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleHostIsNonUnique":{"message":"The URL was not eligible to be prefetched because its host was not unique (e.g., a non publicly routable IP address or a hostname which is not registry-controlled), but the prefetch was required to be proxied."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleNonDefaultStoragePartition":{"message":"The URL was not eligible to be prefetched because it uses a non-default storage partition."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligiblePreloadingDisabled":{"message":"The prefetch was not performed because speculative loading was disabled."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy":{"message":"The URL was not eligible to be prefetched because the default network context cannot be configured to use the prefetch proxy for a same-site cross-origin prefetch request."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleSchemeIsNotHttps":{"message":"The URL was not eligible to be prefetched because its scheme was not https:."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleUserHasCookies":{"message":"The URL was not eligible to be prefetched because it was cross-site, but the user had cookies for that origin."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotEligibleUserHasServiceWorker":{"message":"The URL was not eligible to be prefetched because there was a registered service worker for that origin, which is currently not supported."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotUsedCookiesChanged":{"message":"The prefetch was not used because it was a cross-site prefetch, and cookies were added for that URL while the prefetch was ongoing, so the prefetched response is now out-of-date."},"panels/application/preloading/components/PreloadingString.ts | PrefetchNotUsedProbeFailed":{"message":"The prefetch was blocked by your Internet Service Provider or network administrator."},"panels/application/preloading/components/PreloadingString.ts | PrefetchProxyNotAvailable":{"message":"A network error was encountered when trying to set up a connection to the prefetching proxy."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusActivatedDuringMainFrameNavigation":{"message":"Prerendered page activated during initiating page's main frame navigation."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusActivatedWithAuxiliaryBrowsingContexts":{"message":"The prerender was not used because during activation time, there were other windows with an active opener reference to the initiating page, which is currently not supported."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusActivationFramePolicyNotCompatible":{"message":"The prerender was not used because the sandboxing flags or permissions policy of the initiating page was not compatible with those of the prerendering page."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusActivationNavigationParameterMismatch":{"message":"The prerender was not used because during activation time, different navigation parameters (e.g., HTTP headers) were calculated than during the original prerendering navigation request."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusActivationUrlHasEffectiveUrl":{"message":"The prerender was not used because during activation time, navigation has an effective URL that is different from its normal URL. (For example, the New Tab Page, or hosted apps.)"},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusAudioOutputDeviceRequested":{"message":"The prerendered page requested audio output, which is currently not supported."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusBatterySaverEnabled":{"message":"The prerender was not performed because the user requested that the browser use less battery."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusBlockedByClient":{"message":"Some resource load was blocked."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusClientCertRequested":{"message":"The prerendering navigation required a HTTP client certificate."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusCrossSiteNavigationInInitialNavigation":{"message":"The prerendering navigation failed because it targeted a cross-site URL."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusCrossSiteNavigationInMainFrameNavigation":{"message":"The prerendered page navigated to a cross-site URL."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusCrossSiteRedirectInInitialNavigation":{"message":"The prerendering navigation failed because the prerendered URL redirected to a cross-site URL."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusCrossSiteRedirectInMainFrameNavigation":{"message":"The prerendered page navigated to a URL which redirected to a cross-site URL."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusDataSaverEnabled":{"message":"The prerender was not performed because the user requested that the browser use less data."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusDownload":{"message":"The prerendered page attempted to initiate a download, which is currently not supported."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusHasEffectiveUrl":{"message":"The initiating page cannot perform prerendering, because it has an effective URL that is different from its normal URL. (For example, the New Tab Page, or hosted apps.)"},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusInvalidSchemeNavigation":{"message":"The URL was not eligible to be prerendered because its scheme was not http: or https:."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusInvalidSchemeRedirect":{"message":"The prerendering navigation failed because it redirected to a URL whose scheme was not http: or https:."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusLoginAuthRequested":{"message":"The prerendering navigation required HTTP authentication, which is currently not supported."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusLowEndDevice":{"message":"The prerender was not performed because this device does not have enough total system memory to support prerendering."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMainFrameNavigation":{"message":"The prerendered page navigated itself to another URL, which is currently not supported."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMaxNumOfRunningEagerPrerendersExceeded":{"message":"The prerender whose eagerness is \"eager\" was not performed because the initiating page already has too many prerenders ongoing. Remove other speculation rules with \"eager\" to enable further prerendering."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMaxNumOfRunningEmbedderPrerendersExceeded":{"message":"The browser-triggered prerender was not performed because the initiating page already has too many prerenders ongoing."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMaxNumOfRunningNonEagerPrerendersExceeded":{"message":"The old non-eager prerender (with a \"moderate\" or \"conservative\" eagerness and triggered by hovering or clicking links) was automatically canceled due to starting a new non-eager prerender. It can be retriggered by interacting with the link again."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMemoryLimitExceeded":{"message":"The prerender was not performed because the browser exceeded the prerendering memory limit."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMemoryPressureAfterTriggered":{"message":"The prerendered page was unloaded because the browser came under critical memory pressure."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMemoryPressureOnTrigger":{"message":"The prerender was not performed because the browser was under critical memory pressure."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMixedContent":{"message":"The prerendered page contained mixed content."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusMojoBinderPolicy":{"message":"The prerendered page used a forbidden JavaScript API that is currently not supported. (Internal Mojo interface: {PH1})"},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusNavigationBadHttpStatus":{"message":"The prerendering navigation failed because of a non-2xx HTTP response status code."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusNavigationRequestBlockedByCsp":{"message":"The prerendering navigation was blocked by a Content Security Policy."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusNavigationRequestNetworkError":{"message":"The prerendering navigation encountered a network error."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusPreloadingDisabled":{"message":"The prerender was not performed because the user disabled preloading in their browser settings."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusPrerenderingDisabledByDevTools":{"message":"The prerender was not performed because DevTools has been used to disable prerendering."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusPrerenderingUrlHasEffectiveUrl":{"message":"The prerendering navigation failed because it has an effective URL that is different from its normal URL. (For example, the New Tab Page, or hosted apps.)"},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusPrimaryMainFrameRendererProcessCrashed":{"message":"The initiating page crashed."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusPrimaryMainFrameRendererProcessKilled":{"message":"The initiating page was killed."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusRedirectedPrerenderingUrlHasEffectiveUrl":{"message":"The prerendering navigation failed because it redirected to an effective URL that is different from its normal URL. (For example, the New Tab Page, or hosted apps.)"},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusRendererProcessCrashed":{"message":"The prerendered page crashed."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusRendererProcessKilled":{"message":"The prerendered page was killed."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusSameSiteCrossOriginNavigationNotOptInInInitialNavigation":{"message":"The prerendering navigation failed because it was to a cross-origin same-site URL, but the destination response did not include the appropriate Supports-Loading-Mode header."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusSameSiteCrossOriginNavigationNotOptInInMainFrameNavigation":{"message":"The prerendered page navigated to a cross-origin same-site URL, but the destination response did not include the appropriate Supports-Loading-Mode header."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusSameSiteCrossOriginRedirectNotOptInInInitialNavigation":{"message":"The prerendering navigation failed because the prerendered URL redirected to a cross-origin same-site URL, but the destination response did not include the appropriate Supports-Loading-Mode header."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusSameSiteCrossOriginRedirectNotOptInInMainFrameNavigation":{"message":"The prerendered page navigated to a URL which redirected to a cross-origin same-site URL, but the destination response did not include the appropriate Supports-Loading-Mode header."},"panels/application/preloading/components/PreloadingString.ts | prerenderFinalStatusSpeculationRuleRemoved":{"message":"The prerendered page was unloaded because the initiating page removed the corresponding prerender rule from