diff --git a/.ado/jobs/build-test-rntester.yml b/.ado/jobs/build-test-rntester.yml index bfee842fac2946..12d62e500bd845 100644 --- a/.ado/jobs/build-test-rntester.yml +++ b/.ado/jobs/build-test-rntester.yml @@ -105,6 +105,13 @@ jobs: set -eox pipefail yarn install --immutable + - task: CmdLine@2 + displayName: yarn build + inputs: + script: | + set -eox pipefail + yarn build + - task: CmdLine@2 displayName: pod install inputs: diff --git a/.ado/templates/apple-steps-publish.yml b/.ado/templates/apple-steps-publish.yml index a2dc3987245491..2af3b77e343637 100644 --- a/.ado/templates/apple-steps-publish.yml +++ b/.ado/templates/apple-steps-publish.yml @@ -43,7 +43,7 @@ steps: displayName: Run publish-npm.js inputs: script: | - node ./scripts/publish-npm.js -t ${{ parameters.build_type }} + node ./scripts/releases-ci/publish-npm.js -t ${{ parameters.build_type }} env: # Map the corresponding CircleCI variable since `publish-npm.js` depends on it. CIRCLE_TAG: $(RNM_PACKAGE_VERSION) diff --git a/.buckconfig b/.buckconfig deleted file mode 100644 index 3f1b5c6d11f092..00000000000000 --- a/.buckconfig +++ /dev/null @@ -1,20 +0,0 @@ - -[android] - target = android-31 - -[kotlin] - compile_against_abis = True - kotlin_version = 1.6.10 - -[download] - max_number_of_retries = 3 - -[maven_repositories] - central = https://repo1.maven.org/maven2 - google = https://maven.google.com/ - -[alias] - rntester = //packages/rn-tester/android/app:app - -[buildfile] - includes = //tools/build_defs/oss/preload.bzl diff --git a/.buckjavaargs b/.buckjavaargs deleted file mode 100644 index 11452478196f70..00000000000000 --- a/.buckjavaargs +++ /dev/null @@ -1 +0,0 @@ --Xmx512m -XX:+HeapDumpOnOutOfMemoryError diff --git a/.circleci/README.md b/.circleci/README.md index 9c944ef6d105c0..0ae32f93c4d13c 100644 --- a/.circleci/README.md +++ b/.circleci/README.md @@ -1,5 +1,172 @@ # Circle CI -This directory is home to the Circle CI configuration file. Circle is our continuous integration service provider. You can see the overall status of React Native's builds at https://circleci.com/gh/facebook/react-native +This directory is home to the Circle CI configuration files. Circle is our continuous integration service provider. You can see the overall status of React Native's builds at https://circleci.com/gh/facebook/react-native You may also see an individual PR's build status by scrolling down to the Checks section in the PR. + +## Purposes + +We use CircleCI for mainly 3 purposes: + +1. Testing changes +2. Release Nightlies +3. Release Stable Versions of React Native + +When testing changes, we run all the tests on commits that lands on `main`. For commits in PR, we try to understand which kind of changes the PR is about and we try to selectively run only the relevant tests. so, for example, if a PR only touches iOS files, we are going to run only iOS tests. + +A Nighly job runs every day at around 9:00 PM, GMT. They run from `main` and they publish a version of React Native using the current state of the codebase, creating a version number that follows the format: `0..0-nightly--`. +The nightly job also publish all the monorepo packages, taking care of updating the transitive dependencies of those packages. + +Stable versions are released manually by the Release Crew and they run from a stable branch. Stable branches have the shape of `0.-stable`. + +## How It Works? + +CircleCI execution is now split in two steps: +- Setup +- Testing + +The setup step takes care of analyzing the changes in the PR and of deciding which jobs needs to run. + +The testing flow is a set of workflows that executes the required tests. + +### Setup + +The code of the setup workflow lives in the root [`config.yml`](https://github.com/facebook/react-native/blob/main/.circleci/config.yml) file. +It uses the `Continuation orb` from CircleCI to start a CI flow that depends on the changes present in the PR. + +If the changes are not coming from a PR (either a simple commit or if the CI is running on main) **we always run all the tests** as a cautionary measure. + +The setup job has also to expose all the pipeline parameters that we would need to pass to the actual workflow. Those parameters are **automatically forwarded** to the workflows that are started as a result of the setup. + +The setup job uses a JS script to carry on its logic. The [`pipeline_selection.js`](https://github.com/facebook/react-native/blob/main/scripts/circleci/pipeline_selection.js) script can be invoked with two commands: +- `filter-jobs` +- `create-configs` + +The **`filter-jobs`** command takes care of creating a JSON representation of the tests we need to run based on the changes in the PR. + +The **`create-configs`** command consumes the JSON representation to create a CircleCI configuration that can then executes all the required tests. + +#### Creating a Configuration + +To create a configuration, the `pipeline-selection` scripts collates together various pieces of `YML` files that lives in the [`Configurations` folder](https://github.com/facebook/react-native/tree/main/.circleci/configurations). + +The order in which these files are appended is **important** and it always contains the following.: + +1. `top_level.yml`: this file contains some high level directives for CircleCI, like the version, the list of orbs, the cache-keys, and the pipeline parameters that can be used by the workflows. +2. `executors.yml`: this file contains the list of the executors used in our jobs and their configurations. +3. `commands.yml`: this file contains all the commands that can be used by jobs to executes. Commands are reusable functions that are shared by multiple jobs. +4. `jobs.yml`: this file contains the jobs that are used by workflows to carry on some specific tasks. They are composed of sequential commands. +5. `workflows.yml`: this file contains the shared workflows that needs to (or can) be always executed, no matter which kind of changes are pushed to CI. An example of these workflows is `analysis` (which is always executed) or `nightly` (which can be executed if a specific pipeline parameter is passed to the CI). + +Then, the `pipeline_selection create-configs` attach some specific test workflows, depending on the changes that are present in the PR. These change-dependent workflows live in the [`test_workflows`](https://github.com/facebook/react-native/tree/main/.circleci/configurations/test_workflows) folder. +These workflows are: +* `testAll.yml` => runs all the possible tests. This workflow is executed on main and on PRs which change set touches both iOS and Android +* `testAndroid.yml` => runs all the build steps and Android tests. This is used on changes that happens on the Android codebase and infra (`ReactAndroid` folder) +* `testIOS.yml` => runs all the build steps and iOS tests. This is used on changes that happens on the iOS codebase and infra (`React` folder) +* `testE2E.yml` => runs the E2E tests. As of today, E2E tests can be triggered if the commit message contains the `#run-e2e-tests` tag. +* `testJS.yml` => For all the changes that do not touch native/platform code, we only run JS tests. + +Notice that if there are changes on files that do not represents code (for example `.md` files like this one or the `Changelog`) we don't run any CI. + +## Test workflows + +The test workflows for native code are composed of 2 parts: +- building React Native +- testing + +Building React Native requires us to build several parts of it: +1. We need to build the Hermes JS engine +2. We need to build Android to create prebuilds +3. We need to package everything in an npm package that will mimic a React native release +4. We need to create a local maven repository + +### Building Hermes Engine + +#### Android +The `build_android` workflows takes care of building the Android version of Hermes and to put it properly in a local maven repository. +See the [Build Android](#build_android) section below. + +#### iOS +Hermes is a very complicated item to build for iOS. +It is composed of the Hermes compiler (HermesC) and of the actual engine. + +Hermes is shipped as a universal XCFramework. This means that we need to build all the architecture slices and then put them together in the XCFramework archive. +We also need to build 2 configurations: Debug and Release. + +In order to be efficient and to save costs, we parallelize the process as much as possible: + +1. We prepare the environment for building Hermes. +2. We build HermesC which is required by all the slices. +3. We start 8 jobs to build all the required slices in parallel: + 1. `iphone` slice, Debug mode + 1. `iphonesimulator` slice, Debug mode + 1. `macos` slice, Debug mode + 1. `catalyst` slice, Debug mode + 1. `iphone` slice, Release mode + 1. `iphonesimulator` slice, Release mode + 1. `macos` slice, Release mode + 1. `catalyst` slice, Release mode +4. We then have 2 jobs to create the Debug and Release tarballs in parallel. + 1. The Debug job receives the 4 Debug slices + 1. The Release job receives the 4 Release slices + +The `Debug` and `Release` tarball are then uploaded as artifacts. Notice that these we use these artifacts to **test the release** of React Native. + +While building Hermes, we take also care of building the dSYMs. A dSYM (Debug Symbols) is an archive that contains the Debug Symbols that users can load to de-symbolicate the Hermes Stack traces. These symbols are published when we create a React Native release. + +A lot of these build steps are automated by some shell scripts that lives in the [`react-native/packages/react-native/sdks/hermes-engine/utils` folder](https://github.com/facebook/react-native/tree/main/packages/react-native/sdks/hermes-engine/utils). + +### Build Android + +The android build is all managed by Gradle, so building android should be as easy as calling a [`gradle` command](https://github.com/facebook/react-native/blob/main/.circleci/configurations/jobs.yml#L268-L274). + +The relevant part here is that the build android generates a `maven-local` repository that is passed to the [`build_npm_package`](https://github.com/facebook/react-native/blob/main/.circleci/configurations/jobs.yml#L1182) and that we use to test the releases. + +### Build NPM package + +This job is the responsible to create an NPM package that is suitable to be released or tested in CI. +If we are in a release flow (for example the Nightly workflow), it also proceed with the publication. + +The job can be invoked with different parameters: +- `dry-run` => it does not publish anything, but prepare the artifacts to be used for testing +- `nightly` => it creates the artifacts and publish a nightly version of React Native. +- `release` => it creates the artifacts and publish a stable version of React Native. + +The build NPM package takes all the artifacts produced in the previous steps (iOS' Hermes, iOS' Hermes dSYMs, Android's `maven-local`) and creates an npm package packing all the code. + +If in a release mode, it also proceed publishing the NPM package to NPM, and the artifacts to Maven central, which we use to distribute all the artifacts. + +This job also uploads the `maven-local` repository and a zipped version of the npm package to CircleCI's artifacts. We use these artifacts to **test the release** of React Native. + +## Testing React Native +React Native tests runs in two different scenarios: +- RNTester +- A New App + +### RNTester +RNTester is our internal testing app. It is a fully working React Native app that lives in the [`react-native/packages/rn-tester` folder](https://github.com/facebook/react-native/tree/main/packages/rn-tester) of the repository. +RNTester is an app which contains code that exercise most part of the React Native frameworks. +It also has the feature of building React Native **from source**. For that reason, it does not have to wait for the NPM package to be ready, but RNTester's tests can start as soon as the `build_android` step and the step that builds Hermes for iOS are done. + +Notice the Tests on RNTester for iOS consumes the Hermes engine that is built in the previous steps. + +For Android, these tests creates an APK that is uploaded as an artifact in CircleCI. We use these artifacts to **test the releases** of React Native.. + +### A New App +The React Native repo contains a template app in the [`react-native/packages/react-native/template` folder]() that is used to spin up a new application that is preconfigured with React Native. + +We have several tests that we run starting from the template, testing various configurations: +- Debug/Release +- JSC/Hermes (two different JS engine we support) +- New/Old Architecture (two different Architectures for React Native) + +We want to test all the React Native changes against the template, but we can't publish a React native version on each change that is merged. Therefore, to run tests on the template we use a NPM registry proxy called [Verdaccio](https://verdaccio.org/). + +When running a Template test our CI follows roughly these steps: +1. Prepare the executor +2. Start a Verdaccio server +3. Publish on Verdaccio all the monorepo [packages](https://github.com/facebook/react-native/tree/main/packages) on which React Native depends on. +4. Publish on Verdaccio the react-native NPM package that has been created in the NPM step +5. Spin up a new React native apps from the template, downloading react-native from Verdaccio. + +In this way, we are sure that we can test all the changes that happen in React Native on a new React Native app. diff --git a/.circleci/config.yml b/.circleci/config.yml index 2eb4a63b33d3d2..94fed2af278951 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -35,7 +35,16 @@ jobs: command: | apt update apt install -y wget git curl jq - curl -sL https://deb.nodesource.com/setup_18.x | bash - + + apt-get update + apt-get install -y ca-certificates curl gnupg + mkdir -p /etc/apt/keyrings + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg + + NODE_MAJOR=18 + echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list + apt-get update + apt install -y nodejs npm install --global yarn - checkout @@ -51,7 +60,7 @@ jobs: value: << pipeline.git.branch >> steps: - run: - name: "[Main or Stable] Create input fo config to test everything" + name: "[Main or Stable] Create input for config to test everything" command: | mkdir -p /tmp/circleci/ echo '{ "run_all": true }' > /tmp/circleci/pipeline_config.json @@ -69,9 +78,9 @@ jobs: command: | if [[ -z "$CIRCLE_PULL_REQUEST" ]]; then echo "Not in a PR. Can't filter properly outside a PR. Please open a PR so that we can run the proper CI tests." - echo "Skipping!" + echo "For safety, we run all the tests!" mkdir -p /tmp/circleci/ - echo '{}' > /tmp/circleci/pipeline_config.json + echo '{ "run_all": true }' > /tmp/circleci/pipeline_config.json else PR_NUMBER="${CIRCLE_PULL_REQUEST##*/}" node ./scripts/circleci/pipeline_selection.js filter-jobs diff --git a/.circleci/configurations/commands.yml b/.circleci/configurations/commands.yml index 0461946330ab74..bce934a6b42119 100644 --- a/.circleci/configurations/commands.yml +++ b/.circleci/configurations/commands.yml @@ -46,10 +46,6 @@ commands: echo "rbenv found; Skipping installation" fi - brew reinstall libyaml - gem install psych -- --with-libyaml-dir=$(brew --prefix libyaml) - export RUBY_CONFIGURE_OPTS=--with-libyaml-dir=$(brew --prefix libyaml) - # Install the right version of ruby if [[ -z "$(rbenv versions | grep << parameters.ruby_version >>)" ]]; then # ensure that `ruby-build` can see all the available versions of Ruby @@ -61,7 +57,11 @@ commands: # Set ruby dependencies rbenv global << parameters.ruby_version >> - gem install bundler + if [[ << parameters.ruby_version >> == "2.6.10" ]]; then + gem install bundler -v 2.4.22 + else + gem install bundler + fi bundle check || bundle install --path vendor/bundle --clean - save_cache: key: *rbenv_cache_key @@ -167,7 +167,7 @@ commands: steps: - run: name: "Run Tests: << parameters.platform >> End-to-End Tests" - command: node ./scripts/run-ci-e2e-tests.js --<< parameters.platform >> --retries << parameters.retries >> + command: node ./scripts/e2e/run-ci-e2e-tests.js --<< parameters.platform >> --retries << parameters.retries >> report_bundle_size: parameters: diff --git a/.circleci/configurations/executors.yml b/.circleci/configurations/executors.yml index d860bcef264ef1..1c4c6a9bfb806c 100644 --- a/.circleci/configurations/executors.yml +++ b/.circleci/configurations/executors.yml @@ -36,3 +36,10 @@ executors: resource_class: macos.x86.medium.gen2 environment: - BUILD_FROM_SOURCE: true + reactnativeios-lts: + <<: *defaults + macos: + xcode: '14.3.1' + resource_class: macos.x86.medium.gen2 + environment: + - BUILD_FROM_SOURCE: true diff --git a/.circleci/configurations/jobs.yml b/.circleci/configurations/jobs.yml index d0d17a83f6aa36..39eb852857d3dd 100644 --- a/.circleci/configurations/jobs.yml +++ b/.circleci/configurations/jobs.yml @@ -250,16 +250,16 @@ jobs: executor: reactnativeandroid-xlarge parameters: release_type: - description: The type of release to build. Must be one of "nightly", "release", "dry-run". + description: The type of release to build. Must be one of "nightly", "release", "dry-run", "prealpha". type: enum - enum: ["nightly", "release", "dry-run"] + enum: ["nightly", "release", "dry-run", "prealpha"] default: "dry-run" steps: - checkout - run_yarn - run: name: Set React Native Version - command: node ./scripts/set-rn-version.js --build-type << parameters.release_type >> + command: node ./scripts/releases/set-rn-version.js --build-type << parameters.release_type >> - with_gradle_cache: steps: @@ -286,7 +286,6 @@ jobs: - packages/react-native/ReactAndroid/build/ - packages/react-native/ReactAndroid/hermes-engine/.cxx/ - packages/react-native/ReactAndroid/hermes-engine/build/ - - packages/react-native/ReactAndroid/flipper-integration/build/ - packages/react-native/ReactAndroid/src/main/jni/prebuilt/ - packages/react-native-gradle-plugin/.gradle/ - packages/react-native-gradle-plugin/build/ @@ -304,7 +303,7 @@ jobs: name: Set React Native Version to "dry-run" # test_android executes only for dry-run builds. We need to bump the version for caching # reasons otherwise we won't reuse the artifacts from the build_android job. - command: node ./scripts/set-rn-version.js --build-type "dry-run" + command: node ./scripts/releases/set-rn-version.js --build-type "dry-run" - attach_workspace: at: . @@ -350,6 +349,7 @@ jobs: enum: ["Hermes", "JSC"] environment: - PROJECT_NAME: "AndroidTemplateProject" + - YARN_ENABLE_IMMUTABLE_INSTALLS: false steps: - checkout_code_with_cache - run_yarn @@ -359,8 +359,8 @@ jobs: name: Create Android template project command: | REPO_ROOT=$(pwd) - node ./scripts/update-template-package.js "{\"react-native\":\"file:$REPO_ROOT/build/$(cat build/react-native-package-version)\"}" - node ./scripts/template/initialize.js --reactNativeRootPath $REPO_ROOT --templateName $PROJECT_NAME --templateConfigPath "$REPO_ROOT/packages/react-native" --directory "/tmp/$PROJECT_NAME" + node ./scripts/releases/update-template-package.js "{\"react-native\":\"file:$REPO_ROOT/build/$(cat build/react-native-package-version)\"}" + node ./scripts/e2e/init-template-e2e.js --projectName $PROJECT_NAME --templatePath "$REPO_ROOT/packages/react-native" --directory "/tmp/$PROJECT_NAME" --verbose - with_gradle_cache: steps: - run: @@ -387,7 +387,6 @@ jobs: # JOBS: Test iOS Template # ------------------------- test_ios_template: - executor: reactnativeios parameters: flavor: default: "Debug" @@ -404,11 +403,6 @@ jobs: description: Which JavaScript engine to use. Must be one of "Hermes", "JSC". type: enum enum: ["Hermes", "JSC"] - flipper: - default: "WithFlipper" - description: Whether Flipper is enabled. Must be one of "WithFlipper", "WithoutFlipper". - type: enum - enum: ["WithFlipper", "WithoutFlipper"] use_frameworks: default: "StaticLibraries" description: Which kind of option we want to use for `use_frameworks!` @@ -430,9 +424,15 @@ jobs: cocoapods_cache_key: type: string default: *template_cocoapods_cache_key + executor: + description: The executor to use + default: reactnativeios + type: string + executor: << parameters.executor >> environment: - PROJECT_NAME: "iOSTemplateProject" - HERMES_WS_DIR: *hermes_workspace_root + - YARN_ENABLE_IMMUTABLE_INSTALLS: false steps: - checkout_code_with_cache - run_yarn @@ -457,8 +457,8 @@ jobs: REPO_ROOT=$(pwd) PACKAGE=$(cat build/react-native-package-version) PATH_TO_PACKAGE="$REPO_ROOT/build/$PACKAGE" - node ./scripts/update-template-package.js "{\"react-native\":\"file:$PATH_TO_PACKAGE\"}" - node ./scripts/template/initialize.js --reactNativeRootPath $REPO_ROOT --templateName $PROJECT_NAME --templateConfigPath "$REPO_ROOT/packages/react-native" --directory "/tmp/$PROJECT_NAME" + node ./scripts/releases/update-template-package.js "{\"react-native\":\"file:$PATH_TO_PACKAGE\"}" + node ./scripts/e2e/init-template-e2e.js --projectName $PROJECT_NAME --templatePath "$REPO_ROOT/packages/react-native" --directory "/tmp/$PROJECT_NAME" --verbose - with_xcodebuild_cache: podfile_lock_path: << parameters.podfile_lock_path >> pods_build_folder: << parameters.pods_build_folder >> @@ -466,7 +466,7 @@ jobs: podfile_lock_cache_key: << parameters.podfile_lock_cache_key >> steps: - run: - name: Install iOS dependencies - Configuration << parameters.flavor >>; New Architecture << parameters.architecture >>; JS Engine << parameters.jsengine>>; Flipper << parameters.flipper >> + name: Install iOS dependencies - Configuration << parameters.flavor >>; New Architecture << parameters.architecture >>; JS Engine << parameters.jsengine>> command: | cd /tmp/$PROJECT_NAME/ios @@ -478,10 +478,6 @@ jobs: export USE_HERMES=0 fi - if [[ << parameters.flipper >> == "WithoutFlipper" ]]; then - export NO_FLIPPER=1 - fi - if [[ << parameters.use_frameworks >> == "DynamicFrameworks" ]]; then export USE_FRAMEWORKS=dynamic fi @@ -502,23 +498,23 @@ jobs: # JOBS: Test iOS RNTester # ------------------------- test_ios_rntester: - executor: reactnativeios + parameters: jsengine: default: "Hermes" description: Which JavaScript engine to use. Must be one of "Hermes", "JSC". type: enum enum: ["Hermes", "JSC"] - architecture: - default: "OldArch" - description: Which React Native architecture to use. Must be one of "OldArch", "NewArch". - type: enum - enum: ["NewArch", "OldArch"] use_frameworks: default: "StaticLibraries" description: The dependency building and linking strategy to use. Must be one of "StaticLibraries", "DynamicFrameworks" type: enum enum: ["StaticLibraries", "DynamicFrameworks"] + architecture: + default: "NewArch" + description: "The React Native architecture to Test. RNTester has always Fabric enabled, but we want to run integration test with the old arch setup" + type: enum + enum: ["OldArch", "NewArch"] ruby_version: default: "2.6.10" description: The version of ruby that must be used @@ -527,6 +523,11 @@ jobs: description: whether unit tests should run or not. default: false type: boolean + executor: + description: The executor to use + default: reactnativeios + type: string + executor: << parameters.executor >> steps: - checkout_code_with_cache - run_yarn @@ -551,21 +552,21 @@ jobs: - with_xcodebuild_cache: steps: - run: - name: Install CocoaPods dependencies - Architecture << parameters.architecture >> + name: Install CocoaPods dependencies command: | - if [[ << parameters.architecture >> == "NewArch" ]]; then - export RCT_NEW_ARCH_ENABLED=1 - fi if [[ << parameters.jsengine >> == "JSC" ]]; then export USE_HERMES=0 fi if [[ << parameters.use_frameworks >> == "DynamicFrameworks" ]]; then - export NO_FLIPPER=1 export USE_FRAMEWORKS=dynamic fi + if [[ << parameters.architecture >> == "NewArch" ]]; then + export RCT_NEW_ARCH_ENABLED=1 + fi + cd packages/rn-tester bundle install @@ -589,81 +590,6 @@ jobs: steps: - run_ios_tests - # ------------------------- - # JOBS: Windows - # ------------------------- - test_windows: - executor: - name: win/default - environment: - - CHOCO_CACHE_DIR: "C:\\ChocoCache" - steps: - - checkout_code_with_cache - - - restore_cache: - keys: - - *windows_choco_cache_key - - - run: - name: Choco cache - # Cache our dependencies which can be flakey to download - command: | - if (!Test-Path $env:CHOCO_CACHE_DIR) { - mkdir $env:CHOCO_CACHE_DIR - } - choco config set --name cacheLocation --value $env:CHOCO_CACHE_DIR - - - run: - name: Disable NVM - # Use choco to manage node versions due to https://github.com/npm/cli/issues/4234 - command: nvm off - - - run: - name: Install Node JS - # Note: Version set separately for non-Windows builds, see above. - command: choco install nodejs-lts - - # Setup Dependencies - - run: - name: Enable Yarn with corepack - command: corepack enable - - # it looks like that, last week, envinfo released version 7.9.0 which does not works - # with Windows. I have opened an issue here: https://github.com/tabrindle/envinfo/issues/238 - # TODO: T156811874 - Revert this to npx envinfo@latest when the issue is addressed - - run: - name: Display Environment info - command: | - npm install -g envinfo - envinfo -v - envinfo - - - restore_cache: - keys: - - *windows_yarn_cache_key - - run: - name: "Yarn: Install Dependencies" - command: yarn install --frozen-lockfile --non-interactive - - - save_cache: - key: *windows_yarn_cache_key - paths: - - C:\Users\circleci\AppData\Local\Yarn - - - save_cache: - key: *windows_choco_cache_key - paths: - - $env:CHOCO_CACHE_DIR - - # ------------------------- - # Run Tests - - run: - name: "Flow Check" - command: yarn flow-check - - run: - name: "Run Tests: JavaScript Tests" - command: yarn test - # ------------------------- # JOBS: Build Hermes # ------------------------- @@ -681,7 +607,16 @@ jobs: apt update apt install -y wget git curl jq - curl -sL https://deb.nodesource.com/setup_18.x | bash - + + apt-get update + apt-get install -y ca-certificates curl gnupg + mkdir -p /etc/apt/keyrings + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg + + NODE_MAJOR=18 + echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list + apt-get update + apt install -y nodejs npm install --global yarn - checkout @@ -888,6 +823,22 @@ jobs: echo "Moving from build_$SLICE to $FINAL_PATH" mv build_"$SLICE" "$FINAL_PATH" + + # check whether everything is there + if [[ -d "$FINAL_PATH/API/hermes/hermes.framework" ]]; then + echo "Successfully built hermes.framework for $SLICE in $FLAVOR" + else + echo "Failed to built hermes.framework for $SLICE in $FLAVOR" + exit 1 + fi + + if [[ -d "$FINAL_PATH/API/hermes/hermes.framework.dSYM" ]]; then + echo "Successfully built hermes.framework.dSYM for $SLICE in $FLAVOR" + else + echo "Failed to built hermes.framework.dSYM for $SLICE in $FLAVOR" + echo "Please try again" + exit 1 + fi - save_cache: key: << parameters.slice_base_cache_key >>-<< parameters.slice >>-<< parameters.flavor >> paths: @@ -1074,7 +1025,7 @@ jobs: name: Build HermesC for Windows command: | if (-not(Test-Path -Path $Env:HERMES_WS_DIR\win64-bin\hermesc.exe)) { - choco install --no-progress cmake --version 3.14.7 + choco install --no-progress cmake --version 3.14.7 -y if (-not $?) { throw "Failed to install CMake" } cd $Env:HERMES_WS_DIR\icu @@ -1154,14 +1105,14 @@ jobs: echo "Using the version from the package.json: $VERSION" fi - node ./scripts/prepare-package-for-release.js -v "$VERSION" -l << parameters.latest >> --dry-run << parameters.dryrun >> + node ./scripts/releases-ci/prepare-package-for-release.js -v "$VERSION" -l << parameters.latest >> --dry-run << parameters.dryrun >> build_npm_package: parameters: release_type: - description: The type of release to build. Must be one of "nightly", "release", "dry-run". + description: The type of release to build. Must be one of "nightly", "release", "dry-run", or "prealpha". type: enum - enum: ["nightly", "release", "dry-run"] + enum: ["nightly", "release", "dry-run", "prealpha"] default: "dry-run" executor: reactnativeandroid-xlarge environment: @@ -1201,7 +1152,7 @@ jobs: - attach_workspace: at: . - # START: Stables and nightlies + # START: Stables, nightlies and prealphas # This conditional step sets up the necessary credentials for publishing react-native to npm. - when: condition: @@ -1210,7 +1161,7 @@ jobs: - equal: [ "nightly", << parameters.release_type >> ] steps: - run: echo "//registry.npmjs.org/:_authToken=${CIRCLE_NPM_TOKEN}" > ~/.npmrc - # END: Stables and nightlies + # END: Stables, prealpha and nightlies - with_gradle_cache: steps: @@ -1224,7 +1175,7 @@ jobs: else export ORG_GRADLE_PROJECT_reactNativeArchitectures="armeabi-v7a,arm64-v8a,x86,x86_64" fi - node ./scripts/publish-npm.js -t << parameters.release_type >> + node ./scripts/releases-ci/publish-npm.js -t << parameters.release_type >> - run: name: Zip Maven Artifacts from /tmp/maven-local @@ -1288,19 +1239,6 @@ jobs: command: | node scripts/circleci/poll-maven.js - - # ------------------------- - # JOBS: Nightly - # ------------------------- - nightly_job: - machine: - image: ubuntu-2004:202010-01 - steps: - - run: - name: Nightly - command: | - echo "Nightly build run" - find_and_publish_bumped_packages: executor: nodelts steps: @@ -1312,4 +1250,4 @@ jobs: command: echo "//registry.npmjs.org/:_authToken=${CIRCLE_NPM_TOKEN}" > ~/.npmrc - run: name: Find and publish all bumped packages - command: node ./scripts/monorepo/find-and-publish-all-bumped-packages.js + command: node ./scripts/releases-ci/publish-updated-packages.js diff --git a/.circleci/configurations/test_workflows/testAll.yml b/.circleci/configurations/test_workflows/testAll.yml index 145dcbd71ff213..9525846607ad7b 100644 --- a/.circleci/configurations/test_workflows/testAll.yml +++ b/.circleci/configurations/test_workflows/testAll.yml @@ -60,118 +60,46 @@ ruby_version: "3.2.0" architecture: "NewArch" flavor: "Debug" + executor: reactnativeios-lts - test_ios_template: + architecture: "OldArch" requires: - build_npm_package matrix: parameters: - architecture: ["NewArch", "OldArch"] flavor: ["Debug", "Release"] jsengine: ["Hermes", "JSC"] - flipper: ["WithFlipper", "WithoutFlipper"] use_frameworks: ["StaticLibraries", "DynamicFrameworks"] exclude: - - architecture: "NewArch" - flavor: "Release" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "NewArch" - flavor: "Release" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "NewArch" - flavor: "Release" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "NewArch" - flavor: "Release" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "OldArch" - flavor: "Release" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "OldArch" - flavor: "Release" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "OldArch" - flavor: "Release" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "OldArch" - flavor: "Release" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "NewArch" - flavor: "Debug" + # This config is tested with Ruby 3.2.0. Let's not double test it. + - flavor: "Debug" jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "NewArch" - flavor: "Debug" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "OldArch" - flavor: "Debug" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "OldArch" - flavor: "Debug" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "NewArch" - flavor: "Debug" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "NewArch" - flavor: "Debug" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "OldArch" - flavor: "Debug" - jsengine: "JSC" - flipper: "WithFlipper" use_frameworks: "StaticLibraries" - test_ios_rntester: requires: - build_hermes_macos name: "Test RNTester with Ruby 3.2.0" ruby_version: "3.2.0" - architecture: "NewArch" + executor: reactnativeios-lts - test_ios_rntester: requires: - build_hermes_macos matrix: parameters: - architecture: ["NewArch", "OldArch"] jsengine: ["Hermes", "JSC"] use_frameworks: ["StaticLibraries", "DynamicFrameworks"] exclude: # Tested by test_ios-Hermes - - architecture: "OldArch" - jsengine: "Hermes" + - jsengine: "Hermes" use_frameworks: "StaticLibraries" # Tested by test_ios-JSC - - architecture: "OldArch" - jsengine: "JSC" + - jsengine: "JSC" + use_frameworks: "StaticLibraries" + # Tested with Ruby 3.2.0, do not test this twice. + - jsengine: "Hermes" use_frameworks: "StaticLibraries" - test_ios_rntester: run_unit_tests: true - architecture: "OldArch" use_frameworks: "StaticLibraries" ruby_version: "2.6.10" requires: @@ -179,4 +107,4 @@ matrix: parameters: jsengine: ["Hermes", "JSC"] - - test_windows + architecture: ["NewArch", "OldArch"] diff --git a/.circleci/configurations/test_workflows/testAndroid.yml b/.circleci/configurations/test_workflows/testAndroid.yml index b21ed9775fcb21..08f925eca37b61 100644 --- a/.circleci/configurations/test_workflows/testAndroid.yml +++ b/.circleci/configurations/test_workflows/testAndroid.yml @@ -45,7 +45,7 @@ - test_android: requires: - build_android - - test_e2e_android + # - test_e2e_android - test_android_template: requires: - build_npm_package @@ -54,4 +54,3 @@ architecture: ["NewArch", "OldArch"] jsengine: ["Hermes", "JSC"] flavor: ["Debug", "Release"] - - test_windows diff --git a/.circleci/configurations/test_workflows/testE2E.yml b/.circleci/configurations/test_workflows/testE2E.yml index b161180ee5a5b4..998abf796ffe8c 100644 --- a/.circleci/configurations/test_workflows/testE2E.yml +++ b/.circleci/configurations/test_workflows/testE2E.yml @@ -6,5 +6,4 @@ jobs: - test_e2e_ios: ruby_version: "2.7.7" - # This is not stable - # - test_e2e_android + - test_e2e_android diff --git a/.circleci/configurations/test_workflows/testIOS.yml b/.circleci/configurations/test_workflows/testIOS.yml index 484ef5a8f2ea27..a1e6c479cfe571 100644 --- a/.circleci/configurations/test_workflows/testIOS.yml +++ b/.circleci/configurations/test_workflows/testIOS.yml @@ -42,8 +42,8 @@ - build_hermesc_linux - build_hermes_macos - build_hermesc_windows - - test_e2e_ios: - ruby_version: "2.7.7" + # - test_e2e_ios: + # ruby_version: "2.7.7" - test_ios_template: requires: - build_npm_package @@ -51,118 +51,38 @@ ruby_version: "3.2.0" architecture: "NewArch" flavor: "Debug" + executor: reactnativeios-lts - test_ios_template: + architecture: "OldArch" requires: - build_npm_package matrix: parameters: - architecture: ["NewArch", "OldArch"] flavor: ["Debug", "Release"] jsengine: ["Hermes", "JSC"] - flipper: ["WithFlipper", "WithoutFlipper"] use_frameworks: ["StaticLibraries", "DynamicFrameworks"] exclude: - - architecture: "NewArch" - flavor: "Release" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "NewArch" - flavor: "Release" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "NewArch" - flavor: "Release" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "NewArch" - flavor: "Release" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "OldArch" - flavor: "Release" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "OldArch" - flavor: "Release" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "OldArch" - flavor: "Release" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "OldArch" - flavor: "Release" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "NewArch" - flavor: "Debug" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "NewArch" - flavor: "Debug" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "OldArch" - flavor: "Debug" - jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "OldArch" - flavor: "Debug" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "DynamicFrameworks" - - architecture: "NewArch" - flavor: "Debug" + # Tested with Ruby 3.2.0, let's not double test this + - flavor: "Debug" jsengine: "Hermes" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "NewArch" - flavor: "Debug" - jsengine: "JSC" - flipper: "WithFlipper" - use_frameworks: "StaticLibraries" - - architecture: "OldArch" - flavor: "Debug" - jsengine: "JSC" - flipper: "WithFlipper" use_frameworks: "StaticLibraries" - test_ios_rntester: requires: - build_hermes_macos - name: "Test RNTester with Ruby 3.2.0" + name: "RNTester on Ruby 3.2.0" ruby_version: "3.2.0" - architecture: "NewArch" + executor: reactnativeios-lts - test_ios_rntester: + name: "RNTester with Dynamic Frameworks" + use_frameworks: "DynamicFrameworks" requires: - build_hermes_macos matrix: parameters: - architecture: ["NewArch", "OldArch"] jsengine: ["Hermes", "JSC"] - use_frameworks: ["StaticLibraries", "DynamicFrameworks"] - exclude: - # Tested by test_ios-Hermes - - architecture: "OldArch" - jsengine: "Hermes" - use_frameworks: "StaticLibraries" - # Tested by test_ios-JSC - - architecture: "OldArch" - jsengine: "JSC" - use_frameworks: "StaticLibraries" - test_ios_rntester: + name: "RNTester Integration Tests" run_unit_tests: true - architecture: "OldArch" use_frameworks: "StaticLibraries" ruby_version: "2.6.10" requires: @@ -170,3 +90,4 @@ matrix: parameters: jsengine: ["Hermes", "JSC"] + architecture: ["NewArch", "OldArch"] diff --git a/.circleci/configurations/top_level.yml b/.circleci/configurations/top_level.yml index 23def16a1bcd26..5d3281d36400a6 100644 --- a/.circleci/configurations/top_level.yml +++ b/.circleci/configurations/top_level.yml @@ -25,11 +25,11 @@ references: android-defaults: &android-defaults working_directory: ~/react-native docker: - - image: reactnativecommunity/react-native-android:v11.0 + - image: reactnativecommunity/react-native-android:v13.0 environment: - TERM: "dumb" - GRADLE_OPTS: '-Dorg.gradle.daemon=false' - # By default we only build ARM64 to save time/resources. For release/nightlies, we override this value to build all archs. + # By default we only build ARM64 to save time/resources. For release/nightlies/prealpha, we override this value to build all archs. - ORG_GRADLE_PROJECT_reactNativeArchitectures: "arm64-v8a" # Repeated here, as the environment key in this executor will overwrite the one in defaults - PUBLIC_ANALYSISBOT_GITHUB_TOKEN_A: *github_analysisbot_token_a @@ -59,7 +59,7 @@ references: # Dependency Anchors # ------------------------- dependency_versions: - xcode_version: &xcode_version "14.3.0" + xcode_version: &xcode_version "15.0.1" nodelts_image: &nodelts_image "cimg/node:20.2.0" nodeprevlts_image: &nodeprevlts_image "cimg/node:18.12.1" nodelts_browser_image: &nodelts_browser_image "cimg/node:20.2.0-browsers" @@ -81,27 +81,22 @@ references: hermes_linux_cache_key: &hermes_linux_cache_key v1-hermes-{{ .Environment.CIRCLE_JOB }}-linux-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} hermes_windows_cache_key: &hermes_windows_cache_key v2-hermes-{{ .Environment.CIRCLE_JOB }}-windows-{{ checksum "/Users/circleci/project/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} # Hermes iOS - hermesc_apple_cache_key: &hermesc_apple_cache_key v2-hermesc-apple-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} - hermes_apple_slices_cache_key: &hermes_apple_slices_cache_key v2-hermes-apple-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }} - hermes_tarball_debug_cache_key: &hermes_tarball_debug_cache_key v4-hermes-tarball-debug-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }} - hermes_tarball_release_cache_key: &hermes_tarball_release_cache_key v3-hermes-tarball-release-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }} - hermes_macosx_bin_release_cache_key: &hermes_macosx_bin_release_cache_key v1-hermes-release-macosx-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} - hermes_macosx_bin_debug_cache_key: &hermes_macosx_bin_debug_cache_key v1-hermes-debug-macosx-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} - hermes_dsym_debug_cache_key: &hermes_dsym_debug_cache_key v1-hermes-debug-dsym-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} - hermes_dsym_release_cache_key: &hermes_dsym_release_cache_key v1-hermes-release-dsym-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} + hermesc_apple_cache_key: &hermesc_apple_cache_key v3-hermesc-apple-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} + hermes_apple_slices_cache_key: &hermes_apple_slices_cache_key v4-hermes-apple-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }} + hermes_tarball_debug_cache_key: &hermes_tarball_debug_cache_key v5-hermes-tarball-debug-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }} + hermes_tarball_release_cache_key: &hermes_tarball_release_cache_key v4-hermes-tarball-release-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }} + hermes_macosx_bin_release_cache_key: &hermes_macosx_bin_release_cache_key v2-hermes-release-macosx-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} + hermes_macosx_bin_debug_cache_key: &hermes_macosx_bin_debug_cache_key v2-hermes-debug-macosx-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} + hermes_dsym_debug_cache_key: &hermes_dsym_debug_cache_key v2-hermes-debug-dsym-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} + hermes_dsym_release_cache_key: &hermes_dsym_release_cache_key v2-hermes-release-dsym-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }} # Cocoapods - RNTester - pods_cache_key: &pods_cache_key v10-pods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile.lock.bak" }}-{{ checksum "packages/rn-tester/Podfile" }} - cocoapods_cache_key: &cocoapods_cache_key v8-cocoapods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile.lock" }}-{{ checksum "packages/rn-tester/Podfile" }}-{{ checksum "/tmp/hermes/hermesversion" }} - rntester_podfile_lock_cache_key: &rntester_podfile_lock_cache_key v6-podfilelock-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile" }}-{{ checksum "/tmp/week_year" }}-{{ checksum "/tmp/hermes/hermesversion" }} + pods_cache_key: &pods_cache_key v11-pods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile.lock.bak" }}-{{ checksum "packages/rn-tester/Podfile" }} + cocoapods_cache_key: &cocoapods_cache_key v11-cocoapods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile.lock" }}-{{ checksum "packages/rn-tester/Podfile" }}-{{ checksum "/tmp/hermes/hermesversion" }} + rntester_podfile_lock_cache_key: &rntester_podfile_lock_cache_key v9-podfilelock-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile" }}-{{ checksum "/tmp/week_year" }}-{{ checksum "/tmp/hermes/hermesversion" }} # Cocoapods - Template - template_cocoapods_cache_key: &template_cocoapods_cache_key v4-cocoapods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "/tmp/iOSTemplateProject/ios/Podfile.lock" }}-{{ checksum "/tmp/iOSTemplateProject/ios/Podfile" }}-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "packages/rn-tester/Podfile.lock" }} - template_podfile_lock_cache_key: &template_podfile_lock_cache_key v4-podfilelock-{{ .Environment.CIRCLE_JOB }}-{{ checksum "/tmp/iOSTemplateProject/ios/Podfile" }}-{{ checksum "/tmp/week_year" }}-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "packages/rn-tester/Podfile.lock" }} - - # Windows - windows_yarn_cache_key: &windows_yarn_cache_key v1-win-yarn-cache-{{ arch }}-{{ checksum "yarn.lock" }} - windows_choco_cache_key: &windows_choco_cache_key v1-win-choco-cache-{{ .Environment.CIRCLE_JOB }} - + template_cocoapods_cache_key: &template_cocoapods_cache_key v6-cocoapods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "/tmp/iOSTemplateProject/ios/Podfile.lock" }}-{{ checksum "/tmp/iOSTemplateProject/ios/Podfile" }}-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "packages/rn-tester/Podfile.lock" }} + template_podfile_lock_cache_key: &template_podfile_lock_cache_key v6-podfilelock-{{ .Environment.CIRCLE_JOB }}-{{ checksum "/tmp/iOSTemplateProject/ios/Podfile" }}-{{ checksum "/tmp/week_year" }}-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "packages/rn-tester/Podfile.lock" }} cache_paths: hermes_workspace_macos_cache_paths: &hermes_workspace_macos_cache_paths diff --git a/.circleci/configurations/workflows.yml b/.circleci/configurations/workflows.yml index be128b7d0af88e..e5c085ee4ce08a 100644 --- a/.circleci/configurations/workflows.yml +++ b/.circleci/configurations/workflows.yml @@ -90,7 +90,6 @@ workflows: nightly: when: << pipeline.parameters.run_nightly_workflow >> jobs: - - nightly_job - prepare_hermes_workspace - build_android: release_type: "nightly" diff --git a/.eslintignore b/.eslintignore index e3313f1685f533..e35c03e132f733 100644 --- a/.eslintignore +++ b/.eslintignore @@ -6,6 +6,10 @@ packages/react-native/Libraries/Renderer/* packages/react-native/Libraries/vendor/**/* node_modules/ packages/*/node_modules +packages/*/dist packages/debugger-frontend/dist/**/* packages/react-native-codegen/lib tools/eslint/rules/sort-imports.js +**/Pods/* +**/*.macos.js +**/*.windows.js diff --git a/.eslintrc.js b/.eslintrc.js index f14dc495f236e3..b0410b566e3456 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -34,6 +34,13 @@ module.exports = { 'no-undef': 0, }, }, + { + files: ['*.js', '*.js.flow'], + excludedFiles: ['packages/react-native/template/**/*'], + rules: { + 'lint/sort-imports': 1, + }, + }, { files: ['package.json'], parser: 'jsonc-eslint-parser', @@ -53,14 +60,16 @@ module.exports = { }, }, { - files: ['packages/react-native/Libraries/**/*.js'], + files: [ + 'packages/react-native/Libraries/**/*.js', + 'packages/react-native/src/**/*.js', + ], rules: { '@react-native/platform-colors': 2, '@react-native/specs/react-native-modules': 2, 'lint/no-haste-imports': 2, 'lint/no-react-native-imports': 2, 'lint/require-extends-error': 2, - 'lint/sort-imports': 1, }, }, { diff --git a/.flowconfig b/.flowconfig index afae777b88f4b9..f240531f3d78bb 100644 --- a/.flowconfig +++ b/.flowconfig @@ -8,11 +8,18 @@ ; Ignore "BUCK" generated dirs /\.buckd/ +; Ignore other platform suffixes +.*\.macos\.js$ +.*\.windows\.js$ + .*/node_modules/resolve/test/resolver/malformed_package_json/package\.json$ ; Checked-in build output /packages/debugger-frontend/dist/ +; Generated build output +/packages/.*/dist + [untyped] .*/node_modules/@react-native-community/cli/.*/.* @@ -29,6 +36,7 @@ packages/react-native/flow/ [options] experimental.global_find_ref=true enums=true +casting_syntax=both emoji=true @@ -77,4 +85,4 @@ untyped-import untyped-type-import [version] -^0.218.0 +^0.228.0 diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d923854d7b2a73..eeda1f865d9c8c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,23 +2,68 @@ name: 🐛 Bug Report description: Report a reproducible bug or regression in React Native. labels: ["Needs: Triage :mag:"] body: + - type: markdown + attributes: + value: "## Reporting a bug to React Native" - type: markdown attributes: value: | - Please provide all the information requested. Issues that do not follow this format are likely to stall. + Thank you for taking the time to report an issue for React Native, your contribution will help + make the framework better for everyone. + + 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're 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: + * Have a **valid reproducer** (either a [Expo Snack](https://snack.expo.dev/) or a [empty project from template](https://github.com/react-native-community/reproducer-react-native). + * Is tested against the [**latest stable**](https://github.com/facebook/react-native/releases/) of React Native. + + Due to the extreme number of bugs we receive, we will be looking **ONLY** into issues with a reproducer, and on [supported versions](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported) of React Native. - type: textarea id: description attributes: label: Description - description: Please provide a clear and concise description of what the bug is. Include screenshots if needed. Test using the [latest React Native release](https://github.com/facebook/react-native/releases/latest) to make sure your issue has not already been fixed. + 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 reproduce the issue. + placeholder: | + 1. Install the application with `yarn android` + 2. Click on the button on the Home + 3. Notice the crash validations: required: true - type: input id: version attributes: label: React Native Version - description: What is the latest version of react-native that this issue reproduces on? Please only list the highest version you tested. 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: ex. 0.71.0 + 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.73.0" + validations: + required: true + - type: dropdown + id: platforms + attributes: + label: Affected Platforms + description: Please select which platform you're developing to, and which OS you're using for building. + multiple: true + options: + - Runtime - Android + - Runtime - iOS + - Runtime - Web + - Runtime - Desktop + - Build - MacOS + - Build - Windows + - Build - Linux + - Other (please specify) validations: required: true - type: textarea @@ -26,23 +71,53 @@ body: attributes: label: Output of `npx react-native info` description: Run `npx react-native info` in your terminal, copy and paste the results here. + placeholder: | + Paste the output of `npx react-native 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: reproduction + id: stacktrace attributes: - label: Steps to reproduce - description: Provide a detailed list of steps that reproduce the issue. + label: Stacktrace or Logs + description: Please provide a stacktrace or a log of your crash or failure + render: text + placeholder: | + Paste your stacktraces and logs here. They might look like: + + java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libfabricjni.so caused by: com.facebook.react.fabric.StateWrapperImpl result: 0 + at com.facebook.soloader.SoLoader.g(Unknown Source:341) + at com.facebook.soloader.SoLoader.t(Unknown Source:124) + at com.facebook.soloader.SoLoader.s(Unknown Source:2) + at com.facebook.soloader.SoLoader.q(Unknown Source:42) + at com.facebook.soloader.SoLoader.p(Unknown Source:1) + ... + validations: + required: true + - type: input + id: reproducer + attributes: + label: Reproducer + description: A link to a Expo Snack or a public repository that reproduces this bug, using [this template](https://github.com/react-native-community/reproducer-react-native). Reproducers are **mandatory**. + placeholder: "https://github.com//" validations: required: true - type: textarea id: extra attributes: - label: Snack, screenshot, or link to a repository + label: Screenshots and Videos description: | - Please provide a Snack (https://snack.expo.dev/), a link to a repository on GitHub that reproduces the problem. - You may provide a screenshot of the application if you think it is relevant to your bug report. - Here are some tips for providing a minimal example: https://stackoverflow.com/help/mcve - Please note that a reproducer is **mandatory**. Issues without reproducer are more likely to stall and will be closed. - validations: - required: true + 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/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 61e9b003d300fe..0756ac90101bb4 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,12 +1,16 @@ blank_issues_enabled: true contact_links: - - name: 📦 Metro Issue - url: https://github.com/facebook/metro/issues/new + - name: 🚀 Expo Issue + url: https://github.com/expo/expo/issues/new about: | - If you've encountered a module resolution problem, e.g. "Error: Unable to resolve module ...", or something else that might be related to Metro, please open an issue in the Metro repo instead. + If you're using Expo in your project, please report the issue first in the Expo issue tracker. - name: 📃 Documentation Issue url: https://github.com/facebook/react-native-website/issues about: Please report documentation issues in the React Native website repository. + - name: 📦 Metro Issue + url: https://github.com/facebook/metro/issues/new + about: | + If you've encountered a module resolution problem, e.g. "Error: Unable to resolve module ...", or something else that might be related to Metro, please open an issue in the Metro repo instead. - name: 🤔 Questions and Help url: https://reactnative.dev/help about: Looking for help with your app? Please refer to the React Native community's support resources. diff --git a/.github/ISSUE_TEMPLATE/new_architecture_bug_report.yml b/.github/ISSUE_TEMPLATE/new_architecture_bug_report.yml index f0ac968d80757c..452c7899eabcdc 100644 --- a/.github/ISSUE_TEMPLATE/new_architecture_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/new_architecture_bug_report.yml @@ -1,29 +1,81 @@ name: 💫 New Architecture - Bug Report description: Report a reproducible bug or a build issue when using the New Architecture (Fabric & TurboModules) in React Native. labels: ["Needs: Triage :mag:", "Type: New Architecture"] + body: + - type: markdown + attributes: + value: "## New Architecture Related Bugs" - type: markdown attributes: value: | - Please provide all the information requested. Issues that do not follow this format are going to be closed. - This issue report is reserved to bug & build issues for users on the New Architecture. If you're not using - the New Architecture, please don't open issues on this category. + Thank you for taking the time to report an issue for [the New Architecture of React Native](https://reactnative.dev/docs/the-new-architecture/landing-page), + your contribution will help make the framework better for everyone. + + If you're **NOT** using the New Architecture, please use this [other bug type](https://github.com/facebook/react-native/issues/new?template=bug_report.yml). + Do not attempt to open a bug in this category if you're not using the New Architecture as your bug will be closed. + + Make sure that your issue: + * Have a **valid reproducer** (either a [Expo Snack](https://snack.expo.dev/) or a [empty project from template](https://github.com/react-native-community/reproducer-react-native). + * Is tested against the [**latest stable**](https://github.com/facebook/react-native/releases/) of React Native. + + Due to the extreme number of bugs we receive, we will be looking **ONLY** into issues with a reproducer, and on [supported versions](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported) of React Native. - type: textarea id: description attributes: label: Description - description: | - Please provide a clear and concise description of what the bug or issue is. Include screenshots if needed. - Please make sure you check the New Architecture documentation first, as your issue might - already be answered there - https://reactnative.dev/docs/next/new-architecture-intro + 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 reproduce the issue. + placeholder: | + 1. Install the application with `yarn android` + 2. Click on the button on the Home + 3. Notice the crash validations: required: true - type: input id: version attributes: label: React Native Version - description: What is the latest version of react-native that this issue reproduces on? Please test against the latest stable version, and list only the highest version you tested. Bug reports against older versions are more likely to stall. - placeholder: ex. 0.71.0 + 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.73.0" + validations: + required: true + - type: dropdown + id: platforms + attributes: + label: Affected Platforms + description: Please select which platform you're developing to, and which OS you're using for building. + multiple: true + options: + - Runtime - Android + - Runtime - iOS + - Runtime - Web + - Runtime - Desktop + - Build - MacOS + - Build - Windows + - Build - Linux + - Other (please specify) + validations: + required: true + - type: dropdown + id: areas + attributes: + label: Areas + description: Which areas of the New Architecture are affected by this bug report? + multiple: true + options: + - Fabric - The New Renderer + - TurboModule - The New Native Module System + - JSI - Javascript Interface + - Bridgeless - The New Initialization Flow + - Codegen + - Other (please specify) validations: required: true - type: textarea @@ -31,23 +83,53 @@ body: attributes: label: Output of `npx react-native info` description: Run `npx react-native info` in your terminal, copy and paste the results here. + placeholder: | + Paste the output of `npx react-native 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: reproduction + id: stacktrace attributes: - label: Steps to reproduce - description: Provide a detailed list of steps that reproduce the issue. + label: Stacktrace or Logs + description: Please provide a stacktrace or a log of your crash or failure + render: text + placeholder: | + Paste your stacktraces and logs here. They might look like: + + java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libfabricjni.so caused by: com.facebook.react.fabric.StateWrapperImpl result: 0 + at com.facebook.soloader.SoLoader.g(Unknown Source:341) + at com.facebook.soloader.SoLoader.t(Unknown Source:124) + at com.facebook.soloader.SoLoader.s(Unknown Source:2) + at com.facebook.soloader.SoLoader.q(Unknown Source:42) + at com.facebook.soloader.SoLoader.p(Unknown Source:1) + ... + validations: + required: true + - type: input + id: reproducer + attributes: + label: Reproducer + description: A link to a Expo Snack or a public repository that reproduces this bug, using [this template](https://github.com/react-native-community/reproducer-react-native). Reproducers are **mandatory**. + placeholder: "https://github.com//" validations: required: true - type: textarea id: extra attributes: - label: Snack, code example, screenshot, or link to a repository + label: Screenshots and Videos description: | - Please provide a Snack (https://snack.expo.dev/), a link to a repository on GitHub, or provide a minimal code example that reproduces the problem. - You may provide a screenshot of the application if you think it is relevant to your bug report. - Here are some tips for providing a minimal example: https://stackoverflow.com/help/mcve - Please note that a reproducer is **mandatory**. Issues without reproducer are more likely to stall and will be closed. - validations: - required: true + 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/upgrade-regression-form.yml b/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml deleted file mode 100644 index 967c92b921bea7..00000000000000 --- a/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: ⬆️ Upgrade - Build Regression -description: If you are upgrading to a new React Native version (stable or pre-release) and encounter a build regression. -labels: ["Needs: Triage :mag:", "Type: Upgrade Issue"] -body: - - type: markdown - attributes: - value: | - Please use this form to file an issue if you have upgraded or are upgrading to [latest stable release](https://github.com/facebook/react-native/releases/latest) and have experienced a regression (something that used to work in previous version). - - type: input - id: new-version - attributes: - label: New Version - description: This is the version you are attempting to upgrade to. - placeholder: ex. 0.66.1 - validations: - required: true - - type: input - id: old-version - attributes: - label: Old Version - description: This is the version you were on where the behavior was working. - placeholder: ex. 0.65.1 - validations: - required: true - - type: input - id: target - attributes: - label: Build Target(s) - description: What target(s) are encountering this issue? - placeholder: iOS simulator in release flavor - validations: - required: true - - type: textarea - id: react-native-info - attributes: - label: Output of `react-native info` - description: Run `react-native info` in your terminal, copy and paste the results here. - validations: - required: true - - type: textarea - id: reproduction - attributes: - label: Issue and Reproduction Steps - description: Please describe the issue and list out commands run to reproduce. - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/upgrade_regression_form.yml b/.github/ISSUE_TEMPLATE/upgrade_regression_form.yml new file mode 100644 index 00000000000000..ed559395ecb0f8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/upgrade_regression_form.yml @@ -0,0 +1,133 @@ +name: ⬆️ Upgrade - Build Regression +description: If you are upgrading to a new React Native version (stable or pre-release) and encounter a build regression. +labels: ["Needs: Triage :mag:", "Type: Upgrade Issue"] + +body: + - type: markdown + attributes: + value: "## Upgrade Issues" + - type: markdown + attributes: + value: | + Please use this form to file an issue if you have upgraded or are upgrading to [latest stable release](https://github.com/facebook/react-native/releases/latest) and have experienced a regression (something that used to work in previous version). + + If you're **NOT** upgrading the React Native version, please use this [other bug type](https://github.com/facebook/react-native/issues/new?template=bug_report.yml). + + Before you continue: + * If you're using **Expo** and having problems updating it, [report it here](https://github.com/expo/expo/issues). + * If you're 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: + * Have a **valid reproducer** with an [empty project from template](https://github.com/react-native-community/reproducer-react-native). + * Is upgrading to the [**latest stable**](https://github.com/facebook/react-native/releases/) of React Native. + + Due to the extreme number of bugs we receive, we will be looking **ONLY** into issues with a reproducer, and on [supported versions](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported) of React Native. + - type: input + id: old-version + attributes: + label: Old Version + description: The version of react-native that you're upgrading from. + placeholder: "0.72.0" + validations: + required: true + - type: input + id: new-version + attributes: + label: New Version + description: The version of react-native that you're upgrading to. Bear in mind that only issues that are upgrading to the [latest stable](https://github.com/facebook/react-native/releases/) will be looked into. + placeholder: "0.73.0" + validations: + required: true + - 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 and commands to reproduce the issue. + placeholder: | + 1. Install the application with `yarn android` + 2. Click on the button on the Home + 3. Notice the crash + validations: + required: true + - type: dropdown + id: platforms + attributes: + label: Affected Platforms + description: Please select which platform you're developing to, and which OS you're using for building. + multiple: true + options: + - Runtime - Android + - Runtime - iOS + - Runtime - Web + - Runtime - Desktop + - Build - MacOS + - Build - Windows + - Build - Linux + - Other (please specify) + validations: + required: true + - 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. + placeholder: | + Paste the output of `npx react-native 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: stacktrace + attributes: + label: Stacktrace or Logs + description: Please provide a stacktrace or a log of your crash or failure + render: text + placeholder: | + Paste your stacktraces and logs here. They might look like: + + java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libfabricjni.so caused by: com.facebook.react.fabric.StateWrapperImpl result: 0 + at com.facebook.soloader.SoLoader.g(Unknown Source:341) + at com.facebook.soloader.SoLoader.t(Unknown Source:124) + at com.facebook.soloader.SoLoader.s(Unknown Source:2) + at com.facebook.soloader.SoLoader.q(Unknown Source:42) + at com.facebook.soloader.SoLoader.p(Unknown Source:1) + ... + validations: + required: true + - type: input + id: reproducer + attributes: + label: Reproducer + description: A link to a Expo Snack or a public repository that reproduces this bug, using [this template](https://github.com/react-native-community/reproducer-react-native). Reproducers are **mandatory**. + placeholder: "https://github.com//" + 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/workflow-scripts/checkForReproducer.js b/.github/workflow-scripts/checkForReproducer.js index 50baff0d81c893..b4814d5441d9aa 100644 --- a/.github/workflow-scripts/checkForReproducer.js +++ b/.github/workflow-scripts/checkForReproducer.js @@ -8,6 +8,7 @@ */ 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` + @@ -83,7 +84,7 @@ module.exports = async (github, context) => { } else { await github.rest.issues.addLabels({ ...issueData, - labels: [NEEDS_REPRO_LABEL], + labels: [NEEDS_REPRO_LABEL, NEEDS_AUTHOR_FEEDBACK_LABEL], }); if (botComment) return; diff --git a/.github/workflows/autorebase.yml b/.github/workflows/autorebase.yml index ca677fc80de775..c7a0fa721dacbc 100644 --- a/.github/workflows/autorebase.yml +++ b/.github/workflows/autorebase.yml @@ -17,7 +17,7 @@ jobs: if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') steps: - name: Checkout the latest code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 # otherwise, you will fail to push refs to dest repo diff --git a/.github/workflows/check-for-reproducer.yml b/.github/workflows/check-for-reproducer.yml index 97d841e7e6b7c3..839416620f687c 100644 --- a/.github/workflows/check-for-reproducer.yml +++ b/.github/workflows/check-for-reproducer.yml @@ -10,7 +10,7 @@ jobs: if: | github.repository == 'facebook/react-native' && github.event.issue.pull_request == null && github.event.issue.state == 'open' && !contains(github.event.issue.labels.*.name, ':open_umbrella: Umbrella') steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/danger_pr.yml b/.github/workflows/danger_pr.yml index 62b8b612fe1175..cfde17435243b8 100644 --- a/.github/workflows/danger_pr.yml +++ b/.github/workflows/danger_pr.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run Yarn Install on Root run: yarn install working-directory: . diff --git a/.github/workflows/ios-tests.yml b/.github/workflows/ios-tests.yml new file mode 100644 index 00000000000000..7677425ab0b235 --- /dev/null +++ b/.github/workflows/ios-tests.yml @@ -0,0 +1,48 @@ +name: ios-tests + +on: + push: + branches: + - main + pull_request: + branches: + - "*" + +jobs: + test_ios_rntester-Hermes: + runs-on: macos-latest-large + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'yarn' + - name: Yarn Install + run: yarn install + - name: Get latest commit from Hermes + run: | + mkdir -p tmp/hermes + HERMES_TAG_SHA=$(git ls-remote https://github.com/facebook/hermes main | cut -f 1 | tr -d '[:space:]') + echo $HERMES_TAG_SHA > tmp/hermes/hermesversion + echo "Latest Commit is:" + cat tmp/hermes/hermesversion + - uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + ruby-version: '3.2' + - name: Cache cocoapods + uses: actions/cache@v3 + with: + path: packages/rn-tester/Pods + key: v1-${{ runner.os }}-RNTesterPods-${{ hashFiles('packages/rn-tester/Podfile.lock') }}-${{ hashFiles('packages/rn-tester/Podfile') }}-${{ hashFiles('tmp/hermes/hermesversion') }} + - name: Pod Install + run: | + cd packages/rn-tester + bundle install + bundle exec pod install + - name: Install XCBeautify + run: brew install xcbeautify + - name: Build iOS + run: ./scripts/objc-test.sh diff --git a/.github/workflows/needs-attention.yml b/.github/workflows/needs-attention.yml index a761c22938f18c..5eb036ea7cf1be 100644 --- a/.github/workflows/needs-attention.yml +++ b/.github/workflows/needs-attention.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Apply Needs Attention Label uses: hramos/needs-attention@v1 with: diff --git a/.github/workflows/nightlies-feedback.yml b/.github/workflows/nightlies-feedback.yml new file mode 100644 index 00000000000000..5ac43fb9b99589 --- /dev/null +++ b/.github/workflows/nightlies-feedback.yml @@ -0,0 +1,52 @@ +name: Nightlies Partners Feedback +env: + # Add accounts for users who are part of the nightlies program + allowed_users: > + [ + "blakef", + "alanjhughes" + ] +on: + workflow_dispatch: + inputs: + project: + description: 'What project is running against the nighties build?' + required: true + type: string + outcome: + description: 'Did the CI run: ["pass", "fail"]?' + required: true + type: string + stage: + description: 'Stage in the run that failed: ["build", "test"]?' + required: true + type: string + link: + description: 'URL to the failing test' + required: true + type: string + version: + description: 'What is the Nightlies version this was run against?' + required: true + type: string +jobs: + share-nightlies-feedback: + name: ${{ inputs.project}} 💨 Nightlies CI + runs-on: ubuntu-latest + permissions: + actions: write + steps: + - if: ${{ !contains(fromJSON(env.allowed_users), github.actor) }} + run: | + echo "Request from actor's login wasn't on the allowed_users list." + curl -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/cancel + - run: | + echo "Project: ${{ inputs.project }}" + echo "Outcome: ${{ inputs.outcome }}" + echo "Stage: ${{ inputs.stage }}" + echo "Link: ${{ inputs.link }}" + echo "Version: ${{ inputs.version }}" + [[ "${{ inputs.outcome }}" == "pass" ]] && { exit 0; } || { exit 1; } diff --git a/.github/workflows/on-issue-labeled.yml b/.github/workflows/on-issue-labeled.yml index 14f9d4e9c5d608..b6172766fa67c0 100644 --- a/.github/workflows/on-issue-labeled.yml +++ b/.github/workflows/on-issue-labeled.yml @@ -16,7 +16,7 @@ jobs: if: "${{ github.repository == 'facebook/react-native' && contains(github.event.label.name, 'Needs: Triage :mag:') }}" steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Verify RN version uses: actions/github-script@v6 @@ -49,7 +49,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/github-script@v6 with: script: | diff --git a/.github/workflows/run_e2e_tests.yml b/.github/workflows/run_e2e_tests.yml new file mode 100644 index 00000000000000..cf8478572270e9 --- /dev/null +++ b/.github/workflows/run_e2e_tests.yml @@ -0,0 +1,26 @@ +name: Run E2E Tests +# This workflow is used to trigger E2E tests on a PR when a comment is made +# containing the text "#run-e2e-tests". +on: + issue_comment: + types: [created] +permissions: + contents: read +jobs: + rebase: + name: Trigger E2E Tests + permissions: + contents: write # for cirrus-actions/rebase to push code to rebase + pull-requests: read # for cirrus-actions/rebase to get info about PR + runs-on: ubuntu-latest + if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '#run-e2e-tests') + steps: + - name: Checkout the latest code + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 0 # otherwise, you will fail to push refs to dest repo + - name: Push empty commit + run: | + git commit -m "#run-e2e-tests" --allow-empty + git push origin $(git branch --show-current) diff --git a/.gitignore b/.gitignore index 48989b4527a75c..518dae109f2505 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,6 @@ project.xcworkspace /packages/react-native/ReactAndroid/gradlew.bat /packages/react-native/ReactAndroid/external-artifacts/build/ /packages/react-native/ReactAndroid/external-artifacts/artifacts/ -/packages/react-native/ReactAndroid/flipper-integration/build/ /packages/react-native/ReactAndroid/hermes-engine/build/ /packages/react-native/ReactAndroid/hermes-engine/.cxx/ /packages/react-native/template/android/app/build/ @@ -79,7 +78,6 @@ package-lock.json .DS_Store # Test generated files -/packages/react-native/ReactAndroid/src/androidTest/assets/AndroidTestBundle.js *.js.meta /coverage @@ -103,18 +101,21 @@ package-lock.json /packages/react-native/React/CoreModules/**/*.xcodeproj /packages/react-native/React/FBReactNativeSpec/**/*.xcodeproj /packages/react-native-codegen/**/*.xcodeproj +/packages/rn-tester/**/*.xcodeproj # Ruby Gems (Bundler) /packages/react-native/vendor /packages/react-native/template/vendor .ruby-version /**/.ruby-version +vendor/ # iOS / CocoaPods /packages/react-native/template/ios/build/ /packages/react-native/template/ios/Pods/ /packages/react-native/template/ios/Podfile.lock /packages/rn-tester/Gemfile.lock +/packages/**/RCTLegacyInteropComponents.mm # RNTester sourcemaps [macOS] /packages/rn-tester/sourcemap.*.map diff --git a/.prettierignore b/.prettierignore index ece75238220641..93b6aaeaf77e30 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,3 +4,6 @@ # Ignore hermes as it is downloaded from the react_native_pods **/sdks/hermes **/sdks/downloads + +packages/*/dist +vendor diff --git a/CHANGELOG.md b/CHANGELOG.md index 4800626c9dd75f..affabe4ae515ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,124 @@ # Changelog +## v0.73.4 + +### Fixed + +- Fix: cannot find module `react-native-*/Libraries/Core/InitializeCore` ([562447be47](https://github.com/facebook/react-native/commit/562447be4705c3e3338633ca108e7e67b9b01640) by [@tido64](https://github.com/tido64)) + +#### Android + +- Ignore the one-time NullPointerException and print error log ([ca9b6b5038](https://github.com/facebook/react-native/commit/ca9b6b5038c419405a440fc8add7090be633654c)) + +#### iOS + +- Fix warning when loading RCTUIManager and A11yManager ([f56bf1fa0a](https://github.com/facebook/react-native/commit/f56bf1fa0a0d0ca547cf7c3ff2e631efac1007ea) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.73.3 + +### Added + +#### iOS specific + +- Handle TSAsExpression when looking for the codegen declaration ([02957718d7](https://github.com/facebook/react-native/commit/02957718d7ca1af815493d145697c1e848b16c17) by [@dmytrorykun](https://github.com/dmytrorykun)) + +### Changed + +- Bump CLI to 12.3.2 ([bcb229e8f8](https://github.com/facebook/react-native/commit/bcb229e8f8b70b59d3cb603d7bb912784ad25a02) by [@szymonrybczak](https://github.com/szymonrybczak)) + +#### Android specific + +- Call super.onRequestPermissionsResult in ReactActivity's onRequestPermissionsResult() ([96ed1190c6](https://github.com/facebook/react-native/commit/96ed1190c624869af96e464b009e0c0234076893) by [@LimAlbert](https://github.com/LimAlbert)) + +#### iOS specific + +- Remove ATS config patch from react_native_post_install ([41c601e478](https://github.com/facebook/react-native/commit/41c601e4786b544fdd1fca138b0e0c61dbb8eba2) by [@gabrieldonadel](https://github.com/gabrieldonadel)) + +### Fixed + +- Declare missing dependency `chalk` ([9155e2d182](https://github.com/facebook/react-native/commit/9155e2d1828e04d6144de80bb543d50936500377) by [@tido64](https://github.com/tido64)) +- TouchableBounce, TouchableHighlight and TouchableNativeFeedback dropping touches with React 18. ([e4708d661b](https://github.com/facebook/react-native/commit/e4708d661bf3d01ec857635f04a4aabf9d954a5e) by [@sammy-SC](https://github.com/sammy-SC)) +- TouchableWithoutFeedback and TouchableOpacity dropping touches with React 18. ([54166342f0](https://github.com/facebook/react-native/commit/54166342f01fc74236ba6146a4c0f604189017e4) by [@sammy-SC](https://github.com/sammy-SC)) + +#### iOS specific + +- Restrict Cocoapods versions < 1.15. ([3869ae4d80](https://github.com/facebook/react-native/commit/3869ae4d80d1da8c4e3fe7449f2926c5e1575beb) by [@blakef](https://github.com/blakef)) +- Make `RCTDeviceInfo` listen to invalidate events and unregister observers while invalidating the bridge ([d46d80d2ef](https://github.com/facebook/react-native/commit/d46d80d2ef6cdc05c5a1b2429ed1df93410ae36f) by [@cipolleschi](https://github.com/cipolleschi)) +- Fix support for SOURCEMAP_FILE path containing spaces ([63e893d23d](https://github.com/facebook/react-native/commit/63e893d23d84c9bf65bad64fc359b9686eb19b4d) by [@paulschreiber](https://github.com/paulschreiber)) +- Fix release build error due to a casing issue in hermes tarball path after download prebuilt tarball ([2e2f8a6689](https://github.com/facebook/react-native/commit/2e2f8a668907552070a2a53a47137b1449b66bbd) by [@wfern](https://github.com/wfern)) +- Fix race condition between A11yManager and UIManager ([f39f34ed82](https://github.com/facebook/react-native/commit/f39f34ed82997d0595522a285c3cb8693594e718) by [@cipolleschi](https://github.com/cipolleschi)) +- Fix symbol not found _jump_fcontext with use_frameworks ([a2771ce58a](https://github.com/facebook/react-native/commit/a2771ce58ac221d1ac0de265c1ce571212fbcf83) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.72.10 + +### Added + +- Unhandled promise rejection - attach non-standard Error object stack info if possible ([655b12dbfa](https://github.com/facebook/react-native/commit/655b12dbfaa2c48f9fd38bbe8311e6f935045b30) by [@ospfranco](https://github.com/ospfranco)) + +### Fixed + +- Revert the regression of iOS min version and updates Podfile.lock for Releases ([1f70f58aa4](https://github.com/facebook/react-native/commit/1f70f58aa4225d017ebad4f66641cbd0d1db114f) by [@cipolleschi](https://github.com/cipolleschi)) +- Fix flags ([565281105e](https://github.com/facebook/react-native/commit/565281105e4a0c4d51d2134114bdadb33f03d61a) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.72.9 + +### Fixed + +- Fix boost link ([d62d714ada](https://github.com/facebook/react-native/commit/d62d714adab891028004063136a7e906478618c4) by [@cipolleschi](https://github.com/cipolleschi)) +- Fix New Arch build failing with -std=c++20 ([b7c1a40db4](https://github.com/facebook/react-native/commit/b7c1a40db4d5a6d992b926307842fe671ae80436) by [@tido64](https://github.com/tido64)) +- Fix ruby tests ([7c7baad7bd](https://github.com/facebook/react-native/commit/7c7baad7bd62cf59b46a426eeb31aefc1e85bca7) by [@cipolleschi](https://github.com/cipolleschi)) +- Bump Podfile.lock and try to fix Hermes update ([34da08755d](https://github.com/facebook/react-native/commit/34da08755d88a726e0a68d7a2ef544fe4af0dc6e) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.73.2 + +### Added + +- Unhandled promise rejection - attach non-standard Error object stack info if possible ([655b12dbfa](https://github.com/facebook/react-native/commit/655b12dbfaa2c48f9fd38bbe8311e6f935045b30) by [@ospfranco](https://github.com/ospfranco)) + +### Changed + +- Bump Metro to ^v0.80.3 ([16dff523b0](https://github.com/facebook/react-native/commit/16dff523b0a16d7fa9b651062c386885c2f48a6b) by [@huntie](https://github.com/huntie)) +- Automatically reconnect to an existing debugger session on relaunching the app ([0806ad7854](https://github.com/facebook/react-native/commit/0806ad785458009887ff4c67b995ec992a010702) by [@motiz88](https://github.com/motiz88)) + +#### iOS specific + +- Update ios pod post_install logic for detecting if hermes is enabled ([d6163d7f43](https://github.com/facebook/react-native/commit/d6163d7f43a753f24148450033491dfc9c5d0c36) by [@gabrieldonadel](https://github.com/gabrieldonadel)) + +### Fixed + +- Fix comment about adding packages in android template ([ac9b87cd57](https://github.com/facebook/react-native/commit/ac9b87cd57029a0f0876aaec8d259d9befba9838) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix boost download url ([7e721f09ad](https://github.com/facebook/react-native/commit/7e721f09ad3dafed9f490f433b2ac613786c27b2) by [@cipolleschi](https://github.com/cipolleschi)) + +#### iOS specific + +- Fix horizontal scrollview scrollTo coordinate space in RTL on oldarch ([e809e0aca7](https://github.com/facebook/react-native/commit/e809e0aca713ad12f91778b09f5297f1da866b26) by [@NickGerleman](https://github.com/NickGerleman)) +- [enhance IP address retrieval for iOS devices in Metro bundler setup](https://github.com/facebook/react-native/pull/41839/commits/6a351db158dadf944933173aa0150435c742001f) ([9f28616650](https://github.com/facebook/react-native/commit/9f28616650a61ca298c2fc710b588445b8ceb94c) by [@Morritz](https://github.com/Morritz)) + This file contains all changelogs for latest releases, from 0.70.0 onward. Please check out the other `CHANGELOG-*.md` files for previous versions. -## v0.73.0-rc.0 / v0.73.0-rc.1 +## v0.73.1 + +### Added + +- Add `enableNetworkInspector` experiment to enable Network panel and CDP handlers in inspector proxy ([8ef807bfb2](https://github.com/facebook/react-native/commit/8ef807bfb2e596bd70f0c8b17f1b6f698d98ae2a) by [@byCedric](https://github.com/byCedric)) + +### Changed + +- Chore: bump CLI to 12.3.0 ([dff11ab993](https://github.com/facebook/react-native/commit/dff11ab993e57a097988537791afe8ef086e4ce4) by [@szymonrybczak](https://github.com/szymonrybczak)) + +### Fixed + +- Fix last spacer constrain logic in VirtualizedList ([3ed4bf9046](https://github.com/facebook/react-native/commit/3ed4bf9046ae125d244283c3556892345bfd77e1) by [@janicduplessis](https://github.com/janicduplessis)) + +#### Android specific + +- Fix type for unrecognisable field mBinding ([31d8a93bf3](https://github.com/facebook/react-native/commit/31d8a93bf3199432bcd2b577738fbf49e84c207d) by [@piaskowyk](https://github.com/piaskowyk)) + +#### iOS specific + +- Fix NSAppTransportSecurity being overwritten during pod install ([a0b76d90b7](https://github.com/facebook/react-native/commit/a0b76d90b73ec0d3d9e0174004bfb96a5b6f3a3e) by [@robertying](https://github.com/robertying)) + +## v0.73.0 ### Breaking @@ -28,6 +144,7 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - W3CPointerEvents: change click event from direct to bubbling ([61eb9b4453](https://github.com/facebook/react-native/commit/61eb9b4453c96d3dc662319c9c9f322bf04d1d44)) - Fix `ReactTextView` `setPadding` applying logic error ([d8ced6f895](https://github.com/facebook/react-native/commit/d8ced6f8953cd896471983714e722caf50783960) by [@jcdhlzq](https://github.com/jcdhlzq)) - Add `view` getter on `RCTRootView` / `RCTFabricSurfaceHostingProxyRootView ([33e0521788](https://github.com/facebook/react-native/commit/33e0521788484eaba20beeeaabba2496854583a7) by [@zoontek](https://github.com/zoontek)) +- Remove support for Android API < 23 in ReactEditText ([1904e8036a](https://github.com/facebook/react-native/commit/1904e8036a777e463c5517010a254f0d081ae58c) by [@mdvacca](https://github.com/mdvacca)) #### iOS specific @@ -76,6 +193,7 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - Websocket Module setCustomClientBuilder ([0cdb9e6a52](https://github.com/facebook/react-native/commit/0cdb9e6a52f69ebee635d5bfaa34a52f6059dd47) by [@MO-Lewis](https://github.com/MO-Lewis)) - Remove JNI Binding usage of layoutContext ([733c9289a1](https://github.com/facebook/react-native/commit/733c9289a15afe2c39a6bde56a472fe879a855f8) by [@NickGerleman](https://github.com/NickGerleman)) - Added testing shadow helpers for robolectric ([4890d50edd](https://github.com/facebook/react-native/commit/4890d50eddbd9035e567134ac9b7d8570bae60f1) by [@philIip](https://github.com/philIip)) +- Android Events - setting default to true to use C++ event pipeline ([b816fa7a65](https://github.com/facebook/react-native/commit/b816fa7a65abe7535c4664d64827646d0ebacf03) by Jesse Watts-Russell) #### iOS specific @@ -107,7 +225,7 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - Address errors in viewability thresholds on Virtualized list by Math.floor the top and bottom dimensions of a cell item when determining viewability. ([824c1c6d07](https://github.com/facebook/react-native/commit/824c1c6d073ba53aab350bc617169ba04e568b19) by [@lunaleaps](https://github.com/lunaleaps)) - Change `_onLayout` to update bottom height when frame height is changed ([5059ddc5ce](https://github.com/facebook/react-native/commit/5059ddc5ce623234820f231e5f4d75ea9ddf5a5b) by [@lyqandy](https://github.com/lyqandy)) - Renaming bridgeless to runtime ([1547b81ec1](https://github.com/facebook/react-native/commit/1547b81ec18f4d66991831d06ce456472456bed5)) -- Upgraded Metro to 0.79.1 ([982f6f99d4](https://github.com/facebook/react-native/commit/982f6f99d43b21b3a81d3388591934d6f83afa63)) +- Update Metro to ^0.80.0, don't pin to exact version ([aed4aed9d5](https://github.com/facebook/react-native/commit/aed4aed9d5b02043291642c9177ceea9df9c7a4a) by [@robhogan](https://github.com/robhogan)) - Bump Jest version in the new project template from `^29.2.1` to `^29.6.3` ([3c323382fe](https://github.com/facebook/react-native/commit/3c323382fe9ef05832fc44c6e87642de55965a4b) by [@robhogan](https://github.com/robhogan)) - ReactImagePropertyList.java => ReactImagePropertyList.kt ([cb60e5c67b](https://github.com/facebook/react-native/commit/cb60e5c67b409da1b22e856446183bc7c82d828b) by [@bufgix](https://github.com/bufgix)) - `BaseViewManagerTest.java` => `BaseViewManagerTest.kt` ([3660b7cf73](https://github.com/facebook/react-native/commit/3660b7cf73a322750fb9cc9aa124da0f5e739c80) by [@retyui](https://github.com/retyui)) @@ -122,6 +240,7 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - Jest globals are now defined using `Object.defineProperties` instead of object property assignment ([cf631ad59f](https://github.com/facebook/react-native/commit/cf631ad59f39bbace1a7c2311a4f66f9494ed0da) by [@yungsters](https://github.com/yungsters)) - Support mixed props for events in codegen ([b68f53d44f](https://github.com/facebook/react-native/commit/b68f53d44f78c5627905246d8737fe46229f85aa) by [@genkikondo](https://github.com/genkikondo)) - React-native-codegen: Buck-only: renamed src_prefix kwarg ([9193c4f50c](https://github.com/facebook/react-native/commit/9193c4f50c471193979bab589996d97bab489db4) by [@fkgozali](https://github.com/fkgozali)) +- Update CLI to v12.1.1 ([3da0959291](https://github.com/facebook/react-native/commit/3da0959291d34eca45da386a660bff184b7adb9e) by [@szymonrybczak](https://github.com/szymonrybczak)) #### Android specific @@ -151,6 +270,7 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - Kotlin to 1.8.0 and JDK Toolchain to 11 ([74987b6fca](https://github.com/facebook/react-native/commit/74987b6fca4aa31e15f83d871138f4edf258c082) by [@cortinico](https://github.com/cortinico)) - Deprecate APIs that are deprecate only on JavaDoc ([1be65baf29](https://github.com/facebook/react-native/commit/1be65baf29967ec062f049d57d579694af816c1c) by [@cortinico](https://github.com/cortinico)) - Gradle to 8.1 ([74f256b6f0](https://github.com/facebook/react-native/commit/74f256b6f019877c2854541845e11e024c16dd44) by [@cortinico](https://github.com/cortinico)) +- "Open Debugger" is no longer available for remote JS debugging from the Dev Menu (non-Hermes). Please use `NativeDevSettings.setIsDebuggingRemotely()`. ([361a944348](https://github.com/facebook/react-native/commit/361a944348e4da5d17f910965d0b89c9e65b18c7) by [@huntie](https://github.com/huntie)) #### iOS specific @@ -283,6 +403,11 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - Terminate instead of throwing if TurboModule callback double-called ([dfd445cbc6](https://github.com/facebook/react-native/commit/dfd445cbc69c8bc6c5d1d3d7948472a0a3ae4927) by [@NickGerleman](https://github.com/NickGerleman)) - Reduce dynamic SchedulerFeatureFlags ([2a58b06863](https://github.com/facebook/react-native/commit/2a58b06863b320403cbbbeb9909e25db9c2aaa4e) by [@kassens](https://github.com/kassens)) - Enable -Wextra in C++ builds ([99674b360a](https://github.com/facebook/react-native/commit/99674b360a8b1a24545af9c56c9f55b2ec121ff6) by [@NickGerleman](https://github.com/NickGerleman)) +- Update `deprecated-react-native-prop-types` to remove fragile transitive `*` dependencies. ([f00594b262](https://github.com/facebook/react-native/commit/f00594b26203ad2793b40c31d4f882d29daec46e) by [@robhogan](https://github.com/robhogan)) +- Fix `createAnimatedStyle` when providing an undefined transform style ([7e26e0270b](https://github.com/facebook/react-native/commit/7e26e0270b5d9f8490320af563a4943d24d269ea) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Bail on hiPri render on missing layout data before checking priority ([817fedb0e7](https://github.com/facebook/react-native/commit/817fedb0e7a5276d86431c65cc886062ed8fe220) by [@NickGerleman](https://github.com/NickGerleman)) +- `react-native/codegen` shouldn't be built unless it's in the repo — fixes `pod install` failures in pnpm setups ([3dd6a83c0e](https://github.com/facebook/react-native/commit/3dd6a83c0e39c54b4ff050589e4e13f1ccc66a5d) by [@tido64](https://github.com/tido64)) +- Correctly declare runtime dependencies ([c32064c510](https://github.com/facebook/react-native/commit/c32064c5102cfd9b48abd25697cef9ceb05d18a3) by [@tido64](https://github.com/tido64)) #### Android specific @@ -324,6 +449,9 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - Modify ViewManager.receiveCommand to call into delegate ([585057d746](https://github.com/facebook/react-native/commit/585057d7468b5ae8844fa8210df7ad1f8e0ae1e8) by [@genkikondo](https://github.com/genkikondo)) - Fix crash when Android requests permission with activity that does not implement `PermissionAwareActivity` ([cff4bc8eea](https://github.com/facebook/react-native/commit/cff4bc8eead129738a7040f579a18e3819d28bfd) by [@yungsters](https://github.com/yungsters)) - Fix issue downloading request body via remote URL ([4b39f44a61](https://github.com/facebook/react-native/commit/4b39f44a612e8f358b7f51cdb97b4d602207a754) by [@daisy1754](https://github.com/daisy1754)) +- Fix textTransform not working in New Architecture ([a2f3fa65bc](https://github.com/facebook/react-native/commit/a2f3fa65bcabf8bb711813292002270481840579) by [@tarunrajput](https://github.com/tarunrajput)) +- Fix projects being broken on dependencies starting with `a..` ([5ec2c01697](https://github.com/facebook/react-native/commit/5ec2c016972400cf6e26d987acec6feee46ba6e6) by [@cortinico](https://github.com/cortinico)) +- Fix android root view group removal during instance re-creation ([bb075d785d](https://github.com/facebook/react-native/commit/bb075d785deb3732689bf6aacdc5247187e81391) by [@wschurman](https://github.com/wschurman)) #### iOS specific @@ -352,7 +480,50 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - Debug builds from cli disable idle to stop application going into background ([41d5f4bce2](https://github.com/facebook/react-native/commit/41d5f4bce2850d3a81c0c02961c0768026dd353e) by [@blakef](https://github.com/blakef)) - Fix RCTImageBlurUtils.m Greyscale Crash ([d6c4f2786c](https://github.com/facebook/react-native/commit/d6c4f2786c1dd8285dbabb7fe872a7d1bddcbe14) by [@OskarEichler](https://github.com/OskarEichler)) - Logbox footer buttons respect safe area ([6d6b1fdc75](https://github.com/facebook/react-native/commit/6d6b1fdc75d870fa73abc6ee9bf0099f3f15e658) by [@philipheinser](https://github.com/philipheinser)) +- Add support for Components with custom names in the interop layer. ([daedbe6e3e](https://github.com/facebook/react-native/commit/daedbe6e3e4cb4b5fde533bf8205edd89a18c480) by [@cipolleschi](https://github.com/cipolleschi)) +- FP Tolerance in iOS Paper SafeAreaView debouncing ([c9c5651108](https://github.com/facebook/react-native/commit/c9c56511087d6e33bd4d2e86cbc1a76fc99ec8df) by [@NickGerleman](https://github.com/NickGerleman)) +- RNTester-ios / RCTAppDelegate > correctly check for USE_HERMES Flag ([e364553492](https://github.com/facebook/react-native/commit/e3645534920e509f1344e6f83916fcd61723403b) by [@christophpurrer](https://github.com/christophpurrer)) +- Exclude JSI headers when using hermes-engine prebuilt. ([5029cef0a9](https://github.com/facebook/react-native/commit/5029cef0a99469e37bc2f4d72ca2e1f3d6791511) by [@dmytrorykun](https://github.com/dmytrorykun)) +- Purge children from view registry on `RCTUIManager` invalidation. ([bc63e44b23](https://github.com/facebook/react-native/commit/bc63e44b23baddf579d8e42b70af0473314f8e48) by [@kkafar](https://github.com/kkafar)) +- Fix React-ImageManager dependencies ([830c2e7c57](https://github.com/facebook/react-native/commit/830c2e7c571650f49b645e7f9f9445a021e8a0a2) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.72.8 + +### Fixed + +- Fix `build_codegen!` not finding `@react-native/codegen` in pnpm setups ([e70166a3a8](https://github.com/facebook/react-native/commit/e70166a3a8b9ddf1a7e322db602c548aaa60102d) by [@tido64](https://github.com/tido64)) +- Correctly declare runtime dependencies ([df2bbba50b](https://github.com/facebook/react-native/commit/df2bbba50bf1484edf88079b965b8841fc7849a8) by [@tido64](https://github.com/tido64)) +- Prevent LogBox from crashing on very long messages ([c3c6cf4](https://github.com/facebook/react-native/commit/c3c6cf4646999e9bf971d2c0e63c41e550069f25) by [@motiz88](https://github.com/motiz88)) + +## v0.72.7 + +### Changed + +- Bump CLI to v11.3.10 ([e844a62ce9](https://github.com/facebook/react-native/commit/e844a62ce9e6ae70bbeba895dcf902287570f462) by [@szymonrybczak](https://github.com/szymonrybczak)) + +### Deprecated + +- Bump deprecated-react-native-prop-types to ^4.2.3 ([e031c05cdc](https://github.com/facebook/react-native/commit/e031c05cdc5650f17231caf7f60820e1df744788) by [@huntie](https://github.com/huntie)) + +### Fixed + +- Show correct stack frame on unhandled promise rejections on development mode. + ([18c9797ecc](https://github.com/facebook/react-native/commit/18c9797ecc8dab220ec68aae011ddb73db17a99d) by [@fortmarek](https://github.com/fortmarek)) + +#### Android specific + +- Fix android crash when apply PlatformColor to borders ([265af222aa](https://github.com/facebook/react-native/commit/265af222aa8acb3b514e22a7db191d66755f553b) by [@axinvd](https://github.com/axinvd)) +- Fix broken Loading/Refreshing indicator on Android ([5dedf277cb](https://github.com/facebook/react-native/commit/5dedf277cb903528659f0d8a71412274d9d32a65) by [@cortinico](https://github.com/cortinico)) +## v0.72.6 + +### Fixed + +- Fix a potential bug in `EventEmitter` when used with certain Babel configurations that incorrectly polyfill the spread operator for iterables ([9b3bd63723](https://github.com/facebook/react-native/commit/9b3bd637231e5e9e7d8b729c71842f3b7a2da373) by [@yungsters](https://github.com/yungsters)) + +#### iOS specific + +- Set the max version of Active support to 7.0.8 ([785f91b67a](https://github.com/facebook/react-native/commit/785f91b67a5d97e4e54d341279c878483a3d9a11) by [@cipolleschi](https://github.com/cipolleschi)) ## v0.72.5 @@ -820,6 +991,53 @@ This file contains all changelogs for latest releases, from 0.70.0 onward. Pleas - Enable Address and Undefined Behavior Sanitizers on RNTester ([65e61f3c88](https://github.com/facebook/react-native/commit/65e61f3c88388d4a2ed88bcc9a2cb5ba63fd8afa) by [@Saadnajmi](https://github.com/Saadnajmi)) +## v0.71.16 + +### Changed + +#### Android specific + +- Cherry-picking 'Call super.onRequestPermissionsResult in ReactActivity (#42478)' onto 0.71 ([8593306b34](https://github.com/facebook/react-native/commit/8593306b348da498f18984985bc70e3e32156655) by [@LimAlbert](https://github.com/LimAlbert)) + +### Fixed + +- Symbolication stack fix (0.71.x) ([022a9f7835](https://github.com/facebook/react-native/commit/022a9f783561750be0f5c0e685d2ace8dd84d910) by [@joe-sam](https://github.com/joe-sam)) + +#### iOS specific + +- Fix path to build-apple-framework ([9d6a740bf7](https://github.com/facebook/react-native/commit/9d6a740bf7620a3c66f241351b4885f09b4e7524) by [@hurali97](https://github.com/hurali97)) +- Disable bitcode for Hermes ([d6fe029858](https://github.com/facebook/react-native/commit/d6fe02985849ba4712968b5811eeaf460640f85d) by [@hurali97](https://github.com/hurali97)) +- Fix symbol not found _jump_fcontext with use_frameworks! ([bb592ef0dd](https://github.com/facebook/react-native/commit/bb592ef0dda30c7652b23b45843f636c6439278d) by [@hurali97](https://github.com/hurali97)) +- Fix flags ([c38cdb60ca](https://github.com/facebook/react-native/commit/c38cdb60cad8fb6b0015e5d57afa4dd346fd71d2) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.71.15 + +### Fixed + +#### Android specific +- Fix Android crash when apply PlatformColor to borders ([265af222aa](https://github.com/facebook/react-native/commit/265af222aa8acb3b514e22a7db191d66755f553b) by [@axinvd](https://github.com/axinvd)) +- Fixed crash occurring in certain native views when keyboard events are fired. ([9497203957](https://github.com/facebook/react-native/commit/94972039571e1f3b387e0f63227a6ad13740eaf3) by [@kot331107](https://github.com/kot331107)) + +#### iOS specific + +- Migrate away from JFrog to download boost ([ab19fd6aef](https://github.com/facebook/react-native/commit/ab19fd6aef43a739f78cf62155fec59d95f577d3) by [@cipolleschi](https://github.com/cipolleschi)) +- Fix overriding `EXCLUDED_ARCHS` when installing Hermes on RN v0.71 ([16a605b6a3](https://github.com/facebook/react-native/commit/16a605b6a3c320f93b6cda9198d738672086e851) by [@ken0nek](https://github.com/ken0nek)) + +### Changed + +- Update node installation on debian (0.71) ([bdc0ef3466](https://github.com/facebook/react-native/commit/bdc0ef34664b7f1a2b8598ad6092a2ec6cf089ce) by [@cipolleschi](https://github.com/cipolleschi)) +- Bump cli to 10.2.6 ([0bc2dd03c1](https://github.com/facebook/react-native/commit/0bc2dd03c1ccb4ab6ecf55add249f222c5757f06) by [@hurali97](https://github.com/hurali97)) +- Fix version of react-native-codegen ([c74602fe47](https://github.com/facebook/react-native/commit/c74602fe47ca12a151eb173203fb6fce7f3cc964) by [@lunaleaps](https://github.com/lunaleaps)) + +## v0.71.14 + +### Fixed + +#### iOS specific + +- Set the max version of Active support to 7.0.8 ([ce39931bc2](https://github.com/facebook/react-native/commit/ce39931bc2b02f13cbc5751ba4d4a6dbc07bc91a) by [@cipolleschi](https://github.com/cipolleschi)) +- Xcode 15 patch ([287482e57f](https://github.com/facebook/react-native/commit/287482e57ffd221227e6fffb6852113d330260a1) by [@fortmarek](https://github.com/fortmarek)) + ## v0.71.13 ### Added @@ -1500,6 +1718,33 @@ Read the [announcement blogpost here](https://reactnative.dev/blog/2023/01/12/ve - Bump terser minor version to mitigate CVE-2022-25858 ([743f9ff63b](https://github.com/facebook/react-native/commit/743f9ff63bf1e3825a1788978a9f6bad8ebddc0d) by [@GijsWeterings](https://github.com/GijsWeterings)) +## v0.70.15 + +### Changed + +- BUMP CLI to v9.3.5 ([cb170efdd3](https://github.com/facebook/react-native/commit/cb170efdd346776aa6941512e1c23eb11c3f0a3a) by [@hurali97](https://github.com/hurali97)) +- Bump react-devtools-core to 4.27.7 ([abb4a2bddd](https://github.com/facebook/react-native/commit/abb4a2bdddbc904b4b3ff185e41c2dddb5ba684b) by [@lunaleaps](https://github.com/lunaleaps)) +- Bump hermes-engine ([5b95254359](https://github.com/facebook/react-native/commit/5b95254359da9813ce8eba5571b9abf6a5fcb21c) by [@cipolleschi](https://github.com/cipolleschi)) + +### Fixed + +#### iOS specific + +- Migrate boost download url away from JFrog ([e8e059a977](https://github.com/facebook/react-native/commit/e8e059a977ef2feec1b4b9dfd2866daede2b8ff8) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.70.14 + +### Changed +- Update JSCodeshift to 0.14 ([5a695dd](https://github.com/facebook/react-native/commit/5a695dd17c5681883018ba8d3c3608032aba14d9) by [@stianjensen](https://github.com/stianjensen)) + +### Fixed + +#### iOS specific + +- Fix Gemfile to set the max version of Active support to 7.0.8 ([a1a220b](https://github.com/facebook/react-native/commit/a1a220b6ace4e35b2cda45b869dc0ff4fb8fbdc1) by [@cipolleschi](https://github.com/cipolleschi)) +- Update Xcode 15 patches to be more robust ([735d06c01f](https://github.com/facebook/react-native/commit/735d06c01fe743fad58213e80bca64a0c70ea8ca) by [@cipolleschi](https://github.com/cipolleschi)) +- Make Hermes build properly with Xcode 15 ([5f4a091](https://github.com/facebook/react-native/commit/5f4a091a2ff86bcbcfa6f8fe438d260cca029cd3) by [@cipolleschi](https://github.com/cipolleschi)) + ## v0.70.13 ### Fixed diff --git a/Gemfile b/Gemfile index 1f657254243488..8e468b2c4e6681 100644 --- a/Gemfile +++ b/Gemfile @@ -3,5 +3,5 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version ruby ">= 2.6.10" -gem 'cocoapods', '~> 1.12' -gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' +gem 'cocoapods', '~> 1.13' +gem 'activesupport', '>= 6.1.7.5', '< 7.1.0' diff --git a/Gemfile.lock b/Gemfile.lock index 2cd8a627110c14..3a0e40f20c06af 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,25 +3,24 @@ GEM specs: CFPropertyList (3.0.6) rexml - activesupport (6.1.7.5) + activesupport (7.0.8) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.1) + addressable (2.8.5) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) claide (1.1.0) - cocoapods (1.12.0) + cocoapods (1.14.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.12.0) + cocoapods-core (= 1.14.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.6.0, < 2.0) + cocoapods-downloader (>= 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-trunk (>= 1.6.0, < 2.0) @@ -33,8 +32,8 @@ GEM molinillo (~> 0.8.0) nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.12.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.14.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -45,7 +44,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) + cocoapods-downloader (2.0) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -58,7 +57,7 @@ GEM escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - ffi (1.15.5) + ffi (1.16.3) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) @@ -66,7 +65,7 @@ GEM i18n (1.14.1) concurrent-ruby (~> 1.0) json (2.6.3) - minitest (5.19.0) + minitest (5.20.0) molinillo (0.8.0) nanaimo (0.3.0) nap (1.1.0) @@ -80,24 +79,23 @@ GEM ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - xcodeproj (1.22.0) + xcodeproj (1.23.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) nanaimo (~> 0.3.0) rexml (~> 3.2.4) - zeitwerk (2.6.11) PLATFORMS ruby DEPENDENCIES - activesupport (>= 6.1.7.3, < 7.1.0) - cocoapods (~> 1.12) + activesupport (>= 6.1.7.5, < 7.1.0) + cocoapods (~> 1.13) RUBY VERSION ruby 3.2.0p0 BUNDLED WITH - 2.3.22 + 2.4.12 diff --git a/README.md b/README.md index a65271293b6b76..03ce8eb170de4e 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ You can read more about the macOS implementation in our website - [React Native ## 📋 Requirements -React Native apps may target iOS 13.4 and Android 5.0 (API 21) 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 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. ## 🎉 Building your first React Native app diff --git a/build.gradle.kts b/build.gradle.kts index e545389b806729..e24bf6467328f4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.download) apply false alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.binary.compatibility.validator) apply true } val reactAndroidProperties = java.util.Properties() @@ -19,9 +20,23 @@ File("$rootDir/packages/react-native/ReactAndroid/gradle.properties").inputStrea reactAndroidProperties.load(it) } +fun getListReactAndroidProperty(name: String) = reactAndroidProperties.getProperty(name).split(",") + +apiValidation { + ignoredPackages.addAll( + getListReactAndroidProperty("binaryCompatibilityValidator.ignoredPackages")) + ignoredClasses.addAll(getListReactAndroidProperty("binaryCompatibilityValidator.ignoredClasses")) + nonPublicMarkers.addAll( + getListReactAndroidProperty("binaryCompatibilityValidator.nonPublicMarkers")) + validationDisabled = + reactAndroidProperties + .getProperty("binaryCompatibilityValidator.validationDisabled") + ?.toBoolean() == true +} + version = - if (project.hasProperty("isNightly") && - (project.property("isNightly") as? String).toBoolean()) { + if (project.hasProperty("isSnapshot") && + (project.property("isSnapshot") as? String).toBoolean()) { "${reactAndroidProperties.getProperty("VERSION_NAME")}-SNAPSHOT" } else { reactAndroidProperties.getProperty("VERSION_NAME") @@ -30,7 +45,7 @@ version = group = "com.facebook.react" val ndkPath by extra(System.getenv("ANDROID_NDK")) -val ndkVersion by extra(System.getenv("ANDROID_NDK_VERSION") ?: "26.0.10792818") +val ndkVersion by extra(System.getenv("ANDROID_NDK_VERSION") ?: libs.versions.ndkVersion.get()) val sonatypeUsername = findProperty("SONATYPE_USERNAME")?.toString() val sonatypePassword = findProperty("SONATYPE_PASSWORD")?.toString() @@ -74,21 +89,10 @@ tasks.register("build") { dependsOn(gradle.includedBuild("react-native-gradle-plugin").task(":build")) } -tasks.register("publishAllInsideNpmPackage") { - description = - "Publish all the artifacts to be available inside the NPM package in the `android` folder." - // Due to size constraints of NPM, we publish only react-native and hermes-engine inside - // the NPM package. - dependsOn(":packages:react-native:ReactAndroid:installArchives") - dependsOn(":packages:react-native:ReactAndroid:hermes-engine:installArchives") -} - 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. - dependsOn( - ":packages:react-native:ReactAndroid:flipper-integration:publishAllPublicationsToMavenTempLocalRepository") dependsOn( ":packages:react-native:ReactAndroid:hermes-engine:publishAllPublicationsToMavenTempLocalRepository") } @@ -97,7 +101,6 @@ tasks.register("publishAllToSonatype") { description = "Publish all the artifacts to Sonatype (Maven Central or Snapshot repository)" dependsOn(":packages:react-native:ReactAndroid:publishToSonatype") dependsOn(":packages:react-native:ReactAndroid:external-artifacts:publishToSonatype") - dependsOn(":packages:react-native:ReactAndroid:flipper-integration:publishToSonatype") dependsOn(":packages:react-native:ReactAndroid:hermes-engine:publishToSonatype") } diff --git a/flow-typed/npm/chromium-edge-launcher_v1.x.x.js b/flow-typed/npm/@rnx-kit/chromium-edge-launcher_v1.x.x.js similarity index 96% rename from flow-typed/npm/chromium-edge-launcher_v1.x.x.js rename to flow-typed/npm/@rnx-kit/chromium-edge-launcher_v1.x.x.js index dc3e9962ab83d4..4ee3ba0d5df351 100644 --- a/flow-typed/npm/chromium-edge-launcher_v1.x.x.js +++ b/flow-typed/npm/@rnx-kit/chromium-edge-launcher_v1.x.x.js @@ -9,7 +9,7 @@ * @oncall react_native */ -declare module 'chromium-edge-launcher' { +declare module '@rnx-kit/chromium-edge-launcher' { import typeof fs from 'fs'; import typeof childProcess from 'child_process'; import type {ChildProcess} from 'child_process'; diff --git a/flow-typed/npm/babel-traverse_v7.x.x.js b/flow-typed/npm/babel-traverse_v7.x.x.js index 2e3520dd23b98a..b35fd7863068c5 100644 --- a/flow-typed/npm/babel-traverse_v7.x.x.js +++ b/flow-typed/npm/babel-traverse_v7.x.x.js @@ -293,9 +293,6 @@ declare module '@babel/traverse' { dereference(): void; } - declare function getNodePathType(node: BabelNode): NodePath<>; - declare function getNodePathType(nodes: Array): Array>; - declare type Opts = {...}; declare export class NodePath<+TNode: BabelNode = BabelNode> { @@ -733,7 +730,7 @@ declare module '@babel/traverse' { get>( key: TKey, context?: boolean | TraversalContext, - ): $Call; + ): TNode[TKey] extends BabelNode ? NodePath<> : Array>; get( key: string, diff --git a/flow-typed/npm/babel-types_v7.x.x.js b/flow-typed/npm/babel-types_v7.x.x.js index 74249fe3c2fd76..6f344941bc71fd 100644 --- a/flow-typed/npm/babel-types_v7.x.x.js +++ b/flow-typed/npm/babel-types_v7.x.x.js @@ -3443,308 +3443,308 @@ declare module "@babel/types" { declare export function tsTypeParameterInstantiation(params: Array): BabelNodeTSTypeParameterInstantiation; declare export function tsTypeParameterDeclaration(params: Array): BabelNodeTSTypeParameterDeclaration; declare export function tsTypeParameter(constraint?: BabelNodeTSType, _default?: BabelNodeTSType, name: string): BabelNodeTSTypeParameter; - declare export function isArrayExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArrayExpression'); - declare export function isAssignmentExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'AssignmentExpression'); - declare export function isBinaryExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BinaryExpression'); - declare export function isInterpreterDirective(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InterpreterDirective'); - declare export function isDirective(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Directive'); - declare export function isDirectiveLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DirectiveLiteral'); - declare export function isBlockStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BlockStatement'); - declare export function isBreakStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BreakStatement'); - declare export function isCallExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'CallExpression'); - declare export function isCatchClause(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'CatchClause'); - declare export function isConditionalExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ConditionalExpression'); - declare export function isContinueStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ContinueStatement'); - declare export function isDebuggerStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DebuggerStatement'); - declare export function isDoWhileStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DoWhileStatement'); - declare export function isEmptyStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EmptyStatement'); - declare export function isExpressionStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExpressionStatement'); - declare export function isFile(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'File'); - declare export function isForInStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ForInStatement'); - declare export function isForStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ForStatement'); - declare export function isFunctionDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'FunctionDeclaration'); - declare export function isFunctionExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'FunctionExpression'); - declare export function isIdentifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Identifier'); - declare export function isIfStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'IfStatement'); - declare export function isLabeledStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'LabeledStatement'); - declare export function isStringLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'StringLiteral'); - declare export function isNumericLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NumericLiteral'); - declare export function isNullLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NullLiteral'); - declare export function isBooleanLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BooleanLiteral'); - declare export function isRegExpLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RegExpLiteral'); - declare export function isLogicalExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'LogicalExpression'); - declare export function isMemberExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'MemberExpression'); - declare export function isNewExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NewExpression'); - declare export function isProgram(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Program'); - declare export function isObjectExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectExpression'); - declare export function isObjectMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectMethod'); - declare export function isObjectProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectProperty'); - declare export function isRestElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RestElement'); - declare export function isReturnStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ReturnStatement'); - declare export function isSequenceExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SequenceExpression'); - declare export function isParenthesizedExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ParenthesizedExpression'); - declare export function isSwitchCase(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SwitchCase'); - declare export function isSwitchStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SwitchStatement'); - declare export function isThisExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ThisExpression'); - declare export function isThrowStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ThrowStatement'); - declare export function isTryStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TryStatement'); - declare export function isUnaryExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'UnaryExpression'); - declare export function isUpdateExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'UpdateExpression'); - declare export function isVariableDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'VariableDeclaration'); - declare export function isVariableDeclarator(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'VariableDeclarator'); - declare export function isWhileStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'WhileStatement'); - declare export function isWithStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'WithStatement'); - declare export function isAssignmentPattern(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'AssignmentPattern'); - declare export function isArrayPattern(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArrayPattern'); - declare export function isArrowFunctionExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArrowFunctionExpression'); - declare export function isClassBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassBody'); - declare export function isClassExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassExpression'); - declare export function isClassDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassDeclaration'); - declare export function isExportAllDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportAllDeclaration'); - declare export function isExportDefaultDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportDefaultDeclaration'); - declare export function isExportNamedDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportNamedDeclaration'); - declare export function isExportSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportSpecifier'); - declare export function isForOfStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ForOfStatement'); - declare export function isImportDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportDeclaration'); - declare export function isImportDefaultSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportDefaultSpecifier'); - declare export function isImportNamespaceSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportNamespaceSpecifier'); - declare export function isImportSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportSpecifier'); - declare export function isMetaProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'MetaProperty'); - declare export function isClassMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassMethod'); - declare export function isObjectPattern(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectPattern'); - declare export function isSpreadElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SpreadElement'); - declare export function isSuper(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Super'); - declare export function isTaggedTemplateExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TaggedTemplateExpression'); - declare export function isTemplateElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TemplateElement'); - declare export function isTemplateLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TemplateLiteral'); - declare export function isYieldExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'YieldExpression'); - declare export function isAwaitExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'AwaitExpression'); - declare export function isImport(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Import'); - declare export function isBigIntLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BigIntLiteral'); - declare export function isExportNamespaceSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportNamespaceSpecifier'); - declare export function isOptionalMemberExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'OptionalMemberExpression'); - declare export function isOptionalCallExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'OptionalCallExpression'); - declare export function isClassProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassProperty'); - declare export function isClassAccessorProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassAccessorProperty'); - declare export function isClassPrivateProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassPrivateProperty'); - declare export function isClassPrivateMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassPrivateMethod'); - declare export function isPrivateName(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'PrivateName'); - declare export function isStaticBlock(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'StaticBlock'); - declare export function isAnyTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'AnyTypeAnnotation'); - declare export function isArrayTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArrayTypeAnnotation'); - declare export function isBooleanTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BooleanTypeAnnotation'); - declare export function isBooleanLiteralTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BooleanLiteralTypeAnnotation'); - declare export function isNullLiteralTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NullLiteralTypeAnnotation'); - declare export function isClassImplements(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassImplements'); - declare export function isDeclareClass(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareClass'); - declare export function isDeclareFunction(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareFunction'); - declare export function isDeclareInterface(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareInterface'); - declare export function isDeclareModule(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareModule'); - declare export function isDeclareModuleExports(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareModuleExports'); - declare export function isDeclareTypeAlias(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareTypeAlias'); - declare export function isDeclareOpaqueType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareOpaqueType'); - declare export function isDeclareVariable(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareVariable'); - declare export function isDeclareExportDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareExportDeclaration'); - declare export function isDeclareExportAllDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareExportAllDeclaration'); - declare export function isDeclaredPredicate(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclaredPredicate'); - declare export function isExistsTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExistsTypeAnnotation'); - declare export function isFunctionTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'FunctionTypeAnnotation'); - declare export function isFunctionTypeParam(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'FunctionTypeParam'); - declare export function isGenericTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'GenericTypeAnnotation'); - declare export function isInferredPredicate(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InferredPredicate'); - declare export function isInterfaceExtends(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InterfaceExtends'); - declare export function isInterfaceDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InterfaceDeclaration'); - declare export function isInterfaceTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InterfaceTypeAnnotation'); - declare export function isIntersectionTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'IntersectionTypeAnnotation'); - declare export function isMixedTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'MixedTypeAnnotation'); - declare export function isEmptyTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EmptyTypeAnnotation'); - declare export function isNullableTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NullableTypeAnnotation'); - declare export function isNumberLiteralTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NumberLiteralTypeAnnotation'); - declare export function isNumberTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NumberTypeAnnotation'); - declare export function isObjectTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeAnnotation'); - declare export function isObjectTypeInternalSlot(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeInternalSlot'); - declare export function isObjectTypeCallProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeCallProperty'); - declare export function isObjectTypeIndexer(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeIndexer'); - declare export function isObjectTypeProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeProperty'); - declare export function isObjectTypeSpreadProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeSpreadProperty'); - declare export function isOpaqueType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'OpaqueType'); - declare export function isQualifiedTypeIdentifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'QualifiedTypeIdentifier'); - declare export function isStringLiteralTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'StringLiteralTypeAnnotation'); - declare export function isStringTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'StringTypeAnnotation'); - declare export function isSymbolTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SymbolTypeAnnotation'); - declare export function isThisTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ThisTypeAnnotation'); - declare export function isTupleTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TupleTypeAnnotation'); - declare export function isTypeofTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeofTypeAnnotation'); - declare export function isTypeAlias(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeAlias'); - declare export function isTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeAnnotation'); - declare export function isTypeCastExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeCastExpression'); - declare export function isTypeParameter(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeParameter'); - declare export function isTypeParameterDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeParameterDeclaration'); - declare export function isTypeParameterInstantiation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeParameterInstantiation'); - declare export function isUnionTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'UnionTypeAnnotation'); - declare export function isVariance(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Variance'); - declare export function isVoidTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'VoidTypeAnnotation'); - declare export function isEnumDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumDeclaration'); - declare export function isEnumBooleanBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumBooleanBody'); - declare export function isEnumNumberBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumNumberBody'); - declare export function isEnumStringBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumStringBody'); - declare export function isEnumSymbolBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumSymbolBody'); - declare export function isEnumBooleanMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumBooleanMember'); - declare export function isEnumNumberMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumNumberMember'); - declare export function isEnumStringMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumStringMember'); - declare export function isEnumDefaultedMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumDefaultedMember'); - declare export function isIndexedAccessType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'IndexedAccessType'); - declare export function isOptionalIndexedAccessType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'OptionalIndexedAccessType'); - declare export function isJSXAttribute(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXAttribute'); - declare export function isJSXClosingElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXClosingElement'); - declare export function isJSXElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXElement'); - declare export function isJSXEmptyExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXEmptyExpression'); - declare export function isJSXExpressionContainer(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXExpressionContainer'); - declare export function isJSXSpreadChild(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXSpreadChild'); - declare export function isJSXIdentifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXIdentifier'); - declare export function isJSXMemberExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXMemberExpression'); - declare export function isJSXNamespacedName(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXNamespacedName'); - declare export function isJSXOpeningElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXOpeningElement'); - declare export function isJSXSpreadAttribute(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXSpreadAttribute'); - declare export function isJSXText(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXText'); - declare export function isJSXFragment(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXFragment'); - declare export function isJSXOpeningFragment(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXOpeningFragment'); - declare export function isJSXClosingFragment(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXClosingFragment'); - declare export function isNoop(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Noop'); - declare export function isPlaceholder(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Placeholder'); - declare export function isV8IntrinsicIdentifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'V8IntrinsicIdentifier'); - declare export function isArgumentPlaceholder(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArgumentPlaceholder'); - declare export function isBindExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BindExpression'); - declare export function isImportAttribute(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportAttribute'); - declare export function isDecorator(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Decorator'); - declare export function isDoExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DoExpression'); - declare export function isExportDefaultSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportDefaultSpecifier'); - declare export function isRecordExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RecordExpression'); - declare export function isTupleExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TupleExpression'); - declare export function isDecimalLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DecimalLiteral'); - declare export function isModuleExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ModuleExpression'); - declare export function isTopicReference(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TopicReference'); - declare export function isPipelineTopicExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'PipelineTopicExpression'); - declare export function isPipelineBareFunction(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'PipelineBareFunction'); - declare export function isPipelinePrimaryTopicReference(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'PipelinePrimaryTopicReference'); - declare export function isTSParameterProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSParameterProperty'); - declare export function isTSDeclareFunction(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSDeclareFunction'); - declare export function isTSDeclareMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSDeclareMethod'); - declare export function isTSQualifiedName(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSQualifiedName'); - declare export function isTSCallSignatureDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSCallSignatureDeclaration'); - declare export function isTSConstructSignatureDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSConstructSignatureDeclaration'); - declare export function isTSPropertySignature(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSPropertySignature'); - declare export function isTSMethodSignature(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSMethodSignature'); - declare export function isTSIndexSignature(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSIndexSignature'); - declare export function isTSAnyKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSAnyKeyword'); - declare export function isTSBooleanKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSBooleanKeyword'); - declare export function isTSBigIntKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSBigIntKeyword'); - declare export function isTSIntrinsicKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSIntrinsicKeyword'); - declare export function isTSNeverKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNeverKeyword'); - declare export function isTSNullKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNullKeyword'); - declare export function isTSNumberKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNumberKeyword'); - declare export function isTSObjectKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSObjectKeyword'); - declare export function isTSStringKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSStringKeyword'); - declare export function isTSSymbolKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSSymbolKeyword'); - declare export function isTSUndefinedKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSUndefinedKeyword'); - declare export function isTSUnknownKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSUnknownKeyword'); - declare export function isTSVoidKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSVoidKeyword'); - declare export function isTSThisType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSThisType'); - declare export function isTSFunctionType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSFunctionType'); - declare export function isTSConstructorType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSConstructorType'); - declare export function isTSTypeReference(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeReference'); - declare export function isTSTypePredicate(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypePredicate'); - declare export function isTSTypeQuery(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeQuery'); - declare export function isTSTypeLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeLiteral'); - declare export function isTSArrayType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSArrayType'); - declare export function isTSTupleType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTupleType'); - declare export function isTSOptionalType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSOptionalType'); - declare export function isTSRestType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSRestType'); - declare export function isTSNamedTupleMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNamedTupleMember'); - declare export function isTSUnionType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSUnionType'); - declare export function isTSIntersectionType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSIntersectionType'); - declare export function isTSConditionalType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSConditionalType'); - declare export function isTSInferType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSInferType'); - declare export function isTSParenthesizedType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSParenthesizedType'); - declare export function isTSTypeOperator(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeOperator'); - declare export function isTSIndexedAccessType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSIndexedAccessType'); - declare export function isTSMappedType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSMappedType'); - declare export function isTSLiteralType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSLiteralType'); - declare export function isTSExpressionWithTypeArguments(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSExpressionWithTypeArguments'); - declare export function isTSInterfaceDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSInterfaceDeclaration'); - declare export function isTSInterfaceBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSInterfaceBody'); - declare export function isTSTypeAliasDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeAliasDeclaration'); - declare export function isTSInstantiationExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSInstantiationExpression'); - declare export function isTSAsExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSAsExpression'); - declare export function isTSSatisfiesExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSSatisfiesExpression'); - declare export function isTSTypeAssertion(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeAssertion'); - declare export function isTSEnumDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSEnumDeclaration'); - declare export function isTSEnumMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSEnumMember'); - declare export function isTSModuleDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSModuleDeclaration'); - declare export function isTSModuleBlock(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSModuleBlock'); - declare export function isTSImportType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSImportType'); - declare export function isTSImportEqualsDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSImportEqualsDeclaration'); - declare export function isTSExternalModuleReference(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSExternalModuleReference'); - declare export function isTSNonNullExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNonNullExpression'); - declare export function isTSExportAssignment(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSExportAssignment'); - declare export function isTSNamespaceExportDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNamespaceExportDeclaration'); - declare export function isTSTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeAnnotation'); - declare export function isTSTypeParameterInstantiation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeParameterInstantiation'); - declare export function isTSTypeParameterDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeParameterDeclaration'); - declare export function isTSTypeParameter(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeParameter'); - declare export function isStandardized(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ArrayExpression' || node.type === 'AssignmentExpression' || node.type === 'BinaryExpression' || node.type === 'InterpreterDirective' || node.type === 'Directive' || node.type === 'DirectiveLiteral' || node.type === 'BlockStatement' || node.type === 'BreakStatement' || node.type === 'CallExpression' || node.type === 'CatchClause' || node.type === 'ConditionalExpression' || node.type === 'ContinueStatement' || node.type === 'DebuggerStatement' || node.type === 'DoWhileStatement' || node.type === 'EmptyStatement' || node.type === 'ExpressionStatement' || node.type === 'File' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'Identifier' || node.type === 'IfStatement' || node.type === 'LabeledStatement' || node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'RegExpLiteral' || node.type === 'LogicalExpression' || node.type === 'MemberExpression' || node.type === 'NewExpression' || node.type === 'Program' || node.type === 'ObjectExpression' || node.type === 'ObjectMethod' || node.type === 'ObjectProperty' || node.type === 'RestElement' || node.type === 'ReturnStatement' || node.type === 'SequenceExpression' || node.type === 'ParenthesizedExpression' || node.type === 'SwitchCase' || node.type === 'SwitchStatement' || node.type === 'ThisExpression' || node.type === 'ThrowStatement' || node.type === 'TryStatement' || node.type === 'UnaryExpression' || node.type === 'UpdateExpression' || node.type === 'VariableDeclaration' || node.type === 'VariableDeclarator' || node.type === 'WhileStatement' || node.type === 'WithStatement' || node.type === 'AssignmentPattern' || node.type === 'ArrayPattern' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassBody' || node.type === 'ClassExpression' || node.type === 'ClassDeclaration' || node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration' || node.type === 'ExportSpecifier' || node.type === 'ForOfStatement' || node.type === 'ImportDeclaration' || node.type === 'ImportDefaultSpecifier' || node.type === 'ImportNamespaceSpecifier' || node.type === 'ImportSpecifier' || node.type === 'MetaProperty' || node.type === 'ClassMethod' || node.type === 'ObjectPattern' || node.type === 'SpreadElement' || node.type === 'Super' || node.type === 'TaggedTemplateExpression' || node.type === 'TemplateElement' || node.type === 'TemplateLiteral' || node.type === 'YieldExpression' || node.type === 'AwaitExpression' || node.type === 'Import' || node.type === 'BigIntLiteral' || node.type === 'ExportNamespaceSpecifier' || node.type === 'OptionalMemberExpression' || node.type === 'OptionalCallExpression' || node.type === 'ClassProperty' || node.type === 'ClassAccessorProperty' || node.type === 'ClassPrivateProperty' || node.type === 'ClassPrivateMethod' || node.type === 'PrivateName' || node.type === 'StaticBlock')); - declare export function isExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ArrayExpression' || node.type === 'AssignmentExpression' || node.type === 'BinaryExpression' || node.type === 'CallExpression' || node.type === 'ConditionalExpression' || node.type === 'FunctionExpression' || node.type === 'Identifier' || node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'RegExpLiteral' || node.type === 'LogicalExpression' || node.type === 'MemberExpression' || node.type === 'NewExpression' || node.type === 'ObjectExpression' || node.type === 'SequenceExpression' || node.type === 'ParenthesizedExpression' || node.type === 'ThisExpression' || node.type === 'UnaryExpression' || node.type === 'UpdateExpression' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassExpression' || node.type === 'MetaProperty' || node.type === 'Super' || node.type === 'TaggedTemplateExpression' || node.type === 'TemplateLiteral' || node.type === 'YieldExpression' || node.type === 'AwaitExpression' || node.type === 'Import' || node.type === 'BigIntLiteral' || node.type === 'OptionalMemberExpression' || node.type === 'OptionalCallExpression' || node.type === 'TypeCastExpression' || node.type === 'JSXElement' || node.type === 'JSXFragment' || node.type === 'BindExpression' || node.type === 'DoExpression' || node.type === 'RecordExpression' || node.type === 'TupleExpression' || node.type === 'DecimalLiteral' || node.type === 'ModuleExpression' || node.type === 'TopicReference' || node.type === 'PipelineTopicExpression' || node.type === 'PipelineBareFunction' || node.type === 'PipelinePrimaryTopicReference' || node.type === 'TSInstantiationExpression' || node.type === 'TSAsExpression' || node.type === 'TSSatisfiesExpression' || node.type === 'TSTypeAssertion' || node.type === 'TSNonNullExpression')); - declare export function isBinary(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BinaryExpression' || node.type === 'LogicalExpression')); - declare export function isScopable(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BlockStatement' || node.type === 'CatchClause' || node.type === 'DoWhileStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'Program' || node.type === 'ObjectMethod' || node.type === 'SwitchStatement' || node.type === 'WhileStatement' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassExpression' || node.type === 'ClassDeclaration' || node.type === 'ForOfStatement' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod' || node.type === 'StaticBlock' || node.type === 'TSModuleBlock')); - declare export function isBlockParent(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BlockStatement' || node.type === 'CatchClause' || node.type === 'DoWhileStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'Program' || node.type === 'ObjectMethod' || node.type === 'SwitchStatement' || node.type === 'WhileStatement' || node.type === 'ArrowFunctionExpression' || node.type === 'ForOfStatement' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod' || node.type === 'StaticBlock' || node.type === 'TSModuleBlock')); - declare export function isBlock(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BlockStatement' || node.type === 'Program' || node.type === 'TSModuleBlock')); - declare export function isStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BlockStatement' || node.type === 'BreakStatement' || node.type === 'ContinueStatement' || node.type === 'DebuggerStatement' || node.type === 'DoWhileStatement' || node.type === 'EmptyStatement' || node.type === 'ExpressionStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'IfStatement' || node.type === 'LabeledStatement' || node.type === 'ReturnStatement' || node.type === 'SwitchStatement' || node.type === 'ThrowStatement' || node.type === 'TryStatement' || node.type === 'VariableDeclaration' || node.type === 'WhileStatement' || node.type === 'WithStatement' || node.type === 'ClassDeclaration' || node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration' || node.type === 'ForOfStatement' || node.type === 'ImportDeclaration' || node.type === 'DeclareClass' || node.type === 'DeclareFunction' || node.type === 'DeclareInterface' || node.type === 'DeclareModule' || node.type === 'DeclareModuleExports' || node.type === 'DeclareTypeAlias' || node.type === 'DeclareOpaqueType' || node.type === 'DeclareVariable' || node.type === 'DeclareExportDeclaration' || node.type === 'DeclareExportAllDeclaration' || node.type === 'InterfaceDeclaration' || node.type === 'OpaqueType' || node.type === 'TypeAlias' || node.type === 'EnumDeclaration' || node.type === 'TSDeclareFunction' || node.type === 'TSInterfaceDeclaration' || node.type === 'TSTypeAliasDeclaration' || node.type === 'TSEnumDeclaration' || node.type === 'TSModuleDeclaration' || node.type === 'TSImportEqualsDeclaration' || node.type === 'TSExportAssignment' || node.type === 'TSNamespaceExportDeclaration')); - declare export function isTerminatorless(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BreakStatement' || node.type === 'ContinueStatement' || node.type === 'ReturnStatement' || node.type === 'ThrowStatement' || node.type === 'YieldExpression' || node.type === 'AwaitExpression')); - declare export function isCompletionStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BreakStatement' || node.type === 'ContinueStatement' || node.type === 'ReturnStatement' || node.type === 'ThrowStatement')); - declare export function isConditional(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ConditionalExpression' || node.type === 'IfStatement')); - declare export function isLoop(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'DoWhileStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'WhileStatement' || node.type === 'ForOfStatement')); - declare export function isWhile(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'DoWhileStatement' || node.type === 'WhileStatement')); - declare export function isExpressionWrapper(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ExpressionStatement' || node.type === 'ParenthesizedExpression' || node.type === 'TypeCastExpression')); - declare export function isFor(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'ForOfStatement')); - declare export function isForXStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ForInStatement' || node.type === 'ForOfStatement')); - declare export function isFunction(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ObjectMethod' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod')); - declare export function isFunctionParent(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ObjectMethod' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod' || node.type === 'StaticBlock' || node.type === 'TSModuleBlock')); - declare export function isPureish(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'RegExpLiteral' || node.type === 'ArrowFunctionExpression' || node.type === 'BigIntLiteral' || node.type === 'DecimalLiteral')); - declare export function isDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'FunctionDeclaration' || node.type === 'VariableDeclaration' || node.type === 'ClassDeclaration' || node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration' || node.type === 'ImportDeclaration' || node.type === 'DeclareClass' || node.type === 'DeclareFunction' || node.type === 'DeclareInterface' || node.type === 'DeclareModule' || node.type === 'DeclareModuleExports' || node.type === 'DeclareTypeAlias' || node.type === 'DeclareOpaqueType' || node.type === 'DeclareVariable' || node.type === 'DeclareExportDeclaration' || node.type === 'DeclareExportAllDeclaration' || node.type === 'InterfaceDeclaration' || node.type === 'OpaqueType' || node.type === 'TypeAlias' || node.type === 'EnumDeclaration' || node.type === 'TSDeclareFunction' || node.type === 'TSInterfaceDeclaration' || node.type === 'TSTypeAliasDeclaration' || node.type === 'TSEnumDeclaration' || node.type === 'TSModuleDeclaration')); - declare export function isPatternLike(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'Identifier' || node.type === 'RestElement' || node.type === 'AssignmentPattern' || node.type === 'ArrayPattern' || node.type === 'ObjectPattern' || node.type === 'TSAsExpression' || node.type === 'TSSatisfiesExpression' || node.type === 'TSTypeAssertion' || node.type === 'TSNonNullExpression')); - declare export function isLVal(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'Identifier' || node.type === 'MemberExpression' || node.type === 'RestElement' || node.type === 'AssignmentPattern' || node.type === 'ArrayPattern' || node.type === 'ObjectPattern' || node.type === 'TSParameterProperty' || node.type === 'TSAsExpression' || node.type === 'TSSatisfiesExpression' || node.type === 'TSTypeAssertion' || node.type === 'TSNonNullExpression')); - declare export function isTSEntityName(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'Identifier' || node.type === 'TSQualifiedName')); - declare export function isLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'RegExpLiteral' || node.type === 'TemplateLiteral' || node.type === 'BigIntLiteral' || node.type === 'DecimalLiteral')); - declare export function isImmutable(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'BigIntLiteral' || node.type === 'JSXAttribute' || node.type === 'JSXClosingElement' || node.type === 'JSXElement' || node.type === 'JSXExpressionContainer' || node.type === 'JSXSpreadChild' || node.type === 'JSXOpeningElement' || node.type === 'JSXText' || node.type === 'JSXFragment' || node.type === 'JSXOpeningFragment' || node.type === 'JSXClosingFragment' || node.type === 'DecimalLiteral')); - declare export function isUserWhitespacable(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ObjectMethod' || node.type === 'ObjectProperty' || node.type === 'ObjectTypeInternalSlot' || node.type === 'ObjectTypeCallProperty' || node.type === 'ObjectTypeIndexer' || node.type === 'ObjectTypeProperty' || node.type === 'ObjectTypeSpreadProperty')); - declare export function isMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ObjectMethod' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod')); - declare export function isObjectMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ObjectMethod' || node.type === 'ObjectProperty')); - declare export function isProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ObjectProperty' || node.type === 'ClassProperty' || node.type === 'ClassAccessorProperty' || node.type === 'ClassPrivateProperty')); - declare export function isUnaryLike(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'UnaryExpression' || node.type === 'SpreadElement')); - declare export function isPattern(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'AssignmentPattern' || node.type === 'ArrayPattern' || node.type === 'ObjectPattern')); - declare export function isClass(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ClassExpression' || node.type === 'ClassDeclaration')); - declare export function isModuleDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration' || node.type === 'ImportDeclaration')); - declare export function isExportDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration')); - declare export function isModuleSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ExportSpecifier' || node.type === 'ImportDefaultSpecifier' || node.type === 'ImportNamespaceSpecifier' || node.type === 'ImportSpecifier' || node.type === 'ExportNamespaceSpecifier' || node.type === 'ExportDefaultSpecifier')); - declare export function isAccessor(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ClassAccessorProperty')); - declare export function isPrivate(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ClassPrivateProperty' || node.type === 'ClassPrivateMethod' || node.type === 'PrivateName')); - declare export function isFlow(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'AnyTypeAnnotation' || node.type === 'ArrayTypeAnnotation' || node.type === 'BooleanTypeAnnotation' || node.type === 'BooleanLiteralTypeAnnotation' || node.type === 'NullLiteralTypeAnnotation' || node.type === 'ClassImplements' || node.type === 'DeclareClass' || node.type === 'DeclareFunction' || node.type === 'DeclareInterface' || node.type === 'DeclareModule' || node.type === 'DeclareModuleExports' || node.type === 'DeclareTypeAlias' || node.type === 'DeclareOpaqueType' || node.type === 'DeclareVariable' || node.type === 'DeclareExportDeclaration' || node.type === 'DeclareExportAllDeclaration' || node.type === 'DeclaredPredicate' || node.type === 'ExistsTypeAnnotation' || node.type === 'FunctionTypeAnnotation' || node.type === 'FunctionTypeParam' || node.type === 'GenericTypeAnnotation' || node.type === 'InferredPredicate' || node.type === 'InterfaceExtends' || node.type === 'InterfaceDeclaration' || node.type === 'InterfaceTypeAnnotation' || node.type === 'IntersectionTypeAnnotation' || node.type === 'MixedTypeAnnotation' || node.type === 'EmptyTypeAnnotation' || node.type === 'NullableTypeAnnotation' || node.type === 'NumberLiteralTypeAnnotation' || node.type === 'NumberTypeAnnotation' || node.type === 'ObjectTypeAnnotation' || node.type === 'ObjectTypeInternalSlot' || node.type === 'ObjectTypeCallProperty' || node.type === 'ObjectTypeIndexer' || node.type === 'ObjectTypeProperty' || node.type === 'ObjectTypeSpreadProperty' || node.type === 'OpaqueType' || node.type === 'QualifiedTypeIdentifier' || node.type === 'StringLiteralTypeAnnotation' || node.type === 'StringTypeAnnotation' || node.type === 'SymbolTypeAnnotation' || node.type === 'ThisTypeAnnotation' || node.type === 'TupleTypeAnnotation' || node.type === 'TypeofTypeAnnotation' || node.type === 'TypeAlias' || node.type === 'TypeAnnotation' || node.type === 'TypeCastExpression' || node.type === 'TypeParameter' || node.type === 'TypeParameterDeclaration' || node.type === 'TypeParameterInstantiation' || node.type === 'UnionTypeAnnotation' || node.type === 'Variance' || node.type === 'VoidTypeAnnotation' || node.type === 'EnumDeclaration' || node.type === 'EnumBooleanBody' || node.type === 'EnumNumberBody' || node.type === 'EnumStringBody' || node.type === 'EnumSymbolBody' || node.type === 'EnumBooleanMember' || node.type === 'EnumNumberMember' || node.type === 'EnumStringMember' || node.type === 'EnumDefaultedMember' || node.type === 'IndexedAccessType' || node.type === 'OptionalIndexedAccessType')); - declare export function isFlowType(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'AnyTypeAnnotation' || node.type === 'ArrayTypeAnnotation' || node.type === 'BooleanTypeAnnotation' || node.type === 'BooleanLiteralTypeAnnotation' || node.type === 'NullLiteralTypeAnnotation' || node.type === 'ExistsTypeAnnotation' || node.type === 'FunctionTypeAnnotation' || node.type === 'GenericTypeAnnotation' || node.type === 'InterfaceTypeAnnotation' || node.type === 'IntersectionTypeAnnotation' || node.type === 'MixedTypeAnnotation' || node.type === 'EmptyTypeAnnotation' || node.type === 'NullableTypeAnnotation' || node.type === 'NumberLiteralTypeAnnotation' || node.type === 'NumberTypeAnnotation' || node.type === 'ObjectTypeAnnotation' || node.type === 'StringLiteralTypeAnnotation' || node.type === 'StringTypeAnnotation' || node.type === 'SymbolTypeAnnotation' || node.type === 'ThisTypeAnnotation' || node.type === 'TupleTypeAnnotation' || node.type === 'TypeofTypeAnnotation' || node.type === 'UnionTypeAnnotation' || node.type === 'VoidTypeAnnotation' || node.type === 'IndexedAccessType' || node.type === 'OptionalIndexedAccessType')); - declare export function isFlowBaseAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'AnyTypeAnnotation' || node.type === 'BooleanTypeAnnotation' || node.type === 'NullLiteralTypeAnnotation' || node.type === 'MixedTypeAnnotation' || node.type === 'EmptyTypeAnnotation' || node.type === 'NumberTypeAnnotation' || node.type === 'StringTypeAnnotation' || node.type === 'SymbolTypeAnnotation' || node.type === 'ThisTypeAnnotation' || node.type === 'VoidTypeAnnotation')); - declare export function isFlowDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'DeclareClass' || node.type === 'DeclareFunction' || node.type === 'DeclareInterface' || node.type === 'DeclareModule' || node.type === 'DeclareModuleExports' || node.type === 'DeclareTypeAlias' || node.type === 'DeclareOpaqueType' || node.type === 'DeclareVariable' || node.type === 'DeclareExportDeclaration' || node.type === 'DeclareExportAllDeclaration' || node.type === 'InterfaceDeclaration' || node.type === 'OpaqueType' || node.type === 'TypeAlias')); - declare export function isFlowPredicate(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'DeclaredPredicate' || node.type === 'InferredPredicate')); - declare export function isEnumBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'EnumBooleanBody' || node.type === 'EnumNumberBody' || node.type === 'EnumStringBody' || node.type === 'EnumSymbolBody')); - declare export function isEnumMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'EnumBooleanMember' || node.type === 'EnumNumberMember' || node.type === 'EnumStringMember' || node.type === 'EnumDefaultedMember')); - declare export function isJSX(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'JSXAttribute' || node.type === 'JSXClosingElement' || node.type === 'JSXElement' || node.type === 'JSXEmptyExpression' || node.type === 'JSXExpressionContainer' || node.type === 'JSXSpreadChild' || node.type === 'JSXIdentifier' || node.type === 'JSXMemberExpression' || node.type === 'JSXNamespacedName' || node.type === 'JSXOpeningElement' || node.type === 'JSXSpreadAttribute' || node.type === 'JSXText' || node.type === 'JSXFragment' || node.type === 'JSXOpeningFragment' || node.type === 'JSXClosingFragment')); - declare export function isMiscellaneous(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'Noop' || node.type === 'Placeholder' || node.type === 'V8IntrinsicIdentifier')); - declare export function isTypeScript(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'TSParameterProperty' || node.type === 'TSDeclareFunction' || node.type === 'TSDeclareMethod' || node.type === 'TSQualifiedName' || node.type === 'TSCallSignatureDeclaration' || node.type === 'TSConstructSignatureDeclaration' || node.type === 'TSPropertySignature' || node.type === 'TSMethodSignature' || node.type === 'TSIndexSignature' || node.type === 'TSAnyKeyword' || node.type === 'TSBooleanKeyword' || node.type === 'TSBigIntKeyword' || node.type === 'TSIntrinsicKeyword' || node.type === 'TSNeverKeyword' || node.type === 'TSNullKeyword' || node.type === 'TSNumberKeyword' || node.type === 'TSObjectKeyword' || node.type === 'TSStringKeyword' || node.type === 'TSSymbolKeyword' || node.type === 'TSUndefinedKeyword' || node.type === 'TSUnknownKeyword' || node.type === 'TSVoidKeyword' || node.type === 'TSThisType' || node.type === 'TSFunctionType' || node.type === 'TSConstructorType' || node.type === 'TSTypeReference' || node.type === 'TSTypePredicate' || node.type === 'TSTypeQuery' || node.type === 'TSTypeLiteral' || node.type === 'TSArrayType' || node.type === 'TSTupleType' || node.type === 'TSOptionalType' || node.type === 'TSRestType' || node.type === 'TSNamedTupleMember' || node.type === 'TSUnionType' || node.type === 'TSIntersectionType' || node.type === 'TSConditionalType' || node.type === 'TSInferType' || node.type === 'TSParenthesizedType' || node.type === 'TSTypeOperator' || node.type === 'TSIndexedAccessType' || node.type === 'TSMappedType' || node.type === 'TSLiteralType' || node.type === 'TSExpressionWithTypeArguments' || node.type === 'TSInterfaceDeclaration' || node.type === 'TSInterfaceBody' || node.type === 'TSTypeAliasDeclaration' || node.type === 'TSInstantiationExpression' || node.type === 'TSAsExpression' || node.type === 'TSSatisfiesExpression' || node.type === 'TSTypeAssertion' || node.type === 'TSEnumDeclaration' || node.type === 'TSEnumMember' || node.type === 'TSModuleDeclaration' || node.type === 'TSModuleBlock' || node.type === 'TSImportType' || node.type === 'TSImportEqualsDeclaration' || node.type === 'TSExternalModuleReference' || node.type === 'TSNonNullExpression' || node.type === 'TSExportAssignment' || node.type === 'TSNamespaceExportDeclaration' || node.type === 'TSTypeAnnotation' || node.type === 'TSTypeParameterInstantiation' || node.type === 'TSTypeParameterDeclaration' || node.type === 'TSTypeParameter')); - declare export function isTSTypeElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'TSCallSignatureDeclaration' || node.type === 'TSConstructSignatureDeclaration' || node.type === 'TSPropertySignature' || node.type === 'TSMethodSignature' || node.type === 'TSIndexSignature')); - declare export function isTSType(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'TSAnyKeyword' || node.type === 'TSBooleanKeyword' || node.type === 'TSBigIntKeyword' || node.type === 'TSIntrinsicKeyword' || node.type === 'TSNeverKeyword' || node.type === 'TSNullKeyword' || node.type === 'TSNumberKeyword' || node.type === 'TSObjectKeyword' || node.type === 'TSStringKeyword' || node.type === 'TSSymbolKeyword' || node.type === 'TSUndefinedKeyword' || node.type === 'TSUnknownKeyword' || node.type === 'TSVoidKeyword' || node.type === 'TSThisType' || node.type === 'TSFunctionType' || node.type === 'TSConstructorType' || node.type === 'TSTypeReference' || node.type === 'TSTypePredicate' || node.type === 'TSTypeQuery' || node.type === 'TSTypeLiteral' || node.type === 'TSArrayType' || node.type === 'TSTupleType' || node.type === 'TSOptionalType' || node.type === 'TSRestType' || node.type === 'TSUnionType' || node.type === 'TSIntersectionType' || node.type === 'TSConditionalType' || node.type === 'TSInferType' || node.type === 'TSParenthesizedType' || node.type === 'TSTypeOperator' || node.type === 'TSIndexedAccessType' || node.type === 'TSMappedType' || node.type === 'TSLiteralType' || node.type === 'TSExpressionWithTypeArguments' || node.type === 'TSImportType')); - declare export function isTSBaseType(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'TSAnyKeyword' || node.type === 'TSBooleanKeyword' || node.type === 'TSBigIntKeyword' || node.type === 'TSIntrinsicKeyword' || node.type === 'TSNeverKeyword' || node.type === 'TSNullKeyword' || node.type === 'TSNumberKeyword' || node.type === 'TSObjectKeyword' || node.type === 'TSStringKeyword' || node.type === 'TSSymbolKeyword' || node.type === 'TSUndefinedKeyword' || node.type === 'TSUnknownKeyword' || node.type === 'TSVoidKeyword' || node.type === 'TSThisType' || node.type === 'TSLiteralType')); - declare export function isNumberLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NumericLiteral'); - declare export function isRegexLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RegExpLiteral'); - declare export function isRestProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RestElement'); - declare export function isSpreadProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SpreadElement'); + declare export function isArrayExpression(node: ?Object, opts?: ?Object): node is ArrayExpression; + declare export function isAssignmentExpression(node: ?Object, opts?: ?Object): node is AssignmentExpression; + declare export function isBinaryExpression(node: ?Object, opts?: ?Object): node is BinaryExpression; + declare export function isInterpreterDirective(node: ?Object, opts?: ?Object): node is InterpreterDirective; + declare export function isDirective(node: ?Object, opts?: ?Object): node is Directive; + declare export function isDirectiveLiteral(node: ?Object, opts?: ?Object): node is DirectiveLiteral; + declare export function isBlockStatement(node: ?Object, opts?: ?Object): node is BlockStatement; + declare export function isBreakStatement(node: ?Object, opts?: ?Object): node is BreakStatement; + declare export function isCallExpression(node: ?Object, opts?: ?Object): node is CallExpression; + declare export function isCatchClause(node: ?Object, opts?: ?Object): node is CatchClause; + declare export function isConditionalExpression(node: ?Object, opts?: ?Object): node is ConditionalExpression; + declare export function isContinueStatement(node: ?Object, opts?: ?Object): node is ContinueStatement; + declare export function isDebuggerStatement(node: ?Object, opts?: ?Object): node is DebuggerStatement; + declare export function isDoWhileStatement(node: ?Object, opts?: ?Object): node is DoWhileStatement; + declare export function isEmptyStatement(node: ?Object, opts?: ?Object): node is EmptyStatement; + declare export function isExpressionStatement(node: ?Object, opts?: ?Object): node is ExpressionStatement; + declare export function isFile(node: ?Object, opts?: ?Object): node is File; + declare export function isForInStatement(node: ?Object, opts?: ?Object): node is ForInStatement; + declare export function isForStatement(node: ?Object, opts?: ?Object): node is ForStatement; + declare export function isFunctionDeclaration(node: ?Object, opts?: ?Object): node is FunctionDeclaration; + declare export function isFunctionExpression(node: ?Object, opts?: ?Object): node is FunctionExpression; + declare export function isIdentifier(node: ?Object, opts?: ?Object): node is Identifier; + declare export function isIfStatement(node: ?Object, opts?: ?Object): node is IfStatement; + declare export function isLabeledStatement(node: ?Object, opts?: ?Object): node is LabeledStatement; + declare export function isStringLiteral(node: ?Object, opts?: ?Object): node is StringLiteral; + declare export function isNumericLiteral(node: ?Object, opts?: ?Object): node is NumericLiteral; + declare export function isNullLiteral(node: ?Object, opts?: ?Object): node is NullLiteral; + declare export function isBooleanLiteral(node: ?Object, opts?: ?Object): node is BooleanLiteral; + declare export function isRegExpLiteral(node: ?Object, opts?: ?Object): node is RegExpLiteral; + declare export function isLogicalExpression(node: ?Object, opts?: ?Object): node is LogicalExpression; + declare export function isMemberExpression(node: ?Object, opts?: ?Object): node is MemberExpression; + declare export function isNewExpression(node: ?Object, opts?: ?Object): node is NewExpression; + declare export function isProgram(node: ?Object, opts?: ?Object): node is Program; + declare export function isObjectExpression(node: ?Object, opts?: ?Object): node is ObjectExpression; + declare export function isObjectMethod(node: ?Object, opts?: ?Object): node is ObjectMethod; + declare export function isObjectProperty(node: ?Object, opts?: ?Object): node is ObjectProperty; + declare export function isRestElement(node: ?Object, opts?: ?Object): node is RestElement; + declare export function isReturnStatement(node: ?Object, opts?: ?Object): node is ReturnStatement; + declare export function isSequenceExpression(node: ?Object, opts?: ?Object): node is SequenceExpression; + declare export function isParenthesizedExpression(node: ?Object, opts?: ?Object): node is ParenthesizedExpression; + declare export function isSwitchCase(node: ?Object, opts?: ?Object): node is SwitchCase; + declare export function isSwitchStatement(node: ?Object, opts?: ?Object): node is SwitchStatement; + declare export function isThisExpression(node: ?Object, opts?: ?Object): node is ThisExpression; + declare export function isThrowStatement(node: ?Object, opts?: ?Object): node is ThrowStatement; + declare export function isTryStatement(node: ?Object, opts?: ?Object): node is TryStatement; + declare export function isUnaryExpression(node: ?Object, opts?: ?Object): node is UnaryExpression; + declare export function isUpdateExpression(node: ?Object, opts?: ?Object): node is UpdateExpression; + declare export function isVariableDeclaration(node: ?Object, opts?: ?Object): node is VariableDeclaration; + declare export function isVariableDeclarator(node: ?Object, opts?: ?Object): node is VariableDeclarator; + declare export function isWhileStatement(node: ?Object, opts?: ?Object): node is WhileStatement; + declare export function isWithStatement(node: ?Object, opts?: ?Object): node is WithStatement; + declare export function isAssignmentPattern(node: ?Object, opts?: ?Object): node is AssignmentPattern; + declare export function isArrayPattern(node: ?Object, opts?: ?Object): node is ArrayPattern; + declare export function isArrowFunctionExpression(node: ?Object, opts?: ?Object): node is ArrowFunctionExpression; + declare export function isClassBody(node: ?Object, opts?: ?Object): node is ClassBody; + declare export function isClassExpression(node: ?Object, opts?: ?Object): node is ClassExpression; + declare export function isClassDeclaration(node: ?Object, opts?: ?Object): node is ClassDeclaration; + declare export function isExportAllDeclaration(node: ?Object, opts?: ?Object): node is ExportAllDeclaration; + declare export function isExportDefaultDeclaration(node: ?Object, opts?: ?Object): node is ExportDefaultDeclaration; + declare export function isExportNamedDeclaration(node: ?Object, opts?: ?Object): node is ExportNamedDeclaration; + declare export function isExportSpecifier(node: ?Object, opts?: ?Object): node is ExportSpecifier; + declare export function isForOfStatement(node: ?Object, opts?: ?Object): node is ForOfStatement; + declare export function isImportDeclaration(node: ?Object, opts?: ?Object): node is ImportDeclaration; + declare export function isImportDefaultSpecifier(node: ?Object, opts?: ?Object): node is ImportDefaultSpecifier; + declare export function isImportNamespaceSpecifier(node: ?Object, opts?: ?Object): node is ImportNamespaceSpecifier; + declare export function isImportSpecifier(node: ?Object, opts?: ?Object): node is ImportSpecifier; + declare export function isMetaProperty(node: ?Object, opts?: ?Object): node is MetaProperty; + declare export function isClassMethod(node: ?Object, opts?: ?Object): node is ClassMethod; + declare export function isObjectPattern(node: ?Object, opts?: ?Object): node is ObjectPattern; + declare export function isSpreadElement(node: ?Object, opts?: ?Object): node is SpreadElement; + declare export function isSuper(node: ?Object, opts?: ?Object): node is Super; + declare export function isTaggedTemplateExpression(node: ?Object, opts?: ?Object): node is TaggedTemplateExpression; + declare export function isTemplateElement(node: ?Object, opts?: ?Object): node is TemplateElement; + declare export function isTemplateLiteral(node: ?Object, opts?: ?Object): node is TemplateLiteral; + declare export function isYieldExpression(node: ?Object, opts?: ?Object): node is YieldExpression; + declare export function isAwaitExpression(node: ?Object, opts?: ?Object): node is AwaitExpression; + declare export function isImport(node: ?Object, opts?: ?Object): node is Import; + declare export function isBigIntLiteral(node: ?Object, opts?: ?Object): node is BigIntLiteral; + declare export function isExportNamespaceSpecifier(node: ?Object, opts?: ?Object): node is ExportNamespaceSpecifier; + declare export function isOptionalMemberExpression(node: ?Object, opts?: ?Object): node is OptionalMemberExpression; + declare export function isOptionalCallExpression(node: ?Object, opts?: ?Object): node is OptionalCallExpression; + declare export function isClassProperty(node: ?Object, opts?: ?Object): node is ClassProperty; + declare export function isClassAccessorProperty(node: ?Object, opts?: ?Object): node is ClassAccessorProperty; + declare export function isClassPrivateProperty(node: ?Object, opts?: ?Object): node is ClassPrivateProperty; + declare export function isClassPrivateMethod(node: ?Object, opts?: ?Object): node is ClassPrivateMethod; + declare export function isPrivateName(node: ?Object, opts?: ?Object): node is PrivateName; + declare export function isStaticBlock(node: ?Object, opts?: ?Object): node is StaticBlock; + declare export function isAnyTypeAnnotation(node: ?Object, opts?: ?Object): node is AnyTypeAnnotation; + declare export function isArrayTypeAnnotation(node: ?Object, opts?: ?Object): node is ArrayTypeAnnotation; + declare export function isBooleanTypeAnnotation(node: ?Object, opts?: ?Object): node is BooleanTypeAnnotation; + declare export function isBooleanLiteralTypeAnnotation(node: ?Object, opts?: ?Object): node is BooleanLiteralTypeAnnotation; + declare export function isNullLiteralTypeAnnotation(node: ?Object, opts?: ?Object): node is NullLiteralTypeAnnotation; + declare export function isClassImplements(node: ?Object, opts?: ?Object): node is ClassImplements; + declare export function isDeclareClass(node: ?Object, opts?: ?Object): node is DeclareClass; + declare export function isDeclareFunction(node: ?Object, opts?: ?Object): node is DeclareFunction; + declare export function isDeclareInterface(node: ?Object, opts?: ?Object): node is DeclareInterface; + declare export function isDeclareModule(node: ?Object, opts?: ?Object): node is DeclareModule; + declare export function isDeclareModuleExports(node: ?Object, opts?: ?Object): node is DeclareModuleExports; + declare export function isDeclareTypeAlias(node: ?Object, opts?: ?Object): node is DeclareTypeAlias; + declare export function isDeclareOpaqueType(node: ?Object, opts?: ?Object): node is DeclareOpaqueType; + declare export function isDeclareVariable(node: ?Object, opts?: ?Object): node is DeclareVariable; + declare export function isDeclareExportDeclaration(node: ?Object, opts?: ?Object): node is DeclareExportDeclaration; + declare export function isDeclareExportAllDeclaration(node: ?Object, opts?: ?Object): node is DeclareExportAllDeclaration; + declare export function isDeclaredPredicate(node: ?Object, opts?: ?Object): node is DeclaredPredicate; + declare export function isExistsTypeAnnotation(node: ?Object, opts?: ?Object): node is ExistsTypeAnnotation; + declare export function isFunctionTypeAnnotation(node: ?Object, opts?: ?Object): node is FunctionTypeAnnotation; + declare export function isFunctionTypeParam(node: ?Object, opts?: ?Object): node is FunctionTypeParam; + declare export function isGenericTypeAnnotation(node: ?Object, opts?: ?Object): node is GenericTypeAnnotation; + declare export function isInferredPredicate(node: ?Object, opts?: ?Object): node is InferredPredicate; + declare export function isInterfaceExtends(node: ?Object, opts?: ?Object): node is InterfaceExtends; + declare export function isInterfaceDeclaration(node: ?Object, opts?: ?Object): node is InterfaceDeclaration; + declare export function isInterfaceTypeAnnotation(node: ?Object, opts?: ?Object): node is InterfaceTypeAnnotation; + declare export function isIntersectionTypeAnnotation(node: ?Object, opts?: ?Object): node is IntersectionTypeAnnotation; + declare export function isMixedTypeAnnotation(node: ?Object, opts?: ?Object): node is MixedTypeAnnotation; + declare export function isEmptyTypeAnnotation(node: ?Object, opts?: ?Object): node is EmptyTypeAnnotation; + declare export function isNullableTypeAnnotation(node: ?Object, opts?: ?Object): node is NullableTypeAnnotation; + declare export function isNumberLiteralTypeAnnotation(node: ?Object, opts?: ?Object): node is NumberLiteralTypeAnnotation; + declare export function isNumberTypeAnnotation(node: ?Object, opts?: ?Object): node is NumberTypeAnnotation; + declare export function isObjectTypeAnnotation(node: ?Object, opts?: ?Object): node is ObjectTypeAnnotation; + declare export function isObjectTypeInternalSlot(node: ?Object, opts?: ?Object): node is ObjectTypeInternalSlot; + declare export function isObjectTypeCallProperty(node: ?Object, opts?: ?Object): node is ObjectTypeCallProperty; + declare export function isObjectTypeIndexer(node: ?Object, opts?: ?Object): node is ObjectTypeIndexer; + declare export function isObjectTypeProperty(node: ?Object, opts?: ?Object): node is ObjectTypeProperty; + declare export function isObjectTypeSpreadProperty(node: ?Object, opts?: ?Object): node is ObjectTypeSpreadProperty; + declare export function isOpaqueType(node: ?Object, opts?: ?Object): node is OpaqueType; + declare export function isQualifiedTypeIdentifier(node: ?Object, opts?: ?Object): node is QualifiedTypeIdentifier; + declare export function isStringLiteralTypeAnnotation(node: ?Object, opts?: ?Object): node is StringLiteralTypeAnnotation; + declare export function isStringTypeAnnotation(node: ?Object, opts?: ?Object): node is StringTypeAnnotation; + declare export function isSymbolTypeAnnotation(node: ?Object, opts?: ?Object): node is SymbolTypeAnnotation; + declare export function isThisTypeAnnotation(node: ?Object, opts?: ?Object): node is ThisTypeAnnotation; + declare export function isTupleTypeAnnotation(node: ?Object, opts?: ?Object): node is TupleTypeAnnotation; + declare export function isTypeofTypeAnnotation(node: ?Object, opts?: ?Object): node is TypeofTypeAnnotation; + declare export function isTypeAlias(node: ?Object, opts?: ?Object): node is TypeAlias; + declare export function isTypeAnnotation(node: ?Object, opts?: ?Object): node is TypeAnnotation; + declare export function isTypeCastExpression(node: ?Object, opts?: ?Object): node is TypeCastExpression; + declare export function isTypeParameter(node: ?Object, opts?: ?Object): node is TypeParameter; + declare export function isTypeParameterDeclaration(node: ?Object, opts?: ?Object): node is TypeParameterDeclaration; + declare export function isTypeParameterInstantiation(node: ?Object, opts?: ?Object): node is TypeParameterInstantiation; + declare export function isUnionTypeAnnotation(node: ?Object, opts?: ?Object): node is UnionTypeAnnotation; + declare export function isVariance(node: ?Object, opts?: ?Object): node is Variance; + declare export function isVoidTypeAnnotation(node: ?Object, opts?: ?Object): node is VoidTypeAnnotation; + declare export function isEnumDeclaration(node: ?Object, opts?: ?Object): node is EnumDeclaration; + declare export function isEnumBooleanBody(node: ?Object, opts?: ?Object): node is EnumBooleanBody; + declare export function isEnumNumberBody(node: ?Object, opts?: ?Object): node is EnumNumberBody; + declare export function isEnumStringBody(node: ?Object, opts?: ?Object): node is EnumStringBody; + declare export function isEnumSymbolBody(node: ?Object, opts?: ?Object): node is EnumSymbolBody; + declare export function isEnumBooleanMember(node: ?Object, opts?: ?Object): node is EnumBooleanMember; + declare export function isEnumNumberMember(node: ?Object, opts?: ?Object): node is EnumNumberMember; + declare export function isEnumStringMember(node: ?Object, opts?: ?Object): node is EnumStringMember; + declare export function isEnumDefaultedMember(node: ?Object, opts?: ?Object): node is EnumDefaultedMember; + declare export function isIndexedAccessType(node: ?Object, opts?: ?Object): node is IndexedAccessType; + declare export function isOptionalIndexedAccessType(node: ?Object, opts?: ?Object): node is OptionalIndexedAccessType; + declare export function isJSXAttribute(node: ?Object, opts?: ?Object): node is JSXAttribute; + declare export function isJSXClosingElement(node: ?Object, opts?: ?Object): node is JSXClosingElement; + declare export function isJSXElement(node: ?Object, opts?: ?Object): node is JSXElement; + declare export function isJSXEmptyExpression(node: ?Object, opts?: ?Object): node is JSXEmptyExpression; + declare export function isJSXExpressionContainer(node: ?Object, opts?: ?Object): node is JSXExpressionContainer; + declare export function isJSXSpreadChild(node: ?Object, opts?: ?Object): node is JSXSpreadChild; + declare export function isJSXIdentifier(node: ?Object, opts?: ?Object): node is JSXIdentifier; + declare export function isJSXMemberExpression(node: ?Object, opts?: ?Object): node is JSXMemberExpression; + declare export function isJSXNamespacedName(node: ?Object, opts?: ?Object): node is JSXNamespacedName; + declare export function isJSXOpeningElement(node: ?Object, opts?: ?Object): node is JSXOpeningElement; + declare export function isJSXSpreadAttribute(node: ?Object, opts?: ?Object): node is JSXSpreadAttribute; + declare export function isJSXText(node: ?Object, opts?: ?Object): node is JSXText; + declare export function isJSXFragment(node: ?Object, opts?: ?Object): node is JSXFragment; + declare export function isJSXOpeningFragment(node: ?Object, opts?: ?Object): node is JSXOpeningFragment; + declare export function isJSXClosingFragment(node: ?Object, opts?: ?Object): node is JSXClosingFragment; + declare export function isNoop(node: ?Object, opts?: ?Object): node is Noop; + declare export function isPlaceholder(node: ?Object, opts?: ?Object): node is Placeholder; + declare export function isV8IntrinsicIdentifier(node: ?Object, opts?: ?Object): node is V8IntrinsicIdentifier; + declare export function isArgumentPlaceholder(node: ?Object, opts?: ?Object): node is ArgumentPlaceholder; + declare export function isBindExpression(node: ?Object, opts?: ?Object): node is BindExpression; + declare export function isImportAttribute(node: ?Object, opts?: ?Object): node is ImportAttribute; + declare export function isDecorator(node: ?Object, opts?: ?Object): node is Decorator; + declare export function isDoExpression(node: ?Object, opts?: ?Object): node is DoExpression; + declare export function isExportDefaultSpecifier(node: ?Object, opts?: ?Object): node is ExportDefaultSpecifier; + declare export function isRecordExpression(node: ?Object, opts?: ?Object): node is RecordExpression; + declare export function isTupleExpression(node: ?Object, opts?: ?Object): node is TupleExpression; + declare export function isDecimalLiteral(node: ?Object, opts?: ?Object): node is DecimalLiteral; + declare export function isModuleExpression(node: ?Object, opts?: ?Object): node is ModuleExpression; + declare export function isTopicReference(node: ?Object, opts?: ?Object): node is TopicReference; + declare export function isPipelineTopicExpression(node: ?Object, opts?: ?Object): node is PipelineTopicExpression; + declare export function isPipelineBareFunction(node: ?Object, opts?: ?Object): node is PipelineBareFunction; + declare export function isPipelinePrimaryTopicReference(node: ?Object, opts?: ?Object): node is PipelinePrimaryTopicReference; + declare export function isTSParameterProperty(node: ?Object, opts?: ?Object): node is TSParameterProperty; + declare export function isTSDeclareFunction(node: ?Object, opts?: ?Object): node is TSDeclareFunction; + declare export function isTSDeclareMethod(node: ?Object, opts?: ?Object): node is TSDeclareMethod; + declare export function isTSQualifiedName(node: ?Object, opts?: ?Object): node is TSQualifiedName; + declare export function isTSCallSignatureDeclaration(node: ?Object, opts?: ?Object): node is TSCallSignatureDeclaration; + declare export function isTSConstructSignatureDeclaration(node: ?Object, opts?: ?Object): node is TSConstructSignatureDeclaration; + declare export function isTSPropertySignature(node: ?Object, opts?: ?Object): node is TSPropertySignature; + declare export function isTSMethodSignature(node: ?Object, opts?: ?Object): node is TSMethodSignature; + declare export function isTSIndexSignature(node: ?Object, opts?: ?Object): node is TSIndexSignature; + declare export function isTSAnyKeyword(node: ?Object, opts?: ?Object): node is TSAnyKeyword; + declare export function isTSBooleanKeyword(node: ?Object, opts?: ?Object): node is TSBooleanKeyword; + declare export function isTSBigIntKeyword(node: ?Object, opts?: ?Object): node is TSBigIntKeyword; + declare export function isTSIntrinsicKeyword(node: ?Object, opts?: ?Object): node is TSIntrinsicKeyword; + declare export function isTSNeverKeyword(node: ?Object, opts?: ?Object): node is TSNeverKeyword; + declare export function isTSNullKeyword(node: ?Object, opts?: ?Object): node is TSNullKeyword; + declare export function isTSNumberKeyword(node: ?Object, opts?: ?Object): node is TSNumberKeyword; + declare export function isTSObjectKeyword(node: ?Object, opts?: ?Object): node is TSObjectKeyword; + declare export function isTSStringKeyword(node: ?Object, opts?: ?Object): node is TSStringKeyword; + declare export function isTSSymbolKeyword(node: ?Object, opts?: ?Object): node is TSSymbolKeyword; + declare export function isTSUndefinedKeyword(node: ?Object, opts?: ?Object): node is TSUndefinedKeyword; + declare export function isTSUnknownKeyword(node: ?Object, opts?: ?Object): node is TSUnknownKeyword; + declare export function isTSVoidKeyword(node: ?Object, opts?: ?Object): node is TSVoidKeyword; + declare export function isTSThisType(node: ?Object, opts?: ?Object): node is TSThisType; + declare export function isTSFunctionType(node: ?Object, opts?: ?Object): node is TSFunctionType; + declare export function isTSConstructorType(node: ?Object, opts?: ?Object): node is TSConstructorType; + declare export function isTSTypeReference(node: ?Object, opts?: ?Object): node is TSTypeReference; + declare export function isTSTypePredicate(node: ?Object, opts?: ?Object): node is TSTypePredicate; + declare export function isTSTypeQuery(node: ?Object, opts?: ?Object): node is TSTypeQuery; + declare export function isTSTypeLiteral(node: ?Object, opts?: ?Object): node is TSTypeLiteral; + declare export function isTSArrayType(node: ?Object, opts?: ?Object): node is TSArrayType; + declare export function isTSTupleType(node: ?Object, opts?: ?Object): node is TSTupleType; + declare export function isTSOptionalType(node: ?Object, opts?: ?Object): node is TSOptionalType; + declare export function isTSRestType(node: ?Object, opts?: ?Object): node is TSRestType; + declare export function isTSNamedTupleMember(node: ?Object, opts?: ?Object): node is TSNamedTupleMember; + declare export function isTSUnionType(node: ?Object, opts?: ?Object): node is TSUnionType; + declare export function isTSIntersectionType(node: ?Object, opts?: ?Object): node is TSIntersectionType; + declare export function isTSConditionalType(node: ?Object, opts?: ?Object): node is TSConditionalType; + declare export function isTSInferType(node: ?Object, opts?: ?Object): node is TSInferType; + declare export function isTSParenthesizedType(node: ?Object, opts?: ?Object): node is TSParenthesizedType; + declare export function isTSTypeOperator(node: ?Object, opts?: ?Object): node is TSTypeOperator; + declare export function isTSIndexedAccessType(node: ?Object, opts?: ?Object): node is TSIndexedAccessType; + declare export function isTSMappedType(node: ?Object, opts?: ?Object): node is TSMappedType; + declare export function isTSLiteralType(node: ?Object, opts?: ?Object): node is TSLiteralType; + declare export function isTSExpressionWithTypeArguments(node: ?Object, opts?: ?Object): node is TSExpressionWithTypeArguments; + declare export function isTSInterfaceDeclaration(node: ?Object, opts?: ?Object): node is TSInterfaceDeclaration; + declare export function isTSInterfaceBody(node: ?Object, opts?: ?Object): node is TSInterfaceBody; + declare export function isTSTypeAliasDeclaration(node: ?Object, opts?: ?Object): node is TSTypeAliasDeclaration; + declare export function isTSInstantiationExpression(node: ?Object, opts?: ?Object): node is TSInstantiationExpression; + declare export function isTSAsExpression(node: ?Object, opts?: ?Object): node is TSAsExpression; + declare export function isTSSatisfiesExpression(node: ?Object, opts?: ?Object): node is TSSatisfiesExpression; + declare export function isTSTypeAssertion(node: ?Object, opts?: ?Object): node is TSTypeAssertion; + declare export function isTSEnumDeclaration(node: ?Object, opts?: ?Object): node is TSEnumDeclaration; + declare export function isTSEnumMember(node: ?Object, opts?: ?Object): node is TSEnumMember; + declare export function isTSModuleDeclaration(node: ?Object, opts?: ?Object): node is TSModuleDeclaration; + declare export function isTSModuleBlock(node: ?Object, opts?: ?Object): node is TSModuleBlock; + declare export function isTSImportType(node: ?Object, opts?: ?Object): node is TSImportType; + declare export function isTSImportEqualsDeclaration(node: ?Object, opts?: ?Object): node is TSImportEqualsDeclaration; + declare export function isTSExternalModuleReference(node: ?Object, opts?: ?Object): node is TSExternalModuleReference; + declare export function isTSNonNullExpression(node: ?Object, opts?: ?Object): node is TSNonNullExpression; + declare export function isTSExportAssignment(node: ?Object, opts?: ?Object): node is TSExportAssignment; + declare export function isTSNamespaceExportDeclaration(node: ?Object, opts?: ?Object): node is TSNamespaceExportDeclaration; + declare export function isTSTypeAnnotation(node: ?Object, opts?: ?Object): node is TSTypeAnnotation; + declare export function isTSTypeParameterInstantiation(node: ?Object, opts?: ?Object): node is TSTypeParameterInstantiation; + declare export function isTSTypeParameterDeclaration(node: ?Object, opts?: ?Object): node is TSTypeParameterDeclaration; + declare export function isTSTypeParameter(node: ?Object, opts?: ?Object): node is TSTypeParameter; + declare export function isStandardized(node: ?Object, opts?: ?Object): node is (ArrayExpression | AssignmentExpression | BinaryExpression | InterpreterDirective | Directive | DirectiveLiteral | BlockStatement | BreakStatement | CallExpression | CatchClause | ConditionalExpression | ContinueStatement | DebuggerStatement | DoWhileStatement | EmptyStatement | ExpressionStatement | File | ForInStatement | ForStatement | FunctionDeclaration | FunctionExpression | Identifier | IfStatement | LabeledStatement | StringLiteral | NumericLiteral | NullLiteral | BooleanLiteral | RegExpLiteral | LogicalExpression | MemberExpression | NewExpression | Program | ObjectExpression | ObjectMethod | ObjectProperty | RestElement | ReturnStatement | SequenceExpression | ParenthesizedExpression | SwitchCase | SwitchStatement | ThisExpression | ThrowStatement | TryStatement | UnaryExpression | UpdateExpression | VariableDeclaration | VariableDeclarator | WhileStatement | WithStatement | AssignmentPattern | ArrayPattern | ArrowFunctionExpression | ClassBody | ClassExpression | ClassDeclaration | ExportAllDeclaration | ExportDefaultDeclaration | ExportNamedDeclaration | ExportSpecifier | ForOfStatement | ImportDeclaration | ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier | MetaProperty | ClassMethod | ObjectPattern | SpreadElement | Super | TaggedTemplateExpression | TemplateElement | TemplateLiteral | YieldExpression | AwaitExpression | Import | BigIntLiteral | ExportNamespaceSpecifier | OptionalMemberExpression | OptionalCallExpression | ClassProperty | ClassAccessorProperty | ClassPrivateProperty | ClassPrivateMethod | PrivateName | StaticBlock); + declare export function isExpression(node: ?Object, opts?: ?Object): node is (ArrayExpression | AssignmentExpression | BinaryExpression | CallExpression | ConditionalExpression | FunctionExpression | Identifier | StringLiteral | NumericLiteral | NullLiteral | BooleanLiteral | RegExpLiteral | LogicalExpression | MemberExpression | NewExpression | ObjectExpression | SequenceExpression | ParenthesizedExpression | ThisExpression | UnaryExpression | UpdateExpression | ArrowFunctionExpression | ClassExpression | MetaProperty | Super | TaggedTemplateExpression | TemplateLiteral | YieldExpression | AwaitExpression | Import | BigIntLiteral | OptionalMemberExpression | OptionalCallExpression | TypeCastExpression | JSXElement | JSXFragment | BindExpression | DoExpression | RecordExpression | TupleExpression | DecimalLiteral | ModuleExpression | TopicReference | PipelineTopicExpression | PipelineBareFunction | PipelinePrimaryTopicReference | TSInstantiationExpression | TSAsExpression | TSSatisfiesExpression | TSTypeAssertion | TSNonNullExpression); + declare export function isBinary(node: ?Object, opts?: ?Object): node is (BinaryExpression | LogicalExpression); + declare export function isScopable(node: ?Object, opts?: ?Object): node is (BlockStatement | CatchClause | DoWhileStatement | ForInStatement | ForStatement | FunctionDeclaration | FunctionExpression | Program | ObjectMethod | SwitchStatement | WhileStatement | ArrowFunctionExpression | ClassExpression | ClassDeclaration | ForOfStatement | ClassMethod | ClassPrivateMethod | StaticBlock | TSModuleBlock); + declare export function isBlockParent(node: ?Object, opts?: ?Object): node is (BlockStatement | CatchClause | DoWhileStatement | ForInStatement | ForStatement | FunctionDeclaration | FunctionExpression | Program | ObjectMethod | SwitchStatement | WhileStatement | ArrowFunctionExpression | ForOfStatement | ClassMethod | ClassPrivateMethod | StaticBlock | TSModuleBlock); + declare export function isBlock(node: ?Object, opts?: ?Object): node is (BlockStatement | Program | TSModuleBlock); + declare export function isStatement(node: ?Object, opts?: ?Object): node is (BlockStatement | BreakStatement | ContinueStatement | DebuggerStatement | DoWhileStatement | EmptyStatement | ExpressionStatement | ForInStatement | ForStatement | FunctionDeclaration | IfStatement | LabeledStatement | ReturnStatement | SwitchStatement | ThrowStatement | TryStatement | VariableDeclaration | WhileStatement | WithStatement | ClassDeclaration | ExportAllDeclaration | ExportDefaultDeclaration | ExportNamedDeclaration | ForOfStatement | ImportDeclaration | DeclareClass | DeclareFunction | DeclareInterface | DeclareModule | DeclareModuleExports | DeclareTypeAlias | DeclareOpaqueType | DeclareVariable | DeclareExportDeclaration | DeclareExportAllDeclaration | InterfaceDeclaration | OpaqueType | TypeAlias | EnumDeclaration | TSDeclareFunction | TSInterfaceDeclaration | TSTypeAliasDeclaration | TSEnumDeclaration | TSModuleDeclaration | TSImportEqualsDeclaration | TSExportAssignment | TSNamespaceExportDeclaration); + declare export function isTerminatorless(node: ?Object, opts?: ?Object): node is (BreakStatement | ContinueStatement | ReturnStatement | ThrowStatement | YieldExpression | AwaitExpression); + declare export function isCompletionStatement(node: ?Object, opts?: ?Object): node is (BreakStatement | ContinueStatement | ReturnStatement | ThrowStatement); + declare export function isConditional(node: ?Object, opts?: ?Object): node is (ConditionalExpression | IfStatement); + declare export function isLoop(node: ?Object, opts?: ?Object): node is (DoWhileStatement | ForInStatement | ForStatement | WhileStatement | ForOfStatement); + declare export function isWhile(node: ?Object, opts?: ?Object): node is (DoWhileStatement | WhileStatement); + declare export function isExpressionWrapper(node: ?Object, opts?: ?Object): node is (ExpressionStatement | ParenthesizedExpression | TypeCastExpression); + declare export function isFor(node: ?Object, opts?: ?Object): node is (ForInStatement | ForStatement | ForOfStatement); + declare export function isForXStatement(node: ?Object, opts?: ?Object): node is (ForInStatement | ForOfStatement); + declare export function isFunction(node: ?Object, opts?: ?Object): node is (FunctionDeclaration | FunctionExpression | ObjectMethod | ArrowFunctionExpression | ClassMethod | ClassPrivateMethod); + declare export function isFunctionParent(node: ?Object, opts?: ?Object): node is (FunctionDeclaration | FunctionExpression | ObjectMethod | ArrowFunctionExpression | ClassMethod | ClassPrivateMethod | StaticBlock | TSModuleBlock); + declare export function isPureish(node: ?Object, opts?: ?Object): node is (FunctionDeclaration | FunctionExpression | StringLiteral | NumericLiteral | NullLiteral | BooleanLiteral | RegExpLiteral | ArrowFunctionExpression | BigIntLiteral | DecimalLiteral); + declare export function isDeclaration(node: ?Object, opts?: ?Object): node is (FunctionDeclaration | VariableDeclaration | ClassDeclaration | ExportAllDeclaration | ExportDefaultDeclaration | ExportNamedDeclaration | ImportDeclaration | DeclareClass | DeclareFunction | DeclareInterface | DeclareModule | DeclareModuleExports | DeclareTypeAlias | DeclareOpaqueType | DeclareVariable | DeclareExportDeclaration | DeclareExportAllDeclaration | InterfaceDeclaration | OpaqueType | TypeAlias | EnumDeclaration | TSDeclareFunction | TSInterfaceDeclaration | TSTypeAliasDeclaration | TSEnumDeclaration | TSModuleDeclaration); + declare export function isPatternLike(node: ?Object, opts?: ?Object): node is (Identifier | RestElement | AssignmentPattern | ArrayPattern | ObjectPattern | TSAsExpression | TSSatisfiesExpression | TSTypeAssertion | TSNonNullExpression); + declare export function isLVal(node: ?Object, opts?: ?Object): node is (Identifier | MemberExpression | RestElement | AssignmentPattern | ArrayPattern | ObjectPattern | TSParameterProperty | TSAsExpression | TSSatisfiesExpression | TSTypeAssertion | TSNonNullExpression); + declare export function isTSEntityName(node: ?Object, opts?: ?Object): node is (Identifier | TSQualifiedName); + declare export function isLiteral(node: ?Object, opts?: ?Object): node is (StringLiteral | NumericLiteral | NullLiteral | BooleanLiteral | RegExpLiteral | TemplateLiteral | BigIntLiteral | DecimalLiteral); + declare export function isImmutable(node: ?Object, opts?: ?Object): node is (StringLiteral | NumericLiteral | NullLiteral | BooleanLiteral | BigIntLiteral | JSXAttribute | JSXClosingElement | JSXElement | JSXExpressionContainer | JSXSpreadChild | JSXOpeningElement | JSXText | JSXFragment | JSXOpeningFragment | JSXClosingFragment | DecimalLiteral); + declare export function isUserWhitespacable(node: ?Object, opts?: ?Object): node is (ObjectMethod | ObjectProperty | ObjectTypeInternalSlot | ObjectTypeCallProperty | ObjectTypeIndexer | ObjectTypeProperty | ObjectTypeSpreadProperty); + declare export function isMethod(node: ?Object, opts?: ?Object): node is (ObjectMethod | ClassMethod | ClassPrivateMethod); + declare export function isObjectMember(node: ?Object, opts?: ?Object): node is (ObjectMethod | ObjectProperty); + declare export function isProperty(node: ?Object, opts?: ?Object): node is (ObjectProperty | ClassProperty | ClassAccessorProperty | ClassPrivateProperty); + declare export function isUnaryLike(node: ?Object, opts?: ?Object): node is (UnaryExpression | SpreadElement); + declare export function isPattern(node: ?Object, opts?: ?Object): node is (AssignmentPattern | ArrayPattern | ObjectPattern); + declare export function isClass(node: ?Object, opts?: ?Object): node is (ClassExpression | ClassDeclaration); + declare export function isModuleDeclaration(node: ?Object, opts?: ?Object): node is (ExportAllDeclaration | ExportDefaultDeclaration | ExportNamedDeclaration | ImportDeclaration); + declare export function isExportDeclaration(node: ?Object, opts?: ?Object): node is (ExportAllDeclaration | ExportDefaultDeclaration | ExportNamedDeclaration); + declare export function isModuleSpecifier(node: ?Object, opts?: ?Object): node is (ExportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier | ExportNamespaceSpecifier | ExportDefaultSpecifier); + declare export function isAccessor(node: ?Object, opts?: ?Object): node is (ClassAccessorProperty); + declare export function isPrivate(node: ?Object, opts?: ?Object): node is (ClassPrivateProperty | ClassPrivateMethod | PrivateName); + declare export function isFlow(node: ?Object, opts?: ?Object): node is (AnyTypeAnnotation | ArrayTypeAnnotation | BooleanTypeAnnotation | BooleanLiteralTypeAnnotation | NullLiteralTypeAnnotation | ClassImplements | DeclareClass | DeclareFunction | DeclareInterface | DeclareModule | DeclareModuleExports | DeclareTypeAlias | DeclareOpaqueType | DeclareVariable | DeclareExportDeclaration | DeclareExportAllDeclaration | DeclaredPredicate | ExistsTypeAnnotation | FunctionTypeAnnotation | FunctionTypeParam | GenericTypeAnnotation | InferredPredicate | InterfaceExtends | InterfaceDeclaration | InterfaceTypeAnnotation | IntersectionTypeAnnotation | MixedTypeAnnotation | EmptyTypeAnnotation | NullableTypeAnnotation | NumberLiteralTypeAnnotation | NumberTypeAnnotation | ObjectTypeAnnotation | ObjectTypeInternalSlot | ObjectTypeCallProperty | ObjectTypeIndexer | ObjectTypeProperty | ObjectTypeSpreadProperty | OpaqueType | QualifiedTypeIdentifier | StringLiteralTypeAnnotation | StringTypeAnnotation | SymbolTypeAnnotation | ThisTypeAnnotation | TupleTypeAnnotation | TypeofTypeAnnotation | TypeAlias | TypeAnnotation | TypeCastExpression | TypeParameter | TypeParameterDeclaration | TypeParameterInstantiation | UnionTypeAnnotation | Variance | VoidTypeAnnotation | EnumDeclaration | EnumBooleanBody | EnumNumberBody | EnumStringBody | EnumSymbolBody | EnumBooleanMember | EnumNumberMember | EnumStringMember | EnumDefaultedMember | IndexedAccessType | OptionalIndexedAccessType); + declare export function isFlowType(node: ?Object, opts?: ?Object): node is (AnyTypeAnnotation | ArrayTypeAnnotation | BooleanTypeAnnotation | BooleanLiteralTypeAnnotation | NullLiteralTypeAnnotation | ExistsTypeAnnotation | FunctionTypeAnnotation | GenericTypeAnnotation | InterfaceTypeAnnotation | IntersectionTypeAnnotation | MixedTypeAnnotation | EmptyTypeAnnotation | NullableTypeAnnotation | NumberLiteralTypeAnnotation | NumberTypeAnnotation | ObjectTypeAnnotation | StringLiteralTypeAnnotation | StringTypeAnnotation | SymbolTypeAnnotation | ThisTypeAnnotation | TupleTypeAnnotation | TypeofTypeAnnotation | UnionTypeAnnotation | VoidTypeAnnotation | IndexedAccessType | OptionalIndexedAccessType); + declare export function isFlowBaseAnnotation(node: ?Object, opts?: ?Object): node is (AnyTypeAnnotation | BooleanTypeAnnotation | NullLiteralTypeAnnotation | MixedTypeAnnotation | EmptyTypeAnnotation | NumberTypeAnnotation | StringTypeAnnotation | SymbolTypeAnnotation | ThisTypeAnnotation | VoidTypeAnnotation); + declare export function isFlowDeclaration(node: ?Object, opts?: ?Object): node is (DeclareClass | DeclareFunction | DeclareInterface | DeclareModule | DeclareModuleExports | DeclareTypeAlias | DeclareOpaqueType | DeclareVariable | DeclareExportDeclaration | DeclareExportAllDeclaration | InterfaceDeclaration | OpaqueType | TypeAlias); + declare export function isFlowPredicate(node: ?Object, opts?: ?Object): node is (DeclaredPredicate | InferredPredicate); + declare export function isEnumBody(node: ?Object, opts?: ?Object): node is (EnumBooleanBody | EnumNumberBody | EnumStringBody | EnumSymbolBody); + declare export function isEnumMember(node: ?Object, opts?: ?Object): node is (EnumBooleanMember | EnumNumberMember | EnumStringMember | EnumDefaultedMember); + declare export function isJSX(node: ?Object, opts?: ?Object): node is (JSXAttribute | JSXClosingElement | JSXElement | JSXEmptyExpression | JSXExpressionContainer | JSXSpreadChild | JSXIdentifier | JSXMemberExpression | JSXNamespacedName | JSXOpeningElement | JSXSpreadAttribute | JSXText | JSXFragment | JSXOpeningFragment | JSXClosingFragment); + declare export function isMiscellaneous(node: ?Object, opts?: ?Object): node is (Noop | Placeholder | V8IntrinsicIdentifier); + declare export function isTypeScript(node: ?Object, opts?: ?Object): node is (TSParameterProperty | TSDeclareFunction | TSDeclareMethod | TSQualifiedName | TSCallSignatureDeclaration | TSConstructSignatureDeclaration | TSPropertySignature | TSMethodSignature | TSIndexSignature | TSAnyKeyword | TSBooleanKeyword | TSBigIntKeyword | TSIntrinsicKeyword | TSNeverKeyword | TSNullKeyword | TSNumberKeyword | TSObjectKeyword | TSStringKeyword | TSSymbolKeyword | TSUndefinedKeyword | TSUnknownKeyword | TSVoidKeyword | TSThisType | TSFunctionType | TSConstructorType | TSTypeReference | TSTypePredicate | TSTypeQuery | TSTypeLiteral | TSArrayType | TSTupleType | TSOptionalType | TSRestType | TSNamedTupleMember | TSUnionType | TSIntersectionType | TSConditionalType | TSInferType | TSParenthesizedType | TSTypeOperator | TSIndexedAccessType | TSMappedType | TSLiteralType | TSExpressionWithTypeArguments | TSInterfaceDeclaration | TSInterfaceBody | TSTypeAliasDeclaration | TSInstantiationExpression | TSAsExpression | TSSatisfiesExpression | TSTypeAssertion | TSEnumDeclaration | TSEnumMember | TSModuleDeclaration | TSModuleBlock | TSImportType | TSImportEqualsDeclaration | TSExternalModuleReference | TSNonNullExpression | TSExportAssignment | TSNamespaceExportDeclaration | TSTypeAnnotation | TSTypeParameterInstantiation | TSTypeParameterDeclaration | TSTypeParameter); + declare export function isTSTypeElement(node: ?Object, opts?: ?Object): node is (TSCallSignatureDeclaration | TSConstructSignatureDeclaration | TSPropertySignature | TSMethodSignature | TSIndexSignature); + declare export function isTSType(node: ?Object, opts?: ?Object): node is (TSAnyKeyword | TSBooleanKeyword | TSBigIntKeyword | TSIntrinsicKeyword | TSNeverKeyword | TSNullKeyword | TSNumberKeyword | TSObjectKeyword | TSStringKeyword | TSSymbolKeyword | TSUndefinedKeyword | TSUnknownKeyword | TSVoidKeyword | TSThisType | TSFunctionType | TSConstructorType | TSTypeReference | TSTypePredicate | TSTypeQuery | TSTypeLiteral | TSArrayType | TSTupleType | TSOptionalType | TSRestType | TSUnionType | TSIntersectionType | TSConditionalType | TSInferType | TSParenthesizedType | TSTypeOperator | TSIndexedAccessType | TSMappedType | TSLiteralType | TSExpressionWithTypeArguments | TSImportType); + declare export function isTSBaseType(node: ?Object, opts?: ?Object): node is (TSAnyKeyword | TSBooleanKeyword | TSBigIntKeyword | TSIntrinsicKeyword | TSNeverKeyword | TSNullKeyword | TSNumberKeyword | TSObjectKeyword | TSStringKeyword | TSSymbolKeyword | TSUndefinedKeyword | TSUnknownKeyword | TSVoidKeyword | TSThisType | TSLiteralType); + declare export function isNumberLiteral(node: ?Object, opts?: ?Object): node is NumericLiteral; + declare export function isRegexLiteral(node: ?Object, opts?: ?Object): node is RegExpLiteral; + declare export function isRestProperty(node: ?Object, opts?: ?Object): node is RestElement; + declare export function isSpreadProperty(node: ?Object, opts?: ?Object): node is SpreadElement; declare export function createTypeAnnotationBasedOnTypeof(type: 'string' | 'number' | 'undefined' | 'boolean' | 'function' | 'object' | 'symbol'): BabelNodeTypeAnnotation declare export function createUnionTypeAnnotation(types: Array): BabelNodeUnionTypeAnnotation declare export function createFlowUnionType(types: Array): BabelNodeUnionTypeAnnotation @@ -3796,18 +3796,18 @@ declare module "@babel/types" { declare export function is(type: string, n: BabelNode, opts: Object): boolean; declare export function isBinding(node: BabelNode, parent: BabelNode, grandparent?: BabelNode): boolean declare export function isBlockScoped(node: BabelNode): boolean - declare export function isLet(node: BabelNode): boolean %checks (node.type === 'VariableDeclaration') + declare export function isLet(node: BabelNode): node is VariableDeclaration declare export function isNode(node: ?Object): boolean declare export function isNodesEquivalent(a: any, b: any): boolean declare export function isPlaceholderType(placeholderType: string, targetType: string): boolean declare export function isReferenced(node: BabelNode, parent: BabelNode, grandparent?: BabelNode): boolean - declare export function isScope(node: BabelNode, parent: BabelNode): boolean %checks (node.type === 'BlockStatement' || node.type === 'CatchClause' || node.type === 'DoWhileStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'Program' || node.type === 'ObjectMethod' || node.type === 'SwitchStatement' || node.type === 'WhileStatement' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassExpression' || node.type === 'ClassDeclaration' || node.type === 'ForOfStatement' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod' || node.type === 'TSModuleBlock') + declare export function isScope(node: BabelNode, parent: BabelNode): node is (BlockStatement | CatchClause | DoWhileStatement | ForInStatement | ForStatement | FunctionDeclaration | FunctionExpression | Program | ObjectMethod | SwitchStatement | WhileStatement | ArrowFunctionExpression | ClassExpression | ClassDeclaration | ForOfStatement | ClassMethod | ClassPrivateMethod | TSModuleBlock) declare export function isSpecifierDefault(specifier: BabelNodeModuleSpecifier): boolean declare export function isType(nodetype: ?string, targetType: string): boolean declare export function isValidES3Identifier(name: string): boolean declare export function isValidES3Identifier(name: string): boolean declare export function isValidIdentifier(name: string): boolean - declare export function isVar(node: BabelNode): boolean %checks (node.type === 'VariableDeclaration') + declare export function isVar(node: BabelNode): node is VariableDeclaration declare export function matchesPattern(node: ?BabelNode, match: string | Array, allowPartial?: boolean): boolean declare export function validate(n: BabelNode, key: string, value: mixed): void; declare export type Node = BabelNode; 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 new file mode 100644 index 00000000000000..b8d97331050f36 --- /dev/null +++ b/flow-typed/npm/data-uri-to-buffer_v6.x.x.js @@ -0,0 +1,21 @@ +/** + * 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/mkdirp_v0.5.x.js b/flow-typed/npm/mkdirp_v0.5.x.js new file mode 100644 index 00000000000000..79522197f961eb --- /dev/null +++ b/flow-typed/npm/mkdirp_v0.5.x.js @@ -0,0 +1,18 @@ +// 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 index 396865dca4fc66..51832ac1caa387 100644 --- a/flow-typed/npm/parseargs_v0.11.x.js +++ b/flow-typed/npm/parseargs_v0.11.x.js @@ -10,31 +10,30 @@ */ declare module '@pkgjs/parseargs' { - declare type ParseArgsOptionConfig = { - type: 'string' | 'boolean', - short?: string, - multiple?: boolean, - }; - - declare type ParseArgsOptionsConfig = { - [longOption: string]: ParseArgsOptionConfig, - }; - - declare export type ParseArgsConfig = { + declare export function parseArgs< + TOptions: {[string]: util$ParseArgsOption} = {}, + >(config: { + args?: Array, + options?: TOptions, strict?: boolean, allowPositionals?: boolean, - tokens?: boolean, - options?: ParseArgsOptionsConfig, - args?: string[], + tokens?: false, + }): { + values: util$ParseArgsOptionsToValues, + positionals: Array, }; - declare type ParsedResults = { - values: { - [longOption: string]: void | string | boolean | Array, - }, - positionals: string[], - ... + 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, }; - - declare export function parseArgs(config: ParseArgsConfig): ParsedResults; } diff --git a/flow-typed/npm/selfsigned_v2.x.x.js b/flow-typed/npm/selfsigned_v2.x.x.js new file mode 100644 index 00000000000000..be353372f138ad --- /dev/null +++ b/flow-typed/npm/selfsigned_v2.x.x.js @@ -0,0 +1,101 @@ +/** + * 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 'selfsigned' { + declare interface SelfsignedOptions { + /** + * The number of days before expiration + * + * @default 365 */ + days?: number; + + /** + * The date before which the certificate should not be valid + * + * @default now */ + notBeforeDate?: Date; + + /** + * the size for the private key in bits + * @default 1024 + */ + keySize?: number; + /** + * additional extensions for the certificate + */ + extensions?: mixed[]; + /** + * The signature algorithm sha256 or sha1 + * @default "sha1" + */ + algorithm?: string; + /** + * include PKCS#7 as part of the output + * @default false + */ + pkcs7?: boolean; + /** + * generate client cert signed by the original key + * @default false + */ + clientCertificate?: boolean; + /** + * client certificate's common name + * @default "John Doe jdoe123" + */ + clientCertificateCN?: string; + /** + * the size for the client private key in bits + * @default 1024 + */ + clientCertificateKeySize?: number; + } + + declare interface GenerateResult { + private: string; + public: string; + cert: string; + fingerprint: string; + } + + declare export function generate( + attrs?: pki$CertificateField[], + opts?: SelfsignedOptions, + ): GenerateResult; + + declare export function generate( + attrs?: pki$CertificateField[], + opts?: SelfsignedOptions, + /** Optional callback, if not provided the generation is synchronous */ + done?: (err: void | Error, result: GenerateResult) => mixed, + ): void; + + // definitions from node-forge's `pki` and `asn1` namespaces + declare interface pki$CertificateFieldOptions { + name?: string | void; + type?: string | void; + shortName?: string | void; + } + + declare enum asn1$Class { + UNIVERSAL = 0x00, + APPLICATION = 0x40, + CONTEXT_SPECIFIC = 0x80, + PRIVATE = 0xc0, + } + + declare interface pki$CertificateField extends pki$CertificateFieldOptions { + valueConstructed?: boolean | void; + valueTagClass?: asn1$Class | void; + value?: mixed[] | string | void; + extensions?: mixed[] | void; + } +} diff --git a/flow-typed/npm/shelljs_v0.x.x.js b/flow-typed/npm/shelljs_v0.x.x.js new file mode 100644 index 00000000000000..b1bff7b8402d51 --- /dev/null +++ b/flow-typed/npm/shelljs_v0.x.x.js @@ -0,0 +1,348 @@ +/** + * (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary. + * + * @flow + * @format + */ + +'use strict'; + +// https://github.com/flow-typed/flow-typed/blob/master/definitions/npm/shelljs_v0.7.x/flow_v0.28.x-v0.32.x/shelljs_v0.7.x.js + +declare type $npm$shelljs$Array = Array & $npm$shelljs$Result; +declare type $npm$shelljs$Async = Class; +declare type $npm$shelljs$Pattern = RegExp | String | string; +declare type $npm$shelljs$String = String & $npm$shelljs$Result; + +declare interface $npm$shelljs$Config { + fatal: boolean; + globOpts: { + nodir: boolean, + ... + }; + silent: boolean; + verbose: boolean; +} +declare interface $npm$shelljs$Env { + [key: string]: string; +} + +declare type $npm$shelljs$OptionsPoly = { + [keys: Flags]: boolean, + ... +}; +declare interface $npm$shelljs$ExecThen { + (code: number, stdout: string, stderr: string): void; +} +declare type $npm$shelljs$ExecOptionsPoly = T & { + async?: boolean, + silent?: boolean, + ... +}; +declare type $npm$shelljs$ExecOpts = + $npm$shelljs$ExecOptionsPoly; +declare type $npm$shelljs$ExecOptsSync = + $npm$shelljs$ExecOptionsPoly; +declare type $npm$shelljs$GrepOpts = $npm$shelljs$OptionsPoly<'-l' | '-v'>; +declare type $npm$shelljs$SedOpts = $npm$shelljs$OptionsPoly<'-i'>; +declare type $npm$shelljs$SortOpts = $npm$shelljs$OptionsPoly<'-n' | '-r'>; +declare type $npm$shelljs$TestOpts = + | '-b' + | '-c' + | '-d' + | '-e' + | '-f' + | '-L' + | '-p' + | '-S'; +declare type $npm$shelljs$TouchOpts = { + [key: '-a' | '-c' | '-m']: boolean, + '-d'?: string, + '-r'?: string, + ... +}; + +// dupe from flow lib until we can import +declare interface $npm$shelljs$FileStats { + atime: Date; + birthtime: Date; // FIXME: add to flow lib + blksize: number; + blocks: number; + ctime: Date; + dev: number; + gid: number; + ino: number; + mode: number; + mtime: Date; + name: string; // NOTE: specific to shelljs + nlink: number; + rdev: number; + size: number; + uid: number; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isDirectory(): boolean; + isFIFO(): boolean; + isFile(): boolean; + isSocket(): boolean; + isSymbolicLink(): boolean; +} + +declare interface $npm$shelljs$Result { + code: number; + stdout: string; + stderr: string; + to(file: string): $npm$shelljs$String; + toEnd(file: string): $npm$shelljs$String; + cat: (rest: void) => $npm$shelljs$String; + exec: (( + cmd: string, + opts: $npm$shelljs$ExecOpts & {async: true, ...}, + then: $npm$shelljs$ExecThen, + rest: void, + ) => $npm$shelljs$Async) & + (( + cmd: string, + opts: $npm$shelljs$ExecOpts & {async: true, ...}, + rest: void, + ) => $npm$shelljs$Async) & + (( + cmd: string, + opts: $npm$shelljs$ExecOptsSync, + rest: void, + ) => $npm$shelljs$String) & + ((cmd: string, rest: void) => $npm$shelljs$String) & + (( + cmd: string, + then: $npm$shelljs$ExecThen, + rest: void, + ) => $npm$shelljs$Async); + grep: (( + opts: $npm$shelljs$GrepOpts, + rx: $npm$shelljs$Pattern, + rest: void, + ) => $npm$shelljs$String) & + ((rx: $npm$shelljs$Pattern, rest: void) => $npm$shelljs$String); + head: ((num: number, rest: void) => $npm$shelljs$String) & + ((rest: void) => $npm$shelljs$String); + sed: ( + rx: $npm$shelljs$Pattern, + subst: string, + rest: void, + ) => $npm$shelljs$String; + sort: ((opts: $npm$shelljs$SortOpts, rest: void) => $npm$shelljs$String) & + ((rest: void) => $npm$shelljs$String); + tail: ((num: number, rest: void) => $npm$shelljs$String) & + ((rest: void) => $npm$shelljs$String); +} + +// $FlowFixMe[unsupported-syntax] +declare module 'shelljs' { + declare export type ShellArray = $npm$shelljs$Array; + declare export type ShellAsync = $npm$shelljs$Async; + declare export type ShellOptionsPoly = + $npm$shelljs$OptionsPoly; + declare export type ShellConfig = $npm$shelljs$Config; + declare export type ShellEnv = $npm$shelljs$Env; + declare export type ShellFileStats = $npm$shelljs$FileStats; + declare export type ShellPattern = $npm$shelljs$Pattern; + declare export type ShellResult = $npm$shelljs$Result; + declare export type ShellString = $npm$shelljs$String; + + declare export type ChmodOpts = ShellOptionsPoly<'-R' | '-c' | '-v'>; + declare export type CpOpts = ShellOptionsPoly< + '-P' | '-L' | '-R' | '-f' | '-n', + >; + declare export type DirsOpts = '-c'; + declare export // FIXME + type DirsIdx = + | '-0' + | '-1' + | '-2' + | '-3' + | '-4' + | '-5' + | '-6' + | '-7' + | '-8' + | '-9' + | '-10' + | '-11' + | '-12' + | '-13' + | '-14' + | '-15' + | '-16' + | '-17' + | '-18' + | '-19' + | '-20' + | '-21' + | '-22' + | '-23' + | '-24' + | '-25' + | '-26' + | '-27' + | '-28' + | '-29' + | '-30' + | '-31' + | '+0' + | '+1' + | '+2' + | '+3' + | '+4' + | '+5' + | '+6' + | '+7' + | '+8' + | '+9' + | '+10' + | '+11' + | '+12' + | '+13' + | '+14' + | '+15' + | '+16' + | '+17' + | '+18' + | '+19' + | '+20' + | '+21' + | '+22' + | '+23' + | '+24' + | '+25' + | '+26' + | '+27' + | '+28' + | '+29' + | '+30' + | '+31'; + declare export type ExecOpts = $npm$shelljs$ExecOpts; + declare export type ExecOptsSync = $npm$shelljs$ExecOptsSync; + declare export type ExecThen = $npm$shelljs$ExecThen; + declare export type GrepOpts = $npm$shelljs$GrepOpts; + declare export type LnOpts = ShellOptionsPoly<'-f' | '-s'>; + declare export type LsOpts = ShellOptionsPoly<'-A' | '-R' | '-d' | '-l'>; + declare export type MkdirOpts = ShellOptionsPoly<'-p'>; + declare export type MvOpts = ShellOptionsPoly<'-f' | '-n'>; + declare export type PopdOpts = ShellOptionsPoly<'-n'>; + declare export type PushdOpts = ShellOptionsPoly<'-n'>; + declare export type RmOpts = ShellOptionsPoly<'-f' | '-r'>; + declare export type SedOpts = $npm$shelljs$SedOpts; + declare export type SortOpts = $npm$shelljs$SortOpts; + declare export type TestOpts = $npm$shelljs$TestOpts; + declare export type TouchOpts = $npm$shelljs$TouchOpts; + + declare module.exports: { + ShellString: (( + stdout: string, + stderr?: string, + code?: number, + ) => ShellString) & + ((stdout: T[], stderr?: string, code?: number) => ShellArray), + config: ShellConfig, + env: ShellEnv, + cat: (glob: string, ...rest: string[]) => ShellString, + cd: ((dir: string, rest: void) => ShellString) & + ((rest: void) => ShellString), + chmod: (( + opts: ChmodOpts, + mode: number | string, + glob: string, + ...rest: string[] + ) => ShellString) & + ((mode: number | string, glob: string, ...rest: string[]) => ShellString), + cp: (( + opts: CpOpts, + src: string, + next: string, + ...rest: string[] + ) => ShellString) & + ((src: string, next: string, ...rest: string[]) => ShellString), + dirs: ((idxOrOpts: DirsIdx | DirsOpts, rest: void) => string[]) & + ((rest: void) => string[]), + echo: (...rest: (number | string | String)[]) => ShellString, // FIXME: consider allowing more input types + error: (rest: void) => ?string, + exec: (( + cmd: string, + opts: ExecOpts & {async: true, ...}, + then: ExecThen, + rest: void, + ) => ShellAsync) & + (( + cmd: string, + opts: ExecOpts & {async: true, ...}, + rest: void, + ) => ShellAsync) & + ((cmd: string, opts: ExecOptsSync, rest: void) => ShellString) & + ((cmd: string, rest: void) => ShellString) & + ((cmd: string, then: ExecThen, rest: void) => ShellAsync), + exit: ((code: number, rest: void) => void) & ((rest: void) => void), + find: (glob: string, ...rest: string[]) => ShellArray, + grep: (( + opts: GrepOpts, + rx: ShellPattern, + glob: string, + ...rest: string[] + ) => ShellString) & + ((rx: ShellPattern, glob: string, ...rest: string[]) => ShellString), + head: ((num: number, glob: string, ...rest: string[]) => ShellString) & + ((glob: string, ...rest: string[]) => ShellString), + ln: ((opts: LnOpts, src: string, tgt: string, rest: void) => ShellString) & + ((src: string, tgt: string, rest: void) => ShellString), + ls: (( + opts: LsOpts & {'-l': true, ...}, + glob: string, + ...rest: string[] + ) => ShellArray) & + ((opts: LsOpts, glob: string, ...rest: string[]) => ShellArray) & + ((glob: string, ...rest: string[]) => ShellArray), + mkdir: ((opts: MkdirOpts, dir: string, ...rest: string[]) => ShellString) & + ((dir: string, ...rest: string[]) => ShellString), + mv: (( + opts: MvOpts, + src: string, + next: string, + ...rest: string[] + ) => ShellString) & + ((src: string, next: string, ...rest: string[]) => ShellString), + popd: ((opts: PopdOpts, idx: string, rest: void) => string[]) & + ((opts: PopdOpts, rest: void) => string[]) & + ((idx: string, rest: void) => string[]) & + ((rest: void) => string[]), + pushd: ((opts: PushdOpts, dirOrIdx: string, rest: void) => string[]) & + ((dirOrIdx: string, rest: void) => string[]), + pwd: (rest: void) => ShellString, + rm: ((opts: RmOpts, glob: string, ...rest: string[]) => ShellString) & + ((glob: string, ...rest: string[]) => ShellString), + sed: (( + opts: SedOpts, + rx: ShellPattern, + subst: string, + glob: string, + ...rest: string[] + ) => ShellString) & + (( + rx: ShellPattern, + subst: string, + glob: string, + ...rest: string[] + ) => ShellString), + set: ((exitOnError: '-e' | '+e', rest: void) => void) & + ((verbose: '-v' | '+v', rest: void) => void) & + ((disableGlobbing: '-f' | '+f', rest: void) => void), + sort: ((opts: SortOpts, glob: string, ...rest: string[]) => ShellString) & + ((glob: string, ...rest: string[]) => ShellString), + tail: ((num: number, glob: string, ...rest: string[]) => ShellString) & + ((glob: string, ...rest: string[]) => ShellString), + tempdir: (rest: void) => string, + test: (mode: TestOpts, path: string, rest: void) => boolean, + touch: ((opts: TouchOpts, glob: string, ...rest: string[]) => ShellString) & + ((glob: string, ...rest: string[]) => ShellString), + which: (cmd: string, rest: void) => ShellString, + ... + }; +} diff --git a/flow-typed/npm/signedsource_v1.x.x.js b/flow-typed/npm/signedsource_v1.x.x.js new file mode 100644 index 00000000000000..2bebd077442d6f --- /dev/null +++ b/flow-typed/npm/signedsource_v1.x.x.js @@ -0,0 +1,19 @@ +/** + * (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary. + * + * @format + * @flow strict + */ + +declare module 'signedsource' { + declare type SignedSource = { + TokenNotFoundError: Error, + getSigningToken(): string, + isSigned(data: string): boolean, + signFile(data: string): string, + verifySignature(data: string): boolean, + [key: string]: mixed, + }; + + declare module.exports: SignedSource; +} diff --git a/flow-typed/npm/undici_v5.x.x.js b/flow-typed/npm/undici_v5.x.x.js new file mode 100644 index 00000000000000..48360acd2330d5 --- /dev/null +++ b/flow-typed/npm/undici_v5.x.x.js @@ -0,0 +1,26 @@ +/** + * 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 + */ + +// Very incomplete types for the undici package. + +declare interface undici$Agent$Options { + connect?: tls$connectOptions; +} + +declare module 'undici' { + declare export class Dispatcher extends events$EventEmitter { + constructor(): void; + } + + declare export class Agent extends Dispatcher { + constructor(opts?: undici$Agent$Options): void; + } +} diff --git a/flow-typed/npm/wait-for-expect_v3.x.x.js b/flow-typed/npm/wait-for-expect_v3.x.x.js new file mode 100644 index 00000000000000..3220e66276f1f9 --- /dev/null +++ b/flow-typed/npm/wait-for-expect_v3.x.x.js @@ -0,0 +1,23 @@ +/** + * 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 'wait-for-expect' { + declare export default (( + expectation: () => void | Promise, + timeout?: number, + interval?: number, + ) => Promise) & { + defaults: { + timeout: number, + interval: number, + }, + }; +} diff --git a/flow-typed/npm/ws_v7.x.x.js b/flow-typed/npm/ws_v7.x.x.js index c2759dbb18c44a..f05b8fac03d4a9 100644 --- a/flow-typed/npm/ws_v7.x.x.js +++ b/flow-typed/npm/ws_v7.x.x.js @@ -125,6 +125,7 @@ declare type ws$WebSocketOptions = { createConnection?: | ((options: net$connectOptions, callback?: () => mixed) => net$Socket) | ((options: tls$connectOptions, callback?: () => mixed) => tls$TLSSocket), + rejectUnauthorized?: boolean, }; declare type ws$CloseListener = (code: number, reason: string) => mixed; diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765..d64cd4917707c1 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 8838ba97ba0914..2ea3535dc058bd 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.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew.bat b/gradlew.bat index 6689b85beecde6..7101f8e4676fca 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/jest.config.js b/jest.config.js index 78cacd59be57ed..032da9400fbf29 100644 --- a/jest.config.js +++ b/jest.config.js @@ -34,6 +34,7 @@ module.exports = { '/packages/react-native/sdks', '/packages/react-native/Libraries/Renderer', '/packages/rn-tester/e2e', + '/packages/react-native-test-renderer/src', ], transformIgnorePatterns: ['node_modules/(?!@react-native/)'], haste: { @@ -48,6 +49,7 @@ module.exports = { '^react-native(.*)': '/packages/react-native$1', // [macOS] }, moduleFileExtensions: ['fb.js'].concat(defaults.moduleFileExtensions), + modulePathIgnorePatterns: ['scripts/.*/__fixtures__/'], unmockedModulePathPatterns: [ 'node_modules/react/', 'packages/react-native/Libraries/Renderer', @@ -57,7 +59,10 @@ module.exports = { 'denodeify', ], testEnvironment: 'node', - collectCoverageFrom: ['packages/react-native/Libraries/**/*.js'], + collectCoverageFrom: [ + 'packages/react-native/Libraries/**/*.js', + 'packages/react-native/src/**/*.js', + ], coveragePathIgnorePatterns: [ '/__tests__/', '/vendor/', diff --git a/jest/preprocessor.js b/jest/preprocessor.js index ae9f6dd90b9311..9408065576380b 100644 --- a/jest/preprocessor.js +++ b/jest/preprocessor.js @@ -12,6 +12,8 @@ 'use strict'; +/* eslint-disable lint/sort-imports */ + const metroBabelRegister = require('metro-babel-register'); const nullthrows = require('nullthrows'); const createCacheKeyFunction = @@ -36,6 +38,16 @@ const {only: _, ...nodeBabelOptions} = metroBabelRegister.config([]); 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. +const babelPluginPreventBabelRegister = [ + require.resolve('babel-plugin-transform-define'), + { + 'process.env.BUILD_EXCLUDE_BABEL_REGISTER': true, + }, +]; + module.exports = { process(src /*: string */, file /*: string */) /*: {code: string, ...} */ { if (nodeFiles.test(file)) { @@ -44,6 +56,10 @@ module.exports = { filename: file, sourceType: 'script', ...nodeBabelOptions, + plugins: [ + ...(nodeBabelOptions.plugins ?? []), + babelPluginPreventBabelRegister, + ], ast: false, }); } @@ -76,6 +92,7 @@ module.exports = { plugins: [ // TODO(moti): Replace with require('metro-transform-plugins').inlineRequiresPlugin when available in OSS require('babel-preset-fbjs/plugins/inline-requires'), + babelPluginPreventBabelRegister, ], sourceType: 'module', }); diff --git a/package.json b/package.json index 1f20c44914e61f..926f7c98b86e3a 100644 --- a/package.json +++ b/package.json @@ -21,21 +21,25 @@ "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", "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", + "set-version": "node ./scripts/releases/set-version", "test-android": "./gradlew :packages:react-native:ReactAndroid:test", "test-ci": "jest --maxWorkers=2 --ci --reporters=\"default\" --reporters=\"jest-junit\"", - "test-e2e-local-clean": "node ./scripts/test-e2e-local-clean.js", - "test-e2e-local": "node ./scripts/test-e2e-local.js", + "test-e2e-local-clean": "node ./scripts/release-testing/test-e2e-local-clean.js", + "test-e2e-local": "node ./scripts/release-testing/test-e2e-local.js", "test-ios": "./scripts/objc-test.sh test", "test-typescript-offline": "dtslint --localTs node_modules/typescript/lib packages/react-native/types", "test-typescript": "dtslint packages/react-native/types", "test": "jest", - "trigger-react-native-release": "node ./scripts/trigger-react-native-release.js", + "trigger-react-native-release": "node ./scripts/releases-local/trigger-react-native-release.js", "update-lock": "npx yarn-deduplicate" }, "workspaces": [ @@ -55,8 +59,8 @@ "@definitelytyped/dtslint": "^0.0.127", "@jest/create-cache-key-function": "^29.6.3", "@pkgjs/parseargs": "^0.11.0", - "@react-native/metro-babel-transformer": "^0.73.11", - "@react-native/metro-config": "^0.73.0", + "@react-native/metro-babel-transformer": "0.74.0", + "@react-native/metro-config": "0.74.0", "@tsconfig/node18": "1.0.1", "@types/react": "^18.0.18", "@typescript-eslint/parser": "^6.7.4", @@ -83,22 +87,24 @@ "eslint-plugin-react-native": "^4.0.0", "eslint-plugin-redundant-undefined": "^0.4.0", "eslint-plugin-relay": "^1.8.3", - "flow-api-translator": "0.16.0", - "flow-bin": "^0.218.0", + "flow-api-translator": "0.19.1", + "flow-bin": "^0.228.0", "glob": "^7.1.1", - "hermes-eslint": "0.16.0", + "hermes-eslint": "0.19.1", + "hermes-transform": "0.19.1", "inquirer": "^7.1.0", "jest": "^29.6.3", "jest-junit": "^10.0.0", "jscodeshift": "^0.14.0", - "metro-babel-register": "0.79.1", - "metro-memory-fs": "0.79.1", + "metro-babel-register": "^0.80.0", + "metro-memory-fs": "^0.80.0", "micromatch": "^4.0.4", "mkdirp": "^0.5.1", "mock-fs": "^5.1.4", + "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", "prettier": "2.8.8", - "prettier-plugin-hermes-parser": "0.16.0", + "prettier-plugin-hermes-parser": "0.19.1", "react": "18.2.0", "react-test-renderer": "18.2.0", "rimraf": "^3.0.2", diff --git a/packages/assets/package.json b/packages/assets/package.json index d2ef78f4d24903..616930179d1867 100644 --- a/packages/assets/package.json +++ b/packages/assets/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/assets-registry", - "version": "0.73.0", + "version": "0.74.0", "description": "Asset support code for React Native.", "license": "MIT", "repository": { diff --git a/packages/babel-plugin-codegen/__tests__/index-test.js b/packages/babel-plugin-codegen/__tests__/index-test.js index 20195b5ea40303..1f73d197578694 100644 --- a/packages/babel-plugin-codegen/__tests__/index-test.js +++ b/packages/babel-plugin-codegen/__tests__/index-test.js @@ -10,9 +10,9 @@ 'use strict'; -const {transform: babelTransform} = require('@babel/core'); -const fixtures = require('../__test_fixtures__/fixtures.js'); const failures = require('../__test_fixtures__/failures.js'); +const fixtures = require('../__test_fixtures__/fixtures.js'); +const {transform: babelTransform} = require('@babel/core'); const transform = (fixture, filename) => babelTransform(fixture, { diff --git a/packages/babel-plugin-codegen/index.js b/packages/babel-plugin-codegen/index.js index 4314e6d50eb518..77de6b77b33ad7 100644 --- a/packages/babel-plugin-codegen/index.js +++ b/packages/babel-plugin-codegen/index.js @@ -76,7 +76,16 @@ function isCodegenDeclaration(declaration) { ) { return true; } else if ( - declaration.type === 'TypeCastExpression' && + (declaration.type === 'TypeCastExpression' || + declaration.type === 'AsExpression') && + declaration.expression && + declaration.expression.callee && + declaration.expression.callee.name && + declaration.expression.callee.name === 'codegenNativeComponent' + ) { + return true; + } else if ( + declaration.type === 'TSAsExpression' && declaration.expression && declaration.expression.callee && declaration.expression.callee.name && diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index f1fa7e4048d62a..82871a54a6eb54 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.73.0", + "version": "0.74.0", "description": "Babel plugin to generate native module and view manager code for React Native.", "license": "MIT", "repository": { @@ -25,7 +25,7 @@ "index.js" ], "dependencies": { - "@react-native/codegen": "*" + "@react-native/codegen": "0.74.0" }, "devDependencies": { "@babel/core": "^7.20.0" diff --git a/packages/community-cli-plugin/README.md b/packages/community-cli-plugin/README.md index 3cf597929eb1e9..aebbf39d106fcc 100644 --- a/packages/community-cli-plugin/README.md +++ b/packages/community-cli-plugin/README.md @@ -59,6 +59,7 @@ npx react-native bundle --entry-file [options] | `--minify [boolean]` | Allows overriding whether bundle is minified. Defaults to `false` if `--dev` is set. Disabling minification can be useful for speeding up production builds for testing purposes. | | `--bundle-output ` | Specify the path to store the resulting bundle. | | `--bundle-encoding ` | Specify the encoding for writing the bundle (). | +| `--resolver-option ` | Custom resolver options of the form key=value. URL-encoded. May be specified multiple times. | | `--sourcemap-output ` | Specify the path to store the source map file for the resulting bundle. | | `--sourcemap-sources-root ` | Set the root path for source map entries. | | `--sourcemap-use-absolute-path` | Report `SourceMapURL` using its full path. | diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index 11adec41fd2619..1afba5641efbe5 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -1,12 +1,12 @@ { "name": "@react-native/community-cli-plugin", - "version": "0.73.1", + "version": "0.74.0", "description": "Core CLI commands for React Native", "keywords": [ "react-native", "tools" ], - "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/buid-scripts#readme", + "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/community-cli-plugin#readme", "bugs": "https://github.com/facebook/react-native/issues", "repository": { "type": "git", @@ -15,27 +15,28 @@ }, "license": "MIT", "exports": { - ".": "./src/index.js", + ".": "./dist/index.js", "./package.json": "./package.json" }, "files": [ "dist" ], "dependencies": { - "@react-native-community/cli-server-api": "12.0.0-alpha.15", - "@react-native-community/cli-tools": "12.0.0-alpha.15", - "@react-native/dev-middleware": "^0.73.0", - "@react-native/metro-babel-transformer": "^0.73.11", + "@react-native-community/cli-server-api": "13.6.0", + "@react-native-community/cli-tools": "13.6.0", + "@react-native/dev-middleware": "0.74.0", + "@react-native/metro-babel-transformer": "0.74.0", "chalk": "^4.0.0", "execa": "^5.1.1", - "metro": "0.79.1", - "metro-config": "0.79.1", - "metro-core": "0.79.1", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", "node-fetch": "^2.2.0", + "querystring": "^0.2.1", "readline": "^1.3.0" }, "devDependencies": { - "metro-resolver": "0.79.1" + "metro-resolver": "^0.80.3" }, "engines": { "node": ">=18" diff --git a/packages/community-cli-plugin/src/commands/bundle/__tests__/getAssetDestPathAndroid-test.js b/packages/community-cli-plugin/src/commands/bundle/__tests__/getAssetDestPathAndroid-test.js index 3f5074674e3fb3..27ce49565abcad 100644 --- a/packages/community-cli-plugin/src/commands/bundle/__tests__/getAssetDestPathAndroid-test.js +++ b/packages/community-cli-plugin/src/commands/bundle/__tests__/getAssetDestPathAndroid-test.js @@ -11,10 +11,10 @@ import getAssetDestPathAndroid from '../getAssetDestPathAndroid'; -jest.dontMock('../getAssetDestPathAndroid').dontMock('../assetPathUtils'); - const path = require('path'); +jest.dontMock('../getAssetDestPathAndroid').dontMock('../assetPathUtils'); + describe('getAssetDestPathAndroid', () => { test('should use the right destination folder', () => { const asset = { diff --git a/packages/community-cli-plugin/src/commands/bundle/__tests__/getAssetDestPathIOS-test.js b/packages/community-cli-plugin/src/commands/bundle/__tests__/getAssetDestPathIOS-test.js index 1e807f12391331..2709141eba79da 100644 --- a/packages/community-cli-plugin/src/commands/bundle/__tests__/getAssetDestPathIOS-test.js +++ b/packages/community-cli-plugin/src/commands/bundle/__tests__/getAssetDestPathIOS-test.js @@ -11,10 +11,10 @@ import getAssetDestPathIOS from '../getAssetDestPathIOS'; -jest.dontMock('../getAssetDestPathIOS'); - const path = require('path'); +jest.dontMock('../getAssetDestPathIOS'); + describe('getAssetDestPathIOS', () => { test('should build correct path', () => { const asset = { diff --git a/packages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.js b/packages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.js index 7b6c1acb0176d6..8ef0b9d35adb77 100644 --- a/packages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.js +++ b/packages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.js @@ -11,16 +11,16 @@ import type {AssetData} from 'metro/src/Assets'; -import path from 'path'; -import fs from 'fs'; import assetPathUtils from './assetPathUtils'; +import fs from 'fs'; +import path from 'path'; export function cleanAssetCatalog(catalogDir: string): void { const files = fs .readdirSync(catalogDir) .filter(file => file.endsWith('.imageset')); for (const file of files) { - fs.rmSync(path.join(catalogDir, file)); + fs.rmSync(path.join(catalogDir, file), {recursive: true, force: true}); } } diff --git a/packages/community-cli-plugin/src/commands/bundle/buildBundle.js b/packages/community-cli-plugin/src/commands/bundle/buildBundle.js index 525f46748bb822..98aac3b8fa5c46 100644 --- a/packages/community-cli-plugin/src/commands/bundle/buildBundle.js +++ b/packages/community-cli-plugin/src/commands/bundle/buildBundle.js @@ -10,17 +10,18 @@ */ import type {Config} from '@react-native-community/cli-types'; -import type {RequestOptions} from 'metro/src/shared/types.flow'; import type {ConfigT} from 'metro-config'; +import type {RequestOptions} from 'metro/src/shared/types.flow'; +import loadMetroConfig from '../../utils/loadMetroConfig'; +import parseKeyValueParamArray from '../../utils/parseKeyValueParamArray'; +import saveAssets from './saveAssets'; +import {logger} from '@react-native-community/cli-tools'; +import chalk from 'chalk'; import Server from 'metro/src/Server'; import metroBundle from 'metro/src/shared/output/bundle'; import metroRamBundle from 'metro/src/shared/output/RamBundle'; import path from 'path'; -import chalk from 'chalk'; -import saveAssets from './saveAssets'; -import loadMetroConfig from '../../utils/loadMetroConfig'; -import {logger} from '@react-native-community/cli-tools'; export type BundleCommandArgs = { assetsDest?: string, @@ -42,6 +43,7 @@ export type BundleCommandArgs = { verbose: boolean, unstableTransformProfile: string, indexedRamBundle?: boolean, + resolverOption?: Array, }; async function buildBundle( @@ -64,6 +66,10 @@ async function buildBundleWithConfig( config: ConfigT, bundleImpl: typeof metroBundle | typeof metroRamBundle = metroBundle, ): Promise { + const customResolverOptions = parseKeyValueParamArray( + args.resolverOption ?? [], + ); + if (config.resolver.platforms.indexOf(args.platform) === -1) { logger.error( `Invalid platform ${ @@ -99,6 +105,7 @@ async function buildBundleWithConfig( minify: args.minify !== undefined ? args.minify : !args.dev, platform: args.platform, unstable_transformProfile: args.unstableTransformProfile, + customResolverOptions, }; const server = new Server(config); diff --git a/packages/community-cli-plugin/src/commands/bundle/getAssetDestPathAndroid.js b/packages/community-cli-plugin/src/commands/bundle/getAssetDestPathAndroid.js index 20f9ec781c3c7e..5e005112ce62ca 100644 --- a/packages/community-cli-plugin/src/commands/bundle/getAssetDestPathAndroid.js +++ b/packages/community-cli-plugin/src/commands/bundle/getAssetDestPathAndroid.js @@ -11,8 +11,8 @@ import type {PackagerAsset} from './assetPathUtils'; -import path from 'path'; import assetPathUtils from './assetPathUtils'; +import path from 'path'; function getAssetDestPathAndroid(asset: PackagerAsset, scale: number): string { const androidFolder = assetPathUtils.getAndroidResourceFolderName( diff --git a/packages/community-cli-plugin/src/commands/bundle/index.js b/packages/community-cli-plugin/src/commands/bundle/index.js index 6a480c4e333aba..1e8522a845cf95 100644 --- a/packages/community-cli-plugin/src/commands/bundle/index.js +++ b/packages/community-cli-plugin/src/commands/bundle/index.js @@ -11,8 +11,8 @@ import type {Command} from '@react-native-community/cli-types'; -import path from 'path'; import buildBundle from './buildBundle'; +import path from 'path'; export type {BundleCommandArgs} from './buildBundle'; @@ -114,6 +114,13 @@ const bundleCommand: Command = { description: 'Path to the CLI configuration file', parse: (val: string): string => path.resolve(val), }, + { + name: '--resolver-option ', + description: + 'Custom resolver options of the form key=value. URL-encoded. May be specified multiple times.', + parse: (val: string, previous: Array = []): Array => + previous.concat([val]), + }, ], }; diff --git a/packages/community-cli-plugin/src/commands/bundle/saveAssets.js b/packages/community-cli-plugin/src/commands/bundle/saveAssets.js index b4183c31e05640..1aae31542fdc5d 100644 --- a/packages/community-cli-plugin/src/commands/bundle/saveAssets.js +++ b/packages/community-cli-plugin/src/commands/bundle/saveAssets.js @@ -11,9 +11,6 @@ import type {AssetData} from 'metro/src/Assets'; -import {logger} from '@react-native-community/cli-tools'; -import fs from 'fs'; -import path from 'path'; import { cleanAssetCatalog, getImageSet, @@ -23,6 +20,9 @@ import { import filterPlatformAssetScales from './filterPlatformAssetScales'; import getAssetDestPathAndroid from './getAssetDestPathAndroid'; import getAssetDestPathIOS from './getAssetDestPathIOS'; +import {logger} from '@react-native-community/cli-tools'; +import fs from 'fs'; +import path from 'path'; type CopiedFiles = { [src: string]: string, diff --git a/packages/community-cli-plugin/src/commands/ram-bundle/index.js b/packages/community-cli-plugin/src/commands/ram-bundle/index.js index 1cf978ffc8d4e8..eeed0819cfecdc 100644 --- a/packages/community-cli-plugin/src/commands/ram-bundle/index.js +++ b/packages/community-cli-plugin/src/commands/ram-bundle/index.js @@ -9,12 +9,12 @@ * @oncall react_native */ -import type {Command, Config} from '@react-native-community/cli-types'; import type {BundleCommandArgs} from '../bundle'; +import type {Command, Config} from '@react-native-community/cli-types'; -import metroRamBundle from 'metro/src/shared/output/RamBundle'; import bundleCommand from '../bundle'; import buildBundle from '../bundle/buildBundle'; +import metroRamBundle from 'metro/src/shared/output/RamBundle'; const ramBundleCommand: Command = { name: 'ram-bundle', diff --git a/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js b/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js index 548a9e8f44d865..1278832bc0f603 100644 --- a/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js +++ b/packages/community-cli-plugin/src/commands/start/attachKeyHandlers.js @@ -11,11 +11,11 @@ import type {Config} from '@react-native-community/cli-types'; +import {KeyPressHandler} from '../../utils/KeyPressHandler'; import {logger} from '@react-native-community/cli-tools'; import chalk from 'chalk'; import execa from 'execa'; import fetch from 'node-fetch'; -import {KeyPressHandler} from '../../utils/KeyPressHandler'; const CTRL_C = '\u0003'; const CTRL_D = '\u0004'; @@ -46,12 +46,12 @@ export default function attachKeyHandlers({ const onPress = async (key: string) => { switch (key) { case 'r': - messageSocket.broadcast('reload', null); logger.info('Reloading connected app(s)...'); + messageSocket.broadcast('reload', null); break; case 'd': - messageSocket.broadcast('devMenu', null); logger.info('Opening Dev Menu...'); + messageSocket.broadcast('devMenu', null); break; case 'i': logger.info('Opening app on iOS...'); @@ -103,7 +103,7 @@ export default function attachKeyHandlers({ `${chalk.bold('a')} - run on Android`, `${chalk.bold('d')} - open Dev Menu`, ...(experimentalDebuggerFrontend - ? [`${chalk.bold('j')} - open debugger (experimental)`] + ? [`${chalk.bold('j')} - open debugger (experimental, Hermes only)`] : []), `${chalk.bold('r')} - reload app`, '', diff --git a/packages/community-cli-plugin/src/commands/start/index.js b/packages/community-cli-plugin/src/commands/start/index.js index 2a259367e2d1cd..7cc22efb661861 100644 --- a/packages/community-cli-plugin/src/commands/start/index.js +++ b/packages/community-cli-plugin/src/commands/start/index.js @@ -11,8 +11,8 @@ import type {Command} from '@react-native-community/cli-types'; -import path from 'path'; import runServer from './runServer'; +import path from 'path'; export type {StartCommandArgs} from './runServer'; @@ -96,14 +96,11 @@ const startCommand: Command = { description: 'Disables interactive mode', }, { - name: '--experimental-debugger [bool]', + name: '--experimental-debugger', description: "[Experimental] Enable the new debugger experience and 'j' to " + 'debug. This enables the new frontend experience only: connection ' + 'reliability and some basic features are unstable in this release.', - parse: (val: ?string): boolean => - val !== undefined && val !== 'false' && val !== '0', - default: true, }, ], }; diff --git a/packages/community-cli-plugin/src/commands/start/runServer.js b/packages/community-cli-plugin/src/commands/start/runServer.js index 60477b3131021f..7b11adc629b5f9 100644 --- a/packages/community-cli-plugin/src/commands/start/runServer.js +++ b/packages/community-cli-plugin/src/commands/start/runServer.js @@ -14,20 +14,20 @@ 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 chalk from 'chalk'; -import Metro from 'metro'; -import {Terminal} from 'metro-core'; -import path from 'path'; -import {createDevMiddleware} from '@react-native/dev-middleware'; +import isDevServerRunning from '../../utils/isDevServerRunning'; +import loadMetroConfig from '../../utils/loadMetroConfig'; +import attachKeyHandlers from './attachKeyHandlers'; import { createDevServerMiddleware, indexPageMiddleware, } from '@react-native-community/cli-server-api'; import {logger, version} from '@react-native-community/cli-tools'; - -import isDevServerRunning from '../../utils/isDevServerRunning'; -import loadMetroConfig from '../../utils/loadMetroConfig'; -import attachKeyHandlers from './attachKeyHandlers'; +import {createDevMiddleware} from '@react-native/dev-middleware'; +import chalk from 'chalk'; +import Metro from 'metro'; +import {Terminal} from 'metro-core'; +import path from 'path'; +import url from 'url'; export type StartCommandArgs = { assetPlugins?: string[], @@ -63,23 +63,18 @@ async function runServer( projectRoot: args.projectRoot, sourceExts: args.sourceExts, }); - const host = args.host?.length ? args.host : 'localhost'; + const hostname = args.host?.length ? args.host : 'localhost'; const { projectRoot, server: {port}, watchFolders, } = metroConfig; - const scheme = args.https === true ? 'https' : 'http'; - const devServerUrl = `${scheme}://${host}:${port}`; + const protocol = args.https === true ? 'https' : 'http'; + const devServerUrl = url.format({protocol, hostname, port}); logger.info(`Welcome to React Native v${ctx.reactNativeVersion}`); - const serverStatus = await isDevServerRunning( - scheme, - host, - port, - projectRoot, - ); + const serverStatus = await isDevServerRunning(devServerUrl, projectRoot); if (serverStatus === 'matched_server_running') { logger.info( @@ -109,7 +104,7 @@ async function runServer( messageSocketEndpoint, eventsSocketEndpoint, } = createDevServerMiddleware({ - host, + host: hostname, port, watchFolders, }); diff --git a/packages/community-cli-plugin/src/utils/isDevServerRunning.js b/packages/community-cli-plugin/src/utils/isDevServerRunning.js index 7478857ba08188..7f154afd0799ad 100644 --- a/packages/community-cli-plugin/src/utils/isDevServerRunning.js +++ b/packages/community-cli-plugin/src/utils/isDevServerRunning.js @@ -23,19 +23,19 @@ import fetch from 'node-fetch'; * - `unknown`: An error was encountered; attempt server creation anyway. */ export default async function isDevServerRunning( - scheme: string, - host: string, - port: number, + devServerUrl: string, projectRoot: string, ): Promise< 'not_running' | 'matched_server_running' | 'port_taken' | 'unknown', > { + const {hostname, port} = new URL(devServerUrl); + try { - if (!(await isPortOccupied(host, port))) { + if (!(await isPortOccupied(hostname, port))) { return 'not_running'; } - const statusResponse = await fetch(`${scheme}://${host}:${port}/status`); + const statusResponse = await fetch(`${devServerUrl}/status`); const body = await statusResponse.text(); return body === 'packager-status:running' && @@ -47,7 +47,10 @@ export default async function isDevServerRunning( } } -async function isPortOccupied(host: string, port: number): Promise { +async function isPortOccupied( + hostname: string, + port: string, +): Promise { let result = false; const server = net.createServer(); @@ -67,6 +70,6 @@ async function isPortOccupied(host: string, port: number): Promise { server.once('close', () => { resolve(result); }); - server.listen({host, port}); + server.listen({host: hostname, port}); }); } diff --git a/packages/community-cli-plugin/src/utils/loadMetroConfig.js b/packages/community-cli-plugin/src/utils/loadMetroConfig.js index ce3b6f36f4283d..d3eaeb93bba8b3 100644 --- a/packages/community-cli-plugin/src/utils/loadMetroConfig.js +++ b/packages/community-cli-plugin/src/utils/loadMetroConfig.js @@ -12,10 +12,10 @@ import type {Config} from '@react-native-community/cli-types'; import type {ConfigT, InputConfigT, YargArguments} from 'metro-config'; -import path from 'path'; -import {loadConfig, mergeConfig, resolveConfig} from 'metro-config'; -import {CLIError, logger} from '@react-native-community/cli-tools'; import {reactNativePlatformResolver} from './metroPlatformResolver'; +import {CLIError, logger} from '@react-native-community/cli-tools'; +import {loadConfig, mergeConfig, resolveConfig} from 'metro-config'; +import path from 'path'; export type {Config}; @@ -29,7 +29,10 @@ export type ConfigLoadingContext = $ReadOnly<{ /** * Get the config options to override based on RN CLI inputs. */ -function getOverrideConfig(ctx: ConfigLoadingContext): InputConfigT { +function getOverrideConfig( + ctx: ConfigLoadingContext, + config: ConfigT, +): InputConfigT { const outOfTreePlatforms = Object.keys(ctx.platforms).filter( platform => ctx.platforms[platform].npmPackageName, ); @@ -46,6 +49,7 @@ function getOverrideConfig(ctx: ConfigLoadingContext): InputConfigT { }, {}, ), + config.resolver?.resolveRequest, ); } @@ -62,6 +66,7 @@ function getOverrideConfig(ctx: ConfigLoadingContext): InputConfigT { ...outOfTreePlatforms.map(platform => require.resolve( `${ctx.platforms[platform].npmPackageName}/Libraries/Core/InitializeCore`, + {paths: [ctx.root]}, ), ), ], @@ -79,8 +84,6 @@ export default async function loadMetroConfig( ctx: ConfigLoadingContext, options: YargArguments = {}, ): Promise { - const overrideConfig = getOverrideConfig(ctx); - const cwd = ctx.root; const projectConfig = await resolveConfig(options.config, cwd); @@ -105,11 +108,12 @@ This warning will be removed in future (https://github.com/facebook/metro/issues } } - return mergeConfig( - await loadConfig({ - cwd, - ...options, - }), - overrideConfig, - ); + const config = await loadConfig({ + cwd, + ...options, + }); + + const overrideConfig = getOverrideConfig(ctx, config); + + return mergeConfig(config, overrideConfig); } diff --git a/packages/community-cli-plugin/src/utils/metroPlatformResolver.js b/packages/community-cli-plugin/src/utils/metroPlatformResolver.js index e03264f0c6442e..134ce7d2dad3d4 100644 --- a/packages/community-cli-plugin/src/utils/metroPlatformResolver.js +++ b/packages/community-cli-plugin/src/utils/metroPlatformResolver.js @@ -25,9 +25,12 @@ import type {CustomResolver} from 'metro-resolver'; * macos: 'react-native-macos' * } */ -export function reactNativePlatformResolver(platformImplementations: { - [platform: string]: string, -}): CustomResolver { +export function reactNativePlatformResolver( + platformImplementations: { + [platform: string]: string, + }, + customResolver: ?CustomResolver, +): CustomResolver { return (context, moduleName, platform) => { let modifiedModuleName = moduleName; if (platform != null && platformImplementations[platform]) { @@ -39,6 +42,9 @@ export function reactNativePlatformResolver(platformImplementations: { }/${modifiedModuleName.slice('react-native/'.length)}`; } } + if (customResolver) { + return customResolver(context, modifiedModuleName, platform); + } return context.resolveRequest(context, modifiedModuleName, platform); }; } diff --git a/packages/community-cli-plugin/src/utils/parseKeyValueParamArray.js b/packages/community-cli-plugin/src/utils/parseKeyValueParamArray.js new file mode 100644 index 00000000000000..021529007aeddf --- /dev/null +++ b/packages/community-cli-plugin/src/utils/parseKeyValueParamArray.js @@ -0,0 +1,30 @@ +/** + * 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 querystring from 'querystring'; + +export default function parseKeyValueParamArray( + keyValueArray: $ReadOnlyArray, +): Record { + const result = {}; + + for (const item of keyValueArray) { + if (item.indexOf('=') === -1) { + throw new Error('Expected parameter to include "=" but found: ' + item); + } + if (item.indexOf('&') !== -1) { + throw new Error('Parameter cannot include "&" but found: ' + item); + } + Object.assign(result, querystring.parse(item)); + } + + return result; +} diff --git a/packages/debugger-frontend/BUILD_INFO b/packages/debugger-frontend/BUILD_INFO index 67e1ea665da8e3..ccaa289b9792be 100644 --- a/packages/debugger-frontend/BUILD_INFO +++ b/packages/debugger-frontend/BUILD_INFO @@ -1,9 +1,9 @@ -@generated SignedSource<<7fdc9e65be03ba4c6654f14c6f23d645>> -Git revision: 18f202a1ae468a01afb44ffd2f71d28023126989 +@generated SignedSource<> +Git revision: 12a45e0628384aa80075493354159ef5d91b2698 Built with --nohooks: false Is local checkout: false -Remote URL: https://github.com/motiz88/rn-chrome-devtools-frontend -Remote branch: rn-0.73-chromium-5845 +Remote URL: https://github.com/facebookexperimental/rn-chrome-devtools-frontend +Remote branch: main GN build args (overrides only): is_official_build = true Git status in checkout: diff --git a/packages/debugger-frontend/README.md b/packages/debugger-frontend/README.md index e9e228a6a6e400..741ba72a30114f 100644 --- a/packages/debugger-frontend/README.md +++ b/packages/debugger-frontend/README.md @@ -11,12 +11,27 @@ This package is internal to React Native and is intended to be used via [`@react The package exports the absolute path to the directory containing the frontend assets. ```js - const frontendPath = require('@react-native/debugger-frontend'); // Pass frontendPath to a static server, etc ``` -## Updating the frontend assets +## Contributing + +### 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. + +### Updating the frontend assets + +The compiled assets for the debugger frontend are periodically checked into this package under the `dist/` folder. To update these, run `node scripts/debugger-frontend/sync-and-build` from the root of your `react-native` checkout. + +```sh +# For main +node scripts/debugger-frontend/sync-and-build --branch main + +# For stable branches (e.g. '0.73-stable') +node scripts/debugger-frontend/sync-and-build --branch 0.73-stable +``` -The compiled frontend assets are checked into the React Native repo. Run `node scripts/debugger-frontend/sync-and-build` from the root of your `react-native` checkout to update them. +By default, this will clone and build from [facebookexperimental/rn-chrome-devtools-frontend](https://github.com/facebookexperimental/rn-chrome-devtools-frontend). 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 3d51fc09fcd9b7..37f131c3a0ee97 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/core/host/host.js +++ b/packages/debugger-frontend/dist/third-party/front_end/core/host/host.js @@ -1 +1 @@ -import*as e from"../common/common.js";import*as o from"../i18n/i18n.js";import*as r from"../platform/platform.js";import*as t from"../root/root.js";var n;!function(e){e.AppendedToURL="appendedToURL",e.CanceledSaveURL="canceledSaveURL",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 i=[[n.AppendedToURL,"appendedToURL",["url"]],[n.CanceledSaveURL,"canceledSaveURL",["url"]],[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 s;!function(e){e.ActionTaken="DevTools.ActionTaken",e.BreakpointWithConditionAdded="DevTools.BreakpointWithConditionAdded",e.BreakpointEditDialogRevealedFrom="DevTools.BreakpointEditDialogRevealedFrom",e.PanelClosed="DevTools.PanelClosed",e.PanelShown="DevTools.PanelShown",e.SidebarPaneShown="DevTools.SidebarPaneShown",e.KeyboardShortcutFired="DevTools.KeyboardShortcutFired",e.IssueCreated="DevTools.IssueCreated",e.IssuesPanelIssueExpanded="DevTools.IssuesPanelIssueExpanded",e.IssuesPanelOpenedFrom="DevTools.IssuesPanelOpenedFrom",e.IssuesPanelResourceOpened="DevTools.IssuesPanelResourceOpened",e.KeybindSetSettingChanged="DevTools.KeybindSetSettingChanged",e.ElementsSidebarTabShown="DevTools.Elements.SidebarTabShown",e.ExperimentEnabledAtLaunch="DevTools.ExperimentEnabledAtLaunch",e.ExperimentEnabled="DevTools.ExperimentEnabled",e.ExperimentDisabled="DevTools.ExperimentDisabled",e.DeveloperResourceLoaded="DevTools.DeveloperResourceLoaded",e.DeveloperResourceScheme="DevTools.DeveloperResourceScheme",e.LinearMemoryInspectorRevealedFrom="DevTools.LinearMemoryInspector.RevealedFrom",e.LinearMemoryInspectorTarget="DevTools.LinearMemoryInspector.Target",e.Language="DevTools.Language",e.SyncSetting="DevTools.SyncSetting",e.RecordingAssertion="DevTools.RecordingAssertion",e.RecordingCodeToggled="DevTools.RecordingCodeToggled",e.RecordingCopiedToClipboard="DevTools.RecordingCopiedToClipboard",e.RecordingEdited="DevTools.RecordingEdited",e.RecordingExported="DevTools.RecordingExported",e.RecordingReplayFinished="DevTools.RecordingReplayFinished",e.RecordingReplaySpeed="DevTools.RecordingReplaySpeed",e.RecordingReplayStarted="DevTools.RecordingReplayStarted",e.RecordingToggled="DevTools.RecordingToggled",e.SourcesSidebarTabShown="DevTools.Sources.SidebarTabShown",e.SourcesPanelFileDebugged="DevTools.SourcesPanelFileDebugged",e.SourcesPanelFileOpened="DevTools.SourcesPanelFileOpened",e.NetworkPanelResponsePreviewOpened="DevTools.NetworkPanelResponsePreviewOpened",e.StyleTextCopied="DevTools.StyleTextCopied",e.ManifestSectionSelected="DevTools.ManifestSectionSelected",e.CSSHintShown="DevTools.CSSHintShown",e.LighthouseModeRun="DevTools.LighthouseModeRun",e.ColorConvertedFrom="DevTools.ColorConvertedFrom",e.ColorPickerOpenedFrom="DevTools.ColorPickerOpenedFrom",e.CSSPropertyDocumentation="DevTools.CSSPropertyDocumentation",e.InlineScriptParsed="DevTools.InlineScriptParsed",e.VMInlineScriptTypeShown="DevTools.VMInlineScriptShown",e.BreakpointsRestoredFromStorageCount="DevTools.BreakpointsRestoredFromStorageCount",e.SwatchActivated="DevTools.SwatchActivated",e.BadgeActivated="DevTools.BadgeActivated"}(s||(s={}));var a=Object.freeze({__proto__:null,get Events(){return n},EventDescriptors:i,get EnumeratedHistogram(){return s}});const d={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"},l=o.i18n.registerUIStrings("core/host/ResourceLoader.ts",d),c=o.i18n.getLocalizedString.bind(void 0,l);let u=0;const m={},g=function(e,o){m[e].write(o)};let p=function(o,r,t,n){const i=new e.StringOutputStream.StringOutputStream;h(o,r,i,(function(e,o,r){t(e,o,i.data(),r)}),n)};function S(e,o,r){if(void 0===e||void 0===r)return null;if(0!==e){if(function(e){return e<=-300&&e>-400}(e))return c(d.httpErrorStatusCodeSS,{PH1:String(o),PH2:r});const t=function(e){return c(e>-100?d.systemError:e>-200?d.connectionError:e>-300?d.certificateError:e>-400?d.httpError:e>-500?d.cacheError:e>-600?d.signedExchangeError:e>-700?d.ftpError:e>-800?d.certificateManagerError:e>-900?d.dnsResolverError:d.unknownError)}(e);return`${t}: ${r}`}return null}const h=function(o,r,t,n,i){const s=function(e){return m[++u]=e,u}(t);if(new e.ParsedURL.ParsedURL(o).isDataURL())return void(e=>new Promise(((o,r)=>{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 r(new Error(String(t.status)));t.onreadystatechange=null,o(t.responseText)}},t.send(null)})))(o).then((function(e){g(s,e),l({statusCode:200})})).catch((function(e){l({statusCode:404,messageOverride:c(d.decodingDataUrlFailed)})}));if(!i&&function(e){try{const o=new URL(e);return"file:"===o.protocol&&""!==o.host}catch(e){return!1}}(o))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 a=[];if(r)for(const e in r)a.push(e+": "+r[e]);function l(e){if(n){const{success:o,description:r}=function(e){const{statusCode:o,netError:r,netErrorName:t,urlValid:n,messageOverride:i}=e;let s="";const a=o>=200&&o<300;if("string"==typeof i)s=i;else if(!a)if(void 0===r)s=c(!1===n?d.invalidUrl:d.unknownError);else{const e=S(r,o,t);e&&(s=e)}return console.assert(a===(0===s.length)),{success:a,description:{statusCode:o,netError:r,netErrorName:t,urlValid:n,message:s}}}(e);n(o,e.headers||{},r)}var o;m[o=s].close(),delete m[o]}f.loadNetworkResource(o,a.join("\r\n"),s,l)};var C=Object.freeze({__proto__:null,ResourceLoader:{},streamWrite:g,get load(){return p},setLoadForTest:function(e){p=e},netErrorToMessage:S,loadAsStream:h});const v={devtoolsS:"DevTools - {PH1}"},y=o.i18n.registerUIStrings("core/host/InspectorFrontendHost.ts",v),k=o.i18n.getLocalizedString.bind(void 0,y);class x{#e;events;#o=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",(o=>{e.call(this,o)}),!0)}platform(){const e=navigator.userAgent;return e.includes("Windows NT")?"windows":e.includes("Mac OS X")?"mac":"linux"}loadCompleted(){}bringToFront(){}closeWindow(){}setIsDocked(e,o){window.setTimeout(o,0)}showSurvey(e,o){window.setTimeout((()=>o({surveyShown:!1})),0)}canShowSurvey(e,o){window.setTimeout((()=>o({canShowSurvey:!1})),0)}setInspectedPageBounds(e){}inspectElementCompleted(){}setInjectedScriptForOrigin(e,o){}inspectedURLChanged(e){document.title=k(v.devtoolsS,{PH1:e.replace(/^https?:\/\//,"")})}copyText(e){null!=e&&navigator.clipboard.writeText(e)}openInNewTab(e){window.open(e,"_blank")}showItemInFolder(o){e.Console.Console.instance().error("Show item in folder is not enabled in hosted mode. Please inspect using chrome://inspect")}save(e,o,r){let t=this.#e.get(e);t||(t=[],this.#e.set(e,t)),t.push(o),this.events.dispatchEventToListeners(n.SavedURL,{url:e,fileSystemPath:e})}append(e,o){const r=this.#e.get(e);r&&(r.push(o),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(o){t=e}const n=document.createElement("a");n.download=t;const i=new Blob([o.join("")],{type:"text/plain"}),s=URL.createObjectURL(i);n.href=s,n.click(),URL.revokeObjectURL(s)}sendMessageToBackend(e){}recordCountHistogram(e,o,r,t,n){this.recordedCountHistograms.length>=100&&this.recordedCountHistograms.shift(),this.recordedCountHistograms.push({histogramName:e,sample:o,min:r,exclusiveMax:t,bucketSize:n})}recordEnumeratedHistogram(e,o,r){this.recordedEnumeratedHistograms.length>=100&&this.recordedEnumeratedHistograms.shift(),this.recordedEnumeratedHistograms.push({actionName:e,actionCode:o})}recordPerformanceHistogram(e,o){this.recordedPerformanceHistograms.length>=100&&this.recordedPerformanceHistograms.shift(),this.recordedPerformanceHistograms.push({histogramName:e,duration:o})}recordUserMetricsAction(e){}requestFileSystems(){this.events.dispatchEventToListeners(n.FileSystemsLoaded,[])}addFileSystem(e){window.webkitRequestFileSystem(window.TEMPORARY,1048576,(e=>{this.#o=e;const o={fileSystemName:"sandboxedRequestedFileSystem",fileSystemPath:"/overrides",rootURL:"filesystem:devtools://devtools/isolated/",type:"overrides"};this.events.dispatchEventToListeners(n.FileSystemAdded,{fileSystem:o})}))}removeFileSystem(e){const o=e=>{e.forEach((e=>{e.isDirectory?e.removeRecursively((()=>{})):e.isFile&&e.remove((()=>{}))}))};this.#o&&this.#o.root.createReader().readEntries(o),this.#o=null,this.events.dispatchEventToListeners(n.FileSystemRemoved,"/overrides")}isolatedFileSystem(e,o){return this.#o}loadNetworkResource(e,o,r,t){fetch(e).then((async e=>{const o=await e.arrayBuffer();let r=o;if(function(e){const o=new Uint8Array(e);return!(!o||o.length<3)&&31===o[0]&&139===o[1]&&8===o[2]}(o)){const e=new DecompressionStream("gzip"),t=e.writable.getWriter();t.write(o),t.close(),r=e.readable}return await new Response(r).text()})).then((function(e){g(r,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,o){}getPreferences(e){const o={};for(const e in window.localStorage)o[e]=window.localStorage[e];e(o)}getPreference(e,o){o(window.localStorage[e])}setPreference(e,o){window.localStorage[e]=o}removePreference(e){delete window.localStorage[e]}clearPreferences(){window.localStorage.clear()}getSyncInformation(e){e({isSyncActive:!1,arePreferencesSynced:!1})}upgradeDraggedFileSystemPermissions(e){}indexPath(e,o,r){}stopIndexing(e){}searchInPath(e,o,r){}zoomFactor(){return 1}zoomIn(){}zoomOut(){}resetZoom(){}setWhitelistedShortcuts(e){}setEyeDropperActive(e){}showCertificateViewer(e){}reattach(e){}readyForTest(){}connectionReady(){}setOpenNewWindowForPopups(e){}setDevicesDiscoveryConfig(e){}setDevicesUpdatesEnabled(e){}performActionOnRemotePage(e,o){}openRemotePage(e,o){}openNodeFrontend(){}showContextMenuAtPoint(e,o,r,t){throw"Soft context menu should be used"}isHostedMode(){return!0}setAddExtensionCallback(e){}async initialTargetId(){return null}}let f=globalThis.InspectorFrontendHost;class I{constructor(){for(const e of i)this[e[1]]=this.dispatch.bind(this,e[0],e[2],e[3])}dispatch(e,o,r,...t){if(o.length<2){try{f.events.dispatchEventToListeners(e,t[0])}catch(e){console.error(e+" "+e.stack)}return}const n={};for(let e=0;e=2||f.recordEnumeratedHistogram(s.BreakpointWithConditionAdded,e,2)}breakpointEditDialogRevealedFrom(e){e>=7||f.recordEnumeratedHistogram(s.BreakpointEditDialogRevealedFrom,e,7)}panelShown(e){const o=D[e]||0;f.recordEnumeratedHistogram(s.PanelShown,o,D.MaxValue),f.recordUserMetricsAction("DevTools_PanelShown_"+e),this.#r=!0}panelClosed(e){const o=D[e]||0;f.recordEnumeratedHistogram(s.PanelClosed,o,D.MaxValue),this.#r=!0}elementsSidebarTabShown(e){const o=L[e]||0;f.recordEnumeratedHistogram(s.ElementsSidebarTabShown,o,L.MaxValue)}sourcesSidebarTabShown(e){const o=A[e]||0;f.recordEnumeratedHistogram(s.SourcesSidebarTabShown,o,A.MaxValue)}settingsPanelShown(e){this.panelShown("settings-"+e)}sourcesPanelFileDebugged(e){const o=e&&V[e]||V.Unknown;f.recordEnumeratedHistogram(s.SourcesPanelFileDebugged,o,V.MaxValue)}sourcesPanelFileOpened(e){const o=e&&V[e]||V.Unknown;f.recordEnumeratedHistogram(s.SourcesPanelFileOpened,o,V.MaxValue)}networkPanelResponsePreviewOpened(e){const o=e&&V[e]||V.Unknown;f.recordEnumeratedHistogram(s.NetworkPanelResponsePreviewOpened,o,V.MaxValue)}actionTaken(e){f.recordEnumeratedHistogram(s.ActionTaken,e,F.MaxValue)}panelLoaded(e,o){this.#t||e!==this.#n||(this.#t=!0,requestAnimationFrame((()=>{window.setTimeout((()=>{performance.mark(o),this.#r||f.recordPerformanceHistogram(o,performance.now())}),0)})))}setLaunchPanel(e){this.#n=e}keybindSetSettingChanged(e){const o=O[e]||0;f.recordEnumeratedHistogram(s.KeybindSetSettingChanged,o,O.MaxValue)}keyboardShortcutFired(e){const o=H[e]||H.OtherShortcut;f.recordEnumeratedHistogram(s.KeyboardShortcutFired,o,H.MaxValue)}issuesPanelOpenedFrom(e){f.recordEnumeratedHistogram(s.IssuesPanelOpenedFrom,e,N.MaxValue)}issuesPanelIssueExpanded(e){if(void 0===e)return;const o=_[e];void 0!==o&&f.recordEnumeratedHistogram(s.IssuesPanelIssueExpanded,o,_.MaxValue)}issuesPanelResourceOpened(e,o){const r=U[e+o];void 0!==r&&f.recordEnumeratedHistogram(s.IssuesPanelResourceOpened,r,U.MaxValue)}issueCreated(e){const o=B[e];void 0!==o&&f.recordEnumeratedHistogram(s.IssueCreated,o,B.MaxValue)}experimentEnabledAtLaunch(e){const o=W[e];void 0!==o&&f.recordEnumeratedHistogram(s.ExperimentEnabledAtLaunch,o,W.MaxValue)}experimentChanged(e,o){const r=W[e];if(void 0===r)return;const t=o?s.ExperimentEnabled:s.ExperimentDisabled;f.recordEnumeratedHistogram(t,r,W.MaxValue)}developerResourceLoaded(e){e>=j.MaxValue||f.recordEnumeratedHistogram(s.DeveloperResourceLoaded,e,j.MaxValue)}developerResourceScheme(e){e>=G.MaxValue||f.recordEnumeratedHistogram(s.DeveloperResourceScheme,e,G.MaxValue)}inlineScriptParsed(e){e>=2||f.recordEnumeratedHistogram(s.InlineScriptParsed,e,2)}vmInlineScriptContentShown(e){e>=2||f.recordEnumeratedHistogram(s.VMInlineScriptTypeShown,e,2)}linearMemoryInspectorRevealedFrom(e){e>=z.MaxValue||f.recordEnumeratedHistogram(s.LinearMemoryInspectorRevealedFrom,e,z.MaxValue)}linearMemoryInspectorTarget(e){e>=q.MaxValue||f.recordEnumeratedHistogram(s.LinearMemoryInspectorTarget,e,q.MaxValue)}language(e){const o=J[e];void 0!==o&&f.recordEnumeratedHistogram(s.Language,o,J.MaxValue)}syncSetting(e){f.getSyncInformation((o=>{let r=K.ChromeSyncDisabled;o.isSyncActive&&!o.arePreferencesSynced?r=K.ChromeSyncSettingsDisabled:o.isSyncActive&&o.arePreferencesSynced&&(r=e?K.DevToolsSyncSettingEnabled:K.DevToolsSyncSettingDisabled),f.recordEnumeratedHistogram(s.SyncSetting,r,K.MaxValue)}))}recordingAssertion(e){f.recordEnumeratedHistogram(s.RecordingAssertion,e,X.MaxValue)}recordingToggled(e){f.recordEnumeratedHistogram(s.RecordingToggled,e,Q.MaxValue)}recordingReplayFinished(e){f.recordEnumeratedHistogram(s.RecordingReplayFinished,e,Z.MaxValue)}recordingReplaySpeed(e){f.recordEnumeratedHistogram(s.RecordingReplaySpeed,e,$.MaxValue)}recordingReplayStarted(e){f.recordEnumeratedHistogram(s.RecordingReplayStarted,e,Y.MaxValue)}recordingEdited(e){f.recordEnumeratedHistogram(s.RecordingEdited,e,ee.MaxValue)}recordingExported(e){f.recordEnumeratedHistogram(s.RecordingExported,e,oe.MaxValue)}recordingCodeToggled(e){f.recordEnumeratedHistogram(s.RecordingCodeToggled,e,re.MaxValue)}recordingCopiedToClipboard(e){f.recordEnumeratedHistogram(s.RecordingCopiedToClipboard,e,te.MaxValue)}styleTextCopied(e){f.recordEnumeratedHistogram(s.StyleTextCopied,e,ie.MaxValue)}manifestSectionSelected(e){const o=se[e]||se.OtherSection;f.recordEnumeratedHistogram(s.ManifestSectionSelected,o,se.MaxValue)}cssHintShown(e){f.recordEnumeratedHistogram(s.CSSHintShown,e,ae.MaxValue)}lighthouseModeRun(e){f.recordEnumeratedHistogram(s.LighthouseModeRun,e,de.MaxValue)}colorConvertedFrom(e){f.recordEnumeratedHistogram(s.ColorConvertedFrom,e,2)}colorPickerOpenedFrom(e){f.recordEnumeratedHistogram(s.ColorPickerOpenedFrom,e,2)}cssPropertyDocumentation(e){f.recordEnumeratedHistogram(s.CSSPropertyDocumentation,e,3)}swatchActivated(e){f.recordEnumeratedHistogram(s.SwatchActivated,e,10)}badgeActivated(e){f.recordEnumeratedHistogram(s.BadgeActivated,e,9)}breakpointsRestoredFromStorage(e){const o=this.#i(e);f.recordEnumeratedHistogram(s.BreakpointsRestoredFromStorageCount,o,10)}#i(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){f.recordPerformanceHistogram("DevTools.Workspaces.PopulateWallClocktime",e)}workspacesNumberOfFiles(e,o){f.recordCountHistogram("DevTools.Workspaces.NumberOfFilesLoaded",e,0,1e5,100),f.recordCountHistogram("DevTools.Workspaces.NumberOfDirectoriesTraversed",o,0,1e4,100)}}!function(e){e[e.WindowDocked=1]="WindowDocked",e[e.WindowUndocked=2]="WindowUndocked",e[e.ScriptsBreakpointSet=3]="ScriptsBreakpointSet",e[e.TimelineStarted=4]="TimelineStarted",e[e.ProfilesCPUProfileTaken=5]="ProfilesCPUProfileTaken",e[e.ProfilesHeapProfileTaken=6]="ProfilesHeapProfileTaken",e[e.ConsoleEvaluated=8]="ConsoleEvaluated",e[e.FileSavedInWorkspace=9]="FileSavedInWorkspace",e[e.DeviceModeEnabled=10]="DeviceModeEnabled",e[e.AnimationsPlaybackRateChanged=11]="AnimationsPlaybackRateChanged",e[e.RevisionApplied=12]="RevisionApplied",e[e.FileSystemDirectoryContentReceived=13]="FileSystemDirectoryContentReceived",e[e.StyleRuleEdited=14]="StyleRuleEdited",e[e.CommandEvaluatedInConsolePanel=15]="CommandEvaluatedInConsolePanel",e[e.DOMPropertiesExpanded=16]="DOMPropertiesExpanded",e[e.ResizedViewInResponsiveMode=17]="ResizedViewInResponsiveMode",e[e.TimelinePageReloadStarted=18]="TimelinePageReloadStarted",e[e.ConnectToNodeJSFromFrontend=19]="ConnectToNodeJSFromFrontend",e[e.ConnectToNodeJSDirectly=20]="ConnectToNodeJSDirectly",e[e.CpuThrottlingEnabled=21]="CpuThrottlingEnabled",e[e.CpuProfileNodeFocused=22]="CpuProfileNodeFocused",e[e.CpuProfileNodeExcluded=23]="CpuProfileNodeExcluded",e[e.SelectFileFromFilePicker=24]="SelectFileFromFilePicker",e[e.SelectCommandFromCommandMenu=25]="SelectCommandFromCommandMenu",e[e.ChangeInspectedNodeInElementsPanel=26]="ChangeInspectedNodeInElementsPanel",e[e.StyleRuleCopied=27]="StyleRuleCopied",e[e.CoverageStarted=28]="CoverageStarted",e[e.LighthouseStarted=29]="LighthouseStarted",e[e.LighthouseFinished=30]="LighthouseFinished",e[e.ShowedThirdPartyBadges=31]="ShowedThirdPartyBadges",e[e.LighthouseViewTrace=32]="LighthouseViewTrace",e[e.FilmStripStartedRecording=33]="FilmStripStartedRecording",e[e.CoverageReportFiltered=34]="CoverageReportFiltered",e[e.CoverageStartedPerBlock=35]="CoverageStartedPerBlock",e[e["SettingsOpenedFromGear-deprecated"]=36]="SettingsOpenedFromGear-deprecated",e[e["SettingsOpenedFromMenu-deprecated"]=37]="SettingsOpenedFromMenu-deprecated",e[e["SettingsOpenedFromCommandMenu-deprecated"]=38]="SettingsOpenedFromCommandMenu-deprecated",e[e.TabMovedToDrawer=39]="TabMovedToDrawer",e[e.TabMovedToMainPanel=40]="TabMovedToMainPanel",e[e.CaptureCssOverviewClicked=41]="CaptureCssOverviewClicked",e[e.VirtualAuthenticatorEnvironmentEnabled=42]="VirtualAuthenticatorEnvironmentEnabled",e[e.SourceOrderViewActivated=43]="SourceOrderViewActivated",e[e.UserShortcutAdded=44]="UserShortcutAdded",e[e.ShortcutRemoved=45]="ShortcutRemoved",e[e.ShortcutModified=46]="ShortcutModified",e[e.CustomPropertyLinkClicked=47]="CustomPropertyLinkClicked",e[e.CustomPropertyEdited=48]="CustomPropertyEdited",e[e.ServiceWorkerNetworkRequestClicked=49]="ServiceWorkerNetworkRequestClicked",e[e.ServiceWorkerNetworkRequestClosedQuickly=50]="ServiceWorkerNetworkRequestClosedQuickly",e[e.NetworkPanelServiceWorkerRespondWith=51]="NetworkPanelServiceWorkerRespondWith",e[e.NetworkPanelCopyValue=52]="NetworkPanelCopyValue",e[e.ConsoleSidebarOpened=53]="ConsoleSidebarOpened",e[e.PerfPanelTraceImported=54]="PerfPanelTraceImported",e[e.PerfPanelTraceExported=55]="PerfPanelTraceExported",e[e.StackFrameRestarted=56]="StackFrameRestarted",e[e.CaptureTestProtocolClicked=57]="CaptureTestProtocolClicked",e[e.BreakpointRemovedFromRemoveButton=58]="BreakpointRemovedFromRemoveButton",e[e.BreakpointGroupExpandedStateChanged=59]="BreakpointGroupExpandedStateChanged",e[e.HeaderOverrideFileCreated=60]="HeaderOverrideFileCreated",e[e.HeaderOverrideEnableEditingClicked=61]="HeaderOverrideEnableEditingClicked",e[e.HeaderOverrideHeaderAdded=62]="HeaderOverrideHeaderAdded",e[e.HeaderOverrideHeaderEdited=63]="HeaderOverrideHeaderEdited",e[e.HeaderOverrideHeaderRemoved=64]="HeaderOverrideHeaderRemoved",e[e.HeaderOverrideHeadersFileEdited=65]="HeaderOverrideHeadersFileEdited",e[e.PersistenceNetworkOverridesEnabled=66]="PersistenceNetworkOverridesEnabled",e[e.PersistenceNetworkOverridesDisabled=67]="PersistenceNetworkOverridesDisabled",e[e.BreakpointRemovedFromContextMenu=68]="BreakpointRemovedFromContextMenu",e[e.BreakpointsInFileRemovedFromRemoveButton=69]="BreakpointsInFileRemovedFromRemoveButton",e[e.BreakpointsInFileRemovedFromContextMenu=70]="BreakpointsInFileRemovedFromContextMenu",e[e.BreakpointsInFileCheckboxToggled=71]="BreakpointsInFileCheckboxToggled",e[e.BreakpointsInFileEnabledDisabledFromContextMenu=72]="BreakpointsInFileEnabledDisabledFromContextMenu",e[e.BreakpointConditionEditedFromSidebar=73]="BreakpointConditionEditedFromSidebar",e[e.AddFileSystemToWorkspace=74]="AddFileSystemToWorkspace",e[e.RemoveFileSystemFromWorkspace=75]="RemoveFileSystemFromWorkspace",e[e.AddFileSystemForOverrides=76]="AddFileSystemForOverrides",e[e.RemoveFileSystemForOverrides=77]="RemoveFileSystemForOverrides",e[e.FileSystemSourceSelected=78]="FileSystemSourceSelected",e[e.OverridesSourceSelected=79]="OverridesSourceSelected",e[e.StyleSheetInitiatorLinkClicked=80]="StyleSheetInitiatorLinkClicked",e[e.MaxValue=81]="MaxValue"}(F||(F={})),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_backgroundFetch=46]="background_service_backgroundFetch",e[e.background_service_backgroundSync=47]="background_service_backgroundSync",e[e.background_service_pushMessaging=48]="background_service_pushMessaging",e[e.background_service_notifications=49]="background_service_notifications",e[e.background_service_paymentHandler=50]="background_service_paymentHandler",e[e.background_service_periodicBackgroundSync=51]="background_service_periodicBackgroundSync",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.MaxValue=66]="MaxValue"}(D||(D={})),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.eventListeners"]=4]="elements.eventListeners",e[e["elements.domBreakpoints"]=5]="elements.domBreakpoints",e[e["elements.domProperties"]=6]="elements.domProperties",e[e["accessibility.view"]=7]="accessibility.view",e[e.MaxValue=8]="MaxValue"}(L||(L={})),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-contentScripts"]=4]="navigator-contentScripts",e[e["navigator-snippets"]=5]="navigator-snippets",e[e.MaxValue=6]="MaxValue"}(A||(A={})),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"}(V||(V={})),function(e){e[e.devToolsDefault=0]="devToolsDefault",e[e.vsCode=1]="vsCode",e[e.MaxValue=2]="MaxValue"}(O||(O={})),function(e){e[e.OtherShortcut=0]="OtherShortcut",e[e["commandMenu.show"]=1]="commandMenu.show",e[e["console.clear"]=2]="console.clear",e[e["console.show"]=3]="console.show",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["quickOpen.show"]=21]="quickOpen.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.MaxValue=112]="MaxValue"}(H||(H={})),function(e){e[e.ConsoleInfoBar=0]="ConsoleInfoBar",e[e.LearnMoreLinkCOEP=1]="LearnMoreLinkCOEP",e[e.StatusBarIssuesCounter=2]="StatusBarIssuesCounter",e[e.HamburgerMenu=3]="HamburgerMenu",e[e.Adorner=4]="Adorner",e[e.CommandMenu=5]="CommandMenu",e[e.MaxValue=6]="MaxValue"}(N||(N={})),function(e){e[e.applyCustomStylesheet=0]="applyCustomStylesheet",e[e.captureNodeCreationStacks=1]="captureNodeCreationStacks",e[e.sourcesPrettyPrint=2]="sourcesPrettyPrint",e[e.liveHeapProfile=11]="liveHeapProfile",e[e.protocolMonitor=13]="protocolMonitor",e[e.developerResourcesView=15]="developerResourcesView",e[e.samplingHeapProfilerTimeline=17]="samplingHeapProfilerTimeline",e[e.showOptionToExposeInternalsInHeapSnapshot=18]="showOptionToExposeInternalsInHeapSnapshot",e[e.sourceOrderViewer=20]="sourceOrderViewer",e[e.webauthnPane=22]="webauthnPane",e[e.timelineEventInitiators=24]="timelineEventInitiators",e[e.timelineInvalidationTracking=26]="timelineInvalidationTracking",e[e.timelineShowAllEvents=27]="timelineShowAllEvents",e[e.timelineV8RuntimeCallStats=28]="timelineV8RuntimeCallStats",e[e.wasmDWARFDebugging=31]="wasmDWARFDebugging",e[e.dualScreenSupport=32]="dualScreenSupport",e[e.keyboardShortcutEditor=35]="keyboardShortcutEditor",e[e.APCA=39]="APCA",e[e.cspViolationsView=40]="cspViolationsView",e[e.fontEditor=41]="fontEditor",e[e.fullAccessibilityTree=42]="fullAccessibilityTree",e[e.ignoreListJSFramesOnTimeline=43]="ignoreListJSFramesOnTimeline",e[e.contrastIssues=44]="contrastIssues",e[e.experimentalCookieFeatures=45]="experimentalCookieFeatures",e[e.cssTypeComponentLength=52]="cssTypeComponentLength",e[e.preciseChanges=53]="preciseChanges",e[e.bfcacheDisplayTree=54]="bfcacheDisplayTree",e[e.stylesPaneCSSChanges=55]="stylesPaneCSSChanges",e[e.headerOverrides=56]="headerOverrides",e[e.evaluateExpressionsWithSourceMaps=58]="evaluateExpressionsWithSourceMaps",e[e.eyedropperColorPicker=60]="eyedropperColorPicker",e[e.instrumentationBreakpoints=61]="instrumentationBreakpoints",e[e.authoredDeployedGrouping=63]="authoredDeployedGrouping",e[e.importantDOMProperties=64]="importantDOMProperties",e[e.justMyCode=65]="justMyCode",e[e.timelineAsConsoleProfileResultPanel=67]="timelineAsConsoleProfileResultPanel",e[e.preloadingStatusPanel=68]="preloadingStatusPanel",e[e.disableColorFormatSetting=69]="disableColorFormatSetting",e[e.outermostTargetSelector=71]="outermostTargetSelector",e[e.jsProfilerTemporarilyEnable=72]="jsProfilerTemporarilyEnable",e[e.highlightErrorsElementsPanel=73]="highlightErrorsElementsPanel",e[e.setAllBreakpointsEagerly=74]="setAllBreakpointsEagerly",e[e.MaxValue=75]="MaxValue"}(W||(W={})),function(e){e[e.CrossOriginEmbedderPolicy=0]="CrossOriginEmbedderPolicy",e[e.MixedContent=1]="MixedContent",e[e.Cookie=2]="Cookie",e[e.HeavyAd=3]="HeavyAd",e[e.ContentSecurityPolicy=4]="ContentSecurityPolicy",e[e.Other=5]="Other",e[e.Generic=6]="Generic",e[e.MaxValue=7]="MaxValue"}(_||(_={})),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.CrossOriginEmbedderPolicyLearnMore=8]="CrossOriginEmbedderPolicyLearnMore",e[e.MixedContentLearnMore=9]="MixedContentLearnMore",e[e.SameSiteCookieLearnMore=10]="SameSiteCookieLearnMore",e[e.HeavyAdLearnMore=11]="HeavyAdLearnMore",e[e.ContentSecurityPolicyLearnMore=12]="ContentSecurityPolicyLearnMore",e[e.MaxValue=13]="MaxValue"}(U||(U={})),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.MaxValue=78]="MaxValue"}(B||(B={})),function(e){e[e.LoadThroughPageViaTarget=0]="LoadThroughPageViaTarget",e[e.LoadThroughPageViaFrame=1]="LoadThroughPageViaFrame",e[e.LoadThroughPageFailure=2]="LoadThroughPageFailure",e[e.LoadThroughPageFallback=3]="LoadThroughPageFallback",e[e.FallbackAfterFailure=4]="FallbackAfterFailure",e[e.FallbackPerOverride=5]="FallbackPerOverride",e[e.FallbackPerProtocol=6]="FallbackPerProtocol",e[e.FallbackFailure=7]="FallbackFailure",e[e.MaxValue=8]="MaxValue"}(j||(j={})),function(e){e[e.SchemeOther=0]="SchemeOther",e[e.SchemeUnknown=1]="SchemeUnknown",e[e.SchemeHttp=2]="SchemeHttp",e[e.SchemeHttps=3]="SchemeHttps",e[e.SchemeHttpLocalhost=4]="SchemeHttpLocalhost",e[e.SchemeHttpsLocalhost=5]="SchemeHttpsLocalhost",e[e.SchemeData=6]="SchemeData",e[e.SchemeFile=7]="SchemeFile",e[e.SchemeBlob=8]="SchemeBlob",e[e.MaxValue=9]="MaxValue"}(G||(G={})),function(e){e[e.ContextMenu=0]="ContextMenu",e[e.MemoryIcon=1]="MemoryIcon",e[e.MaxValue=2]="MaxValue"}(z||(z={})),function(e){e[e.DWARFInspectableAddress=0]="DWARFInspectableAddress",e[e.ArrayBuffer=1]="ArrayBuffer",e[e.DataView=2]="DataView",e[e.TypedArray=3]="TypedArray",e[e.WebAssemblyMemory=4]="WebAssemblyMemory",e[e.MaxValue=5]="MaxValue"}(q||(q={})),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"}(J||(J={})),function(e){e[e.ChromeSyncDisabled=1]="ChromeSyncDisabled",e[e.ChromeSyncSettingsDisabled=2]="ChromeSyncSettingsDisabled",e[e.DevToolsSyncSettingDisabled=3]="DevToolsSyncSettingDisabled",e[e.DevToolsSyncSettingEnabled=4]="DevToolsSyncSettingEnabled",e[e.MaxValue=5]="MaxValue"}(K||(K={})),function(e){e[e.RecordingStarted=1]="RecordingStarted",e[e.RecordingFinished=2]="RecordingFinished",e[e.MaxValue=3]="MaxValue"}(Q||(Q={})),function(e){e[e.AssertionAdded=1]="AssertionAdded",e[e.PropertyAssertionEdited=2]="PropertyAssertionEdited",e[e.AttributeAssertionEdited=3]="AttributeAssertionEdited",e[e.MaxValue=4]="MaxValue"}(X||(X={})),function(e){e[e.Success=1]="Success",e[e.TimeoutErrorSelectors=2]="TimeoutErrorSelectors",e[e.TimeoutErrorTarget=3]="TimeoutErrorTarget",e[e.OtherError=4]="OtherError",e[e.MaxValue=5]="MaxValue"}(Z||(Z={})),function(e){e[e.Normal=1]="Normal",e[e.Slow=2]="Slow",e[e.VerySlow=3]="VerySlow",e[e.ExtremelySlow=4]="ExtremelySlow",e[e.MaxValue=5]="MaxValue"}($||($={})),function(e){e[e.ReplayOnly=1]="ReplayOnly",e[e.ReplayWithPerformanceTracing=2]="ReplayWithPerformanceTracing",e[e.ReplayViaExtension=3]="ReplayViaExtension",e[e.MaxValue=4]="MaxValue"}(Y||(Y={})),function(e){e[e.SelectorPickerUsed=1]="SelectorPickerUsed",e[e.StepAdded=2]="StepAdded",e[e.StepRemoved=3]="StepRemoved",e[e.SelectorAdded=4]="SelectorAdded",e[e.SelectorRemoved=5]="SelectorRemoved",e[e.SelectorPartAdded=6]="SelectorPartAdded",e[e.SelectorPartEdited=7]="SelectorPartEdited",e[e.SelectorPartRemoved=8]="SelectorPartRemoved",e[e.TypeChanged=9]="TypeChanged",e[e.OtherEditing=10]="OtherEditing",e[e.MaxValue=11]="MaxValue"}(ee||(ee={})),function(e){e[e.ToPuppeteer=1]="ToPuppeteer",e[e.ToJSON=2]="ToJSON",e[e.ToPuppeteerReplay=3]="ToPuppeteerReplay",e[e.ToExtension=4]="ToExtension",e[e.ToLighthouse=5]="ToLighthouse",e[e.MaxValue=6]="MaxValue"}(oe||(oe={})),function(e){e[e.CodeShown=1]="CodeShown",e[e.CodeHidden=2]="CodeHidden",e[e.MaxValue=3]="MaxValue"}(re||(re={})),function(e){e[e.CopiedRecordingWithPuppeteer=1]="CopiedRecordingWithPuppeteer",e[e.CopiedRecordingWithJSON=2]="CopiedRecordingWithJSON",e[e.CopiedRecordingWithReplay=3]="CopiedRecordingWithReplay",e[e.CopiedRecordingWithExtension=4]="CopiedRecordingWithExtension",e[e.CopiedStepWithPuppeteer=5]="CopiedStepWithPuppeteer",e[e.CopiedStepWithJSON=6]="CopiedStepWithJSON",e[e.CopiedStepWithReplay=7]="CopiedStepWithReplay",e[e.CopiedStepWithExtension=8]="CopiedStepWithExtension",e[e.MaxValue=9]="MaxValue"}(te||(te={})),function(e){e[e.false=0]="false",e[e.true=1]="true",e[e.MaxValue=2]="MaxValue"}(ne||(ne={})),function(e){e[e.DeclarationViaChangedLine=1]="DeclarationViaChangedLine",e[e.AllChangesViaStylesPane=2]="AllChangesViaStylesPane",e[e.DeclarationViaContextMenu=3]="DeclarationViaContextMenu",e[e.PropertyViaContextMenu=4]="PropertyViaContextMenu",e[e.ValueViaContextMenu=5]="ValueViaContextMenu",e[e.DeclarationAsJSViaContextMenu=6]="DeclarationAsJSViaContextMenu",e[e.RuleViaContextMenu=7]="RuleViaContextMenu",e[e.AllDeclarationsViaContextMenu=8]="AllDeclarationsViaContextMenu",e[e.AllDeclarationsAsJSViaContextMenu=9]="AllDeclarationsAsJSViaContextMenu",e[e.SelectorViaContextMenu=10]="SelectorViaContextMenu",e[e.MaxValue=11]="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"}(se||(se={})),function(e){e[e.Other=0]="Other",e[e.AlignContent=1]="AlignContent",e[e.FlexItem=2]="FlexItem",e[e.FlexContainer=3]="FlexContainer",e[e.GridContainer=4]="GridContainer",e[e.GridItem=5]="GridItem",e[e.FlexGrid=6]="FlexGrid",e[e.MulticolFlexGrid=7]="MulticolFlexGrid",e[e.Padding=8]="Padding",e[e.Position=9]="Position",e[e.ZIndex=10]="ZIndex",e[e.Sizing=11]="Sizing",e[e.FlexOrGridItem=12]="FlexOrGridItem",e[e.FontVariationSettings=13]="FontVariationSettings",e[e.MaxValue=14]="MaxValue"}(ae||(ae={})),function(e){e[e.Navigation=0]="Navigation",e[e.Timespan=1]="Timespan",e[e.Snapshot=2]="Snapshot",e[e.LegacyNavigation=3]="LegacyNavigation",e[e.MaxValue=4]="MaxValue"}(de||(de={}));var ue=Object.freeze({__proto__:null,UserMetrics:ce,get Action(){return F},get PanelCodes(){return D},get ElementsSidebarTabCodes(){return L},get SourcesSidebarTabCodes(){return A},get MediaTypes(){return V},get KeybindSetSettings(){return O},get KeyboardShortcutAction(){return H},get IssueOpener(){return N},get DevtoolsExperiments(){return W},get IssueExpanded(){return _},get IssueResourceOpened(){return U},get IssueCreated(){return B},get DeveloperResourceLoaded(){return j},get DeveloperResourceScheme(){return G},get LinearMemoryInspectorRevealedFrom(){return z},get LinearMemoryInspectorTarget(){return q},get Language(){return J},get SyncSetting(){return K},get RecordingToggled(){return Q},get RecordingAssertion(){return X},get RecordingReplayFinished(){return Z},get RecordingReplaySpeed(){return $},get RecordingReplayStarted(){return Y},get RecordingEdited(){return ee},get RecordingExported(){return oe},get RecordingCodeToggled(){return re},get RecordingCopiedToClipboard(){return te},get ConsoleShowsCorsErrors(){return ne},get StyleTextCopied(){return ie},get ManifestSectionCodes(){return se},get CSSHintType(){return ae},get LighthouseModeRun(){return de}});const me=new ce;export{w as InspectorFrontendHost,a as InspectorFrontendHostAPI,le as Platform,C as ResourceLoader,ue as UserMetrics,me as userMetrics}; +import*as e from"../common/common.js";import*as o from"../i18n/i18n.js";import*as r from"../platform/platform.js";import*as t from"../root/root.js";var n;!function(e){e.AppendedToURL="appendedToURL",e.CanceledSaveURL="canceledSaveURL",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 i=[[n.AppendedToURL,"appendedToURL",["url"]],[n.CanceledSaveURL,"canceledSaveURL",["url"]],[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 s;!function(e){e.ActionTaken="DevTools.ActionTaken",e.BreakpointWithConditionAdded="DevTools.BreakpointWithConditionAdded",e.BreakpointEditDialogRevealedFrom="DevTools.BreakpointEditDialogRevealedFrom",e.PanelClosed="DevTools.PanelClosed",e.PanelShown="DevTools.PanelShown",e.SidebarPaneShown="DevTools.SidebarPaneShown",e.KeyboardShortcutFired="DevTools.KeyboardShortcutFired",e.IssueCreated="DevTools.IssueCreated",e.IssuesPanelIssueExpanded="DevTools.IssuesPanelIssueExpanded",e.IssuesPanelOpenedFrom="DevTools.IssuesPanelOpenedFrom",e.IssuesPanelResourceOpened="DevTools.IssuesPanelResourceOpened",e.KeybindSetSettingChanged="DevTools.KeybindSetSettingChanged",e.ElementsSidebarTabShown="DevTools.Elements.SidebarTabShown",e.ExperimentEnabledAtLaunch="DevTools.ExperimentEnabledAtLaunch",e.ExperimentEnabled="DevTools.ExperimentEnabled",e.ExperimentDisabled="DevTools.ExperimentDisabled",e.DeveloperResourceLoaded="DevTools.DeveloperResourceLoaded",e.DeveloperResourceScheme="DevTools.DeveloperResourceScheme",e.LinearMemoryInspectorRevealedFrom="DevTools.LinearMemoryInspector.RevealedFrom",e.LinearMemoryInspectorTarget="DevTools.LinearMemoryInspector.Target",e.Language="DevTools.Language",e.SyncSetting="DevTools.SyncSetting",e.RecordingAssertion="DevTools.RecordingAssertion",e.RecordingCodeToggled="DevTools.RecordingCodeToggled",e.RecordingCopiedToClipboard="DevTools.RecordingCopiedToClipboard",e.RecordingEdited="DevTools.RecordingEdited",e.RecordingExported="DevTools.RecordingExported",e.RecordingReplayFinished="DevTools.RecordingReplayFinished",e.RecordingReplaySpeed="DevTools.RecordingReplaySpeed",e.RecordingReplayStarted="DevTools.RecordingReplayStarted",e.RecordingToggled="DevTools.RecordingToggled",e.SourcesSidebarTabShown="DevTools.Sources.SidebarTabShown",e.SourcesPanelFileDebugged="DevTools.SourcesPanelFileDebugged",e.SourcesPanelFileOpened="DevTools.SourcesPanelFileOpened",e.NetworkPanelResponsePreviewOpened="DevTools.NetworkPanelResponsePreviewOpened",e.StyleTextCopied="DevTools.StyleTextCopied",e.ManifestSectionSelected="DevTools.ManifestSectionSelected",e.CSSHintShown="DevTools.CSSHintShown",e.LighthouseModeRun="DevTools.LighthouseModeRun",e.ColorConvertedFrom="DevTools.ColorConvertedFrom",e.ColorPickerOpenedFrom="DevTools.ColorPickerOpenedFrom",e.CSSPropertyDocumentation="DevTools.CSSPropertyDocumentation",e.InlineScriptParsed="DevTools.InlineScriptParsed",e.VMInlineScriptTypeShown="DevTools.VMInlineScriptShown",e.BreakpointsRestoredFromStorageCount="DevTools.BreakpointsRestoredFromStorageCount",e.SwatchActivated="DevTools.SwatchActivated",e.BadgeActivated="DevTools.BadgeActivated"}(s||(s={}));var a=Object.freeze({__proto__:null,get Events(){return n},EventDescriptors:i,get EnumeratedHistogram(){return s}});const d={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"},l=o.i18n.registerUIStrings("core/host/ResourceLoader.ts",d),c=o.i18n.getLocalizedString.bind(void 0,l);let u=0;const m={},g=function(e,o){m[e].write(o)};let p=function(o,r,t,n){const i=new e.StringOutputStream.StringOutputStream;h(o,r,i,(function(e,o,r){t(e,o,i.data(),r)}),n)};function S(e,o,r){if(void 0===e||void 0===r)return null;if(0!==e){if(function(e){return e<=-300&&e>-400}(e))return c(d.httpErrorStatusCodeSS,{PH1:String(o),PH2:r});const t=function(e){return c(e>-100?d.systemError:e>-200?d.connectionError:e>-300?d.certificateError:e>-400?d.httpError:e>-500?d.cacheError:e>-600?d.signedExchangeError:e>-700?d.ftpError:e>-800?d.certificateManagerError:e>-900?d.dnsResolverError:d.unknownError)}(e);return`${t}: ${r}`}return null}const h=function(o,r,t,n,i){const s=function(e){return m[++u]=e,u}(t);if(new e.ParsedURL.ParsedURL(o).isDataURL())return void(e=>new Promise(((o,r)=>{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 r(new Error(String(t.status)));t.onreadystatechange=null,o(t.responseText)}},t.send(null)})))(o).then((function(e){g(s,e),l({statusCode:200})})).catch((function(e){l({statusCode:404,messageOverride:c(d.decodingDataUrlFailed)})}));if(!i&&function(e){try{const o=new URL(e);return"file:"===o.protocol&&""!==o.host}catch(e){return!1}}(o))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 a=[];if(r)for(const e in r)a.push(e+": "+r[e]);function l(e){if(n){const{success:o,description:r}=function(e){const{statusCode:o,netError:r,netErrorName:t,urlValid:n,messageOverride:i}=e;let s="";const a=o>=200&&o<300;if("string"==typeof i)s=i;else if(!a)if(void 0===r)s=c(!1===n?d.invalidUrl:d.unknownError);else{const e=S(r,o,t);e&&(s=e)}return console.assert(a===(0===s.length)),{success:a,description:{statusCode:o,netError:r,netErrorName:t,urlValid:n,message:s}}}(e);n(o,e.headers||{},r)}var o;m[o=s].close(),delete m[o]}f.loadNetworkResource(o,a.join("\r\n"),s,l)};var C=Object.freeze({__proto__:null,ResourceLoader:{},streamWrite:g,get load(){return p},setLoadForTest:function(e){p=e},netErrorToMessage:S,loadAsStream:h});const v={devtoolsS:"DevTools - {PH1}"},y=o.i18n.registerUIStrings("core/host/InspectorFrontendHost.ts",v),k=o.i18n.getLocalizedString.bind(void 0,y);class x{#e;events;#o=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",(o=>{e.call(this,o)}),!0)}platform(){const e=navigator.userAgent;return e.includes("Windows NT")?"windows":e.includes("Mac OS X")?"mac":"linux"}loadCompleted(){}bringToFront(){}closeWindow(){}setIsDocked(e,o){window.setTimeout(o,0)}showSurvey(e,o){window.setTimeout((()=>o({surveyShown:!1})),0)}canShowSurvey(e,o){window.setTimeout((()=>o({canShowSurvey:!1})),0)}setInspectedPageBounds(e){}inspectElementCompleted(){}setInjectedScriptForOrigin(e,o){}inspectedURLChanged(e){document.title=k(v.devtoolsS,{PH1:e.replace(/^https?:\/\//,"")})}copyText(e){null!=e&&navigator.clipboard.writeText(e)}openInNewTab(e){window.open(e,"_blank")}showItemInFolder(o){e.Console.Console.instance().error("Show item in folder is not enabled in hosted mode. Please inspect using chrome://inspect")}save(e,o,r){let t=this.#e.get(e);t||(t=[],this.#e.set(e,t)),t.push(o),this.events.dispatchEventToListeners(n.SavedURL,{url:e,fileSystemPath:e})}append(e,o){const r=this.#e.get(e);r&&(r.push(o),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(o){t=e}const n=document.createElement("a");n.download=t;const i=new Blob([o.join("")],{type:"text/plain"}),s=URL.createObjectURL(i);n.href=s,n.click(),URL.revokeObjectURL(s)}sendMessageToBackend(e){}recordCountHistogram(e,o,r,t,n){this.recordedCountHistograms.length>=100&&this.recordedCountHistograms.shift(),this.recordedCountHistograms.push({histogramName:e,sample:o,min:r,exclusiveMax:t,bucketSize:n})}recordEnumeratedHistogram(e,o,r){this.recordedEnumeratedHistograms.length>=100&&this.recordedEnumeratedHistograms.shift(),this.recordedEnumeratedHistograms.push({actionName:e,actionCode:o})}recordPerformanceHistogram(e,o){this.recordedPerformanceHistograms.length>=100&&this.recordedPerformanceHistograms.shift(),this.recordedPerformanceHistograms.push({histogramName:e,duration:o})}recordUserMetricsAction(e){}requestFileSystems(){this.events.dispatchEventToListeners(n.FileSystemsLoaded,[])}addFileSystem(e){window.webkitRequestFileSystem(window.TEMPORARY,1048576,(e=>{this.#o=e;const o={fileSystemName:"sandboxedRequestedFileSystem",fileSystemPath:"/overrides",rootURL:"filesystem:devtools://devtools/isolated/",type:"overrides"};this.events.dispatchEventToListeners(n.FileSystemAdded,{fileSystem:o})}))}removeFileSystem(e){const o=e=>{e.forEach((e=>{e.isDirectory?e.removeRecursively((()=>{})):e.isFile&&e.remove((()=>{}))}))};this.#o&&this.#o.root.createReader().readEntries(o),this.#o=null,this.events.dispatchEventToListeners(n.FileSystemRemoved,"/overrides")}isolatedFileSystem(e,o){return this.#o}loadNetworkResource(e,o,r,t){fetch(e).then((async e=>{const o=await e.arrayBuffer();let r=o;if(function(e){const o=new Uint8Array(e);return!(!o||o.length<3)&&31===o[0]&&139===o[1]&&8===o[2]}(o)){const e=new DecompressionStream("gzip"),t=e.writable.getWriter();t.write(o),t.close(),r=e.readable}return await new Response(r).text()})).then((function(e){g(r,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,o){}getPreferences(e){const o={};for(const e in window.localStorage)o[e]=window.localStorage[e];e(o)}getPreference(e,o){o(window.localStorage[e])}setPreference(e,o){window.localStorage[e]=o}removePreference(e){delete window.localStorage[e]}clearPreferences(){window.localStorage.clear()}getSyncInformation(e){e({isSyncActive:!1,arePreferencesSynced:!1})}upgradeDraggedFileSystemPermissions(e){}indexPath(e,o,r){}stopIndexing(e){}searchInPath(e,o,r){}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,o){}openRemotePage(e,o){}openNodeFrontend(){}showContextMenuAtPoint(e,o,r,t){throw"Soft context menu should be used"}isHostedMode(){return!0}setAddExtensionCallback(e){}async initialTargetId(){return null}}let f=globalThis.InspectorFrontendHost;class I{constructor(){for(const e of i)this[e[1]]=this.dispatch.bind(this,e[0],e[2],e[3])}dispatch(e,o,r,...t){if(o.length<2){try{f.events.dispatchEventToListeners(e,t[0])}catch(e){console.error(e+" "+e.stack)}return}const n={};for(let e=0;e=2||f.recordEnumeratedHistogram(s.BreakpointWithConditionAdded,e,2)}breakpointEditDialogRevealedFrom(e){e>=7||f.recordEnumeratedHistogram(s.BreakpointEditDialogRevealedFrom,e,7)}panelShown(e){const o=D[e]||0;f.recordEnumeratedHistogram(s.PanelShown,o,D.MaxValue),f.recordUserMetricsAction("DevTools_PanelShown_"+e),this.#r=!0}panelClosed(e){const o=D[e]||0;f.recordEnumeratedHistogram(s.PanelClosed,o,D.MaxValue),this.#r=!0}elementsSidebarTabShown(e){const o=L[e]||0;f.recordEnumeratedHistogram(s.ElementsSidebarTabShown,o,L.MaxValue)}sourcesSidebarTabShown(e){const o=A[e]||0;f.recordEnumeratedHistogram(s.SourcesSidebarTabShown,o,A.MaxValue)}settingsPanelShown(e){this.panelShown("settings-"+e)}sourcesPanelFileDebugged(e){const o=e&&V[e]||V.Unknown;f.recordEnumeratedHistogram(s.SourcesPanelFileDebugged,o,V.MaxValue)}sourcesPanelFileOpened(e){const o=e&&V[e]||V.Unknown;f.recordEnumeratedHistogram(s.SourcesPanelFileOpened,o,V.MaxValue)}networkPanelResponsePreviewOpened(e){const o=e&&V[e]||V.Unknown;f.recordEnumeratedHistogram(s.NetworkPanelResponsePreviewOpened,o,V.MaxValue)}actionTaken(e){f.recordEnumeratedHistogram(s.ActionTaken,e,F.MaxValue)}panelLoaded(e,o){this.#t||e!==this.#n||(this.#t=!0,requestAnimationFrame((()=>{window.setTimeout((()=>{performance.mark(o),this.#r||f.recordPerformanceHistogram(o,performance.now())}),0)})))}setLaunchPanel(e){this.#n=e}keybindSetSettingChanged(e){const o=O[e]||0;f.recordEnumeratedHistogram(s.KeybindSetSettingChanged,o,O.MaxValue)}keyboardShortcutFired(e){const o=H[e]||H.OtherShortcut;f.recordEnumeratedHistogram(s.KeyboardShortcutFired,o,H.MaxValue)}issuesPanelOpenedFrom(e){f.recordEnumeratedHistogram(s.IssuesPanelOpenedFrom,e,N.MaxValue)}issuesPanelIssueExpanded(e){if(void 0===e)return;const o=_[e];void 0!==o&&f.recordEnumeratedHistogram(s.IssuesPanelIssueExpanded,o,_.MaxValue)}issuesPanelResourceOpened(e,o){const r=U[e+o];void 0!==r&&f.recordEnumeratedHistogram(s.IssuesPanelResourceOpened,r,U.MaxValue)}issueCreated(e){const o=B[e];void 0!==o&&f.recordEnumeratedHistogram(s.IssueCreated,o,B.MaxValue)}experimentEnabledAtLaunch(e){const o=W[e];void 0!==o&&f.recordEnumeratedHistogram(s.ExperimentEnabledAtLaunch,o,W.MaxValue)}experimentChanged(e,o){const r=W[e];if(void 0===r)return;const t=o?s.ExperimentEnabled:s.ExperimentDisabled;f.recordEnumeratedHistogram(t,r,W.MaxValue)}developerResourceLoaded(e){e>=j.MaxValue||f.recordEnumeratedHistogram(s.DeveloperResourceLoaded,e,j.MaxValue)}developerResourceScheme(e){e>=G.MaxValue||f.recordEnumeratedHistogram(s.DeveloperResourceScheme,e,G.MaxValue)}inlineScriptParsed(e){e>=2||f.recordEnumeratedHistogram(s.InlineScriptParsed,e,2)}vmInlineScriptContentShown(e){e>=2||f.recordEnumeratedHistogram(s.VMInlineScriptTypeShown,e,2)}linearMemoryInspectorRevealedFrom(e){e>=z.MaxValue||f.recordEnumeratedHistogram(s.LinearMemoryInspectorRevealedFrom,e,z.MaxValue)}linearMemoryInspectorTarget(e){e>=q.MaxValue||f.recordEnumeratedHistogram(s.LinearMemoryInspectorTarget,e,q.MaxValue)}language(e){const o=J[e];void 0!==o&&f.recordEnumeratedHistogram(s.Language,o,J.MaxValue)}syncSetting(e){f.getSyncInformation((o=>{let r=K.ChromeSyncDisabled;o.isSyncActive&&!o.arePreferencesSynced?r=K.ChromeSyncSettingsDisabled:o.isSyncActive&&o.arePreferencesSynced&&(r=e?K.DevToolsSyncSettingEnabled:K.DevToolsSyncSettingDisabled),f.recordEnumeratedHistogram(s.SyncSetting,r,K.MaxValue)}))}recordingAssertion(e){f.recordEnumeratedHistogram(s.RecordingAssertion,e,X.MaxValue)}recordingToggled(e){f.recordEnumeratedHistogram(s.RecordingToggled,e,Q.MaxValue)}recordingReplayFinished(e){f.recordEnumeratedHistogram(s.RecordingReplayFinished,e,Z.MaxValue)}recordingReplaySpeed(e){f.recordEnumeratedHistogram(s.RecordingReplaySpeed,e,$.MaxValue)}recordingReplayStarted(e){f.recordEnumeratedHistogram(s.RecordingReplayStarted,e,Y.MaxValue)}recordingEdited(e){f.recordEnumeratedHistogram(s.RecordingEdited,e,ee.MaxValue)}recordingExported(e){f.recordEnumeratedHistogram(s.RecordingExported,e,oe.MaxValue)}recordingCodeToggled(e){f.recordEnumeratedHistogram(s.RecordingCodeToggled,e,re.MaxValue)}recordingCopiedToClipboard(e){f.recordEnumeratedHistogram(s.RecordingCopiedToClipboard,e,te.MaxValue)}styleTextCopied(e){f.recordEnumeratedHistogram(s.StyleTextCopied,e,ie.MaxValue)}manifestSectionSelected(e){const o=se[e]||se.OtherSection;f.recordEnumeratedHistogram(s.ManifestSectionSelected,o,se.MaxValue)}cssHintShown(e){f.recordEnumeratedHistogram(s.CSSHintShown,e,ae.MaxValue)}lighthouseModeRun(e){f.recordEnumeratedHistogram(s.LighthouseModeRun,e,de.MaxValue)}colorConvertedFrom(e){f.recordEnumeratedHistogram(s.ColorConvertedFrom,e,2)}colorPickerOpenedFrom(e){f.recordEnumeratedHistogram(s.ColorPickerOpenedFrom,e,2)}cssPropertyDocumentation(e){f.recordEnumeratedHistogram(s.CSSPropertyDocumentation,e,3)}swatchActivated(e){f.recordEnumeratedHistogram(s.SwatchActivated,e,10)}badgeActivated(e){f.recordEnumeratedHistogram(s.BadgeActivated,e,9)}breakpointsRestoredFromStorage(e){const o=this.#i(e);f.recordEnumeratedHistogram(s.BreakpointsRestoredFromStorageCount,o,10)}#i(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){f.recordPerformanceHistogram("DevTools.Workspaces.PopulateWallClocktime",e)}workspacesNumberOfFiles(e,o){f.recordCountHistogram("DevTools.Workspaces.NumberOfFilesLoaded",e,0,1e5,100),f.recordCountHistogram("DevTools.Workspaces.NumberOfDirectoriesTraversed",o,0,1e4,100)}}!function(e){e[e.WindowDocked=1]="WindowDocked",e[e.WindowUndocked=2]="WindowUndocked",e[e.ScriptsBreakpointSet=3]="ScriptsBreakpointSet",e[e.TimelineStarted=4]="TimelineStarted",e[e.ProfilesCPUProfileTaken=5]="ProfilesCPUProfileTaken",e[e.ProfilesHeapProfileTaken=6]="ProfilesHeapProfileTaken",e[e.ConsoleEvaluated=8]="ConsoleEvaluated",e[e.FileSavedInWorkspace=9]="FileSavedInWorkspace",e[e.DeviceModeEnabled=10]="DeviceModeEnabled",e[e.AnimationsPlaybackRateChanged=11]="AnimationsPlaybackRateChanged",e[e.RevisionApplied=12]="RevisionApplied",e[e.FileSystemDirectoryContentReceived=13]="FileSystemDirectoryContentReceived",e[e.StyleRuleEdited=14]="StyleRuleEdited",e[e.CommandEvaluatedInConsolePanel=15]="CommandEvaluatedInConsolePanel",e[e.DOMPropertiesExpanded=16]="DOMPropertiesExpanded",e[e.ResizedViewInResponsiveMode=17]="ResizedViewInResponsiveMode",e[e.TimelinePageReloadStarted=18]="TimelinePageReloadStarted",e[e.ConnectToNodeJSFromFrontend=19]="ConnectToNodeJSFromFrontend",e[e.ConnectToNodeJSDirectly=20]="ConnectToNodeJSDirectly",e[e.CpuThrottlingEnabled=21]="CpuThrottlingEnabled",e[e.CpuProfileNodeFocused=22]="CpuProfileNodeFocused",e[e.CpuProfileNodeExcluded=23]="CpuProfileNodeExcluded",e[e.SelectFileFromFilePicker=24]="SelectFileFromFilePicker",e[e.SelectCommandFromCommandMenu=25]="SelectCommandFromCommandMenu",e[e.ChangeInspectedNodeInElementsPanel=26]="ChangeInspectedNodeInElementsPanel",e[e.StyleRuleCopied=27]="StyleRuleCopied",e[e.CoverageStarted=28]="CoverageStarted",e[e.LighthouseStarted=29]="LighthouseStarted",e[e.LighthouseFinished=30]="LighthouseFinished",e[e.ShowedThirdPartyBadges=31]="ShowedThirdPartyBadges",e[e.LighthouseViewTrace=32]="LighthouseViewTrace",e[e.FilmStripStartedRecording=33]="FilmStripStartedRecording",e[e.CoverageReportFiltered=34]="CoverageReportFiltered",e[e.CoverageStartedPerBlock=35]="CoverageStartedPerBlock",e[e["SettingsOpenedFromGear-deprecated"]=36]="SettingsOpenedFromGear-deprecated",e[e["SettingsOpenedFromMenu-deprecated"]=37]="SettingsOpenedFromMenu-deprecated",e[e["SettingsOpenedFromCommandMenu-deprecated"]=38]="SettingsOpenedFromCommandMenu-deprecated",e[e.TabMovedToDrawer=39]="TabMovedToDrawer",e[e.TabMovedToMainPanel=40]="TabMovedToMainPanel",e[e.CaptureCssOverviewClicked=41]="CaptureCssOverviewClicked",e[e.VirtualAuthenticatorEnvironmentEnabled=42]="VirtualAuthenticatorEnvironmentEnabled",e[e.SourceOrderViewActivated=43]="SourceOrderViewActivated",e[e.UserShortcutAdded=44]="UserShortcutAdded",e[e.ShortcutRemoved=45]="ShortcutRemoved",e[e.ShortcutModified=46]="ShortcutModified",e[e.CustomPropertyLinkClicked=47]="CustomPropertyLinkClicked",e[e.CustomPropertyEdited=48]="CustomPropertyEdited",e[e.ServiceWorkerNetworkRequestClicked=49]="ServiceWorkerNetworkRequestClicked",e[e.ServiceWorkerNetworkRequestClosedQuickly=50]="ServiceWorkerNetworkRequestClosedQuickly",e[e.NetworkPanelServiceWorkerRespondWith=51]="NetworkPanelServiceWorkerRespondWith",e[e.NetworkPanelCopyValue=52]="NetworkPanelCopyValue",e[e.ConsoleSidebarOpened=53]="ConsoleSidebarOpened",e[e.PerfPanelTraceImported=54]="PerfPanelTraceImported",e[e.PerfPanelTraceExported=55]="PerfPanelTraceExported",e[e.StackFrameRestarted=56]="StackFrameRestarted",e[e.CaptureTestProtocolClicked=57]="CaptureTestProtocolClicked",e[e.BreakpointRemovedFromRemoveButton=58]="BreakpointRemovedFromRemoveButton",e[e.BreakpointGroupExpandedStateChanged=59]="BreakpointGroupExpandedStateChanged",e[e.HeaderOverrideFileCreated=60]="HeaderOverrideFileCreated",e[e.HeaderOverrideEnableEditingClicked=61]="HeaderOverrideEnableEditingClicked",e[e.HeaderOverrideHeaderAdded=62]="HeaderOverrideHeaderAdded",e[e.HeaderOverrideHeaderEdited=63]="HeaderOverrideHeaderEdited",e[e.HeaderOverrideHeaderRemoved=64]="HeaderOverrideHeaderRemoved",e[e.HeaderOverrideHeadersFileEdited=65]="HeaderOverrideHeadersFileEdited",e[e.PersistenceNetworkOverridesEnabled=66]="PersistenceNetworkOverridesEnabled",e[e.PersistenceNetworkOverridesDisabled=67]="PersistenceNetworkOverridesDisabled",e[e.BreakpointRemovedFromContextMenu=68]="BreakpointRemovedFromContextMenu",e[e.BreakpointsInFileRemovedFromRemoveButton=69]="BreakpointsInFileRemovedFromRemoveButton",e[e.BreakpointsInFileRemovedFromContextMenu=70]="BreakpointsInFileRemovedFromContextMenu",e[e.BreakpointsInFileCheckboxToggled=71]="BreakpointsInFileCheckboxToggled",e[e.BreakpointsInFileEnabledDisabledFromContextMenu=72]="BreakpointsInFileEnabledDisabledFromContextMenu",e[e.BreakpointConditionEditedFromSidebar=73]="BreakpointConditionEditedFromSidebar",e[e.AddFileSystemToWorkspace=74]="AddFileSystemToWorkspace",e[e.RemoveFileSystemFromWorkspace=75]="RemoveFileSystemFromWorkspace",e[e.AddFileSystemForOverrides=76]="AddFileSystemForOverrides",e[e.RemoveFileSystemForOverrides=77]="RemoveFileSystemForOverrides",e[e.FileSystemSourceSelected=78]="FileSystemSourceSelected",e[e.OverridesSourceSelected=79]="OverridesSourceSelected",e[e.StyleSheetInitiatorLinkClicked=80]="StyleSheetInitiatorLinkClicked",e[e.MaxValue=81]="MaxValue"}(F||(F={})),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_backgroundFetch=46]="background_service_backgroundFetch",e[e.background_service_backgroundSync=47]="background_service_backgroundSync",e[e.background_service_pushMessaging=48]="background_service_pushMessaging",e[e.background_service_notifications=49]="background_service_notifications",e[e.background_service_paymentHandler=50]="background_service_paymentHandler",e[e.background_service_periodicBackgroundSync=51]="background_service_periodicBackgroundSync",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.MaxValue=66]="MaxValue"}(D||(D={})),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.eventListeners"]=4]="elements.eventListeners",e[e["elements.domBreakpoints"]=5]="elements.domBreakpoints",e[e["elements.domProperties"]=6]="elements.domProperties",e[e["accessibility.view"]=7]="accessibility.view",e[e.MaxValue=8]="MaxValue"}(L||(L={})),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-contentScripts"]=4]="navigator-contentScripts",e[e["navigator-snippets"]=5]="navigator-snippets",e[e.MaxValue=6]="MaxValue"}(A||(A={})),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"}(V||(V={})),function(e){e[e.devToolsDefault=0]="devToolsDefault",e[e.vsCode=1]="vsCode",e[e.MaxValue=2]="MaxValue"}(O||(O={})),function(e){e[e.OtherShortcut=0]="OtherShortcut",e[e["commandMenu.show"]=1]="commandMenu.show",e[e["console.clear"]=2]="console.clear",e[e["console.show"]=3]="console.show",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["quickOpen.show"]=21]="quickOpen.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.MaxValue=112]="MaxValue"}(H||(H={})),function(e){e[e.ConsoleInfoBar=0]="ConsoleInfoBar",e[e.LearnMoreLinkCOEP=1]="LearnMoreLinkCOEP",e[e.StatusBarIssuesCounter=2]="StatusBarIssuesCounter",e[e.HamburgerMenu=3]="HamburgerMenu",e[e.Adorner=4]="Adorner",e[e.CommandMenu=5]="CommandMenu",e[e.MaxValue=6]="MaxValue"}(N||(N={})),function(e){e[e.applyCustomStylesheet=0]="applyCustomStylesheet",e[e.captureNodeCreationStacks=1]="captureNodeCreationStacks",e[e.sourcesPrettyPrint=2]="sourcesPrettyPrint",e[e.liveHeapProfile=11]="liveHeapProfile",e[e.protocolMonitor=13]="protocolMonitor",e[e.developerResourcesView=15]="developerResourcesView",e[e.samplingHeapProfilerTimeline=17]="samplingHeapProfilerTimeline",e[e.showOptionToExposeInternalsInHeapSnapshot=18]="showOptionToExposeInternalsInHeapSnapshot",e[e.sourceOrderViewer=20]="sourceOrderViewer",e[e.webauthnPane=22]="webauthnPane",e[e.timelineEventInitiators=24]="timelineEventInitiators",e[e.timelineInvalidationTracking=26]="timelineInvalidationTracking",e[e.timelineShowAllEvents=27]="timelineShowAllEvents",e[e.timelineV8RuntimeCallStats=28]="timelineV8RuntimeCallStats",e[e.wasmDWARFDebugging=31]="wasmDWARFDebugging",e[e.dualScreenSupport=32]="dualScreenSupport",e[e.keyboardShortcutEditor=35]="keyboardShortcutEditor",e[e.APCA=39]="APCA",e[e.cspViolationsView=40]="cspViolationsView",e[e.fontEditor=41]="fontEditor",e[e.fullAccessibilityTree=42]="fullAccessibilityTree",e[e.ignoreListJSFramesOnTimeline=43]="ignoreListJSFramesOnTimeline",e[e.contrastIssues=44]="contrastIssues",e[e.experimentalCookieFeatures=45]="experimentalCookieFeatures",e[e.cssTypeComponentLength=52]="cssTypeComponentLength",e[e.preciseChanges=53]="preciseChanges",e[e.bfcacheDisplayTree=54]="bfcacheDisplayTree",e[e.stylesPaneCSSChanges=55]="stylesPaneCSSChanges",e[e.headerOverrides=56]="headerOverrides",e[e.evaluateExpressionsWithSourceMaps=58]="evaluateExpressionsWithSourceMaps",e[e.eyedropperColorPicker=60]="eyedropperColorPicker",e[e.instrumentationBreakpoints=61]="instrumentationBreakpoints",e[e.authoredDeployedGrouping=63]="authoredDeployedGrouping",e[e.importantDOMProperties=64]="importantDOMProperties",e[e.justMyCode=65]="justMyCode",e[e.timelineAsConsoleProfileResultPanel=67]="timelineAsConsoleProfileResultPanel",e[e.preloadingStatusPanel=68]="preloadingStatusPanel",e[e.disableColorFormatSetting=69]="disableColorFormatSetting",e[e.outermostTargetSelector=71]="outermostTargetSelector",e[e.jsProfilerTemporarilyEnable=72]="jsProfilerTemporarilyEnable",e[e.highlightErrorsElementsPanel=73]="highlightErrorsElementsPanel",e[e.setAllBreakpointsEagerly=74]="setAllBreakpointsEagerly",e[e.MaxValue=75]="MaxValue"}(W||(W={})),function(e){e[e.CrossOriginEmbedderPolicy=0]="CrossOriginEmbedderPolicy",e[e.MixedContent=1]="MixedContent",e[e.Cookie=2]="Cookie",e[e.HeavyAd=3]="HeavyAd",e[e.ContentSecurityPolicy=4]="ContentSecurityPolicy",e[e.Other=5]="Other",e[e.Generic=6]="Generic",e[e.MaxValue=7]="MaxValue"}(_||(_={})),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.CrossOriginEmbedderPolicyLearnMore=8]="CrossOriginEmbedderPolicyLearnMore",e[e.MixedContentLearnMore=9]="MixedContentLearnMore",e[e.SameSiteCookieLearnMore=10]="SameSiteCookieLearnMore",e[e.HeavyAdLearnMore=11]="HeavyAdLearnMore",e[e.ContentSecurityPolicyLearnMore=12]="ContentSecurityPolicyLearnMore",e[e.MaxValue=13]="MaxValue"}(U||(U={})),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.MaxValue=78]="MaxValue"}(B||(B={})),function(e){e[e.LoadThroughPageViaTarget=0]="LoadThroughPageViaTarget",e[e.LoadThroughPageViaFrame=1]="LoadThroughPageViaFrame",e[e.LoadThroughPageFailure=2]="LoadThroughPageFailure",e[e.LoadThroughPageFallback=3]="LoadThroughPageFallback",e[e.FallbackAfterFailure=4]="FallbackAfterFailure",e[e.FallbackPerOverride=5]="FallbackPerOverride",e[e.FallbackPerProtocol=6]="FallbackPerProtocol",e[e.FallbackFailure=7]="FallbackFailure",e[e.MaxValue=8]="MaxValue"}(j||(j={})),function(e){e[e.SchemeOther=0]="SchemeOther",e[e.SchemeUnknown=1]="SchemeUnknown",e[e.SchemeHttp=2]="SchemeHttp",e[e.SchemeHttps=3]="SchemeHttps",e[e.SchemeHttpLocalhost=4]="SchemeHttpLocalhost",e[e.SchemeHttpsLocalhost=5]="SchemeHttpsLocalhost",e[e.SchemeData=6]="SchemeData",e[e.SchemeFile=7]="SchemeFile",e[e.SchemeBlob=8]="SchemeBlob",e[e.MaxValue=9]="MaxValue"}(G||(G={})),function(e){e[e.ContextMenu=0]="ContextMenu",e[e.MemoryIcon=1]="MemoryIcon",e[e.MaxValue=2]="MaxValue"}(z||(z={})),function(e){e[e.DWARFInspectableAddress=0]="DWARFInspectableAddress",e[e.ArrayBuffer=1]="ArrayBuffer",e[e.DataView=2]="DataView",e[e.TypedArray=3]="TypedArray",e[e.WebAssemblyMemory=4]="WebAssemblyMemory",e[e.MaxValue=5]="MaxValue"}(q||(q={})),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"}(J||(J={})),function(e){e[e.ChromeSyncDisabled=1]="ChromeSyncDisabled",e[e.ChromeSyncSettingsDisabled=2]="ChromeSyncSettingsDisabled",e[e.DevToolsSyncSettingDisabled=3]="DevToolsSyncSettingDisabled",e[e.DevToolsSyncSettingEnabled=4]="DevToolsSyncSettingEnabled",e[e.MaxValue=5]="MaxValue"}(K||(K={})),function(e){e[e.RecordingStarted=1]="RecordingStarted",e[e.RecordingFinished=2]="RecordingFinished",e[e.MaxValue=3]="MaxValue"}(Q||(Q={})),function(e){e[e.AssertionAdded=1]="AssertionAdded",e[e.PropertyAssertionEdited=2]="PropertyAssertionEdited",e[e.AttributeAssertionEdited=3]="AttributeAssertionEdited",e[e.MaxValue=4]="MaxValue"}(X||(X={})),function(e){e[e.Success=1]="Success",e[e.TimeoutErrorSelectors=2]="TimeoutErrorSelectors",e[e.TimeoutErrorTarget=3]="TimeoutErrorTarget",e[e.OtherError=4]="OtherError",e[e.MaxValue=5]="MaxValue"}(Z||(Z={})),function(e){e[e.Normal=1]="Normal",e[e.Slow=2]="Slow",e[e.VerySlow=3]="VerySlow",e[e.ExtremelySlow=4]="ExtremelySlow",e[e.MaxValue=5]="MaxValue"}($||($={})),function(e){e[e.ReplayOnly=1]="ReplayOnly",e[e.ReplayWithPerformanceTracing=2]="ReplayWithPerformanceTracing",e[e.ReplayViaExtension=3]="ReplayViaExtension",e[e.MaxValue=4]="MaxValue"}(Y||(Y={})),function(e){e[e.SelectorPickerUsed=1]="SelectorPickerUsed",e[e.StepAdded=2]="StepAdded",e[e.StepRemoved=3]="StepRemoved",e[e.SelectorAdded=4]="SelectorAdded",e[e.SelectorRemoved=5]="SelectorRemoved",e[e.SelectorPartAdded=6]="SelectorPartAdded",e[e.SelectorPartEdited=7]="SelectorPartEdited",e[e.SelectorPartRemoved=8]="SelectorPartRemoved",e[e.TypeChanged=9]="TypeChanged",e[e.OtherEditing=10]="OtherEditing",e[e.MaxValue=11]="MaxValue"}(ee||(ee={})),function(e){e[e.ToPuppeteer=1]="ToPuppeteer",e[e.ToJSON=2]="ToJSON",e[e.ToPuppeteerReplay=3]="ToPuppeteerReplay",e[e.ToExtension=4]="ToExtension",e[e.ToLighthouse=5]="ToLighthouse",e[e.MaxValue=6]="MaxValue"}(oe||(oe={})),function(e){e[e.CodeShown=1]="CodeShown",e[e.CodeHidden=2]="CodeHidden",e[e.MaxValue=3]="MaxValue"}(re||(re={})),function(e){e[e.CopiedRecordingWithPuppeteer=1]="CopiedRecordingWithPuppeteer",e[e.CopiedRecordingWithJSON=2]="CopiedRecordingWithJSON",e[e.CopiedRecordingWithReplay=3]="CopiedRecordingWithReplay",e[e.CopiedRecordingWithExtension=4]="CopiedRecordingWithExtension",e[e.CopiedStepWithPuppeteer=5]="CopiedStepWithPuppeteer",e[e.CopiedStepWithJSON=6]="CopiedStepWithJSON",e[e.CopiedStepWithReplay=7]="CopiedStepWithReplay",e[e.CopiedStepWithExtension=8]="CopiedStepWithExtension",e[e.MaxValue=9]="MaxValue"}(te||(te={})),function(e){e[e.false=0]="false",e[e.true=1]="true",e[e.MaxValue=2]="MaxValue"}(ne||(ne={})),function(e){e[e.DeclarationViaChangedLine=1]="DeclarationViaChangedLine",e[e.AllChangesViaStylesPane=2]="AllChangesViaStylesPane",e[e.DeclarationViaContextMenu=3]="DeclarationViaContextMenu",e[e.PropertyViaContextMenu=4]="PropertyViaContextMenu",e[e.ValueViaContextMenu=5]="ValueViaContextMenu",e[e.DeclarationAsJSViaContextMenu=6]="DeclarationAsJSViaContextMenu",e[e.RuleViaContextMenu=7]="RuleViaContextMenu",e[e.AllDeclarationsViaContextMenu=8]="AllDeclarationsViaContextMenu",e[e.AllDeclarationsAsJSViaContextMenu=9]="AllDeclarationsAsJSViaContextMenu",e[e.SelectorViaContextMenu=10]="SelectorViaContextMenu",e[e.MaxValue=11]="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"}(se||(se={})),function(e){e[e.Other=0]="Other",e[e.AlignContent=1]="AlignContent",e[e.FlexItem=2]="FlexItem",e[e.FlexContainer=3]="FlexContainer",e[e.GridContainer=4]="GridContainer",e[e.GridItem=5]="GridItem",e[e.FlexGrid=6]="FlexGrid",e[e.MulticolFlexGrid=7]="MulticolFlexGrid",e[e.Padding=8]="Padding",e[e.Position=9]="Position",e[e.ZIndex=10]="ZIndex",e[e.Sizing=11]="Sizing",e[e.FlexOrGridItem=12]="FlexOrGridItem",e[e.FontVariationSettings=13]="FontVariationSettings",e[e.MaxValue=14]="MaxValue"}(ae||(ae={})),function(e){e[e.Navigation=0]="Navigation",e[e.Timespan=1]="Timespan",e[e.Snapshot=2]="Snapshot",e[e.LegacyNavigation=3]="LegacyNavigation",e[e.MaxValue=4]="MaxValue"}(de||(de={}));var ue=Object.freeze({__proto__:null,UserMetrics:ce,get Action(){return F},get PanelCodes(){return D},get ElementsSidebarTabCodes(){return L},get SourcesSidebarTabCodes(){return A},get MediaTypes(){return V},get KeybindSetSettings(){return O},get KeyboardShortcutAction(){return H},get IssueOpener(){return N},get DevtoolsExperiments(){return W},get IssueExpanded(){return _},get IssueResourceOpened(){return U},get IssueCreated(){return B},get DeveloperResourceLoaded(){return j},get DeveloperResourceScheme(){return G},get LinearMemoryInspectorRevealedFrom(){return z},get LinearMemoryInspectorTarget(){return q},get Language(){return J},get SyncSetting(){return K},get RecordingToggled(){return Q},get RecordingAssertion(){return X},get RecordingReplayFinished(){return Z},get RecordingReplaySpeed(){return $},get RecordingReplayStarted(){return Y},get RecordingEdited(){return ee},get RecordingExported(){return oe},get RecordingCodeToggled(){return re},get RecordingCopiedToClipboard(){return te},get ConsoleShowsCorsErrors(){return ne},get StyleTextCopied(){return ie},get ManifestSectionCodes(){return se},get CSSHintType(){return ae},get LighthouseModeRun(){return de}});const me=new ce;export{w as InspectorFrontendHost,a as InspectorFrontendHostAPI,le as Platform,C as ResourceLoader,ue as UserMetrics,me as userMetrics}; diff --git a/packages/debugger-frontend/dist/third-party/front_end/core/root/root.js b/packages/debugger-frontend/dist/third-party/front_end/core/root/root.js index d231ec4dd10c0e..2e25b5694d59ea 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/core/root/root.js +++ b/packages/debugger-frontend/dist/third-party/front_end/core/root/root.js @@ -1 +1 @@ -import*as e from"../platform/platform.js";const t=new URLSearchParams(location.search);let n,s="";class r{constructor(){}static instance(e={forceNew:null}){const{forceNew:t}=e;return n&&!t||(n=new r),n}static removeInstance(){n=void 0}static queryParam(e){return t.get(e)}static setQueryParamForTesting(e,n){t.set(e,n)}static experimentsSetting(){try{return JSON.parse(self.localStorage&&self.localStorage.experiments?self.localStorage.experiments:"{}")}catch(e){return console.error("Failed to parse localStorage['experiments']"),{}}}static setPlatform(e){s=e}static platform(){return s}static isDescriptorEnabled(e){const t=e.experiment;if("*"===t)return!0;if(t&&t.startsWith("!")&&o.isEnabled(t.substring(1)))return!1;if(t&&!t.startsWith("!")&&!o.isEnabled(t))return!1;const n=e.condition;return!(n&&!n.startsWith("!")&&!r.queryParam(n))&&!(n&&n.startsWith("!")&&r.queryParam(n.substring(1)))}loadLegacyModule(e){return import(`../../${e}`)}}class i{#e;#t;#n;#s;#r;#i;constructor(){this.#e=[],this.#t=new Set,this.#n=new Set,this.#s=new Set,this.#r=new Set,this.#i=new Set}allConfigurableExperiments(){const e=[];for(const t of this.#e)this.#n.has(t.name)||this.#i.has(t.name)||e.push(t);return e}enabledExperiments(){return this.#e.filter((e=>e.isEnabled()))}setExperimentsSetting(e){self.localStorage&&(self.localStorage.experiments=JSON.stringify(e))}register(t,n,s,r,i){this.#t.add(t),this.#e.push(new a(this,t,n,Boolean(s),r??e.DevToolsPath.EmptyUrlString,i??e.DevToolsPath.EmptyUrlString))}isEnabled(e){return this.checkExperiment(e),!1!==r.experimentsSetting()[e]&&(!(!this.#n.has(e)&&!this.#s.has(e))||(!!this.#r.has(e)||Boolean(r.experimentsSetting()[e])))}setEnabled(e,t){this.checkExperiment(e);const n=r.experimentsSetting();n[e]=t,this.setExperimentsSetting(n)}enableExperimentsTransiently(e){for(const t of e)this.checkExperiment(t),this.#n.add(t)}enableExperimentsByDefault(e){for(const t of e)this.checkExperiment(t),this.#s.add(t)}setServerEnabledExperiments(e){for(const t of e)this.checkExperiment(t),this.#r.add(t)}setNonConfigurableExperiments(e){for(const t of e)this.checkExperiment(t),this.#i.add(t)}enableForTest(e){this.checkExperiment(e),this.#n.add(e)}disableForTest(e){this.checkExperiment(e),this.#n.delete(e)}clearForTest(){this.#e=[],this.#t.clear(),this.#n.clear(),this.#s.clear(),this.#r.clear()}cleanUpStaleExperiments(){const e=r.experimentsSetting(),t={};for(const{name:n}of this.#e)if(e.hasOwnProperty(n)){const s=e[n];(s||this.#s.has(n))&&(t[n]=s)}this.setExperimentsSetting(t)}checkExperiment(e){}}class a{name;title;unstable;docLink;feedbackLink;#e;constructor(e,t,n,s,r,i){this.name=t,this.title=n,this.unstable=s,this.docLink=r,this.feedbackLink=i,this.#e=e}isEnabled(){return this.#e.isEnabled(this.name)}setEnabled(e){this.#e.setEnabled(this.name,e)}}const o=new i;var l,E;!function(e){e.CAPTURE_NODE_CREATION_STACKS="captureNodeCreationStacks",e.CSS_OVERVIEW="cssOverview",e.LIVE_HEAP_PROFILE="liveHeapProfile",e.DEVELOPER_RESOURCES_VIEW="developerResourcesView",e.CSP_VIOLATIONS_VIEW="cspViolationsView",e.WASM_DWARF_DEBUGGING="wasmDWARFDebugging",e.ALL="*",e.PROTOCOL_MONITOR="protocolMonitor",e.WEBAUTHN_PANE="webauthnPane",e.FULL_ACCESSIBILITY_TREE="fullAccessibilityTree",e.PRECISE_CHANGES="preciseChanges",e.STYLES_PANE_CSS_CHANGES="stylesPaneCSSChanges",e.HEADER_OVERRIDES="headerOverrides",e.EYEDROPPER_COLOR_PICKER="eyedropperColorPicker",e.INSTRUMENTATION_BREAKPOINTS="instrumentationBreakpoints",e.AUTHORED_DEPLOYED_GROUPING="authoredDeployedGrouping",e.IMPORTANT_DOM_PROPERTIES="importantDOMProperties",e.JUST_MY_CODE="justMyCode",e.PRELOADING_STATUS_PANEL="preloadingStatusPanel",e.DISABLE_COLOR_FORMAT_SETTING="disableColorFormatSetting",e.TIMELINE_AS_CONSOLE_PROFILE_RESULT_PANEL="timelineAsConsoleProfileResultPanel",e.OUTERMOST_TARGET_SELECTOR="outermostTargetSelector",e.JS_PROFILER_TEMP_ENABLE="jsProfilerTemporarilyEnable",e.HIGHLIGHT_ERRORS_ELEMENTS_PANEL="highlightErrorsElementsPanel",e.SET_ALL_BREAKPOINTS_EAGERLY="setAllBreakpointsEagerly",e.REACT_NATIVE_SPECIFIC_UI="reactNativeSpecificUI"}(l||(l={})),function(e){e.CAN_DOCK="can_dock",e.NOT_SOURCES_HIDE_ADD_FOLDER="!sources.hide_add_folder"}(E||(E={}));var c=Object.freeze({__proto__:null,getRemoteBase:function(e=self.location.toString()){const t=new URL(e).searchParams.get("remoteBase");if(!t)return null;const n=/\/serve_file\/(@[0-9a-zA-Z]+)\/?$/.exec(t);return n?{base:`devtools://devtools/remote/serve_file/${n[1]}/`,version:n[1]}:null},Runtime:r,ExperimentsSupport:i,Experiment:a,experiments:o,get ExperimentName(){return l},get ConditionName(){return E}});export{c as Runtime}; +import*as e from"../platform/platform.js";const t=new URLSearchParams(location.search);let n,s="";class r{constructor(){}static instance(e={forceNew:null}){const{forceNew:t}=e;return n&&!t||(n=new r),n}static removeInstance(){n=void 0}static queryParam(e){return t.get(e)}static setQueryParamForTesting(e,n){t.set(e,n)}static experimentsSetting(){try{return JSON.parse(self.localStorage&&self.localStorage.experiments?self.localStorage.experiments:"{}")}catch(e){return console.error("Failed to parse localStorage['experiments']"),{}}}static setPlatform(e){s=e}static platform(){return s}static isDescriptorEnabled(e){const t=e.experiment;if("*"===t)return!0;if(t&&t.startsWith("!")&&l.isEnabled(t.substring(1)))return!1;if(t&&!t.startsWith("!")&&!l.isEnabled(t))return!1;const n=e.condition;return!(n&&!n.startsWith("!")&&!r.queryParam(n))&&!(n&&n.startsWith("!")&&r.queryParam(n.substring(1)))}loadLegacyModule(e){return import(`../../${e}`)}}class i{#e;#t;#n;#s;#r;#i;constructor(){this.#e=[],this.#t=new Set,this.#n=new Set,this.#s=new Set,this.#r=new Set,this.#i=new Set}allConfigurableExperiments(){const e=[];for(const t of this.#e)this.#n.has(t.name)||this.#i.has(t.name)||e.push(t);return e}enabledExperiments(){return this.#e.filter((e=>e.isEnabled()))}setExperimentsSetting(e){self.localStorage&&(self.localStorage.experiments=JSON.stringify(e))}register(t,n,s,r,i){this.#t.add(t),this.#e.push(new a(this,t,n,Boolean(s),r??e.DevToolsPath.EmptyUrlString,i??e.DevToolsPath.EmptyUrlString))}isEnabled(e){return this.checkExperiment(e),!1!==r.experimentsSetting()[e]&&(!(!this.#n.has(e)&&!this.#s.has(e))||(!!this.#r.has(e)||Boolean(r.experimentsSetting()[e])))}setEnabled(e,t){this.checkExperiment(e);const n=r.experimentsSetting();n[e]=t,this.setExperimentsSetting(n)}enableExperimentsTransiently(e){for(const t of e)this.checkExperiment(t),this.#n.add(t)}enableExperimentsByDefault(e){for(const t of e)this.checkExperiment(t),this.#s.add(t)}setServerEnabledExperiments(e){for(const t of e)this.checkExperiment(t),this.#r.add(t)}setNonConfigurableExperiments(e){for(const t of e)this.checkExperiment(t),this.#i.add(t)}enableForTest(e){this.checkExperiment(e),this.#n.add(e)}disableForTest(e){this.checkExperiment(e),this.#n.delete(e)}clearForTest(){this.#e=[],this.#t.clear(),this.#n.clear(),this.#s.clear(),this.#r.clear()}cleanUpStaleExperiments(){const e=r.experimentsSetting(),t={};for(const{name:n}of this.#e)if(e.hasOwnProperty(n)){const s=e[n];(s||this.#s.has(n))&&(t[n]=s)}this.setExperimentsSetting(t)}checkExperiment(e){}}class a{name;title;unstable;docLink;feedbackLink;#e;constructor(e,t,n,s,r,i){this.name=t,this.title=n,this.unstable=s,this.docLink=r,this.feedbackLink=i,this.#e=e}isEnabled(){return this.#e.isEnabled(this.name)}setEnabled(e){this.#e.setEnabled(this.name,e)}}const l=new i;var o,E;!function(e){e.CAPTURE_NODE_CREATION_STACKS="captureNodeCreationStacks",e.CSS_OVERVIEW="cssOverview",e.LIVE_HEAP_PROFILE="liveHeapProfile",e.DEVELOPER_RESOURCES_VIEW="developerResourcesView",e.CSP_VIOLATIONS_VIEW="cspViolationsView",e.WASM_DWARF_DEBUGGING="wasmDWARFDebugging",e.ALL="*",e.PROTOCOL_MONITOR="protocolMonitor",e.WEBAUTHN_PANE="webauthnPane",e.FULL_ACCESSIBILITY_TREE="fullAccessibilityTree",e.PRECISE_CHANGES="preciseChanges",e.STYLES_PANE_CSS_CHANGES="stylesPaneCSSChanges",e.HEADER_OVERRIDES="headerOverrides",e.EYEDROPPER_COLOR_PICKER="eyedropperColorPicker",e.INSTRUMENTATION_BREAKPOINTS="instrumentationBreakpoints",e.AUTHORED_DEPLOYED_GROUPING="authoredDeployedGrouping",e.IMPORTANT_DOM_PROPERTIES="importantDOMProperties",e.JUST_MY_CODE="justMyCode",e.PRELOADING_STATUS_PANEL="preloadingStatusPanel",e.DISABLE_COLOR_FORMAT_SETTING="disableColorFormatSetting",e.TIMELINE_AS_CONSOLE_PROFILE_RESULT_PANEL="timelineAsConsoleProfileResultPanel",e.OUTERMOST_TARGET_SELECTOR="outermostTargetSelector",e.JS_PROFILER_TEMP_ENABLE="jsProfilerTemporarilyEnable",e.HIGHLIGHT_ERRORS_ELEMENTS_PANEL="highlightErrorsElementsPanel",e.SET_ALL_BREAKPOINTS_EAGERLY="setAllBreakpointsEagerly",e.REACT_NATIVE_SPECIFIC_UI="reactNativeSpecificUI"}(o||(o={})),function(e){e.CAN_DOCK="can_dock",e.NOT_SOURCES_HIDE_ADD_FOLDER="!sources.hide_add_folder",e.REACT_NATIVE_UNSTABLE_NETWORK_PANEL="unstable_enableNetworkPanel"}(E||(E={}));var c=Object.freeze({__proto__:null,getRemoteBase:function(e=self.location.toString()){const t=new URL(e).searchParams.get("remoteBase");if(!t)return null;const n=/\/serve_file\/(@[0-9a-zA-Z]+)\/?$/.exec(t);return n?{base:`devtools://devtools/remote/serve_file/${n[1]}/`,version:n[1]}:null},Runtime:r,ExperimentsSupport:i,Experiment:a,experiments:l,get ExperimentName(){return o},get ConditionName(){return E}});export{c as Runtime}; diff --git a/packages/debugger-frontend/dist/third-party/front_end/entrypoints/devtools_app/devtools_app.js b/packages/debugger-frontend/dist/third-party/front_end/entrypoints/devtools_app/devtools_app.js index d4c88c14fcbcdd..2627ff4a06502c 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/entrypoints/devtools_app/devtools_app.js +++ b/packages/debugger-frontend/dist/third-party/front_end/entrypoints/devtools_app/devtools_app.js @@ -1 +1 @@ -import"../shell/shell.js";import*as e from"../../core/i18n/i18n.js";import*as t from"../../ui/legacy/legacy.js";import*as i from"../../core/common/common.js";import*as o from"../../core/root/root.js";import*as n from"../../core/sdk/sdk.js";import*as a from"../../models/workspace/workspace.js";import*as r from"../../panels/network/forward/forward.js";import*as s from"../../models/issues_manager/issues_manager.js";import*as c from"../main/main.js";const l={cssOverview:"CSS Overview",showCssOverview:"Show CSS Overview"},g=e.i18n.registerUIStrings("panels/css_overview/css_overview-meta.ts",l),d=e.i18n.getLazilyComputedLocalizedString.bind(void 0,g);let m;t.ViewManager.registerViewExtension({location:"panel",id:"cssoverview",commandPrompt:d(l.showCssOverview),title:d(l.cssOverview),order:95,persistence:"closeable",async loadView(){const e=await async function(){return m||(m=await import("../../panels/css_overview/css_overview.js")),m}();return new e.CSSOverviewPanel.CSSOverviewPanel(new e.CSSOverviewController.OverviewController)},isPreviewFeature:!0});const p={showElements:"Show Elements",elements:"Elements",showEventListeners:"Show Event Listeners",eventListeners:"Event Listeners",showProperties:"Show Properties",properties:"Properties",showStackTrace:"Show Stack Trace",stackTrace:"Stack Trace",showLayout:"Show Layout",layout:"Layout",hideElement:"Hide element",editAsHtml:"Edit as HTML",duplicateElement:"Duplicate element",undo:"Undo",redo:"Redo",captureAreaScreenshot:"Capture area screenshot",selectAnElementInThePageTo:"Select an element in the page to inspect it",wordWrap:"Word wrap",enableDomWordWrap:"Enable `DOM` word wrap",disableDomWordWrap:"Disable `DOM` word wrap",showHtmlComments:"Show `HTML` comments",hideHtmlComments:"Hide `HTML` comments",revealDomNodeOnHover:"Reveal `DOM` node on hover",showDetailedInspectTooltip:"Show detailed inspect tooltip",showCSSDocumentationTooltip:"Show CSS documentation tooltip",copyStyles:"Copy styles",showUserAgentShadowDOM:"Show user agent shadow `DOM`",showComputedStyles:"Show Computed Styles",showStyles:"Show Styles",toggleEyeDropper:"Toggle eye dropper"},w=e.i18n.registerUIStrings("panels/elements/elements-meta.ts",p),u=e.i18n.getLazilyComputedLocalizedString.bind(void 0,w);let y,S;async function h(){return y||(y=await import("../../panels/elements/elements.js")),y}function A(e){return void 0===y?[]:e(y)}t.ViewManager.registerViewExtension({location:"panel",id:"elements",commandPrompt:u(p.showElements),title:u(p.elements),order:10,persistence:"permanent",hasToolbar:!1,loadView:async()=>(await h()).ElementsPanel.ElementsPanel.instance()}),t.ActionRegistration.registerActionExtension({actionId:"elements.show-styles",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.showStyles),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({actionId:"elements.show-computed",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.showComputedStyles),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance()}),t.ViewManager.registerViewExtension({location:"elements-sidebar",id:"elements.eventListeners",commandPrompt:u(p.showEventListeners),title:u(p.eventListeners),order:5,hasToolbar:!0,persistence:"permanent",loadView:async()=>(await h()).EventListenersWidget.EventListenersWidget.instance()}),t.ViewManager.registerViewExtension({location:"elements-sidebar",id:"elements.domProperties",commandPrompt:u(p.showProperties),title:u(p.properties),order:7,persistence:"permanent",loadView:async()=>(await h()).PropertiesWidget.PropertiesWidget.instance()}),t.ViewManager.registerViewExtension({experiment:o.Runtime.ExperimentName.CAPTURE_NODE_CREATION_STACKS,location:"elements-sidebar",id:"elements.domCreation",commandPrompt:u(p.showStackTrace),title:u(p.stackTrace),order:10,persistence:"permanent",loadView:async()=>(await h()).NodeStackTraceWidget.NodeStackTraceWidget.instance()}),t.ViewManager.registerViewExtension({location:"elements-sidebar",id:"elements.layout",commandPrompt:u(p.showLayout),title:u(p.layout),order:4,persistence:"permanent",loadView:async()=>(await async function(){return S||(S=await import("../../panels/elements/components/components.js")),S}()).LayoutPane.LayoutPane.instance().wrapper}),t.ActionRegistration.registerActionExtension({actionId:"elements.hide-element",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.hideElement),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"H"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.toggle-eye-dropper",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.toggleEyeDropper),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ColorSwatchPopoverIcon.ColorSwatchPopoverIcon])),bindings:[{shortcut:"c"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.edit-as-html",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.editAsHtml),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"F2"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.duplicate-element",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.duplicateElement),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"Shift+Alt+Down"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.copy-styles",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.copyStyles),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"Ctrl+Alt+C",platform:"windows,linux"},{shortcut:"Meta+Alt+C",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.undo",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.undo),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"Ctrl+Z",platform:"windows,linux"},{shortcut:"Meta+Z",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.redo",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.redo),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"Ctrl+Y",platform:"windows,linux"},{shortcut:"Meta+Shift+Z",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.capture-area-screenshot",loadActionDelegate:async()=>(await h()).InspectElementModeController.ToggleSearchActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:u(p.captureAreaScreenshot),category:t.ActionRegistration.ActionCategory.SCREENSHOT}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.ELEMENTS,actionId:"elements.toggle-element-search",toggleable:!0,loadActionDelegate:async()=>(await h()).InspectElementModeController.ToggleSearchActionDelegate.instance(),title:u(p.selectAnElementInThePageTo),iconClass:"select-element",bindings:[{shortcut:"Ctrl+Shift+C",platform:"windows,linux"},{shortcut:"Meta+Shift+C",platform:"mac"}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:1,title:u(p.showUserAgentShadowDOM),settingName:"showUAShadowDOM",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:2,title:u(p.wordWrap),settingName:"domWordWrap",settingType:i.Settings.SettingType.BOOLEAN,options:[{value:!0,title:u(p.enableDomWordWrap)},{value:!1,title:u(p.disableDomWordWrap)}],defaultValue:!0}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:3,title:u(p.showHtmlComments),settingName:"showHTMLComments",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0,options:[{value:!0,title:u(p.showHtmlComments)},{value:!1,title:u(p.hideHtmlComments)}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:4,title:u(p.revealDomNodeOnHover),settingName:"highlightNodeOnHoverInOverlay",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:5,title:u(p.showDetailedInspectTooltip),settingName:"showDetailedInspectTooltip",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0}),i.Settings.registerSettingExtension({settingName:"showEventListenersForAncestors",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ADORNER,storageType:i.Settings.SettingStorageType.Synced,settingName:"adornerSettings",settingType:i.Settings.SettingType.ARRAY,defaultValue:[]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,title:u(p.showCSSDocumentationTooltip),settingName:"showCSSPropertyDocumentationOnHover",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0}),t.ContextMenu.registerProvider({contextTypes:()=>[n.RemoteObject.RemoteObject,n.DOMModel.DOMNode,n.DOMModel.DeferredDOMNode],loadProvider:async()=>(await h()).ElementsPanel.ContextMenuProvider.instance(),experiment:void 0}),t.ViewManager.registerLocationResolver({name:"elements-sidebar",category:t.ViewManager.ViewLocationCategory.ELEMENTS,loadResolver:async()=>(await h()).ElementsPanel.ElementsPanel.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[n.DOMModel.DOMNode,n.DOMModel.DeferredDOMNode,n.RemoteObject.RemoteObject],destination:i.Revealer.RevealerDestination.ELEMENTS_PANEL,loadRevealer:async()=>(await h()).ElementsPanel.DOMNodeRevealer.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[n.CSSProperty.CSSProperty],destination:i.Revealer.RevealerDestination.STYLES_SIDEBAR,loadRevealer:async()=>(await h()).ElementsPanel.CSSPropertyRevealer.instance()}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await h()).LayersWidget.ButtonProvider.instance(),order:1,location:t.Toolbar.ToolbarItemLocation.STYLES_SIDEBARPANE_TOOLBAR,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await h()).ElementStatePaneWidget.ButtonProvider.instance(),order:2,location:t.Toolbar.ToolbarItemLocation.STYLES_SIDEBARPANE_TOOLBAR,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await h()).ClassesPaneWidget.ButtonProvider.instance(),order:3,location:t.Toolbar.ToolbarItemLocation.STYLES_SIDEBARPANE_TOOLBAR,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await h()).StylesSidebarPane.ButtonProvider.instance(),order:100,location:t.Toolbar.ToolbarItemLocation.STYLES_SIDEBARPANE_TOOLBAR,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({actionId:"elements.toggle-element-search",location:t.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,order:0,showLabel:void 0,condition:void 0,separator:void 0,loadItem:void 0}),t.UIUtils.registerRenderer({contextTypes:()=>[n.DOMModel.DOMNode,n.DOMModel.DeferredDOMNode],loadRenderer:async()=>(await h()).ElementsTreeOutline.Renderer.instance()}),i.Linkifier.registerLinkifier({contextTypes:()=>[n.DOMModel.DOMNode,n.DOMModel.DeferredDOMNode],loadLinkifier:async()=>(await h()).DOMLinkifier.Linkifier.instance()});const E={showEventListenerBreakpoints:"Show Event Listener Breakpoints",eventListenerBreakpoints:"Event Listener Breakpoints",showCspViolationBreakpoints:"Show CSP Violation Breakpoints",cspViolationBreakpoints:"CSP Violation Breakpoints",showXhrfetchBreakpoints:"Show XHR/fetch Breakpoints",xhrfetchBreakpoints:"XHR/fetch Breakpoints",showDomBreakpoints:"Show DOM Breakpoints",domBreakpoints:"DOM Breakpoints",showGlobalListeners:"Show Global Listeners",globalListeners:"Global Listeners",page:"Page",showPage:"Show Page",overrides:"Overrides",showOverrides:"Show Overrides",contentScripts:"Content scripts",showContentScripts:"Show Content scripts"},R=e.i18n.registerUIStrings("panels/browser_debugger/browser_debugger-meta.ts",E),v=e.i18n.getLazilyComputedLocalizedString.bind(void 0,R);let T,P;async function C(){return T||(T=await import("../../panels/browser_debugger/browser_debugger.js")),T}async function b(){return P||(P=await import("../../panels/sources/sources.js")),P}t.ViewManager.registerViewExtension({loadView:async()=>(await C()).EventListenerBreakpointsSidebarPane.EventListenerBreakpointsSidebarPane.instance(),id:"sources.eventListenerBreakpoints",location:"sources.sidebar-bottom",commandPrompt:v(E.showEventListenerBreakpoints),title:v(E.eventListenerBreakpoints),order:9,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).CSPViolationBreakpointsSidebarPane.CSPViolationBreakpointsSidebarPane.instance(),id:"sources.cspViolationBreakpoints",location:"sources.sidebar-bottom",commandPrompt:v(E.showCspViolationBreakpoints),title:v(E.cspViolationBreakpoints),order:10,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).XHRBreakpointsSidebarPane.XHRBreakpointsSidebarPane.instance(),id:"sources.xhrBreakpoints",location:"sources.sidebar-bottom",commandPrompt:v(E.showXhrfetchBreakpoints),title:v(E.xhrfetchBreakpoints),order:5,persistence:"permanent",hasToolbar:!0}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance(),id:"sources.domBreakpoints",location:"sources.sidebar-bottom",commandPrompt:v(E.showDomBreakpoints),title:v(E.domBreakpoints),order:7,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).ObjectEventListenersSidebarPane.ObjectEventListenersSidebarPane.instance(),id:"sources.globalListeners",location:"sources.sidebar-bottom",commandPrompt:v(E.showGlobalListeners),title:v(E.globalListeners),order:8,persistence:"permanent",hasToolbar:!0}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance(),id:"elements.domBreakpoints",location:"elements-sidebar",commandPrompt:v(E.showDomBreakpoints),title:v(E.domBreakpoints),order:6,persistence:"permanent"}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-network",title:v(E.page),commandPrompt:v(E.showPage),order:2,persistence:"permanent",loadView:async()=>(await b()).SourcesNavigator.NetworkNavigatorView.instance()}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-overrides",title:v(E.overrides),commandPrompt:v(E.showOverrides),order:4,persistence:"permanent",loadView:async()=>(await b()).SourcesNavigator.OverridesNavigatorView.instance()}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-contentScripts",title:v(E.contentScripts),commandPrompt:v(E.showContentScripts),order:5,persistence:"permanent",loadView:async()=>(await b()).SourcesNavigator.ContentScriptsNavigatorView.instance()}),t.ContextMenu.registerProvider({contextTypes:()=>[n.DOMModel.DOMNode],loadProvider:async()=>(await C()).DOMBreakpointsSidebarPane.ContextMenuProvider.instance(),experiment:void 0}),t.Context.registerListener({contextTypes:()=>[n.DebuggerModel.DebuggerPausedDetails],loadListener:async()=>(await C()).XHRBreakpointsSidebarPane.XHRBreakpointsSidebarPane.instance()}),t.Context.registerListener({contextTypes:()=>[n.DebuggerModel.DebuggerPausedDetails],loadListener:async()=>(await C()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance()});const f={showNetwork:"Show Network",network:"Network",showNetworkRequestBlocking:"Show Network request blocking",networkRequestBlocking:"Network request blocking",showNetworkConditions:"Show Network conditions",networkConditions:"Network conditions",diskCache:"disk cache",networkThrottling:"network throttling",showSearch:"Show Search",search:"Search",recordNetworkLog:"Record network log",stopRecordingNetworkLog:"Stop recording network log",hideRequestDetails:"Hide request details",colorcodeResourceTypes:"Color-code resource types",colorCode:"color code",resourceType:"resource type",colorCodeByResourceType:"Color code by resource type",useDefaultColors:"Use default colors",groupNetworkLogByFrame:"Group network log by frame",netWork:"network",frame:"frame",group:"group",groupNetworkLogItemsByFrame:"Group network log items by frame",dontGroupNetworkLogItemsByFrame:"Don't group network log items by frame",clear:"Clear network log"},L=e.i18n.registerUIStrings("panels/network/network-meta.ts",f),N=e.i18n.getLazilyComputedLocalizedString.bind(void 0,L);let I;async function M(){return I||(I=await import("../../panels/network/network.js")),I}function D(e){return void 0===I?[]:e(I)}t.ViewManager.registerViewExtension({location:"panel",id:"network",commandPrompt:N(f.showNetwork),title:N(f.network),order:40,loadView:async()=>(await M()).NetworkPanel.NetworkPanel.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"network.blocked-urls",commandPrompt:N(f.showNetworkRequestBlocking),title:N(f.networkRequestBlocking),persistence:"closeable",order:60,loadView:async()=>(await M()).BlockedURLsPane.BlockedURLsPane.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"network.config",commandPrompt:N(f.showNetworkConditions),title:N(f.networkConditions),persistence:"closeable",order:40,tags:[N(f.diskCache),N(f.networkThrottling),e.i18n.lockedLazyString("useragent"),e.i18n.lockedLazyString("user agent"),e.i18n.lockedLazyString("user-agent")],loadView:async()=>(await M()).NetworkConfigView.NetworkConfigView.instance()}),t.ViewManager.registerViewExtension({location:"network-sidebar",id:"network.search-network-tab",commandPrompt:N(f.showSearch),title:N(f.search),persistence:"permanent",loadView:async()=>(await M()).NetworkPanel.SearchNetworkView.instance()}),t.ActionRegistration.registerActionExtension({actionId:"network.toggle-recording",category:t.ActionRegistration.ActionCategory.NETWORK,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>D((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await M()).NetworkPanel.ActionDelegate.instance(),options:[{value:!0,title:N(f.recordNetworkLog)},{value:!1,title:N(f.stopRecordingNetworkLog)}],bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.clear",category:t.ActionRegistration.ActionCategory.NETWORK,title:N(f.clear),iconClass:"clear",loadActionDelegate:async()=>(await M()).NetworkPanel.ActionDelegate.instance(),contextTypes:()=>D((e=>[e.NetworkPanel.NetworkPanel])),bindings:[{shortcut:"Ctrl+L"},{shortcut:"Meta+K",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.hide-request-details",category:t.ActionRegistration.ActionCategory.NETWORK,title:N(f.hideRequestDetails),contextTypes:()=>D((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await M()).NetworkPanel.ActionDelegate.instance(),bindings:[{shortcut:"Esc"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.search",category:t.ActionRegistration.ActionCategory.NETWORK,title:N(f.search),contextTypes:()=>D((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await M()).NetworkPanel.ActionDelegate.instance(),bindings:[{platform:"mac",shortcut:"Meta+F",keybindSets:["devToolsDefault","vsCode"]},{platform:"windows,linux",shortcut:"Ctrl+F",keybindSets:["devToolsDefault","vsCode"]}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.NETWORK,storageType:i.Settings.SettingStorageType.Synced,title:N(f.colorcodeResourceTypes),settingName:"networkColorCodeResourceTypes",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[N(f.colorCode),N(f.resourceType)],options:[{value:!0,title:N(f.colorCodeByResourceType)},{value:!1,title:N(f.useDefaultColors)}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.NETWORK,storageType:i.Settings.SettingStorageType.Synced,title:N(f.groupNetworkLogByFrame),settingName:"network.group-by-frame",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[N(f.netWork),N(f.frame),N(f.group)],options:[{value:!0,title:N(f.groupNetworkLogItemsByFrame)},{value:!1,title:N(f.dontGroupNetworkLogItemsByFrame)}]}),t.ViewManager.registerLocationResolver({name:"network-sidebar",category:t.ViewManager.ViewLocationCategory.NETWORK,loadResolver:async()=>(await M()).NetworkPanel.NetworkPanel.instance()}),t.ContextMenu.registerProvider({contextTypes:()=>[n.NetworkRequest.NetworkRequest,n.Resource.Resource,a.UISourceCode.UISourceCode],loadProvider:async()=>(await M()).NetworkPanel.ContextMenuProvider.instance(),experiment:void 0}),i.Revealer.registerRevealer({contextTypes:()=>[n.NetworkRequest.NetworkRequest],destination:i.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await M()).NetworkPanel.RequestRevealer.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[r.UIRequestLocation.UIRequestLocation],loadRevealer:async()=>(await M()).NetworkPanel.RequestLocationRevealer.instance(),destination:void 0}),i.Revealer.registerRevealer({contextTypes:()=>[r.NetworkRequestId.NetworkRequestId],destination:i.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await M()).NetworkPanel.RequestIdRevealer.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[r.UIFilter.UIRequestFilter],destination:i.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await M()).NetworkPanel.NetworkLogWithFilterRevealer.instance()});const x={security:"Security",showSecurity:"Show Security"},k=e.i18n.registerUIStrings("panels/security/security-meta.ts",x),V=e.i18n.getLazilyComputedLocalizedString.bind(void 0,k);let O;t.ViewManager.registerViewExtension({location:"panel",id:"security",title:V(x.security),commandPrompt:V(x.showSecurity),order:80,persistence:"closeable",loadView:async()=>(await async function(){return O||(O=await import("../../panels/security/security.js")),O}()).SecurityPanel.SecurityPanel.instance()});const B={toggleDeviceToolbar:"Toggle device toolbar",captureScreenshot:"Capture screenshot",captureFullSizeScreenshot:"Capture full size screenshot",captureNodeScreenshot:"Capture node screenshot",showMediaQueries:"Show media queries",device:"device",hideMediaQueries:"Hide media queries",showRulers:"Show rulers in the Device Mode toolbar",hideRulers:"Hide rulers in the Device Mode toolbar",showDeviceFrame:"Show device frame",hideDeviceFrame:"Hide device frame"},_=e.i18n.registerUIStrings("panels/emulation/emulation-meta.ts",B),U=e.i18n.getLazilyComputedLocalizedString.bind(void 0,_);let z;async function W(){return z||(z=await import("../../panels/emulation/emulation.js")),z}t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.MOBILE,actionId:"emulation.toggle-device-mode",toggleable:!0,loadActionDelegate:async()=>(await W()).DeviceModeWrapper.ActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:U(B.toggleDeviceToolbar),iconClass:"devices",bindings:[{platform:"windows,linux",shortcut:"Shift+Ctrl+M"},{platform:"mac",shortcut:"Shift+Meta+M"}]}),t.ActionRegistration.registerActionExtension({actionId:"emulation.capture-screenshot",category:t.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await W()).DeviceModeWrapper.ActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:U(B.captureScreenshot)}),t.ActionRegistration.registerActionExtension({actionId:"emulation.capture-full-height-screenshot",category:t.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await W()).DeviceModeWrapper.ActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:U(B.captureFullSizeScreenshot)}),t.ActionRegistration.registerActionExtension({actionId:"emulation.capture-node-screenshot",category:t.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await W()).DeviceModeWrapper.ActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:U(B.captureNodeScreenshot)}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.MOBILE,settingName:"showMediaQueryInspector",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:U(B.showMediaQueries)},{value:!1,title:U(B.hideMediaQueries)}],tags:[U(B.device)]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.MOBILE,settingName:"emulation.showRulers",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:U(B.showRulers)},{value:!1,title:U(B.hideRulers)}],tags:[U(B.device)]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.MOBILE,settingName:"emulation.showDeviceOutline",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:U(B.showDeviceFrame)},{value:!1,title:U(B.hideDeviceFrame)}],tags:[U(B.device)]}),t.Toolbar.registerToolbarItem({actionId:"emulation.toggle-device-mode",condition:o.Runtime.ConditionName.CAN_DOCK,location:t.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,order:1,showLabel:void 0,loadItem:void 0,separator:void 0}),i.AppProvider.registerAppProvider({loadAppProvider:async()=>(await W()).AdvancedApp.AdvancedAppProvider.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,order:0}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.DEVICE_MODE_MENU_SAVE,order:12,actionId:"emulation.capture-screenshot"}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.DEVICE_MODE_MENU_SAVE,order:13,actionId:"emulation.capture-full-height-screenshot"});const F={sensors:"Sensors",geolocation:"geolocation",timezones:"timezones",locale:"locale",locales:"locales",accelerometer:"accelerometer",deviceOrientation:"device orientation",locations:"Locations",touch:"Touch",devicebased:"Device-based",forceEnabled:"Force enabled",emulateIdleDetectorState:"Emulate Idle Detector state",noIdleEmulation:"No idle emulation",userActiveScreenUnlocked:"User active, screen unlocked",userActiveScreenLocked:"User active, screen locked",userIdleScreenUnlocked:"User idle, screen unlocked",userIdleScreenLocked:"User idle, screen locked",showSensors:"Show Sensors",showLocations:"Show Locations"},j=e.i18n.registerUIStrings("panels/sensors/sensors-meta.ts",F),H=e.i18n.getLazilyComputedLocalizedString.bind(void 0,j);let K,q;async function G(){return K||(K=await import("../../panels/sensors/sensors.js")),K}t.ViewManager.registerViewExtension({location:"drawer-view",commandPrompt:H(F.showSensors),title:H(F.sensors),id:"sensors",persistence:"closeable",order:100,loadView:async()=>(await G()).SensorsView.SensorsView.instance(),tags:[H(F.geolocation),H(F.timezones),H(F.locale),H(F.locales),H(F.accelerometer),H(F.deviceOrientation)]}),t.ViewManager.registerViewExtension({location:"settings-view",id:"emulation-locations",commandPrompt:H(F.showLocations),title:H(F.locations),order:40,loadView:async()=>(await G()).LocationsSettingsTab.LocationsSettingsTab.instance(),settings:["emulation.locations"]}),i.Settings.registerSettingExtension({storageType:i.Settings.SettingStorageType.Synced,settingName:"emulation.locations",settingType:i.Settings.SettingType.ARRAY,defaultValue:[{title:"Berlin",lat:52.520007,long:13.404954,timezoneId:"Europe/Berlin",locale:"de-DE"},{title:"London",lat:51.507351,long:-.127758,timezoneId:"Europe/London",locale:"en-GB"},{title:"Moscow",lat:55.755826,long:37.6173,timezoneId:"Europe/Moscow",locale:"ru-RU"},{title:"Mountain View",lat:37.386052,long:-122.083851,timezoneId:"America/Los_Angeles",locale:"en-US"},{title:"Mumbai",lat:19.075984,long:72.877656,timezoneId:"Asia/Kolkata",locale:"mr-IN"},{title:"San Francisco",lat:37.774929,long:-122.419416,timezoneId:"America/Los_Angeles",locale:"en-US"},{title:"Shanghai",lat:31.230416,long:121.473701,timezoneId:"Asia/Shanghai",locale:"zh-Hans-CN"},{title:"São Paulo",lat:-23.55052,long:-46.633309,timezoneId:"America/Sao_Paulo",locale:"pt-BR"},{title:"Tokyo",lat:35.689487,long:139.691706,timezoneId:"Asia/Tokyo",locale:"ja-JP"}]}),i.Settings.registerSettingExtension({title:H(F.touch),reloadRequired:!0,settingName:"emulation.touch",settingType:i.Settings.SettingType.ENUM,defaultValue:"none",options:[{value:"none",title:H(F.devicebased),text:H(F.devicebased)},{value:"force",title:H(F.forceEnabled),text:H(F.forceEnabled)}]}),i.Settings.registerSettingExtension({title:H(F.emulateIdleDetectorState),settingName:"emulation.idleDetection",settingType:i.Settings.SettingType.ENUM,defaultValue:"none",options:[{value:"none",title:H(F.noIdleEmulation),text:H(F.noIdleEmulation)},{value:'{"isUserActive":true,"isScreenUnlocked":true}',title:H(F.userActiveScreenUnlocked),text:H(F.userActiveScreenUnlocked)},{value:'{"isUserActive":true,"isScreenUnlocked":false}',title:H(F.userActiveScreenLocked),text:H(F.userActiveScreenLocked)},{value:'{"isUserActive":false,"isScreenUnlocked":true}',title:H(F.userIdleScreenUnlocked),text:H(F.userIdleScreenUnlocked)},{value:'{"isUserActive":false,"isScreenUnlocked":false}',title:H(F.userIdleScreenLocked),text:H(F.userIdleScreenLocked)}]});const Y={accessibility:"Accessibility",shoAccessibility:"Show Accessibility"},J=e.i18n.registerUIStrings("panels/accessibility/accessibility-meta.ts",Y),X=e.i18n.getLazilyComputedLocalizedString.bind(void 0,J);let Q;t.ViewManager.registerViewExtension({location:"elements-sidebar",id:"accessibility.view",title:X(Y.accessibility),commandPrompt:X(Y.shoAccessibility),order:10,persistence:"permanent",loadView:async()=>(await async function(){return q||(q=await import("../../panels/accessibility/accessibility.js")),q}()).AccessibilitySidebarView.AccessibilitySidebarView.instance()});const Z={animations:"Animations",showAnimations:"Show Animations"},$=e.i18n.registerUIStrings("panels/animation/animation-meta.ts",Z),ee=e.i18n.getLazilyComputedLocalizedString.bind(void 0,$);t.ViewManager.registerViewExtension({location:"drawer-view",id:"animations",title:ee(Z.animations),commandPrompt:ee(Z.showAnimations),persistence:"closeable",order:0,loadView:async()=>(await async function(){return Q||(Q=await import("../../panels/animation/animation.js")),Q}()).AnimationTimeline.AnimationTimeline.instance()});const te={developerResources:"Developer Resources",showDeveloperResources:"Show Developer Resources"},ie=e.i18n.registerUIStrings("panels/developer_resources/developer_resources-meta.ts",te),oe=e.i18n.getLazilyComputedLocalizedString.bind(void 0,ie);let ne;t.ViewManager.registerViewExtension({location:"drawer-view",id:"resource-loading-pane",title:oe(te.developerResources),commandPrompt:oe(te.showDeveloperResources),order:100,persistence:"closeable",experiment:o.Runtime.ExperimentName.DEVELOPER_RESOURCES_VIEW,loadView:async()=>new((await async function(){return ne||(ne=await import("../../panels/developer_resources/developer_resources.js")),ne}()).DeveloperResourcesView.DeveloperResourcesView)});const ae={rendering:"Rendering",showRendering:"Show Rendering",paint:"paint",layout:"layout",fps:"fps",cssMediaType:"CSS media type",cssMediaFeature:"CSS media feature",visionDeficiency:"vision deficiency",colorVisionDeficiency:"color vision deficiency",reloadPage:"Reload page",hardReloadPage:"Hard reload page",forceAdBlocking:"Force ad blocking on this site",blockAds:"Block ads on this site",showAds:"Show ads on this site, if allowed",autoOpenDevTools:"Auto-open DevTools for popups",doNotAutoOpen:"Do not auto-open DevTools for popups",disablePaused:"Disable paused state overlay",toggleCssPrefersColorSchemeMedia:"Toggle CSS media feature prefers-color-scheme"},re=e.i18n.registerUIStrings("entrypoints/inspector_main/inspector_main-meta.ts",ae),se=e.i18n.getLazilyComputedLocalizedString.bind(void 0,re);let ce;async function le(){return ce||(ce=await import("../inspector_main/inspector_main.js")),ce}t.ViewManager.registerViewExtension({location:"drawer-view",id:"rendering",title:se(ae.rendering),commandPrompt:se(ae.showRendering),persistence:"closeable",order:50,loadView:async()=>(await le()).RenderingOptions.RenderingOptionsView.instance(),tags:[se(ae.paint),se(ae.layout),se(ae.fps),se(ae.cssMediaType),se(ae.cssMediaFeature),se(ae.visionDeficiency),se(ae.colorVisionDeficiency)]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.NAVIGATION,actionId:"inspector_main.reload",loadActionDelegate:async()=>(await le()).InspectorMain.ReloadActionDelegate.instance(),iconClass:"refresh",title:se(ae.reloadPage),bindings:[{platform:"windows,linux",shortcut:"Ctrl+R"},{platform:"windows,linux",shortcut:"F5"},{platform:"mac",shortcut:"Meta+R"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.NAVIGATION,actionId:"inspector_main.hard-reload",loadActionDelegate:async()=>(await le()).InspectorMain.ReloadActionDelegate.instance(),title:se(ae.hardReloadPage),bindings:[{platform:"windows,linux",shortcut:"Shift+Ctrl+R"},{platform:"windows,linux",shortcut:"Shift+F5"},{platform:"windows,linux",shortcut:"Ctrl+F5"},{platform:"windows,linux",shortcut:"Ctrl+Shift+F5"},{platform:"mac",shortcut:"Shift+Meta+R"}]}),t.ActionRegistration.registerActionExtension({actionId:"rendering.toggle-prefers-color-scheme",category:t.ActionRegistration.ActionCategory.RENDERING,title:se(ae.toggleCssPrefersColorSchemeMedia),loadActionDelegate:async()=>(await le()).RenderingOptions.ReloadActionDelegate.instance()}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.NETWORK,title:se(ae.forceAdBlocking),settingName:"network.adBlockingEnabled",settingType:i.Settings.SettingType.BOOLEAN,storageType:i.Settings.SettingStorageType.Session,defaultValue:!1,options:[{value:!0,title:se(ae.blockAds)},{value:!1,title:se(ae.showAds)}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.GLOBAL,storageType:i.Settings.SettingStorageType.Synced,title:se(ae.autoOpenDevTools),settingName:"autoAttachToCreatedPages",settingType:i.Settings.SettingType.BOOLEAN,order:2,defaultValue:!1,options:[{value:!0,title:se(ae.autoOpenDevTools)},{value:!1,title:se(ae.doNotAutoOpen)}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.APPEARANCE,storageType:i.Settings.SettingStorageType.Synced,title:se(ae.disablePaused),settingName:"disablePausedStateOverlay",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await le()).InspectorMain.NodeIndicator.instance(),order:2,location:t.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await le()).OutermostTargetSelector.OutermostTargetSelector.instance(),order:98,location:t.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_RIGHT,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0,experiment:o.Runtime.ExperimentName.OUTERMOST_TARGET_SELECTOR});const ge={application:"Application",showApplication:"Show Application",pwa:"pwa",clearSiteData:"Clear site data",clearSiteDataIncludingThirdparty:"Clear site data (including third-party cookies)",startRecordingEvents:"Start recording events",stopRecordingEvents:"Stop recording events"},de=e.i18n.registerUIStrings("panels/application/application-meta.ts",ge),me=e.i18n.getLazilyComputedLocalizedString.bind(void 0,de);let pe;async function we(){return pe||(pe=await import("../../panels/application/application.js")),pe}t.ViewManager.registerViewExtension({location:"panel",id:"resources",title:me(ge.application),commandPrompt:me(ge.showApplication),order:70,loadView:async()=>(await we()).ResourcesPanel.ResourcesPanel.instance(),tags:[me(ge.pwa)]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.RESOURCES,actionId:"resources.clear",title:me(ge.clearSiteData),loadActionDelegate:async()=>(await we()).StorageView.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.RESOURCES,actionId:"resources.clear-incl-third-party-cookies",title:me(ge.clearSiteDataIncludingThirdparty),loadActionDelegate:async()=>(await we()).StorageView.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({actionId:"background-service.toggle-recording",iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===pe?[]:(e=>[e.BackgroundServiceView.BackgroundServiceView])(pe),loadActionDelegate:async()=>(await we()).BackgroundServiceView.ActionDelegate.instance(),category:t.ActionRegistration.ActionCategory.BACKGROUND_SERVICES,options:[{value:!0,title:me(ge.startRecordingEvents)},{value:!1,title:me(ge.stopRecordingEvents)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),i.Revealer.registerRevealer({contextTypes:()=>[n.Resource.Resource],destination:i.Revealer.RevealerDestination.APPLICATION_PANEL,loadRevealer:async()=>(await we()).ResourcesPanel.ResourceRevealer.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[n.ResourceTreeModel.ResourceTreeFrame],destination:i.Revealer.RevealerDestination.APPLICATION_PANEL,loadRevealer:async()=>(await we()).ResourcesPanel.FrameDetailsRevealer.instance()});const ue={issues:"Issues",showIssues:"Show Issues",cspViolations:"CSP Violations",showCspViolations:"Show CSP Violations"},ye=e.i18n.registerUIStrings("panels/issues/issues-meta.ts",ue),Se=e.i18n.getLazilyComputedLocalizedString.bind(void 0,ye);let he;async function Ae(){return he||(he=await import("../../panels/issues/issues.js")),he}t.ViewManager.registerViewExtension({location:"drawer-view",id:"issues-pane",title:Se(ue.issues),commandPrompt:Se(ue.showIssues),order:100,persistence:"closeable",loadView:async()=>(await Ae()).IssuesPane.IssuesPane.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"csp-violations-pane",title:Se(ue.cspViolations),commandPrompt:Se(ue.showCspViolations),order:100,persistence:"closeable",loadView:async()=>(await Ae()).CSPViolationsView.CSPViolationsView.instance(),experiment:o.Runtime.ExperimentName.CSP_VIOLATIONS_VIEW}),i.Revealer.registerRevealer({contextTypes:()=>[s.Issue.Issue],destination:i.Revealer.RevealerDestination.ISSUES_VIEW,loadRevealer:async()=>(await Ae()).IssueRevealer.IssueRevealer.instance()});const Ee={layers:"Layers",showLayers:"Show Layers"},Re=e.i18n.registerUIStrings("panels/layers/layers-meta.ts",Ee),ve=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Re);let Te;t.ViewManager.registerViewExtension({location:"panel",id:"layers",title:ve(Ee.layers),commandPrompt:ve(Ee.showLayers),order:100,persistence:"closeable",loadView:async()=>(await async function(){return Te||(Te=await import("../../panels/layers/layers.js")),Te}()).LayersPanel.LayersPanel.instance()});const Pe={showLighthouse:"Show `Lighthouse`"},Ce=e.i18n.registerUIStrings("panels/lighthouse/lighthouse-meta.ts",Pe),be=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Ce);let fe;t.ViewManager.registerViewExtension({location:"panel",id:"lighthouse",title:e.i18n.lockedLazyString("Lighthouse"),commandPrompt:be(Pe.showLighthouse),order:90,loadView:async()=>(await async function(){return fe||(fe=await import("../../panels/lighthouse/lighthouse.js")),fe}()).LighthousePanel.LighthousePanel.instance(),tags:[e.i18n.lockedLazyString("lighthouse"),e.i18n.lockedLazyString("pwa")]});const Le={media:"Media",video:"video",showMedia:"Show Media"},Ne=e.i18n.registerUIStrings("panels/media/media-meta.ts",Le),Ie=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Ne);let Me;t.ViewManager.registerViewExtension({location:"panel",id:"medias",title:Ie(Le.media),commandPrompt:Ie(Le.showMedia),persistence:"closeable",order:100,loadView:async()=>(await async function(){return Me||(Me=await import("../../panels/media/media.js")),Me}()).MainView.MainView.instance(),tags:[Ie(Le.media),Ie(Le.video)]});const De={throttling:"Throttling",showThrottling:"Show Throttling",goOffline:"Go offline",device:"device",throttlingTag:"throttling",enableSlowGThrottling:"Enable slow `3G` throttling",enableFastGThrottling:"Enable fast `3G` throttling",goOnline:"Go online"},xe=e.i18n.registerUIStrings("panels/mobile_throttling/mobile_throttling-meta.ts",De),ke=e.i18n.getLazilyComputedLocalizedString.bind(void 0,xe);let Ve;async function Oe(){return Ve||(Ve=await import("../../panels/mobile_throttling/mobile_throttling.js")),Ve}t.ViewManager.registerViewExtension({location:"settings-view",id:"throttling-conditions",title:ke(De.throttling),commandPrompt:ke(De.showThrottling),order:35,loadView:async()=>(await Oe()).ThrottlingSettingsTab.ThrottlingSettingsTab.instance(),settings:["customNetworkConditions"]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-offline",category:t.ActionRegistration.ActionCategory.NETWORK,title:ke(De.goOffline),loadActionDelegate:async()=>(await Oe()).ThrottlingManager.ActionDelegate.instance(),tags:[ke(De.device),ke(De.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-low-end-mobile",category:t.ActionRegistration.ActionCategory.NETWORK,title:ke(De.enableSlowGThrottling),loadActionDelegate:async()=>(await Oe()).ThrottlingManager.ActionDelegate.instance(),tags:[ke(De.device),ke(De.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-mid-tier-mobile",category:t.ActionRegistration.ActionCategory.NETWORK,title:ke(De.enableFastGThrottling),loadActionDelegate:async()=>(await Oe()).ThrottlingManager.ActionDelegate.instance(),tags:[ke(De.device),ke(De.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-online",category:t.ActionRegistration.ActionCategory.NETWORK,title:ke(De.goOnline),loadActionDelegate:async()=>(await Oe()).ThrottlingManager.ActionDelegate.instance(),tags:[ke(De.device),ke(De.throttlingTag)]}),i.Settings.registerSettingExtension({storageType:i.Settings.SettingStorageType.Synced,settingName:"customNetworkConditions",settingType:i.Settings.SettingType.ARRAY,defaultValue:[]});const Be={performanceMonitor:"Performance monitor",performance:"performance",systemMonitor:"system monitor",monitor:"monitor",activity:"activity",metrics:"metrics",showPerformanceMonitor:"Show Performance monitor"},_e=e.i18n.registerUIStrings("panels/performance_monitor/performance_monitor-meta.ts",Be),Ue=e.i18n.getLazilyComputedLocalizedString.bind(void 0,_e);let ze;t.ViewManager.registerViewExtension({location:"drawer-view",id:"performance.monitor",title:Ue(Be.performanceMonitor),commandPrompt:Ue(Be.showPerformanceMonitor),persistence:"closeable",order:100,loadView:async()=>(await async function(){return ze||(ze=await import("../../panels/performance_monitor/performance_monitor.js")),ze}()).PerformanceMonitor.PerformanceMonitorImpl.instance(),tags:[Ue(Be.performance),Ue(Be.systemMonitor),Ue(Be.monitor),Ue(Be.activity),Ue(Be.metrics)]});const We={performance:"Performance",showPerformance:"Show Performance",javascriptProfiler:"JavaScript Profiler",showJavascriptProfiler:"Show JavaScript Profiler",record:"Record",stop:"Stop",startProfilingAndReloadPage:"Start profiling and reload page",saveProfile:"Save profile…",loadProfile:"Load profile…",previousFrame:"Previous frame",nextFrame:"Next frame",showRecentTimelineSessions:"Show recent timeline sessions",previousRecording:"Previous recording",nextRecording:"Next recording",hideChromeFrameInLayersView:"Hide `chrome` frame in Layers view",startStopRecording:"Start/stop recording"},Fe=e.i18n.registerUIStrings("panels/timeline/timeline-meta.ts",We),je=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Fe);let He,Ke;async function qe(){return He||(He=await import("../../panels/timeline/timeline.js")),He}async function Ge(){return Ke||(Ke=await import("../../panels/profiler/profiler.js")),Ke}function Ye(e){return void 0===He?[]:e(He)}t.ViewManager.registerViewExtension({location:"panel",id:"timeline",title:je(We.performance),commandPrompt:je(We.showPerformance),order:50,loadView:async()=>(await qe()).TimelinePanel.TimelinePanel.instance()}),t.ViewManager.registerViewExtension({location:"panel",id:"js_profiler",title:je(We.javascriptProfiler),commandPrompt:je(We.showJavascriptProfiler),persistence:"closeable",order:65,experiment:o.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,loadView:async()=>(await Ge()).ProfilesPanel.JSProfilerPanel.instance()}),t.ActionRegistration.registerActionExtension({actionId:"timeline.toggle-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),options:[{value:!0,title:je(We.record)},{value:!1,title:je(We.stop)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.record-reload",iconClass:"refresh",contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:je(We.startProfilingAndReloadPage),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+Shift+E"},{platform:"mac",shortcut:"Meta+Shift+E"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.PERFORMANCE,actionId:"timeline.save-to-file",contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),title:je(We.saveProfile),bindings:[{platform:"windows,linux",shortcut:"Ctrl+S"},{platform:"mac",shortcut:"Meta+S"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.PERFORMANCE,actionId:"timeline.load-from-file",contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),title:je(We.loadProfile),bindings:[{platform:"windows,linux",shortcut:"Ctrl+O"},{platform:"mac",shortcut:"Meta+O"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.jump-to-previous-frame",category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:je(We.previousFrame),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),bindings:[{shortcut:"["}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.jump-to-next-frame",category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:je(We.nextFrame),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),bindings:[{shortcut:"]"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.show-history",loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:je(We.showRecentTimelineSessions),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Ctrl+H"},{platform:"mac",shortcut:"Meta+Y"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.previous-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),title:je(We.previousRecording),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Alt+Left"},{platform:"mac",shortcut:"Meta+Left"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.next-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),title:je(We.nextRecording),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Alt+Right"},{platform:"mac",shortcut:"Meta+Right"}]}),t.ActionRegistration.registerActionExtension({actionId:"profiler.js-toggle-recording",category:t.ActionRegistration.ActionCategory.JAVASCRIPT_PROFILER,title:je(We.startStopRecording),iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===Ke?[]:(e=>[e.ProfilesPanel.JSProfilerPanel])(Ke),loadActionDelegate:async()=>(await Ge()).ProfilesPanel.JSProfilerPanel.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.PERFORMANCE,storageType:i.Settings.SettingStorageType.Synced,title:je(We.hideChromeFrameInLayersView),settingName:"frameViewerHideChromeWindow",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1}),i.Linkifier.registerLinkifier({contextTypes:()=>Ye((e=>[e.CLSLinkifier.CLSRect])),loadLinkifier:async()=>(await qe()).CLSLinkifier.Linkifier.instance()}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.TIMELINE_MENU_OPEN,actionId:"timeline.load-from-file",order:10}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.TIMELINE_MENU_OPEN,actionId:"timeline.save-to-file",order:15});const Je={webaudio:"WebAudio",audio:"audio",showWebaudio:"Show WebAudio"},Xe=e.i18n.registerUIStrings("panels/web_audio/web_audio-meta.ts",Je),Qe=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Xe);let Ze;t.ViewManager.registerViewExtension({location:"drawer-view",id:"web-audio",title:Qe(Je.webaudio),commandPrompt:Qe(Je.showWebaudio),persistence:"closeable",order:100,loadView:async()=>(await async function(){return Ze||(Ze=await import("../../panels/web_audio/web_audio.js")),Ze}()).WebAudioView.WebAudioView.instance(),tags:[Qe(Je.audio)]});const $e={webauthn:"WebAuthn",showWebauthn:"Show WebAuthn"},et=e.i18n.registerUIStrings("panels/webauthn/webauthn-meta.ts",$e),tt=e.i18n.getLazilyComputedLocalizedString.bind(void 0,et);let it;t.ViewManager.registerViewExtension({location:"drawer-view",id:"webauthn-pane",title:tt($e.webauthn),commandPrompt:tt($e.showWebauthn),order:100,persistence:"closeable",loadView:async()=>(await async function(){return it||(it=await import("../../panels/webauthn/webauthn.js")),it}()).WebauthnPane.WebauthnPaneImpl.instance(),experiment:o.Runtime.ExperimentName.WEBAUTHN_PANE});const ot={resetView:"Reset view",switchToPanMode:"Switch to pan mode",switchToRotateMode:"Switch to rotate mode",zoomIn:"Zoom in",zoomOut:"Zoom out",panOrRotateUp:"Pan or rotate up",panOrRotateDown:"Pan or rotate down",panOrRotateLeft:"Pan or rotate left",panOrRotateRight:"Pan or rotate right"},nt=e.i18n.registerUIStrings("panels/layer_viewer/layer_viewer-meta.ts",ot),at=e.i18n.getLazilyComputedLocalizedString.bind(void 0,nt);t.ActionRegistration.registerActionExtension({actionId:"layers.reset-view",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.resetView),bindings:[{shortcut:"0"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.pan-mode",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.switchToPanMode),bindings:[{shortcut:"x"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.rotate-mode",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.switchToRotateMode),bindings:[{shortcut:"v"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.zoom-in",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.zoomIn),bindings:[{shortcut:"Shift+Plus"},{shortcut:"NumpadPlus"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.zoom-out",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.zoomOut),bindings:[{shortcut:"Shift+Minus"},{shortcut:"NumpadMinus"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.up",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.panOrRotateUp),bindings:[{shortcut:"Up"},{shortcut:"w"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.down",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.panOrRotateDown),bindings:[{shortcut:"Down"},{shortcut:"s"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.left",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.panOrRotateLeft),bindings:[{shortcut:"Left"},{shortcut:"a"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.right",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.panOrRotateRight),bindings:[{shortcut:"Right"},{shortcut:"d"}]});const rt={recorder:"Recorder",showRecorder:"Show Recorder",startStopRecording:"Start/Stop recording",createRecording:"Create a new recording",replayRecording:"Replay recording",toggleCode:"Toggle code view"},st=e.i18n.registerUIStrings("panels/recorder/recorder-meta.ts",rt),ct=e.i18n.getLazilyComputedLocalizedString.bind(void 0,st);let lt;async function gt(){return lt||(lt=await import("../../panels/recorder/recorder.js")),lt}function dt(e,t){return void 0===lt?[]:t&<.RecorderPanel.RecorderPanel.instance().isActionPossible(t)?e(lt):[]}t.ViewManager.defaultOptionsForTabs.chrome_recorder=!0,t.ViewManager.registerViewExtension({location:"panel",id:"chrome_recorder",commandPrompt:ct(rt.showRecorder),title:ct(rt.recorder),order:90,persistence:"closeable",isPreviewFeature:!0,loadView:async()=>(await gt()).RecorderPanel.RecorderPanel.instance()}),t.ActionRegistration.registerActionExtension({category:"Recorder",actionId:"chrome_recorder.create-recording",title:ct(rt.createRecording),loadActionDelegate:async()=>(await gt()).RecorderPanel.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({category:"Recorder",actionId:"chrome_recorder.start-recording",title:ct(rt.startStopRecording),contextTypes:()=>dt((e=>[e.RecorderPanel.RecorderPanel]),"chrome_recorder.start-recording"),loadActionDelegate:async()=>(await gt()).RecorderPanel.ActionDelegate.instance(),bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({category:"Recorder",actionId:"chrome_recorder.replay-recording",title:ct(rt.replayRecording),contextTypes:()=>dt((e=>[e.RecorderPanel.RecorderPanel]),"chrome_recorder.replay-recording"),loadActionDelegate:async()=>(await gt()).RecorderPanel.ActionDelegate.instance(),bindings:[{shortcut:"Ctrl+Enter",platform:"windows,linux"},{shortcut:"Meta+Enter",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({category:"Recorder",actionId:"chrome_recorder.toggle-code-view",title:ct(rt.toggleCode),contextTypes:()=>dt((e=>[e.RecorderPanel.RecorderPanel]),"chrome_recorder.toggle-code-view"),loadActionDelegate:async()=>(await gt()).RecorderPanel.ActionDelegate.instance(),bindings:[{shortcut:"Ctrl+B",platform:"windows,linux"},{shortcut:"Meta+B",platform:"mac"}]}),self.runtime=o.Runtime.Runtime.instance({forceNew:!0}),new c.MainImpl.MainImpl; +import"../shell/shell.js";import*as e from"../../core/i18n/i18n.js";import*as t from"../../ui/legacy/legacy.js";import*as i from"../../core/common/common.js";import*as o from"../../core/root/root.js";import*as n from"../../core/sdk/sdk.js";import*as a from"../../models/workspace/workspace.js";import*as r from"../../panels/network/forward/forward.js";import*as s from"../../models/issues_manager/issues_manager.js";import*as c from"../main/main.js";const l={cssOverview:"CSS Overview",showCssOverview:"Show CSS Overview"},g=e.i18n.registerUIStrings("panels/css_overview/css_overview-meta.ts",l),d=e.i18n.getLazilyComputedLocalizedString.bind(void 0,g);let m;t.ViewManager.registerViewExtension({location:"panel",id:"cssoverview",commandPrompt:d(l.showCssOverview),title:d(l.cssOverview),order:95,persistence:"closeable",async loadView(){const e=await async function(){return m||(m=await import("../../panels/css_overview/css_overview.js")),m}();return new e.CSSOverviewPanel.CSSOverviewPanel(new e.CSSOverviewController.OverviewController)},isPreviewFeature:!0});const p={showElements:"Show Elements",elements:"Elements",showEventListeners:"Show Event Listeners",eventListeners:"Event Listeners",showProperties:"Show Properties",properties:"Properties",showStackTrace:"Show Stack Trace",stackTrace:"Stack Trace",showLayout:"Show Layout",layout:"Layout",hideElement:"Hide element",editAsHtml:"Edit as HTML",duplicateElement:"Duplicate element",undo:"Undo",redo:"Redo",captureAreaScreenshot:"Capture area screenshot",selectAnElementInThePageTo:"Select an element in the page to inspect it",wordWrap:"Word wrap",enableDomWordWrap:"Enable `DOM` word wrap",disableDomWordWrap:"Disable `DOM` word wrap",showHtmlComments:"Show `HTML` comments",hideHtmlComments:"Hide `HTML` comments",revealDomNodeOnHover:"Reveal `DOM` node on hover",showDetailedInspectTooltip:"Show detailed inspect tooltip",showCSSDocumentationTooltip:"Show CSS documentation tooltip",copyStyles:"Copy styles",showUserAgentShadowDOM:"Show user agent shadow `DOM`",showComputedStyles:"Show Computed Styles",showStyles:"Show Styles",toggleEyeDropper:"Toggle eye dropper"},w=e.i18n.registerUIStrings("panels/elements/elements-meta.ts",p),u=e.i18n.getLazilyComputedLocalizedString.bind(void 0,w);let y,S;async function h(){return y||(y=await import("../../panels/elements/elements.js")),y}function A(e){return void 0===y?[]:e(y)}t.ViewManager.registerViewExtension({location:"panel",id:"elements",commandPrompt:u(p.showElements),title:u(p.elements),order:10,persistence:"permanent",hasToolbar:!1,loadView:async()=>(await h()).ElementsPanel.ElementsPanel.instance()}),t.ActionRegistration.registerActionExtension({actionId:"elements.show-styles",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.showStyles),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({actionId:"elements.show-computed",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.showComputedStyles),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance()}),t.ViewManager.registerViewExtension({location:"elements-sidebar",id:"elements.eventListeners",commandPrompt:u(p.showEventListeners),title:u(p.eventListeners),order:5,hasToolbar:!0,persistence:"permanent",loadView:async()=>(await h()).EventListenersWidget.EventListenersWidget.instance()}),t.ViewManager.registerViewExtension({location:"elements-sidebar",id:"elements.domProperties",commandPrompt:u(p.showProperties),title:u(p.properties),order:7,persistence:"permanent",loadView:async()=>(await h()).PropertiesWidget.PropertiesWidget.instance()}),t.ViewManager.registerViewExtension({experiment:o.Runtime.ExperimentName.CAPTURE_NODE_CREATION_STACKS,location:"elements-sidebar",id:"elements.domCreation",commandPrompt:u(p.showStackTrace),title:u(p.stackTrace),order:10,persistence:"permanent",loadView:async()=>(await h()).NodeStackTraceWidget.NodeStackTraceWidget.instance()}),t.ViewManager.registerViewExtension({location:"elements-sidebar",id:"elements.layout",commandPrompt:u(p.showLayout),title:u(p.layout),order:4,persistence:"permanent",loadView:async()=>(await async function(){return S||(S=await import("../../panels/elements/components/components.js")),S}()).LayoutPane.LayoutPane.instance().wrapper}),t.ActionRegistration.registerActionExtension({actionId:"elements.hide-element",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.hideElement),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"H"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.toggle-eye-dropper",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.toggleEyeDropper),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ColorSwatchPopoverIcon.ColorSwatchPopoverIcon])),bindings:[{shortcut:"c"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.edit-as-html",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.editAsHtml),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"F2"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.duplicate-element",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.duplicateElement),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"Shift+Alt+Down"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.copy-styles",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.copyStyles),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"Ctrl+Alt+C",platform:"windows,linux"},{shortcut:"Meta+Alt+C",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.undo",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.undo),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"Ctrl+Z",platform:"windows,linux"},{shortcut:"Meta+Z",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.redo",category:t.ActionRegistration.ActionCategory.ELEMENTS,title:u(p.redo),loadActionDelegate:async()=>(await h()).ElementsPanel.ElementsActionDelegate.instance(),contextTypes:()=>A((e=>[e.ElementsPanel.ElementsPanel])),bindings:[{shortcut:"Ctrl+Y",platform:"windows,linux"},{shortcut:"Meta+Shift+Z",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"elements.capture-area-screenshot",loadActionDelegate:async()=>(await h()).InspectElementModeController.ToggleSearchActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:u(p.captureAreaScreenshot),category:t.ActionRegistration.ActionCategory.SCREENSHOT}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.ELEMENTS,actionId:"elements.toggle-element-search",toggleable:!0,loadActionDelegate:async()=>(await h()).InspectElementModeController.ToggleSearchActionDelegate.instance(),title:u(p.selectAnElementInThePageTo),iconClass:"select-element",bindings:[{shortcut:"Ctrl+Shift+C",platform:"windows,linux"},{shortcut:"Meta+Shift+C",platform:"mac"}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:1,title:u(p.showUserAgentShadowDOM),settingName:"showUAShadowDOM",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:2,title:u(p.wordWrap),settingName:"domWordWrap",settingType:i.Settings.SettingType.BOOLEAN,options:[{value:!0,title:u(p.enableDomWordWrap)},{value:!1,title:u(p.disableDomWordWrap)}],defaultValue:!0}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:3,title:u(p.showHtmlComments),settingName:"showHTMLComments",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0,options:[{value:!0,title:u(p.showHtmlComments)},{value:!1,title:u(p.hideHtmlComments)}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:4,title:u(p.revealDomNodeOnHover),settingName:"highlightNodeOnHoverInOverlay",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,order:5,title:u(p.showDetailedInspectTooltip),settingName:"showDetailedInspectTooltip",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0}),i.Settings.registerSettingExtension({settingName:"showEventListenersForAncestors",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ADORNER,storageType:i.Settings.SettingStorageType.Synced,settingName:"adornerSettings",settingType:i.Settings.SettingType.ARRAY,defaultValue:[]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.ELEMENTS,storageType:i.Settings.SettingStorageType.Synced,title:u(p.showCSSDocumentationTooltip),settingName:"showCSSPropertyDocumentationOnHover",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!0}),t.ContextMenu.registerProvider({contextTypes:()=>[n.RemoteObject.RemoteObject,n.DOMModel.DOMNode,n.DOMModel.DeferredDOMNode],loadProvider:async()=>(await h()).ElementsPanel.ContextMenuProvider.instance(),experiment:void 0}),t.ViewManager.registerLocationResolver({name:"elements-sidebar",category:t.ViewManager.ViewLocationCategory.ELEMENTS,loadResolver:async()=>(await h()).ElementsPanel.ElementsPanel.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[n.DOMModel.DOMNode,n.DOMModel.DeferredDOMNode,n.RemoteObject.RemoteObject],destination:i.Revealer.RevealerDestination.ELEMENTS_PANEL,loadRevealer:async()=>(await h()).ElementsPanel.DOMNodeRevealer.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[n.CSSProperty.CSSProperty],destination:i.Revealer.RevealerDestination.STYLES_SIDEBAR,loadRevealer:async()=>(await h()).ElementsPanel.CSSPropertyRevealer.instance()}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await h()).LayersWidget.ButtonProvider.instance(),order:1,location:t.Toolbar.ToolbarItemLocation.STYLES_SIDEBARPANE_TOOLBAR,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await h()).ElementStatePaneWidget.ButtonProvider.instance(),order:2,location:t.Toolbar.ToolbarItemLocation.STYLES_SIDEBARPANE_TOOLBAR,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await h()).ClassesPaneWidget.ButtonProvider.instance(),order:3,location:t.Toolbar.ToolbarItemLocation.STYLES_SIDEBARPANE_TOOLBAR,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await h()).StylesSidebarPane.ButtonProvider.instance(),order:100,location:t.Toolbar.ToolbarItemLocation.STYLES_SIDEBARPANE_TOOLBAR,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({actionId:"elements.toggle-element-search",location:t.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,order:0,showLabel:void 0,condition:void 0,separator:void 0,loadItem:void 0}),t.UIUtils.registerRenderer({contextTypes:()=>[n.DOMModel.DOMNode,n.DOMModel.DeferredDOMNode],loadRenderer:async()=>(await h()).ElementsTreeOutline.Renderer.instance()}),i.Linkifier.registerLinkifier({contextTypes:()=>[n.DOMModel.DOMNode,n.DOMModel.DeferredDOMNode],loadLinkifier:async()=>(await h()).DOMLinkifier.Linkifier.instance()});const E={showEventListenerBreakpoints:"Show Event Listener Breakpoints",eventListenerBreakpoints:"Event Listener Breakpoints",showCspViolationBreakpoints:"Show CSP Violation Breakpoints",cspViolationBreakpoints:"CSP Violation Breakpoints",showXhrfetchBreakpoints:"Show XHR/fetch Breakpoints",xhrfetchBreakpoints:"XHR/fetch Breakpoints",showDomBreakpoints:"Show DOM Breakpoints",domBreakpoints:"DOM Breakpoints",showGlobalListeners:"Show Global Listeners",globalListeners:"Global Listeners",page:"Page",showPage:"Show Page",overrides:"Overrides",showOverrides:"Show Overrides",contentScripts:"Content scripts",showContentScripts:"Show Content scripts"},R=e.i18n.registerUIStrings("panels/browser_debugger/browser_debugger-meta.ts",E),v=e.i18n.getLazilyComputedLocalizedString.bind(void 0,R);let T,P;async function C(){return T||(T=await import("../../panels/browser_debugger/browser_debugger.js")),T}async function b(){return P||(P=await import("../../panels/sources/sources.js")),P}t.ViewManager.registerViewExtension({loadView:async()=>(await C()).EventListenerBreakpointsSidebarPane.EventListenerBreakpointsSidebarPane.instance(),id:"sources.eventListenerBreakpoints",location:"sources.sidebar-bottom",commandPrompt:v(E.showEventListenerBreakpoints),title:v(E.eventListenerBreakpoints),order:9,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).CSPViolationBreakpointsSidebarPane.CSPViolationBreakpointsSidebarPane.instance(),id:"sources.cspViolationBreakpoints",location:"sources.sidebar-bottom",commandPrompt:v(E.showCspViolationBreakpoints),title:v(E.cspViolationBreakpoints),order:10,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).XHRBreakpointsSidebarPane.XHRBreakpointsSidebarPane.instance(),id:"sources.xhrBreakpoints",location:"sources.sidebar-bottom",commandPrompt:v(E.showXhrfetchBreakpoints),title:v(E.xhrfetchBreakpoints),order:5,persistence:"permanent",hasToolbar:!0}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance(),id:"sources.domBreakpoints",location:"sources.sidebar-bottom",commandPrompt:v(E.showDomBreakpoints),title:v(E.domBreakpoints),order:7,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).ObjectEventListenersSidebarPane.ObjectEventListenersSidebarPane.instance(),id:"sources.globalListeners",location:"sources.sidebar-bottom",commandPrompt:v(E.showGlobalListeners),title:v(E.globalListeners),order:8,persistence:"permanent",hasToolbar:!0}),t.ViewManager.registerViewExtension({loadView:async()=>(await C()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance(),id:"elements.domBreakpoints",location:"elements-sidebar",commandPrompt:v(E.showDomBreakpoints),title:v(E.domBreakpoints),order:6,persistence:"permanent"}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-network",title:v(E.page),commandPrompt:v(E.showPage),order:2,persistence:"permanent",loadView:async()=>(await b()).SourcesNavigator.NetworkNavigatorView.instance()}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-overrides",title:v(E.overrides),commandPrompt:v(E.showOverrides),order:4,persistence:"permanent",loadView:async()=>(await b()).SourcesNavigator.OverridesNavigatorView.instance()}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-contentScripts",title:v(E.contentScripts),commandPrompt:v(E.showContentScripts),order:5,persistence:"permanent",loadView:async()=>(await b()).SourcesNavigator.ContentScriptsNavigatorView.instance()}),t.ContextMenu.registerProvider({contextTypes:()=>[n.DOMModel.DOMNode],loadProvider:async()=>(await C()).DOMBreakpointsSidebarPane.ContextMenuProvider.instance(),experiment:void 0}),t.Context.registerListener({contextTypes:()=>[n.DebuggerModel.DebuggerPausedDetails],loadListener:async()=>(await C()).XHRBreakpointsSidebarPane.XHRBreakpointsSidebarPane.instance()}),t.Context.registerListener({contextTypes:()=>[n.DebuggerModel.DebuggerPausedDetails],loadListener:async()=>(await C()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance()});const f={showNetwork:"Show Network",network:"Network",showNetworkRequestBlocking:"Show Network request blocking",networkRequestBlocking:"Network request blocking",showNetworkConditions:"Show Network conditions",networkConditions:"Network conditions",diskCache:"disk cache",networkThrottling:"network throttling",showSearch:"Show Search",search:"Search",recordNetworkLog:"Record network log",stopRecordingNetworkLog:"Stop recording network log",hideRequestDetails:"Hide request details",colorcodeResourceTypes:"Color-code resource types",colorCode:"color code",resourceType:"resource type",colorCodeByResourceType:"Color code by resource type",useDefaultColors:"Use default colors",groupNetworkLogByFrame:"Group network log by frame",netWork:"network",frame:"frame",group:"group",groupNetworkLogItemsByFrame:"Group network log items by frame",dontGroupNetworkLogItemsByFrame:"Don't group network log items by frame",clear:"Clear network log"},L=e.i18n.registerUIStrings("panels/network/network-meta.ts",f),N=e.i18n.getLazilyComputedLocalizedString.bind(void 0,L);let I;async function M(){return I||(I=await import("../../panels/network/network.js")),I}function D(e){return void 0===I?[]:e(I)}t.ViewManager.registerViewExtension({location:"panel",id:"network",commandPrompt:N(f.showNetwork),title:N(f.network),order:40,condition:o.Runtime.ConditionName.REACT_NATIVE_UNSTABLE_NETWORK_PANEL,loadView:async()=>(await M()).NetworkPanel.NetworkPanel.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"network.blocked-urls",commandPrompt:N(f.showNetworkRequestBlocking),title:N(f.networkRequestBlocking),persistence:"closeable",order:60,loadView:async()=>(await M()).BlockedURLsPane.BlockedURLsPane.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"network.config",commandPrompt:N(f.showNetworkConditions),title:N(f.networkConditions),persistence:"closeable",order:40,tags:[N(f.diskCache),N(f.networkThrottling),e.i18n.lockedLazyString("useragent"),e.i18n.lockedLazyString("user agent"),e.i18n.lockedLazyString("user-agent")],loadView:async()=>(await M()).NetworkConfigView.NetworkConfigView.instance()}),t.ViewManager.registerViewExtension({location:"network-sidebar",id:"network.search-network-tab",commandPrompt:N(f.showSearch),title:N(f.search),persistence:"permanent",loadView:async()=>(await M()).NetworkPanel.SearchNetworkView.instance()}),t.ActionRegistration.registerActionExtension({actionId:"network.toggle-recording",category:t.ActionRegistration.ActionCategory.NETWORK,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>D((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await M()).NetworkPanel.ActionDelegate.instance(),options:[{value:!0,title:N(f.recordNetworkLog)},{value:!1,title:N(f.stopRecordingNetworkLog)}],bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.clear",category:t.ActionRegistration.ActionCategory.NETWORK,title:N(f.clear),iconClass:"clear",loadActionDelegate:async()=>(await M()).NetworkPanel.ActionDelegate.instance(),contextTypes:()=>D((e=>[e.NetworkPanel.NetworkPanel])),bindings:[{shortcut:"Ctrl+L"},{shortcut:"Meta+K",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.hide-request-details",category:t.ActionRegistration.ActionCategory.NETWORK,title:N(f.hideRequestDetails),contextTypes:()=>D((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await M()).NetworkPanel.ActionDelegate.instance(),bindings:[{shortcut:"Esc"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.search",category:t.ActionRegistration.ActionCategory.NETWORK,title:N(f.search),contextTypes:()=>D((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await M()).NetworkPanel.ActionDelegate.instance(),bindings:[{platform:"mac",shortcut:"Meta+F",keybindSets:["devToolsDefault","vsCode"]},{platform:"windows,linux",shortcut:"Ctrl+F",keybindSets:["devToolsDefault","vsCode"]}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.NETWORK,storageType:i.Settings.SettingStorageType.Synced,title:N(f.colorcodeResourceTypes),settingName:"networkColorCodeResourceTypes",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[N(f.colorCode),N(f.resourceType)],options:[{value:!0,title:N(f.colorCodeByResourceType)},{value:!1,title:N(f.useDefaultColors)}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.NETWORK,storageType:i.Settings.SettingStorageType.Synced,title:N(f.groupNetworkLogByFrame),settingName:"network.group-by-frame",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[N(f.netWork),N(f.frame),N(f.group)],options:[{value:!0,title:N(f.groupNetworkLogItemsByFrame)},{value:!1,title:N(f.dontGroupNetworkLogItemsByFrame)}]}),t.ViewManager.registerLocationResolver({name:"network-sidebar",category:t.ViewManager.ViewLocationCategory.NETWORK,loadResolver:async()=>(await M()).NetworkPanel.NetworkPanel.instance()}),t.ContextMenu.registerProvider({contextTypes:()=>[n.NetworkRequest.NetworkRequest,n.Resource.Resource,a.UISourceCode.UISourceCode],loadProvider:async()=>(await M()).NetworkPanel.ContextMenuProvider.instance(),experiment:void 0}),i.Revealer.registerRevealer({contextTypes:()=>[n.NetworkRequest.NetworkRequest],destination:i.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await M()).NetworkPanel.RequestRevealer.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[r.UIRequestLocation.UIRequestLocation],loadRevealer:async()=>(await M()).NetworkPanel.RequestLocationRevealer.instance(),destination:void 0}),i.Revealer.registerRevealer({contextTypes:()=>[r.NetworkRequestId.NetworkRequestId],destination:i.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await M()).NetworkPanel.RequestIdRevealer.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[r.UIFilter.UIRequestFilter],destination:i.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await M()).NetworkPanel.NetworkLogWithFilterRevealer.instance()});const x={security:"Security",showSecurity:"Show Security"},k=e.i18n.registerUIStrings("panels/security/security-meta.ts",x),V=e.i18n.getLazilyComputedLocalizedString.bind(void 0,k);let O;t.ViewManager.registerViewExtension({location:"panel",id:"security",title:V(x.security),commandPrompt:V(x.showSecurity),order:80,persistence:"closeable",loadView:async()=>(await async function(){return O||(O=await import("../../panels/security/security.js")),O}()).SecurityPanel.SecurityPanel.instance()});const B={toggleDeviceToolbar:"Toggle device toolbar",captureScreenshot:"Capture screenshot",captureFullSizeScreenshot:"Capture full size screenshot",captureNodeScreenshot:"Capture node screenshot",showMediaQueries:"Show media queries",device:"device",hideMediaQueries:"Hide media queries",showRulers:"Show rulers in the Device Mode toolbar",hideRulers:"Hide rulers in the Device Mode toolbar",showDeviceFrame:"Show device frame",hideDeviceFrame:"Hide device frame"},_=e.i18n.registerUIStrings("panels/emulation/emulation-meta.ts",B),U=e.i18n.getLazilyComputedLocalizedString.bind(void 0,_);let z;async function W(){return z||(z=await import("../../panels/emulation/emulation.js")),z}t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.MOBILE,actionId:"emulation.toggle-device-mode",toggleable:!0,loadActionDelegate:async()=>(await W()).DeviceModeWrapper.ActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:U(B.toggleDeviceToolbar),iconClass:"devices",bindings:[{platform:"windows,linux",shortcut:"Shift+Ctrl+M"},{platform:"mac",shortcut:"Shift+Meta+M"}]}),t.ActionRegistration.registerActionExtension({actionId:"emulation.capture-screenshot",category:t.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await W()).DeviceModeWrapper.ActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:U(B.captureScreenshot)}),t.ActionRegistration.registerActionExtension({actionId:"emulation.capture-full-height-screenshot",category:t.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await W()).DeviceModeWrapper.ActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:U(B.captureFullSizeScreenshot)}),t.ActionRegistration.registerActionExtension({actionId:"emulation.capture-node-screenshot",category:t.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await W()).DeviceModeWrapper.ActionDelegate.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,title:U(B.captureNodeScreenshot)}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.MOBILE,settingName:"showMediaQueryInspector",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:U(B.showMediaQueries)},{value:!1,title:U(B.hideMediaQueries)}],tags:[U(B.device)]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.MOBILE,settingName:"emulation.showRulers",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:U(B.showRulers)},{value:!1,title:U(B.hideRulers)}],tags:[U(B.device)]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.MOBILE,settingName:"emulation.showDeviceOutline",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:U(B.showDeviceFrame)},{value:!1,title:U(B.hideDeviceFrame)}],tags:[U(B.device)]}),t.Toolbar.registerToolbarItem({actionId:"emulation.toggle-device-mode",condition:o.Runtime.ConditionName.CAN_DOCK,location:t.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,order:1,showLabel:void 0,loadItem:void 0,separator:void 0}),i.AppProvider.registerAppProvider({loadAppProvider:async()=>(await W()).AdvancedApp.AdvancedAppProvider.instance(),condition:o.Runtime.ConditionName.CAN_DOCK,order:0}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.DEVICE_MODE_MENU_SAVE,order:12,actionId:"emulation.capture-screenshot"}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.DEVICE_MODE_MENU_SAVE,order:13,actionId:"emulation.capture-full-height-screenshot"});const F={sensors:"Sensors",geolocation:"geolocation",timezones:"timezones",locale:"locale",locales:"locales",accelerometer:"accelerometer",deviceOrientation:"device orientation",locations:"Locations",touch:"Touch",devicebased:"Device-based",forceEnabled:"Force enabled",emulateIdleDetectorState:"Emulate Idle Detector state",noIdleEmulation:"No idle emulation",userActiveScreenUnlocked:"User active, screen unlocked",userActiveScreenLocked:"User active, screen locked",userIdleScreenUnlocked:"User idle, screen unlocked",userIdleScreenLocked:"User idle, screen locked",showSensors:"Show Sensors",showLocations:"Show Locations"},j=e.i18n.registerUIStrings("panels/sensors/sensors-meta.ts",F),H=e.i18n.getLazilyComputedLocalizedString.bind(void 0,j);let K,q;async function G(){return K||(K=await import("../../panels/sensors/sensors.js")),K}t.ViewManager.registerViewExtension({location:"drawer-view",commandPrompt:H(F.showSensors),title:H(F.sensors),id:"sensors",persistence:"closeable",order:100,loadView:async()=>(await G()).SensorsView.SensorsView.instance(),tags:[H(F.geolocation),H(F.timezones),H(F.locale),H(F.locales),H(F.accelerometer),H(F.deviceOrientation)]}),t.ViewManager.registerViewExtension({location:"settings-view",id:"emulation-locations",commandPrompt:H(F.showLocations),title:H(F.locations),order:40,loadView:async()=>(await G()).LocationsSettingsTab.LocationsSettingsTab.instance(),settings:["emulation.locations"]}),i.Settings.registerSettingExtension({storageType:i.Settings.SettingStorageType.Synced,settingName:"emulation.locations",settingType:i.Settings.SettingType.ARRAY,defaultValue:[{title:"Berlin",lat:52.520007,long:13.404954,timezoneId:"Europe/Berlin",locale:"de-DE"},{title:"London",lat:51.507351,long:-.127758,timezoneId:"Europe/London",locale:"en-GB"},{title:"Moscow",lat:55.755826,long:37.6173,timezoneId:"Europe/Moscow",locale:"ru-RU"},{title:"Mountain View",lat:37.386052,long:-122.083851,timezoneId:"America/Los_Angeles",locale:"en-US"},{title:"Mumbai",lat:19.075984,long:72.877656,timezoneId:"Asia/Kolkata",locale:"mr-IN"},{title:"San Francisco",lat:37.774929,long:-122.419416,timezoneId:"America/Los_Angeles",locale:"en-US"},{title:"Shanghai",lat:31.230416,long:121.473701,timezoneId:"Asia/Shanghai",locale:"zh-Hans-CN"},{title:"São Paulo",lat:-23.55052,long:-46.633309,timezoneId:"America/Sao_Paulo",locale:"pt-BR"},{title:"Tokyo",lat:35.689487,long:139.691706,timezoneId:"Asia/Tokyo",locale:"ja-JP"}]}),i.Settings.registerSettingExtension({title:H(F.touch),reloadRequired:!0,settingName:"emulation.touch",settingType:i.Settings.SettingType.ENUM,defaultValue:"none",options:[{value:"none",title:H(F.devicebased),text:H(F.devicebased)},{value:"force",title:H(F.forceEnabled),text:H(F.forceEnabled)}]}),i.Settings.registerSettingExtension({title:H(F.emulateIdleDetectorState),settingName:"emulation.idleDetection",settingType:i.Settings.SettingType.ENUM,defaultValue:"none",options:[{value:"none",title:H(F.noIdleEmulation),text:H(F.noIdleEmulation)},{value:'{"isUserActive":true,"isScreenUnlocked":true}',title:H(F.userActiveScreenUnlocked),text:H(F.userActiveScreenUnlocked)},{value:'{"isUserActive":true,"isScreenUnlocked":false}',title:H(F.userActiveScreenLocked),text:H(F.userActiveScreenLocked)},{value:'{"isUserActive":false,"isScreenUnlocked":true}',title:H(F.userIdleScreenUnlocked),text:H(F.userIdleScreenUnlocked)},{value:'{"isUserActive":false,"isScreenUnlocked":false}',title:H(F.userIdleScreenLocked),text:H(F.userIdleScreenLocked)}]});const Y={accessibility:"Accessibility",shoAccessibility:"Show Accessibility"},J=e.i18n.registerUIStrings("panels/accessibility/accessibility-meta.ts",Y),X=e.i18n.getLazilyComputedLocalizedString.bind(void 0,J);let Q;t.ViewManager.registerViewExtension({location:"elements-sidebar",id:"accessibility.view",title:X(Y.accessibility),commandPrompt:X(Y.shoAccessibility),order:10,persistence:"permanent",loadView:async()=>(await async function(){return q||(q=await import("../../panels/accessibility/accessibility.js")),q}()).AccessibilitySidebarView.AccessibilitySidebarView.instance()});const Z={animations:"Animations",showAnimations:"Show Animations"},$=e.i18n.registerUIStrings("panels/animation/animation-meta.ts",Z),ee=e.i18n.getLazilyComputedLocalizedString.bind(void 0,$);t.ViewManager.registerViewExtension({location:"drawer-view",id:"animations",title:ee(Z.animations),commandPrompt:ee(Z.showAnimations),persistence:"closeable",order:0,loadView:async()=>(await async function(){return Q||(Q=await import("../../panels/animation/animation.js")),Q}()).AnimationTimeline.AnimationTimeline.instance()});const te={developerResources:"Developer Resources",showDeveloperResources:"Show Developer Resources"},ie=e.i18n.registerUIStrings("panels/developer_resources/developer_resources-meta.ts",te),oe=e.i18n.getLazilyComputedLocalizedString.bind(void 0,ie);let ne;t.ViewManager.registerViewExtension({location:"drawer-view",id:"resource-loading-pane",title:oe(te.developerResources),commandPrompt:oe(te.showDeveloperResources),order:100,persistence:"closeable",experiment:o.Runtime.ExperimentName.DEVELOPER_RESOURCES_VIEW,loadView:async()=>new((await async function(){return ne||(ne=await import("../../panels/developer_resources/developer_resources.js")),ne}()).DeveloperResourcesView.DeveloperResourcesView)});const ae={rendering:"Rendering",showRendering:"Show Rendering",paint:"paint",layout:"layout",fps:"fps",cssMediaType:"CSS media type",cssMediaFeature:"CSS media feature",visionDeficiency:"vision deficiency",colorVisionDeficiency:"color vision deficiency",reloadPage:"Reload page",hardReloadPage:"Hard reload page",forceAdBlocking:"Force ad blocking on this site",blockAds:"Block ads on this site",showAds:"Show ads on this site, if allowed",autoOpenDevTools:"Auto-open DevTools for popups",doNotAutoOpen:"Do not auto-open DevTools for popups",disablePaused:"Disable paused state overlay",toggleCssPrefersColorSchemeMedia:"Toggle CSS media feature prefers-color-scheme"},re=e.i18n.registerUIStrings("entrypoints/inspector_main/inspector_main-meta.ts",ae),se=e.i18n.getLazilyComputedLocalizedString.bind(void 0,re);let ce;async function le(){return ce||(ce=await import("../inspector_main/inspector_main.js")),ce}t.ViewManager.registerViewExtension({location:"drawer-view",id:"rendering",title:se(ae.rendering),commandPrompt:se(ae.showRendering),persistence:"closeable",order:50,loadView:async()=>(await le()).RenderingOptions.RenderingOptionsView.instance(),tags:[se(ae.paint),se(ae.layout),se(ae.fps),se(ae.cssMediaType),se(ae.cssMediaFeature),se(ae.visionDeficiency),se(ae.colorVisionDeficiency)]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.NAVIGATION,actionId:"inspector_main.reload",loadActionDelegate:async()=>(await le()).InspectorMain.ReloadActionDelegate.instance(),iconClass:"refresh",title:se(ae.reloadPage),bindings:[{platform:"windows,linux",shortcut:"Ctrl+R"},{platform:"windows,linux",shortcut:"F5"},{platform:"mac",shortcut:"Meta+R"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.NAVIGATION,actionId:"inspector_main.hard-reload",loadActionDelegate:async()=>(await le()).InspectorMain.ReloadActionDelegate.instance(),title:se(ae.hardReloadPage),bindings:[{platform:"windows,linux",shortcut:"Shift+Ctrl+R"},{platform:"windows,linux",shortcut:"Shift+F5"},{platform:"windows,linux",shortcut:"Ctrl+F5"},{platform:"windows,linux",shortcut:"Ctrl+Shift+F5"},{platform:"mac",shortcut:"Shift+Meta+R"}]}),t.ActionRegistration.registerActionExtension({actionId:"rendering.toggle-prefers-color-scheme",category:t.ActionRegistration.ActionCategory.RENDERING,title:se(ae.toggleCssPrefersColorSchemeMedia),loadActionDelegate:async()=>(await le()).RenderingOptions.ReloadActionDelegate.instance()}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.NETWORK,title:se(ae.forceAdBlocking),settingName:"network.adBlockingEnabled",settingType:i.Settings.SettingType.BOOLEAN,storageType:i.Settings.SettingStorageType.Session,defaultValue:!1,options:[{value:!0,title:se(ae.blockAds)},{value:!1,title:se(ae.showAds)}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.GLOBAL,storageType:i.Settings.SettingStorageType.Synced,title:se(ae.autoOpenDevTools),settingName:"autoAttachToCreatedPages",settingType:i.Settings.SettingType.BOOLEAN,order:2,defaultValue:!1,options:[{value:!0,title:se(ae.autoOpenDevTools)},{value:!1,title:se(ae.doNotAutoOpen)}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.APPEARANCE,storageType:i.Settings.SettingStorageType.Synced,title:se(ae.disablePaused),settingName:"disablePausedStateOverlay",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await le()).InspectorMain.NodeIndicator.instance(),order:2,location:t.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),t.Toolbar.registerToolbarItem({loadItem:async()=>(await le()).OutermostTargetSelector.OutermostTargetSelector.instance(),order:98,location:t.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_RIGHT,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0,experiment:o.Runtime.ExperimentName.OUTERMOST_TARGET_SELECTOR});const ge={application:"Application",showApplication:"Show Application",pwa:"pwa",clearSiteData:"Clear site data",clearSiteDataIncludingThirdparty:"Clear site data (including third-party cookies)",startRecordingEvents:"Start recording events",stopRecordingEvents:"Stop recording events"},de=e.i18n.registerUIStrings("panels/application/application-meta.ts",ge),me=e.i18n.getLazilyComputedLocalizedString.bind(void 0,de);let pe;async function we(){return pe||(pe=await import("../../panels/application/application.js")),pe}t.ViewManager.registerViewExtension({location:"panel",id:"resources",title:me(ge.application),commandPrompt:me(ge.showApplication),order:70,loadView:async()=>(await we()).ResourcesPanel.ResourcesPanel.instance(),tags:[me(ge.pwa)]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.RESOURCES,actionId:"resources.clear",title:me(ge.clearSiteData),loadActionDelegate:async()=>(await we()).StorageView.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.RESOURCES,actionId:"resources.clear-incl-third-party-cookies",title:me(ge.clearSiteDataIncludingThirdparty),loadActionDelegate:async()=>(await we()).StorageView.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({actionId:"background-service.toggle-recording",iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===pe?[]:(e=>[e.BackgroundServiceView.BackgroundServiceView])(pe),loadActionDelegate:async()=>(await we()).BackgroundServiceView.ActionDelegate.instance(),category:t.ActionRegistration.ActionCategory.BACKGROUND_SERVICES,options:[{value:!0,title:me(ge.startRecordingEvents)},{value:!1,title:me(ge.stopRecordingEvents)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),i.Revealer.registerRevealer({contextTypes:()=>[n.Resource.Resource],destination:i.Revealer.RevealerDestination.APPLICATION_PANEL,loadRevealer:async()=>(await we()).ResourcesPanel.ResourceRevealer.instance()}),i.Revealer.registerRevealer({contextTypes:()=>[n.ResourceTreeModel.ResourceTreeFrame],destination:i.Revealer.RevealerDestination.APPLICATION_PANEL,loadRevealer:async()=>(await we()).ResourcesPanel.FrameDetailsRevealer.instance()});const ue={issues:"Issues",showIssues:"Show Issues",cspViolations:"CSP Violations",showCspViolations:"Show CSP Violations"},ye=e.i18n.registerUIStrings("panels/issues/issues-meta.ts",ue),Se=e.i18n.getLazilyComputedLocalizedString.bind(void 0,ye);let he;async function Ae(){return he||(he=await import("../../panels/issues/issues.js")),he}t.ViewManager.registerViewExtension({location:"drawer-view",id:"issues-pane",title:Se(ue.issues),commandPrompt:Se(ue.showIssues),order:100,persistence:"closeable",loadView:async()=>(await Ae()).IssuesPane.IssuesPane.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"csp-violations-pane",title:Se(ue.cspViolations),commandPrompt:Se(ue.showCspViolations),order:100,persistence:"closeable",loadView:async()=>(await Ae()).CSPViolationsView.CSPViolationsView.instance(),experiment:o.Runtime.ExperimentName.CSP_VIOLATIONS_VIEW}),i.Revealer.registerRevealer({contextTypes:()=>[s.Issue.Issue],destination:i.Revealer.RevealerDestination.ISSUES_VIEW,loadRevealer:async()=>(await Ae()).IssueRevealer.IssueRevealer.instance()});const Ee={layers:"Layers",showLayers:"Show Layers"},Re=e.i18n.registerUIStrings("panels/layers/layers-meta.ts",Ee),ve=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Re);let Te;t.ViewManager.registerViewExtension({location:"panel",id:"layers",title:ve(Ee.layers),commandPrompt:ve(Ee.showLayers),order:100,persistence:"closeable",loadView:async()=>(await async function(){return Te||(Te=await import("../../panels/layers/layers.js")),Te}()).LayersPanel.LayersPanel.instance()});const Pe={showLighthouse:"Show `Lighthouse`"},Ce=e.i18n.registerUIStrings("panels/lighthouse/lighthouse-meta.ts",Pe),be=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Ce);let fe;t.ViewManager.registerViewExtension({location:"panel",id:"lighthouse",title:e.i18n.lockedLazyString("Lighthouse"),commandPrompt:be(Pe.showLighthouse),order:90,loadView:async()=>(await async function(){return fe||(fe=await import("../../panels/lighthouse/lighthouse.js")),fe}()).LighthousePanel.LighthousePanel.instance(),tags:[e.i18n.lockedLazyString("lighthouse"),e.i18n.lockedLazyString("pwa")]});const Le={media:"Media",video:"video",showMedia:"Show Media"},Ne=e.i18n.registerUIStrings("panels/media/media-meta.ts",Le),Ie=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Ne);let Me;t.ViewManager.registerViewExtension({location:"panel",id:"medias",title:Ie(Le.media),commandPrompt:Ie(Le.showMedia),persistence:"closeable",order:100,loadView:async()=>(await async function(){return Me||(Me=await import("../../panels/media/media.js")),Me}()).MainView.MainView.instance(),tags:[Ie(Le.media),Ie(Le.video)]});const De={throttling:"Throttling",showThrottling:"Show Throttling",goOffline:"Go offline",device:"device",throttlingTag:"throttling",enableSlowGThrottling:"Enable slow `3G` throttling",enableFastGThrottling:"Enable fast `3G` throttling",goOnline:"Go online"},xe=e.i18n.registerUIStrings("panels/mobile_throttling/mobile_throttling-meta.ts",De),ke=e.i18n.getLazilyComputedLocalizedString.bind(void 0,xe);let Ve;async function Oe(){return Ve||(Ve=await import("../../panels/mobile_throttling/mobile_throttling.js")),Ve}t.ViewManager.registerViewExtension({location:"settings-view",id:"throttling-conditions",title:ke(De.throttling),commandPrompt:ke(De.showThrottling),order:35,loadView:async()=>(await Oe()).ThrottlingSettingsTab.ThrottlingSettingsTab.instance(),settings:["customNetworkConditions"]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-offline",category:t.ActionRegistration.ActionCategory.NETWORK,title:ke(De.goOffline),loadActionDelegate:async()=>(await Oe()).ThrottlingManager.ActionDelegate.instance(),tags:[ke(De.device),ke(De.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-low-end-mobile",category:t.ActionRegistration.ActionCategory.NETWORK,title:ke(De.enableSlowGThrottling),loadActionDelegate:async()=>(await Oe()).ThrottlingManager.ActionDelegate.instance(),tags:[ke(De.device),ke(De.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-mid-tier-mobile",category:t.ActionRegistration.ActionCategory.NETWORK,title:ke(De.enableFastGThrottling),loadActionDelegate:async()=>(await Oe()).ThrottlingManager.ActionDelegate.instance(),tags:[ke(De.device),ke(De.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-online",category:t.ActionRegistration.ActionCategory.NETWORK,title:ke(De.goOnline),loadActionDelegate:async()=>(await Oe()).ThrottlingManager.ActionDelegate.instance(),tags:[ke(De.device),ke(De.throttlingTag)]}),i.Settings.registerSettingExtension({storageType:i.Settings.SettingStorageType.Synced,settingName:"customNetworkConditions",settingType:i.Settings.SettingType.ARRAY,defaultValue:[]});const Be={performanceMonitor:"Performance monitor",performance:"performance",systemMonitor:"system monitor",monitor:"monitor",activity:"activity",metrics:"metrics",showPerformanceMonitor:"Show Performance monitor"},_e=e.i18n.registerUIStrings("panels/performance_monitor/performance_monitor-meta.ts",Be),Ue=e.i18n.getLazilyComputedLocalizedString.bind(void 0,_e);let ze;t.ViewManager.registerViewExtension({location:"drawer-view",id:"performance.monitor",title:Ue(Be.performanceMonitor),commandPrompt:Ue(Be.showPerformanceMonitor),persistence:"closeable",order:100,loadView:async()=>(await async function(){return ze||(ze=await import("../../panels/performance_monitor/performance_monitor.js")),ze}()).PerformanceMonitor.PerformanceMonitorImpl.instance(),tags:[Ue(Be.performance),Ue(Be.systemMonitor),Ue(Be.monitor),Ue(Be.activity),Ue(Be.metrics)]});const We={performance:"Performance",showPerformance:"Show Performance",javascriptProfiler:"JavaScript Profiler",showJavascriptProfiler:"Show JavaScript Profiler",record:"Record",stop:"Stop",startProfilingAndReloadPage:"Start profiling and reload page",saveProfile:"Save profile…",loadProfile:"Load profile…",previousFrame:"Previous frame",nextFrame:"Next frame",showRecentTimelineSessions:"Show recent timeline sessions",previousRecording:"Previous recording",nextRecording:"Next recording",hideChromeFrameInLayersView:"Hide `chrome` frame in Layers view",startStopRecording:"Start/stop recording"},Fe=e.i18n.registerUIStrings("panels/timeline/timeline-meta.ts",We),je=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Fe);let He,Ke;async function qe(){return He||(He=await import("../../panels/timeline/timeline.js")),He}async function Ge(){return Ke||(Ke=await import("../../panels/profiler/profiler.js")),Ke}function Ye(e){return void 0===He?[]:e(He)}t.ViewManager.registerViewExtension({location:"panel",id:"timeline",title:je(We.performance),commandPrompt:je(We.showPerformance),order:50,loadView:async()=>(await qe()).TimelinePanel.TimelinePanel.instance()}),t.ViewManager.registerViewExtension({location:"panel",id:"js_profiler",title:je(We.javascriptProfiler),commandPrompt:je(We.showJavascriptProfiler),persistence:"closeable",order:65,experiment:o.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,loadView:async()=>(await Ge()).ProfilesPanel.JSProfilerPanel.instance()}),t.ActionRegistration.registerActionExtension({actionId:"timeline.toggle-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),options:[{value:!0,title:je(We.record)},{value:!1,title:je(We.stop)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.record-reload",iconClass:"refresh",contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:je(We.startProfilingAndReloadPage),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+Shift+E"},{platform:"mac",shortcut:"Meta+Shift+E"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.PERFORMANCE,actionId:"timeline.save-to-file",contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),title:je(We.saveProfile),bindings:[{platform:"windows,linux",shortcut:"Ctrl+S"},{platform:"mac",shortcut:"Meta+S"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.PERFORMANCE,actionId:"timeline.load-from-file",contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),title:je(We.loadProfile),bindings:[{platform:"windows,linux",shortcut:"Ctrl+O"},{platform:"mac",shortcut:"Meta+O"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.jump-to-previous-frame",category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:je(We.previousFrame),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),bindings:[{shortcut:"["}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.jump-to-next-frame",category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:je(We.nextFrame),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),bindings:[{shortcut:"]"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.show-history",loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:je(We.showRecentTimelineSessions),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Ctrl+H"},{platform:"mac",shortcut:"Meta+Y"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.previous-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),title:je(We.previousRecording),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Alt+Left"},{platform:"mac",shortcut:"Meta+Left"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.next-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,loadActionDelegate:async()=>(await qe()).TimelinePanel.ActionDelegate.instance(),title:je(We.nextRecording),contextTypes:()=>Ye((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Alt+Right"},{platform:"mac",shortcut:"Meta+Right"}]}),t.ActionRegistration.registerActionExtension({actionId:"profiler.js-toggle-recording",category:t.ActionRegistration.ActionCategory.JAVASCRIPT_PROFILER,title:je(We.startStopRecording),iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===Ke?[]:(e=>[e.ProfilesPanel.JSProfilerPanel])(Ke),loadActionDelegate:async()=>(await Ge()).ProfilesPanel.JSProfilerPanel.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),i.Settings.registerSettingExtension({category:i.Settings.SettingCategory.PERFORMANCE,storageType:i.Settings.SettingStorageType.Synced,title:je(We.hideChromeFrameInLayersView),settingName:"frameViewerHideChromeWindow",settingType:i.Settings.SettingType.BOOLEAN,defaultValue:!1}),i.Linkifier.registerLinkifier({contextTypes:()=>Ye((e=>[e.CLSLinkifier.CLSRect])),loadLinkifier:async()=>(await qe()).CLSLinkifier.Linkifier.instance()}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.TIMELINE_MENU_OPEN,actionId:"timeline.load-from-file",order:10}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.TIMELINE_MENU_OPEN,actionId:"timeline.save-to-file",order:15});const Je={webaudio:"WebAudio",audio:"audio",showWebaudio:"Show WebAudio"},Xe=e.i18n.registerUIStrings("panels/web_audio/web_audio-meta.ts",Je),Qe=e.i18n.getLazilyComputedLocalizedString.bind(void 0,Xe);let Ze;t.ViewManager.registerViewExtension({location:"drawer-view",id:"web-audio",title:Qe(Je.webaudio),commandPrompt:Qe(Je.showWebaudio),persistence:"closeable",order:100,loadView:async()=>(await async function(){return Ze||(Ze=await import("../../panels/web_audio/web_audio.js")),Ze}()).WebAudioView.WebAudioView.instance(),tags:[Qe(Je.audio)]});const $e={webauthn:"WebAuthn",showWebauthn:"Show WebAuthn"},et=e.i18n.registerUIStrings("panels/webauthn/webauthn-meta.ts",$e),tt=e.i18n.getLazilyComputedLocalizedString.bind(void 0,et);let it;t.ViewManager.registerViewExtension({location:"drawer-view",id:"webauthn-pane",title:tt($e.webauthn),commandPrompt:tt($e.showWebauthn),order:100,persistence:"closeable",loadView:async()=>(await async function(){return it||(it=await import("../../panels/webauthn/webauthn.js")),it}()).WebauthnPane.WebauthnPaneImpl.instance(),experiment:o.Runtime.ExperimentName.WEBAUTHN_PANE});const ot={resetView:"Reset view",switchToPanMode:"Switch to pan mode",switchToRotateMode:"Switch to rotate mode",zoomIn:"Zoom in",zoomOut:"Zoom out",panOrRotateUp:"Pan or rotate up",panOrRotateDown:"Pan or rotate down",panOrRotateLeft:"Pan or rotate left",panOrRotateRight:"Pan or rotate right"},nt=e.i18n.registerUIStrings("panels/layer_viewer/layer_viewer-meta.ts",ot),at=e.i18n.getLazilyComputedLocalizedString.bind(void 0,nt);t.ActionRegistration.registerActionExtension({actionId:"layers.reset-view",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.resetView),bindings:[{shortcut:"0"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.pan-mode",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.switchToPanMode),bindings:[{shortcut:"x"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.rotate-mode",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.switchToRotateMode),bindings:[{shortcut:"v"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.zoom-in",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.zoomIn),bindings:[{shortcut:"Shift+Plus"},{shortcut:"NumpadPlus"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.zoom-out",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.zoomOut),bindings:[{shortcut:"Shift+Minus"},{shortcut:"NumpadMinus"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.up",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.panOrRotateUp),bindings:[{shortcut:"Up"},{shortcut:"w"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.down",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.panOrRotateDown),bindings:[{shortcut:"Down"},{shortcut:"s"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.left",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.panOrRotateLeft),bindings:[{shortcut:"Left"},{shortcut:"a"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.right",category:t.ActionRegistration.ActionCategory.LAYERS,title:at(ot.panOrRotateRight),bindings:[{shortcut:"Right"},{shortcut:"d"}]});const rt={recorder:"Recorder",showRecorder:"Show Recorder",startStopRecording:"Start/Stop recording",createRecording:"Create a new recording",replayRecording:"Replay recording",toggleCode:"Toggle code view"},st=e.i18n.registerUIStrings("panels/recorder/recorder-meta.ts",rt),ct=e.i18n.getLazilyComputedLocalizedString.bind(void 0,st);let lt;async function gt(){return lt||(lt=await import("../../panels/recorder/recorder.js")),lt}function dt(e,t){return void 0===lt?[]:t&<.RecorderPanel.RecorderPanel.instance().isActionPossible(t)?e(lt):[]}t.ViewManager.defaultOptionsForTabs.chrome_recorder=!0,t.ViewManager.registerViewExtension({location:"panel",id:"chrome_recorder",commandPrompt:ct(rt.showRecorder),title:ct(rt.recorder),order:90,persistence:"closeable",isPreviewFeature:!0,loadView:async()=>(await gt()).RecorderPanel.RecorderPanel.instance()}),t.ActionRegistration.registerActionExtension({category:"Recorder",actionId:"chrome_recorder.create-recording",title:ct(rt.createRecording),loadActionDelegate:async()=>(await gt()).RecorderPanel.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({category:"Recorder",actionId:"chrome_recorder.start-recording",title:ct(rt.startStopRecording),contextTypes:()=>dt((e=>[e.RecorderPanel.RecorderPanel]),"chrome_recorder.start-recording"),loadActionDelegate:async()=>(await gt()).RecorderPanel.ActionDelegate.instance(),bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({category:"Recorder",actionId:"chrome_recorder.replay-recording",title:ct(rt.replayRecording),contextTypes:()=>dt((e=>[e.RecorderPanel.RecorderPanel]),"chrome_recorder.replay-recording"),loadActionDelegate:async()=>(await gt()).RecorderPanel.ActionDelegate.instance(),bindings:[{shortcut:"Ctrl+Enter",platform:"windows,linux"},{shortcut:"Meta+Enter",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({category:"Recorder",actionId:"chrome_recorder.toggle-code-view",title:ct(rt.toggleCode),contextTypes:()=>dt((e=>[e.RecorderPanel.RecorderPanel]),"chrome_recorder.toggle-code-view"),loadActionDelegate:async()=>(await gt()).RecorderPanel.ActionDelegate.instance(),bindings:[{shortcut:"Ctrl+B",platform:"windows,linux"},{shortcut:"Meta+B",platform:"mac"}]}),self.runtime=o.Runtime.Runtime.instance({forceNew:!0}),new c.MainImpl.MainImpl; diff --git a/packages/debugger-frontend/dist/third-party/front_end/entrypoints/rn_inspector/rn_inspector.js b/packages/debugger-frontend/dist/third-party/front_end/entrypoints/rn_inspector/rn_inspector.js index 85fc7c66c4016e..bb0bb42f6f5e6a 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/entrypoints/rn_inspector/rn_inspector.js +++ b/packages/debugger-frontend/dist/third-party/front_end/entrypoints/rn_inspector/rn_inspector.js @@ -1 +1 @@ -import"../shell/shell.js";import*as e from"../../core/common/common.js";import*as t from"../../core/root/root.js";import*as i from"../../ui/legacy/legacy.js";import*as o from"../../core/i18n/i18n.js";import*as n from"../../models/issues_manager/issues_manager.js";import*as a from"../main/main.js";const r={toggleDeviceToolbar:"Toggle device toolbar",captureScreenshot:"Capture screenshot",captureFullSizeScreenshot:"Capture full size screenshot",captureNodeScreenshot:"Capture node screenshot",showMediaQueries:"Show media queries",device:"device",hideMediaQueries:"Hide media queries",showRulers:"Show rulers in the Device Mode toolbar",hideRulers:"Hide rulers in the Device Mode toolbar",showDeviceFrame:"Show device frame",hideDeviceFrame:"Hide device frame"},s=o.i18n.registerUIStrings("panels/emulation/emulation-meta.ts",r),l=o.i18n.getLazilyComputedLocalizedString.bind(void 0,s);let c;async function g(){return c||(c=await import("../../panels/emulation/emulation.js")),c}i.ActionRegistration.registerActionExtension({category:i.ActionRegistration.ActionCategory.MOBILE,actionId:"emulation.toggle-device-mode",toggleable:!0,loadActionDelegate:async()=>(await g()).DeviceModeWrapper.ActionDelegate.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,title:l(r.toggleDeviceToolbar),iconClass:"devices",bindings:[{platform:"windows,linux",shortcut:"Shift+Ctrl+M"},{platform:"mac",shortcut:"Shift+Meta+M"}]}),i.ActionRegistration.registerActionExtension({actionId:"emulation.capture-screenshot",category:i.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await g()).DeviceModeWrapper.ActionDelegate.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,title:l(r.captureScreenshot)}),i.ActionRegistration.registerActionExtension({actionId:"emulation.capture-full-height-screenshot",category:i.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await g()).DeviceModeWrapper.ActionDelegate.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,title:l(r.captureFullSizeScreenshot)}),i.ActionRegistration.registerActionExtension({actionId:"emulation.capture-node-screenshot",category:i.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await g()).DeviceModeWrapper.ActionDelegate.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,title:l(r.captureNodeScreenshot)}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.MOBILE,settingName:"showMediaQueryInspector",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:l(r.showMediaQueries)},{value:!1,title:l(r.hideMediaQueries)}],tags:[l(r.device)]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.MOBILE,settingName:"emulation.showRulers",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:l(r.showRulers)},{value:!1,title:l(r.hideRulers)}],tags:[l(r.device)]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.MOBILE,settingName:"emulation.showDeviceOutline",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:l(r.showDeviceFrame)},{value:!1,title:l(r.hideDeviceFrame)}],tags:[l(r.device)]}),i.Toolbar.registerToolbarItem({actionId:"emulation.toggle-device-mode",condition:t.Runtime.ConditionName.CAN_DOCK,location:i.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,order:1,showLabel:void 0,loadItem:void 0,separator:void 0}),e.AppProvider.registerAppProvider({loadAppProvider:async()=>(await g()).AdvancedApp.AdvancedAppProvider.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,order:0}),i.ContextMenu.registerItem({location:i.ContextMenu.ItemLocation.DEVICE_MODE_MENU_SAVE,order:12,actionId:"emulation.capture-screenshot"}),i.ContextMenu.registerItem({location:i.ContextMenu.ItemLocation.DEVICE_MODE_MENU_SAVE,order:13,actionId:"emulation.capture-full-height-screenshot"});const d={sensors:"Sensors",geolocation:"geolocation",timezones:"timezones",locale:"locale",locales:"locales",accelerometer:"accelerometer",deviceOrientation:"device orientation",locations:"Locations",touch:"Touch",devicebased:"Device-based",forceEnabled:"Force enabled",emulateIdleDetectorState:"Emulate Idle Detector state",noIdleEmulation:"No idle emulation",userActiveScreenUnlocked:"User active, screen unlocked",userActiveScreenLocked:"User active, screen locked",userIdleScreenUnlocked:"User idle, screen unlocked",userIdleScreenLocked:"User idle, screen locked",showSensors:"Show Sensors",showLocations:"Show Locations"},m=o.i18n.registerUIStrings("panels/sensors/sensors-meta.ts",d),u=o.i18n.getLazilyComputedLocalizedString.bind(void 0,m);let p;async function S(){return p||(p=await import("../../panels/sensors/sensors.js")),p}i.ViewManager.registerViewExtension({location:"drawer-view",commandPrompt:u(d.showSensors),title:u(d.sensors),id:"sensors",persistence:"closeable",order:100,loadView:async()=>(await S()).SensorsView.SensorsView.instance(),tags:[u(d.geolocation),u(d.timezones),u(d.locale),u(d.locales),u(d.accelerometer),u(d.deviceOrientation)]}),i.ViewManager.registerViewExtension({location:"settings-view",id:"emulation-locations",commandPrompt:u(d.showLocations),title:u(d.locations),order:40,loadView:async()=>(await S()).LocationsSettingsTab.LocationsSettingsTab.instance(),settings:["emulation.locations"]}),e.Settings.registerSettingExtension({storageType:e.Settings.SettingStorageType.Synced,settingName:"emulation.locations",settingType:e.Settings.SettingType.ARRAY,defaultValue:[{title:"Berlin",lat:52.520007,long:13.404954,timezoneId:"Europe/Berlin",locale:"de-DE"},{title:"London",lat:51.507351,long:-.127758,timezoneId:"Europe/London",locale:"en-GB"},{title:"Moscow",lat:55.755826,long:37.6173,timezoneId:"Europe/Moscow",locale:"ru-RU"},{title:"Mountain View",lat:37.386052,long:-122.083851,timezoneId:"America/Los_Angeles",locale:"en-US"},{title:"Mumbai",lat:19.075984,long:72.877656,timezoneId:"Asia/Kolkata",locale:"mr-IN"},{title:"San Francisco",lat:37.774929,long:-122.419416,timezoneId:"America/Los_Angeles",locale:"en-US"},{title:"Shanghai",lat:31.230416,long:121.473701,timezoneId:"Asia/Shanghai",locale:"zh-Hans-CN"},{title:"São Paulo",lat:-23.55052,long:-46.633309,timezoneId:"America/Sao_Paulo",locale:"pt-BR"},{title:"Tokyo",lat:35.689487,long:139.691706,timezoneId:"Asia/Tokyo",locale:"ja-JP"}]}),e.Settings.registerSettingExtension({title:u(d.touch),reloadRequired:!0,settingName:"emulation.touch",settingType:e.Settings.SettingType.ENUM,defaultValue:"none",options:[{value:"none",title:u(d.devicebased),text:u(d.devicebased)},{value:"force",title:u(d.forceEnabled),text:u(d.forceEnabled)}]}),e.Settings.registerSettingExtension({title:u(d.emulateIdleDetectorState),settingName:"emulation.idleDetection",settingType:e.Settings.SettingType.ENUM,defaultValue:"none",options:[{value:"none",title:u(d.noIdleEmulation),text:u(d.noIdleEmulation)},{value:'{"isUserActive":true,"isScreenUnlocked":true}',title:u(d.userActiveScreenUnlocked),text:u(d.userActiveScreenUnlocked)},{value:'{"isUserActive":true,"isScreenUnlocked":false}',title:u(d.userActiveScreenLocked),text:u(d.userActiveScreenLocked)},{value:'{"isUserActive":false,"isScreenUnlocked":true}',title:u(d.userIdleScreenUnlocked),text:u(d.userIdleScreenUnlocked)},{value:'{"isUserActive":false,"isScreenUnlocked":false}',title:u(d.userIdleScreenLocked),text:u(d.userIdleScreenLocked)}]});const w={developerResources:"Developer Resources",showDeveloperResources:"Show Developer Resources"},A=o.i18n.registerUIStrings("panels/developer_resources/developer_resources-meta.ts",w),h=o.i18n.getLazilyComputedLocalizedString.bind(void 0,A);let y;i.ViewManager.registerViewExtension({location:"drawer-view",id:"resource-loading-pane",title:h(w.developerResources),commandPrompt:h(w.showDeveloperResources),order:100,persistence:"closeable",experiment:t.Runtime.ExperimentName.DEVELOPER_RESOURCES_VIEW,loadView:async()=>new((await async function(){return y||(y=await import("../../panels/developer_resources/developer_resources.js")),y}()).DeveloperResourcesView.DeveloperResourcesView)});const R={rendering:"Rendering",showRendering:"Show Rendering",paint:"paint",layout:"layout",fps:"fps",cssMediaType:"CSS media type",cssMediaFeature:"CSS media feature",visionDeficiency:"vision deficiency",colorVisionDeficiency:"color vision deficiency",reloadPage:"Reload page",hardReloadPage:"Hard reload page",forceAdBlocking:"Force ad blocking on this site",blockAds:"Block ads on this site",showAds:"Show ads on this site, if allowed",autoOpenDevTools:"Auto-open DevTools for popups",doNotAutoOpen:"Do not auto-open DevTools for popups",disablePaused:"Disable paused state overlay",toggleCssPrefersColorSchemeMedia:"Toggle CSS media feature prefers-color-scheme"},E=o.i18n.registerUIStrings("entrypoints/inspector_main/inspector_main-meta.ts",R),v=o.i18n.getLazilyComputedLocalizedString.bind(void 0,E);let T;async function f(){return T||(T=await import("../inspector_main/inspector_main.js")),T}i.ViewManager.registerViewExtension({location:"drawer-view",id:"rendering",title:v(R.rendering),commandPrompt:v(R.showRendering),persistence:"closeable",order:50,loadView:async()=>(await f()).RenderingOptions.RenderingOptionsView.instance(),tags:[v(R.paint),v(R.layout),v(R.fps),v(R.cssMediaType),v(R.cssMediaFeature),v(R.visionDeficiency),v(R.colorVisionDeficiency)]}),i.ActionRegistration.registerActionExtension({category:i.ActionRegistration.ActionCategory.NAVIGATION,actionId:"inspector_main.reload",loadActionDelegate:async()=>(await f()).InspectorMain.ReloadActionDelegate.instance(),iconClass:"refresh",title:v(R.reloadPage),bindings:[{platform:"windows,linux",shortcut:"Ctrl+R"},{platform:"windows,linux",shortcut:"F5"},{platform:"mac",shortcut:"Meta+R"}]}),i.ActionRegistration.registerActionExtension({category:i.ActionRegistration.ActionCategory.NAVIGATION,actionId:"inspector_main.hard-reload",loadActionDelegate:async()=>(await f()).InspectorMain.ReloadActionDelegate.instance(),title:v(R.hardReloadPage),bindings:[{platform:"windows,linux",shortcut:"Shift+Ctrl+R"},{platform:"windows,linux",shortcut:"Shift+F5"},{platform:"windows,linux",shortcut:"Ctrl+F5"},{platform:"windows,linux",shortcut:"Ctrl+Shift+F5"},{platform:"mac",shortcut:"Shift+Meta+R"}]}),i.ActionRegistration.registerActionExtension({actionId:"rendering.toggle-prefers-color-scheme",category:i.ActionRegistration.ActionCategory.RENDERING,title:v(R.toggleCssPrefersColorSchemeMedia),loadActionDelegate:async()=>(await f()).RenderingOptions.ReloadActionDelegate.instance()}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.NETWORK,title:v(R.forceAdBlocking),settingName:"network.adBlockingEnabled",settingType:e.Settings.SettingType.BOOLEAN,storageType:e.Settings.SettingStorageType.Session,defaultValue:!1,options:[{value:!0,title:v(R.blockAds)},{value:!1,title:v(R.showAds)}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.GLOBAL,storageType:e.Settings.SettingStorageType.Synced,title:v(R.autoOpenDevTools),settingName:"autoAttachToCreatedPages",settingType:e.Settings.SettingType.BOOLEAN,order:2,defaultValue:!1,options:[{value:!0,title:v(R.autoOpenDevTools)},{value:!1,title:v(R.doNotAutoOpen)}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.APPEARANCE,storageType:e.Settings.SettingStorageType.Synced,title:v(R.disablePaused),settingName:"disablePausedStateOverlay",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1}),i.Toolbar.registerToolbarItem({loadItem:async()=>(await f()).InspectorMain.NodeIndicator.instance(),order:2,location:i.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),i.Toolbar.registerToolbarItem({loadItem:async()=>(await f()).OutermostTargetSelector.OutermostTargetSelector.instance(),order:98,location:i.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_RIGHT,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0,experiment:t.Runtime.ExperimentName.OUTERMOST_TARGET_SELECTOR});const I={issues:"Issues",showIssues:"Show Issues",cspViolations:"CSP Violations",showCspViolations:"Show CSP Violations"},C=o.i18n.registerUIStrings("panels/issues/issues-meta.ts",I),N=o.i18n.getLazilyComputedLocalizedString.bind(void 0,C);let P;async function x(){return P||(P=await import("../../panels/issues/issues.js")),P}i.ViewManager.registerViewExtension({location:"drawer-view",id:"issues-pane",title:N(I.issues),commandPrompt:N(I.showIssues),order:100,persistence:"closeable",loadView:async()=>(await x()).IssuesPane.IssuesPane.instance()}),i.ViewManager.registerViewExtension({location:"drawer-view",id:"csp-violations-pane",title:N(I.cspViolations),commandPrompt:N(I.showCspViolations),order:100,persistence:"closeable",loadView:async()=>(await x()).CSPViolationsView.CSPViolationsView.instance(),experiment:t.Runtime.ExperimentName.CSP_VIOLATIONS_VIEW}),e.Revealer.registerRevealer({contextTypes:()=>[n.Issue.Issue],destination:e.Revealer.RevealerDestination.ISSUES_VIEW,loadRevealer:async()=>(await x()).IssueRevealer.IssueRevealer.instance()});const D={throttling:"Throttling",showThrottling:"Show Throttling",goOffline:"Go offline",device:"device",throttlingTag:"throttling",enableSlowGThrottling:"Enable slow `3G` throttling",enableFastGThrottling:"Enable fast `3G` throttling",goOnline:"Go online"},b=o.i18n.registerUIStrings("panels/mobile_throttling/mobile_throttling-meta.ts",D),O=o.i18n.getLazilyComputedLocalizedString.bind(void 0,b);let M;async function V(){return M||(M=await import("../../panels/mobile_throttling/mobile_throttling.js")),M}i.ViewManager.registerViewExtension({location:"settings-view",id:"throttling-conditions",title:O(D.throttling),commandPrompt:O(D.showThrottling),order:35,loadView:async()=>(await V()).ThrottlingSettingsTab.ThrottlingSettingsTab.instance(),settings:["customNetworkConditions"]}),i.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-offline",category:i.ActionRegistration.ActionCategory.NETWORK,title:O(D.goOffline),loadActionDelegate:async()=>(await V()).ThrottlingManager.ActionDelegate.instance(),tags:[O(D.device),O(D.throttlingTag)]}),i.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-low-end-mobile",category:i.ActionRegistration.ActionCategory.NETWORK,title:O(D.enableSlowGThrottling),loadActionDelegate:async()=>(await V()).ThrottlingManager.ActionDelegate.instance(),tags:[O(D.device),O(D.throttlingTag)]}),i.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-mid-tier-mobile",category:i.ActionRegistration.ActionCategory.NETWORK,title:O(D.enableFastGThrottling),loadActionDelegate:async()=>(await V()).ThrottlingManager.ActionDelegate.instance(),tags:[O(D.device),O(D.throttlingTag)]}),i.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-online",category:i.ActionRegistration.ActionCategory.NETWORK,title:O(D.goOnline),loadActionDelegate:async()=>(await V()).ThrottlingManager.ActionDelegate.instance(),tags:[O(D.device),O(D.throttlingTag)]}),e.Settings.registerSettingExtension({storageType:e.Settings.SettingStorageType.Synced,settingName:"customNetworkConditions",settingType:e.Settings.SettingType.ARRAY,defaultValue:[]});const _={profiler:"Profiler",showProfiler:"Show Profiler",performance:"Performance",showPerformance:"Show Performance",startStopRecording:"Start/stop recording",showRecentTimelineSessions:"Show recent timeline sessions",record:"Record",stop:"Stop",startProfilingAndReloadPage:"Start profiling and reload page"},L=o.i18n.registerUIStrings("panels/js_profiler/js_profiler-meta.ts",_),k=o.i18n.getLazilyComputedLocalizedString.bind(void 0,L);let U,z;async function F(){return z||(z=await import("../../panels/profiler/profiler.js")),z}async function B(){return U||(U=await import("../../panels/timeline/timeline.js")),U}function W(e){return void 0===U?[]:e(U)}i.ViewManager.registerViewExtension({location:"panel",id:"js_profiler",title:k(_.profiler),commandPrompt:k(_.showProfiler),order:65,persistence:"permanent",experiment:t.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,loadView:async()=>(await F()).ProfilesPanel.JSProfilerPanel.instance()}),i.ActionRegistration.registerActionExtension({actionId:"profiler.js-toggle-recording",category:i.ActionRegistration.ActionCategory.JAVASCRIPT_PROFILER,title:k(_.startStopRecording),iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===z?[]:(e=>[e.ProfilesPanel.JSProfilerPanel])(z),loadActionDelegate:async()=>(await F()).ProfilesPanel.JSProfilerPanel.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),i.ActionRegistration.registerActionExtension({actionId:"timeline.show-history",loadActionDelegate:async()=>(await B()).TimelinePanel.ActionDelegate.instance(),category:i.ActionRegistration.ActionCategory.PERFORMANCE,title:k(_.showRecentTimelineSessions),contextTypes:()=>W((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Ctrl+H"},{platform:"mac",shortcut:"Meta+Y"}]}),i.ActionRegistration.registerActionExtension({actionId:"timeline.toggle-recording",category:i.ActionRegistration.ActionCategory.PERFORMANCE,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>W((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await B()).TimelinePanel.ActionDelegate.instance(),options:[{value:!0,title:k(_.record)},{value:!1,title:k(_.stop)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),i.ActionRegistration.registerActionExtension({actionId:"timeline.record-reload",iconClass:"refresh",contextTypes:()=>W((e=>[e.TimelinePanel.TimelinePanel])),category:i.ActionRegistration.ActionCategory.PERFORMANCE,title:k(_.startProfilingAndReloadPage),loadActionDelegate:async()=>(await B()).TimelinePanel.ActionDelegate.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+Shift+E"},{platform:"mac",shortcut:"Meta+Shift+E"}]});const j={rnWelcome:"⚛️ Welcome",showRnWelcome:"Show React Native Welcome panel"},G=o.i18n.registerUIStrings("panels/rn_welcome/rn_welcome-meta.ts",j),K=o.i18n.getLazilyComputedLocalizedString.bind(void 0,G);let H;i.ViewManager.registerViewExtension({location:"panel",id:"rn-welcome",title:K(j.rnWelcome),commandPrompt:K(j.showRnWelcome),order:-10,persistence:"permanent",loadView:async()=>(await async function(){return H||(H=await import("../../panels/rn_welcome/rn_welcome.js")),H}()).RNWelcome.RNWelcomeImpl.instance(),experiment:t.Runtime.ExperimentName.REACT_NATIVE_SPECIFIC_UI}),t.Runtime.experiments.register(t.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,"Enable JavaScript Profiler (legacy)",!1),t.Runtime.experiments.register(t.Runtime.ExperimentName.REACT_NATIVE_SPECIFIC_UI,"Show React Native-specific UI",!1),t.Runtime.experiments.enableExperimentsByDefault([t.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,t.Runtime.ExperimentName.REACT_NATIVE_SPECIFIC_UI]),self.runtime=t.Runtime.Runtime.instance({forceNew:!0}),new a.MainImpl.MainImpl; +import"../shell/shell.js";import*as e from"../../core/common/common.js";import*as t from"../../core/root/root.js";import*as o from"../../ui/legacy/legacy.js";import*as i from"../../core/i18n/i18n.js";import*as n from"../../models/issues_manager/issues_manager.js";import*as a from"../../core/sdk/sdk.js";import*as r from"../../models/workspace/workspace.js";import*as s from"../../panels/network/forward/forward.js";import*as l from"../main/main.js";const c={toggleDeviceToolbar:"Toggle device toolbar",captureScreenshot:"Capture screenshot",captureFullSizeScreenshot:"Capture full size screenshot",captureNodeScreenshot:"Capture node screenshot",showMediaQueries:"Show media queries",device:"device",hideMediaQueries:"Hide media queries",showRulers:"Show rulers in the Device Mode toolbar",hideRulers:"Hide rulers in the Device Mode toolbar",showDeviceFrame:"Show device frame",hideDeviceFrame:"Hide device frame"},g=i.i18n.registerUIStrings("panels/emulation/emulation-meta.ts",c),d=i.i18n.getLazilyComputedLocalizedString.bind(void 0,g);let u;async function m(){return u||(u=await import("../../panels/emulation/emulation.js")),u}o.ActionRegistration.registerActionExtension({category:o.ActionRegistration.ActionCategory.MOBILE,actionId:"emulation.toggle-device-mode",toggleable:!0,loadActionDelegate:async()=>(await m()).DeviceModeWrapper.ActionDelegate.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,title:d(c.toggleDeviceToolbar),iconClass:"devices",bindings:[{platform:"windows,linux",shortcut:"Shift+Ctrl+M"},{platform:"mac",shortcut:"Shift+Meta+M"}]}),o.ActionRegistration.registerActionExtension({actionId:"emulation.capture-screenshot",category:o.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await m()).DeviceModeWrapper.ActionDelegate.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,title:d(c.captureScreenshot)}),o.ActionRegistration.registerActionExtension({actionId:"emulation.capture-full-height-screenshot",category:o.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await m()).DeviceModeWrapper.ActionDelegate.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,title:d(c.captureFullSizeScreenshot)}),o.ActionRegistration.registerActionExtension({actionId:"emulation.capture-node-screenshot",category:o.ActionRegistration.ActionCategory.SCREENSHOT,loadActionDelegate:async()=>(await m()).DeviceModeWrapper.ActionDelegate.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,title:d(c.captureNodeScreenshot)}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.MOBILE,settingName:"showMediaQueryInspector",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:d(c.showMediaQueries)},{value:!1,title:d(c.hideMediaQueries)}],tags:[d(c.device)]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.MOBILE,settingName:"emulation.showRulers",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:d(c.showRulers)},{value:!1,title:d(c.hideRulers)}],tags:[d(c.device)]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.MOBILE,settingName:"emulation.showDeviceOutline",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,options:[{value:!0,title:d(c.showDeviceFrame)},{value:!1,title:d(c.hideDeviceFrame)}],tags:[d(c.device)]}),o.Toolbar.registerToolbarItem({actionId:"emulation.toggle-device-mode",condition:t.Runtime.ConditionName.CAN_DOCK,location:o.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,order:1,showLabel:void 0,loadItem:void 0,separator:void 0}),e.AppProvider.registerAppProvider({loadAppProvider:async()=>(await m()).AdvancedApp.AdvancedAppProvider.instance(),condition:t.Runtime.ConditionName.CAN_DOCK,order:0}),o.ContextMenu.registerItem({location:o.ContextMenu.ItemLocation.DEVICE_MODE_MENU_SAVE,order:12,actionId:"emulation.capture-screenshot"}),o.ContextMenu.registerItem({location:o.ContextMenu.ItemLocation.DEVICE_MODE_MENU_SAVE,order:13,actionId:"emulation.capture-full-height-screenshot"});const p={sensors:"Sensors",geolocation:"geolocation",timezones:"timezones",locale:"locale",locales:"locales",accelerometer:"accelerometer",deviceOrientation:"device orientation",locations:"Locations",touch:"Touch",devicebased:"Device-based",forceEnabled:"Force enabled",emulateIdleDetectorState:"Emulate Idle Detector state",noIdleEmulation:"No idle emulation",userActiveScreenUnlocked:"User active, screen unlocked",userActiveScreenLocked:"User active, screen locked",userIdleScreenUnlocked:"User idle, screen unlocked",userIdleScreenLocked:"User idle, screen locked",showSensors:"Show Sensors",showLocations:"Show Locations"},w=i.i18n.registerUIStrings("panels/sensors/sensors-meta.ts",p),S=i.i18n.getLazilyComputedLocalizedString.bind(void 0,w);let y;async function R(){return y||(y=await import("../../panels/sensors/sensors.js")),y}o.ViewManager.registerViewExtension({location:"drawer-view",commandPrompt:S(p.showSensors),title:S(p.sensors),id:"sensors",persistence:"closeable",order:100,loadView:async()=>(await R()).SensorsView.SensorsView.instance(),tags:[S(p.geolocation),S(p.timezones),S(p.locale),S(p.locales),S(p.accelerometer),S(p.deviceOrientation)]}),o.ViewManager.registerViewExtension({location:"settings-view",id:"emulation-locations",commandPrompt:S(p.showLocations),title:S(p.locations),order:40,loadView:async()=>(await R()).LocationsSettingsTab.LocationsSettingsTab.instance(),settings:["emulation.locations"]}),e.Settings.registerSettingExtension({storageType:e.Settings.SettingStorageType.Synced,settingName:"emulation.locations",settingType:e.Settings.SettingType.ARRAY,defaultValue:[{title:"Berlin",lat:52.520007,long:13.404954,timezoneId:"Europe/Berlin",locale:"de-DE"},{title:"London",lat:51.507351,long:-.127758,timezoneId:"Europe/London",locale:"en-GB"},{title:"Moscow",lat:55.755826,long:37.6173,timezoneId:"Europe/Moscow",locale:"ru-RU"},{title:"Mountain View",lat:37.386052,long:-122.083851,timezoneId:"America/Los_Angeles",locale:"en-US"},{title:"Mumbai",lat:19.075984,long:72.877656,timezoneId:"Asia/Kolkata",locale:"mr-IN"},{title:"San Francisco",lat:37.774929,long:-122.419416,timezoneId:"America/Los_Angeles",locale:"en-US"},{title:"Shanghai",lat:31.230416,long:121.473701,timezoneId:"Asia/Shanghai",locale:"zh-Hans-CN"},{title:"São Paulo",lat:-23.55052,long:-46.633309,timezoneId:"America/Sao_Paulo",locale:"pt-BR"},{title:"Tokyo",lat:35.689487,long:139.691706,timezoneId:"Asia/Tokyo",locale:"ja-JP"}]}),e.Settings.registerSettingExtension({title:S(p.touch),reloadRequired:!0,settingName:"emulation.touch",settingType:e.Settings.SettingType.ENUM,defaultValue:"none",options:[{value:"none",title:S(p.devicebased),text:S(p.devicebased)},{value:"force",title:S(p.forceEnabled),text:S(p.forceEnabled)}]}),e.Settings.registerSettingExtension({title:S(p.emulateIdleDetectorState),settingName:"emulation.idleDetection",settingType:e.Settings.SettingType.ENUM,defaultValue:"none",options:[{value:"none",title:S(p.noIdleEmulation),text:S(p.noIdleEmulation)},{value:'{"isUserActive":true,"isScreenUnlocked":true}',title:S(p.userActiveScreenUnlocked),text:S(p.userActiveScreenUnlocked)},{value:'{"isUserActive":true,"isScreenUnlocked":false}',title:S(p.userActiveScreenLocked),text:S(p.userActiveScreenLocked)},{value:'{"isUserActive":false,"isScreenUnlocked":true}',title:S(p.userIdleScreenUnlocked),text:S(p.userIdleScreenUnlocked)},{value:'{"isUserActive":false,"isScreenUnlocked":false}',title:S(p.userIdleScreenLocked),text:S(p.userIdleScreenLocked)}]});const A={developerResources:"Developer Resources",showDeveloperResources:"Show Developer Resources"},h=i.i18n.registerUIStrings("panels/developer_resources/developer_resources-meta.ts",A),v=i.i18n.getLazilyComputedLocalizedString.bind(void 0,h);let E;o.ViewManager.registerViewExtension({location:"drawer-view",id:"resource-loading-pane",title:v(A.developerResources),commandPrompt:v(A.showDeveloperResources),order:100,persistence:"closeable",experiment:t.Runtime.ExperimentName.DEVELOPER_RESOURCES_VIEW,loadView:async()=>new((await async function(){return E||(E=await import("../../panels/developer_resources/developer_resources.js")),E}()).DeveloperResourcesView.DeveloperResourcesView)});const T={rendering:"Rendering",showRendering:"Show Rendering",paint:"paint",layout:"layout",fps:"fps",cssMediaType:"CSS media type",cssMediaFeature:"CSS media feature",visionDeficiency:"vision deficiency",colorVisionDeficiency:"color vision deficiency",reloadPage:"Reload page",hardReloadPage:"Hard reload page",forceAdBlocking:"Force ad blocking on this site",blockAds:"Block ads on this site",showAds:"Show ads on this site, if allowed",autoOpenDevTools:"Auto-open DevTools for popups",doNotAutoOpen:"Do not auto-open DevTools for popups",disablePaused:"Disable paused state overlay",toggleCssPrefersColorSchemeMedia:"Toggle CSS media feature prefers-color-scheme"},N=i.i18n.registerUIStrings("entrypoints/inspector_main/inspector_main-meta.ts",T),f=i.i18n.getLazilyComputedLocalizedString.bind(void 0,N);let C;async function k(){return C||(C=await import("../inspector_main/inspector_main.js")),C}o.ViewManager.registerViewExtension({location:"drawer-view",id:"rendering",title:f(T.rendering),commandPrompt:f(T.showRendering),persistence:"closeable",order:50,loadView:async()=>(await k()).RenderingOptions.RenderingOptionsView.instance(),tags:[f(T.paint),f(T.layout),f(T.fps),f(T.cssMediaType),f(T.cssMediaFeature),f(T.visionDeficiency),f(T.colorVisionDeficiency)]}),o.ActionRegistration.registerActionExtension({category:o.ActionRegistration.ActionCategory.NAVIGATION,actionId:"inspector_main.reload",loadActionDelegate:async()=>(await k()).InspectorMain.ReloadActionDelegate.instance(),iconClass:"refresh",title:f(T.reloadPage),bindings:[{platform:"windows,linux",shortcut:"Ctrl+R"},{platform:"windows,linux",shortcut:"F5"},{platform:"mac",shortcut:"Meta+R"}]}),o.ActionRegistration.registerActionExtension({category:o.ActionRegistration.ActionCategory.NAVIGATION,actionId:"inspector_main.hard-reload",loadActionDelegate:async()=>(await k()).InspectorMain.ReloadActionDelegate.instance(),title:f(T.hardReloadPage),bindings:[{platform:"windows,linux",shortcut:"Shift+Ctrl+R"},{platform:"windows,linux",shortcut:"Shift+F5"},{platform:"windows,linux",shortcut:"Ctrl+F5"},{platform:"windows,linux",shortcut:"Ctrl+Shift+F5"},{platform:"mac",shortcut:"Shift+Meta+R"}]}),o.ActionRegistration.registerActionExtension({actionId:"rendering.toggle-prefers-color-scheme",category:o.ActionRegistration.ActionCategory.RENDERING,title:f(T.toggleCssPrefersColorSchemeMedia),loadActionDelegate:async()=>(await k()).RenderingOptions.ReloadActionDelegate.instance()}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.NETWORK,title:f(T.forceAdBlocking),settingName:"network.adBlockingEnabled",settingType:e.Settings.SettingType.BOOLEAN,storageType:e.Settings.SettingStorageType.Session,defaultValue:!1,options:[{value:!0,title:f(T.blockAds)},{value:!1,title:f(T.showAds)}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.GLOBAL,storageType:e.Settings.SettingStorageType.Synced,title:f(T.autoOpenDevTools),settingName:"autoAttachToCreatedPages",settingType:e.Settings.SettingType.BOOLEAN,order:2,defaultValue:!1,options:[{value:!0,title:f(T.autoOpenDevTools)},{value:!1,title:f(T.doNotAutoOpen)}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.APPEARANCE,storageType:e.Settings.SettingStorageType.Synced,title:f(T.disablePaused),settingName:"disablePausedStateOverlay",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1}),o.Toolbar.registerToolbarItem({loadItem:async()=>(await k()).InspectorMain.NodeIndicator.instance(),order:2,location:o.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_LEFT,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0}),o.Toolbar.registerToolbarItem({loadItem:async()=>(await k()).OutermostTargetSelector.OutermostTargetSelector.instance(),order:98,location:o.Toolbar.ToolbarItemLocation.MAIN_TOOLBAR_RIGHT,showLabel:void 0,condition:void 0,separator:void 0,actionId:void 0,experiment:t.Runtime.ExperimentName.OUTERMOST_TARGET_SELECTOR});const I={issues:"Issues",showIssues:"Show Issues",cspViolations:"CSP Violations",showCspViolations:"Show CSP Violations"},P=i.i18n.registerUIStrings("panels/issues/issues-meta.ts",I),x=i.i18n.getLazilyComputedLocalizedString.bind(void 0,P);let b;async function L(){return b||(b=await import("../../panels/issues/issues.js")),b}o.ViewManager.registerViewExtension({location:"drawer-view",id:"issues-pane",title:x(I.issues),commandPrompt:x(I.showIssues),order:100,persistence:"closeable",loadView:async()=>(await L()).IssuesPane.IssuesPane.instance()}),o.ViewManager.registerViewExtension({location:"drawer-view",id:"csp-violations-pane",title:x(I.cspViolations),commandPrompt:x(I.showCspViolations),order:100,persistence:"closeable",loadView:async()=>(await L()).CSPViolationsView.CSPViolationsView.instance(),experiment:t.Runtime.ExperimentName.CSP_VIOLATIONS_VIEW}),e.Revealer.registerRevealer({contextTypes:()=>[n.Issue.Issue],destination:e.Revealer.RevealerDestination.ISSUES_VIEW,loadRevealer:async()=>(await L()).IssueRevealer.IssueRevealer.instance()});const D={throttling:"Throttling",showThrottling:"Show Throttling",goOffline:"Go offline",device:"device",throttlingTag:"throttling",enableSlowGThrottling:"Enable slow `3G` throttling",enableFastGThrottling:"Enable fast `3G` throttling",goOnline:"Go online"},V=i.i18n.registerUIStrings("panels/mobile_throttling/mobile_throttling-meta.ts",D),O=i.i18n.getLazilyComputedLocalizedString.bind(void 0,V);let M;async function _(){return M||(M=await import("../../panels/mobile_throttling/mobile_throttling.js")),M}o.ViewManager.registerViewExtension({location:"settings-view",id:"throttling-conditions",title:O(D.throttling),commandPrompt:O(D.showThrottling),order:35,loadView:async()=>(await _()).ThrottlingSettingsTab.ThrottlingSettingsTab.instance(),settings:["customNetworkConditions"]}),o.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-offline",category:o.ActionRegistration.ActionCategory.NETWORK,title:O(D.goOffline),loadActionDelegate:async()=>(await _()).ThrottlingManager.ActionDelegate.instance(),tags:[O(D.device),O(D.throttlingTag)]}),o.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-low-end-mobile",category:o.ActionRegistration.ActionCategory.NETWORK,title:O(D.enableSlowGThrottling),loadActionDelegate:async()=>(await _()).ThrottlingManager.ActionDelegate.instance(),tags:[O(D.device),O(D.throttlingTag)]}),o.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-mid-tier-mobile",category:o.ActionRegistration.ActionCategory.NETWORK,title:O(D.enableFastGThrottling),loadActionDelegate:async()=>(await _()).ThrottlingManager.ActionDelegate.instance(),tags:[O(D.device),O(D.throttlingTag)]}),o.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-online",category:o.ActionRegistration.ActionCategory.NETWORK,title:O(D.goOnline),loadActionDelegate:async()=>(await _()).ThrottlingManager.ActionDelegate.instance(),tags:[O(D.device),O(D.throttlingTag)]}),e.Settings.registerSettingExtension({storageType:e.Settings.SettingStorageType.Synced,settingName:"customNetworkConditions",settingType:e.Settings.SettingType.ARRAY,defaultValue:[]});const U={showNetwork:"Show Network",network:"Network",showNetworkRequestBlocking:"Show Network request blocking",networkRequestBlocking:"Network request blocking",showNetworkConditions:"Show Network conditions",networkConditions:"Network conditions",diskCache:"disk cache",networkThrottling:"network throttling",showSearch:"Show Search",search:"Search",recordNetworkLog:"Record network log",stopRecordingNetworkLog:"Stop recording network log",hideRequestDetails:"Hide request details",colorcodeResourceTypes:"Color-code resource types",colorCode:"color code",resourceType:"resource type",colorCodeByResourceType:"Color code by resource type",useDefaultColors:"Use default colors",groupNetworkLogByFrame:"Group network log by frame",netWork:"network",frame:"frame",group:"group",groupNetworkLogItemsByFrame:"Group network log items by frame",dontGroupNetworkLogItemsByFrame:"Don't group network log items by frame",clear:"Clear network log"},B=i.i18n.registerUIStrings("panels/network/network-meta.ts",U),F=i.i18n.getLazilyComputedLocalizedString.bind(void 0,B);let z;async function W(){return z||(z=await import("../../panels/network/network.js")),z}function j(e){return void 0===z?[]:e(z)}o.ViewManager.registerViewExtension({location:"panel",id:"network",commandPrompt:F(U.showNetwork),title:F(U.network),order:40,condition:t.Runtime.ConditionName.REACT_NATIVE_UNSTABLE_NETWORK_PANEL,loadView:async()=>(await W()).NetworkPanel.NetworkPanel.instance()}),o.ViewManager.registerViewExtension({location:"drawer-view",id:"network.blocked-urls",commandPrompt:F(U.showNetworkRequestBlocking),title:F(U.networkRequestBlocking),persistence:"closeable",order:60,loadView:async()=>(await W()).BlockedURLsPane.BlockedURLsPane.instance()}),o.ViewManager.registerViewExtension({location:"drawer-view",id:"network.config",commandPrompt:F(U.showNetworkConditions),title:F(U.networkConditions),persistence:"closeable",order:40,tags:[F(U.diskCache),F(U.networkThrottling),i.i18n.lockedLazyString("useragent"),i.i18n.lockedLazyString("user agent"),i.i18n.lockedLazyString("user-agent")],loadView:async()=>(await W()).NetworkConfigView.NetworkConfigView.instance()}),o.ViewManager.registerViewExtension({location:"network-sidebar",id:"network.search-network-tab",commandPrompt:F(U.showSearch),title:F(U.search),persistence:"permanent",loadView:async()=>(await W()).NetworkPanel.SearchNetworkView.instance()}),o.ActionRegistration.registerActionExtension({actionId:"network.toggle-recording",category:o.ActionRegistration.ActionCategory.NETWORK,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await W()).NetworkPanel.ActionDelegate.instance(),options:[{value:!0,title:F(U.recordNetworkLog)},{value:!1,title:F(U.stopRecordingNetworkLog)}],bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),o.ActionRegistration.registerActionExtension({actionId:"network.clear",category:o.ActionRegistration.ActionCategory.NETWORK,title:F(U.clear),iconClass:"clear",loadActionDelegate:async()=>(await W()).NetworkPanel.ActionDelegate.instance(),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),bindings:[{shortcut:"Ctrl+L"},{shortcut:"Meta+K",platform:"mac"}]}),o.ActionRegistration.registerActionExtension({actionId:"network.hide-request-details",category:o.ActionRegistration.ActionCategory.NETWORK,title:F(U.hideRequestDetails),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await W()).NetworkPanel.ActionDelegate.instance(),bindings:[{shortcut:"Esc"}]}),o.ActionRegistration.registerActionExtension({actionId:"network.search",category:o.ActionRegistration.ActionCategory.NETWORK,title:F(U.search),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await W()).NetworkPanel.ActionDelegate.instance(),bindings:[{platform:"mac",shortcut:"Meta+F",keybindSets:["devToolsDefault","vsCode"]},{platform:"windows,linux",shortcut:"Ctrl+F",keybindSets:["devToolsDefault","vsCode"]}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.NETWORK,storageType:e.Settings.SettingStorageType.Synced,title:F(U.colorcodeResourceTypes),settingName:"networkColorCodeResourceTypes",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[F(U.colorCode),F(U.resourceType)],options:[{value:!0,title:F(U.colorCodeByResourceType)},{value:!1,title:F(U.useDefaultColors)}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.NETWORK,storageType:e.Settings.SettingStorageType.Synced,title:F(U.groupNetworkLogByFrame),settingName:"network.group-by-frame",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[F(U.netWork),F(U.frame),F(U.group)],options:[{value:!0,title:F(U.groupNetworkLogItemsByFrame)},{value:!1,title:F(U.dontGroupNetworkLogItemsByFrame)}]}),o.ViewManager.registerLocationResolver({name:"network-sidebar",category:o.ViewManager.ViewLocationCategory.NETWORK,loadResolver:async()=>(await W()).NetworkPanel.NetworkPanel.instance()}),o.ContextMenu.registerProvider({contextTypes:()=>[a.NetworkRequest.NetworkRequest,a.Resource.Resource,r.UISourceCode.UISourceCode],loadProvider:async()=>(await W()).NetworkPanel.ContextMenuProvider.instance(),experiment:void 0}),e.Revealer.registerRevealer({contextTypes:()=>[a.NetworkRequest.NetworkRequest],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await W()).NetworkPanel.RequestRevealer.instance()}),e.Revealer.registerRevealer({contextTypes:()=>[s.UIRequestLocation.UIRequestLocation],loadRevealer:async()=>(await W()).NetworkPanel.RequestLocationRevealer.instance(),destination:void 0}),e.Revealer.registerRevealer({contextTypes:()=>[s.NetworkRequestId.NetworkRequestId],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await W()).NetworkPanel.RequestIdRevealer.instance()}),e.Revealer.registerRevealer({contextTypes:()=>[s.UIFilter.UIRequestFilter],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await W()).NetworkPanel.NetworkLogWithFilterRevealer.instance()});const q={profiler:"Profiler",showProfiler:"Show Profiler",performance:"Performance",showPerformance:"Show Performance",startStopRecording:"Start/stop recording",showRecentTimelineSessions:"Show recent timeline sessions",record:"Record",stop:"Stop",startProfilingAndReloadPage:"Start profiling and reload page"},K=i.i18n.registerUIStrings("panels/js_profiler/js_profiler-meta.ts",q),G=i.i18n.getLazilyComputedLocalizedString.bind(void 0,K);let H,J;async function Q(){return J||(J=await import("../../panels/profiler/profiler.js")),J}async function Y(){return H||(H=await import("../../panels/timeline/timeline.js")),H}function X(e){return void 0===H?[]:e(H)}o.ViewManager.registerViewExtension({location:"panel",id:"js_profiler",title:G(q.profiler),commandPrompt:G(q.showProfiler),order:65,persistence:"permanent",experiment:t.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,loadView:async()=>(await Q()).ProfilesPanel.JSProfilerPanel.instance()}),o.ActionRegistration.registerActionExtension({actionId:"profiler.js-toggle-recording",category:o.ActionRegistration.ActionCategory.JAVASCRIPT_PROFILER,title:G(q.startStopRecording),iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===J?[]:(e=>[e.ProfilesPanel.JSProfilerPanel])(J),loadActionDelegate:async()=>(await Q()).ProfilesPanel.JSProfilerPanel.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),o.ActionRegistration.registerActionExtension({actionId:"timeline.show-history",loadActionDelegate:async()=>(await Y()).TimelinePanel.ActionDelegate.instance(),category:o.ActionRegistration.ActionCategory.PERFORMANCE,title:G(q.showRecentTimelineSessions),contextTypes:()=>X((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Ctrl+H"},{platform:"mac",shortcut:"Meta+Y"}]}),o.ActionRegistration.registerActionExtension({actionId:"timeline.toggle-recording",category:o.ActionRegistration.ActionCategory.PERFORMANCE,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>X((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Y()).TimelinePanel.ActionDelegate.instance(),options:[{value:!0,title:G(q.record)},{value:!1,title:G(q.stop)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),o.ActionRegistration.registerActionExtension({actionId:"timeline.record-reload",iconClass:"refresh",contextTypes:()=>X((e=>[e.TimelinePanel.TimelinePanel])),category:o.ActionRegistration.ActionCategory.PERFORMANCE,title:G(q.startProfilingAndReloadPage),loadActionDelegate:async()=>(await Y()).TimelinePanel.ActionDelegate.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+Shift+E"},{platform:"mac",shortcut:"Meta+Shift+E"}]});const Z={rnWelcome:"⚛️ Welcome",showRnWelcome:"Show React Native Welcome panel"},$=i.i18n.registerUIStrings("panels/rn_welcome/rn_welcome-meta.ts",Z),ee=i.i18n.getLazilyComputedLocalizedString.bind(void 0,$);let te;o.ViewManager.registerViewExtension({location:"panel",id:"rn-welcome",title:ee(Z.rnWelcome),commandPrompt:ee(Z.showRnWelcome),order:-10,persistence:"permanent",loadView:async()=>(await async function(){return te||(te=await import("../../panels/rn_welcome/rn_welcome.js")),te}()).RNWelcome.RNWelcomeImpl.instance(),experiment:t.Runtime.ExperimentName.REACT_NATIVE_SPECIFIC_UI}),t.Runtime.experiments.register(t.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,"Enable JavaScript Profiler (legacy)",!1),t.Runtime.experiments.register(t.Runtime.ExperimentName.REACT_NATIVE_SPECIFIC_UI,"Show React Native-specific UI",!1),t.Runtime.experiments.enableExperimentsByDefault([t.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,t.Runtime.ExperimentName.REACT_NATIVE_SPECIFIC_UI]),self.runtime=t.Runtime.Runtime.instance({forceNew:!0}),new l.MainImpl.MainImpl; diff --git a/packages/debugger-frontend/dist/third-party/front_end/entrypoints/worker_app/worker_app.js b/packages/debugger-frontend/dist/third-party/front_end/entrypoints/worker_app/worker_app.js index 379992bd6e67cd..eab4a9e84512f3 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/entrypoints/worker_app/worker_app.js +++ b/packages/debugger-frontend/dist/third-party/front_end/entrypoints/worker_app/worker_app.js @@ -1 +1 @@ -import"../shell/shell.js";import*as e from"../../core/sdk/sdk.js";import*as t from"../../ui/legacy/legacy.js";import*as i from"../../core/i18n/i18n.js";import*as o from"../../core/root/root.js";import*as n from"../../core/common/common.js";import*as r from"../../models/issues_manager/issues_manager.js";import*as a from"../../models/workspace/workspace.js";import*as s from"../../panels/network/forward/forward.js";import*as c from"../../panels/mobile_throttling/mobile_throttling.js";import*as l from"../../ui/legacy/components/utils/utils.js";import*as g from"../main/main.js";const d={showEventListenerBreakpoints:"Show Event Listener Breakpoints",eventListenerBreakpoints:"Event Listener Breakpoints",showCspViolationBreakpoints:"Show CSP Violation Breakpoints",cspViolationBreakpoints:"CSP Violation Breakpoints",showXhrfetchBreakpoints:"Show XHR/fetch Breakpoints",xhrfetchBreakpoints:"XHR/fetch Breakpoints",showDomBreakpoints:"Show DOM Breakpoints",domBreakpoints:"DOM Breakpoints",showGlobalListeners:"Show Global Listeners",globalListeners:"Global Listeners",page:"Page",showPage:"Show Page",overrides:"Overrides",showOverrides:"Show Overrides",contentScripts:"Content scripts",showContentScripts:"Show Content scripts"},w=i.i18n.registerUIStrings("panels/browser_debugger/browser_debugger-meta.ts",d),p=i.i18n.getLazilyComputedLocalizedString.bind(void 0,w);let m,u;async function R(){return m||(m=await import("../../panels/browser_debugger/browser_debugger.js")),m}async function y(){return u||(u=await import("../../panels/sources/sources.js")),u}t.ViewManager.registerViewExtension({loadView:async()=>(await R()).EventListenerBreakpointsSidebarPane.EventListenerBreakpointsSidebarPane.instance(),id:"sources.eventListenerBreakpoints",location:"sources.sidebar-bottom",commandPrompt:p(d.showEventListenerBreakpoints),title:p(d.eventListenerBreakpoints),order:9,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).CSPViolationBreakpointsSidebarPane.CSPViolationBreakpointsSidebarPane.instance(),id:"sources.cspViolationBreakpoints",location:"sources.sidebar-bottom",commandPrompt:p(d.showCspViolationBreakpoints),title:p(d.cspViolationBreakpoints),order:10,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).XHRBreakpointsSidebarPane.XHRBreakpointsSidebarPane.instance(),id:"sources.xhrBreakpoints",location:"sources.sidebar-bottom",commandPrompt:p(d.showXhrfetchBreakpoints),title:p(d.xhrfetchBreakpoints),order:5,persistence:"permanent",hasToolbar:!0}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance(),id:"sources.domBreakpoints",location:"sources.sidebar-bottom",commandPrompt:p(d.showDomBreakpoints),title:p(d.domBreakpoints),order:7,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).ObjectEventListenersSidebarPane.ObjectEventListenersSidebarPane.instance(),id:"sources.globalListeners",location:"sources.sidebar-bottom",commandPrompt:p(d.showGlobalListeners),title:p(d.globalListeners),order:8,persistence:"permanent",hasToolbar:!0}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance(),id:"elements.domBreakpoints",location:"elements-sidebar",commandPrompt:p(d.showDomBreakpoints),title:p(d.domBreakpoints),order:6,persistence:"permanent"}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-network",title:p(d.page),commandPrompt:p(d.showPage),order:2,persistence:"permanent",loadView:async()=>(await y()).SourcesNavigator.NetworkNavigatorView.instance()}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-overrides",title:p(d.overrides),commandPrompt:p(d.showOverrides),order:4,persistence:"permanent",loadView:async()=>(await y()).SourcesNavigator.OverridesNavigatorView.instance()}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-contentScripts",title:p(d.contentScripts),commandPrompt:p(d.showContentScripts),order:5,persistence:"permanent",loadView:async()=>(await y()).SourcesNavigator.ContentScriptsNavigatorView.instance()}),t.ContextMenu.registerProvider({contextTypes:()=>[e.DOMModel.DOMNode],loadProvider:async()=>(await R()).DOMBreakpointsSidebarPane.ContextMenuProvider.instance(),experiment:void 0}),t.Context.registerListener({contextTypes:()=>[e.DebuggerModel.DebuggerPausedDetails],loadListener:async()=>(await R()).XHRBreakpointsSidebarPane.XHRBreakpointsSidebarPane.instance()}),t.Context.registerListener({contextTypes:()=>[e.DebuggerModel.DebuggerPausedDetails],loadListener:async()=>(await R()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance()});const h={developerResources:"Developer Resources",showDeveloperResources:"Show Developer Resources"},A=i.i18n.registerUIStrings("panels/developer_resources/developer_resources-meta.ts",h),S=i.i18n.getLazilyComputedLocalizedString.bind(void 0,A);let k;t.ViewManager.registerViewExtension({location:"drawer-view",id:"resource-loading-pane",title:S(h.developerResources),commandPrompt:S(h.showDeveloperResources),order:100,persistence:"closeable",experiment:o.Runtime.ExperimentName.DEVELOPER_RESOURCES_VIEW,loadView:async()=>new((await async function(){return k||(k=await import("../../panels/developer_resources/developer_resources.js")),k}()).DeveloperResourcesView.DeveloperResourcesView)});const P={issues:"Issues",showIssues:"Show Issues",cspViolations:"CSP Violations",showCspViolations:"Show CSP Violations"},v=i.i18n.registerUIStrings("panels/issues/issues-meta.ts",P),E=i.i18n.getLazilyComputedLocalizedString.bind(void 0,v);let T;async function C(){return T||(T=await import("../../panels/issues/issues.js")),T}t.ViewManager.registerViewExtension({location:"drawer-view",id:"issues-pane",title:E(P.issues),commandPrompt:E(P.showIssues),order:100,persistence:"closeable",loadView:async()=>(await C()).IssuesPane.IssuesPane.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"csp-violations-pane",title:E(P.cspViolations),commandPrompt:E(P.showCspViolations),order:100,persistence:"closeable",loadView:async()=>(await C()).CSPViolationsView.CSPViolationsView.instance(),experiment:o.Runtime.ExperimentName.CSP_VIOLATIONS_VIEW}),n.Revealer.registerRevealer({contextTypes:()=>[r.Issue.Issue],destination:n.Revealer.RevealerDestination.ISSUES_VIEW,loadRevealer:async()=>(await C()).IssueRevealer.IssueRevealer.instance()});const f={resetView:"Reset view",switchToPanMode:"Switch to pan mode",switchToRotateMode:"Switch to rotate mode",zoomIn:"Zoom in",zoomOut:"Zoom out",panOrRotateUp:"Pan or rotate up",panOrRotateDown:"Pan or rotate down",panOrRotateLeft:"Pan or rotate left",panOrRotateRight:"Pan or rotate right"},b=i.i18n.registerUIStrings("panels/layer_viewer/layer_viewer-meta.ts",f),N=i.i18n.getLazilyComputedLocalizedString.bind(void 0,b);t.ActionRegistration.registerActionExtension({actionId:"layers.reset-view",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.resetView),bindings:[{shortcut:"0"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.pan-mode",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.switchToPanMode),bindings:[{shortcut:"x"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.rotate-mode",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.switchToRotateMode),bindings:[{shortcut:"v"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.zoom-in",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.zoomIn),bindings:[{shortcut:"Shift+Plus"},{shortcut:"NumpadPlus"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.zoom-out",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.zoomOut),bindings:[{shortcut:"Shift+Minus"},{shortcut:"NumpadMinus"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.up",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.panOrRotateUp),bindings:[{shortcut:"Up"},{shortcut:"w"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.down",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.panOrRotateDown),bindings:[{shortcut:"Down"},{shortcut:"s"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.left",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.panOrRotateLeft),bindings:[{shortcut:"Left"},{shortcut:"a"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.right",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.panOrRotateRight),bindings:[{shortcut:"Right"},{shortcut:"d"}]});const x={throttling:"Throttling",showThrottling:"Show Throttling",goOffline:"Go offline",device:"device",throttlingTag:"throttling",enableSlowGThrottling:"Enable slow `3G` throttling",enableFastGThrottling:"Enable fast `3G` throttling",goOnline:"Go online"},V=i.i18n.registerUIStrings("panels/mobile_throttling/mobile_throttling-meta.ts",x),L=i.i18n.getLazilyComputedLocalizedString.bind(void 0,V);let I;async function D(){return I||(I=await import("../../panels/mobile_throttling/mobile_throttling.js")),I}t.ViewManager.registerViewExtension({location:"settings-view",id:"throttling-conditions",title:L(x.throttling),commandPrompt:L(x.showThrottling),order:35,loadView:async()=>(await D()).ThrottlingSettingsTab.ThrottlingSettingsTab.instance(),settings:["customNetworkConditions"]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-offline",category:t.ActionRegistration.ActionCategory.NETWORK,title:L(x.goOffline),loadActionDelegate:async()=>(await D()).ThrottlingManager.ActionDelegate.instance(),tags:[L(x.device),L(x.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-low-end-mobile",category:t.ActionRegistration.ActionCategory.NETWORK,title:L(x.enableSlowGThrottling),loadActionDelegate:async()=>(await D()).ThrottlingManager.ActionDelegate.instance(),tags:[L(x.device),L(x.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-mid-tier-mobile",category:t.ActionRegistration.ActionCategory.NETWORK,title:L(x.enableFastGThrottling),loadActionDelegate:async()=>(await D()).ThrottlingManager.ActionDelegate.instance(),tags:[L(x.device),L(x.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-online",category:t.ActionRegistration.ActionCategory.NETWORK,title:L(x.goOnline),loadActionDelegate:async()=>(await D()).ThrottlingManager.ActionDelegate.instance(),tags:[L(x.device),L(x.throttlingTag)]}),n.Settings.registerSettingExtension({storageType:n.Settings.SettingStorageType.Synced,settingName:"customNetworkConditions",settingType:n.Settings.SettingType.ARRAY,defaultValue:[]});const M={showNetwork:"Show Network",network:"Network",showNetworkRequestBlocking:"Show Network request blocking",networkRequestBlocking:"Network request blocking",showNetworkConditions:"Show Network conditions",networkConditions:"Network conditions",diskCache:"disk cache",networkThrottling:"network throttling",showSearch:"Show Search",search:"Search",recordNetworkLog:"Record network log",stopRecordingNetworkLog:"Stop recording network log",hideRequestDetails:"Hide request details",colorcodeResourceTypes:"Color-code resource types",colorCode:"color code",resourceType:"resource type",colorCodeByResourceType:"Color code by resource type",useDefaultColors:"Use default colors",groupNetworkLogByFrame:"Group network log by frame",netWork:"network",frame:"frame",group:"group",groupNetworkLogItemsByFrame:"Group network log items by frame",dontGroupNetworkLogItemsByFrame:"Don't group network log items by frame",clear:"Clear network log"},O=i.i18n.registerUIStrings("panels/network/network-meta.ts",M),B=i.i18n.getLazilyComputedLocalizedString.bind(void 0,O);let _;async function F(){return _||(_=await import("../../panels/network/network.js")),_}function j(e){return void 0===_?[]:e(_)}t.ViewManager.registerViewExtension({location:"panel",id:"network",commandPrompt:B(M.showNetwork),title:B(M.network),order:40,loadView:async()=>(await F()).NetworkPanel.NetworkPanel.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"network.blocked-urls",commandPrompt:B(M.showNetworkRequestBlocking),title:B(M.networkRequestBlocking),persistence:"closeable",order:60,loadView:async()=>(await F()).BlockedURLsPane.BlockedURLsPane.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"network.config",commandPrompt:B(M.showNetworkConditions),title:B(M.networkConditions),persistence:"closeable",order:40,tags:[B(M.diskCache),B(M.networkThrottling),i.i18n.lockedLazyString("useragent"),i.i18n.lockedLazyString("user agent"),i.i18n.lockedLazyString("user-agent")],loadView:async()=>(await F()).NetworkConfigView.NetworkConfigView.instance()}),t.ViewManager.registerViewExtension({location:"network-sidebar",id:"network.search-network-tab",commandPrompt:B(M.showSearch),title:B(M.search),persistence:"permanent",loadView:async()=>(await F()).NetworkPanel.SearchNetworkView.instance()}),t.ActionRegistration.registerActionExtension({actionId:"network.toggle-recording",category:t.ActionRegistration.ActionCategory.NETWORK,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await F()).NetworkPanel.ActionDelegate.instance(),options:[{value:!0,title:B(M.recordNetworkLog)},{value:!1,title:B(M.stopRecordingNetworkLog)}],bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.clear",category:t.ActionRegistration.ActionCategory.NETWORK,title:B(M.clear),iconClass:"clear",loadActionDelegate:async()=>(await F()).NetworkPanel.ActionDelegate.instance(),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),bindings:[{shortcut:"Ctrl+L"},{shortcut:"Meta+K",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.hide-request-details",category:t.ActionRegistration.ActionCategory.NETWORK,title:B(M.hideRequestDetails),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await F()).NetworkPanel.ActionDelegate.instance(),bindings:[{shortcut:"Esc"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.search",category:t.ActionRegistration.ActionCategory.NETWORK,title:B(M.search),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await F()).NetworkPanel.ActionDelegate.instance(),bindings:[{platform:"mac",shortcut:"Meta+F",keybindSets:["devToolsDefault","vsCode"]},{platform:"windows,linux",shortcut:"Ctrl+F",keybindSets:["devToolsDefault","vsCode"]}]}),n.Settings.registerSettingExtension({category:n.Settings.SettingCategory.NETWORK,storageType:n.Settings.SettingStorageType.Synced,title:B(M.colorcodeResourceTypes),settingName:"networkColorCodeResourceTypes",settingType:n.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[B(M.colorCode),B(M.resourceType)],options:[{value:!0,title:B(M.colorCodeByResourceType)},{value:!1,title:B(M.useDefaultColors)}]}),n.Settings.registerSettingExtension({category:n.Settings.SettingCategory.NETWORK,storageType:n.Settings.SettingStorageType.Synced,title:B(M.groupNetworkLogByFrame),settingName:"network.group-by-frame",settingType:n.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[B(M.netWork),B(M.frame),B(M.group)],options:[{value:!0,title:B(M.groupNetworkLogItemsByFrame)},{value:!1,title:B(M.dontGroupNetworkLogItemsByFrame)}]}),t.ViewManager.registerLocationResolver({name:"network-sidebar",category:t.ViewManager.ViewLocationCategory.NETWORK,loadResolver:async()=>(await F()).NetworkPanel.NetworkPanel.instance()}),t.ContextMenu.registerProvider({contextTypes:()=>[e.NetworkRequest.NetworkRequest,e.Resource.Resource,a.UISourceCode.UISourceCode],loadProvider:async()=>(await F()).NetworkPanel.ContextMenuProvider.instance(),experiment:void 0}),n.Revealer.registerRevealer({contextTypes:()=>[e.NetworkRequest.NetworkRequest],destination:n.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await F()).NetworkPanel.RequestRevealer.instance()}),n.Revealer.registerRevealer({contextTypes:()=>[s.UIRequestLocation.UIRequestLocation],loadRevealer:async()=>(await F()).NetworkPanel.RequestLocationRevealer.instance(),destination:void 0}),n.Revealer.registerRevealer({contextTypes:()=>[s.NetworkRequestId.NetworkRequestId],destination:n.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await F()).NetworkPanel.RequestIdRevealer.instance()}),n.Revealer.registerRevealer({contextTypes:()=>[s.UIFilter.UIRequestFilter],destination:n.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await F()).NetworkPanel.NetworkLogWithFilterRevealer.instance()});const U={application:"Application",showApplication:"Show Application",pwa:"pwa",clearSiteData:"Clear site data",clearSiteDataIncludingThirdparty:"Clear site data (including third-party cookies)",startRecordingEvents:"Start recording events",stopRecordingEvents:"Stop recording events"},W=i.i18n.registerUIStrings("panels/application/application-meta.ts",U),z=i.i18n.getLazilyComputedLocalizedString.bind(void 0,W);let q;async function G(){return q||(q=await import("../../panels/application/application.js")),q}t.ViewManager.registerViewExtension({location:"panel",id:"resources",title:z(U.application),commandPrompt:z(U.showApplication),order:70,loadView:async()=>(await G()).ResourcesPanel.ResourcesPanel.instance(),tags:[z(U.pwa)]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.RESOURCES,actionId:"resources.clear",title:z(U.clearSiteData),loadActionDelegate:async()=>(await G()).StorageView.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.RESOURCES,actionId:"resources.clear-incl-third-party-cookies",title:z(U.clearSiteDataIncludingThirdparty),loadActionDelegate:async()=>(await G()).StorageView.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({actionId:"background-service.toggle-recording",iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===q?[]:(e=>[e.BackgroundServiceView.BackgroundServiceView])(q),loadActionDelegate:async()=>(await G()).BackgroundServiceView.ActionDelegate.instance(),category:t.ActionRegistration.ActionCategory.BACKGROUND_SERVICES,options:[{value:!0,title:z(U.startRecordingEvents)},{value:!1,title:z(U.stopRecordingEvents)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),n.Revealer.registerRevealer({contextTypes:()=>[e.Resource.Resource],destination:n.Revealer.RevealerDestination.APPLICATION_PANEL,loadRevealer:async()=>(await G()).ResourcesPanel.ResourceRevealer.instance()}),n.Revealer.registerRevealer({contextTypes:()=>[e.ResourceTreeModel.ResourceTreeFrame],destination:n.Revealer.RevealerDestination.APPLICATION_PANEL,loadRevealer:async()=>(await G()).ResourcesPanel.FrameDetailsRevealer.instance()});const K={performance:"Performance",showPerformance:"Show Performance",javascriptProfiler:"JavaScript Profiler",showJavascriptProfiler:"Show JavaScript Profiler",record:"Record",stop:"Stop",startProfilingAndReloadPage:"Start profiling and reload page",saveProfile:"Save profile…",loadProfile:"Load profile…",previousFrame:"Previous frame",nextFrame:"Next frame",showRecentTimelineSessions:"Show recent timeline sessions",previousRecording:"Previous recording",nextRecording:"Next recording",hideChromeFrameInLayersView:"Hide `chrome` frame in Layers view",startStopRecording:"Start/stop recording"},Y=i.i18n.registerUIStrings("panels/timeline/timeline-meta.ts",K),H=i.i18n.getLazilyComputedLocalizedString.bind(void 0,Y);let J,X;async function Z(){return J||(J=await import("../../panels/timeline/timeline.js")),J}async function Q(){return X||(X=await import("../../panels/profiler/profiler.js")),X}function $(e){return void 0===J?[]:e(J)}t.ViewManager.registerViewExtension({location:"panel",id:"timeline",title:H(K.performance),commandPrompt:H(K.showPerformance),order:50,loadView:async()=>(await Z()).TimelinePanel.TimelinePanel.instance()}),t.ViewManager.registerViewExtension({location:"panel",id:"js_profiler",title:H(K.javascriptProfiler),commandPrompt:H(K.showJavascriptProfiler),persistence:"closeable",order:65,experiment:o.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,loadView:async()=>(await Q()).ProfilesPanel.JSProfilerPanel.instance()}),t.ActionRegistration.registerActionExtension({actionId:"timeline.toggle-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),options:[{value:!0,title:H(K.record)},{value:!1,title:H(K.stop)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.record-reload",iconClass:"refresh",contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:H(K.startProfilingAndReloadPage),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+Shift+E"},{platform:"mac",shortcut:"Meta+Shift+E"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.PERFORMANCE,actionId:"timeline.save-to-file",contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),title:H(K.saveProfile),bindings:[{platform:"windows,linux",shortcut:"Ctrl+S"},{platform:"mac",shortcut:"Meta+S"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.PERFORMANCE,actionId:"timeline.load-from-file",contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),title:H(K.loadProfile),bindings:[{platform:"windows,linux",shortcut:"Ctrl+O"},{platform:"mac",shortcut:"Meta+O"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.jump-to-previous-frame",category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:H(K.previousFrame),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),bindings:[{shortcut:"["}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.jump-to-next-frame",category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:H(K.nextFrame),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),bindings:[{shortcut:"]"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.show-history",loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:H(K.showRecentTimelineSessions),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Ctrl+H"},{platform:"mac",shortcut:"Meta+Y"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.previous-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),title:H(K.previousRecording),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Alt+Left"},{platform:"mac",shortcut:"Meta+Left"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.next-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),title:H(K.nextRecording),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Alt+Right"},{platform:"mac",shortcut:"Meta+Right"}]}),t.ActionRegistration.registerActionExtension({actionId:"profiler.js-toggle-recording",category:t.ActionRegistration.ActionCategory.JAVASCRIPT_PROFILER,title:H(K.startStopRecording),iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===X?[]:(e=>[e.ProfilesPanel.JSProfilerPanel])(X),loadActionDelegate:async()=>(await Q()).ProfilesPanel.JSProfilerPanel.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),n.Settings.registerSettingExtension({category:n.Settings.SettingCategory.PERFORMANCE,storageType:n.Settings.SettingStorageType.Synced,title:H(K.hideChromeFrameInLayersView),settingName:"frameViewerHideChromeWindow",settingType:n.Settings.SettingType.BOOLEAN,defaultValue:!1}),n.Linkifier.registerLinkifier({contextTypes:()=>$((e=>[e.CLSLinkifier.CLSRect])),loadLinkifier:async()=>(await Z()).CLSLinkifier.Linkifier.instance()}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.TIMELINE_MENU_OPEN,actionId:"timeline.load-from-file",order:10}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.TIMELINE_MENU_OPEN,actionId:"timeline.save-to-file",order:15});const ee={main:"Main"},te=i.i18n.registerUIStrings("entrypoints/worker_app/WorkerMain.ts",ee),ie=i.i18n.getLocalizedString.bind(void 0,te);let oe;class ne{static instance(e={forceNew:null}){const{forceNew:t}=e;return oe&&!t||(oe=new ne),oe}async run(){e.Connections.initMainConnection((async()=>{await e.TargetManager.TargetManager.instance().maybeAttachInitialTarget()||e.TargetManager.TargetManager.instance().createTarget("main",ie(ee.main),e.Target.Type.ServiceWorker,null)}),l.TargetDetachedDialog.TargetDetachedDialog.webSocketConnectionLost),new c.NetworkPanelIndicator.NetworkPanelIndicator}}n.Runnable.registerEarlyInitializationRunnable(ne.instance),e.ChildTargetManager.ChildTargetManager.install((async({target:t,waitingForDebugger:i})=>{if(t.parentTarget()||t.type()!==e.Target.Type.ServiceWorker||!i)return;const o=t.model(e.DebuggerModel.DebuggerModel);o&&(o.isReadyToPause()||await o.once(e.DebuggerModel.Events.DebuggerIsReadyToPause),o.pause())})),self.runtime=o.Runtime.Runtime.instance({forceNew:!0}),new g.MainImpl.MainImpl; +import"../shell/shell.js";import*as e from"../../core/sdk/sdk.js";import*as t from"../../ui/legacy/legacy.js";import*as i from"../../core/i18n/i18n.js";import*as o from"../../core/root/root.js";import*as n from"../../core/common/common.js";import*as r from"../../models/issues_manager/issues_manager.js";import*as a from"../../models/workspace/workspace.js";import*as s from"../../panels/network/forward/forward.js";import*as c from"../../panels/mobile_throttling/mobile_throttling.js";import*as l from"../../ui/legacy/components/utils/utils.js";import*as g from"../main/main.js";const d={showEventListenerBreakpoints:"Show Event Listener Breakpoints",eventListenerBreakpoints:"Event Listener Breakpoints",showCspViolationBreakpoints:"Show CSP Violation Breakpoints",cspViolationBreakpoints:"CSP Violation Breakpoints",showXhrfetchBreakpoints:"Show XHR/fetch Breakpoints",xhrfetchBreakpoints:"XHR/fetch Breakpoints",showDomBreakpoints:"Show DOM Breakpoints",domBreakpoints:"DOM Breakpoints",showGlobalListeners:"Show Global Listeners",globalListeners:"Global Listeners",page:"Page",showPage:"Show Page",overrides:"Overrides",showOverrides:"Show Overrides",contentScripts:"Content scripts",showContentScripts:"Show Content scripts"},w=i.i18n.registerUIStrings("panels/browser_debugger/browser_debugger-meta.ts",d),p=i.i18n.getLazilyComputedLocalizedString.bind(void 0,w);let m,u;async function R(){return m||(m=await import("../../panels/browser_debugger/browser_debugger.js")),m}async function y(){return u||(u=await import("../../panels/sources/sources.js")),u}t.ViewManager.registerViewExtension({loadView:async()=>(await R()).EventListenerBreakpointsSidebarPane.EventListenerBreakpointsSidebarPane.instance(),id:"sources.eventListenerBreakpoints",location:"sources.sidebar-bottom",commandPrompt:p(d.showEventListenerBreakpoints),title:p(d.eventListenerBreakpoints),order:9,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).CSPViolationBreakpointsSidebarPane.CSPViolationBreakpointsSidebarPane.instance(),id:"sources.cspViolationBreakpoints",location:"sources.sidebar-bottom",commandPrompt:p(d.showCspViolationBreakpoints),title:p(d.cspViolationBreakpoints),order:10,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).XHRBreakpointsSidebarPane.XHRBreakpointsSidebarPane.instance(),id:"sources.xhrBreakpoints",location:"sources.sidebar-bottom",commandPrompt:p(d.showXhrfetchBreakpoints),title:p(d.xhrfetchBreakpoints),order:5,persistence:"permanent",hasToolbar:!0}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance(),id:"sources.domBreakpoints",location:"sources.sidebar-bottom",commandPrompt:p(d.showDomBreakpoints),title:p(d.domBreakpoints),order:7,persistence:"permanent"}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).ObjectEventListenersSidebarPane.ObjectEventListenersSidebarPane.instance(),id:"sources.globalListeners",location:"sources.sidebar-bottom",commandPrompt:p(d.showGlobalListeners),title:p(d.globalListeners),order:8,persistence:"permanent",hasToolbar:!0}),t.ViewManager.registerViewExtension({loadView:async()=>(await R()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance(),id:"elements.domBreakpoints",location:"elements-sidebar",commandPrompt:p(d.showDomBreakpoints),title:p(d.domBreakpoints),order:6,persistence:"permanent"}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-network",title:p(d.page),commandPrompt:p(d.showPage),order:2,persistence:"permanent",loadView:async()=>(await y()).SourcesNavigator.NetworkNavigatorView.instance()}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-overrides",title:p(d.overrides),commandPrompt:p(d.showOverrides),order:4,persistence:"permanent",loadView:async()=>(await y()).SourcesNavigator.OverridesNavigatorView.instance()}),t.ViewManager.registerViewExtension({location:"navigator-view",id:"navigator-contentScripts",title:p(d.contentScripts),commandPrompt:p(d.showContentScripts),order:5,persistence:"permanent",loadView:async()=>(await y()).SourcesNavigator.ContentScriptsNavigatorView.instance()}),t.ContextMenu.registerProvider({contextTypes:()=>[e.DOMModel.DOMNode],loadProvider:async()=>(await R()).DOMBreakpointsSidebarPane.ContextMenuProvider.instance(),experiment:void 0}),t.Context.registerListener({contextTypes:()=>[e.DebuggerModel.DebuggerPausedDetails],loadListener:async()=>(await R()).XHRBreakpointsSidebarPane.XHRBreakpointsSidebarPane.instance()}),t.Context.registerListener({contextTypes:()=>[e.DebuggerModel.DebuggerPausedDetails],loadListener:async()=>(await R()).DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance()});const A={developerResources:"Developer Resources",showDeveloperResources:"Show Developer Resources"},h=i.i18n.registerUIStrings("panels/developer_resources/developer_resources-meta.ts",A),S=i.i18n.getLazilyComputedLocalizedString.bind(void 0,h);let k;t.ViewManager.registerViewExtension({location:"drawer-view",id:"resource-loading-pane",title:S(A.developerResources),commandPrompt:S(A.showDeveloperResources),order:100,persistence:"closeable",experiment:o.Runtime.ExperimentName.DEVELOPER_RESOURCES_VIEW,loadView:async()=>new((await async function(){return k||(k=await import("../../panels/developer_resources/developer_resources.js")),k}()).DeveloperResourcesView.DeveloperResourcesView)});const P={issues:"Issues",showIssues:"Show Issues",cspViolations:"CSP Violations",showCspViolations:"Show CSP Violations"},v=i.i18n.registerUIStrings("panels/issues/issues-meta.ts",P),E=i.i18n.getLazilyComputedLocalizedString.bind(void 0,v);let T;async function C(){return T||(T=await import("../../panels/issues/issues.js")),T}t.ViewManager.registerViewExtension({location:"drawer-view",id:"issues-pane",title:E(P.issues),commandPrompt:E(P.showIssues),order:100,persistence:"closeable",loadView:async()=>(await C()).IssuesPane.IssuesPane.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"csp-violations-pane",title:E(P.cspViolations),commandPrompt:E(P.showCspViolations),order:100,persistence:"closeable",loadView:async()=>(await C()).CSPViolationsView.CSPViolationsView.instance(),experiment:o.Runtime.ExperimentName.CSP_VIOLATIONS_VIEW}),n.Revealer.registerRevealer({contextTypes:()=>[r.Issue.Issue],destination:n.Revealer.RevealerDestination.ISSUES_VIEW,loadRevealer:async()=>(await C()).IssueRevealer.IssueRevealer.instance()});const f={resetView:"Reset view",switchToPanMode:"Switch to pan mode",switchToRotateMode:"Switch to rotate mode",zoomIn:"Zoom in",zoomOut:"Zoom out",panOrRotateUp:"Pan or rotate up",panOrRotateDown:"Pan or rotate down",panOrRotateLeft:"Pan or rotate left",panOrRotateRight:"Pan or rotate right"},b=i.i18n.registerUIStrings("panels/layer_viewer/layer_viewer-meta.ts",f),N=i.i18n.getLazilyComputedLocalizedString.bind(void 0,b);t.ActionRegistration.registerActionExtension({actionId:"layers.reset-view",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.resetView),bindings:[{shortcut:"0"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.pan-mode",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.switchToPanMode),bindings:[{shortcut:"x"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.rotate-mode",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.switchToRotateMode),bindings:[{shortcut:"v"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.zoom-in",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.zoomIn),bindings:[{shortcut:"Shift+Plus"},{shortcut:"NumpadPlus"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.zoom-out",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.zoomOut),bindings:[{shortcut:"Shift+Minus"},{shortcut:"NumpadMinus"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.up",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.panOrRotateUp),bindings:[{shortcut:"Up"},{shortcut:"w"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.down",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.panOrRotateDown),bindings:[{shortcut:"Down"},{shortcut:"s"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.left",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.panOrRotateLeft),bindings:[{shortcut:"Left"},{shortcut:"a"}]}),t.ActionRegistration.registerActionExtension({actionId:"layers.right",category:t.ActionRegistration.ActionCategory.LAYERS,title:N(f.panOrRotateRight),bindings:[{shortcut:"Right"},{shortcut:"d"}]});const x={throttling:"Throttling",showThrottling:"Show Throttling",goOffline:"Go offline",device:"device",throttlingTag:"throttling",enableSlowGThrottling:"Enable slow `3G` throttling",enableFastGThrottling:"Enable fast `3G` throttling",goOnline:"Go online"},V=i.i18n.registerUIStrings("panels/mobile_throttling/mobile_throttling-meta.ts",x),L=i.i18n.getLazilyComputedLocalizedString.bind(void 0,V);let I;async function D(){return I||(I=await import("../../panels/mobile_throttling/mobile_throttling.js")),I}t.ViewManager.registerViewExtension({location:"settings-view",id:"throttling-conditions",title:L(x.throttling),commandPrompt:L(x.showThrottling),order:35,loadView:async()=>(await D()).ThrottlingSettingsTab.ThrottlingSettingsTab.instance(),settings:["customNetworkConditions"]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-offline",category:t.ActionRegistration.ActionCategory.NETWORK,title:L(x.goOffline),loadActionDelegate:async()=>(await D()).ThrottlingManager.ActionDelegate.instance(),tags:[L(x.device),L(x.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-low-end-mobile",category:t.ActionRegistration.ActionCategory.NETWORK,title:L(x.enableSlowGThrottling),loadActionDelegate:async()=>(await D()).ThrottlingManager.ActionDelegate.instance(),tags:[L(x.device),L(x.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-mid-tier-mobile",category:t.ActionRegistration.ActionCategory.NETWORK,title:L(x.enableFastGThrottling),loadActionDelegate:async()=>(await D()).ThrottlingManager.ActionDelegate.instance(),tags:[L(x.device),L(x.throttlingTag)]}),t.ActionRegistration.registerActionExtension({actionId:"network-conditions.network-online",category:t.ActionRegistration.ActionCategory.NETWORK,title:L(x.goOnline),loadActionDelegate:async()=>(await D()).ThrottlingManager.ActionDelegate.instance(),tags:[L(x.device),L(x.throttlingTag)]}),n.Settings.registerSettingExtension({storageType:n.Settings.SettingStorageType.Synced,settingName:"customNetworkConditions",settingType:n.Settings.SettingType.ARRAY,defaultValue:[]});const M={showNetwork:"Show Network",network:"Network",showNetworkRequestBlocking:"Show Network request blocking",networkRequestBlocking:"Network request blocking",showNetworkConditions:"Show Network conditions",networkConditions:"Network conditions",diskCache:"disk cache",networkThrottling:"network throttling",showSearch:"Show Search",search:"Search",recordNetworkLog:"Record network log",stopRecordingNetworkLog:"Stop recording network log",hideRequestDetails:"Hide request details",colorcodeResourceTypes:"Color-code resource types",colorCode:"color code",resourceType:"resource type",colorCodeByResourceType:"Color code by resource type",useDefaultColors:"Use default colors",groupNetworkLogByFrame:"Group network log by frame",netWork:"network",frame:"frame",group:"group",groupNetworkLogItemsByFrame:"Group network log items by frame",dontGroupNetworkLogItemsByFrame:"Don't group network log items by frame",clear:"Clear network log"},O=i.i18n.registerUIStrings("panels/network/network-meta.ts",M),B=i.i18n.getLazilyComputedLocalizedString.bind(void 0,O);let _;async function F(){return _||(_=await import("../../panels/network/network.js")),_}function j(e){return void 0===_?[]:e(_)}t.ViewManager.registerViewExtension({location:"panel",id:"network",commandPrompt:B(M.showNetwork),title:B(M.network),order:40,condition:o.Runtime.ConditionName.REACT_NATIVE_UNSTABLE_NETWORK_PANEL,loadView:async()=>(await F()).NetworkPanel.NetworkPanel.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"network.blocked-urls",commandPrompt:B(M.showNetworkRequestBlocking),title:B(M.networkRequestBlocking),persistence:"closeable",order:60,loadView:async()=>(await F()).BlockedURLsPane.BlockedURLsPane.instance()}),t.ViewManager.registerViewExtension({location:"drawer-view",id:"network.config",commandPrompt:B(M.showNetworkConditions),title:B(M.networkConditions),persistence:"closeable",order:40,tags:[B(M.diskCache),B(M.networkThrottling),i.i18n.lockedLazyString("useragent"),i.i18n.lockedLazyString("user agent"),i.i18n.lockedLazyString("user-agent")],loadView:async()=>(await F()).NetworkConfigView.NetworkConfigView.instance()}),t.ViewManager.registerViewExtension({location:"network-sidebar",id:"network.search-network-tab",commandPrompt:B(M.showSearch),title:B(M.search),persistence:"permanent",loadView:async()=>(await F()).NetworkPanel.SearchNetworkView.instance()}),t.ActionRegistration.registerActionExtension({actionId:"network.toggle-recording",category:t.ActionRegistration.ActionCategory.NETWORK,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await F()).NetworkPanel.ActionDelegate.instance(),options:[{value:!0,title:B(M.recordNetworkLog)},{value:!1,title:B(M.stopRecordingNetworkLog)}],bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.clear",category:t.ActionRegistration.ActionCategory.NETWORK,title:B(M.clear),iconClass:"clear",loadActionDelegate:async()=>(await F()).NetworkPanel.ActionDelegate.instance(),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),bindings:[{shortcut:"Ctrl+L"},{shortcut:"Meta+K",platform:"mac"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.hide-request-details",category:t.ActionRegistration.ActionCategory.NETWORK,title:B(M.hideRequestDetails),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await F()).NetworkPanel.ActionDelegate.instance(),bindings:[{shortcut:"Esc"}]}),t.ActionRegistration.registerActionExtension({actionId:"network.search",category:t.ActionRegistration.ActionCategory.NETWORK,title:B(M.search),contextTypes:()=>j((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await F()).NetworkPanel.ActionDelegate.instance(),bindings:[{platform:"mac",shortcut:"Meta+F",keybindSets:["devToolsDefault","vsCode"]},{platform:"windows,linux",shortcut:"Ctrl+F",keybindSets:["devToolsDefault","vsCode"]}]}),n.Settings.registerSettingExtension({category:n.Settings.SettingCategory.NETWORK,storageType:n.Settings.SettingStorageType.Synced,title:B(M.colorcodeResourceTypes),settingName:"networkColorCodeResourceTypes",settingType:n.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[B(M.colorCode),B(M.resourceType)],options:[{value:!0,title:B(M.colorCodeByResourceType)},{value:!1,title:B(M.useDefaultColors)}]}),n.Settings.registerSettingExtension({category:n.Settings.SettingCategory.NETWORK,storageType:n.Settings.SettingStorageType.Synced,title:B(M.groupNetworkLogByFrame),settingName:"network.group-by-frame",settingType:n.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[B(M.netWork),B(M.frame),B(M.group)],options:[{value:!0,title:B(M.groupNetworkLogItemsByFrame)},{value:!1,title:B(M.dontGroupNetworkLogItemsByFrame)}]}),t.ViewManager.registerLocationResolver({name:"network-sidebar",category:t.ViewManager.ViewLocationCategory.NETWORK,loadResolver:async()=>(await F()).NetworkPanel.NetworkPanel.instance()}),t.ContextMenu.registerProvider({contextTypes:()=>[e.NetworkRequest.NetworkRequest,e.Resource.Resource,a.UISourceCode.UISourceCode],loadProvider:async()=>(await F()).NetworkPanel.ContextMenuProvider.instance(),experiment:void 0}),n.Revealer.registerRevealer({contextTypes:()=>[e.NetworkRequest.NetworkRequest],destination:n.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await F()).NetworkPanel.RequestRevealer.instance()}),n.Revealer.registerRevealer({contextTypes:()=>[s.UIRequestLocation.UIRequestLocation],loadRevealer:async()=>(await F()).NetworkPanel.RequestLocationRevealer.instance(),destination:void 0}),n.Revealer.registerRevealer({contextTypes:()=>[s.NetworkRequestId.NetworkRequestId],destination:n.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await F()).NetworkPanel.RequestIdRevealer.instance()}),n.Revealer.registerRevealer({contextTypes:()=>[s.UIFilter.UIRequestFilter],destination:n.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await F()).NetworkPanel.NetworkLogWithFilterRevealer.instance()});const U={application:"Application",showApplication:"Show Application",pwa:"pwa",clearSiteData:"Clear site data",clearSiteDataIncludingThirdparty:"Clear site data (including third-party cookies)",startRecordingEvents:"Start recording events",stopRecordingEvents:"Stop recording events"},W=i.i18n.registerUIStrings("panels/application/application-meta.ts",U),z=i.i18n.getLazilyComputedLocalizedString.bind(void 0,W);let q;async function G(){return q||(q=await import("../../panels/application/application.js")),q}t.ViewManager.registerViewExtension({location:"panel",id:"resources",title:z(U.application),commandPrompt:z(U.showApplication),order:70,loadView:async()=>(await G()).ResourcesPanel.ResourcesPanel.instance(),tags:[z(U.pwa)]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.RESOURCES,actionId:"resources.clear",title:z(U.clearSiteData),loadActionDelegate:async()=>(await G()).StorageView.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.RESOURCES,actionId:"resources.clear-incl-third-party-cookies",title:z(U.clearSiteDataIncludingThirdparty),loadActionDelegate:async()=>(await G()).StorageView.ActionDelegate.instance()}),t.ActionRegistration.registerActionExtension({actionId:"background-service.toggle-recording",iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===q?[]:(e=>[e.BackgroundServiceView.BackgroundServiceView])(q),loadActionDelegate:async()=>(await G()).BackgroundServiceView.ActionDelegate.instance(),category:t.ActionRegistration.ActionCategory.BACKGROUND_SERVICES,options:[{value:!0,title:z(U.startRecordingEvents)},{value:!1,title:z(U.stopRecordingEvents)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),n.Revealer.registerRevealer({contextTypes:()=>[e.Resource.Resource],destination:n.Revealer.RevealerDestination.APPLICATION_PANEL,loadRevealer:async()=>(await G()).ResourcesPanel.ResourceRevealer.instance()}),n.Revealer.registerRevealer({contextTypes:()=>[e.ResourceTreeModel.ResourceTreeFrame],destination:n.Revealer.RevealerDestination.APPLICATION_PANEL,loadRevealer:async()=>(await G()).ResourcesPanel.FrameDetailsRevealer.instance()});const K={performance:"Performance",showPerformance:"Show Performance",javascriptProfiler:"JavaScript Profiler",showJavascriptProfiler:"Show JavaScript Profiler",record:"Record",stop:"Stop",startProfilingAndReloadPage:"Start profiling and reload page",saveProfile:"Save profile…",loadProfile:"Load profile…",previousFrame:"Previous frame",nextFrame:"Next frame",showRecentTimelineSessions:"Show recent timeline sessions",previousRecording:"Previous recording",nextRecording:"Next recording",hideChromeFrameInLayersView:"Hide `chrome` frame in Layers view",startStopRecording:"Start/stop recording"},Y=i.i18n.registerUIStrings("panels/timeline/timeline-meta.ts",K),H=i.i18n.getLazilyComputedLocalizedString.bind(void 0,Y);let J,X;async function Z(){return J||(J=await import("../../panels/timeline/timeline.js")),J}async function Q(){return X||(X=await import("../../panels/profiler/profiler.js")),X}function $(e){return void 0===J?[]:e(J)}t.ViewManager.registerViewExtension({location:"panel",id:"timeline",title:H(K.performance),commandPrompt:H(K.showPerformance),order:50,loadView:async()=>(await Z()).TimelinePanel.TimelinePanel.instance()}),t.ViewManager.registerViewExtension({location:"panel",id:"js_profiler",title:H(K.javascriptProfiler),commandPrompt:H(K.showJavascriptProfiler),persistence:"closeable",order:65,experiment:o.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE,loadView:async()=>(await Q()).ProfilesPanel.JSProfilerPanel.instance()}),t.ActionRegistration.registerActionExtension({actionId:"timeline.toggle-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),options:[{value:!0,title:H(K.record)},{value:!1,title:H(K.stop)}],bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.record-reload",iconClass:"refresh",contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:H(K.startProfilingAndReloadPage),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+Shift+E"},{platform:"mac",shortcut:"Meta+Shift+E"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.PERFORMANCE,actionId:"timeline.save-to-file",contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),title:H(K.saveProfile),bindings:[{platform:"windows,linux",shortcut:"Ctrl+S"},{platform:"mac",shortcut:"Meta+S"}]}),t.ActionRegistration.registerActionExtension({category:t.ActionRegistration.ActionCategory.PERFORMANCE,actionId:"timeline.load-from-file",contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),title:H(K.loadProfile),bindings:[{platform:"windows,linux",shortcut:"Ctrl+O"},{platform:"mac",shortcut:"Meta+O"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.jump-to-previous-frame",category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:H(K.previousFrame),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),bindings:[{shortcut:"["}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.jump-to-next-frame",category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:H(K.nextFrame),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),bindings:[{shortcut:"]"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.show-history",loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),category:t.ActionRegistration.ActionCategory.PERFORMANCE,title:H(K.showRecentTimelineSessions),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Ctrl+H"},{platform:"mac",shortcut:"Meta+Y"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.previous-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),title:H(K.previousRecording),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Alt+Left"},{platform:"mac",shortcut:"Meta+Left"}]}),t.ActionRegistration.registerActionExtension({actionId:"timeline.next-recording",category:t.ActionRegistration.ActionCategory.PERFORMANCE,loadActionDelegate:async()=>(await Z()).TimelinePanel.ActionDelegate.instance(),title:H(K.nextRecording),contextTypes:()=>$((e=>[e.TimelinePanel.TimelinePanel])),bindings:[{platform:"windows,linux",shortcut:"Alt+Right"},{platform:"mac",shortcut:"Meta+Right"}]}),t.ActionRegistration.registerActionExtension({actionId:"profiler.js-toggle-recording",category:t.ActionRegistration.ActionCategory.JAVASCRIPT_PROFILER,title:H(K.startStopRecording),iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>void 0===X?[]:(e=>[e.ProfilesPanel.JSProfilerPanel])(X),loadActionDelegate:async()=>(await Q()).ProfilesPanel.JSProfilerPanel.instance(),bindings:[{platform:"windows,linux",shortcut:"Ctrl+E"},{platform:"mac",shortcut:"Meta+E"}]}),n.Settings.registerSettingExtension({category:n.Settings.SettingCategory.PERFORMANCE,storageType:n.Settings.SettingStorageType.Synced,title:H(K.hideChromeFrameInLayersView),settingName:"frameViewerHideChromeWindow",settingType:n.Settings.SettingType.BOOLEAN,defaultValue:!1}),n.Linkifier.registerLinkifier({contextTypes:()=>$((e=>[e.CLSLinkifier.CLSRect])),loadLinkifier:async()=>(await Z()).CLSLinkifier.Linkifier.instance()}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.TIMELINE_MENU_OPEN,actionId:"timeline.load-from-file",order:10}),t.ContextMenu.registerItem({location:t.ContextMenu.ItemLocation.TIMELINE_MENU_OPEN,actionId:"timeline.save-to-file",order:15});const ee={main:"Main"},te=i.i18n.registerUIStrings("entrypoints/worker_app/WorkerMain.ts",ee),ie=i.i18n.getLocalizedString.bind(void 0,te);let oe;class ne{static instance(e={forceNew:null}){const{forceNew:t}=e;return oe&&!t||(oe=new ne),oe}async run(){e.Connections.initMainConnection((async()=>{await e.TargetManager.TargetManager.instance().maybeAttachInitialTarget()||e.TargetManager.TargetManager.instance().createTarget("main",ie(ee.main),e.Target.Type.ServiceWorker,null)}),l.TargetDetachedDialog.TargetDetachedDialog.webSocketConnectionLost),new c.NetworkPanelIndicator.NetworkPanelIndicator}}n.Runnable.registerEarlyInitializationRunnable(ne.instance),e.ChildTargetManager.ChildTargetManager.install((async({target:t,waitingForDebugger:i})=>{if(t.parentTarget()||t.type()!==e.Target.Type.ServiceWorker||!i)return;const o=t.model(e.DebuggerModel.DebuggerModel);o&&(o.isReadyToPause()||await o.once(e.DebuggerModel.Events.DebuggerIsReadyToPause),o.pause())})),self.runtime=o.Runtime.Runtime.instance({forceNew:!0}),new g.MainImpl.MainImpl; diff --git a/packages/debugger-frontend/dist/third-party/front_end/panels/network/network-meta.js b/packages/debugger-frontend/dist/third-party/front_end/panels/network/network-meta.js index afef2ac0e09b97..621d9f66abadb0 100644 --- a/packages/debugger-frontend/dist/third-party/front_end/panels/network/network-meta.js +++ b/packages/debugger-frontend/dist/third-party/front_end/panels/network/network-meta.js @@ -1 +1 @@ -import*as e from"../../core/common/common.js";import*as t from"../../core/i18n/i18n.js";import*as o from"../../core/sdk/sdk.js";import*as r from"../../models/workspace/workspace.js";import*as n from"./forward/forward.js";import*as a from"../../ui/legacy/legacy.js";const i={showNetwork:"Show Network",network:"Network",showNetworkRequestBlocking:"Show Network request blocking",networkRequestBlocking:"Network request blocking",showNetworkConditions:"Show Network conditions",networkConditions:"Network conditions",diskCache:"disk cache",networkThrottling:"network throttling",showSearch:"Show Search",search:"Search",recordNetworkLog:"Record network log",stopRecordingNetworkLog:"Stop recording network log",hideRequestDetails:"Hide request details",colorcodeResourceTypes:"Color-code resource types",colorCode:"color code",resourceType:"resource type",colorCodeByResourceType:"Color code by resource type",useDefaultColors:"Use default colors",groupNetworkLogByFrame:"Group network log by frame",netWork:"network",frame:"frame",group:"group",groupNetworkLogItemsByFrame:"Group network log items by frame",dontGroupNetworkLogItemsByFrame:"Don't group network log items by frame",clear:"Clear network log"},s=t.i18n.registerUIStrings("panels/network/network-meta.ts",i),c=t.i18n.getLazilyComputedLocalizedString.bind(void 0,s);let l;async function g(){return l||(l=await import("./network.js")),l}function w(e){return void 0===l?[]:e(l)}a.ViewManager.registerViewExtension({location:"panel",id:"network",commandPrompt:c(i.showNetwork),title:c(i.network),order:40,loadView:async()=>(await g()).NetworkPanel.NetworkPanel.instance()}),a.ViewManager.registerViewExtension({location:"drawer-view",id:"network.blocked-urls",commandPrompt:c(i.showNetworkRequestBlocking),title:c(i.networkRequestBlocking),persistence:"closeable",order:60,loadView:async()=>(await g()).BlockedURLsPane.BlockedURLsPane.instance()}),a.ViewManager.registerViewExtension({location:"drawer-view",id:"network.config",commandPrompt:c(i.showNetworkConditions),title:c(i.networkConditions),persistence:"closeable",order:40,tags:[c(i.diskCache),c(i.networkThrottling),t.i18n.lockedLazyString("useragent"),t.i18n.lockedLazyString("user agent"),t.i18n.lockedLazyString("user-agent")],loadView:async()=>(await g()).NetworkConfigView.NetworkConfigView.instance()}),a.ViewManager.registerViewExtension({location:"network-sidebar",id:"network.search-network-tab",commandPrompt:c(i.showSearch),title:c(i.search),persistence:"permanent",loadView:async()=>(await g()).NetworkPanel.SearchNetworkView.instance()}),a.ActionRegistration.registerActionExtension({actionId:"network.toggle-recording",category:a.ActionRegistration.ActionCategory.NETWORK,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>w((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await g()).NetworkPanel.ActionDelegate.instance(),options:[{value:!0,title:c(i.recordNetworkLog)},{value:!1,title:c(i.stopRecordingNetworkLog)}],bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),a.ActionRegistration.registerActionExtension({actionId:"network.clear",category:a.ActionRegistration.ActionCategory.NETWORK,title:c(i.clear),iconClass:"clear",loadActionDelegate:async()=>(await g()).NetworkPanel.ActionDelegate.instance(),contextTypes:()=>w((e=>[e.NetworkPanel.NetworkPanel])),bindings:[{shortcut:"Ctrl+L"},{shortcut:"Meta+K",platform:"mac"}]}),a.ActionRegistration.registerActionExtension({actionId:"network.hide-request-details",category:a.ActionRegistration.ActionCategory.NETWORK,title:c(i.hideRequestDetails),contextTypes:()=>w((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await g()).NetworkPanel.ActionDelegate.instance(),bindings:[{shortcut:"Esc"}]}),a.ActionRegistration.registerActionExtension({actionId:"network.search",category:a.ActionRegistration.ActionCategory.NETWORK,title:c(i.search),contextTypes:()=>w((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await g()).NetworkPanel.ActionDelegate.instance(),bindings:[{platform:"mac",shortcut:"Meta+F",keybindSets:["devToolsDefault","vsCode"]},{platform:"windows,linux",shortcut:"Ctrl+F",keybindSets:["devToolsDefault","vsCode"]}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.NETWORK,storageType:e.Settings.SettingStorageType.Synced,title:c(i.colorcodeResourceTypes),settingName:"networkColorCodeResourceTypes",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[c(i.colorCode),c(i.resourceType)],options:[{value:!0,title:c(i.colorCodeByResourceType)},{value:!1,title:c(i.useDefaultColors)}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.NETWORK,storageType:e.Settings.SettingStorageType.Synced,title:c(i.groupNetworkLogByFrame),settingName:"network.group-by-frame",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[c(i.netWork),c(i.frame),c(i.group)],options:[{value:!0,title:c(i.groupNetworkLogItemsByFrame)},{value:!1,title:c(i.dontGroupNetworkLogItemsByFrame)}]}),a.ViewManager.registerLocationResolver({name:"network-sidebar",category:a.ViewManager.ViewLocationCategory.NETWORK,loadResolver:async()=>(await g()).NetworkPanel.NetworkPanel.instance()}),a.ContextMenu.registerProvider({contextTypes:()=>[o.NetworkRequest.NetworkRequest,o.Resource.Resource,r.UISourceCode.UISourceCode],loadProvider:async()=>(await g()).NetworkPanel.ContextMenuProvider.instance(),experiment:void 0}),e.Revealer.registerRevealer({contextTypes:()=>[o.NetworkRequest.NetworkRequest],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await g()).NetworkPanel.RequestRevealer.instance()}),e.Revealer.registerRevealer({contextTypes:()=>[n.UIRequestLocation.UIRequestLocation],loadRevealer:async()=>(await g()).NetworkPanel.RequestLocationRevealer.instance(),destination:void 0}),e.Revealer.registerRevealer({contextTypes:()=>[n.NetworkRequestId.NetworkRequestId],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await g()).NetworkPanel.RequestIdRevealer.instance()}),e.Revealer.registerRevealer({contextTypes:()=>[n.UIFilter.UIRequestFilter],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await g()).NetworkPanel.NetworkLogWithFilterRevealer.instance()}); +import*as e from"../../core/common/common.js";import*as t from"../../core/i18n/i18n.js";import*as o from"../../core/root/root.js";import*as r from"../../core/sdk/sdk.js";import*as n from"../../models/workspace/workspace.js";import*as a from"./forward/forward.js";import*as i from"../../ui/legacy/legacy.js";const s={showNetwork:"Show Network",network:"Network",showNetworkRequestBlocking:"Show Network request blocking",networkRequestBlocking:"Network request blocking",showNetworkConditions:"Show Network conditions",networkConditions:"Network conditions",diskCache:"disk cache",networkThrottling:"network throttling",showSearch:"Show Search",search:"Search",recordNetworkLog:"Record network log",stopRecordingNetworkLog:"Stop recording network log",hideRequestDetails:"Hide request details",colorcodeResourceTypes:"Color-code resource types",colorCode:"color code",resourceType:"resource type",colorCodeByResourceType:"Color code by resource type",useDefaultColors:"Use default colors",groupNetworkLogByFrame:"Group network log by frame",netWork:"network",frame:"frame",group:"group",groupNetworkLogItemsByFrame:"Group network log items by frame",dontGroupNetworkLogItemsByFrame:"Don't group network log items by frame",clear:"Clear network log"},c=t.i18n.registerUIStrings("panels/network/network-meta.ts",s),l=t.i18n.getLazilyComputedLocalizedString.bind(void 0,c);let g;async function w(){return g||(g=await import("./network.js")),g}function d(e){return void 0===g?[]:e(g)}i.ViewManager.registerViewExtension({location:"panel",id:"network",commandPrompt:l(s.showNetwork),title:l(s.network),order:40,condition:o.Runtime.ConditionName.REACT_NATIVE_UNSTABLE_NETWORK_PANEL,loadView:async()=>(await w()).NetworkPanel.NetworkPanel.instance()}),i.ViewManager.registerViewExtension({location:"drawer-view",id:"network.blocked-urls",commandPrompt:l(s.showNetworkRequestBlocking),title:l(s.networkRequestBlocking),persistence:"closeable",order:60,loadView:async()=>(await w()).BlockedURLsPane.BlockedURLsPane.instance()}),i.ViewManager.registerViewExtension({location:"drawer-view",id:"network.config",commandPrompt:l(s.showNetworkConditions),title:l(s.networkConditions),persistence:"closeable",order:40,tags:[l(s.diskCache),l(s.networkThrottling),t.i18n.lockedLazyString("useragent"),t.i18n.lockedLazyString("user agent"),t.i18n.lockedLazyString("user-agent")],loadView:async()=>(await w()).NetworkConfigView.NetworkConfigView.instance()}),i.ViewManager.registerViewExtension({location:"network-sidebar",id:"network.search-network-tab",commandPrompt:l(s.showSearch),title:l(s.search),persistence:"permanent",loadView:async()=>(await w()).NetworkPanel.SearchNetworkView.instance()}),i.ActionRegistration.registerActionExtension({actionId:"network.toggle-recording",category:i.ActionRegistration.ActionCategory.NETWORK,iconClass:"record-start",toggleable:!0,toggledIconClass:"record-stop",toggleWithRedColor:!0,contextTypes:()=>d((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await w()).NetworkPanel.ActionDelegate.instance(),options:[{value:!0,title:l(s.recordNetworkLog)},{value:!1,title:l(s.stopRecordingNetworkLog)}],bindings:[{shortcut:"Ctrl+E",platform:"windows,linux"},{shortcut:"Meta+E",platform:"mac"}]}),i.ActionRegistration.registerActionExtension({actionId:"network.clear",category:i.ActionRegistration.ActionCategory.NETWORK,title:l(s.clear),iconClass:"clear",loadActionDelegate:async()=>(await w()).NetworkPanel.ActionDelegate.instance(),contextTypes:()=>d((e=>[e.NetworkPanel.NetworkPanel])),bindings:[{shortcut:"Ctrl+L"},{shortcut:"Meta+K",platform:"mac"}]}),i.ActionRegistration.registerActionExtension({actionId:"network.hide-request-details",category:i.ActionRegistration.ActionCategory.NETWORK,title:l(s.hideRequestDetails),contextTypes:()=>d((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await w()).NetworkPanel.ActionDelegate.instance(),bindings:[{shortcut:"Esc"}]}),i.ActionRegistration.registerActionExtension({actionId:"network.search",category:i.ActionRegistration.ActionCategory.NETWORK,title:l(s.search),contextTypes:()=>d((e=>[e.NetworkPanel.NetworkPanel])),loadActionDelegate:async()=>(await w()).NetworkPanel.ActionDelegate.instance(),bindings:[{platform:"mac",shortcut:"Meta+F",keybindSets:["devToolsDefault","vsCode"]},{platform:"windows,linux",shortcut:"Ctrl+F",keybindSets:["devToolsDefault","vsCode"]}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.NETWORK,storageType:e.Settings.SettingStorageType.Synced,title:l(s.colorcodeResourceTypes),settingName:"networkColorCodeResourceTypes",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[l(s.colorCode),l(s.resourceType)],options:[{value:!0,title:l(s.colorCodeByResourceType)},{value:!1,title:l(s.useDefaultColors)}]}),e.Settings.registerSettingExtension({category:e.Settings.SettingCategory.NETWORK,storageType:e.Settings.SettingStorageType.Synced,title:l(s.groupNetworkLogByFrame),settingName:"network.group-by-frame",settingType:e.Settings.SettingType.BOOLEAN,defaultValue:!1,tags:[l(s.netWork),l(s.frame),l(s.group)],options:[{value:!0,title:l(s.groupNetworkLogItemsByFrame)},{value:!1,title:l(s.dontGroupNetworkLogItemsByFrame)}]}),i.ViewManager.registerLocationResolver({name:"network-sidebar",category:i.ViewManager.ViewLocationCategory.NETWORK,loadResolver:async()=>(await w()).NetworkPanel.NetworkPanel.instance()}),i.ContextMenu.registerProvider({contextTypes:()=>[r.NetworkRequest.NetworkRequest,r.Resource.Resource,n.UISourceCode.UISourceCode],loadProvider:async()=>(await w()).NetworkPanel.ContextMenuProvider.instance(),experiment:void 0}),e.Revealer.registerRevealer({contextTypes:()=>[r.NetworkRequest.NetworkRequest],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await w()).NetworkPanel.RequestRevealer.instance()}),e.Revealer.registerRevealer({contextTypes:()=>[a.UIRequestLocation.UIRequestLocation],loadRevealer:async()=>(await w()).NetworkPanel.RequestLocationRevealer.instance(),destination:void 0}),e.Revealer.registerRevealer({contextTypes:()=>[a.NetworkRequestId.NetworkRequestId],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await w()).NetworkPanel.RequestIdRevealer.instance()}),e.Revealer.registerRevealer({contextTypes:()=>[a.UIFilter.UIRequestFilter],destination:e.Revealer.RevealerDestination.NETWORK_PANEL,loadRevealer:async()=>(await w()).NetworkPanel.NetworkLogWithFilterRevealer.instance()}); diff --git a/packages/debugger-frontend/package.json b/packages/debugger-frontend/package.json index 55ff9250d0b2eb..4c100152f8edbf 100644 --- a/packages/debugger-frontend/package.json +++ b/packages/debugger-frontend/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/debugger-frontend", - "version": "0.73.0", + "version": "0.74.0", "description": "Debugger frontend for React Native based on Chrome DevTools", "keywords": [ "react-native", diff --git a/packages/dev-middleware/package.json b/packages/dev-middleware/package.json index 8186610c2d89df..bd7b3e65cbf059 100644 --- a/packages/dev-middleware/package.json +++ b/packages/dev-middleware/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/dev-middleware", - "version": "0.73.1", + "version": "0.74.0", "description": "Dev server middleware for React Native", "keywords": [ "react-native", @@ -15,7 +15,7 @@ }, "license": "MIT", "exports": { - ".": "./src/index.js", + ".": "./dist/index.js", "./package.json": "./package.json" }, "files": [ @@ -23,17 +23,25 @@ ], "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "^0.73.0", + "@react-native/debugger-frontend": "0.74.0", + "@rnx-kit/chromium-edge-launcher": "^1.0.0", "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^1.0.0", "connect": "^3.6.5", "debug": "^2.2.0", "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", "open": "^7.0.3", + "selfsigned": "^2.4.1", "serve-static": "^1.13.1", - "temp-dir": "^2.0.0" + "temp-dir": "^2.0.0", + "ws": "^6.2.2" }, "engines": { "node": ">=18" + }, + "devDependencies": { + "data-uri-to-buffer": "^6.0.1", + "undici": "^5.27.2", + "wait-for-expect": "^3.0.2" } } diff --git a/packages/dev-middleware/src/__tests__/FetchUtils.js b/packages/dev-middleware/src/__tests__/FetchUtils.js new file mode 100644 index 00000000000000..9de0a10161bdc7 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/FetchUtils.js @@ -0,0 +1,70 @@ +/** + * 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 {JSONSerializable} from '../inspector-proxy/types'; +import typeof * as NodeFetch from 'node-fetch'; + +import https from 'https'; +import {Agent} from 'undici'; + +/** + * A version of `fetch` that is usable with the HTTPS server created in + * ServerUtils (which uses a self-signed certificate). + */ +export async function fetchLocal( + url: string, + options?: Parameters[1] & {dispatcher?: mixed}, +): ReturnType { + return await fetch(url, { + ...options, + // Node's native `fetch` comes from undici and supports the same options, + // including `dispatcher` which we use to make it accept self-signed + // certificates. + dispatcher: + options?.dispatcher ?? + new Agent({ + connect: { + rejectUnauthorized: false, + }, + }), + }); +} + +export async function fetchJson(url: string): Promise { + const response = await fetchLocal(url); + if (!response.ok) { + throw new Error(`HTTP ${response.status} ${response.statusText}`); + } + return response.json(); +} + +export function allowSelfSignedCertsInNodeFetch(): void { + jest.mock('node-fetch', () => { + const originalModule = jest.requireActual('node-fetch'); + const nodeFetch = originalModule.default; + return { + __esModule: true, + ...originalModule, + default: (url, options) => { + if ( + (url instanceof URL && url.protocol === 'https:') || + (typeof url === 'string' && url.startsWith('https:')) + ) { + const agent = new https.Agent({ + rejectUnauthorized: false, + }); + return nodeFetch(url.toString(), {agent, ...options}); + } + return nodeFetch(url, options); + }, + }; + }); +} diff --git a/packages/dev-middleware/src/__tests__/InspectorDebuggerUtils.js b/packages/dev-middleware/src/__tests__/InspectorDebuggerUtils.js new file mode 100644 index 00000000000000..98fbe08d0b1e9a --- /dev/null +++ b/packages/dev-middleware/src/__tests__/InspectorDebuggerUtils.js @@ -0,0 +1,122 @@ +/** + * 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 {JSONSerializable} from '../inspector-proxy/types'; +import type { + CdpMessageToTarget, + CdpResponseFromTarget, +} from './InspectorProtocolUtils'; + +import nullthrows from 'nullthrows'; +import until from 'wait-for-expect'; +import WebSocket from 'ws'; + +export class DebuggerAgent { + #ws: ?WebSocket; + #readyPromise: Promise; + + constructor(url: string, signal?: AbortSignal) { + const ws = new WebSocket(url, { + // The mock server uses a self-signed certificate. + rejectUnauthorized: false, + }); + this.#ws = ws; + ws.on('message', data => { + this.__handle(JSON.parse(data.toString())); + }); + if (signal != null) { + signal.addEventListener('abort', () => { + this.close(); + }); + } + this.#readyPromise = new Promise((resolve, reject) => { + ws.once('open', () => { + resolve(); + }); + ws.once('error', error => { + reject(error); + }); + }); + } + + __handle(message: JSONSerializable): void {} + + send(message: JSONSerializable) { + if (!this.#ws) { + return; + } + this.#ws.send(JSON.stringify(message)); + } + + ready(): Promise { + return this.#readyPromise; + } + + close() { + if (!this.#ws) { + return; + } + try { + this.#ws.terminate(); + } catch {} + this.#ws = null; + } + + // $FlowIgnore[unsafe-getters-setters] + get socket(): WebSocket { + return nullthrows(this.#ws); + } +} + +export class DebuggerMock extends DebuggerAgent { + // Empty handlers + +handle: JestMockFn<[message: JSONSerializable], void> = jest.fn(); + + __handle(message: JSONSerializable): void { + this.handle(message); + } + + async sendAndGetResponse( + message: CdpMessageToTarget, + ): Promise { + const originalHandleCallsArray = this.handle.mock.calls; + const originalHandleCallCount = originalHandleCallsArray.length; + this.send(message); + await until(() => + expect(this.handle).toHaveBeenCalledWith( + expect.objectContaining({ + id: message.id, + }), + ), + ); + // Find the first matching handle call that wasn't already in the mock calls + // array before we sent the message. + const newHandleCalls = + originalHandleCallsArray === this.handle.mock.calls + ? this.handle.mock.calls.slice(originalHandleCallCount) + : this.handle.mock.calls; + // $FlowIgnore[incompatible-use] + // $FlowIgnore[prop-missing] + const [response] = newHandleCalls.find(args => args[0].id === message.id); + // $FlowIgnore[incompatible-return] + // $FlowIgnore[incompatible-indexer] + return response; + } +} + +export async function createDebuggerMock( + url: string, + signal: AbortSignal, +): Promise { + const debuggerMock = new DebuggerMock(url, signal); + await debuggerMock.ready(); + return debuggerMock; +} diff --git a/packages/dev-middleware/src/__tests__/InspectorDeviceUtils.js b/packages/dev-middleware/src/__tests__/InspectorDeviceUtils.js new file mode 100644 index 00000000000000..0ccf1f39712747 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/InspectorDeviceUtils.js @@ -0,0 +1,161 @@ +/** + * 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 { + ConnectRequest, + DisconnectRequest, + GetPagesRequest, + GetPagesResponse, + JSONSerializable, + MessageFromDevice, + MessageToDevice, + WrappedEvent, +} from '../inspector-proxy/types'; + +import WebSocket from 'ws'; + +export class DeviceAgent { + #ws: ?WebSocket; + #readyPromise: Promise; + + constructor(url: string, signal?: AbortSignal) { + const ws = new WebSocket(url, { + // The mock server uses a self-signed certificate. + rejectUnauthorized: false, + }); + this.#ws = ws; + ws.on('message', data => { + this.__handle(JSON.parse(data.toString())); + }); + if (signal != null) { + signal.addEventListener('abort', () => { + this.close(); + }); + } + this.#readyPromise = new Promise((resolve, reject) => { + ws.once('open', () => { + resolve(); + }); + ws.once('error', error => { + reject(error); + }); + }); + } + + __handle(message: MessageToDevice): void {} + + send(message: MessageFromDevice) { + if (!this.#ws) { + return; + } + this.#ws.send(JSON.stringify(message)); + } + + ready(): Promise { + return this.#readyPromise; + } + + close() { + if (!this.#ws) { + return; + } + try { + this.#ws.terminate(); + } catch {} + this.#ws = null; + } + + sendWrappedEvent(pageId: string, event: JSONSerializable) { + this.send({ + event: 'wrappedEvent', + payload: { + pageId, + wrappedEvent: JSON.stringify(event), + }, + }); + } +} + +export class DeviceMock extends DeviceAgent { + // Empty handlers + +connect: JestMockFn<[message: ConnectRequest], void> = jest.fn(); + +disconnect: JestMockFn<[message: DisconnectRequest], void> = jest.fn(); + +getPages: JestMockFn< + [message: GetPagesRequest], + | GetPagesResponse['payload'] + | Promise + | void, + > = jest.fn(); + +wrappedEvent: JestMockFn<[message: WrappedEvent], void> = jest.fn(); + +wrappedEventParsed: JestMockFn< + [payload: {...WrappedEvent['payload'], wrappedEvent: JSONSerializable}], + void, + > = jest.fn(); + + __handle(message: MessageToDevice): void { + switch (message.event) { + case 'connect': + this.connect(message); + break; + case 'disconnect': + this.disconnect(message); + break; + case 'getPages': + const result = this.getPages(message); + this.#sendPayloadIfNonNull('getPages', result); + break; + case 'wrappedEvent': + this.wrappedEvent(message); + this.wrappedEventParsed({ + ...message.payload, + wrappedEvent: JSON.parse(message.payload.wrappedEvent), + }); + break; + default: + (message: empty); + throw new Error(`Unhandled event ${message.event}`); + } + } + + #sendPayloadIfNonNull( + event: Event, + maybePayload: + | MessageFromDevice['payload'] + | Promise + | void, + ) { + if (maybePayload == null) { + return; + } + if (maybePayload instanceof Promise) { + // eslint-disable-next-line no-void + void maybePayload.then(payload => { + if (!payload) { + return; + } + // $FlowFixMe[incompatible-call] TODO(moti) Figure out the right way to type maybePayload generically + this.send({event, payload}); + }); + return; + } + // $FlowFixMe[incompatible-call] TODO(moti) Figure out the right way to type maybePayload generically + this.send({event, payload: maybePayload}); + } +} + +export async function createDeviceMock( + url: string, + signal: AbortSignal, +): Promise { + const device = new DeviceMock(url, signal); + await device.ready(); + return device; +} diff --git a/packages/dev-middleware/src/__tests__/InspectorProtocolUtils.js b/packages/dev-middleware/src/__tests__/InspectorProtocolUtils.js new file mode 100644 index 00000000000000..b537323e7f4731 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/InspectorProtocolUtils.js @@ -0,0 +1,158 @@ +/** + * 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 { + JSONSerializable, + PageDescription, + PageFromDevice, +} from '../inspector-proxy/types'; +import type {DebuggerMock} from './InspectorDebuggerUtils'; +import type {DeviceMock} from './InspectorDeviceUtils'; + +import {fetchJson} from './FetchUtils'; +import {createDebuggerMock} from './InspectorDebuggerUtils'; +import {createDeviceMock} from './InspectorDeviceUtils'; +import {dataUriToBuffer} from 'data-uri-to-buffer'; +import until from 'wait-for-expect'; + +export type CdpMessageFromTarget = $ReadOnly<{ + method: string, + id?: number, + params?: JSONSerializable, +}>; + +export type CdpResponseFromTarget = $ReadOnly<{ + id: number, + result: JSONSerializable, +}>; + +export type CdpMessageToTarget = $ReadOnly<{ + method: string, + id: number, + params?: JSONSerializable, +}>; + +/** + * Send a CDP message from from the target with the given pageId to the debugger. + * Returns the message as received by the debugger. + */ +export async function sendFromTargetToDebugger( + device: DeviceMock, + debugger_: DebuggerMock, + pageId: string, + message: Message, +): Promise { + const originalHandleCallsArray = debugger_.handle.mock.calls; + const originalHandleCallCount = originalHandleCallsArray.length; + device.sendWrappedEvent(pageId, message); + await until(() => + expect(debugger_.handle).toBeCalledWith( + expect.objectContaining({ + method: message.method, + }), + ), + ); + // Find the first handle call that wasn't already in the mock calls array + // before we sent the message. + const newHandleCalls = + originalHandleCallsArray === debugger_.handle.mock.calls + ? debugger_.handle.mock.calls.slice(originalHandleCallCount) + : debugger_.handle.mock.calls; + // $FlowIgnore[incompatible-type] + const [receivedMessage]: [Message] = newHandleCalls.find( + // $FlowIgnore[incompatible-call] + (call: [Message]) => call[0].method === message.method, + ); + return receivedMessage; +} + +/** + * Send a CDP message from the debugger to the target with the given pageId. + * Returns the message as received by the target. + */ +export async function sendFromDebuggerToTarget( + debugger_: DebuggerMock, + device: DeviceMock, + pageId: string, + message: Message, +): Promise { + const originalEventCallsArray = device.wrappedEventParsed.mock.calls; + const originalEventCallCount = originalEventCallsArray.length; + debugger_.send(message); + await until(() => + expect(device.wrappedEventParsed).toBeCalledWith({ + pageId, + wrappedEvent: expect.objectContaining({id: message.id}), + }), + ); + // Find the first handle call that wasn't already in the mock calls array + // before we sent the message. + const newEventCalls = + originalEventCallsArray === device.wrappedEventParsed.mock.calls + ? device.wrappedEventParsed.mock.calls.slice(originalEventCallCount) + : device.wrappedEventParsed.mock.calls; + // $FlowIgnore[incompatible-use] + const [receivedMessage] = newEventCalls.find( + // $FlowIgnore[prop-missing] + // $FlowIgnore[incompatible-use] + call => call[0].wrappedEvent.id === message.id, + ); + // $FlowIgnore[incompatible-return] + return receivedMessage.wrappedEvent; +} + +export function parseJsonFromDataUri(uri: string): T { + expect(uri).toMatch(/^data:/); + const parsedUri = dataUriToBuffer(uri); + expect(parsedUri.type).toBe('application/json'); + return JSON.parse( + new TextDecoder(parsedUri.charset).decode(parsedUri.buffer), + ); +} + +export async function createAndConnectTarget( + serverRef: $ReadOnly<{ + serverBaseUrl: string, + serverBaseWsUrl: string, + ... + }>, + signal: AbortSignal, + page: PageFromDevice, +): Promise<{device: DeviceMock, debugger_: DebuggerMock}> { + let device; + let debugger_; + try { + device = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device&name=foo&app=bar`, + signal, + ); + device.getPages.mockImplementation(() => [page]); + + let pageList: Array = []; + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList).toHaveLength(1); + }); + const [{webSocketDebuggerUrl}] = pageList; + expect(webSocketDebuggerUrl).toBeDefined(); + + debugger_ = await createDebuggerMock(webSocketDebuggerUrl, signal); + await until(() => expect(device.connect).toBeCalled()); + } catch (e) { + device?.close(); + debugger_?.close(); + throw e; + } + return {device, debugger_}; +} diff --git a/packages/dev-middleware/src/__tests__/InspectorProxyCdpRewritingHacks-test.js b/packages/dev-middleware/src/__tests__/InspectorProxyCdpRewritingHacks-test.js new file mode 100644 index 00000000000000..51545ecd9be702 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/InspectorProxyCdpRewritingHacks-test.js @@ -0,0 +1,544 @@ +/** + * 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 {TargetCapabilityFlags} from '../inspector-proxy/types'; + +import {allowSelfSignedCertsInNodeFetch} from './FetchUtils'; +import { + createAndConnectTarget, + parseJsonFromDataUri, + sendFromDebuggerToTarget, + sendFromTargetToDebugger, +} from './InspectorProtocolUtils'; +import {withAbortSignalForEachTest} from './ResourceUtils'; +import { + serveStaticJson, + serveStaticText, + withServerForEachTest, +} from './ServerUtils'; +import {createHash} from 'crypto'; +import fs from 'fs'; +import path from 'path'; + +const fsPromise = fs.promises; + +// WebSocket is unreliable when using fake timers. +jest.useRealTimers(); + +jest.setTimeout(10000); + +beforeAll(() => { + // inspector-proxy uses node-fetch for source map fetching. + allowSelfSignedCertsInNodeFetch(); + + jest.resetModules(); +}); + +describe.each(['HTTP', 'HTTPS'])( + 'inspector proxy CDP rewriting hacks over %s', + protocol => { + const serverRef = withServerForEachTest({ + logger: undefined, + projectRoot: __dirname, + secure: protocol === 'HTTPS', + }); + const autoCleanup = withAbortSignalForEachTest(); + afterEach(() => { + jest.clearAllMocks(); + }); + + test('source map fetching in Debugger.scriptParsed', async () => { + serverRef.app.use( + '/source-map', + serveStaticJson({ + version: 3, + // Mojibake insurance. + file: '\u2757.js', + }), + ); + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + try { + const scriptParsedMessage = await sendFromTargetToDebugger( + device, + debugger_, + 'page1', + { + method: 'Debugger.scriptParsed', + params: { + sourceMapURL: `${serverRef.serverBaseUrl}/source-map`, + }, + }, + ); + expect( + parseJsonFromDataUri(scriptParsedMessage.params.sourceMapURL), + ).toEqual({version: 3, file: '\u2757.js'}); + } finally { + device.close(); + debugger_.close(); + } + }); + + test('handling of failure to fetch source map', async () => { + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + try { + const scriptParsedMessage = await sendFromTargetToDebugger( + device, + debugger_, + 'page1', + { + method: 'Debugger.scriptParsed', + params: { + sourceMapURL: `${serverRef.serverBaseUrl}/source-map-missing`, + }, + }, + ); + + // We don't rewrite the message in this case. + expect(scriptParsedMessage.params.sourceMapURL).toEqual( + `${serverRef.serverBaseUrl}/source-map-missing`, + ); + + // We send an error through to the debugger as a console message. + expect(debugger_.handle).toBeCalledWith( + expect.objectContaining({ + method: 'Runtime.consoleAPICalled', + params: { + args: [ + { + type: 'string', + value: expect.stringMatching('Failed to fetch source map'), + }, + ], + executionContextId: 0, + type: 'error', + }, + }), + ); + } finally { + device.close(); + debugger_.close(); + } + }); + + describe.each(['10.0.2.2', '10.0.3.2'])( + '%s aliasing to and from localhost', + sourceHost => { + test('in source map fetching during Debugger.scriptParsed', async () => { + serverRef.app.use('/source-map', serveStaticJson({version: 3})); + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + try { + const scriptParsedMessage = await sendFromTargetToDebugger( + device, + debugger_, + 'page1', + { + method: 'Debugger.scriptParsed', + params: { + sourceMapURL: `${protocol.toLowerCase()}://${sourceHost}:${ + serverRef.port + }/source-map`, + }, + }, + ); + expect( + parseJsonFromDataUri(scriptParsedMessage.params.sourceMapURL), + ).toEqual({version: 3}); + } finally { + device.close(); + debugger_.close(); + } + }); + + test('in Debugger.setBreakpointByUrl', async () => { + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + try { + const scriptParsedMessage = await sendFromTargetToDebugger( + device, + debugger_, + 'page1', + { + method: 'Debugger.scriptParsed', + params: { + url: `${protocol.toLowerCase()}://${sourceHost}:${ + serverRef.port + }/some/file.js`, + }, + }, + ); + expect(scriptParsedMessage.params.url).toEqual( + `${protocol.toLowerCase()}://localhost:${ + serverRef.port + }/some/file.js`, + ); + + const setBreakpointByUrlMessage = await sendFromDebuggerToTarget( + debugger_, + device, + 'page1', + { + id: 100, + method: 'Debugger.setBreakpointByUrl', + params: { + lineNumber: 1, + url: `${protocol.toLowerCase()}://localhost:${ + serverRef.port + }/some/file.js`, + }, + }, + ); + expect(setBreakpointByUrlMessage.params.url).toEqual( + `${protocol.toLowerCase()}://${sourceHost}:${ + serverRef.port + }/some/file.js`, + ); + + const setBreakpointByUrlRegexMessage = + await sendFromDebuggerToTarget(debugger_, device, 'page1', { + id: 200, + method: 'Debugger.setBreakpointByUrl', + params: { + lineNumber: 1, + urlRegex: 'localhost:1000|localhost:2000', + }, + }); + expect(setBreakpointByUrlRegexMessage.params.urlRegex).toEqual( + `${sourceHost}:1000|${sourceHost}:2000`, + ); + } finally { + device.close(); + debugger_.close(); + } + }); + }, + ); + + test('rewrites alphanumeric script IDs to file:// URIs', async () => { + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + try { + const scriptParsedMessage = await sendFromTargetToDebugger( + device, + debugger_, + 'page1', + { + method: 'Debugger.scriptParsed', + params: { + url: 'abcde12345', + }, + }, + ); + expect(scriptParsedMessage.params.url).toBe('file://abcde12345'); + } finally { + device.close(); + debugger_.close(); + } + }); + + describe('Debugger.getScriptSource', () => { + test('fetches source from server', async () => { + serverRef.app.use('/source', serveStaticText('foo')); + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + try { + await sendFromTargetToDebugger(device, debugger_, 'page1', { + method: 'Debugger.scriptParsed', + params: { + scriptId: 'script1', + url: `${serverRef.serverBaseUrl}/source`, + startLine: 0, + endLine: 0, + startColumn: 0, + endColumn: 0, + hash: createHash('sha256').update('foo').digest('hex'), + }, + }); + const response = await debugger_.sendAndGetResponse({ + id: 1, + method: 'Debugger.getScriptSource', + params: { + scriptId: 'script1', + }, + }); + expect(response.result).toEqual( + expect.objectContaining({scriptSource: 'foo'}), + ); + // The device does not receive the getScriptSource request, since it + // is handled by the proxy. + expect(device.wrappedEventParsed).not.toBeCalledWith({ + pageId: 'page1', + wrappedEvent: expect.objectContaining({ + method: 'Debugger.getScriptSource', + }), + }); + } finally { + device.close(); + debugger_.close(); + } + }); + + test('reads source from disk', async () => { + // Should be just 'foo\n', but the newline can get mangled by the OS + // and/or SCM, so let's read the source of truth from disk. + const fileRealContents = await fsPromise.readFile( + path.join(__dirname, '__fixtures__', 'mock-source-file.txt'), + 'utf8', + ); + + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + try { + await sendFromTargetToDebugger(device, debugger_, 'page1', { + method: 'Debugger.scriptParsed', + params: { + scriptId: 'script1', + url: '__fixtures__/mock-source-file.txt', + startLine: 0, + endLine: 0, + startColumn: 0, + endColumn: 0, + hash: createHash('sha256').update(fileRealContents).digest('hex'), + }, + }); + const response = await debugger_.sendAndGetResponse({ + id: 1, + method: 'Debugger.getScriptSource', + params: { + scriptId: 'script1', + }, + }); + expect(response.result).toEqual( + expect.objectContaining({scriptSource: fileRealContents}), + ); + // The device does not receive the getScriptSource request, since it + // is handled by the proxy. + expect(device.wrappedEventParsed).not.toBeCalledWith({ + pageId: 'page1', + wrappedEvent: expect.objectContaining({ + method: 'Debugger.getScriptSource', + }), + }); + } finally { + device.close(); + debugger_.close(); + } + }); + + test.each(['url', 'file'])( + 'reports %s fetch error back to debugger', + async resourceType => { + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + try { + await sendFromTargetToDebugger(device, debugger_, 'page1', { + method: 'Debugger.scriptParsed', + params: { + scriptId: 'script1', + url: + resourceType === 'url' + ? `${serverRef.serverBaseUrl}/source-missing` + : '__fixtures__/mock-source-file.does-not-exist', + startLine: 0, + endLine: 0, + startColumn: 0, + endColumn: 0, + hash: createHash('sha256').update('foo').digest('hex'), + }, + }); + const response = await debugger_.sendAndGetResponse({ + id: 1, + method: 'Debugger.getScriptSource', + params: { + scriptId: 'script1', + }, + }); + + // We mark the request as failed. + expect(response).toEqual({ + id: 1, + result: { + error: { + message: expect.stringMatching( + `Failed to fetch source ${resourceType}`, + ), + }, + }, + }); + + // We also send an error through to the debugger as a console message. + expect(debugger_.handle).toBeCalledWith( + expect.objectContaining({ + method: 'Runtime.consoleAPICalled', + params: { + args: [ + { + type: 'string', + value: expect.stringMatching( + `Failed to fetch source ${resourceType}`, + ), + }, + ], + executionContextId: 0, + type: 'error', + }, + }), + ); + + // The device does not receive the getScriptSource request, since it + // is handled by the proxy. + expect(device.wrappedEventParsed).not.toBeCalledWith({ + pageId: 'page1', + wrappedEvent: expect.objectContaining({ + method: 'Debugger.getScriptSource', + }), + }); + } finally { + device.close(); + debugger_.close(); + } + }, + ); + }); + + describe("disabled when target has 'nativeSourceCodeFetching' capability flag", () => { + const pageDescription = { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + capabilities: { + nativeSourceCodeFetching: true, + }, + vm: 'bar-vm', + }; + + describe('Debugger.scriptParsed', () => { + test('should forward event directly to client (does not rewrite sourceMapURL host)', async () => { + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + pageDescription, + ); + try { + const message = { + method: 'Debugger.scriptParsed', + params: { + sourceMapURL: `${protocol.toLowerCase()}://10.0.2.2:${ + serverRef.port + }/source-map`, + }, + }; + await sendFromTargetToDebugger(device, debugger_, 'page1', message); + + expect(debugger_.handle).toBeCalledWith(message); + } finally { + device.close(); + debugger_.close(); + } + }); + }); + + describe('Debugger.getScriptSource', () => { + test('should forward request directly to device (does not read source from disk in proxy)', async () => { + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + pageDescription, + ); + try { + const message = { + id: 1, + method: 'Debugger.getScriptSource', + params: { + scriptId: 'script1', + }, + }; + await sendFromDebuggerToTarget(debugger_, device, 'page1', message); + + expect(device.wrappedEventParsed).toBeCalledWith({ + pageId: 'page1', + wrappedEvent: message, + }); + } finally { + device.close(); + debugger_.close(); + } + }); + }); + }); + }, +); diff --git a/packages/dev-middleware/src/__tests__/InspectorProxyCdpTransport-test.js b/packages/dev-middleware/src/__tests__/InspectorProxyCdpTransport-test.js new file mode 100644 index 00000000000000..6d76d304e84677 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/InspectorProxyCdpTransport-test.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. + * + * @flow strict-local + * @format + * @oncall react_native + */ + +import type {PageDescription} from '../inspector-proxy/types'; + +import {fetchJson} from './FetchUtils'; +import {createDebuggerMock} from './InspectorDebuggerUtils'; +import {createDeviceMock} from './InspectorDeviceUtils'; +import {withAbortSignalForEachTest} from './ResourceUtils'; +import {withServerForEachTest} from './ServerUtils'; +import until from 'wait-for-expect'; + +// WebSocket is unreliable when using fake timers. +jest.useRealTimers(); + +jest.setTimeout(10000); + +describe.each(['HTTP', 'HTTPS'])( + 'inspector proxy CDP transport over %s', + protocol => { + const serverRef = withServerForEachTest({ + logger: undefined, + projectRoot: '', + secure: protocol === 'HTTPS', + }); + const autoCleanup = withAbortSignalForEachTest(); + afterEach(() => { + jest.clearAllMocks(); + }); + + test('connection/disconnection and message from debugger to device', async () => { + const device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + try { + device1.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ]); + + let pageList: Array = []; + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList).toHaveLength(1); + }); + const [{webSocketDebuggerUrl}] = pageList; + expect(webSocketDebuggerUrl).toBeDefined(); + + const debugger_ = await createDebuggerMock( + webSocketDebuggerUrl, + autoCleanup.signal, + ); + try { + await until(() => expect(device1.connect).toBeCalled()); + + debugger_.send({ + method: 'Runtime.enable', + id: 0, + }); + + await until(() => expect(device1.wrappedEvent).toBeCalled()); + + expect(device1.wrappedEventParsed).toBeCalledWith({ + pageId: 'page1', + wrappedEvent: { + method: 'Runtime.enable', + id: 0, + }, + }); + + debugger_.close(); + + await until(() => expect(device1.disconnect).toBeCalled()); + } finally { + debugger_.close(); + } + } finally { + device1.close(); + } + }); + + test('message and disconnection from device to debugger', async () => { + const device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + try { + device1.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ]); + + let pageList: Array = []; + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList).toHaveLength(1); + }); + const [{webSocketDebuggerUrl}] = pageList; + expect(webSocketDebuggerUrl).toBeDefined(); + + const debugger_ = await createDebuggerMock( + webSocketDebuggerUrl, + autoCleanup.signal, + ); + let debuggerSocketClosed = false; + debugger_.socket.once('close', () => { + debuggerSocketClosed = true; + }); + try { + await until(() => expect(device1.connect).toBeCalled()); + + device1.sendWrappedEvent('page1', { + id: 0, + }); + + await until(() => expect(debugger_.handle).toBeCalledWith({id: 0})); + + device1.close(); + + await until(() => expect(debuggerSocketClosed).toBe(true)); + } finally { + debugger_.close(); + } + } finally { + device1.close(); + } + }); + }, +); diff --git a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js new file mode 100644 index 00000000000000..e601f219f06324 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js @@ -0,0 +1,313 @@ +/** + * 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 { + JsonPagesListResponse, + JsonVersionResponse, +} from '../inspector-proxy/types'; + +import {fetchJson} from './FetchUtils'; +import {createDeviceMock} from './InspectorDeviceUtils'; +import {withAbortSignalForEachTest} from './ResourceUtils'; +import {withServerForEachTest} from './ServerUtils'; + +// Must be greater than or equal to PAGES_POLLING_INTERVAL in `InspectorProxy.js`. +const PAGES_POLLING_DELAY = 1000; + +jest.useFakeTimers(); + +describe('inspector proxy HTTP API', () => { + const serverRef = withServerForEachTest({ + logger: undefined, + projectRoot: '', + }); + const autoCleanup = withAbortSignalForEachTest(); + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('/json/version endpoint', () => { + test('returns version', async () => { + const json = await fetchJson( + `${serverRef.serverBaseUrl}/json/version`, + ); + expect(json).toMatchSnapshot(); + }); + }); + + describe.each(['/json', '/json/list'])('%s endpoint', endpoint => { + test('empty on start', async () => { + const json = await fetchJson( + `${serverRef.serverBaseUrl}${endpoint}`, + ); + expect(json).toEqual([]); + }); + + test('updates page details through polling', async () => { + const device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + try { + device1.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ]); + + jest.advanceTimersByTime(PAGES_POLLING_DELAY); + + const jsonBefore = await fetchJson( + `${serverRef.serverBaseUrl}${endpoint}`, + ); + + device1.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1-updated', + title: 'bar-title-updated', + vm: 'bar-vm-updated', + }, + ]); + + jest.advanceTimersByTime(PAGES_POLLING_DELAY); + + const jsonAfter = await fetchJson( + `${serverRef.serverBaseUrl}${endpoint}`, + ); + + expect(jsonBefore).toEqual([ + expect.objectContaining({ + id: 'device1-page1', + title: 'bar-title', + vm: 'bar-vm', + }), + ]); + + expect(jsonAfter).toEqual([ + expect.objectContaining({ + id: 'device1-page1-updated', + title: 'bar-title-updated', + vm: 'bar-vm-updated', + }), + ]); + } finally { + device1.close(); + } + }); + + test('returns to empty on device disconnect', async () => { + const device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + try { + device1.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ]); + + jest.advanceTimersByTime(PAGES_POLLING_DELAY); + + const jsonBefore = await fetchJson( + `${serverRef.serverBaseUrl}${endpoint}`, + ); + + device1.close(); + + const jsonAfter = await fetchJson( + `${serverRef.serverBaseUrl}${endpoint}`, + ); + + expect(jsonBefore).toEqual([ + expect.objectContaining({ + id: 'device1-page1', + title: 'bar-title', + vm: 'bar-vm', + }), + ]); + + expect(jsonAfter).toEqual([]); + } finally { + device1.close(); + } + }); + + test('reports pages from two connected devices', async () => { + const device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + + device1.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ]); + + const device2 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device2&name=foo&app=bar`, + autoCleanup.signal, + ); + device2.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ]); + + // Ensure polling has happened a few times + jest.advanceTimersByTime(10 * PAGES_POLLING_DELAY); + + try { + const json = await fetchJson( + `${serverRef.serverBaseUrl}${endpoint}`, + ); + expect(json).toEqual([ + { + description: 'bar-app', + deviceName: 'foo', + devtoolsFrontendUrl: expect.any(String), + faviconUrl: 'https://reactjs.org/favicon.ico', + id: 'device1-page1', + reactNative: { + capabilities: {}, + logicalDeviceId: 'device1', + }, + title: 'bar-title', + type: 'node', + vm: 'bar-vm', + webSocketDebuggerUrl: expect.any(String), + }, + { + description: 'bar-app', + deviceName: 'foo', + devtoolsFrontendUrl: expect.any(String), + faviconUrl: 'https://reactjs.org/favicon.ico', + id: 'device2-page1', + reactNative: { + capabilities: {}, + logicalDeviceId: 'device2', + }, + title: 'bar-title', + type: 'node', + vm: 'bar-vm', + webSocketDebuggerUrl: expect.any(String), + }, + ]); + } finally { + device1.close(); + device2.close(); + } + }); + + test('removes pages with duplicate IDs', async () => { + const device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + try { + device1.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + { + app: 'bar-app-other', + id: 'page1', + title: 'bar-title-other', + vm: 'bar-vm-other', + }, + ]); + + jest.advanceTimersByTime(PAGES_POLLING_DELAY); + + const json = await fetchJson( + `${serverRef.serverBaseUrl}${endpoint}`, + ); + + expect(json).toEqual([ + expect.objectContaining({ + id: 'device1-page1', + title: 'bar-title-other', + vm: 'bar-vm-other', + }), + ]); + } finally { + device1.close(); + } + }); + + describe('HTTP vs HTTPS', () => { + const secureServerRef = withServerForEachTest({ + logger: undefined, + projectRoot: '', + secure: true, + }); + + test('uses `wss` scheme and param if server is HTTPS', async () => { + const page = { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }; + + let deviceHttp, deviceHttps; + + try { + deviceHttp = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + deviceHttp.getPages.mockImplementation(() => [page]); + + deviceHttps = await createDeviceMock( + `${secureServerRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + deviceHttps.getPages.mockImplementation(() => [page]); + + jest.advanceTimersByTime(PAGES_POLLING_DELAY); + + const [pageHttp] = await fetchJson( + `${serverRef.serverBaseUrl}${endpoint}`, + ); + const [pageHttps] = await fetchJson( + `${secureServerRef.serverBaseUrl}${endpoint}`, + ); + + expect(pageHttp.webSocketDebuggerUrl).toMatch(/^ws:\/\//); + expect(pageHttps.webSocketDebuggerUrl).toMatch(/^wss:\/\//); + expect(pageHttp.devtoolsFrontendUrl).toMatch(/[&?]ws=/); + expect(pageHttps.devtoolsFrontendUrl).toMatch(/[&?]wss=/); + } finally { + deviceHttp?.close(); + deviceHttps?.close(); + } + }); + }); + }); +}); diff --git a/packages/dev-middleware/src/__tests__/InspectorProxyReactNativeReloads-test.js b/packages/dev-middleware/src/__tests__/InspectorProxyReactNativeReloads-test.js new file mode 100644 index 00000000000000..a89ddbd08ed558 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/InspectorProxyReactNativeReloads-test.js @@ -0,0 +1,485 @@ +/** + * 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 {fetchJson} from './FetchUtils'; +import {createDebuggerMock} from './InspectorDebuggerUtils'; +import {createDeviceMock} from './InspectorDeviceUtils'; +import {createAndConnectTarget} from './InspectorProtocolUtils'; +import {withAbortSignalForEachTest} from './ResourceUtils'; +import {withServerForEachTest} from './ServerUtils'; +import invariant from 'invariant'; +import until from 'wait-for-expect'; + +// WebSocket is unreliable when using fake timers. +jest.useRealTimers(); + +jest.setTimeout(10000); + +describe('inspector proxy React Native reloads', () => { + const serverRef = withServerForEachTest({ + logger: undefined, + projectRoot: '', + }); + const autoCleanup = withAbortSignalForEachTest(); + afterEach(() => { + jest.clearAllMocks(); + }); + + test('routing messages from the debugger to the latest React Native page', async () => { + let device1, debugger_; + try { + /*** + * Connect a device with one React Native page. + */ + device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + device1.getPages.mockImplementation(() => [ + { + app: 'bar', + id: 'originalPage-initial', + // NOTE: 'React' is a magic string used to detect React Native pages. + title: 'React Native (mock)', + vm: 'vm', + }, + ]); + let pageList; + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList.length).toBeGreaterThan(0); + }); + invariant(pageList != null, ''); + + /*** + * The proxy reports *two* pages. + */ + const syntheticPage = pageList.find( + ({title}) => + // NOTE: Magic string used for the synthetic page that has a stable ID + title === 'React Native Experimental (Improved Chrome Reloads)', + ); + const originalPage = pageList.find( + ({title}) => title === 'React Native (mock)', + ); + expect(syntheticPage).not.toBeUndefined(); + expect(originalPage).not.toBeUndefined(); + expect(originalPage.id).toContain('originalPage-initial'); + expect(syntheticPage.id).not.toEqual(originalPage.id); + + // Connect to the synthetic page + debugger_ = await createDebuggerMock( + syntheticPage.webSocketDebuggerUrl, + autoCleanup.signal, + ); + + debugger_.send({ + method: 'Console.enable', + id: 0, + }); + + await until(() => + expect(device1.wrappedEventParsed).toBeCalledWith({ + pageId: 'originalPage-initial', + wrappedEvent: { + method: 'Console.enable', + id: 0, + }, + }), + ); + + /** + * Replace our original page with a new one. + */ + device1.getPages.mockImplementation(() => [ + { + app: 'bar', + id: 'originalPage-updated', + // NOTE: 'React' is a magic string used to detect React Native pages. + title: 'React Native (mock)', + vm: 'vm', + }, + ]); + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList).toContainEqual( + expect.objectContaining({ + id: expect.stringContaining('originalPage-updated'), + }), + ); + }); + + /** + * We can reuse our existing debugger connection to the synthetic page. + * Messages will be routed to the updated page. + */ + debugger_.send({ + method: 'Console.disable', + id: 1, + }); + + await until(() => + expect(device1.wrappedEventParsed).toBeCalledWith({ + pageId: 'originalPage-updated', + wrappedEvent: { + method: 'Console.disable', + id: 1, + }, + }), + ); + } finally { + device1?.close(); + debugger_?.close(); + } + }); + + test('routing messages from the latest React Native page to the debugger', async () => { + let device1, debugger_; + try { + /*** + * Connect a device with one React Native page. + */ + device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + device1.getPages.mockImplementation(() => [ + { + app: 'bar', + id: 'originalPage-initial', + // NOTE: 'React' is a magic string used to detect React Native pages. + title: 'React Native (mock)', + vm: 'vm', + }, + ]); + let pageList; + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList.length).toBeGreaterThan(0); + }); + invariant(pageList != null, ''); + + /*** + * The proxy reports *two* pages. + */ + const syntheticPage = pageList.find( + ({title}) => + // NOTE: Magic string used for the synthetic page that has a stable ID + title === 'React Native Experimental (Improved Chrome Reloads)', + ); + const originalPage = pageList.find( + ({title}) => title === 'React Native (mock)', + ); + expect(syntheticPage).not.toBeUndefined(); + expect(originalPage).not.toBeUndefined(); + expect(originalPage.id).toContain('originalPage-initial'); + expect(syntheticPage.id).not.toEqual(originalPage.id); + + // Connect to the synthetic page + debugger_ = await createDebuggerMock( + syntheticPage.webSocketDebuggerUrl, + autoCleanup.signal, + ); + + device1.sendWrappedEvent('originalPage-initial', { + error: 'Mock error', + }); + + await until(() => + expect(debugger_.handle).toBeCalledWith({ + error: 'Mock error', + }), + ); + + /** + * Replace our original page with a new one. + */ + device1.getPages.mockImplementation(() => [ + { + app: 'bar', + id: 'originalPage-updated', + // NOTE: 'React' is a magic string used to detect React Native pages. + title: 'React Native (mock)', + vm: 'vm', + }, + ]); + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList).toContainEqual( + expect.objectContaining({ + id: expect.stringContaining('originalPage-updated'), + }), + ); + }); + + /** + * We can reuse our existing debugger connection to the synthetic page. + * Messages from the updated page will be routed to the debugger. + */ + device1.sendWrappedEvent('originalPage-initial', { + error: 'Another mock error', + }); + + await until(() => + expect(debugger_.handle).toBeCalledWith({ + error: 'Another mock error', + }), + ); + } finally { + device1?.close(); + debugger_?.close(); + } + }); + + test('injecting setup messages after a reload', async () => { + let device1, debugger_; + try { + /*** + * Connect a device with one React Native page. + */ + device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + device1.getPages.mockImplementation(() => [ + { + app: 'bar', + id: 'originalPage-initial', + // NOTE: 'React' is a magic string used to detect React Native pages. + title: 'React Native (mock)', + vm: 'vm', + }, + ]); + let pageList; + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList.length).toBeGreaterThan(0); + }); + invariant(pageList != null, ''); + + const syntheticPage = pageList.find( + ({title}) => + // NOTE: Magic string used for the synthetic page that has a stable ID + title === 'React Native Experimental (Improved Chrome Reloads)', + ); + expect(syntheticPage).not.toBeUndefined(); + + // Connect to the synthetic page + debugger_ = await createDebuggerMock( + syntheticPage.webSocketDebuggerUrl, + autoCleanup.signal, + ); + + /** + * Replace our original page with a new one. + */ + device1.getPages.mockImplementation(() => [ + { + app: 'bar', + id: 'originalPage-updated', + // NOTE: 'React' is a magic string used to detect React Native pages. + title: 'React Native (mock)', + vm: 'vm', + }, + ]); + + /** + * The new page receives setup messages from the proxy. + */ + device1.wrappedEventParsed.mockClear(); + await until(async () => { + expect(device1.wrappedEventParsed).toBeCalledWith({ + pageId: 'originalPage-updated', + wrappedEvent: { + method: 'Runtime.enable', + id: expect.any(Number), + }, + }); + expect(device1.wrappedEventParsed).toBeCalledWith({ + pageId: 'originalPage-updated', + wrappedEvent: { + method: 'Debugger.enable', + id: expect.any(Number), + }, + }); + }); + + /** + * When the new page notifies us about the new execution context, the + * proxy first injects a notification about the old context(s) going + * away, and also asks the new page to resume (under the assumption that + * it starts in a paused state). + */ + device1.sendWrappedEvent('originalPage-updated', { + method: 'Runtime.executionContextCreated', + }); + debugger_.handle.mockClear(); + device1.wrappedEventParsed.mockClear(); + await until(() => { + expect(debugger_.handle.mock.calls).toEqual([ + // NOTE: The messages need to arrive in this exact order. + [ + { + method: 'Runtime.executionContextsCleared', + }, + ], + [ + expect.objectContaining({ + method: 'Runtime.executionContextCreated', + }), + ], + ]); + }); + await until(() => { + expect(device1.wrappedEventParsed).toBeCalledWith({ + pageId: 'originalPage-updated', + wrappedEvent: expect.objectContaining({ + method: 'Debugger.resume', + id: expect.any(Number), + }), + }); + }); + } finally { + device1?.close(); + debugger_?.close(); + } + }); + + test('device disconnect event results in a nonstandard "reload" message to the debugger', async () => { + const {device, debugger_} = await createAndConnectTarget( + serverRef, + autoCleanup.signal, + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ); + + try { + device.send({ + event: 'disconnect', + payload: { + pageId: 'page1', + }, + }); + await until(() => + expect(debugger_.handle).toBeCalledWith({ + method: 'reload', + }), + ); + } finally { + device.close(); + } + }); + + test("disabled when target has 'nativePageReloads' capability flag", async () => { + let device1; + try { + /*** + * Connect a device with one React Native page. + */ + device1 = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + device1.getPages.mockImplementation(() => [ + { + app: 'bar', + id: 'originalPage-initial', + // NOTE: 'React' is a magic string used to detect React Native pages + // in legacy mode. + title: 'React Native (mock)', + capabilities: { + nativePageReloads: true, + }, + vm: 'vm', + }, + ]); + let pageList; + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList.length).toBeGreaterThan(0); + }); + invariant(pageList != null, ''); + + /** + * The proxy reports just one page, without the synthetic page reported + * in legacy mode. + */ + + expect(pageList).toEqual([ + expect.objectContaining({ + id: expect.stringContaining('originalPage-initial'), + title: 'React Native (mock)', + }), + ]); + + /** + * Replace our original page with a new one. + */ + device1.getPages.mockImplementation(() => [ + { + app: 'bar', + id: 'originalPage-updated', + // NOTE: 'React' is a magic string used to detect React Native pages. + title: 'React Native (mock)', + capabilities: { + nativePageReloads: true, + }, + vm: 'vm', + }, + ]); + await until(async () => { + pageList = (await fetchJson( + `${serverRef.serverBaseUrl}/json`, + // $FlowIgnore[unclear-type] + ): any); + expect(pageList).toContainEqual( + expect.objectContaining({ + id: expect.stringContaining('originalPage-updated'), + }), + ); + }); + + /** + * There's still just one page reported. + */ + expect(pageList).toEqual([ + expect.objectContaining({ + id: expect.stringContaining('originalPage-updated'), + title: 'React Native (mock)', + }), + ]); + } finally { + device1?.close(); + } + }); +}); diff --git a/packages/dev-middleware/src/__tests__/ResourceUtils.js b/packages/dev-middleware/src/__tests__/ResourceUtils.js new file mode 100644 index 00000000000000..0ad12756c64cd2 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/ResourceUtils.js @@ -0,0 +1,32 @@ +/** + * 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 + */ + +export function withAbortSignalForEachTest(): $ReadOnly<{signal: AbortSignal}> { + const ref: {signal: AbortSignal} = { + // $FlowIgnore[unsafe-getters-setters] + get signal() { + throw new Error( + 'The return value of withAbortSignalForEachTest is lazily initialized and can only be accessed in tests.', + ); + }, + }; + let controller; + beforeEach(() => { + controller = new AbortController(); + Object.defineProperty(ref, 'signal', { + value: controller.signal, + }); + }); + afterEach(() => { + controller.abort(); + }); + return ref; +} diff --git a/packages/dev-middleware/src/__tests__/ServerUtils.js b/packages/dev-middleware/src/__tests__/ServerUtils.js new file mode 100644 index 00000000000000..bcc3db08115cf9 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/ServerUtils.js @@ -0,0 +1,162 @@ +/** + * 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 {JSONSerializable} from '../inspector-proxy/types'; +import type {HandleFunction} from 'connect'; + +import {createDevMiddleware} from '../'; +import connect from 'connect'; +import http from 'http'; +import https from 'https'; +import * as selfsigned from 'selfsigned'; +import url from 'url'; + +type CreateDevMiddlewareOptions = Parameters[0]; +type CreateServerOptions = { + ...Omit, + secure?: boolean, +}; +type ConnectApp = ReturnType; + +export function withServerForEachTest(options: CreateServerOptions): $ReadOnly<{ + serverBaseUrl: string, + serverBaseWsUrl: string, + app: ConnectApp, + port: number, +}> { + const EAGER_ACCESS_ERROR_MESSAGE = + 'The return value of withServerForEachTest is lazily initialized and can only be accessed in tests.'; + const ref: { + serverBaseUrl: string, + serverBaseWsUrl: string, + app: ConnectApp, + port: number, + } = { + // $FlowIgnore[unsafe-getters-setters] + get serverBaseUrl() { + throw new Error(EAGER_ACCESS_ERROR_MESSAGE); + }, + // $FlowIgnore[unsafe-getters-setters] + get serverBaseWsUrl() { + throw new Error(EAGER_ACCESS_ERROR_MESSAGE); + }, + // $FlowIgnore[unsafe-getters-setters] + get app() { + throw new Error(EAGER_ACCESS_ERROR_MESSAGE); + }, + // $FlowIgnore[unsafe-getters-setters] + get port() { + throw new Error(EAGER_ACCESS_ERROR_MESSAGE); + }, + }; + let server: http$Server | https$Server; + let app: ConnectApp; + beforeEach(async () => { + ({server, app} = await createServer(options)); + const serverBaseUrl = baseUrlForServer( + server, + options.secure ?? false ? 'https' : 'http', + ); + const serverBaseWsUrl = baseUrlForServer( + server, + options.secure ?? false ? 'wss' : 'ws', + ); + Object.defineProperty(ref, 'serverBaseUrl', {value: serverBaseUrl}); + Object.defineProperty(ref, 'serverBaseWsUrl', {value: serverBaseWsUrl}); + Object.defineProperty(ref, 'app', {value: app}); + Object.defineProperty(ref, 'port', {value: server.address().port}); + }); + afterEach(done => { + server.close(() => done()); + }); + return ref; +} + +export async function createServer(options: CreateServerOptions): Promise<{ + server: http$Server | https$Server, + app: ReturnType, +}> { + const app = connect(); + const {secure = false, ...devMiddlewareOptions} = options; + let httpServer; + if (secure) { + const {cert, private: key} = selfsigned.generate( + [{name: 'commonName', value: 'localhost'}], + {days: 1}, + ); + httpServer = https.createServer( + {cert, key}, + // $FlowFixMe[incompatible-call] The types for `connect` and `https` are subtly incompatible as written. + app, + ); + } else { + httpServer = http.createServer(app); + } + + return new Promise((resolve, reject) => { + httpServer.once('error', reject); + httpServer.listen(() => { + const {middleware, websocketEndpoints} = createDevMiddleware({ + ...devMiddlewareOptions, + serverBaseUrl: baseUrlForServer(httpServer, secure ? 'https' : 'http'), + }); + app.use(middleware); + httpServer.on('upgrade', (request, socket, head) => { + const {pathname} = url.parse(request.url); + if (pathname != null && websocketEndpoints[pathname]) { + websocketEndpoints[pathname].handleUpgrade( + request, + socket, + head, + ws => { + websocketEndpoints[pathname].emit('connection', ws, request); + }, + ); + } else { + socket.destroy(); + } + }); + resolve({server: httpServer, app}); + }); + }); +} + +export function baseUrlForServer( + server: http$Server | https$Server, + scheme: string, +): string { + const address = server.address(); + // Assumption: `server` is local and listening on `localhost`. We can't use + // the IP address because HTTPS requires a hostname. + return `${scheme}://localhost:${address.port}`; +} + +export function serveStaticJson(json: JSONSerializable): HandleFunction { + return (req, res, next) => { + if (req.method !== 'GET') { + next(); + return; + } + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end(JSON.stringify(json)); + }; +} + +export function serveStaticText(text: string): HandleFunction { + return (req, res, next) => { + if (req.method !== 'GET') { + next(); + return; + } + res.writeHead(200, {'Content-Type': 'text/plain'}); + res.end(text); + }; +} diff --git a/packages/dev-middleware/src/__tests__/__fixtures__/mock-source-file.txt b/packages/dev-middleware/src/__tests__/__fixtures__/mock-source-file.txt new file mode 100644 index 00000000000000..257cc5642cb1a0 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/__fixtures__/mock-source-file.txt @@ -0,0 +1 @@ +foo diff --git a/packages/dev-middleware/src/__tests__/__snapshots__/InspectorProxyHttpApi-test.js.snap b/packages/dev-middleware/src/__tests__/__snapshots__/InspectorProxyHttpApi-test.js.snap new file mode 100644 index 00000000000000..8c0813b40720cd --- /dev/null +++ b/packages/dev-middleware/src/__tests__/__snapshots__/InspectorProxyHttpApi-test.js.snap @@ -0,0 +1,8 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`inspector proxy HTTP API /json/version endpoint returns version 1`] = ` +Object { + "Browser": "Mobile JavaScript", + "Protocol-Version": "1.1", +} +`; diff --git a/packages/dev-middleware/src/__tests__/getDevToolsFrontendUrl-test.js b/packages/dev-middleware/src/__tests__/getDevToolsFrontendUrl-test.js new file mode 100644 index 00000000000000..3d0818efc25760 --- /dev/null +++ b/packages/dev-middleware/src/__tests__/getDevToolsFrontendUrl-test.js @@ -0,0 +1,111 @@ +/** + * 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 getDevToolsFrontendUrl from '../utils/getDevToolsFrontendUrl'; + +describe('getDevToolsFrontendUrl', () => { + const webSocketDebuggerUrl = + 'ws://localhost:8081/inspector/debug?device=1a9372c&page=-1'; + + describe('given an absolute devServerUrl', () => { + const devServerUrl = 'http://localhost:8081'; + + it('should return a valid url for all experiments off', async () => { + const experiments = { + enableNetworkInspector: false, + enableNewDebugger: false, + enableOpenDebuggerRedirect: false, + }; + const actual = getDevToolsFrontendUrl( + experiments, + webSocketDebuggerUrl, + devServerUrl, + ); + const url = new URL(actual); + expect(url.host).toBe('localhost:8081'); + expect(url.pathname).toBe('/debugger-frontend/rn_inspector.html'); + expect(url.searchParams.get('ws')).toBe( + 'localhost:8081/inspector/debug?device=1a9372c&page=-1', + ); + }); + + it('should return a valid url for enableNetworkInspector experiment on', async () => { + const experiments = { + enableNetworkInspector: true, + enableNewDebugger: true, + enableOpenDebuggerRedirect: false, + }; + const actual = getDevToolsFrontendUrl( + experiments, + webSocketDebuggerUrl, + devServerUrl, + ); + const url = new URL(actual); + expect(url.host).toBe('localhost:8081'); + expect(url.pathname).toBe('/debugger-frontend/rn_inspector.html'); + expect(url.searchParams.get('unstable_enableNetworkPanel')).toBe('true'); + expect(url.searchParams.get('ws')).toBe( + 'localhost:8081/inspector/debug?device=1a9372c&page=-1', + ); + }); + }); + + describe('given a relative devServerUrl', () => { + const relativeDevServerUrl = ''; + + function assertValidRelativeURL(relativeURL: string): URL { + const anyBaseURL = new URL('https://www.example.com'); + try { + // By definition, a valid relative URL must be valid when combined with any base URL + return new URL(relativeURL, anyBaseURL); + } catch (e) { + throw new Error(`Relative URL is invalid: ${relativeURL}`, {cause: e}); + } + } + + it('should return a valid url for all experiments off', async () => { + const experiments = { + enableNetworkInspector: false, + enableNewDebugger: false, + enableOpenDebuggerRedirect: false, + }; + const actual = getDevToolsFrontendUrl( + experiments, + webSocketDebuggerUrl, + relativeDevServerUrl, + ); + const url = assertValidRelativeURL(actual); + expect(url.pathname).toBe('/debugger-frontend/rn_inspector.html'); + expect(url.searchParams.get('ws')).toBe( + 'localhost:8081/inspector/debug?device=1a9372c&page=-1', + ); + }); + + it('should return a valid url for enableNetworkInspector experiment on', async () => { + const experiments = { + enableNetworkInspector: true, + enableNewDebugger: true, + enableOpenDebuggerRedirect: false, + }; + const actual = getDevToolsFrontendUrl( + experiments, + webSocketDebuggerUrl, + relativeDevServerUrl, + ); + const url = assertValidRelativeURL(actual); + expect(url.pathname).toBe('/debugger-frontend/rn_inspector.html'); + expect(url.searchParams.get('unstable_enableNetworkPanel')).toBe('true'); + expect(url.searchParams.get('ws')).toBe( + 'localhost:8081/inspector/debug?device=1a9372c&page=-1', + ); + }); + }); +}); diff --git a/packages/dev-middleware/src/createDevMiddleware.js b/packages/dev-middleware/src/createDevMiddleware.js index c73d19a173743a..e6c9dc1f7d93e2 100644 --- a/packages/dev-middleware/src/createDevMiddleware.js +++ b/packages/dev-middleware/src/createDevMiddleware.js @@ -9,20 +9,20 @@ * @oncall react_native */ -import type {NextHandleFunction} from 'connect'; import type {BrowserLauncher} from './types/BrowserLauncher'; import type {EventReporter} from './types/EventReporter'; import type {Experiments, ExperimentsConfig} from './types/Experiments'; import type {Logger} from './types/Logger'; +import type {NextHandleFunction} from 'connect'; +import InspectorProxy from './inspector-proxy/InspectorProxy'; +import deprecated_openFlipperMiddleware from './middleware/deprecated_openFlipperMiddleware'; +import openDebuggerMiddleware from './middleware/openDebuggerMiddleware'; +import DefaultBrowserLauncher from './utils/DefaultBrowserLauncher'; import reactNativeDebuggerFrontendPath from '@react-native/debugger-frontend'; import connect from 'connect'; import path from 'path'; import serveStaticMiddleware from 'serve-static'; -import deprecated_openFlipperMiddleware from './middleware/deprecated_openFlipperMiddleware'; -import openDebuggerMiddleware from './middleware/openDebuggerMiddleware'; -import InspectorProxy from './inspector-proxy/InspectorProxy'; -import DefaultBrowserLauncher from './utils/DefaultBrowserLauncher'; type Options = $ReadOnly<{ projectRoot: string, @@ -59,6 +59,13 @@ type Options = $ReadOnly<{ * This is an unstable API with no semver guarantees. */ unstable_experiments?: ExperimentsConfig, + + /** + * An interface for using a modified inspector proxy implementation. + * + * This is an unstable API with no semver guarantees. + */ + unstable_InspectorProxy?: Class, }>; type DevMiddlewareAPI = $ReadOnly<{ @@ -73,10 +80,12 @@ export default function createDevMiddleware({ unstable_browserLauncher = DefaultBrowserLauncher, unstable_eventReporter, unstable_experiments: experimentConfig = {}, + unstable_InspectorProxy, }: Options): DevMiddlewareAPI { const experiments = getExperiments(experimentConfig); - const inspectorProxy = new InspectorProxy( + const InspectorProxyClass = unstable_InspectorProxy ?? InspectorProxy; + const inspectorProxy = new InspectorProxyClass( projectRoot, serverBaseUrl, unstable_eventReporter, @@ -117,5 +126,6 @@ function getExperiments(config: ExperimentsConfig): Experiments { return { enableNewDebugger: config.enableNewDebugger ?? false, enableOpenDebuggerRedirect: config.enableOpenDebuggerRedirect ?? false, + enableNetworkInspector: config.enableNetworkInspector ?? false, }; } diff --git a/packages/dev-middleware/src/index.flow.js b/packages/dev-middleware/src/index.flow.js index 4060a2bb2d4c4d..c662838fea10ce 100644 --- a/packages/dev-middleware/src/index.flow.js +++ b/packages/dev-middleware/src/index.flow.js @@ -13,3 +13,6 @@ export {default as createDevMiddleware} from './createDevMiddleware'; export type {BrowserLauncher, LaunchedBrowser} from './types/BrowserLauncher'; export type {EventReporter, ReportableEvent} from './types/EventReporter'; + +export {default as unstable_InspectorProxy} from './inspector-proxy/InspectorProxy'; +export {default as unstable_Device} from './inspector-proxy/Device'; diff --git a/packages/dev-middleware/src/inspector-proxy/Device.js b/packages/dev-middleware/src/inspector-proxy/Device.js index 9666fa222ed927..26befc0b1185c4 100644 --- a/packages/dev-middleware/src/inspector-proxy/Device.js +++ b/packages/dev-middleware/src/inspector-proxy/Device.js @@ -9,23 +9,25 @@ * @oncall react_native */ +import type {EventReporter} from '../types/EventReporter'; +import type { + CDPClientMessage, + CDPRequest, + CDPResponse, + CDPServerMessage, +} from './cdp-types/messages'; import type { - DebuggerRequest, - ErrorResponse, - GetScriptSourceRequest, - GetScriptSourceResponse, MessageFromDevice, MessageToDevice, Page, - SetBreakpointByUrlRequest, + TargetCapabilityFlags, } from './types'; import DeviceEventReporter from './DeviceEventReporter'; import * as fs from 'fs'; -import * as path from 'path'; import fetch from 'node-fetch'; +import * as path from 'path'; import WS from 'ws'; -import type {EventReporter} from '../types/EventReporter'; const debug = require('debug')('Metro:InspectorProxy'); @@ -34,7 +36,7 @@ const PAGES_POLLING_INTERVAL = 1000; // Android's stock emulator and other emulators such as genymotion use a standard localhost alias. const EMULATOR_LOCALHOST_ADDRESSES: Array = ['10.0.2.2', '10.0.3.2']; -// Prefix for script URLs that are alphanumeric IDs. See comment in _processMessageFromDevice method for +// Prefix for script URLs that are alphanumeric IDs. See comment in #processMessageFromDeviceLegacy method for // more details. const FILE_PREFIX = 'file://'; @@ -57,41 +59,43 @@ const REACT_NATIVE_RELOADABLE_PAGE_ID = '-1'; */ export default class Device { // ID of the device. - _id: string; + #id: string; // Name of the device. - _name: string; + #name: string; // Package name of the app. - _app: string; + #app: string; // Stores socket connection between Inspector Proxy and device. - _deviceSocket: WS; + #deviceSocket: WS; - // Stores last list of device's pages. - _pages: Array; + // Stores the most recent listing of device's pages, keyed by the `id` field. + #pages: $ReadOnlyMap; // Stores information about currently connected debugger (if any). - _debuggerConnection: ?DebuggerInfo = null; + #debuggerConnection: ?DebuggerInfo = null; // Last known Page ID of the React Native page. // This is used by debugger connections that don't have PageID specified // (and will interact with the latest React Native page). - _lastConnectedReactNativePage: ?Page = null; + #lastConnectedLegacyReactNativePage: ?Page = null; // Whether we are in the middle of a reload in the REACT_NATIVE_RELOADABLE_PAGE. - _isReloading: boolean = false; + #isLegacyPageReloading: boolean = false; // The previous "GetPages" message, for deduplication in debug logs. - _lastGetPagesMessage: string = ''; + #lastGetPagesMessage: string = ''; // Mapping built from scriptParsed events and used to fetch file content in `Debugger.getScriptSource`. - _scriptIdToSourcePathMapping: Map = new Map(); + #scriptIdToSourcePathMapping: Map = new Map(); // Root of the project used for relative to absolute source path conversion. - _projectRoot: string; + #projectRoot: string; + + #deviceEventReporter: ?DeviceEventReporter; - _deviceEventReporter: ?DeviceEventReporter; + #pagesPollingIntervalId: ReturnType; constructor( id: string, @@ -101,13 +105,13 @@ export default class Device { projectRoot: string, eventReporter: ?EventReporter, ) { - this._id = id; - this._name = name; - this._app = app; - this._pages = []; - this._deviceSocket = socket; - this._projectRoot = projectRoot; - this._deviceEventReporter = eventReporter + this.#id = id; + this.#name = name; + this.#app = app; + this.#pages = new Map(); + this.#deviceSocket = socket; + this.#projectRoot = projectRoot; + this.#deviceEventReporter = eventReporter ? new DeviceEventReporter(eventReporter, { deviceId: id, deviceName: name, @@ -116,53 +120,58 @@ export default class Device { : null; // $FlowFixMe[incompatible-call] - this._deviceSocket.on('message', (message: string) => { + this.#deviceSocket.on('message', (message: string) => { const parsedMessage = JSON.parse(message); if (parsedMessage.event === 'getPages') { // There's a 'getPages' message every second, so only show them if they change - if (message !== this._lastGetPagesMessage) { + if (message !== this.#lastGetPagesMessage) { debug( '(Debugger) (Proxy) <- (Device), getPages ping has changed: ' + message, ); - this._lastGetPagesMessage = message; + this.#lastGetPagesMessage = message; } } else { debug('(Debugger) (Proxy) <- (Device): ' + message); } - this._handleMessageFromDevice(parsedMessage); + this.#handleMessageFromDevice(parsedMessage); }); - this._deviceSocket.on('close', () => { - this._deviceEventReporter?.logDisconnection('device'); + // Sends 'getPages' request to device every PAGES_POLLING_INTERVAL milliseconds. + this.#pagesPollingIntervalId = setInterval( + () => this.#sendMessageToDevice({event: 'getPages'}), + PAGES_POLLING_INTERVAL, + ); + this.#deviceSocket.on('close', () => { + this.#deviceEventReporter?.logDisconnection('device'); // Device disconnected - close debugger connection. - if (this._debuggerConnection) { - this._debuggerConnection.socket.close(); - this._debuggerConnection = null; + if (this.#debuggerConnection) { + this.#debuggerConnection.socket.close(); + this.#debuggerConnection = null; } + clearInterval(this.#pagesPollingIntervalId); }); - - this._setPagesPolling(); } getName(): string { - return this._name; + return this.#name; } getApp(): string { - return this._app; + return this.#app; } - getPagesList(): Array { - if (this._lastConnectedReactNativePage) { + getPagesList(): $ReadOnlyArray { + if (this.#lastConnectedLegacyReactNativePage) { const reactNativeReloadablePage = { id: REACT_NATIVE_RELOADABLE_PAGE_ID, title: 'React Native Experimental (Improved Chrome Reloads)', vm: "don't use", - app: this._app, + app: this.#app, + capabilities: {}, }; - return this._pages.concat(reactNativeReloadablePage); + return [...this.#pages.values(), reactNativeReloadablePage]; } else { - return this._pages; + return [...this.#pages.values()]; } } @@ -178,17 +187,17 @@ export default class Device { }>, ) { // Clear any commands we were waiting on. - this._deviceEventReporter?.logDisconnection('debugger'); + this.#deviceEventReporter?.logDisconnection('debugger'); - this._deviceEventReporter?.logConnection('debugger', { + this.#deviceEventReporter?.logConnection('debugger', { pageId, frontendUserAgent: metadata.userAgent, }); // Disconnect current debugger if we already have debugger connected. - if (this._debuggerConnection) { - this._debuggerConnection.socket.close(); - this._debuggerConnection = null; + if (this.#debuggerConnection) { + this.#debuggerConnection.socket.close(); + this.#debuggerConnection = null; } const debuggerInfo = { @@ -197,14 +206,19 @@ export default class Device { pageId, userAgent: metadata.userAgent, }; - this._debuggerConnection = debuggerInfo; - debug(`Got new debugger connection for page ${pageId} of ${this._name}`); + // TODO(moti): Handle null case explicitly, e.g. refuse to connect to + // unknown pages. + const page: ?Page = this.#pages.get(pageId); - this._sendMessageToDevice({ + this.#debuggerConnection = debuggerInfo; + + debug(`Got new debugger connection for page ${pageId} of ${this.#name}`); + + this.#sendMessageToDevice({ event: 'connect', payload: { - pageId: this._mapToDevicePageId(pageId), + pageId: this.#mapToDevicePageId(pageId), }, }); @@ -212,36 +226,39 @@ export default class Device { socket.on('message', (message: string) => { debug('(Debugger) -> (Proxy) (Device): ' + message); const debuggerRequest = JSON.parse(message); - this._deviceEventReporter?.logRequest(debuggerRequest, 'debugger', { - pageId: this._debuggerConnection?.pageId ?? null, + this.#deviceEventReporter?.logRequest(debuggerRequest, 'debugger', { + pageId: this.#debuggerConnection?.pageId ?? null, frontendUserAgent: metadata.userAgent, }); - const handled = this._interceptMessageFromDebugger( - debuggerRequest, - debuggerInfo, - socket, - ); + let processedReq = debuggerRequest; + if (!page || !this.#pageHasCapability(page, 'nativeSourceCodeFetching')) { + processedReq = this.#interceptClientMessageForSourceFetching( + debuggerRequest, + debuggerInfo, + socket, + ); + } - if (!handled) { - this._sendMessageToDevice({ + if (processedReq) { + this.#sendMessageToDevice({ event: 'wrappedEvent', payload: { - pageId: this._mapToDevicePageId(pageId), - wrappedEvent: JSON.stringify(debuggerRequest), + pageId: this.#mapToDevicePageId(pageId), + wrappedEvent: JSON.stringify(processedReq), }, }); } }); socket.on('close', () => { - debug(`Debugger for page ${pageId} and ${this._name} disconnected.`); - this._deviceEventReporter?.logDisconnection('debugger'); - this._sendMessageToDevice({ + debug(`Debugger for page ${pageId} and ${this.#name} disconnected.`); + this.#deviceEventReporter?.logDisconnection('debugger'); + this.#sendMessageToDevice({ event: 'disconnect', payload: { - pageId: this._mapToDevicePageId(pageId), + pageId: this.#mapToDevicePageId(pageId), }, }); - this._debuggerConnection = null; + this.#debuggerConnection = null; }); // $FlowFixMe[method-unbinding] @@ -264,19 +281,19 @@ export default class Device { */ handleDuplicateDeviceConnection(newDevice: Device) { if ( - this._app !== newDevice.getApp() || - this._name !== newDevice.getName() + this.#app !== newDevice.getApp() || + this.#name !== newDevice.getName() ) { - this._deviceSocket.close(); - this._debuggerConnection?.socket.close(); + this.#deviceSocket.close(); + this.#debuggerConnection?.socket.close(); } - const oldDebugger = this._debuggerConnection; - this._debuggerConnection = null; + const oldDebugger = this.#debuggerConnection; + this.#debuggerConnection = null; if (oldDebugger) { oldDebugger.socket.removeAllListeners(); - this._deviceSocket.close(); + this.#deviceSocket.close(); newDevice.handleDebuggerConnection( oldDebugger.socket, oldDebugger.pageId, @@ -287,26 +304,61 @@ export default class Device { } } + /** + * Returns `true` if a page supports the given target capability flag. + */ + #pageHasCapability(page: Page, flag: $Keys): boolean { + return page.capabilities[flag] === true; + } + // Handles messages received from device: - // 1. For getPages responses updates local _pages list. + // 1. For getPages responses updates local #pages list. // 2. All other messages are forwarded to debugger as wrappedEvent. // // In the future more logic will be added to this method for modifying // some of the messages (like updating messages with source maps and file // locations). - _handleMessageFromDevice(message: MessageFromDevice) { + #handleMessageFromDevice(message: MessageFromDevice) { if (message.event === 'getPages') { - this._pages = message.payload; + this.#pages = new Map( + message.payload.map(({capabilities, ...page}) => [ + page.id, + { + ...page, + capabilities: capabilities ?? {}, + }, + ]), + ); + if (message.payload.length !== this.#pages.size) { + const duplicateIds = new Set(); + const idsSeen = new Set(); + for (const page of message.payload) { + if (!idsSeen.has(page.id)) { + idsSeen.add(page.id); + } else { + duplicateIds.add(page.id); + } + } + debug( + `Received duplicate page IDs from device: ${[...duplicateIds].join( + ', ', + )}`, + ); + } - // Check if device have new React Native page. + // Check if device has a new legacy React Native page. // There is usually no more than 2-3 pages per device so this operation // is not expensive. // TODO(hypuk): It is better for VM to send update event when new page is // created instead of manually checking this on every getPages result. - for (let i = 0; i < this._pages.length; ++i) { - if (this._pages[i].title.indexOf('React') >= 0) { - if (this._pages[i].id !== this._lastConnectedReactNativePage?.id) { - this._newReactNativePage(this._pages[i]); + for (const page of this.#pages.values()) { + if (this.#pageHasCapability(page, 'nativePageReloads')) { + continue; + } + + if (page.title.includes('React')) { + if (page.id !== this.#lastConnectedLegacyReactNativePage?.id) { + this.#newLegacyReactNativePage(page); break; } } @@ -315,88 +367,93 @@ export default class Device { // Device sends disconnect events only when page is reloaded or // if debugger socket was disconnected. const pageId = message.payload.pageId; - const debuggerSocket = this._debuggerConnection - ? this._debuggerConnection.socket + // TODO(moti): Handle null case explicitly, e.g. swallow disconnect events + // for unknown pages. + const page: ?Page = this.#pages.get(pageId); + + if (page != null && this.#pageHasCapability(page, 'nativePageReloads')) { + return; + } + + const debuggerSocket = this.#debuggerConnection + ? this.#debuggerConnection.socket : null; if (debuggerSocket && debuggerSocket.readyState === WS.OPEN) { if ( - this._debuggerConnection != null && - this._debuggerConnection.pageId !== REACT_NATIVE_RELOADABLE_PAGE_ID + this.#debuggerConnection != null && + this.#debuggerConnection.pageId !== REACT_NATIVE_RELOADABLE_PAGE_ID ) { - debug(`Page ${pageId} is reloading.`); + debug(`Legacy page ${pageId} is reloading.`); debuggerSocket.send(JSON.stringify({method: 'reload'})); } } } else if (message.event === 'wrappedEvent') { - if (this._debuggerConnection == null) { + if (this.#debuggerConnection == null) { return; } // FIXME: Is it possible that we received message for pageID that does not // correspond to current debugger connection? + // TODO(moti): yes, fix multi-debugger case - const debuggerSocket = this._debuggerConnection.socket; + const debuggerSocket = this.#debuggerConnection.socket; if (debuggerSocket == null || debuggerSocket.readyState !== WS.OPEN) { // TODO(hypuk): Send error back to device? return; } const parsedPayload = JSON.parse(message.payload.wrappedEvent); + const pageId = this.#debuggerConnection?.pageId ?? null; if ('id' in parsedPayload) { - this._deviceEventReporter?.logResponse(parsedPayload, 'device', { - pageId: this._debuggerConnection?.pageId ?? null, - frontendUserAgent: this._debuggerConnection?.userAgent ?? null, + this.#deviceEventReporter?.logResponse(parsedPayload, 'device', { + pageId, + frontendUserAgent: this.#debuggerConnection?.userAgent ?? null, }); } - if (this._debuggerConnection) { + if (this.#debuggerConnection != null) { // Wrapping just to make flow happy :) // $FlowFixMe[unused-promise] - this._processMessageFromDevice( + this.#processMessageFromDeviceLegacy( parsedPayload, - this._debuggerConnection, + this.#debuggerConnection, + pageId, ).then(() => { const messageToSend = JSON.stringify(parsedPayload); debuggerSocket.send(messageToSend); }); + } else { + debuggerSocket.send(message.payload.wrappedEvent); } } } // Sends single message to device. - _sendMessageToDevice(message: MessageToDevice) { + #sendMessageToDevice(message: MessageToDevice) { try { if (message.event !== 'getPages') { debug('(Debugger) (Proxy) -> (Device): ' + JSON.stringify(message)); } - this._deviceSocket.send(JSON.stringify(message)); + this.#deviceSocket.send(JSON.stringify(message)); } catch (error) {} } - // Sends 'getPages' request to device every PAGES_POLLING_INTERVAL milliseconds. - _setPagesPolling() { - setInterval( - () => this._sendMessageToDevice({event: 'getPages'}), - PAGES_POLLING_INTERVAL, - ); - } - // We received new React Native Page ID. - _newReactNativePage(page: Page) { + #newLegacyReactNativePage(page: Page) { debug(`React Native page updated to ${page.id}`); if ( - this._debuggerConnection == null || - this._debuggerConnection.pageId !== REACT_NATIVE_RELOADABLE_PAGE_ID + this.#debuggerConnection == null || + this.#debuggerConnection.pageId !== REACT_NATIVE_RELOADABLE_PAGE_ID ) { // We can just remember new page ID without any further actions if no // debugger is currently attached or attached debugger is not // "Reloadable React Native" connection. - this._lastConnectedReactNativePage = page; + this.#lastConnectedLegacyReactNativePage = page; return; } - const oldPageId = this._lastConnectedReactNativePage?.id; - this._lastConnectedReactNativePage = page; - this._isReloading = true; + const oldPageId = this.#lastConnectedLegacyReactNativePage?.id; + this.#lastConnectedLegacyReactNativePage = page; + this.#isLegacyPageReloading = true; // We already had a debugger connected to React Native page and a // new one appeared - in this case we need to emulate execution context @@ -404,7 +461,7 @@ export default class Device { // page. if (oldPageId != null) { - this._sendMessageToDevice({ + this.#sendMessageToDevice({ event: 'disconnect', payload: { pageId: oldPageId, @@ -412,7 +469,7 @@ export default class Device { }); } - this._sendMessageToDevice({ + this.#sendMessageToDevice({ event: 'connect', payload: { pageId: page.id, @@ -425,14 +482,14 @@ export default class Device { ]; for (const message of toSend) { - this._deviceEventReporter?.logRequest(message, 'proxy', { - pageId: this._debuggerConnection?.pageId ?? null, - frontendUserAgent: this._debuggerConnection?.userAgent ?? null, + this.#deviceEventReporter?.logRequest(message, 'proxy', { + pageId: this.#debuggerConnection?.pageId ?? null, + frontendUserAgent: this.#debuggerConnection?.userAgent ?? null, }); - this._sendMessageToDevice({ + this.#sendMessageToDevice({ event: 'wrappedEvent', payload: { - pageId: this._mapToDevicePageId(page.id), + pageId: this.#mapToDevicePageId(page.id), wrappedEvent: JSON.stringify(message), }, }); @@ -440,17 +497,28 @@ export default class Device { } // Allows to make changes in incoming message from device. - async _processMessageFromDevice( - payload: {method: string, params: {sourceMapURL: string, url: string}}, + async #processMessageFromDeviceLegacy( + payload: CDPServerMessage, debuggerInfo: DebuggerInfo, + pageId: ?string, ) { + // TODO(moti): Handle null case explicitly, or ideally associate a copy + // of the page metadata object with the connection so this can never be + // null. + const page: ?Page = pageId != null ? this.#pages.get(pageId) : null; + // Replace Android addresses for scriptParsed event. - if (payload.method === 'Debugger.scriptParsed') { - const params = payload.params || {}; + if ( + (!page || !this.#pageHasCapability(page, 'nativeSourceCodeFetching')) && + payload.method === 'Debugger.scriptParsed' && + payload.params != null + ) { + const params = payload.params; if ('sourceMapURL' in params) { for (let i = 0; i < EMULATOR_LOCALHOST_ADDRESSES.length; ++i) { const address = EMULATOR_LOCALHOST_ADDRESSES[i]; - if (params.sourceMapURL.indexOf(address) >= 0) { + if (params.sourceMapURL.includes(address)) { + // $FlowFixMe[cannot-write] payload.params.sourceMapURL = params.sourceMapURL.replace( address, 'localhost', @@ -459,7 +527,7 @@ export default class Device { } } - const sourceMapURL = this._tryParseHTTPURL(params.sourceMapURL); + const sourceMapURL = this.#tryParseHTTPURL(params.sourceMapURL); if (sourceMapURL) { // Some debug clients do not support fetching HTTP URLs. If the // message headed to the debug client identifies the source map with @@ -467,12 +535,13 @@ export default class Device { // Data URL (which is more widely supported) before passing the // message to the debug client. try { - const sourceMap = await this._fetchText(sourceMapURL); + const sourceMap = await this.#fetchText(sourceMapURL); + // $FlowFixMe[cannot-write] payload.params.sourceMapURL = 'data:application/json;charset=utf-8;base64,' + new Buffer(sourceMap).toString('base64'); } catch (exception) { - this._sendErrorToDebugger( + this.#sendErrorToDebugger( `Failed to fetch source map ${params.sourceMapURL}: ${exception.message}`, ); } @@ -482,6 +551,7 @@ export default class Device { for (let i = 0; i < EMULATOR_LOCALHOST_ADDRESSES.length; ++i) { const address = EMULATOR_LOCALHOST_ADDRESSES[i]; if (params.url.indexOf(address) >= 0) { + // $FlowFixMe[cannot-write] payload.params.url = params.url.replace(address, 'localhost'); debuggerInfo.originalSourceURLAddress = address; } @@ -492,20 +562,21 @@ export default class Device { // Chrome to not download source maps. In this case we want to prepend script ID // with 'file://' prefix. if (payload.params.url.match(/^[0-9a-z]+$/)) { + // $FlowFixMe[cannot-write] payload.params.url = FILE_PREFIX + payload.params.url; debuggerInfo.prependedFilePrefix = true; } // $FlowFixMe[prop-missing] if (params.scriptId != null) { - this._scriptIdToSourcePathMapping.set(params.scriptId, params.url); + this.#scriptIdToSourcePathMapping.set(params.scriptId, params.url); } } } if ( payload.method === 'Runtime.executionContextCreated' && - this._isReloading + this.#isLegacyPageReloading ) { // The new context is ready. First notify Chrome that we've reloaded so // it'll resend its breakpoints. If we do this earlier, we may not be @@ -522,102 +593,118 @@ export default class Device { // This is not an issue in VSCode/Nuclide where the IDE knows to resume // at its convenience. const resumeMessage = {method: 'Debugger.resume', id: 0}; - this._deviceEventReporter?.logRequest(resumeMessage, 'proxy', { - pageId: this._debuggerConnection?.pageId ?? null, - frontendUserAgent: this._debuggerConnection?.userAgent ?? null, + this.#deviceEventReporter?.logRequest(resumeMessage, 'proxy', { + pageId: this.#debuggerConnection?.pageId ?? null, + frontendUserAgent: this.#debuggerConnection?.userAgent ?? null, }); - this._sendMessageToDevice({ + this.#sendMessageToDevice({ event: 'wrappedEvent', payload: { - pageId: this._mapToDevicePageId(debuggerInfo.pageId), + pageId: this.#mapToDevicePageId(debuggerInfo.pageId), wrappedEvent: JSON.stringify(resumeMessage), }, }); - this._isReloading = false; + this.#isLegacyPageReloading = false; } } - // Allows to make changes in incoming messages from debugger. Returns a boolean - // indicating whether the message has been handled locally (i.e. does not need - // to be forwarded to the target). - _interceptMessageFromDebugger( - req: DebuggerRequest, + /** + * Intercept an incoming message from a connected debugger. Returns either an + * original/replacement CDP message object, or `null` (will forward nothing + * to the target). + */ + #interceptClientMessageForSourceFetching( + req: CDPClientMessage, debuggerInfo: DebuggerInfo, socket: WS, - ): boolean { - if (req.method === 'Debugger.setBreakpointByUrl') { - this._processDebuggerSetBreakpointByUrl(req, debuggerInfo); - } else if (req.method === 'Debugger.getScriptSource') { - this._processDebuggerGetScriptSource(req, socket); - return true; + ): CDPClientMessage | null { + switch (req.method) { + case 'Debugger.setBreakpointByUrl': + return this.#processDebuggerSetBreakpointByUrl(req, debuggerInfo); + case 'Debugger.getScriptSource': + // Sends response to debugger via side-effect + this.#processDebuggerGetScriptSource(req, socket); + return null; + default: + return req; } - return false; } - _processDebuggerSetBreakpointByUrl( - req: SetBreakpointByUrlRequest, + #processDebuggerSetBreakpointByUrl( + req: CDPRequest<'Debugger.setBreakpointByUrl'>, debuggerInfo: DebuggerInfo, - ) { + ): CDPRequest<'Debugger.setBreakpointByUrl'> { // If we replaced Android emulator's address to localhost we need to change it back. if (debuggerInfo.originalSourceURLAddress != null) { - if (req.params.url != null) { - req.params.url = req.params.url.replace( + const processedReq = {...req, params: {...req.params}}; + if (processedReq.params.url != null) { + processedReq.params.url = processedReq.params.url.replace( 'localhost', debuggerInfo.originalSourceURLAddress, ); if ( - req.params.url && - req.params.url.startsWith(FILE_PREFIX) && + processedReq.params.url && + processedReq.params.url.startsWith(FILE_PREFIX) && debuggerInfo.prependedFilePrefix ) { - // Remove fake URL prefix if we modified URL in _processMessageFromDevice. + // Remove fake URL prefix if we modified URL in #processMessageFromDeviceLegacy. // $FlowFixMe[incompatible-use] - req.params.url = req.params.url.slice(FILE_PREFIX.length); + processedReq.params.url = processedReq.params.url.slice( + FILE_PREFIX.length, + ); } } - if (req.params.urlRegex != null) { - req.params.urlRegex = req.params.urlRegex.replace( + if (processedReq.params.urlRegex != null) { + processedReq.params.urlRegex = processedReq.params.urlRegex.replace( /localhost/g, // $FlowFixMe[incompatible-call] debuggerInfo.originalSourceURLAddress, ); } + return processedReq; } + return req; } - _processDebuggerGetScriptSource(req: GetScriptSourceRequest, socket: WS) { + #processDebuggerGetScriptSource( + req: CDPRequest<'Debugger.getScriptSource'>, + socket: WS, + ): void { const sendSuccessResponse = (scriptSource: string) => { - const result: GetScriptSourceResponse = {scriptSource}; - const response = {id: req.id, result}; + const result = {scriptSource}; + const response: CDPResponse<'Debugger.getScriptSource'> = { + id: req.id, + result, + }; socket.send(JSON.stringify(response)); - this._deviceEventReporter?.logResponse(response, 'proxy', { - pageId: this._debuggerConnection?.pageId ?? null, - frontendUserAgent: this._debuggerConnection?.userAgent ?? null, + this.#deviceEventReporter?.logResponse(response, 'proxy', { + pageId: this.#debuggerConnection?.pageId ?? null, + frontendUserAgent: this.#debuggerConnection?.userAgent ?? null, }); }; const sendErrorResponse = (error: string) => { // Tell the client that the request failed - const result: ErrorResponse = {error: {message: error}}; + const result = {error: {message: error}}; const response = {id: req.id, result}; socket.send(JSON.stringify(response)); // Send to the console as well, so the user can see it - this._sendErrorToDebugger(error); - this._deviceEventReporter?.logResponse(response, 'proxy', { - pageId: this._debuggerConnection?.pageId ?? null, - frontendUserAgent: this._debuggerConnection?.userAgent ?? null, + this.#sendErrorToDebugger(error); + this.#deviceEventReporter?.logResponse(response, 'proxy', { + pageId: this.#debuggerConnection?.pageId ?? null, + frontendUserAgent: this.#debuggerConnection?.userAgent ?? null, }); }; - const pathToSource = this._scriptIdToSourcePathMapping.get( + const pathToSource = this.#scriptIdToSourcePathMapping.get( req.params.scriptId, ); if (pathToSource != null) { - const httpURL = this._tryParseHTTPURL(pathToSource); + const httpURL = this.#tryParseHTTPURL(pathToSource); if (httpURL) { - this._fetchText(httpURL).then( + this.#fetchText(httpURL).then( text => sendSuccessResponse(text), err => sendErrorResponse( @@ -628,7 +715,7 @@ export default class Device { let file; try { file = fs.readFileSync( - path.resolve(this._projectRoot, pathToSource), + path.resolve(this.#projectRoot, pathToSource), 'utf8', ); } catch (err) { @@ -643,18 +730,18 @@ export default class Device { } } - _mapToDevicePageId(pageId: string): string { + #mapToDevicePageId(pageId: string): string { if ( pageId === REACT_NATIVE_RELOADABLE_PAGE_ID && - this._lastConnectedReactNativePage != null + this.#lastConnectedLegacyReactNativePage != null ) { - return this._lastConnectedReactNativePage.id; + return this.#lastConnectedLegacyReactNativePage.id; } else { return pageId; } } - _tryParseHTTPURL(url: string): ?URL { + #tryParseHTTPURL(url: string): ?URL { let parsedURL: ?URL; try { parsedURL = new URL(url); @@ -670,13 +757,16 @@ export default class Device { // Fetch text, raising an exception if the text could not be fetched, // or is too large. - async _fetchText(url: URL): Promise { - if (url.hostname !== 'localhost') { + async #fetchText(url: URL): Promise { + if (!['localhost', '127.0.0.1'].includes(url.hostname)) { throw new Error('remote fetches not permitted'); } // $FlowFixMe[incompatible-call] Suppress arvr node-fetch flow error const response = await fetch(url); + if (!response.ok) { + throw new Error('HTTP ' + response.status + ' ' + response.statusText); + } const text = await response.text(); // Restrict the length to well below the 500MB limit for nodejs (leaving // room some some later manipulation, e.g. base64 or wrapping in JSON) @@ -686,8 +776,8 @@ export default class Device { return text; } - _sendErrorToDebugger(message: string) { - const debuggerSocket = this._debuggerConnection?.socket; + #sendErrorToDebugger(message: string) { + const debuggerSocket = this.#debuggerConnection?.socket; if (debuggerSocket && debuggerSocket.readyState === WS.OPEN) { debuggerSocket.send( JSON.stringify({ diff --git a/packages/dev-middleware/src/inspector-proxy/DeviceEventReporter.js b/packages/dev-middleware/src/inspector-proxy/DeviceEventReporter.js index e877617093229f..57462b9df56240 100644 --- a/packages/dev-middleware/src/inspector-proxy/DeviceEventReporter.js +++ b/packages/dev-middleware/src/inspector-proxy/DeviceEventReporter.js @@ -9,6 +9,8 @@ */ import type {EventReporter} from '../types/EventReporter'; +import type {CDPResponse} from './cdp-types/messages'; + import TTLCache from '@isaacs/ttlcache'; type PendingCommand = { @@ -30,9 +32,9 @@ type RequestMetadata = $ReadOnly<{ }>; class DeviceEventReporter { - _eventReporter: EventReporter; + #eventReporter: EventReporter; - _pendingCommands: TTLCache = new TTLCache({ + #pendingCommands: TTLCache = new TTLCache({ ttl: 10000, dispose: ( command: PendingCommand, @@ -43,15 +45,15 @@ class DeviceEventReporter { // TODO: Report clobbering ('set') using a dedicated error code return; } - this._logExpiredCommand(command); + this.#logExpiredCommand(command); }, }); - _metadata: DeviceMetadata; + #metadata: DeviceMetadata; constructor(eventReporter: EventReporter, metadata: DeviceMetadata) { - this._eventReporter = eventReporter; - this._metadata = metadata; + this.#eventReporter = eventReporter; + this.#metadata = metadata; } logRequest( @@ -59,7 +61,7 @@ class DeviceEventReporter { origin: 'debugger' | 'proxy', metadata: RequestMetadata, ): void { - this._pendingCommands.set(req.id, { + this.#pendingCommands.set(req.id, { method: req.method, requestOrigin: origin, requestTime: Date.now(), @@ -68,20 +70,16 @@ class DeviceEventReporter { } logResponse( - res: $ReadOnly<{ - id: number, - error?: {message: string, data?: mixed}, - ... - }>, + res: CDPResponse<>, origin: 'device' | 'proxy', metadata: $ReadOnly<{ pageId: string | null, frontendUserAgent: string | null, }>, ): void { - const pendingCommand = this._pendingCommands.get(res.id); + const pendingCommand = this.#pendingCommands.get(res.id); if (!pendingCommand) { - this._eventReporter.logEvent({ + this.#eventReporter.logEvent({ type: 'debugger_command', protocol: 'CDP', requestOrigin: null, @@ -90,22 +88,22 @@ class DeviceEventReporter { errorCode: 'UNMATCHED_REQUEST_ID', responseOrigin: 'proxy', timeSinceStart: null, - appId: this._metadata.appId, - deviceId: this._metadata.deviceId, - deviceName: this._metadata.deviceName, + appId: this.#metadata.appId, + deviceId: this.#metadata.deviceId, + deviceName: this.#metadata.deviceName, pageId: metadata.pageId, frontendUserAgent: metadata.frontendUserAgent, }); return; } const timeSinceStart = Date.now() - pendingCommand.requestTime; - this._pendingCommands.delete(res.id); + this.#pendingCommands.delete(res.id); if (res.error) { let {message} = res.error; if ('data' in res.error) { message += ` (${String(res.error.data)})`; } - this._eventReporter.logEvent({ + this.#eventReporter.logEvent({ type: 'debugger_command', requestOrigin: pendingCommand.requestOrigin, method: pendingCommand.method, @@ -115,15 +113,15 @@ class DeviceEventReporter { errorDetails: message, responseOrigin: origin, timeSinceStart, - appId: this._metadata.appId, - deviceId: this._metadata.deviceId, - deviceName: this._metadata.deviceName, + appId: this.#metadata.appId, + deviceId: this.#metadata.deviceId, + deviceName: this.#metadata.deviceName, pageId: pendingCommand.metadata.pageId, frontendUserAgent: pendingCommand.metadata.frontendUserAgent, }); return; } - this._eventReporter.logEvent({ + this.#eventReporter.logEvent({ type: 'debugger_command', protocol: 'CDP', requestOrigin: pendingCommand.requestOrigin, @@ -131,9 +129,9 @@ class DeviceEventReporter { status: 'success', responseOrigin: origin, timeSinceStart, - appId: this._metadata.appId, - deviceId: this._metadata.deviceId, - deviceName: this._metadata.deviceName, + appId: this.#metadata.appId, + deviceId: this.#metadata.deviceId, + deviceName: this.#metadata.deviceName, pageId: pendingCommand.metadata.pageId, frontendUserAgent: pendingCommand.metadata.frontendUserAgent, }); @@ -146,19 +144,19 @@ class DeviceEventReporter { frontendUserAgent: string | null, }>, ) { - this._eventReporter.logEvent({ + this.#eventReporter.logEvent({ type: 'connect_debugger_frontend', status: 'success', - appId: this._metadata.appId, - deviceName: this._metadata.deviceName, - deviceId: this._metadata.deviceId, + appId: this.#metadata.appId, + deviceName: this.#metadata.deviceName, + deviceId: this.#metadata.deviceId, pageId: metadata.pageId, frontendUserAgent: metadata.frontendUserAgent, }); } logDisconnection(disconnectedEntity: 'device' | 'debugger') { - const eventReporter = this._eventReporter; + const eventReporter = this.#eventReporter; if (!eventReporter) { return; } @@ -166,8 +164,8 @@ class DeviceEventReporter { disconnectedEntity === 'device' ? 'DEVICE_DISCONNECTED' : 'DEBUGGER_DISCONNECTED'; - for (const pendingCommand of this._pendingCommands.values()) { - this._eventReporter.logEvent({ + for (const pendingCommand of this.#pendingCommands.values()) { + this.#eventReporter.logEvent({ type: 'debugger_command', protocol: 'CDP', requestOrigin: pendingCommand.requestOrigin, @@ -176,18 +174,18 @@ class DeviceEventReporter { errorCode, responseOrigin: 'proxy', timeSinceStart: Date.now() - pendingCommand.requestTime, - appId: this._metadata.appId, - deviceId: this._metadata.deviceId, - deviceName: this._metadata.deviceName, + appId: this.#metadata.appId, + deviceId: this.#metadata.deviceId, + deviceName: this.#metadata.deviceName, pageId: pendingCommand.metadata.pageId, frontendUserAgent: pendingCommand.metadata.frontendUserAgent, }); } - this._pendingCommands.clear(); + this.#pendingCommands.clear(); } - _logExpiredCommand(pendingCommand: PendingCommand): void { - this._eventReporter.logEvent({ + #logExpiredCommand(pendingCommand: PendingCommand): void { + this.#eventReporter.logEvent({ type: 'debugger_command', protocol: 'CDP', requestOrigin: pendingCommand.requestOrigin, @@ -196,9 +194,9 @@ class DeviceEventReporter { errorCode: 'TIMED_OUT', responseOrigin: 'proxy', timeSinceStart: Date.now() - pendingCommand.requestTime, - appId: this._metadata.appId, - deviceId: this._metadata.deviceId, - deviceName: this._metadata.deviceName, + appId: this.#metadata.appId, + deviceId: this.#metadata.deviceId, + deviceName: this.#metadata.deviceName, pageId: pendingCommand.metadata.pageId, frontendUserAgent: pendingCommand.metadata.frontendUserAgent, }); diff --git a/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js b/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js index be4fe3e13a966e..066fa44cc3d536 100644 --- a/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js +++ b/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js @@ -9,19 +9,20 @@ * @oncall react_native */ +import type {EventReporter} from '../types/EventReporter'; +import type {Experiments} from '../types/Experiments'; import type { JsonPagesListResponse, JsonVersionResponse, Page, PageDescription, } from './types'; -import type {EventReporter} from '../types/EventReporter'; -import type {Experiments} from '../types/Experiments'; import type {IncomingMessage, ServerResponse} from 'http'; +import Device from './Device'; +import nullthrows from 'nullthrows'; import url from 'url'; import WS from 'ws'; -import Device from './Device'; const debug = require('debug')('Metro:InspectorProxy'); @@ -42,20 +43,20 @@ export interface InspectorProxyQueries { */ export default class InspectorProxy implements InspectorProxyQueries { // Root of the project used for relative to absolute source path conversion. - _projectRoot: string; + #projectRoot: string; /** The base URL to the dev server from the developer machine. */ - _serverBaseUrl: string; + #serverBaseUrl: string; // Maps device ID to Device instance. - _devices: Map; + #devices: Map; // Internal counter for device IDs -- just gets incremented for each new device. - _deviceCounter: number = 0; + #deviceCounter: number = 0; - _eventReporter: ?EventReporter; + #eventReporter: ?EventReporter; - _experiments: Experiments; + #experiments: Experiments; constructor( projectRoot: string, @@ -63,22 +64,22 @@ export default class InspectorProxy implements InspectorProxyQueries { eventReporter: ?EventReporter, experiments: Experiments, ) { - this._projectRoot = projectRoot; - this._serverBaseUrl = serverBaseUrl; - this._devices = new Map(); - this._eventReporter = eventReporter; - this._experiments = experiments; + this.#projectRoot = projectRoot; + this.#serverBaseUrl = serverBaseUrl; + this.#devices = new Map(); + this.#eventReporter = eventReporter; + this.#experiments = experiments; } getPageDescriptions(): Array { // Build list of pages from all devices. let result: Array = []; - Array.from(this._devices.entries()).forEach(([deviceId, device]) => { + Array.from(this.#devices.entries()).forEach(([deviceId, device]) => { result = result.concat( device .getPagesList() .map((page: Page) => - this._buildPageDescription(deviceId, device, page), + this.#buildPageDescription(deviceId, device, page), ), ); }); @@ -94,13 +95,14 @@ export default class InspectorProxy implements InspectorProxyQueries { response: ServerResponse, next: (?Error) => mixed, ) { + const pathname = url.parse(request.url).pathname; if ( - request.url === PAGES_LIST_JSON_URL || - request.url === PAGES_LIST_JSON_URL_2 + pathname === PAGES_LIST_JSON_URL || + pathname === PAGES_LIST_JSON_URL_2 ) { - this._sendJsonResponse(response, this.getPageDescriptions()); - } else if (request.url === PAGES_LIST_JSON_VERSION_URL) { - this._sendJsonResponse(response, { + this.#sendJsonResponse(response, this.getPageDescriptions()); + } else if (pathname === PAGES_LIST_JSON_VERSION_URL) { + this.#sendJsonResponse(response, { Browser: 'Mobile JavaScript', 'Protocol-Version': '1.1', }); @@ -113,19 +115,19 @@ export default class InspectorProxy implements InspectorProxyQueries { [path: string]: WS.Server, } { return { - [WS_DEVICE_URL]: this._createDeviceConnectionWSServer(), - [WS_DEBUGGER_URL]: this._createDebuggerConnectionWSServer(), + [WS_DEVICE_URL]: this.#createDeviceConnectionWSServer(), + [WS_DEBUGGER_URL]: this.#createDebuggerConnectionWSServer(), }; } // Converts page information received from device into PageDescription object // that is sent to debugger. - _buildPageDescription( + #buildPageDescription( deviceId: string, device: Device, page: Page, ): PageDescription { - const {host, protocol} = new URL(this._serverBaseUrl); + const {host, protocol} = new URL(this.#serverBaseUrl); const webSocketScheme = protocol === 'https:' ? 'wss' : 'ws'; const webSocketUrlWithoutProtocol = `${host}${WS_DEBUGGER_URL}?device=${deviceId}&page=${page.id}`; @@ -148,12 +150,16 @@ export default class InspectorProxy implements InspectorProxyQueries { webSocketDebuggerUrl, vm: page.vm, deviceName: device.getName(), + reactNative: { + logicalDeviceId: deviceId, + capabilities: nullthrows(page.capabilities), + }, }; } // Sends object as response to HTTP request. // Just serializes object using JSON and sets required headers. - _sendJsonResponse( + #sendJsonResponse( response: ServerResponse, object: JsonPagesListResponse | JsonVersionResponse, ) { @@ -161,7 +167,6 @@ export default class InspectorProxy implements InspectorProxyQueries { response.writeHead(200, { 'Content-Type': 'application/json; charset=UTF-8', 'Cache-Control': 'no-cache', - 'Content-Length': data.length.toString(), Connection: 'close', }); response.end(data); @@ -172,7 +177,7 @@ export default class InspectorProxy implements InspectorProxyQueries { // HTTP GET params. // For each new websocket connection we parse device and app names and create // new instance of Device class. - _createDeviceConnectionWSServer(): ws$WebSocketServer { + #createDeviceConnectionWSServer(): ws$WebSocketServer { const wss = new WS.Server({ noServer: true, perMessageDeflate: true, @@ -183,35 +188,35 @@ export default class InspectorProxy implements InspectorProxyQueries { // $FlowFixMe[value-as-type] wss.on('connection', async (socket: WS, req) => { try { - const fallbackDeviceId = String(this._deviceCounter++); + const fallbackDeviceId = String(this.#deviceCounter++); const query = url.parse(req.url || '', true).query || {}; const deviceId = query.device || fallbackDeviceId; const deviceName = query.name || 'Unknown'; const appName = query.app || 'Unknown'; - const oldDevice = this._devices.get(deviceId); + const oldDevice = this.#devices.get(deviceId); const newDevice = new Device( deviceId, deviceName, appName, socket, - this._projectRoot, - this._eventReporter, + this.#projectRoot, + this.#eventReporter, ); if (oldDevice) { oldDevice.handleDuplicateDeviceConnection(newDevice); } - this._devices.set(deviceId, newDevice); + this.#devices.set(deviceId, newDevice); debug( `Got new connection: name=${deviceName}, app=${appName}, device=${deviceId}`, ); socket.on('close', () => { - this._devices.delete(deviceId); + this.#devices.delete(deviceId); debug(`Device ${deviceName} disconnected.`); }); } catch (e) { @@ -227,7 +232,7 @@ export default class InspectorProxy implements InspectorProxyQueries { // in /json response. // When debugger connects we try to parse device and page IDs from the query and pass // websocket object to corresponding Device instance. - _createDebuggerConnectionWSServer(): ws$WebSocketServer { + #createDebuggerConnectionWSServer(): ws$WebSocketServer { const wss = new WS.Server({ noServer: true, perMessageDeflate: false, @@ -246,7 +251,7 @@ export default class InspectorProxy implements InspectorProxyQueries { throw new Error('Incorrect URL - must provide device and page IDs'); } - const device = this._devices.get(deviceId); + const device = this.#devices.get(deviceId); if (device == null) { throw new Error('Unknown device with ID ' + deviceId); } @@ -257,7 +262,7 @@ export default class InspectorProxy implements InspectorProxyQueries { } catch (e) { console.error(e); socket.close(INTERNAL_ERROR_CODE, e?.toString() ?? 'Unknown error'); - this._eventReporter?.logEvent({ + this.#eventReporter?.logEvent({ type: 'connect_debugger_frontend', status: 'error', error: e, diff --git a/packages/dev-middleware/src/inspector-proxy/cdp-types/messages.js b/packages/dev-middleware/src/inspector-proxy/cdp-types/messages.js new file mode 100644 index 00000000000000..79eb1458a995a3 --- /dev/null +++ b/packages/dev-middleware/src/inspector-proxy/cdp-types/messages.js @@ -0,0 +1,52 @@ +/** + * 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 {Commands, Events} from './protocol'; + +// Note: A CDP event is a JSON-RPC notification with no `id` member. +export type CDPEvent = 'unknown'> = $ReadOnly<{ + method: TEvent, + params: Events[TEvent], +}>; + +export type CDPRequest = 'unknown'> = $ReadOnly<{ + method: TCommand, + params: Commands[TCommand]['paramsType'], + id: number, +}>; + +export type CDPResponse = 'unknown'> = + | $ReadOnly<{ + result: Commands[TCommand]['resultType'], + id: number, + }> + | $ReadOnly<{ + error: CDPRequestError, + id: number, + }>; + +export type CDPRequestError = $ReadOnly<{ + code: number, + message: string, + data?: mixed, +}>; + +export type CDPClientMessage = + | CDPRequest<'Debugger.getScriptSource'> + | CDPRequest<'Debugger.scriptParsed'> + | CDPRequest<'Debugger.setBreakpointByUrl'> + | CDPRequest<>; + +export type CDPServerMessage = + | CDPEvent<'Debugger.scriptParsed'> + | CDPEvent<> + | CDPResponse<'Debugger.getScriptSource'> + | CDPResponse<>; diff --git a/packages/dev-middleware/src/inspector-proxy/cdp-types/protocol.js b/packages/dev-middleware/src/inspector-proxy/cdp-types/protocol.js new file mode 100644 index 00000000000000..4b7500c4070b79 --- /dev/null +++ b/packages/dev-middleware/src/inspector-proxy/cdp-types/protocol.js @@ -0,0 +1,106 @@ +/** + * 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 + */ + +// Adapted from https://github.com/ChromeDevTools/devtools-protocol/blob/master/types/protocol.d.ts + +type integer = number; + +export interface Debugger { + GetScriptSourceParams: $ReadOnly<{ + /** + * Id of the script to get source for. + */ + scriptId: string, + }>; + + GetScriptSourceResult: $ReadOnly<{ + /** + * Script source (empty in case of Wasm bytecode). + */ + scriptSource: string, + + /** + * Wasm bytecode. (Encoded as a base64 string when passed over JSON) + */ + bytecode?: string, + }>; + + SetBreakpointByUrlParams: $ReadOnly<{ + /** + * Line number to set breakpoint at. + */ + lineNumber: integer, + + /** + * URL of the resources to set breakpoint on. + */ + url?: string, + + /** + * Regex pattern for the URLs of the resources to set breakpoints on. Either `url` or + * `urlRegex` must be specified. + */ + urlRegex?: string, + + /** + * Script hash of the resources to set breakpoint on. + */ + scriptHash?: string, + + /** + * Offset in the line to set breakpoint at. + */ + columnNumber?: integer, + + /** + * Expression to use as a breakpoint condition. When specified, debugger will only stop on the + * breakpoint if this expression evaluates to true. + */ + condition?: string, + }>; + + ScriptParsedEvent: $ReadOnly<{ + /** + * Identifier of the script parsed. + */ + scriptId: string, + + /** + * URL or name of the script parsed (if any). + */ + url: string, + + /** + * URL of source map associated with script (if any). + */ + sourceMapURL: string, + }>; +} + +export type Events = { + 'Debugger.scriptParsed': Debugger['ScriptParsedEvent'], + [method: string]: mixed, +}; + +export type Commands = { + 'Debugger.getScriptSource': { + paramsType: Debugger['GetScriptSourceParams'], + resultType: Debugger['GetScriptSourceResult'], + }, + 'Debugger.setBreakpointByUrl': { + paramsType: Debugger['SetBreakpointByUrlParams'], + resultType: void, + }, + [method: string]: { + paramsType: mixed, + resultType: mixed, + }, +}; diff --git a/packages/dev-middleware/src/inspector-proxy/types.js b/packages/dev-middleware/src/inspector-proxy/types.js index 94b21aba10e84b..f4994a812c4830 100644 --- a/packages/dev-middleware/src/inspector-proxy/types.js +++ b/packages/dev-middleware/src/inspector-proxy/types.js @@ -4,57 +4,78 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format * @oncall react_native */ +/** + * A capability flag disables a specific feature/hack in the InspectorProxy + * layer by indicating that the target supports one or more modern CDP features. + */ +export type TargetCapabilityFlags = $ReadOnly<{ + /** + * The target supports a stable page representation across reloads. + * + * In the proxy, this disables legacy page reload emulation and the + * additional '(Experimental)' target in `/json/list`. + * + * In the launch flow, this allows targets to be matched directly by `appId`. + */ + nativePageReloads?: boolean, + + /** + * The target supports fetching source code and source maps. + * + * In the proxy, this disables source fetching emulation and host rewrites. + */ + nativeSourceCodeFetching?: boolean, +}>; + // Page information received from the device. New page is created for // each new instance of VM and can appear when user reloads React Native // application. -export type Page = { + +export type PageFromDevice = $ReadOnly<{ id: string, title: string, vm: string, app: string, - ... -}; + capabilities?: TargetCapabilityFlags, +}>; + +export type Page = Required; // Chrome Debugger Protocol message/event passed between device and debugger. -export type WrappedEvent = { +export type WrappedEvent = $ReadOnly<{ event: 'wrappedEvent', - payload: { + payload: $ReadOnly<{ pageId: string, wrappedEvent: string, - ... - }, - ... -}; + }>, +}>; // Request sent from Inspector Proxy to Device when new debugger is connected // to particular page. -export type ConnectRequest = { +export type ConnectRequest = $ReadOnly<{ event: 'connect', - payload: {pageId: string, ...}, - ... -}; + payload: $ReadOnly<{pageId: string}>, +}>; // Request sent from Inspector Proxy to Device to notify that debugger is // disconnected. -export type DisconnectRequest = { +export type DisconnectRequest = $ReadOnly<{ event: 'disconnect', - payload: {pageId: string, ...}, - ... -}; + payload: $ReadOnly<{pageId: string}>, +}>; // Request sent from Inspector Proxy to Device to get a list of pages. -export type GetPagesRequest = {event: 'getPages', ...}; +export type GetPagesRequest = {event: 'getPages'}; // Response to GetPagesRequest containing a list of page infos. export type GetPagesResponse = { event: 'getPages', - payload: Array, - ... + payload: $ReadOnlyArray, }; // Union type for all possible messages sent from device to Inspector Proxy. @@ -71,7 +92,7 @@ export type MessageToDevice = | DisconnectRequest; // Page description object that is sent in response to /json HTTP request from debugger. -export type PageDescription = { +export type PageDescription = $ReadOnly<{ id: string, description: string, title: string, @@ -79,57 +100,28 @@ export type PageDescription = { devtoolsFrontendUrl: string, type: string, webSocketDebuggerUrl: string, - ... -}; + deviceName: string, + vm: string, + // Metadata specific to React Native + reactNative: $ReadOnly<{ + logicalDeviceId: string, + capabilities: Page['capabilities'], + }>, +}>; + export type JsonPagesListResponse = Array; // Response to /json/version HTTP request from the debugger specifying browser type and // Chrome protocol version. -export type JsonVersionResponse = { +export type JsonVersionResponse = $ReadOnly<{ Browser: string, 'Protocol-Version': string, - ... -}; - -/** - * Types were exported from https://github.com/ChromeDevTools/devtools-protocol/blob/master/types/protocol.d.ts - */ - -export type SetBreakpointByUrlRequest = { - id: number, - method: 'Debugger.setBreakpointByUrl', - params: { - lineNumber: number, - url?: string, - urlRegex?: string, - scriptHash?: string, - columnNumber?: number, - condition?: string, - }, -}; - -export type GetScriptSourceRequest = { - id: number, - method: 'Debugger.getScriptSource', - params: { - scriptId: string, - }, -}; - -export type GetScriptSourceResponse = { - scriptSource: string, - /** - * Wasm bytecode. - */ - bytecode?: string, -}; - -export type ErrorResponse = { - error: { - message: string, - }, -}; - -export type DebuggerRequest = - | SetBreakpointByUrlRequest - | GetScriptSourceRequest; +}>; + +export type JSONSerializable = + | boolean + | number + | string + | null + | $ReadOnlyArray + | {+[string]: JSONSerializable}; diff --git a/packages/dev-middleware/src/middleware/deprecated_openFlipperMiddleware.js b/packages/dev-middleware/src/middleware/deprecated_openFlipperMiddleware.js index 35a222ce7f0207..6a2d07a5f0374d 100644 --- a/packages/dev-middleware/src/middleware/deprecated_openFlipperMiddleware.js +++ b/packages/dev-middleware/src/middleware/deprecated_openFlipperMiddleware.js @@ -9,9 +9,9 @@ * @oncall react_native */ +import type {Logger} from '../types/Logger'; import type {NextHandleFunction} from 'connect'; import type {IncomingMessage, ServerResponse} from 'http'; -import type {Logger} from '../types/Logger'; import open from 'open'; diff --git a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js index 14ee05051a6099..1f3b4d74358521 100644 --- a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js +++ b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js @@ -9,16 +9,16 @@ * @oncall react_native */ -import type {NextHandleFunction} from 'connect'; -import type {IncomingMessage, ServerResponse} from 'http'; import type {InspectorProxyQueries} from '../inspector-proxy/InspectorProxy'; import type {BrowserLauncher, LaunchedBrowser} from '../types/BrowserLauncher'; import type {EventReporter} from '../types/EventReporter'; import type {Experiments} from '../types/Experiments'; import type {Logger} from '../types/Logger'; +import type {NextHandleFunction} from 'connect'; +import type {IncomingMessage, ServerResponse} from 'http'; -import url from 'url'; import getDevToolsFrontendUrl from '../utils/getDevToolsFrontendUrl'; +import url from 'url'; const debuggerInstances = new Map(); @@ -57,24 +57,33 @@ export default function openDebuggerMiddleware({ (experiments.enableOpenDebuggerRedirect && req.method === 'GET') ) { const {query} = url.parse(req.url, true); - const {appId} = query; + const {appId, device}: {appId?: string, device?: string, ...} = query; const targets = inspectorProxy.getPageDescriptions().filter( // Only use targets with better reloading support app => - app.title === 'React Native Experimental (Improved Chrome Reloads)', + app.title === 'React Native Experimental (Improved Chrome Reloads)' || + app.reactNative.capabilities?.nativePageReloads === true, ); + let target; const launchType: 'launch' | 'redirect' = req.method === 'POST' ? 'launch' : 'redirect'; - if (typeof appId === 'string') { + if (typeof appId === 'string' || typeof device === 'string') { logger?.info( (launchType === 'launch' ? 'Launching' : 'Redirecting to') + ' JS debugger (experimental)...', ); - target = targets.find(_target => _target.description === appId); + if (typeof device === 'string') { + target = targets.find( + _target => _target.reactNative.logicalDeviceId === device, + ); + } + if (!target && typeof appId === 'string') { + target = targets.find(_target => _target.description === appId); + } } else { logger?.info( (launchType === 'launch' ? 'Launching' : 'Redirecting to') + @@ -101,11 +110,16 @@ export default function openDebuggerMiddleware({ try { switch (launchType) { case 'launch': - await debuggerInstances.get(appId)?.kill(); + const frontendInstanceId = + device != null + ? 'device:' + device + : 'app:' + (appId ?? ''); + await debuggerInstances.get(frontendInstanceId)?.kill(); debuggerInstances.set( - appId, + frontendInstanceId, await browserLauncher.launchDebuggerAppWindow( getDevToolsFrontendUrl( + experiments, target.webSocketDebuggerUrl, serverBaseUrl, ), @@ -116,6 +130,7 @@ export default function openDebuggerMiddleware({ case 'redirect': res.writeHead(302, { Location: getDevToolsFrontendUrl( + experiments, target.webSocketDebuggerUrl, // Use a relative URL. '', @@ -130,7 +145,8 @@ export default function openDebuggerMiddleware({ type: 'launch_debugger_frontend', launchType, status: 'success', - appId, + appId: appId ?? null, + deviceId: device ?? null, }); return; } catch (e) { diff --git a/packages/dev-middleware/src/types/EventReporter.js b/packages/dev-middleware/src/types/EventReporter.js index ec8e77d521b0fc..51ae36d081dd45 100644 --- a/packages/dev-middleware/src/types/EventReporter.js +++ b/packages/dev-middleware/src/types/EventReporter.js @@ -36,7 +36,7 @@ export type ReportableEvent = type: 'launch_debugger_frontend', launchType: 'launch' | 'redirect', ... - | SuccessResult<{appId: string}> + | SuccessResult<{appId: string | null, deviceId: string | null}> | ErrorResult | CodedErrorResult<'NO_APPS_FOUND'>, } diff --git a/packages/dev-middleware/src/types/Experiments.js b/packages/dev-middleware/src/types/Experiments.js index 9f15d94c8ef3d7..c5c2c9af439b07 100644 --- a/packages/dev-middleware/src/types/Experiments.js +++ b/packages/dev-middleware/src/types/Experiments.js @@ -23,6 +23,11 @@ export type Experiments = $ReadOnly<{ * interface. */ enableOpenDebuggerRedirect: boolean, + + /** + * Enables the Network panel when launching the custom debugger frontend. + */ + enableNetworkInspector: boolean, }>; export type ExperimentsConfig = Partial; diff --git a/packages/dev-middleware/src/utils/DefaultBrowserLauncher.js b/packages/dev-middleware/src/utils/DefaultBrowserLauncher.js index 9e2b728dd33f4f..8992f194c54192 100644 --- a/packages/dev-middleware/src/utils/DefaultBrowserLauncher.js +++ b/packages/dev-middleware/src/utils/DefaultBrowserLauncher.js @@ -15,8 +15,8 @@ import {promises as fs} from 'fs'; import path from 'path'; import osTempDir from 'temp-dir'; +const {Launcher: EdgeLauncher} = require('@rnx-kit/chromium-edge-launcher'); const ChromeLauncher = require('chrome-launcher'); -const {Launcher: EdgeLauncher} = require('chromium-edge-launcher'); /** * Default `BrowserLauncher` implementation which opens URLs on the host diff --git a/packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js b/packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js index 0178c4db2d3f73..4623616292fea5 100644 --- a/packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js +++ b/packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js @@ -9,18 +9,30 @@ * @oncall react_native */ +import type {Experiments} from '../types/Experiments'; + /** * Get the DevTools frontend URL to debug a given React Native CDP target. */ export default function getDevToolsFrontendUrl( + experiments: Experiments, webSocketDebuggerUrl: string, devServerUrl: string, ): string { const scheme = new URL(webSocketDebuggerUrl).protocol.slice(0, -1); - const appUrl = `${devServerUrl}/debugger-frontend/rn_inspector.html`; - const webSocketUrlWithoutProtocol = encodeURIComponent( - webSocketDebuggerUrl.replace(/^wss?:\/\//, ''), + const webSocketUrlWithoutProtocol = webSocketDebuggerUrl.replace( + /^wss?:\/\//, + '', ); + const appUrl = `${devServerUrl}/debugger-frontend/rn_inspector.html`; + + const searchParams = new URLSearchParams([ + [scheme, webSocketUrlWithoutProtocol], + ['sources.hide_add_folder', 'true'], + ]); + if (experiments.enableNetworkInspector) { + searchParams.append('unstable_enableNetworkPanel', 'true'); + } - return `${appUrl}?${scheme}=${webSocketUrlWithoutProtocol}&sources.hide_add_folder=true`; + return appUrl + '?' + searchParams.toString(); } diff --git a/packages/eslint-config-react-native/index.js b/packages/eslint-config-react-native/index.js index 8de08008e5c9d3..b1d0ee3cf366c4 100644 --- a/packages/eslint-config-react-native/index.js +++ b/packages/eslint-config-react-native/index.js @@ -220,6 +220,7 @@ module.exports = { 'no-catch-shadow': 1, // disallow the catch clause parameter name being the same as a variable in the outer scope (off by default in the node environment) 'no-delete-var': 1, // disallow deletion of variables + 'no-global-assign': 2, // disallow assignments to native objects or read-only global variables 'no-label-var': 1, // disallow labels that share a name with a variable 'no-shadow': 1, // disallow declaration of variables already declared in the outer scope 'no-shadow-restricted-names': 1, // disallow shadowing of names such as arguments @@ -254,7 +255,6 @@ module.exports = { // These rules are purely matters of style and are quite subjective. 'key-spacing': 0, - 'keyword-spacing': 1, // enforce spacing before and after keywords 'jsx-quotes': [1, 'prefer-double'], // enforces the usage of double quotes for all JSX attribute values which doesn’t contain a double quote 'comma-spacing': 0, 'no-multi-spaces': 0, diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index 39e8684bbbddd4..7edb68a00afbe1 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-config", - "version": "0.73.0", + "version": "0.74.0", "description": "ESLint config for React Native", "license": "MIT", "repository": { @@ -22,7 +22,7 @@ "dependencies": { "@babel/core": "^7.20.0", "@babel/eslint-parser": "^7.20.0", - "@react-native/eslint-plugin": "^0.73.0", + "@react-native/eslint-plugin": "0.74.0", "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", "eslint-config-prettier": "^8.5.0", diff --git a/packages/eslint-plugin-react-native/__tests__/platform-colors-test.js b/packages/eslint-plugin-react-native/__tests__/platform-colors-test.js index 76e799f3cb5b12..fceb13bb7acd9f 100644 --- a/packages/eslint-plugin-react-native/__tests__/platform-colors-test.js +++ b/packages/eslint-plugin-react-native/__tests__/platform-colors-test.js @@ -10,9 +10,8 @@ 'use strict'; -const ESLintTester = require('./eslint-tester.js'); - const rule = require('../platform-colors.js'); +const ESLintTester = require('./eslint-tester.js'); const eslintTester = new ESLintTester(); diff --git a/packages/eslint-plugin-react-native/package.json b/packages/eslint-plugin-react-native/package.json index 17421a3d4dbc88..acb35918dd30e1 100644 --- a/packages/eslint-plugin-react-native/package.json +++ b/packages/eslint-plugin-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin", - "version": "0.73.0", + "version": "0.74.0", "description": "ESLint rules for @react-native/eslint-config", "license": "MIT", "repository": { diff --git a/packages/eslint-plugin-specs/__tests__/react-native-modules-test.js b/packages/eslint-plugin-specs/__tests__/react-native-modules-test.js index ae3b5c62ac664d..0704665af2370a 100644 --- a/packages/eslint-plugin-specs/__tests__/react-native-modules-test.js +++ b/packages/eslint-plugin-specs/__tests__/react-native-modules-test.js @@ -10,9 +10,8 @@ 'use strict'; -const ESLintTester = require('./eslint-tester.js'); - const rule = require('../react-native-modules'); +const ESLintTester = require('./eslint-tester.js'); const NATIVE_MODULES_DIR = __dirname; diff --git a/packages/eslint-plugin-specs/package.json b/packages/eslint-plugin-specs/package.json index 727b8fea2e3fc1..fa04efd48a5717 100644 --- a/packages/eslint-plugin-specs/package.json +++ b/packages/eslint-plugin-specs/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin-specs", - "version": "0.73.0", + "version": "0.74.0", "description": "ESLint rules to validate NativeModule and Component Specs", "license": "MIT", "repository": { @@ -31,8 +31,7 @@ "@babel/eslint-parser": "^7.20.0", "@babel/plugin-transform-flow-strip-types": "^7.20.0", "@babel/preset-flow": "^7.20.0", - "@react-native/codegen": "*", - "flow-parser": "^0.206.0", + "@react-native/codegen": "0.74.0", "make-dir": "^2.1.0", "pirates": "^4.0.1", "source-map-support": "0.5.0" diff --git a/packages/eslint-plugin-specs/react-native-modules.js b/packages/eslint-plugin-specs/react-native-modules.js index 9f142919d9e075..7cbcc03eef2641 100644 --- a/packages/eslint-plugin-specs/react-native-modules.js +++ b/packages/eslint-plugin-specs/react-native-modules.js @@ -10,8 +10,8 @@ 'use strict'; -const path = require('path'); const withBabelRegister = require('./with-babel-register'); +const path = require('path'); // We use the prepack hook before publishing package to set this value to true const PACKAGE_USAGE = false; @@ -154,7 +154,7 @@ function rule(context) { const [parsingErrors, tryParse] = createParserErrorCapturer(); const sourceCode = context.getSourceCode().getText(); - const ast = parser.getAst(sourceCode); + const ast = parser.getAst(sourceCode, filename); tryParse(() => { buildModuleSchema( diff --git a/packages/eslint-plugin-specs/with-babel-register/disk-cache.js b/packages/eslint-plugin-specs/with-babel-register/disk-cache.js index c840036775271e..a468c7b6d715ad 100644 --- a/packages/eslint-plugin-specs/with-babel-register/disk-cache.js +++ b/packages/eslint-plugin-specs/with-babel-register/disk-cache.js @@ -8,10 +8,10 @@ * @oncall react_native */ -const path = require('path'); const fs = require('fs'); -const os = require('os'); const {sync: makeDirSync} = require('make-dir'); +const os = require('os'); +const path = require('path'); const packageJson = JSON.parse( fs.readFileSync(require.resolve('../package.json'), 'utf8'), diff --git a/packages/eslint-plugin-specs/with-babel-register/index.js b/packages/eslint-plugin-specs/with-babel-register/index.js index e4fe1450367b24..77f9fb6e1bfb41 100644 --- a/packages/eslint-plugin-specs/with-babel-register/index.js +++ b/packages/eslint-plugin-specs/with-babel-register/index.js @@ -8,13 +8,13 @@ * @oncall react_native */ +const diskCache = require('./disk-cache'); const babel = require('@babel/core'); -const {OptionManager, DEFAULT_EXTENSIONS} = require('@babel/core'); -const sourceMapSupport = require('source-map-support'); -const {addHook} = require('pirates'); -const path = require('path'); +const {DEFAULT_EXTENSIONS, OptionManager} = require('@babel/core'); const fs = require('fs'); -const diskCache = require('./disk-cache'); +const path = require('path'); +const {addHook} = require('pirates'); +const sourceMapSupport = require('source-map-support'); function compile(sourceMapManager, cache, options, code, filename) { const opts = new OptionManager().init({ diff --git a/packages/hermes-inspector-msggen/__tests__/header-writer-test.js b/packages/hermes-inspector-msggen/__tests__/header-writer-test.js index 5ba2bb2a1158b5..e793c803cdfcb4 100644 --- a/packages/hermes-inspector-msggen/__tests__/header-writer-test.js +++ b/packages/hermes-inspector-msggen/__tests__/header-writer-test.js @@ -5,15 +5,15 @@ * LICENSE file in the root directory of this source tree. */ -import {expectCodeIsEqual, FakeWritable} from '../src/TestHelpers'; +import { Command } from '../src/Command'; +import { Event } from '../src/Event'; import { emitNotificationDecl, emitRequestDecl, emitResponseDecl, emitTypeDecl, } from '../src/HeaderWriter'; -import { Event } from '../src/Event'; -import { Command } from '../src/Command'; +import {FakeWritable, expectCodeIsEqual} from '../src/TestHelpers'; import { Type } from '../src/Type'; let stream = null; diff --git a/packages/hermes-inspector-msggen/__tests__/implementation-writer-test.js b/packages/hermes-inspector-msggen/__tests__/implementation-writer-test.js index 6ad01e08231a81..8d83a9cc67c59f 100644 --- a/packages/hermes-inspector-msggen/__tests__/implementation-writer-test.js +++ b/packages/hermes-inspector-msggen/__tests__/implementation-writer-test.js @@ -5,15 +5,15 @@ * LICENSE file in the root directory of this source tree. */ -import {expectCodeIsEqual, FakeWritable} from '../src/TestHelpers'; +import { Command } from '../src/Command'; +import { Event } from '../src/Event'; import { emitNotificationDef, emitRequestDef, emitResponseDef, emitTypeDef, } from '../src/ImplementationWriter'; -import { Event } from '../src/Event'; -import { Command } from '../src/Command'; +import {FakeWritable, expectCodeIsEqual} from '../src/TestHelpers'; import { Type } from '../src/Type'; let stream = null; diff --git a/packages/hermes-inspector-msggen/src/Command.js b/packages/hermes-inspector-msggen/src/Command.js index feed094bb12d71..f6da8dffa8c665 100644 --- a/packages/hermes-inspector-msggen/src/Command.js +++ b/packages/hermes-inspector-msggen/src/Command.js @@ -8,8 +8,8 @@ * @format */ -import {Property} from './Property'; import {toCppNamespace, toCppType} from './Converters'; +import {Property} from './Property'; export class Command { domain: string; diff --git a/packages/hermes-inspector-msggen/src/Event.js b/packages/hermes-inspector-msggen/src/Event.js index 10e9ee97422e90..bb9f2c4f5658a5 100644 --- a/packages/hermes-inspector-msggen/src/Event.js +++ b/packages/hermes-inspector-msggen/src/Event.js @@ -8,8 +8,8 @@ * @format */ -import {Property} from './Property'; import {toCppNamespace, toCppType} from './Converters'; +import {Property} from './Property'; export class Event { domain: string; diff --git a/packages/hermes-inspector-msggen/src/HeaderWriter.js b/packages/hermes-inspector-msggen/src/HeaderWriter.js index 49e20c62b33f12..612e44e783a5d8 100644 --- a/packages/hermes-inspector-msggen/src/HeaderWriter.js +++ b/packages/hermes-inspector-msggen/src/HeaderWriter.js @@ -8,14 +8,13 @@ * @format */ -import {Writable} from 'stream'; - +import {Command} from './Command'; +import {toCppNamespace} from './Converters'; +import {Event} from './Event'; import {GeneratedHeader} from './GeneratedHeader'; import {Property} from './Property'; import {PropsType, Type} from './Type'; -import {Command} from './Command'; -import {Event} from './Event'; -import {toCppNamespace} from './Converters'; +import {Writable} from 'stream'; export class HeaderWriter { stream: Writable; diff --git a/packages/hermes-inspector-msggen/src/ImplementationWriter.js b/packages/hermes-inspector-msggen/src/ImplementationWriter.js index 955b8f352bd840..030cee099f05e5 100644 --- a/packages/hermes-inspector-msggen/src/ImplementationWriter.js +++ b/packages/hermes-inspector-msggen/src/ImplementationWriter.js @@ -8,12 +8,11 @@ * @format */ -import {Writable} from 'stream'; - -import {GeneratedHeader} from './GeneratedHeader'; -import {PropsType, Type} from './Type'; import {Command} from './Command'; import {Event} from './Event'; +import {GeneratedHeader} from './GeneratedHeader'; +import {PropsType, Type} from './Type'; +import {Writable} from 'stream'; export class ImplementationWriter { stream: Writable; diff --git a/packages/hermes-inspector-msggen/src/Property.js b/packages/hermes-inspector-msggen/src/Property.js index fdad9bc6f7b306..a673916035755f 100644 --- a/packages/hermes-inspector-msggen/src/Property.js +++ b/packages/hermes-inspector-msggen/src/Property.js @@ -9,10 +9,10 @@ */ import { + type JsTypeString, jsTypeToCppType, toCppNamespace, toCppType, - type JsTypeString, } from './Converters'; export class Property { diff --git a/packages/hermes-inspector-msggen/src/Type.js b/packages/hermes-inspector-msggen/src/Type.js index eef2a4265a8193..9371fbce0f2a3d 100644 --- a/packages/hermes-inspector-msggen/src/Type.js +++ b/packages/hermes-inspector-msggen/src/Type.js @@ -8,8 +8,8 @@ * @format */ -import {Property} from './Property'; import {jsTypeToCppType, toCppNamespace, toCppType} from './Converters'; +import {Property} from './Property'; export class Type { domain: string; diff --git a/packages/hermes-inspector-msggen/src/index.js b/packages/hermes-inspector-msggen/src/index.js index dd6c488f6050f9..761390faca7c07 100644 --- a/packages/hermes-inspector-msggen/src/index.js +++ b/packages/hermes-inspector-msggen/src/index.js @@ -8,24 +8,20 @@ * @format */ -import fs from 'fs'; - -import yargs from 'yargs'; - import {Command} from './Command'; import {Event} from './Event'; import {Graph} from './Graph'; -import {Property} from './Property'; -import {PropsType, Type} from './Type'; - import {HeaderWriter} from './HeaderWriter'; import {ImplementationWriter} from './ImplementationWriter'; +import {Property} from './Property'; +import {PropsType, Type} from './Type'; +import fs from 'fs'; +import yargs from 'yargs'; +const custom = require('../src/custom.json'); // $FlowFixMe[cannot-resolve-module] : this isn't a module, just a JSON file. const standard = require('devtools-protocol/json/js_protocol.json'); -const custom = require('../src/custom.json'); - type Descriptor = {| types: Array, commands: Array, diff --git a/packages/metro-config/.gitignore b/packages/metro-config/.gitignore new file mode 100644 index 00000000000000..40d93a0332c96d --- /dev/null +++ b/packages/metro-config/.gitignore @@ -0,0 +1,5 @@ +# Dependencies +/node_modules + +# Build output +/dist diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index 19ebc522a8cd4c..b96dfb23e2c895 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-config", - "version": "0.73.0", + "version": "0.74.0", "description": "Metro configuration for React Native.", "license": "MIT", "repository": { @@ -18,11 +18,17 @@ "engines": { "node": ">=18" }, - "exports": "./index.js", + "exports": { + ".": "./dist/index.js", + "./package.json": "./package.json" + }, + "files": [ + "dist" + ], "dependencies": { - "@react-native/js-polyfills": "^0.73.0", - "@react-native/metro-babel-transformer": "^0.73.11", - "metro-config": "0.79.1", - "metro-runtime": "0.79.1" + "@react-native/js-polyfills": "0.74.0", + "@react-native/metro-babel-transformer": "0.74.0", + "metro-config": "^0.80.3", + "metro-runtime": "^0.80.3" } } diff --git a/packages/metro-config/index.js b/packages/metro-config/src/index.flow.js similarity index 82% rename from packages/metro-config/index.js rename to packages/metro-config/src/index.flow.js index 2abf2c8757d475..6aad1cb74da228 100644 --- a/packages/metro-config/index.js +++ b/packages/metro-config/src/index.flow.js @@ -4,13 +4,14 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow - * @noformat + * @flow strict-local + * @format + * @oncall react_native */ -/*:: import type {ConfigT} from 'metro-config'; */ +import type {ConfigT} from 'metro-config'; -const {getDefaultConfig: getBaseConfig, mergeConfig} = require('metro-config'); +import {getDefaultConfig as getBaseConfig, mergeConfig} from 'metro-config'; const INTERNAL_CALLSITES_REGEX = new RegExp( [ @@ -36,12 +37,12 @@ const INTERNAL_CALLSITES_REGEX = new RegExp( ].join('|'), ); +export {mergeConfig} from 'metro-config'; + /** * Get the base Metro configuration for a React Native project. */ -function getDefaultConfig( - projectRoot /*: string */ -) /*: ConfigT */ { +export function getDefaultConfig(projectRoot: string): ConfigT { const config = { resolver: { resolverMainFields: ['react-native', 'browser', 'main'], @@ -53,15 +54,16 @@ function getDefaultConfig( getModulesRunBeforeMainModule: () => [ require.resolve('react-native/Libraries/Core/InitializeCore'), ], + // $FlowFixMe[untyped-import] getPolyfills: () => require('@react-native/js-polyfills')(), }, server: { port: Number(process.env.RCT_METRO_PORT) || 8081, }, symbolicator: { - customizeFrame: (frame /*: $ReadOnly<{file: ?string, ...}>*/) => { + customizeFrame: (frame: $ReadOnly<{file: ?string, ...}>) => { const collapse = Boolean( - frame.file && INTERNAL_CALLSITES_REGEX.test(frame.file), + frame.file != null && INTERNAL_CALLSITES_REGEX.test(frame.file), ); return {collapse}; }, @@ -88,10 +90,5 @@ function getDefaultConfig( // Set global hook so that the CLI can detect when this config has been loaded global.__REACT_NATIVE_METRO_CONFIG_LOADED = true; - return mergeConfig( - getBaseConfig.getDefaultValues(projectRoot), - config, - ); + return mergeConfig(getBaseConfig.getDefaultValues(projectRoot), config); } - -module.exports = {getDefaultConfig, mergeConfig}; diff --git a/packages/metro-config/src/index.js b/packages/metro-config/src/index.js new file mode 100644 index 00000000000000..b1cd97b5d4555d --- /dev/null +++ b/packages/metro-config/src/index.js @@ -0,0 +1,20 @@ +/** + * 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 type * from './index.flow'; +*/ + +if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) { + require('../../../scripts/build/babel-register').registerForMonorepo(); +} + +export * from './index.flow'; diff --git a/packages/normalize-color/package.json b/packages/normalize-color/package.json index e431c60b4d363f..c489d39b87bc80 100644 --- a/packages/normalize-color/package.json +++ b/packages/normalize-color/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/normalize-colors", - "version": "0.73.0", + "version": "0.74.1", "description": "Color normalization for React Native.", "license": "MIT", "repository": { @@ -15,8 +15,5 @@ "normalize-colors", "react-native" ], - "bugs": "https://github.com/facebook/react-native/issues", - "engines": { - "node": ">=18" - } + "bugs": "https://github.com/facebook/react-native/issues" } diff --git a/packages/polyfills/package.json b/packages/polyfills/package.json index 432aa57988f00b..cadebf8191e007 100644 --- a/packages/polyfills/package.json +++ b/packages/polyfills/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/js-polyfills", - "version": "0.73.0", + "version": "0.74.0", "description": "Polyfills for React Native.", "license": "MIT", "repository": { diff --git a/packages/react-native-babel-preset/package.json b/packages/react-native-babel-preset/package.json index 2e6dbc5985cf58..74a6f1df7c917d 100644 --- a/packages/react-native-babel-preset/package.json +++ b/packages/react-native-babel-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-preset", - "version": "0.73.16", + "version": "0.74.0", "description": "Babel preset for React Native applications", "main": "src/index.js", "repository": { @@ -18,6 +18,7 @@ "@babel/plugin-proposal-async-generator-functions": "^7.0.0", "@babel/plugin-proposal-class-properties": "^7.18.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", "@babel/plugin-proposal-numeric-separator": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.20.0", @@ -53,7 +54,7 @@ "@babel/plugin-transform-typescript": "^7.5.0", "@babel/plugin-transform-unicode-regex": "^7.0.0", "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "*", + "@react-native/babel-plugin-codegen": "0.74.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, diff --git a/packages/react-native-babel-preset/src/configs/main.js b/packages/react-native-babel-preset/src/configs/main.js index e921b1b15eab13..4a483730e8ab6d 100644 --- a/packages/react-native-babel-preset/src/configs/main.js +++ b/packages/react-native-babel-preset/src/configs/main.js @@ -147,6 +147,18 @@ const getPreset = (src, options) => { {loose: true}, ]); } + if ( + !isHermes && + (isNull || + src.indexOf('??=') !== -1 || + src.indexOf('||=') !== -1 || + src.indexOf('&&=') !== -1) + ) { + extraPlugins.push([ + require('@babel/plugin-proposal-logical-assignment-operators'), + {loose: true}, + ]); + } if (options && options.dev && !options.useTransformReactJSXExperimental) { extraPlugins.push([require('@babel/plugin-transform-react-jsx-source')]); diff --git a/packages/react-native-babel-transformer/package.json b/packages/react-native-babel-transformer/package.json index 884eca256b1cd5..b78d79c643db84 100644 --- a/packages/react-native-babel-transformer/package.json +++ b/packages/react-native-babel-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-babel-transformer", - "version": "0.73.11", + "version": "0.74.0", "description": "Babel transformer for React Native applications.", "main": "src/index.js", "repository": { @@ -16,8 +16,8 @@ "license": "MIT", "dependencies": { "@babel/core": "^7.20.0", - "@react-native/babel-preset": "*", - "hermes-parser": "0.16.0", + "@react-native/babel-preset": "0.74.0", + "hermes-parser": "0.19.1", "nullthrows": "^1.1.1" }, "peerDependencies": { diff --git a/packages/react-native-babel-transformer/src/index.js b/packages/react-native-babel-transformer/src/index.js index 80ed9cafba8559..b82be63b12fe45 100644 --- a/packages/react-native-babel-transformer/src/index.js +++ b/packages/react-native-babel-transformer/src/index.js @@ -24,9 +24,9 @@ import type { */ const {parseSync, transformFromAstSync} = require('@babel/core'); +const makeHMRConfig = require('@react-native/babel-preset/src/configs/hmr'); const crypto = require('crypto'); const fs = require('fs'); -const makeHMRConfig = require('@react-native/babel-preset/src/configs/hmr'); const nullthrows = require('nullthrows'); const path = require('path'); diff --git a/packages/react-native-bots/dangerfile.js b/packages/react-native-bots/dangerfile.js index 55994da24521a5..032a788e421402 100644 --- a/packages/react-native-bots/dangerfile.js +++ b/packages/react-native-bots/dangerfile.js @@ -9,9 +9,12 @@ 'use strict'; +/* eslint-disable lint/sort-imports */ +// The 'danger' package seems to have some side effects that make it unsafe +// to reorder. + const {danger, fail, /*message,*/ warn} = require('danger'); const includes = require('lodash.includes'); -const eslint = require('@seadub/danger-plugin-eslint'); const fetch = require('node-fetch'); const {validate: validateChangelog} = require('@rnx-kit/rn-changelog-generator').default; @@ -99,10 +102,6 @@ if (isMergeRefStable) { }); } -// Ensures that eslint is run from root folder and that it can find .eslintrc -process.chdir('../../'); -eslint.default(); - // Wait for statuses and post a message if there are failures. async function handleStatuses() { const regex = /Test Suites: \d+ failed/; @@ -182,4 +181,4 @@ async function handleStatuses() { } } -handleStatuses(); +// handleStatuses(); diff --git a/packages/react-native-bots/package.json b/packages/react-native-bots/package.json index fa577a5bc23636..1367d4a846473d 100644 --- a/packages/react-native-bots/package.json +++ b/packages/react-native-bots/package.json @@ -15,9 +15,7 @@ }, "devDependencies": { "@rnx-kit/rn-changelog-generator": "^0.4.0", - "@seadub/danger-plugin-eslint": "^3.0.2", "danger": "^11.2.1", - "eslint": "^8.19.0", "lodash.includes": "^4.3.0", "minimatch": "^3.0.5" }, diff --git a/packages/react-native-bots/report-bundle-size.js b/packages/react-native-bots/report-bundle-size.js index 35d1f468c42343..411332cf26dadd 100644 --- a/packages/react-native-bots/report-bundle-size.js +++ b/packages/react-native-bots/report-bundle-size.js @@ -18,12 +18,12 @@ const { GITHUB_SHA, } = process.env; -const fs = require('fs'); const datastore = require('./datastore'); const { createOrUpdateComment, validateEnvironment: validateEnvironmentForMakeComment, } = require('./make-comment'); +const fs = require('fs'); /** * Generates and submits a comment. If this is run on the main or release branch, data is diff --git a/packages/react-native-codegen-typescript-test/package.json b/packages/react-native-codegen-typescript-test/package.json index 24f37ab65cf206..c170d4cedccc8e 100644 --- a/packages/react-native-codegen-typescript-test/package.json +++ b/packages/react-native-codegen-typescript-test/package.json @@ -19,7 +19,7 @@ "prepare": "yarn run build" }, "dependencies": { - "@react-native/codegen": "*" + "@react-native/codegen": "0.74.0" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js index 95806046fae085..1b46fd1b88e410 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js @@ -8,21 +8,22 @@ * @flow strict-local */ +import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type {ImageSource} from 'react-native/Libraries/Image/ImageSource'; +import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type {ColorValue} from 'react-native/Libraries/StyleSheet/StyleSheet'; import type { DimensionValue, EdgeInsetsValue, PointValue, } from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; -import type {ColorValue} from 'react-native/Libraries/StyleSheet/StyleSheet'; -import type {ImageSource} from 'react-native/Libraries/Image/ImageSource'; import type { - Int32, Float, + Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; -import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; + import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/BooleanPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/BooleanPropNativeComponent.js index f42d3ef33b45b3..31d27759683731 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/BooleanPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/BooleanPropNativeComponent.js @@ -8,10 +8,11 @@ * @flow strict-local */ -import type {WithDefault} from 'react-native/Libraries/Types/CodegenTypes'; import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type {WithDefault} from 'react-native/Libraries/Types/CodegenTypes'; + +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/ColorPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/ColorPropNativeComponent.js index a83dd75323a31b..09ad4baeee3644 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/ColorPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/ColorPropNativeComponent.js @@ -8,10 +8,11 @@ * @flow strict-local */ -import type {ColorValue} from 'react-native/Libraries/StyleSheet/StyleSheet'; import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type {ColorValue} from 'react-native/Libraries/StyleSheet/StyleSheet'; + +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/DimensionPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/DimensionPropNativeComponent.js index 5cd34dd81a4ef7..4ca8fc37a2a3ca 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/DimensionPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/DimensionPropNativeComponent.js @@ -8,10 +8,11 @@ * @flow strict-local */ -import type {DimensionValue} from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type {DimensionValue} from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; + +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/EdgeInsetsPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/EdgeInsetsPropNativeComponent.js index 08dba01767c5ef..95a70164755820 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/EdgeInsetsPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/EdgeInsetsPropNativeComponent.js @@ -9,9 +9,10 @@ */ import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; + type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/EnumPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/EnumPropNativeComponent.js index 121435c3054342..d4394e662e2464 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/EnumPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/EnumPropNativeComponent.js @@ -8,10 +8,11 @@ * @flow strict-local */ -import type {WithDefault} from 'react-native/Libraries/Types/CodegenTypes'; import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type {WithDefault} from 'react-native/Libraries/Types/CodegenTypes'; + +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/EventNestedObjectPropsNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/EventNestedObjectPropsNativeComponent.js index 59086b66b855d1..8e0b0fc5d7c146 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/EventNestedObjectPropsNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/EventNestedObjectPropsNativeComponent.js @@ -8,14 +8,15 @@ * @flow strict-local */ +import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; import type { - Int32, BubblingEventHandler, + Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; -import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; + import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; type OnChangeEvent = $ReadOnly<{| location: { diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/EventPropsNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/EventPropsNativeComponent.js index 5b5d4a9cfeec72..4d414adbcebc41 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/EventPropsNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/EventPropsNativeComponent.js @@ -8,16 +8,17 @@ * @flow strict-local */ +import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; import type { - Int32, - Float, BubblingEventHandler, DirectEventHandler, + Float, + Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; -import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; + import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; type OnChangeEvent = $ReadOnly<{| value: boolean, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/FloatPropsNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/FloatPropsNativeComponent.js index db170d5961eeb8..1bd65ccd564d87 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/FloatPropsNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/FloatPropsNativeComponent.js @@ -8,13 +8,14 @@ * @flow strict-local */ +import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; import type { - WithDefault, Float, + WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; -import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; + import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/ImagePropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/ImagePropNativeComponent.js index 77f56799d8c511..8c08d112f70e15 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/ImagePropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/ImagePropNativeComponent.js @@ -8,11 +8,12 @@ * @flow strict-local */ -import type {ImageSource} from 'react-native/Libraries/Image/ImageSource'; import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type {ImageSource} from 'react-native/Libraries/Image/ImageSource'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; + type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/IntegerPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/IntegerPropNativeComponent.js index cbffaa60174317..8f7400a8f0556c 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/IntegerPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/IntegerPropNativeComponent.js @@ -8,13 +8,14 @@ * @flow strict-local */ +import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; import type { - WithDefault, Int32, + WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; -import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; + import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/InterfaceOnlyNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/InterfaceOnlyNativeComponent.js index 4832d0608e72ef..8a5e39ce000a22 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/InterfaceOnlyNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/InterfaceOnlyNativeComponent.js @@ -8,13 +8,14 @@ * @flow strict-local */ +import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; import type { BubblingEventHandler, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; -import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; + import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/MixedPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/MixedPropNativeComponent.js index 41169339f738c3..883ff8a398e1d4 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/MixedPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/MixedPropNativeComponent.js @@ -9,10 +9,11 @@ */ import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; import type {UnsafeMixed} from 'react-native/Libraries/Types/CodegenTypes'; +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; + type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/MultiNativePropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/MultiNativePropNativeComponent.js index 3ff7f1f41041d2..af1b2fb1eba96f 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/MultiNativePropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/MultiNativePropNativeComponent.js @@ -8,12 +8,13 @@ * @flow strict-local */ -import type {PointValue} from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; -import type {ColorValue} from 'react-native/Libraries/StyleSheet/StyleSheet'; -import type {ImageSource} from 'react-native/Libraries/Image/ImageSource'; import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type {ImageSource} from 'react-native/Libraries/Image/ImageSource'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type {ColorValue} from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type {PointValue} from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; + +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/NoPropsNoEventsNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/NoPropsNoEventsNativeComponent.js index a8ba611ce93399..6ac37dda0ce92b 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/NoPropsNoEventsNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/NoPropsNoEventsNativeComponent.js @@ -9,9 +9,10 @@ */ import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; + type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/ObjectPropsNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/ObjectPropsNativeComponent.js index 09c518fc1a46ce..85ad5d590aeecf 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/ObjectPropsNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/ObjectPropsNativeComponent.js @@ -10,15 +10,16 @@ import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; import type {ImageSource} from 'react-native/Libraries/Image/ImageSource'; -import type {PointValue} from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; +import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; import type {ColorValue} from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type {PointValue} from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; import type { - Int32, Float, + Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; + import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; type ObjectArrayPropType = $ReadOnly<{| array: $ReadOnlyArray, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/PointPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/PointPropNativeComponent.js index 7c27ce01958ae5..772e079c032c79 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/PointPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/PointPropNativeComponent.js @@ -8,10 +8,11 @@ * @flow strict-local */ -import type {PointValue} from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type {PointValue} from 'react-native/Libraries/StyleSheet/StyleSheetTypes'; + +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/StringPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/StringPropNativeComponent.js index a34d17dab94c66..3246f622970ee0 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/StringPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/StringPropNativeComponent.js @@ -8,10 +8,11 @@ * @flow strict-local */ -import type {WithDefault} from 'react-native/Libraries/Types/CodegenTypes'; import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes'; -import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type {WithDefault} from 'react-native/Libraries/Types/CodegenTypes'; + +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; type NativeProps = $ReadOnly<{| ...ViewProps, diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeArrayTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeArrayTurboModule.js index 5b7d621a65570b..c132fce4776b77 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeArrayTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeArrayTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type ArrayType = string; diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeBooleanTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeBooleanTurboModule.js index a898b1302883e3..2eeae4e6c537ca 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeBooleanTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeBooleanTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type Boolean = boolean; diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeCallbackTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeCallbackTurboModule.js index 71bb14cf72f823..5bac9222bebbfc 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeCallbackTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeCallbackTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type String = string; diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeEnumTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeEnumTurboModule.js index 1dbeeec74d8ec2..1a24614fecdb85 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeEnumTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeEnumTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type StateType = {| diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNullableTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNullableTurboModule.js index e56e0346ad1d9c..41b524a8681710 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNullableTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNullableTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNumberTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNumberTurboModule.js index e47a31a2d3edeb..ac86df6b053f9a 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNumberTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNumberTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type Number = number; diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeObjectTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeObjectTurboModule.js index e3b2d5df8c5a7f..7dbc21c6c816fd 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeObjectTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeObjectTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type GenericObject = Object; diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeOptionalObjectTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeOptionalObjectTurboModule.js index 692bd52ff73c3c..37d1a5c47cb4cd 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeOptionalObjectTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeOptionalObjectTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativePartialAnnotationTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativePartialAnnotationTurboModule.js index 42b15f68d47c35..3e01c1cc5edbe8 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativePartialAnnotationTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativePartialAnnotationTurboModule.js @@ -11,6 +11,7 @@ 'use strict'; import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type SomeObj = {| diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativePromiseTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativePromiseTurboModule.js index 610b3bab899aba..023524505d6eb6 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativePromiseTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativePromiseTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type String = string; diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModule.js index 12496b4ec75d7b..57871b1035a92a 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModule.js @@ -12,6 +12,7 @@ import type { RootTag, TurboModule, } from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; type Animal = {| diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleArrays.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleArrays.js index d320bd2fb338ba..940cc75fd8c5e0 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleArrays.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleArrays.js @@ -12,6 +12,7 @@ import type { RootTag, TurboModule, } from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; type Animal = {| diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleNullable.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleNullable.js index 2a736f08e9276e..a96b0ae731d8ac 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleNullable.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleNullable.js @@ -12,6 +12,7 @@ import type { RootTag, TurboModule, } from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; type Animal = ?{| diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleNullableAndOptional.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleNullableAndOptional.js index b8981a22ab2deb..fb5b66631f3d2a 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleNullableAndOptional.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleNullableAndOptional.js @@ -12,6 +12,7 @@ import type { RootTag, TurboModule, } from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; type Animal = ?{| diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleOptional.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleOptional.js index d1b56f98938814..820e99a5cad1b5 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleOptional.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeSampleTurboModuleOptional.js @@ -12,6 +12,7 @@ import type { RootTag, TurboModule, } from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; type Animal = {| diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeStringTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeStringTurboModule.js index b78372382b8270..810351eb1aad26 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeStringTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeStringTurboModule.js @@ -9,6 +9,7 @@ */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; + import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type String = string; diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentDescriptorH-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentDescriptorH-test.js index 3e12f2afa956c4..8ddac9a7b8cde2 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentDescriptorH-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentDescriptorH-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GenerateComponentDescriptorH'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; @@ -25,7 +25,13 @@ fixtures.forEach(fixture => { it(`GenerateComponentDescriptorH can generate for '${fixture}'`, () => { const libName = 'RNCodegenModuleFixtures'; const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); - const output = generator.generate(libName, schema); + const output = generator.generate( + libName, + schema, + undefined, + false, + `react/renderer/components/${libName}/`, + ); expect(Object.fromEntries(output)).toMatchSnapshot(); }); }); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentHObjCpp-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentHObjCpp-test.js index 50959ea33a805b..0fefa3b2c9880c 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentHObjCpp-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentHObjCpp-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GenerateComponentHObjCpp'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterCpp-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterCpp-test.js index 177ec1dccb9eb7..62976215b011e9 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterCpp-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterCpp-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GenerateEventEmitterCpp'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; @@ -25,7 +25,13 @@ fixtures.forEach(fixture => { it(`GenerateEventEmitterCpp can generate for '${fixture}'`, () => { const libName = 'RNCodegenModuleFixtures'; const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); - const output = generator.generate(libName, schema); + const output = generator.generate( + libName, + schema, + undefined, + false, + `react/renderer/components/${libName}/`, + ); expect(Object.fromEntries(output)).toMatchSnapshot(); }); }); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterH-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterH-test.js index 962c57ef404160..2be17160bebac3 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterH-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterH-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GenerateEventEmitterH'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsCpp-test.js b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsCpp-test.js index b6d0f5e9792bb0..37af11c17d2eed 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsCpp-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsCpp-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GeneratePropsCpp'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; @@ -25,7 +25,13 @@ fixtures.forEach(fixture => { it(`GeneratePropsCpp can generate for '${fixture}'`, () => { const libName = 'RNCodegenModuleFixtures'; const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); - const output = generator.generate(libName, schema); + const output = generator.generate( + libName, + schema, + '', + false, + `react/renderer/components/${libName}/`, + ); expect(Object.fromEntries(output)).toMatchSnapshot(); }); }); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsH-test.js b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsH-test.js index 6c60a966c3451c..41588ee3c02dbf 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsH-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsH-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GeneratePropsH'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaDelegate-test.js b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaDelegate-test.js index 3a3a2135cb221e..9384ad968ccc7f 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaDelegate-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaDelegate-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GeneratePropsJavaDelegate'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaInterface-test.js b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaInterface-test.js index 14a807fd02b4ef..1cc29a6b7ccb13 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaInterface-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaInterface-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GeneratePropsJavaInterface'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeCpp-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeCpp-test.js index a7a766b1a56b62..6a5f508d901381 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeCpp-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeCpp-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GenerateShadowNodeCpp'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; @@ -24,7 +24,13 @@ fixtures.forEach(fixture => { it(`GenerateShadowNodeCpp can generate for '${fixture}'`, () => { const libName = 'RNCodegenModuleFixtures'; const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); - const output = generator.generate(libName, schema, undefined, false); + const output = generator.generate( + libName, + schema, + '', + false, + `react/renderer/components/${libName}/`, + ); expect(Object.fromEntries(output)).toMatchSnapshot(); }); }); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeH-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeH-test.js index 87cc703a17aabd..543732fad46533 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeH-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeH-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GenerateShadowNodeH'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; @@ -24,7 +24,13 @@ fixtures.forEach(fixture => { it(`GenerateShadowNodeH can generate for '${fixture}'`, () => { const libName = 'RNCodegenModuleFixtures'; const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); - const output = generator.generate(libName, schema, undefined, false); + const output = generator.generate( + libName, + schema, + '', + false, + `react/renderer/components/${libName}/`, + ); expect(Object.fromEntries(output)).toMatchSnapshot(); }); }); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateViewConfigJs-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateViewConfigJs-test.js index 833866e473df09..a5ab0bb741517b 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/GenerateViewConfigJs-test.js +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateViewConfigJs-test.js @@ -11,8 +11,8 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); const generator = require('../../../src/generators/components/GenerateViewConfigJs'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentDescriptorH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentDescriptorH-test.js.snap index 74f0e533357b01..46757e6c95c090 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentDescriptorH-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentDescriptorH-test.js.snap @@ -16,14 +16,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ArrayPropsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -44,14 +46,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using BooleanPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -72,14 +76,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ColorPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -100,14 +106,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using DimensionPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -128,14 +136,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using EdgeInsetsPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -156,14 +166,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using EnumPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -184,14 +196,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using EventNestedObjectPropsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -212,14 +226,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using EventPropsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -240,14 +256,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using FloatPropsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -268,14 +286,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ImagePropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -296,14 +316,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using IntegerPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -324,14 +346,16 @@ Object { #include #include +#include + +namespace facebook::react { -namespace facebook { -namespace react { +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -352,14 +376,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using MixedPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -380,14 +406,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using MultiNativePropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -408,14 +436,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using NoPropsNoEventsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -436,14 +466,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ObjectPropsNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -464,14 +496,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using PointPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -492,14 +526,16 @@ Object { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using StringPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void RNCodegenModuleFixtures_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap index 433dcad81d4097..a53541759bf301 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap @@ -15,11 +15,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -39,11 +37,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -63,11 +59,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -87,11 +81,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -111,11 +103,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -135,11 +125,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -159,8 +147,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { void EventNestedObjectPropsNativeComponentViewEventEmitter::onChange(OnChange $event) const { dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) { @@ -180,8 +167,7 @@ void EventNestedObjectPropsNativeComponentViewEventEmitter::onChange(OnChange $e }); } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -201,11 +187,10 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { void EventPropsNativeComponentViewEventEmitter::onChange(OnChange $event) const { - dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) { + dispatchEvent(\\"paperDirectName\\", [$event=std::move($event)](jsi::Runtime &runtime) { auto $payload = jsi::Object(runtime); $payload.setProperty(runtime, \\"value\\", $event.value); $payload.setProperty(runtime, \\"source\\", $event.source); @@ -226,7 +211,7 @@ void EventPropsNativeComponentViewEventEmitter::onEventDirect(OnEventDirect $eve void EventPropsNativeComponentViewEventEmitter::onEventDirectWithPaperName(OnEventDirectWithPaperName $event) const { - dispatchEvent(\\"eventDirectWithPaperName\\", [$event=std::move($event)](jsi::Runtime &runtime) { + dispatchEvent(\\"paperDirectName\\", [$event=std::move($event)](jsi::Runtime &runtime) { auto $payload = jsi::Object(runtime); $payload.setProperty(runtime, \\"value\\", $event.value); return $payload; @@ -235,7 +220,7 @@ void EventPropsNativeComponentViewEventEmitter::onEventDirectWithPaperName(OnEve void EventPropsNativeComponentViewEventEmitter::onOrientationChange(OnOrientationChange $event) const { - dispatchEvent(\\"orientationChange\\", [$event=std::move($event)](jsi::Runtime &runtime) { + dispatchEvent(\\"paperBubblingName\\", [$event=std::move($event)](jsi::Runtime &runtime) { auto $payload = jsi::Object(runtime); $payload.setProperty(runtime, \\"orientation\\", toString($event.orientation)); return $payload; @@ -253,15 +238,14 @@ void EventPropsNativeComponentViewEventEmitter::onEnd(OnEnd $event) const { void EventPropsNativeComponentViewEventEmitter::onEventBubblingWithPaperName(OnEventBubblingWithPaperName $event) const { - dispatchEvent(\\"eventBubblingWithPaperName\\", [](jsi::Runtime &runtime) { + dispatchEvent(\\"paperBubblingName\\", [](jsi::Runtime &runtime) { auto $payload = jsi::Object(runtime); return $payload; }); } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -281,11 +265,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -305,11 +287,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -329,11 +309,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -353,8 +331,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { void InterfaceOnlyNativeComponentViewEventEmitter::onChange(OnChange $event) const { dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) { @@ -364,8 +341,7 @@ void InterfaceOnlyNativeComponentViewEventEmitter::onChange(OnChange $event) con }); } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -385,11 +361,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -409,11 +383,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -433,11 +405,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -457,11 +427,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -481,11 +449,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -505,11 +471,9 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterH-test.js.snap index 57f16617fe96be..9ae54de91b3069 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterH-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterH-test.js.snap @@ -16,8 +16,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class ArrayPropsNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -25,8 +24,7 @@ class ArrayPropsNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -47,8 +45,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class BooleanPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -56,8 +53,7 @@ class BooleanPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -78,8 +74,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class ColorPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -87,8 +82,7 @@ class ColorPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -109,8 +103,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class DimensionPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -118,8 +111,7 @@ class DimensionPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -140,8 +132,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class EdgeInsetsPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -149,8 +140,7 @@ class EdgeInsetsPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -171,8 +161,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class EnumPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -180,8 +169,7 @@ class EnumPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -202,8 +190,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class EventNestedObjectPropsNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -223,8 +210,7 @@ class EventNestedObjectPropsNativeComponentViewEventEmitter : public ViewEventEm }; void onChange(OnChange value) const; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -245,8 +231,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class EventPropsNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -301,8 +286,7 @@ class EventPropsNativeComponentViewEventEmitter : public ViewEventEmitter { void onEventBubblingWithPaperName(OnEventBubblingWithPaperName value) const; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -323,8 +307,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class FloatPropsNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -332,8 +315,7 @@ class FloatPropsNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -354,8 +336,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class ImagePropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -363,8 +344,7 @@ class ImagePropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -385,8 +365,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class IntegerPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -394,8 +373,7 @@ class IntegerPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -416,8 +394,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class InterfaceOnlyNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -427,8 +404,7 @@ class InterfaceOnlyNativeComponentViewEventEmitter : public ViewEventEmitter { }; void onChange(OnChange value) const; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -449,8 +425,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class MixedPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -458,8 +433,7 @@ class MixedPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -480,8 +454,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class MultiNativePropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -489,8 +462,7 @@ class MultiNativePropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -511,8 +483,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class NoPropsNoEventsNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -520,8 +491,7 @@ class NoPropsNoEventsNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -542,8 +512,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class ObjectPropsNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -551,8 +520,7 @@ class ObjectPropsNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -573,8 +541,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class PointPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -582,8 +549,7 @@ class PointPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -604,8 +570,7 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { class StringPropNativeComponentViewEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -613,8 +578,7 @@ class StringPropNativeComponentViewEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap index bcb7abfc4404e6..84ae14b514f519 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap @@ -18,8 +18,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ArrayPropsNativeComponentViewProps::ArrayPropsNativeComponentViewProps( const PropsParserContext &context, @@ -40,8 +39,7 @@ ArrayPropsNativeComponentViewProps::ArrayPropsNativeComponentViewProps( arrayOfObjects(convertRawProp(context, rawProps, \\"arrayOfObjects\\", sourceProps.arrayOfObjects, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -62,8 +60,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { BooleanPropNativeComponentViewProps::BooleanPropNativeComponentViewProps( const PropsParserContext &context, @@ -74,8 +71,7 @@ BooleanPropNativeComponentViewProps::BooleanPropNativeComponentViewProps( disabledNullable(convertRawProp(context, rawProps, \\"disabledNullable\\", sourceProps.disabledNullable, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -96,8 +92,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ColorPropNativeComponentViewProps::ColorPropNativeComponentViewProps( const PropsParserContext &context, @@ -107,8 +102,7 @@ ColorPropNativeComponentViewProps::ColorPropNativeComponentViewProps( tintColor(convertRawProp(context, rawProps, \\"tintColor\\", sourceProps.tintColor, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -130,8 +124,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { DimensionPropNativeComponentViewProps::DimensionPropNativeComponentViewProps( const PropsParserContext &context, @@ -141,8 +134,7 @@ DimensionPropNativeComponentViewProps::DimensionPropNativeComponentViewProps( marginBack(convertRawProp(context, rawProps, \\"marginBack\\", sourceProps.marginBack, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -163,8 +155,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { EdgeInsetsPropNativeComponentViewProps::EdgeInsetsPropNativeComponentViewProps( const PropsParserContext &context, @@ -174,8 +165,7 @@ EdgeInsetsPropNativeComponentViewProps::EdgeInsetsPropNativeComponentViewProps( {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -196,8 +186,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { EnumPropNativeComponentViewProps::EnumPropNativeComponentViewProps( const PropsParserContext &context, @@ -208,8 +197,7 @@ EnumPropNativeComponentViewProps::EnumPropNativeComponentViewProps( intervals(convertRawProp(context, rawProps, \\"intervals\\", sourceProps.intervals, {EnumPropNativeComponentViewIntervals::Intervals0})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -230,8 +218,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { EventNestedObjectPropsNativeComponentViewProps::EventNestedObjectPropsNativeComponentViewProps( const PropsParserContext &context, @@ -241,8 +228,7 @@ EventNestedObjectPropsNativeComponentViewProps::EventNestedObjectPropsNativeComp disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -263,8 +249,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { EventPropsNativeComponentViewProps::EventPropsNativeComponentViewProps( const PropsParserContext &context, @@ -274,8 +259,7 @@ EventPropsNativeComponentViewProps::EventPropsNativeComponentViewProps( disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -296,8 +280,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { FloatPropsNativeComponentViewProps::FloatPropsNativeComponentViewProps( const PropsParserContext &context, @@ -313,8 +296,7 @@ FloatPropsNativeComponentViewProps::FloatPropsNativeComponentViewProps( blurRadiusNullable(convertRawProp(context, rawProps, \\"blurRadiusNullable\\", sourceProps.blurRadiusNullable, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -336,8 +318,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ImagePropNativeComponentViewProps::ImagePropNativeComponentViewProps( const PropsParserContext &context, @@ -347,8 +328,7 @@ ImagePropNativeComponentViewProps::ImagePropNativeComponentViewProps( thumbImage(convertRawProp(context, rawProps, \\"thumbImage\\", sourceProps.thumbImage, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -369,8 +349,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { IntegerPropNativeComponentViewProps::IntegerPropNativeComponentViewProps( const PropsParserContext &context, @@ -382,8 +361,7 @@ IntegerPropNativeComponentViewProps::IntegerPropNativeComponentViewProps( progress3(convertRawProp(context, rawProps, \\"progress3\\", sourceProps.progress3, {10})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -404,8 +382,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { InterfaceOnlyNativeComponentViewProps::InterfaceOnlyNativeComponentViewProps( const PropsParserContext &context, @@ -415,8 +392,7 @@ InterfaceOnlyNativeComponentViewProps::InterfaceOnlyNativeComponentViewProps( title(convertRawProp(context, rawProps, \\"title\\", sourceProps.title, {\\"\\"})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -438,8 +414,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { MixedPropNativeComponentViewProps::MixedPropNativeComponentViewProps( const PropsParserContext &context, @@ -449,8 +424,7 @@ MixedPropNativeComponentViewProps::MixedPropNativeComponentViewProps( mixedProp(convertRawProp(context, rawProps, \\"mixedProp\\", sourceProps.mixedProp, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -472,8 +446,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { MultiNativePropNativeComponentViewProps::MultiNativePropNativeComponentViewProps( const PropsParserContext &context, @@ -486,8 +459,7 @@ MultiNativePropNativeComponentViewProps::MultiNativePropNativeComponentViewProps point(convertRawProp(context, rawProps, \\"point\\", sourceProps.point, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -508,8 +480,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { NoPropsNoEventsNativeComponentViewProps::NoPropsNoEventsNativeComponentViewProps( const PropsParserContext &context, @@ -519,8 +490,7 @@ NoPropsNoEventsNativeComponentViewProps::NoPropsNoEventsNativeComponentViewProps {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -542,8 +512,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ObjectPropsNativeComponentProps::ObjectPropsNativeComponentProps( const PropsParserContext &context, @@ -555,8 +524,7 @@ ObjectPropsNativeComponentProps::ObjectPropsNativeComponentProps( objectPrimitiveRequiredProp(convertRawProp(context, rawProps, \\"objectPrimitiveRequiredProp\\", sourceProps.objectPrimitiveRequiredProp, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -577,8 +545,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { PointPropNativeComponentViewProps::PointPropNativeComponentViewProps( const PropsParserContext &context, @@ -588,8 +555,7 @@ PointPropNativeComponentViewProps::PointPropNativeComponentViewProps( startPoint(convertRawProp(context, rawProps, \\"startPoint\\", sourceProps.startPoint, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -610,8 +576,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { StringPropNativeComponentViewProps::StringPropNativeComponentViewProps( const PropsParserContext &context, @@ -622,8 +587,7 @@ StringPropNativeComponentViewProps::StringPropNativeComponentViewProps( defaultValue(convertRawProp(context, rawProps, \\"defaultValue\\", sourceProps.defaultValue, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap index 83866b74863dfb..aaf1c130eafba2 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap @@ -24,8 +24,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { using ArrayPropsNativeComponentViewSizesMask = uint32_t; @@ -161,8 +160,7 @@ class ArrayPropsNativeComponentViewProps final : public ViewProps { std::vector arrayOfObjects{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -183,8 +181,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class BooleanPropNativeComponentViewProps final : public ViewProps { public: @@ -197,8 +194,7 @@ class BooleanPropNativeComponentViewProps final : public ViewProps { bool disabledNullable{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -220,8 +216,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class ColorPropNativeComponentViewProps final : public ViewProps { public: @@ -233,8 +228,7 @@ class ColorPropNativeComponentViewProps final : public ViewProps { SharedColor tintColor{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -256,8 +250,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class DimensionPropNativeComponentViewProps final : public ViewProps { public: @@ -269,8 +262,7 @@ class DimensionPropNativeComponentViewProps final : public ViewProps { YGValue marginBack{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -291,8 +283,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class EdgeInsetsPropNativeComponentViewProps final : public ViewProps { public: @@ -304,8 +295,7 @@ class EdgeInsetsPropNativeComponentViewProps final : public ViewProps { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -326,8 +316,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { enum class EnumPropNativeComponentViewAlignment { Top, Center, BottomRight }; @@ -388,8 +377,7 @@ class EnumPropNativeComponentViewProps final : public ViewProps { EnumPropNativeComponentViewIntervals intervals{EnumPropNativeComponentViewIntervals::Intervals0}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -410,8 +398,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class EventNestedObjectPropsNativeComponentViewProps final : public ViewProps { public: @@ -423,8 +410,7 @@ class EventNestedObjectPropsNativeComponentViewProps final : public ViewProps { bool disabled{false}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -445,8 +431,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class EventPropsNativeComponentViewProps final : public ViewProps { public: @@ -458,8 +443,7 @@ class EventPropsNativeComponentViewProps final : public ViewProps { bool disabled{false}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -480,8 +464,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class FloatPropsNativeComponentViewProps final : public ViewProps { public: @@ -499,8 +482,7 @@ class FloatPropsNativeComponentViewProps final : public ViewProps { Float blurRadiusNullable{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -522,8 +504,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class ImagePropNativeComponentViewProps final : public ViewProps { public: @@ -535,8 +516,7 @@ class ImagePropNativeComponentViewProps final : public ViewProps { ImageSource thumbImage{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -557,8 +537,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class IntegerPropNativeComponentViewProps final : public ViewProps { public: @@ -572,8 +551,7 @@ class IntegerPropNativeComponentViewProps final : public ViewProps { int progress3{10}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -594,8 +572,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class InterfaceOnlyNativeComponentViewProps final : public ViewProps { public: @@ -607,8 +584,7 @@ class InterfaceOnlyNativeComponentViewProps final : public ViewProps { std::string title{\\"\\"}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -629,8 +605,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class MixedPropNativeComponentViewProps final : public ViewProps { public: @@ -642,8 +617,7 @@ class MixedPropNativeComponentViewProps final : public ViewProps { folly::dynamic mixedProp{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -667,8 +641,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class MultiNativePropNativeComponentViewProps final : public ViewProps { public: @@ -683,8 +656,7 @@ class MultiNativePropNativeComponentViewProps final : public ViewProps { Point point{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -705,8 +677,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class NoPropsNoEventsNativeComponentViewProps final : public ViewProps { public: @@ -718,8 +689,7 @@ class NoPropsNoEventsNativeComponentViewProps final : public ViewProps { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -746,8 +716,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { enum class ObjectPropsNativeComponentStringEnumProp { Small, Large }; @@ -883,8 +852,7 @@ class ObjectPropsNativeComponentProps final : public ViewProps { ObjectPropsNativeComponentObjectPrimitiveRequiredPropStruct objectPrimitiveRequiredProp{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -906,8 +874,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class PointPropNativeComponentViewProps final : public ViewProps { public: @@ -919,8 +886,7 @@ class PointPropNativeComponentViewProps final : public ViewProps { Point startPoint{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -941,8 +907,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class StringPropNativeComponentViewProps final : public ViewProps { public: @@ -955,8 +920,7 @@ class StringPropNativeComponentViewProps final : public ViewProps { std::string defaultValue{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeCpp-test.js.snap index 224a02cc2ca754..71b984b27fe467 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeCpp-test.js.snap @@ -14,13 +14,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ArrayPropsNativeComponentViewComponentName[] = \\"ArrayPropsNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -39,13 +37,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char BooleanPropNativeComponentViewComponentName[] = \\"BooleanPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -64,13 +60,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ColorPropNativeComponentViewComponentName[] = \\"ColorPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -89,13 +83,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char DimensionPropNativeComponentViewComponentName[] = \\"DimensionPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -114,13 +106,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char EdgeInsetsPropNativeComponentViewComponentName[] = \\"EdgeInsetsPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -139,13 +129,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char EnumPropNativeComponentViewComponentName[] = \\"EnumPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -164,13 +152,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char EventNestedObjectPropsNativeComponentViewComponentName[] = \\"EventNestedObjectPropsNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -189,13 +175,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char EventPropsNativeComponentViewComponentName[] = \\"EventPropsNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -214,13 +198,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char FloatPropsNativeComponentViewComponentName[] = \\"FloatPropsNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -239,13 +221,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ImagePropNativeComponentViewComponentName[] = \\"ImagePropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -264,13 +244,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char IntegerPropNativeComponentViewComponentName[] = \\"IntegerPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -289,13 +267,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -314,13 +290,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char MixedPropNativeComponentViewComponentName[] = \\"MixedPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -339,13 +313,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char MultiNativePropNativeComponentViewComponentName[] = \\"MultiNativePropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -364,13 +336,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char NoPropsNoEventsNativeComponentViewComponentName[] = \\"NoPropsNoEventsNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -389,13 +359,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ObjectPropsNativeComponentComponentName[] = \\"ObjectPropsNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -414,13 +382,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char PointPropNativeComponentViewComponentName[] = \\"PointPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -439,13 +405,11 @@ Object { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char StringPropNativeComponentViewComponentName[] = \\"StringPropNativeComponentView\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeH-test.js.snap index d4d33cc34ad983..0d9839e13568ea 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeH-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeH-test.js.snap @@ -20,8 +20,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ArrayPropsNativeComponentViewComponentName[]; @@ -34,8 +33,7 @@ using ArrayPropsNativeComponentViewShadowNode = ConcreteViewShadowNode< ArrayPropsNativeComponentViewEventEmitter, ArrayPropsNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -60,8 +58,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char BooleanPropNativeComponentViewComponentName[]; @@ -74,8 +71,7 @@ using BooleanPropNativeComponentViewShadowNode = ConcreteViewShadowNode< BooleanPropNativeComponentViewEventEmitter, BooleanPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -100,8 +96,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ColorPropNativeComponentViewComponentName[]; @@ -114,8 +109,7 @@ using ColorPropNativeComponentViewShadowNode = ConcreteViewShadowNode< ColorPropNativeComponentViewEventEmitter, ColorPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -140,8 +134,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char DimensionPropNativeComponentViewComponentName[]; @@ -154,8 +147,7 @@ using DimensionPropNativeComponentViewShadowNode = ConcreteViewShadowNode< DimensionPropNativeComponentViewEventEmitter, DimensionPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -180,8 +172,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char EdgeInsetsPropNativeComponentViewComponentName[]; @@ -194,8 +185,7 @@ using EdgeInsetsPropNativeComponentViewShadowNode = ConcreteViewShadowNode< EdgeInsetsPropNativeComponentViewEventEmitter, EdgeInsetsPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -220,8 +210,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char EnumPropNativeComponentViewComponentName[]; @@ -234,8 +223,7 @@ using EnumPropNativeComponentViewShadowNode = ConcreteViewShadowNode< EnumPropNativeComponentViewEventEmitter, EnumPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -260,8 +248,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char EventNestedObjectPropsNativeComponentViewComponentName[]; @@ -274,8 +261,7 @@ using EventNestedObjectPropsNativeComponentViewShadowNode = ConcreteViewShadowNo EventNestedObjectPropsNativeComponentViewEventEmitter, EventNestedObjectPropsNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -300,8 +286,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char EventPropsNativeComponentViewComponentName[]; @@ -314,8 +299,7 @@ using EventPropsNativeComponentViewShadowNode = ConcreteViewShadowNode< EventPropsNativeComponentViewEventEmitter, EventPropsNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -340,8 +324,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char FloatPropsNativeComponentViewComponentName[]; @@ -354,8 +337,7 @@ using FloatPropsNativeComponentViewShadowNode = ConcreteViewShadowNode< FloatPropsNativeComponentViewEventEmitter, FloatPropsNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -380,8 +362,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ImagePropNativeComponentViewComponentName[]; @@ -394,8 +375,7 @@ using ImagePropNativeComponentViewShadowNode = ConcreteViewShadowNode< ImagePropNativeComponentViewEventEmitter, ImagePropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -420,8 +400,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char IntegerPropNativeComponentViewComponentName[]; @@ -434,8 +413,7 @@ using IntegerPropNativeComponentViewShadowNode = ConcreteViewShadowNode< IntegerPropNativeComponentViewEventEmitter, IntegerPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -460,13 +438,11 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -491,8 +467,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char MixedPropNativeComponentViewComponentName[]; @@ -505,8 +480,7 @@ using MixedPropNativeComponentViewShadowNode = ConcreteViewShadowNode< MixedPropNativeComponentViewEventEmitter, MixedPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -531,8 +505,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char MultiNativePropNativeComponentViewComponentName[]; @@ -545,8 +518,7 @@ using MultiNativePropNativeComponentViewShadowNode = ConcreteViewShadowNode< MultiNativePropNativeComponentViewEventEmitter, MultiNativePropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -571,8 +543,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char NoPropsNoEventsNativeComponentViewComponentName[]; @@ -585,8 +556,7 @@ using NoPropsNoEventsNativeComponentViewShadowNode = ConcreteViewShadowNode< NoPropsNoEventsNativeComponentViewEventEmitter, NoPropsNoEventsNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -611,8 +581,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ObjectPropsNativeComponentComponentName[]; @@ -625,8 +594,7 @@ using ObjectPropsNativeComponentShadowNode = ConcreteViewShadowNode< ObjectPropsNativeComponentEventEmitter, ObjectPropsNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -651,8 +619,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char PointPropNativeComponentViewComponentName[]; @@ -665,8 +632,7 @@ using PointPropNativeComponentViewShadowNode = ConcreteViewShadowNode< PointPropNativeComponentViewEventEmitter, PointPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -691,8 +657,7 @@ Object { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char StringPropNativeComponentViewComponentName[]; @@ -705,8 +670,7 @@ using StringPropNativeComponentViewShadowNode = ConcreteViewShadowNode< StringPropNativeComponentViewEventEmitter, StringPropNativeComponentViewState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap index fcfb25d973f431..d74bb73cc85ea4 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -294,7 +294,7 @@ export const __INTERNAL_VIEW_CONFIG = { uiViewClassName: 'EventPropsNativeComponentView', bubblingEventTypes: { - paperDirectName: { + topPaperDirectName: { phasedRegistrationNames: { captured: 'onChangeCapture', bubbled: 'onChange', @@ -308,7 +308,7 @@ export const __INTERNAL_VIEW_CONFIG = { }, }, - paperBubblingName: { + topPaperBubblingName: { phasedRegistrationNames: { captured: 'onEventBubblingWithPaperNameCapture', bubbled: 'onEventBubblingWithPaperName', @@ -321,11 +321,11 @@ export const __INTERNAL_VIEW_CONFIG = { registrationName: 'onEventDirect', }, - paperDirectName: { + topPaperDirectName: { registrationName: 'onEventDirectWithPaperName', }, - paperBubblingName: { + topPaperBubblingName: { registrationName: 'onOrientationChange', }, }, diff --git a/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleCpp-test.js b/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleCpp-test.js index 662a8fd0ddb3db..b105c40966a68e 100644 --- a/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleCpp-test.js +++ b/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleCpp-test.js @@ -11,12 +11,12 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); +import type {SchemaType} from '../../../src/CodegenSchema'; + const generator = require('../../../src/generators/modules/GenerateModuleCpp'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); -import type {SchemaType} from '../../../src/CodegenSchema'; - const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/modules`; const parser = new FlowParser(); diff --git a/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleH-test.js b/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleH-test.js index 51b6c8e37b6769..ae9364936ecd78 100644 --- a/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleH-test.js +++ b/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleH-test.js @@ -11,12 +11,12 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); +import type {SchemaType} from '../../../src/CodegenSchema'; + const generator = require('../../../src/generators/modules/GenerateModuleH'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); -import type {SchemaType} from '../../../src/CodegenSchema'; - const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/modules`; const parser = new FlowParser(); diff --git a/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleObjCpp-test.js b/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleObjCpp-test.js index 9e043428607389..607afcf771bf2b 100644 --- a/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleObjCpp-test.js +++ b/packages/react-native-codegen/e2e/__tests__/modules/GenerateModuleObjCpp-test.js @@ -11,12 +11,12 @@ 'use strict'; -const {FlowParser} = require('../../../src/parsers/flow/parser'); +import type {SchemaType} from '../../../src/CodegenSchema'; + const generator = require('../../../src/generators/modules/GenerateModuleObjCpp'); +const {FlowParser} = require('../../../src/parsers/flow/parser'); const fs = require('fs'); -import type {SchemaType} from '../../../src/CodegenSchema'; - const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/modules`; const parser = new FlowParser(); diff --git a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleCpp-test.js.snap index 34993ada7eac21..21946d6459940c 100644 --- a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleCpp-test.js.snap @@ -12,8 +12,7 @@ exports[`GenerateModuleCpp can generate a header file NativeModule specs with as #include \\"RNCodegenModuleFixturesJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static jsi::Value __hostFunction_NativeArrayTurboModuleCxxSpecJSI_getArray(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->getArray( @@ -818,8 +817,7 @@ NativeStringTurboModuleCxxSpecJSI::NativeStringTurboModuleCxxSpecJSI(std::shared } -} // namespace react -} // namespace facebook +} // namespace facebook::react " `; @@ -835,8 +833,7 @@ exports[`GenerateModuleCpp can generate an implementation file NativeModule spec #include \\"RNCodegenModuleFixturesJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static jsi::Value __hostFunction_NativeArrayTurboModuleCxxSpecJSI_getArray(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->getArray( @@ -1641,7 +1638,6 @@ NativeStringTurboModuleCxxSpecJSI::NativeStringTurboModuleCxxSpecJSI(std::shared } -} // namespace react -} // namespace facebook +} // namespace facebook::react " `; diff --git a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap index fb9a915712a977..5473654dc10cf0 100644 --- a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap @@ -15,8 +15,7 @@ exports[`GenerateModuleH can generate a header file NativeModule specs 1`] = ` #include #include -namespace facebook { -namespace react { +namespace facebook::react { class JSI_EXPORT NativeArrayTurboModuleCxxSpecJSI : public TurboModule { @@ -42,7 +41,7 @@ public: protected: NativeArrayTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeArrayTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeArrayTurboModuleCxxSpecJSI { @@ -105,7 +104,7 @@ public: protected: NativeBooleanTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeBooleanTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeBooleanTurboModuleCxxSpecJSI { @@ -160,7 +159,7 @@ public: protected: NativeCallbackTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeCallbackTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeCallbackTurboModuleCxxSpecJSI { @@ -195,7 +194,7 @@ private: #pragma mark - NativeEnumTurboModuleStatusRegularEnum -enum NativeEnumTurboModuleStatusRegularEnum { Active, Paused, Off }; +enum class NativeEnumTurboModuleStatusRegularEnum { Active, Paused, Off }; template <> struct Bridging { @@ -227,7 +226,7 @@ struct Bridging { #pragma mark - NativeEnumTurboModuleStatusStrEnum -enum NativeEnumTurboModuleStatusStrEnum { Active, Paused, Off }; +enum class NativeEnumTurboModuleStatusStrEnum { Active, Paused, Off }; template <> struct Bridging { @@ -259,7 +258,7 @@ struct Bridging { #pragma mark - NativeEnumTurboModuleStatusNumEnum -enum NativeEnumTurboModuleStatusNumEnum { Active, Paused, Off }; +enum class NativeEnumTurboModuleStatusNumEnum { Active, Paused, Off }; template <> struct Bridging { @@ -291,7 +290,7 @@ struct Bridging { #pragma mark - NativeEnumTurboModuleStatusFractionEnum -enum NativeEnumTurboModuleStatusFractionEnum { Active, Paused, Off }; +enum class NativeEnumTurboModuleStatusFractionEnum { Active, Paused, Off }; template <> struct Bridging { @@ -324,7 +323,7 @@ struct Bridging { #pragma mark - NativeEnumTurboModuleBaseStateType template -struct NativeEnumTurboModuleBaseStateType { +struct [[deprecated(\\"Use NativeEnumTurboModuleStateType instead.\\")]] NativeEnumTurboModuleBaseStateType { P0 state; bool operator==(const NativeEnumTurboModuleBaseStateType &other) const { return state == other.state; @@ -332,7 +331,7 @@ struct NativeEnumTurboModuleBaseStateType { }; template -struct NativeEnumTurboModuleBaseStateTypeBridging { +struct [[deprecated(\\"Use NativeEnumTurboModuleStateTypeBridging instead.\\")]] NativeEnumTurboModuleBaseStateTypeBridging { static NativeEnumTurboModuleBaseStateType fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -363,7 +362,7 @@ struct NativeEnumTurboModuleBaseStateTypeBridging { #pragma mark - NativeEnumTurboModuleBaseStateTypeWithEnums template -struct NativeEnumTurboModuleBaseStateTypeWithEnums { +struct [[deprecated(\\"Use NativeEnumTurboModuleStateTypeWithEnums instead.\\")]] NativeEnumTurboModuleBaseStateTypeWithEnums { P0 state; P1 regular; P2 str; @@ -375,7 +374,7 @@ struct NativeEnumTurboModuleBaseStateTypeWithEnums { }; template -struct NativeEnumTurboModuleBaseStateTypeWithEnumsBridging { +struct [[deprecated(\\"Use NativeEnumTurboModuleStateTypeWithEnumsBridging instead.\\")]] NativeEnumTurboModuleBaseStateTypeWithEnumsBridging { static NativeEnumTurboModuleBaseStateTypeWithEnums fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -402,11 +401,11 @@ struct NativeEnumTurboModuleBaseStateTypeWithEnumsBridging { return bridging::toJs(rt, value); } - static int numToJs(jsi::Runtime &rt, P3 value) { + static jsi::Value numToJs(jsi::Runtime &rt, P3 value) { return bridging::toJs(rt, value); } - static double fractionToJs(jsi::Runtime &rt, P4 value) { + static jsi::Value fractionToJs(jsi::Runtime &rt, P4 value) { return bridging::toJs(rt, value); } #endif @@ -425,6 +424,115 @@ struct NativeEnumTurboModuleBaseStateTypeWithEnumsBridging { } }; + +#pragma mark - NativeEnumTurboModuleStateType + +template +struct NativeEnumTurboModuleStateType { + P0 state; + bool operator==(const NativeEnumTurboModuleStateType &other) const { + return state == other.state; + } +}; + +template +struct NativeEnumTurboModuleStateTypeBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"state\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String stateToJs(jsi::Runtime &rt, decltype(types.state) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"state\\", bridging::toJs(rt, value.state, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeEnumTurboModuleStateTypeWithEnums + +template +struct NativeEnumTurboModuleStateTypeWithEnums { + P0 state; + P1 regular; + P2 str; + P3 num; + P4 fraction; + bool operator==(const NativeEnumTurboModuleStateTypeWithEnums &other) const { + return state == other.state && regular == other.regular && str == other.str && num == other.num && fraction == other.fraction; + } +}; + +template +struct NativeEnumTurboModuleStateTypeWithEnumsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"state\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"regular\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"str\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"num\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"fraction\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String stateToJs(jsi::Runtime &rt, decltype(types.state) value) { + return bridging::toJs(rt, value); + } + + static jsi::String regularToJs(jsi::Runtime &rt, decltype(types.regular) value) { + return bridging::toJs(rt, value); + } + + static jsi::String strToJs(jsi::Runtime &rt, decltype(types.str) value) { + return bridging::toJs(rt, value); + } + + static jsi::Value numToJs(jsi::Runtime &rt, decltype(types.num) value) { + return bridging::toJs(rt, value); + } + + static jsi::Value fractionToJs(jsi::Runtime &rt, decltype(types.fraction) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"state\\", bridging::toJs(rt, value.state, jsInvoker)); + result.setProperty(rt, \\"regular\\", bridging::toJs(rt, value.regular, jsInvoker)); + result.setProperty(rt, \\"str\\", bridging::toJs(rt, value.str, jsInvoker)); + result.setProperty(rt, \\"num\\", bridging::toJs(rt, value.num, jsInvoker)); + result.setProperty(rt, \\"fraction\\", bridging::toJs(rt, value.fraction, jsInvoker)); + return result; + } +}; + class JSI_EXPORT NativeEnumTurboModuleCxxSpecJSI : public TurboModule { protected: NativeEnumTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); @@ -432,9 +540,9 @@ protected: public: virtual jsi::String getStatusRegular(jsi::Runtime &rt, jsi::Object statusProp) = 0; virtual jsi::String getStatusStr(jsi::Runtime &rt, jsi::Object statusProp) = 0; - virtual int getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) = 0; - virtual double getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) = 0; - virtual jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, int c, double d) = 0; + virtual jsi::Value getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) = 0; + virtual jsi::Value getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) = 0; + virtual jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c, jsi::Value d) = 0; virtual jsi::Object getStateTypeWithEnums(jsi::Runtime &rt, jsi::Object paramOfTypeWithEnums) = 0; }; @@ -451,7 +559,7 @@ public: protected: NativeEnumTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeEnumTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeEnumTurboModuleCxxSpecJSI { @@ -475,23 +583,23 @@ private: return bridging::callFromJs( rt, &T::getStatusStr, jsInvoker_, instance_, std::move(statusProp)); } - int getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) override { + jsi::Value getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) override { static_assert( bridging::getParameterCount(&T::getStatusNum) == 2, \\"Expected getStatusNum(...) to have 2 parameters\\"); - return bridging::callFromJs( + return bridging::callFromJs( rt, &T::getStatusNum, jsInvoker_, instance_, std::move(statusProp)); } - double getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) override { + jsi::Value getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) override { static_assert( bridging::getParameterCount(&T::getStatusFraction) == 2, \\"Expected getStatusFraction(...) to have 2 parameters\\"); - return bridging::callFromJs( + return bridging::callFromJs( rt, &T::getStatusFraction, jsInvoker_, instance_, std::move(statusProp)); } - jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, int c, double d) override { + jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c, jsi::Value d) override { static_assert( bridging::getParameterCount(&T::getStateType) == 5, \\"Expected getStateType(...) to have 5 parameters\\"); @@ -542,7 +650,7 @@ public: protected: NativeNullableTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeNullableTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeNullableTurboModuleCxxSpecJSI { @@ -629,7 +737,7 @@ public: protected: NativeNumberTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeNumberTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeNumberTurboModuleCxxSpecJSI { @@ -687,7 +795,7 @@ public: protected: NativeObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeObjectTurboModuleCxxSpecJSI { @@ -765,7 +873,7 @@ public: protected: NativeOptionalObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeOptionalObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeOptionalObjectTurboModuleCxxSpecJSI { @@ -794,7 +902,7 @@ private: #pragma mark - NativePartialAnnotationTurboModuleBaseSomeObj template -struct NativePartialAnnotationTurboModuleBaseSomeObj { +struct [[deprecated(\\"Use NativePartialAnnotationTurboModuleSomeObj instead.\\")]] NativePartialAnnotationTurboModuleBaseSomeObj { P0 a; P1 b; bool operator==(const NativePartialAnnotationTurboModuleBaseSomeObj &other) const { @@ -803,7 +911,7 @@ struct NativePartialAnnotationTurboModuleBaseSomeObj { }; template -struct NativePartialAnnotationTurboModuleBaseSomeObjBridging { +struct [[deprecated(\\"Use NativePartialAnnotationTurboModuleSomeObjBridging instead.\\")]] NativePartialAnnotationTurboModuleBaseSomeObjBridging { static NativePartialAnnotationTurboModuleBaseSomeObj fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -837,6 +945,55 @@ struct NativePartialAnnotationTurboModuleBaseSomeObjBridging { } }; + +#pragma mark - NativePartialAnnotationTurboModuleSomeObj + +template +struct NativePartialAnnotationTurboModuleSomeObj { + P0 a; + P1 b; + bool operator==(const NativePartialAnnotationTurboModuleSomeObj &other) const { + return a == other.a && b == other.b; + } +}; + +template +struct NativePartialAnnotationTurboModuleSomeObjBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"a\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"b\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String aToJs(jsi::Runtime &rt, decltype(types.a) value) { + return bridging::toJs(rt, value); + } + + static bool bToJs(jsi::Runtime &rt, decltype(types.b) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"a\\", bridging::toJs(rt, value.a, jsInvoker)); + if (value.b) { + result.setProperty(rt, \\"b\\", bridging::toJs(rt, value.b.value(), jsInvoker)); + } + return result; + } +}; + class JSI_EXPORT NativePartialAnnotationTurboModuleCxxSpecJSI : public TurboModule { protected: NativePartialAnnotationTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); @@ -861,7 +1018,7 @@ public: protected: NativePartialAnnotationTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePartialAnnotationTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativePartialAnnotationTurboModuleCxxSpecJSI { @@ -932,7 +1089,7 @@ public: protected: NativePromiseTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePromiseTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativePromiseTurboModuleCxxSpecJSI { @@ -969,7 +1126,7 @@ private: #pragma mark - SampleTurboModuleBaseAnimal template -struct SampleTurboModuleBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleAnimal instead.\\")]] SampleTurboModuleBaseAnimal { P0 name; bool operator==(const SampleTurboModuleBaseAnimal &other) const { return name == other.name; @@ -977,7 +1134,7 @@ struct SampleTurboModuleBaseAnimal { }; template -struct SampleTurboModuleBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleAnimalBridging instead.\\")]] SampleTurboModuleBaseAnimalBridging { static SampleTurboModuleBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -1003,6 +1160,46 @@ struct SampleTurboModuleBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleAnimal + +template +struct SampleTurboModuleAnimal { + P0 name; + bool operator==(const SampleTurboModuleAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name, jsInvoker)); + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); @@ -1036,7 +1233,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -1161,7 +1358,7 @@ private: #pragma mark - SampleTurboModuleArraysBaseAnimal template -struct SampleTurboModuleArraysBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleArraysAnimal instead.\\")]] SampleTurboModuleArraysBaseAnimal { P0 name; bool operator==(const SampleTurboModuleArraysBaseAnimal &other) const { return name == other.name; @@ -1169,7 +1366,7 @@ struct SampleTurboModuleArraysBaseAnimal { }; template -struct SampleTurboModuleArraysBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleArraysAnimalBridging instead.\\")]] SampleTurboModuleArraysBaseAnimalBridging { static SampleTurboModuleArraysBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -1195,6 +1392,46 @@ struct SampleTurboModuleArraysBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleArraysAnimal + +template +struct SampleTurboModuleArraysAnimal { + P0 name; + bool operator==(const SampleTurboModuleArraysAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleArraysAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name, jsInvoker)); + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleArraysCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleArraysCxxSpecJSI(std::shared_ptr jsInvoker); @@ -1228,7 +1465,7 @@ public: protected: NativeSampleTurboModuleArraysCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleArraysCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleArraysCxxSpecJSI { @@ -1353,7 +1590,7 @@ private: #pragma mark - SampleTurboModuleNullableBaseAnimal template -struct SampleTurboModuleNullableBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleNullableAnimal instead.\\")]] SampleTurboModuleNullableBaseAnimal { P0 name; bool operator==(const SampleTurboModuleNullableBaseAnimal &other) const { return name == other.name; @@ -1361,7 +1598,7 @@ struct SampleTurboModuleNullableBaseAnimal { }; template -struct SampleTurboModuleNullableBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleNullableAnimalBridging instead.\\")]] SampleTurboModuleNullableBaseAnimalBridging { static SampleTurboModuleNullableBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -1387,6 +1624,46 @@ struct SampleTurboModuleNullableBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleNullableAnimal + +template +struct SampleTurboModuleNullableAnimal { + P0 name; + bool operator==(const SampleTurboModuleNullableAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleNullableAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static std::optional nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name, jsInvoker)); + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleNullableCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleNullableCxxSpecJSI(std::shared_ptr jsInvoker); @@ -1420,7 +1697,7 @@ public: protected: NativeSampleTurboModuleNullableCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleNullableCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleNullableCxxSpecJSI { @@ -1545,7 +1822,7 @@ private: #pragma mark - SampleTurboModuleNullableAndOptionalBaseAnimal template -struct SampleTurboModuleNullableAndOptionalBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleNullableAndOptionalAnimal instead.\\")]] SampleTurboModuleNullableAndOptionalBaseAnimal { P0 name; bool operator==(const SampleTurboModuleNullableAndOptionalBaseAnimal &other) const { return name == other.name; @@ -1553,7 +1830,7 @@ struct SampleTurboModuleNullableAndOptionalBaseAnimal { }; template -struct SampleTurboModuleNullableAndOptionalBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleNullableAndOptionalAnimalBridging instead.\\")]] SampleTurboModuleNullableAndOptionalBaseAnimalBridging { static SampleTurboModuleNullableAndOptionalBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -1581,6 +1858,48 @@ struct SampleTurboModuleNullableAndOptionalBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleNullableAndOptionalAnimal + +template +struct SampleTurboModuleNullableAndOptionalAnimal { + P0 name; + bool operator==(const SampleTurboModuleNullableAndOptionalAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleNullableAndOptionalAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static std::optional nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.name) { + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name.value(), jsInvoker)); + } + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleNullableAndOptionalCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleNullableAndOptionalCxxSpecJSI(std::shared_ptr jsInvoker); @@ -1614,7 +1933,7 @@ public: protected: NativeSampleTurboModuleNullableAndOptionalCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleNullableAndOptionalCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleNullableAndOptionalCxxSpecJSI { @@ -1739,7 +2058,7 @@ private: #pragma mark - SampleTurboModuleOptionalBaseAnimal template -struct SampleTurboModuleOptionalBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleOptionalAnimal instead.\\")]] SampleTurboModuleOptionalBaseAnimal { P0 name; bool operator==(const SampleTurboModuleOptionalBaseAnimal &other) const { return name == other.name; @@ -1747,7 +2066,7 @@ struct SampleTurboModuleOptionalBaseAnimal { }; template -struct SampleTurboModuleOptionalBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleOptionalAnimalBridging instead.\\")]] SampleTurboModuleOptionalBaseAnimalBridging { static SampleTurboModuleOptionalBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -1775,6 +2094,48 @@ struct SampleTurboModuleOptionalBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleOptionalAnimal + +template +struct SampleTurboModuleOptionalAnimal { + P0 name; + bool operator==(const SampleTurboModuleOptionalAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleOptionalAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.name) { + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name.value(), jsInvoker)); + } + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleOptionalCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleOptionalCxxSpecJSI(std::shared_ptr jsInvoker); @@ -1808,7 +2169,7 @@ public: protected: NativeSampleTurboModuleOptionalCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleOptionalCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleOptionalCxxSpecJSI { @@ -1951,7 +2312,7 @@ public: protected: NativeStringTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeStringTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeStringTurboModuleCxxSpecJSI { @@ -1983,8 +2344,7 @@ private: Delegate delegate_; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react " `; @@ -2003,8 +2363,7 @@ exports[`GenerateModuleH can generate a header file NativeModule specs with assu #include #include -namespace facebook { -namespace react { +namespace facebook::react { class JSI_EXPORT NativeArrayTurboModuleCxxSpecJSI : public TurboModule { @@ -2030,7 +2389,7 @@ public: protected: NativeArrayTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeArrayTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeArrayTurboModuleCxxSpecJSI { @@ -2093,7 +2452,7 @@ public: protected: NativeBooleanTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeBooleanTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeBooleanTurboModuleCxxSpecJSI { @@ -2148,7 +2507,7 @@ public: protected: NativeCallbackTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeCallbackTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeCallbackTurboModuleCxxSpecJSI { @@ -2183,7 +2542,7 @@ private: #pragma mark - NativeEnumTurboModuleStatusRegularEnum -enum NativeEnumTurboModuleStatusRegularEnum { Active, Paused, Off }; +enum class NativeEnumTurboModuleStatusRegularEnum { Active, Paused, Off }; template <> struct Bridging { @@ -2215,7 +2574,7 @@ struct Bridging { #pragma mark - NativeEnumTurboModuleStatusStrEnum -enum NativeEnumTurboModuleStatusStrEnum { Active, Paused, Off }; +enum class NativeEnumTurboModuleStatusStrEnum { Active, Paused, Off }; template <> struct Bridging { @@ -2247,7 +2606,7 @@ struct Bridging { #pragma mark - NativeEnumTurboModuleStatusNumEnum -enum NativeEnumTurboModuleStatusNumEnum { Active, Paused, Off }; +enum class NativeEnumTurboModuleStatusNumEnum { Active, Paused, Off }; template <> struct Bridging { @@ -2279,7 +2638,7 @@ struct Bridging { #pragma mark - NativeEnumTurboModuleStatusFractionEnum -enum NativeEnumTurboModuleStatusFractionEnum { Active, Paused, Off }; +enum class NativeEnumTurboModuleStatusFractionEnum { Active, Paused, Off }; template <> struct Bridging { @@ -2296,49 +2655,156 @@ struct Bridging { } } - static jsi::Value toJs(jsi::Runtime &rt, NativeEnumTurboModuleStatusFractionEnum value) { - if (value == NativeEnumTurboModuleStatusFractionEnum::Active) { - return bridging::toJs(rt, 0.2f); - } else if (value == NativeEnumTurboModuleStatusFractionEnum::Paused) { - return bridging::toJs(rt, 0.1f); - } else if (value == NativeEnumTurboModuleStatusFractionEnum::Off) { - return bridging::toJs(rt, 0f); - } else { - throw jsi::JSError(rt, \\"No appropriate enum member found for enum value\\"); - } + static jsi::Value toJs(jsi::Runtime &rt, NativeEnumTurboModuleStatusFractionEnum value) { + if (value == NativeEnumTurboModuleStatusFractionEnum::Active) { + return bridging::toJs(rt, 0.2f); + } else if (value == NativeEnumTurboModuleStatusFractionEnum::Paused) { + return bridging::toJs(rt, 0.1f); + } else if (value == NativeEnumTurboModuleStatusFractionEnum::Off) { + return bridging::toJs(rt, 0f); + } else { + throw jsi::JSError(rt, \\"No appropriate enum member found for enum value\\"); + } + } +}; + +#pragma mark - NativeEnumTurboModuleBaseStateType + +template +struct [[deprecated(\\"Use NativeEnumTurboModuleStateType instead.\\")]] NativeEnumTurboModuleBaseStateType { + P0 state; + bool operator==(const NativeEnumTurboModuleBaseStateType &other) const { + return state == other.state; + } +}; + +template +struct [[deprecated(\\"Use NativeEnumTurboModuleStateTypeBridging instead.\\")]] NativeEnumTurboModuleBaseStateTypeBridging { + static NativeEnumTurboModuleBaseStateType fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + NativeEnumTurboModuleBaseStateType result{ + bridging::fromJs(rt, value.getProperty(rt, \\"state\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String stateToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const NativeEnumTurboModuleBaseStateType &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"state\\", bridging::toJs(rt, value.state, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeEnumTurboModuleBaseStateTypeWithEnums + +template +struct [[deprecated(\\"Use NativeEnumTurboModuleStateTypeWithEnums instead.\\")]] NativeEnumTurboModuleBaseStateTypeWithEnums { + P0 state; + P1 regular; + P2 str; + P3 num; + P4 fraction; + bool operator==(const NativeEnumTurboModuleBaseStateTypeWithEnums &other) const { + return state == other.state && regular == other.regular && str == other.str && num == other.num && fraction == other.fraction; + } +}; + +template +struct [[deprecated(\\"Use NativeEnumTurboModuleStateTypeWithEnumsBridging instead.\\")]] NativeEnumTurboModuleBaseStateTypeWithEnumsBridging { + static NativeEnumTurboModuleBaseStateTypeWithEnums fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + NativeEnumTurboModuleBaseStateTypeWithEnums result{ + bridging::fromJs(rt, value.getProperty(rt, \\"state\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"regular\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"str\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"num\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"fraction\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String stateToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } + + static jsi::String regularToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } + + static jsi::String strToJs(jsi::Runtime &rt, P2 value) { + return bridging::toJs(rt, value); + } + + static jsi::Value numToJs(jsi::Runtime &rt, P3 value) { + return bridging::toJs(rt, value); + } + + static jsi::Value fractionToJs(jsi::Runtime &rt, P4 value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const NativeEnumTurboModuleBaseStateTypeWithEnums &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"state\\", bridging::toJs(rt, value.state, jsInvoker)); + result.setProperty(rt, \\"regular\\", bridging::toJs(rt, value.regular, jsInvoker)); + result.setProperty(rt, \\"str\\", bridging::toJs(rt, value.str, jsInvoker)); + result.setProperty(rt, \\"num\\", bridging::toJs(rt, value.num, jsInvoker)); + result.setProperty(rt, \\"fraction\\", bridging::toJs(rt, value.fraction, jsInvoker)); + return result; } }; - -#pragma mark - NativeEnumTurboModuleBaseStateType + + +#pragma mark - NativeEnumTurboModuleStateType template -struct NativeEnumTurboModuleBaseStateType { +struct NativeEnumTurboModuleStateType { P0 state; - bool operator==(const NativeEnumTurboModuleBaseStateType &other) const { + bool operator==(const NativeEnumTurboModuleStateType &other) const { return state == other.state; } }; -template -struct NativeEnumTurboModuleBaseStateTypeBridging { - static NativeEnumTurboModuleBaseStateType fromJs( +template +struct NativeEnumTurboModuleStateTypeBridging { + static T types; + + static T fromJs( jsi::Runtime &rt, const jsi::Object &value, const std::shared_ptr &jsInvoker) { - NativeEnumTurboModuleBaseStateType result{ - bridging::fromJs(rt, value.getProperty(rt, \\"state\\"), jsInvoker)}; + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"state\\"), jsInvoker)}; return result; } #ifdef DEBUG - static jsi::String stateToJs(jsi::Runtime &rt, P0 value) { + static jsi::String stateToJs(jsi::Runtime &rt, decltype(types.state) value) { return bridging::toJs(rt, value); } #endif static jsi::Object toJs( jsi::Runtime &rt, - const NativeEnumTurboModuleBaseStateType &value, + const T &value, const std::shared_ptr &jsInvoker) { auto result = facebook::jsi::Object(rt); result.setProperty(rt, \\"state\\", bridging::toJs(rt, value.state, jsInvoker)); @@ -2348,60 +2814,62 @@ struct NativeEnumTurboModuleBaseStateTypeBridging { -#pragma mark - NativeEnumTurboModuleBaseStateTypeWithEnums +#pragma mark - NativeEnumTurboModuleStateTypeWithEnums template -struct NativeEnumTurboModuleBaseStateTypeWithEnums { +struct NativeEnumTurboModuleStateTypeWithEnums { P0 state; P1 regular; P2 str; P3 num; P4 fraction; - bool operator==(const NativeEnumTurboModuleBaseStateTypeWithEnums &other) const { + bool operator==(const NativeEnumTurboModuleStateTypeWithEnums &other) const { return state == other.state && regular == other.regular && str == other.str && num == other.num && fraction == other.fraction; } }; -template -struct NativeEnumTurboModuleBaseStateTypeWithEnumsBridging { - static NativeEnumTurboModuleBaseStateTypeWithEnums fromJs( +template +struct NativeEnumTurboModuleStateTypeWithEnumsBridging { + static T types; + + static T fromJs( jsi::Runtime &rt, const jsi::Object &value, const std::shared_ptr &jsInvoker) { - NativeEnumTurboModuleBaseStateTypeWithEnums result{ - bridging::fromJs(rt, value.getProperty(rt, \\"state\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"regular\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"str\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"num\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"fraction\\"), jsInvoker)}; + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"state\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"regular\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"str\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"num\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"fraction\\"), jsInvoker)}; return result; } #ifdef DEBUG - static jsi::String stateToJs(jsi::Runtime &rt, P0 value) { + static jsi::String stateToJs(jsi::Runtime &rt, decltype(types.state) value) { return bridging::toJs(rt, value); } - static jsi::String regularToJs(jsi::Runtime &rt, P1 value) { + static jsi::String regularToJs(jsi::Runtime &rt, decltype(types.regular) value) { return bridging::toJs(rt, value); } - static jsi::String strToJs(jsi::Runtime &rt, P2 value) { + static jsi::String strToJs(jsi::Runtime &rt, decltype(types.str) value) { return bridging::toJs(rt, value); } - static int numToJs(jsi::Runtime &rt, P3 value) { + static jsi::Value numToJs(jsi::Runtime &rt, decltype(types.num) value) { return bridging::toJs(rt, value); } - static double fractionToJs(jsi::Runtime &rt, P4 value) { + static jsi::Value fractionToJs(jsi::Runtime &rt, decltype(types.fraction) value) { return bridging::toJs(rt, value); } #endif static jsi::Object toJs( jsi::Runtime &rt, - const NativeEnumTurboModuleBaseStateTypeWithEnums &value, + const T &value, const std::shared_ptr &jsInvoker) { auto result = facebook::jsi::Object(rt); result.setProperty(rt, \\"state\\", bridging::toJs(rt, value.state, jsInvoker)); @@ -2420,9 +2888,9 @@ protected: public: virtual jsi::String getStatusRegular(jsi::Runtime &rt, jsi::Object statusProp) = 0; virtual jsi::String getStatusStr(jsi::Runtime &rt, jsi::Object statusProp) = 0; - virtual int getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) = 0; - virtual double getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) = 0; - virtual jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, int c, double d) = 0; + virtual jsi::Value getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) = 0; + virtual jsi::Value getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) = 0; + virtual jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c, jsi::Value d) = 0; virtual jsi::Object getStateTypeWithEnums(jsi::Runtime &rt, jsi::Object paramOfTypeWithEnums) = 0; }; @@ -2439,7 +2907,7 @@ public: protected: NativeEnumTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeEnumTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeEnumTurboModuleCxxSpecJSI { @@ -2463,23 +2931,23 @@ private: return bridging::callFromJs( rt, &T::getStatusStr, jsInvoker_, instance_, std::move(statusProp)); } - int getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) override { + jsi::Value getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) override { static_assert( bridging::getParameterCount(&T::getStatusNum) == 2, \\"Expected getStatusNum(...) to have 2 parameters\\"); - return bridging::callFromJs( + return bridging::callFromJs( rt, &T::getStatusNum, jsInvoker_, instance_, std::move(statusProp)); } - double getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) override { + jsi::Value getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) override { static_assert( bridging::getParameterCount(&T::getStatusFraction) == 2, \\"Expected getStatusFraction(...) to have 2 parameters\\"); - return bridging::callFromJs( + return bridging::callFromJs( rt, &T::getStatusFraction, jsInvoker_, instance_, std::move(statusProp)); } - jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, int c, double d) override { + jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c, jsi::Value d) override { static_assert( bridging::getParameterCount(&T::getStateType) == 5, \\"Expected getStateType(...) to have 5 parameters\\"); @@ -2530,7 +2998,7 @@ public: protected: NativeNullableTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeNullableTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeNullableTurboModuleCxxSpecJSI { @@ -2617,7 +3085,7 @@ public: protected: NativeNumberTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeNumberTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeNumberTurboModuleCxxSpecJSI { @@ -2675,7 +3143,7 @@ public: protected: NativeObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeObjectTurboModuleCxxSpecJSI { @@ -2753,7 +3221,7 @@ public: protected: NativeOptionalObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeOptionalObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeOptionalObjectTurboModuleCxxSpecJSI { @@ -2782,7 +3250,7 @@ private: #pragma mark - NativePartialAnnotationTurboModuleBaseSomeObj template -struct NativePartialAnnotationTurboModuleBaseSomeObj { +struct [[deprecated(\\"Use NativePartialAnnotationTurboModuleSomeObj instead.\\")]] NativePartialAnnotationTurboModuleBaseSomeObj { P0 a; P1 b; bool operator==(const NativePartialAnnotationTurboModuleBaseSomeObj &other) const { @@ -2791,7 +3259,7 @@ struct NativePartialAnnotationTurboModuleBaseSomeObj { }; template -struct NativePartialAnnotationTurboModuleBaseSomeObjBridging { +struct [[deprecated(\\"Use NativePartialAnnotationTurboModuleSomeObjBridging instead.\\")]] NativePartialAnnotationTurboModuleBaseSomeObjBridging { static NativePartialAnnotationTurboModuleBaseSomeObj fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -2825,6 +3293,55 @@ struct NativePartialAnnotationTurboModuleBaseSomeObjBridging { } }; + +#pragma mark - NativePartialAnnotationTurboModuleSomeObj + +template +struct NativePartialAnnotationTurboModuleSomeObj { + P0 a; + P1 b; + bool operator==(const NativePartialAnnotationTurboModuleSomeObj &other) const { + return a == other.a && b == other.b; + } +}; + +template +struct NativePartialAnnotationTurboModuleSomeObjBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"a\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"b\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String aToJs(jsi::Runtime &rt, decltype(types.a) value) { + return bridging::toJs(rt, value); + } + + static bool bToJs(jsi::Runtime &rt, decltype(types.b) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"a\\", bridging::toJs(rt, value.a, jsInvoker)); + if (value.b) { + result.setProperty(rt, \\"b\\", bridging::toJs(rt, value.b.value(), jsInvoker)); + } + return result; + } +}; + class JSI_EXPORT NativePartialAnnotationTurboModuleCxxSpecJSI : public TurboModule { protected: NativePartialAnnotationTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); @@ -2849,7 +3366,7 @@ public: protected: NativePartialAnnotationTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePartialAnnotationTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativePartialAnnotationTurboModuleCxxSpecJSI { @@ -2920,7 +3437,7 @@ public: protected: NativePromiseTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePromiseTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativePromiseTurboModuleCxxSpecJSI { @@ -2957,7 +3474,7 @@ private: #pragma mark - SampleTurboModuleBaseAnimal template -struct SampleTurboModuleBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleAnimal instead.\\")]] SampleTurboModuleBaseAnimal { P0 name; bool operator==(const SampleTurboModuleBaseAnimal &other) const { return name == other.name; @@ -2965,7 +3482,7 @@ struct SampleTurboModuleBaseAnimal { }; template -struct SampleTurboModuleBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleAnimalBridging instead.\\")]] SampleTurboModuleBaseAnimalBridging { static SampleTurboModuleBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -2991,6 +3508,46 @@ struct SampleTurboModuleBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleAnimal + +template +struct SampleTurboModuleAnimal { + P0 name; + bool operator==(const SampleTurboModuleAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name, jsInvoker)); + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); @@ -3024,7 +3581,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -3149,7 +3706,7 @@ private: #pragma mark - SampleTurboModuleArraysBaseAnimal template -struct SampleTurboModuleArraysBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleArraysAnimal instead.\\")]] SampleTurboModuleArraysBaseAnimal { P0 name; bool operator==(const SampleTurboModuleArraysBaseAnimal &other) const { return name == other.name; @@ -3157,7 +3714,7 @@ struct SampleTurboModuleArraysBaseAnimal { }; template -struct SampleTurboModuleArraysBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleArraysAnimalBridging instead.\\")]] SampleTurboModuleArraysBaseAnimalBridging { static SampleTurboModuleArraysBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -3183,6 +3740,46 @@ struct SampleTurboModuleArraysBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleArraysAnimal + +template +struct SampleTurboModuleArraysAnimal { + P0 name; + bool operator==(const SampleTurboModuleArraysAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleArraysAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name, jsInvoker)); + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleArraysCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleArraysCxxSpecJSI(std::shared_ptr jsInvoker); @@ -3216,7 +3813,7 @@ public: protected: NativeSampleTurboModuleArraysCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleArraysCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleArraysCxxSpecJSI { @@ -3341,7 +3938,7 @@ private: #pragma mark - SampleTurboModuleNullableBaseAnimal template -struct SampleTurboModuleNullableBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleNullableAnimal instead.\\")]] SampleTurboModuleNullableBaseAnimal { P0 name; bool operator==(const SampleTurboModuleNullableBaseAnimal &other) const { return name == other.name; @@ -3349,7 +3946,7 @@ struct SampleTurboModuleNullableBaseAnimal { }; template -struct SampleTurboModuleNullableBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleNullableAnimalBridging instead.\\")]] SampleTurboModuleNullableBaseAnimalBridging { static SampleTurboModuleNullableBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -3375,6 +3972,46 @@ struct SampleTurboModuleNullableBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleNullableAnimal + +template +struct SampleTurboModuleNullableAnimal { + P0 name; + bool operator==(const SampleTurboModuleNullableAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleNullableAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static std::optional nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name, jsInvoker)); + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleNullableCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleNullableCxxSpecJSI(std::shared_ptr jsInvoker); @@ -3408,7 +4045,7 @@ public: protected: NativeSampleTurboModuleNullableCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleNullableCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleNullableCxxSpecJSI { @@ -3533,7 +4170,7 @@ private: #pragma mark - SampleTurboModuleNullableAndOptionalBaseAnimal template -struct SampleTurboModuleNullableAndOptionalBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleNullableAndOptionalAnimal instead.\\")]] SampleTurboModuleNullableAndOptionalBaseAnimal { P0 name; bool operator==(const SampleTurboModuleNullableAndOptionalBaseAnimal &other) const { return name == other.name; @@ -3541,7 +4178,7 @@ struct SampleTurboModuleNullableAndOptionalBaseAnimal { }; template -struct SampleTurboModuleNullableAndOptionalBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleNullableAndOptionalAnimalBridging instead.\\")]] SampleTurboModuleNullableAndOptionalBaseAnimalBridging { static SampleTurboModuleNullableAndOptionalBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -3569,6 +4206,48 @@ struct SampleTurboModuleNullableAndOptionalBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleNullableAndOptionalAnimal + +template +struct SampleTurboModuleNullableAndOptionalAnimal { + P0 name; + bool operator==(const SampleTurboModuleNullableAndOptionalAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleNullableAndOptionalAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static std::optional nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.name) { + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name.value(), jsInvoker)); + } + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleNullableAndOptionalCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleNullableAndOptionalCxxSpecJSI(std::shared_ptr jsInvoker); @@ -3602,7 +4281,7 @@ public: protected: NativeSampleTurboModuleNullableAndOptionalCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleNullableAndOptionalCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleNullableAndOptionalCxxSpecJSI { @@ -3727,7 +4406,7 @@ private: #pragma mark - SampleTurboModuleOptionalBaseAnimal template -struct SampleTurboModuleOptionalBaseAnimal { +struct [[deprecated(\\"Use SampleTurboModuleOptionalAnimal instead.\\")]] SampleTurboModuleOptionalBaseAnimal { P0 name; bool operator==(const SampleTurboModuleOptionalBaseAnimal &other) const { return name == other.name; @@ -3735,7 +4414,7 @@ struct SampleTurboModuleOptionalBaseAnimal { }; template -struct SampleTurboModuleOptionalBaseAnimalBridging { +struct [[deprecated(\\"Use SampleTurboModuleOptionalAnimalBridging instead.\\")]] SampleTurboModuleOptionalBaseAnimalBridging { static SampleTurboModuleOptionalBaseAnimal fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -3763,6 +4442,48 @@ struct SampleTurboModuleOptionalBaseAnimalBridging { } }; + +#pragma mark - SampleTurboModuleOptionalAnimal + +template +struct SampleTurboModuleOptionalAnimal { + P0 name; + bool operator==(const SampleTurboModuleOptionalAnimal &other) const { + return name == other.name; + } +}; + +template +struct SampleTurboModuleOptionalAnimalBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.name) { + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name.value(), jsInvoker)); + } + return result; + } +}; + class JSI_EXPORT NativeSampleTurboModuleOptionalCxxSpecJSI : public TurboModule { protected: NativeSampleTurboModuleOptionalCxxSpecJSI(std::shared_ptr jsInvoker); @@ -3796,7 +4517,7 @@ public: protected: NativeSampleTurboModuleOptionalCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleOptionalCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleOptionalCxxSpecJSI { @@ -3939,7 +4660,7 @@ public: protected: NativeStringTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeStringTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeStringTurboModuleCxxSpecJSI { @@ -3971,7 +4692,6 @@ private: Delegate delegate_; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react " `; diff --git a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleObjCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleObjCpp-test.js.snap index a1238aa502e17b..a59e8e0a1d0a11 100644 --- a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleObjCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleObjCpp-test.js.snap @@ -37,17 +37,15 @@ exports[`GenerateModuleObjCpp can generate a header file NativeModule specs 1`] b:(NSArray *)b; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeArrayTurboModule' - */ - class JSI_EXPORT NativeArrayTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeArrayTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeArrayTurboModule' + */ + class JSI_EXPORT NativeArrayTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeArrayTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeBooleanTurboModuleSpec @@ -55,17 +53,15 @@ namespace facebook { - (NSNumber *)getBooleanWithAlias:(BOOL)arg; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeBooleanTurboModule' - */ - class JSI_EXPORT NativeBooleanTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeBooleanTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeBooleanTurboModule' + */ + class JSI_EXPORT NativeBooleanTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeBooleanTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeCallbackTurboModuleSpec @@ -73,17 +69,15 @@ namespace facebook { - (void)getValueWithCallbackWithAlias:(RCTResponseSenderBlock)c; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeCallbackTurboModule' - */ - class JSI_EXPORT NativeCallbackTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeCallbackTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeCallbackTurboModule' + */ + class JSI_EXPORT NativeCallbackTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeCallbackTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeEnumTurboModule { struct StateType { @@ -131,17 +125,15 @@ namespace JS { - (NSDictionary *)getStateTypeWithEnums:(JS::NativeEnumTurboModule::StateTypeWithEnums &)paramOfTypeWithEnums; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeEnumTurboModule' - */ - class JSI_EXPORT NativeEnumTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeEnumTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeEnumTurboModule' + */ + class JSI_EXPORT NativeEnumTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeEnumTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeNullableTurboModuleSpec @@ -154,17 +146,15 @@ namespace facebook { reject:(RCTPromiseRejectBlock)reject; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeNullableTurboModule' - */ - class JSI_EXPORT NativeNullableTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeNullableTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeNullableTurboModule' + */ + class JSI_EXPORT NativeNullableTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeNullableTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeNumberTurboModuleSpec @@ -172,17 +162,15 @@ namespace facebook { - (NSNumber *)getNumberWithAlias:(double)arg; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeNumberTurboModule' - */ - class JSI_EXPORT NativeNumberTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeNumberTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeNumberTurboModule' + */ + class JSI_EXPORT NativeNumberTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeNumberTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeObjectTurboModule { struct SpecDifficultObjectAE { @@ -343,17 +331,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeObjectTurboModule' - */ - class JSI_EXPORT NativeObjectTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeObjectTurboModule' + */ + class JSI_EXPORT NativeObjectTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeOptionalObjectTurboModule { struct ConstantsEEE { @@ -448,7 +434,7 @@ namespace JS { struct Builder { struct Input { std::optional D; - id _Nullable A; + id _Nullable A; std::optional E; NSString *F; }; @@ -477,17 +463,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeOptionalObjectTurboModule' - */ - class JSI_EXPORT NativeOptionalObjectTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeOptionalObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeOptionalObjectTurboModule' + */ + class JSI_EXPORT NativeOptionalObjectTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeOptionalObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativePartialAnnotationTurboModule { struct SpecGetSomeObjFromPartialSomeObjValue { @@ -545,17 +529,15 @@ namespace JS { value2:(JS::NativePartialAnnotationTurboModule::SpecGetPartialPartialValue2 &)value2; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativePartialAnnotationTurboModule' - */ - class JSI_EXPORT NativePartialAnnotationTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativePartialAnnotationTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativePartialAnnotationTurboModule' + */ + class JSI_EXPORT NativePartialAnnotationTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativePartialAnnotationTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativePromiseTurboModuleSpec @@ -567,17 +549,15 @@ namespace facebook { reject:(RCTPromiseRejectBlock)reject; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativePromiseTurboModule' - */ - class JSI_EXPORT NativePromiseTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativePromiseTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativePromiseTurboModule' + */ + class JSI_EXPORT NativePromiseTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativePromiseTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModule { struct SpecGetObjectShapeArg { @@ -659,17 +639,15 @@ getValuegetValuegetValuegetValuegetValuey:(NSString *)getValuegetValuegetValuege - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModule' - */ - class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModule' + */ + class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModuleArrays { struct ConstantsIdElement { @@ -749,17 +727,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModuleArrays' - */ - class JSI_EXPORT NativeSampleTurboModuleArraysSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleArraysSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModuleArrays' + */ + class JSI_EXPORT NativeSampleTurboModuleArraysSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleArraysSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModuleNullable { struct SpecGetObjectShapeArg { @@ -841,17 +817,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModuleNullable' - */ - class JSI_EXPORT NativeSampleTurboModuleNullableSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleNullableSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModuleNullable' + */ + class JSI_EXPORT NativeSampleTurboModuleNullableSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleNullableSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModuleNullableAndOptional { struct SpecGetObjectShapeArg { @@ -933,17 +907,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModuleNullableAndOptional' - */ - class JSI_EXPORT NativeSampleTurboModuleNullableAndOptionalSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleNullableAndOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModuleNullableAndOptional' + */ + class JSI_EXPORT NativeSampleTurboModuleNullableAndOptionalSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleNullableAndOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModuleOptional { struct SpecGetObjectShapeArg { @@ -1025,17 +997,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModuleOptional' - */ - class JSI_EXPORT NativeSampleTurboModuleOptionalSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModuleOptional' + */ + class JSI_EXPORT NativeSampleTurboModuleOptionalSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeStringTurboModuleSpec @@ -1043,17 +1013,15 @@ namespace facebook { - (NSString *)getStringWithAlias:(NSString *)arg; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeStringTurboModule' - */ - class JSI_EXPORT NativeStringTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeStringTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeStringTurboModule' + */ + class JSI_EXPORT NativeStringTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeStringTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @@ -1415,17 +1383,15 @@ NS_ASSUME_NONNULL_BEGIN b:(NSArray *)b; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeArrayTurboModule' - */ - class JSI_EXPORT NativeArrayTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeArrayTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeArrayTurboModule' + */ + class JSI_EXPORT NativeArrayTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeArrayTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeBooleanTurboModuleSpec @@ -1433,17 +1399,15 @@ namespace facebook { - (NSNumber *)getBooleanWithAlias:(BOOL)arg; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeBooleanTurboModule' - */ - class JSI_EXPORT NativeBooleanTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeBooleanTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeBooleanTurboModule' + */ + class JSI_EXPORT NativeBooleanTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeBooleanTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeCallbackTurboModuleSpec @@ -1451,17 +1415,15 @@ namespace facebook { - (void)getValueWithCallbackWithAlias:(RCTResponseSenderBlock)c; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeCallbackTurboModule' - */ - class JSI_EXPORT NativeCallbackTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeCallbackTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeCallbackTurboModule' + */ + class JSI_EXPORT NativeCallbackTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeCallbackTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeEnumTurboModule { struct StateType { @@ -1509,17 +1471,15 @@ namespace JS { - (NSDictionary *)getStateTypeWithEnums:(JS::NativeEnumTurboModule::StateTypeWithEnums &)paramOfTypeWithEnums; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeEnumTurboModule' - */ - class JSI_EXPORT NativeEnumTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeEnumTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeEnumTurboModule' + */ + class JSI_EXPORT NativeEnumTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeEnumTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeNullableTurboModuleSpec @@ -1532,17 +1492,15 @@ namespace facebook { reject:(RCTPromiseRejectBlock)reject; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeNullableTurboModule' - */ - class JSI_EXPORT NativeNullableTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeNullableTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeNullableTurboModule' + */ + class JSI_EXPORT NativeNullableTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeNullableTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeNumberTurboModuleSpec @@ -1550,17 +1508,15 @@ namespace facebook { - (NSNumber *)getNumberWithAlias:(double)arg; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeNumberTurboModule' - */ - class JSI_EXPORT NativeNumberTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeNumberTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeNumberTurboModule' + */ + class JSI_EXPORT NativeNumberTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeNumberTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeObjectTurboModule { struct SpecDifficultObjectAE { @@ -1721,17 +1677,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeObjectTurboModule' - */ - class JSI_EXPORT NativeObjectTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeObjectTurboModule' + */ + class JSI_EXPORT NativeObjectTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeOptionalObjectTurboModule { struct ConstantsEEE { @@ -1826,7 +1780,7 @@ namespace JS { struct Builder { struct Input { std::optional D; - id _Nullable A; + id _Nullable A; std::optional E; NSString *F; }; @@ -1855,17 +1809,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeOptionalObjectTurboModule' - */ - class JSI_EXPORT NativeOptionalObjectTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeOptionalObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeOptionalObjectTurboModule' + */ + class JSI_EXPORT NativeOptionalObjectTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeOptionalObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativePartialAnnotationTurboModule { struct SpecGetSomeObjFromPartialSomeObjValue { @@ -1923,17 +1875,15 @@ namespace JS { value2:(JS::NativePartialAnnotationTurboModule::SpecGetPartialPartialValue2 &)value2; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativePartialAnnotationTurboModule' - */ - class JSI_EXPORT NativePartialAnnotationTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativePartialAnnotationTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativePartialAnnotationTurboModule' + */ + class JSI_EXPORT NativePartialAnnotationTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativePartialAnnotationTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativePromiseTurboModuleSpec @@ -1945,17 +1895,15 @@ namespace facebook { reject:(RCTPromiseRejectBlock)reject; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativePromiseTurboModule' - */ - class JSI_EXPORT NativePromiseTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativePromiseTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativePromiseTurboModule' + */ + class JSI_EXPORT NativePromiseTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativePromiseTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModule { struct SpecGetObjectShapeArg { @@ -2037,17 +1985,15 @@ getValuegetValuegetValuegetValuegetValuey:(NSString *)getValuegetValuegetValuege - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModule' - */ - class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModule' + */ + class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModuleArrays { struct ConstantsIdElement { @@ -2127,17 +2073,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModuleArrays' - */ - class JSI_EXPORT NativeSampleTurboModuleArraysSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleArraysSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModuleArrays' + */ + class JSI_EXPORT NativeSampleTurboModuleArraysSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleArraysSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModuleNullable { struct SpecGetObjectShapeArg { @@ -2219,17 +2163,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModuleNullable' - */ - class JSI_EXPORT NativeSampleTurboModuleNullableSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleNullableSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModuleNullable' + */ + class JSI_EXPORT NativeSampleTurboModuleNullableSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleNullableSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModuleNullableAndOptional { struct SpecGetObjectShapeArg { @@ -2311,17 +2253,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModuleNullableAndOptional' - */ - class JSI_EXPORT NativeSampleTurboModuleNullableAndOptionalSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleNullableAndOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModuleNullableAndOptional' + */ + class JSI_EXPORT NativeSampleTurboModuleNullableAndOptionalSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleNullableAndOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeSampleTurboModuleOptional { struct SpecGetObjectShapeArg { @@ -2403,17 +2343,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModuleOptional' - */ - class JSI_EXPORT NativeSampleTurboModuleOptionalSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModuleOptional' + */ + class JSI_EXPORT NativeSampleTurboModuleOptionalSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeStringTurboModuleSpec @@ -2421,17 +2359,15 @@ namespace facebook { - (NSString *)getStringWithAlias:(NSString *)arg; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeStringTurboModule' - */ - class JSI_EXPORT NativeStringTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeStringTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeStringTurboModule' + */ + class JSI_EXPORT NativeStringTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeStringTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @@ -2772,9 +2708,8 @@ exports[`GenerateModuleObjCpp can generate an implementation file NativeModule s #import \\"RNCodegenModuleFixtures.h\\" -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeArrayTurboModuleSpecJSI_getArray(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, ArrayKind, \\"getArray\\", @selector(getArray:), args, count); } @@ -2787,9 +2722,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ArrayKind, \\"getArrayWithAlias\\", @selector(getArrayWithAlias:b:), args, count); } - NativeArrayTurboModuleSpecJSI::NativeArrayTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeArrayTurboModuleSpecJSI::NativeArrayTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getArray\\"] = MethodMetadata {1, __hostFunction_NativeArrayTurboModuleSpecJSI_getArray}; @@ -2798,13 +2733,11 @@ namespace facebook { methodMap_[\\"getArrayWithAlias\\"] = MethodMetadata {2, __hostFunction_NativeArrayTurboModuleSpecJSI_getArrayWithAlias}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeBooleanTurboModuleSpecJSI_getBoolean(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, BooleanKind, \\"getBoolean\\", @selector(getBoolean:), args, count); } @@ -2813,21 +2746,19 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, BooleanKind, \\"getBooleanWithAlias\\", @selector(getBooleanWithAlias:), args, count); } - NativeBooleanTurboModuleSpecJSI::NativeBooleanTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeBooleanTurboModuleSpecJSI::NativeBooleanTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getBoolean\\"] = MethodMetadata {1, __hostFunction_NativeBooleanTurboModuleSpecJSI_getBoolean}; methodMap_[\\"getBooleanWithAlias\\"] = MethodMetadata {1, __hostFunction_NativeBooleanTurboModuleSpecJSI_getBooleanWithAlias}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeCallbackTurboModuleSpecJSI_getValueWithCallback(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"getValueWithCallback\\", @selector(getValueWithCallback:), args, count); } @@ -2836,17 +2767,16 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"getValueWithCallbackWithAlias\\", @selector(getValueWithCallbackWithAlias:), args, count); } - NativeCallbackTurboModuleSpecJSI::NativeCallbackTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeCallbackTurboModuleSpecJSI::NativeCallbackTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getValueWithCallback\\"] = MethodMetadata {1, __hostFunction_NativeCallbackTurboModuleSpecJSI_getValueWithCallback}; methodMap_[\\"getValueWithCallbackWithAlias\\"] = MethodMetadata {1, __hostFunction_NativeCallbackTurboModuleSpecJSI_getValueWithCallbackWithAlias}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react @implementation RCTCxxConvert (NativeEnumTurboModule_StateType) + (RCTManagedPointer *)JS_NativeEnumTurboModule_StateType:(id)json { @@ -2859,9 +2789,8 @@ namespace facebook { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeEnumTurboModuleSpecJSI_getStatusRegular(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, StringKind, \\"getStatusRegular\\", @selector(getStatusRegular:), args, count); } @@ -2886,9 +2815,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getStateTypeWithEnums\\", @selector(getStateTypeWithEnums:), args, count); } - NativeEnumTurboModuleSpecJSI::NativeEnumTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeEnumTurboModuleSpecJSI::NativeEnumTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getStatusRegular\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleSpecJSI_getStatusRegular}; setMethodArgConversionSelector(@\\"getStatusRegular\\", 0, @\\"JS_NativeEnumTurboModule_StateType:\\"); @@ -2906,13 +2835,11 @@ namespace facebook { methodMap_[\\"getStateTypeWithEnums\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleSpecJSI_getStateTypeWithEnums}; setMethodArgConversionSelector(@\\"getStateTypeWithEnums\\", 0, @\\"JS_NativeEnumTurboModule_StateTypeWithEnums:\\"); - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeNullableTurboModuleSpecJSI_getBool(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, BooleanKind, \\"getBool\\", @selector(getBool:), args, count); } @@ -2937,9 +2864,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, \\"getValueWithPromise\\", @selector(getValueWithPromise:reject:), args, count); } - NativeNullableTurboModuleSpecJSI::NativeNullableTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeNullableTurboModuleSpecJSI::NativeNullableTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getBool\\"] = MethodMetadata {1, __hostFunction_NativeNullableTurboModuleSpecJSI_getBool}; @@ -2957,13 +2884,11 @@ namespace facebook { methodMap_[\\"getValueWithPromise\\"] = MethodMetadata {0, __hostFunction_NativeNullableTurboModuleSpecJSI_getValueWithPromise}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeNumberTurboModuleSpecJSI_getNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, NumberKind, \\"getNumber\\", @selector(getNumber:), args, count); } @@ -2972,17 +2897,16 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, NumberKind, \\"getNumberWithAlias\\", @selector(getNumberWithAlias:), args, count); } - NativeNumberTurboModuleSpecJSI::NativeNumberTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeNumberTurboModuleSpecJSI::NativeNumberTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getNumber\\"] = MethodMetadata {1, __hostFunction_NativeNumberTurboModuleSpecJSI_getNumber}; methodMap_[\\"getNumberWithAlias\\"] = MethodMetadata {1, __hostFunction_NativeNumberTurboModuleSpecJSI_getNumberWithAlias}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react @implementation RCTCxxConvert (NativeObjectTurboModule_SpecDifficultObjectAE) + (RCTManagedPointer *)JS_NativeObjectTurboModule_SpecDifficultObjectAE:(id)json { @@ -2995,9 +2919,8 @@ namespace facebook { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeObjectTurboModuleSpecJSI_getGenericObject(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getGenericObject\\", @selector(getGenericObject:), args, count); } @@ -3018,9 +2941,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getConstants\\", @selector(getConstants), args, count); } - NativeObjectTurboModuleSpecJSI::NativeObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeObjectTurboModuleSpecJSI::NativeObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getGenericObject\\"] = MethodMetadata {1, __hostFunction_NativeObjectTurboModuleSpecJSI_getGenericObject}; @@ -3035,25 +2958,22 @@ namespace facebook { methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeObjectTurboModuleSpecJSI_getConstants}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeOptionalObjectTurboModuleSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getConstants\\", @selector(getConstants), args, count); } - NativeOptionalObjectTurboModuleSpecJSI::NativeOptionalObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeOptionalObjectTurboModuleSpecJSI::NativeOptionalObjectTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeOptionalObjectTurboModuleSpecJSI_getConstants}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react @implementation RCTCxxConvert (NativePartialAnnotationTurboModule_SpecGetSomeObjFromPartialSomeObjValue) + (RCTManagedPointer *)JS_NativePartialAnnotationTurboModule_SpecGetSomeObjFromPartialSomeObjValue:(id)json { @@ -3072,9 +2992,8 @@ namespace facebook { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativePartialAnnotationTurboModuleSpecJSI_getSomeObj(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getSomeObj\\", @selector(getSomeObj), args, count); } @@ -3091,9 +3010,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getPartialPartial\\", @selector(getPartialPartial:value2:), args, count); } - NativePartialAnnotationTurboModuleSpecJSI::NativePartialAnnotationTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativePartialAnnotationTurboModuleSpecJSI::NativePartialAnnotationTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getSomeObj\\"] = MethodMetadata {0, __hostFunction_NativePartialAnnotationTurboModuleSpecJSI_getSomeObj}; @@ -3106,13 +3025,11 @@ namespace facebook { methodMap_[\\"getPartialPartial\\"] = MethodMetadata {2, __hostFunction_NativePartialAnnotationTurboModuleSpecJSI_getPartialPartial}; setMethodArgConversionSelector(@\\"getPartialPartial\\", 0, @\\"JS_NativePartialAnnotationTurboModule_SpecGetPartialPartialValue1:\\"); setMethodArgConversionSelector(@\\"getPartialPartial\\", 1, @\\"JS_NativePartialAnnotationTurboModule_SpecGetPartialPartialValue2:\\"); - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativePromiseTurboModuleSpecJSI_getValueWithPromise(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, \\"getValueWithPromise\\", @selector(getValueWithPromise:resolve:reject:), args, count); } @@ -3121,17 +3038,16 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, \\"getValueWithPromiseWithAlias\\", @selector(getValueWithPromiseWithAlias:resolve:reject:), args, count); } - NativePromiseTurboModuleSpecJSI::NativePromiseTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativePromiseTurboModuleSpecJSI::NativePromiseTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getValueWithPromise\\"] = MethodMetadata {1, __hostFunction_NativePromiseTurboModuleSpecJSI_getValueWithPromise}; methodMap_[\\"getValueWithPromiseWithAlias\\"] = MethodMetadata {1, __hostFunction_NativePromiseTurboModuleSpecJSI_getValueWithPromiseWithAlias}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react @implementation RCTCxxConvert (NativeSampleTurboModule_SpecGetObjectShapeArg) + (RCTManagedPointer *)JS_NativeSampleTurboModule_SpecGetObjectShapeArg:(id)json { @@ -3144,9 +3060,8 @@ namespace facebook { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"voidFunc\\", @selector(voidFunc), args, count); } @@ -3199,9 +3114,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getConstants\\", @selector(getConstants), args, count); } - NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc}; @@ -3240,13 +3155,11 @@ namespace facebook { methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleArraysSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"voidFunc\\", @selector(voidFunc), args, count); } @@ -3299,9 +3212,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getConstants\\", @selector(getConstants), args, count); } - NativeSampleTurboModuleArraysSpecJSI::NativeSampleTurboModuleArraysSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModuleArraysSpecJSI::NativeSampleTurboModuleArraysSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleArraysSpecJSI_voidFunc}; @@ -3340,9 +3253,8 @@ namespace facebook { methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleArraysSpecJSI_getConstants}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react @implementation RCTCxxConvert (NativeSampleTurboModuleNullable_SpecGetObjectShapeArg) + (RCTManagedPointer *)JS_NativeSampleTurboModuleNullable_SpecGetObjectShapeArg:(id)json { @@ -3355,9 +3267,8 @@ namespace facebook { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleNullableSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"voidFunc\\", @selector(voidFunc), args, count); } @@ -3410,9 +3321,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getConstants\\", @selector(getConstants), args, count); } - NativeSampleTurboModuleNullableSpecJSI::NativeSampleTurboModuleNullableSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModuleNullableSpecJSI::NativeSampleTurboModuleNullableSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleNullableSpecJSI_voidFunc}; @@ -3451,9 +3362,8 @@ namespace facebook { methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleNullableSpecJSI_getConstants}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react @implementation RCTCxxConvert (NativeSampleTurboModuleNullableAndOptional_SpecGetObjectShapeArg) + (RCTManagedPointer *)JS_NativeSampleTurboModuleNullableAndOptional_SpecGetObjectShapeArg:(id)json { @@ -3466,9 +3376,8 @@ namespace facebook { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleNullableAndOptionalSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"voidFunc\\", @selector(voidFunc), args, count); } @@ -3521,9 +3430,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getConstants\\", @selector(getConstants), args, count); } - NativeSampleTurboModuleNullableAndOptionalSpecJSI::NativeSampleTurboModuleNullableAndOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModuleNullableAndOptionalSpecJSI::NativeSampleTurboModuleNullableAndOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleNullableAndOptionalSpecJSI_voidFunc}; @@ -3562,9 +3471,8 @@ namespace facebook { methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleNullableAndOptionalSpecJSI_getConstants}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react @implementation RCTCxxConvert (NativeSampleTurboModuleOptional_SpecGetObjectShapeArg) + (RCTManagedPointer *)JS_NativeSampleTurboModuleOptional_SpecGetObjectShapeArg:(id)json { @@ -3577,9 +3485,8 @@ namespace facebook { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleOptionalSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"voidFunc\\", @selector(voidFunc), args, count); } @@ -3632,9 +3539,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getConstants\\", @selector(getConstants), args, count); } - NativeSampleTurboModuleOptionalSpecJSI::NativeSampleTurboModuleOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModuleOptionalSpecJSI::NativeSampleTurboModuleOptionalSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleOptionalSpecJSI_voidFunc}; @@ -3673,13 +3580,11 @@ namespace facebook { methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleOptionalSpecJSI_getConstants}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeStringTurboModuleSpecJSI_getString(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, StringKind, \\"getString\\", @selector(getString:), args, count); } @@ -3688,16 +3593,15 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, StringKind, \\"getStringWithAlias\\", @selector(getStringWithAlias:), args, count); } - NativeStringTurboModuleSpecJSI::NativeStringTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeStringTurboModuleSpecJSI::NativeStringTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getString\\"] = MethodMetadata {1, __hostFunction_NativeStringTurboModuleSpecJSI_getString}; methodMap_[\\"getStringWithAlias\\"] = MethodMetadata {1, __hostFunction_NativeStringTurboModuleSpecJSI_getStringWithAlias}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react " `; diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index db17a0354f0dcd..a91a1caf8a605f 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/codegen", - "version": "0.73.0", + "version": "0.74.0", "description": "Code generation tools for React Native", "license": "MIT", "repository": { @@ -30,8 +30,11 @@ ], "dependencies": { "@babel/parser": "^7.20.0", - "flow-parser": "^0.206.0", + "glob": "^7.1.1", + "hermes-parser": "0.19.1", + "invariant": "^2.2.4", "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", "nullthrows": "^1.1.1" }, "beachball": { @@ -49,12 +52,11 @@ "@babel/plugin-transform-flow-strip-types": "^7.20.0", "@babel/preset-env": "^7.20.0", "chalk": "^4.0.0", - "glob": "^7.1.1", - "invariant": "^2.2.4", + "hermes-estree": "0.19.1", "micromatch": "^4.0.4", - "mkdirp": "^0.5.1", "prettier": "2.8.8", - "rimraf": "^3.0.2" + "rimraf": "^3.0.2", + "yargs": "^17.6.2" }, "peerDependencies": { "@babel/preset-env": "^7.1.6" diff --git a/packages/react-native-codegen/src/CodegenSchema.d.ts b/packages/react-native-codegen/src/CodegenSchema.d.ts index 3482172d99009f..306067eb5a56ef 100644 --- a/packages/react-native-codegen/src/CodegenSchema.d.ts +++ b/packages/react-native-codegen/src/CodegenSchema.d.ts @@ -199,7 +199,16 @@ export type CommandParamTypeAnnotation = | Int32TypeAnnotation | DoubleTypeAnnotation | FloatTypeAnnotation - | StringTypeAnnotation; + | StringTypeAnnotation + | { + readonly type: 'ArrayTypeAnnotation'; + readonly elementType: + | Int32TypeAnnotation + | DoubleTypeAnnotation + | FloatTypeAnnotation + | BooleanTypeAnnotation + | StringTypeAnnotation + }; export interface ReservedTypeAnnotation { readonly type: 'ReservedTypeAnnotation'; diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index 1708e8939b4e8b..d286d3a79fdc8d 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -213,7 +213,8 @@ export type CommandParamTypeAnnotation = | Int32TypeAnnotation | DoubleTypeAnnotation | FloatTypeAnnotation - | StringTypeAnnotation; + | StringTypeAnnotation + | ArrayTypeAnnotation; export type ReservedTypeAnnotation = $ReadOnly<{ type: 'ReservedTypeAnnotation', diff --git a/packages/react-native-codegen/src/SchemaValidator.js b/packages/react-native-codegen/src/SchemaValidator.js index 87ded8848457c2..dc59d9cd77b29f 100644 --- a/packages/react-native-codegen/src/SchemaValidator.js +++ b/packages/react-native-codegen/src/SchemaValidator.js @@ -10,10 +10,10 @@ 'use strict'; -const nullthrows = require('nullthrows'); - import type {SchemaType} from './CodegenSchema'; +const nullthrows = require('nullthrows'); + function getErrors(schema: SchemaType): $ReadOnlyArray { const errors = new Set(); diff --git a/packages/react-native-codegen/src/__tests__/SchemaValidator-test.js b/packages/react-native-codegen/src/__tests__/SchemaValidator-test.js index 4d18b80c4d8ddb..a983168311f8c2 100644 --- a/packages/react-native-codegen/src/__tests__/SchemaValidator-test.js +++ b/packages/react-native-codegen/src/__tests__/SchemaValidator-test.js @@ -11,11 +11,11 @@ 'use strict'; +import type {SchemaType} from '../CodegenSchema.js'; + const fixtures = require('../generators/components/__test_fixtures__/fixtures.js'); const schemaValidator = require('../SchemaValidator.js'); -import type {SchemaType} from '../CodegenSchema.js'; - const simpleProp = { name: 'disabled', optional: true, diff --git a/packages/react-native-codegen/src/cli/combine/__tests__/combine-utils-test.js b/packages/react-native-codegen/src/cli/combine/__tests__/combine-utils-test.js index 84acd9ee556251..7f523b758229b2 100644 --- a/packages/react-native-codegen/src/cli/combine/__tests__/combine-utils-test.js +++ b/packages/react-native-codegen/src/cli/combine/__tests__/combine-utils-test.js @@ -11,67 +11,7 @@ 'use-strict'; -const {parseArgs, filterJSFile} = require('../combine-utils.js'); - -describe('parseArgs', () => { - const nodeBin = 'node'; - const combineApp = 'app'; - const schemaJson = 'schema.json'; - const specFile1 = 'NativeSpec.js'; - const specFile2 = 'SpecNativeComponent.js'; - - describe('when no platform provided', () => { - it('returns null platform, schema and fileList', () => { - const {platform, outfile, fileList} = parseArgs([ - nodeBin, - combineApp, - schemaJson, - specFile1, - specFile2, - ]); - - expect(platform).toBeNull(); - expect(outfile).toBe(schemaJson); - expect(fileList).toStrictEqual([specFile1, specFile2]); - }); - }); - - describe('when platform passed with --platform', () => { - it('returns the platform, the schema and the fileList', () => { - const {platform, outfile, fileList} = parseArgs([ - nodeBin, - combineApp, - '--platform', - 'ios', - schemaJson, - specFile1, - specFile2, - ]); - - expect(platform).toBe('ios'); - expect(outfile).toBe(schemaJson); - expect(fileList).toStrictEqual([specFile1, specFile2]); - }); - }); - - describe('when platform passed with -p', () => { - it('returns the platform, the schema and the fileList', () => { - const {platform, outfile, fileList} = parseArgs([ - nodeBin, - combineApp, - '-p', - 'android', - schemaJson, - specFile1, - specFile2, - ]); - - expect(platform).toBe('android'); - expect(outfile).toBe(schemaJson); - expect(fileList).toStrictEqual([specFile1, specFile2]); - }); - }); -}); +const {filterJSFile} = require('../combine-utils.js'); describe('filterJSFile', () => { describe('When the file is not a Spec file', () => { @@ -103,9 +43,19 @@ describe('filterJSFile', () => { }); describe('When the file is NativeSampleTurboModule', () => { - it('returns false', () => { + it('returns true', () => { const file = 'NativeSampleTurboModule.js'; const result = filterJSFile(file); + expect(result).toBeTruthy(); + }); + + it('returns false, when excluded', () => { + const file = 'NativeSampleTurboModule.js'; + const result = filterJSFile( + file, + null, + new RegExp('NativeSampleTurboModule'), + ); expect(result).toBeFalsy(); }); }); diff --git a/packages/react-native-codegen/src/cli/combine/combine-js-to-schema-cli.js b/packages/react-native-codegen/src/cli/combine/combine-js-to-schema-cli.js index 6aeff3418a2a86..f2c98912efeba4 100644 --- a/packages/react-native-codegen/src/cli/combine/combine-js-to-schema-cli.js +++ b/packages/react-native-codegen/src/cli/combine/combine-js-to-schema-cli.js @@ -11,45 +11,29 @@ 'use strict'; -const combine = require('./combine-js-to-schema'); -const fs = require('fs'); -const glob = require('glob'); -const path = require('path'); -const {parseArgs, filterJSFile} = require('./combine-utils'); +const { + combineSchemasInFileListAndWriteToFile, +} = require('./combine-js-to-schema'); +const yargs = require('yargs'); -const {platform, outfile, fileList} = parseArgs(process.argv); +const argv = yargs + .option('p', { + alias: 'platform', + }) + .option('e', { + alias: 'exclude', + }) + .parseSync(); -const allFiles = []; -fileList.forEach(file => { - if (fs.lstatSync(file).isDirectory()) { - const filePattern = path.sep === '\\' ? file.replace(/\\/g, '/') : file; - const dirFiles = glob - .sync(`${filePattern}/**/*.{js,ts,tsx}`, { - nodir: true, - // TODO: This will remove the need of slash substitution above for Windows, - // but it requires glob@v9+; with the package currenlty relying on - // glob@7.1.1; and flow-typed repo not having definitions for glob@9+. - // windowsPathsNoEscape: true, - }) - .filter(element => filterJSFile(element, platform)); - allFiles.push(...dirFiles); - } else if (filterJSFile(file)) { - allFiles.push(file); - } -}); +const [outfile, ...fileList] = argv._; +const platform: ?string = argv.platform; +const exclude: string = argv.exclude; +const excludeRegExp: ?RegExp = + exclude != null && exclude !== '' ? new RegExp(exclude) : null; -const combined = combine(allFiles); - -// Warn users if there is no modules to process -if (Object.keys(combined.modules).length === 0) { - console.error( - 'No modules to process in combine-js-to-schema-cli. If this is unexpected, please check if you set up your NativeComponent correctly. See combine-js-to-schema.js for how codegen finds modules.', - ); -} -const formattedSchema = JSON.stringify(combined, null, 2); - -if (outfile != null) { - fs.writeFileSync(outfile, formattedSchema); -} else { - console.log(formattedSchema); -} +combineSchemasInFileListAndWriteToFile( + fileList, + platform != null ? platform.toLowerCase() : platform, + outfile, + excludeRegExp, +); diff --git a/packages/react-native-codegen/src/cli/combine/combine-js-to-schema.js b/packages/react-native-codegen/src/cli/combine/combine-js-to-schema.js index a2dcef55c43dab..108edf99d81319 100644 --- a/packages/react-native-codegen/src/cli/combine/combine-js-to-schema.js +++ b/packages/react-native-codegen/src/cli/combine/combine-js-to-schema.js @@ -13,7 +13,9 @@ import type {SchemaType} from '../../CodegenSchema.js'; const {FlowParser} = require('../../parsers/flow/parser'); const {TypeScriptParser} = require('../../parsers/typescript/parser'); +const {filterJSFile} = require('./combine-utils'); const fs = require('fs'); +const glob = require('glob'); const path = require('path'); const flowParser = new FlowParser(); @@ -46,4 +48,60 @@ function combineSchemas(files: Array): SchemaType { ); } -module.exports = combineSchemas; +function expandDirectoriesIntoFiles( + fileList: Array, + platform: ?string, + exclude: ?RegExp, +): Array { + return fileList + .flatMap(file => { + if (!fs.lstatSync(file).isDirectory()) { + return [file]; + } + const filePattern = path.sep === '\\' ? file.replace(/\\/g, '/') : file; + return glob.sync(`${filePattern}/**/*.{js,ts,tsx}`, { + nodir: true, + // TODO: This will remove the need of slash substitution above for Windows, + // but it requires glob@v9+; with the package currenlty relying on + // glob@7.1.1; and flow-typed repo not having definitions for glob@9+. + // windowsPathsNoEscape: true, + }); + }) + .filter(element => filterJSFile(element, platform, exclude)); +} + +function combineSchemasInFileList( + fileList: Array, + platform: ?string, + exclude: ?RegExp, +): SchemaType { + const expandedFileList = expandDirectoriesIntoFiles( + fileList, + platform, + exclude, + ); + const combined = combineSchemas(expandedFileList); + if (Object.keys(combined.modules).length === 0) { + console.error( + 'No modules to process in combine-js-to-schema-cli. If this is unexpected, please check if you set up your NativeComponent correctly. See combine-js-to-schema.js for how codegen finds modules.', + ); + } + return combined; +} + +function combineSchemasInFileListAndWriteToFile( + fileList: Array, + platform: ?string, + outfile: string, + exclude: ?RegExp, +): void { + const combined = combineSchemasInFileList(fileList, platform, exclude); + const formattedSchema = JSON.stringify(combined, null, 2); + fs.writeFileSync(outfile, formattedSchema); +} + +module.exports = { + combineSchemas, + combineSchemasInFileList, + combineSchemasInFileListAndWriteToFile, +}; diff --git a/packages/react-native-codegen/src/cli/combine/combine-schemas-cli.js b/packages/react-native-codegen/src/cli/combine/combine-schemas-cli.js new file mode 100644 index 00000000000000..f7a7b6f6ef0a28 --- /dev/null +++ b/packages/react-native-codegen/src/cli/combine/combine-schemas-cli.js @@ -0,0 +1,87 @@ +/** + * 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 + */ + +'use strict'; + +import type { + ComponentSchema, + NativeModuleSchema, + SchemaType, +} from '../../CodegenSchema.js'; + +const assert = require('assert'); +const fs = require('fs'); +const yargs = require('yargs'); + +const argv = yargs + .option('p', { + alias: 'platform', + type: 'string', + demandOption: true, + }) + .option('o', { + alias: 'output', + }) + .option('s', { + alias: 'schema-query', + }) + .parseSync(); + +const platform: string = argv.platform.toLowerCase(); +const output: string = argv.output; +const schemaQuery: string = argv.s; + +if (!['ios', 'android'].includes(platform)) { + throw new Error(`Invalid platform ${platform}`); +} + +if (!schemaQuery.startsWith('@')) { + throw new Error( + "The argument provided to --schema-query must be a filename that starts with '@'.", + ); +} + +const schemaQueryOutputFile = schemaQuery.replace(/^@/, ''); +const schemaQueryOutput = fs.readFileSync(schemaQueryOutputFile, 'utf8'); + +const schemaFiles = schemaQueryOutput.split(' '); +const modules: { + [hasteModuleName: string]: NativeModuleSchema | ComponentSchema, +} = {}; +const specNameToFile: {[hasteModuleName: string]: string} = {}; + +for (const file of schemaFiles) { + const schema: SchemaType = JSON.parse(fs.readFileSync(file, 'utf8')); + + if (schema.modules) { + for (const specName in schema.modules) { + const module = schema.modules[specName]; + if (modules[specName]) { + assert.deepEqual( + module, + modules[specName], + `App contained two specs with the same file name '${specName}'. Schemas: ${specNameToFile[specName]}, ${file}. Please rename one of the specs.`, + ); + } + + if ( + module.excludedPlatforms && + module.excludedPlatforms.indexOf(platform) >= 0 + ) { + continue; + } + + modules[specName] = module; + specNameToFile[specName] = file; + } + } +} + +fs.writeFileSync(output, JSON.stringify({modules}, null, 2)); diff --git a/packages/react-native-codegen/src/cli/combine/combine-utils.js b/packages/react-native-codegen/src/cli/combine/combine-utils.js index 5dad6e041b6b99..8f120fb687f6ba 100644 --- a/packages/react-native-codegen/src/cli/combine/combine-utils.js +++ b/packages/react-native-codegen/src/cli/combine/combine-utils.js @@ -13,28 +13,6 @@ const path = require('path'); -function parseArgs(args: string[]): { - platform: ?string, - outfile: string, - fileList: string[], -} { - if (args.length > 2 && ['-p', '--platform'].indexOf(args[2]) >= 0) { - const [outfile, ...fileList] = args.slice(4); - return { - platform: args[3], - outfile, - fileList, - }; - } - - const [outfile, ...fileList] = args.slice(2); - return { - platform: null, - outfile, - fileList, - }; -} - /** * This function is used by the CLI to decide whether a JS/TS file has to be processed or not by the Codegen. * Parameters: @@ -43,19 +21,21 @@ function parseArgs(args: string[]): { * Returns: `true` if the file can be used to generate some code; `false` otherwise * */ -function filterJSFile(file: string, currentPlatform: ?string): boolean { +function filterJSFile( + file: string, + currentPlatform: ?string, + excludeRegExp: ?RegExp, +): boolean { const isSpecFile = /^(Native.+|.+NativeComponent)/.test(path.basename(file)); const isNotNativeUIManager = !file.endsWith('NativeUIManager.js'); - const isNotNativeSampleTurboModule = !file.endsWith( - 'NativeSampleTurboModule.js', - ); const isNotTest = !file.includes('__tests'); + const isNotExcluded = excludeRegExp == null || !excludeRegExp.test(file); const isNotTSTypeDefinition = !file.endsWith('.d.ts'); const isValidCandidate = isSpecFile && isNotNativeUIManager && - isNotNativeSampleTurboModule && + isNotExcluded && isNotTest && isNotTSTypeDefinition; @@ -80,6 +60,5 @@ function filterJSFile(file: string, currentPlatform: ?string): boolean { } module.exports = { - parseArgs, filterJSFile, }; diff --git a/packages/react-native-codegen/src/cli/parser/parser.js b/packages/react-native-codegen/src/cli/parser/parser.js index 40a599c9ff9c41..850e27fff4c846 100644 --- a/packages/react-native-codegen/src/cli/parser/parser.js +++ b/packages/react-native-codegen/src/cli/parser/parser.js @@ -10,9 +10,9 @@ 'use strict'; -const path = require('path'); const {FlowParser} = require('../../parsers/flow/parser'); const {TypeScriptParser} = require('../../parsers/typescript/parser'); +const path = require('path'); const flowParser = new FlowParser(); const typescriptParser = new TypeScriptParser(); diff --git a/packages/react-native-codegen/src/generators/RNCodegen.d.ts b/packages/react-native-codegen/src/generators/RNCodegen.d.ts index 9cf647abfcceea..f73eb2e0fa51b3 100644 --- a/packages/react-native-codegen/src/generators/RNCodegen.d.ts +++ b/packages/react-native-codegen/src/generators/RNCodegen.d.ts @@ -14,6 +14,7 @@ export type ViewGeneratorFunction = (libraryName: string, schema: SchemaType) => type LibraryGeneratorNames = | 'generateComponentDescriptorH' + | 'generateComponentDescriptorCpp' | 'generateComponentHObjCpp' | 'generateEventEmitterCpp' | 'generateEventEmitterH' diff --git a/packages/react-native-codegen/src/generators/RNCodegen.js b/packages/react-native-codegen/src/generators/RNCodegen.js index 61441c715dc26a..d363ceb0957c1c 100644 --- a/packages/react-native-codegen/src/generators/RNCodegen.js +++ b/packages/react-native-codegen/src/generators/RNCodegen.js @@ -16,34 +16,38 @@ TODO: - ViewConfigs should spread in View's valid attributes */ -const fs = require('fs'); +import type {SchemaType} from '../CodegenSchema'; + +const schemaValidator = require('../SchemaValidator.js'); +const generateComponentDescriptorCpp = require('./components/GenerateComponentDescriptorCpp.js'); const generateComponentDescriptorH = require('./components/GenerateComponentDescriptorH.js'); const generateComponentHObjCpp = require('./components/GenerateComponentHObjCpp.js'); const generateEventEmitterCpp = require('./components/GenerateEventEmitterCpp.js'); const generateEventEmitterH = require('./components/GenerateEventEmitterH.js'); const generatePropsCpp = require('./components/GeneratePropsCpp.js'); const generatePropsH = require('./components/GeneratePropsH.js'); +const generatePropsJavaDelegate = require('./components/GeneratePropsJavaDelegate.js'); +const generatePropsJavaInterface = require('./components/GeneratePropsJavaInterface.js'); +const generateShadowNodeCpp = require('./components/GenerateShadowNodeCpp.js'); +const generateShadowNodeH = require('./components/GenerateShadowNodeH.js'); const generateStateCpp = require('./components/GenerateStateCpp.js'); const generateStateH = require('./components/GenerateStateH.js'); -const generateModuleH = require('./modules/GenerateModuleH.js'); +const generateTests = require('./components/GenerateTests.js'); +const generateThirdPartyFabricComponentsProviderH = require('./components/GenerateThirdPartyFabricComponentsProviderH.js'); +const generateThirdPartyFabricComponentsProviderObjCpp = require('./components/GenerateThirdPartyFabricComponentsProviderObjCpp.js'); +const generateViewConfigJs = require('./components/GenerateViewConfigJs.js'); const generateModuleCpp = require('./modules/GenerateModuleCpp.js'); -const generateModuleObjCpp = require('./modules/GenerateModuleObjCpp'); +const generateModuleH = require('./modules/GenerateModuleH.js'); const generateModuleJavaSpec = require('./modules/GenerateModuleJavaSpec.js'); const generateModuleJniCpp = require('./modules/GenerateModuleJniCpp.js'); const generateModuleJniH = require('./modules/GenerateModuleJniH.js'); -const generatePropsJavaInterface = require('./components/GeneratePropsJavaInterface.js'); -const generatePropsJavaDelegate = require('./components/GeneratePropsJavaDelegate.js'); -const generateTests = require('./components/GenerateTests.js'); -const generateShadowNodeCpp = require('./components/GenerateShadowNodeCpp.js'); -const generateShadowNodeH = require('./components/GenerateShadowNodeH.js'); -const generateThirdPartyFabricComponentsProviderObjCpp = require('./components/GenerateThirdPartyFabricComponentsProviderObjCpp.js'); -const generateThirdPartyFabricComponentsProviderH = require('./components/GenerateThirdPartyFabricComponentsProviderH.js'); -const generateViewConfigJs = require('./components/GenerateViewConfigJs.js'); +const generateModuleObjCpp = require('./modules/GenerateModuleObjCpp'); +const fs = require('fs'); const path = require('path'); -const schemaValidator = require('../SchemaValidator.js'); const ALL_GENERATORS = { generateComponentDescriptorH: generateComponentDescriptorH.generate, + generateComponentDescriptorCpp: generateComponentDescriptorCpp.generate, generateComponentHObjCpp: generateComponentHObjCpp.generate, generateEventEmitterCpp: generateEventEmitterCpp.generate, generateEventEmitterH: generateEventEmitterH.generate, @@ -69,19 +73,19 @@ const ALL_GENERATORS = { generateViewConfigJs: generateViewConfigJs.generate, }; -import type {SchemaType} from '../CodegenSchema'; - type LibraryOptions = $ReadOnly<{ libraryName: string, schema: SchemaType, outputDirectory: string, packageName?: string, // Some platforms have a notion of package, which should be configurable. assumeNonnull: boolean, + useLocalIncludePaths?: boolean, }>; type SchemasOptions = $ReadOnly<{ schemas: {[string]: SchemaType}, outputDirectory: string, + supportedApplePlatforms?: {[string]: {[string]: boolean}}, }>; type LibraryGenerators = @@ -124,6 +128,7 @@ const LIBRARY_GENERATORS = { componentsAndroid: [ // JNI/C++ files generateComponentDescriptorH.generate, + generateComponentDescriptorCpp.generate, generateEventEmitterCpp.generate, generateEventEmitterH.generate, generatePropsCpp.generate, @@ -138,6 +143,7 @@ const LIBRARY_GENERATORS = { ], componentsIOS: [ generateComponentDescriptorH.generate, + generateComponentDescriptorCpp.generate, generateEventEmitterCpp.generate, generateEventEmitterH.generate, generateComponentHObjCpp.generate, @@ -232,16 +238,24 @@ module.exports = { outputDirectory, packageName, assumeNonnull, + useLocalIncludePaths, }: LibraryOptions, {generators, test}: LibraryConfig, ): boolean { schemaValidator.validate(schema); + const defaultHeaderPrefix = 'react/renderer/components'; + const headerPrefix = + useLocalIncludePaths === true + ? '' + : `${defaultHeaderPrefix}/${libraryName}/`; function composePath(intermediate: string) { return path.join(outputDirectory, intermediate, libraryName); } - const componentIOSOutput = composePath('react/renderer/components/'); + const componentIOSOutput = composePath( + useLocalIncludePaths === true ? '' : defaultHeaderPrefix, + ); const modulesIOSOutput = composePath('./'); const outputFoldersForGenerators = { @@ -262,21 +276,25 @@ module.exports = { for (const name of generators) { for (const generator of LIBRARY_GENERATORS[name]) { - generator(libraryName, schema, packageName, assumeNonnull).forEach( - (contents: string, fileName: string) => { - generatedFiles.push({ - name: fileName, - content: contents, - outputDir: outputFoldersForGenerators[name], - }); - }, - ); + generator( + libraryName, + schema, + packageName, + assumeNonnull, + headerPrefix, + ).forEach((contents: string, fileName: string) => { + generatedFiles.push({ + name: fileName, + content: contents, + outputDir: outputFoldersForGenerators[name], + }); + }); } } return checkOrWriteFiles(generatedFiles, test); }, generateFromSchemas( - {schemas, outputDirectory}: SchemasOptions, + {schemas, outputDirectory, supportedApplePlatforms}: SchemasOptions, {generators, test}: SchemasConfig, ): boolean { Object.keys(schemas).forEach(libraryName => @@ -287,13 +305,15 @@ module.exports = { for (const name of generators) { for (const generator of SCHEMAS_GENERATORS[name]) { - generator(schemas).forEach((contents: string, fileName: string) => { - generatedFiles.push({ - name: fileName, - content: contents, - outputDir: outputDirectory, - }); - }); + generator(schemas, supportedApplePlatforms).forEach( + (contents: string, fileName: string) => { + generatedFiles.push({ + name: fileName, + content: contents, + outputDir: outputDirectory, + }); + }, + ); } } return checkOrWriteFiles(generatedFiles, test); diff --git a/packages/react-native-codegen/src/generators/TypeUtils/Cxx/index.js b/packages/react-native-codegen/src/generators/TypeUtils/Cxx/index.js new file mode 100644 index 00000000000000..fcde7828a856fd --- /dev/null +++ b/packages/react-native-codegen/src/generators/TypeUtils/Cxx/index.js @@ -0,0 +1,18 @@ +/** + * 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 + */ + +function wrapOptional(type: string, isRequired: boolean): string { + return isRequired ? type : `std::optional<${type}>`; +} + +module.exports = { + wrapOptional, +}; diff --git a/packages/react-native-codegen/src/generators/TypeUtils/Java/index.js b/packages/react-native-codegen/src/generators/TypeUtils/Java/index.js new file mode 100644 index 00000000000000..6253ea37d4d25d --- /dev/null +++ b/packages/react-native-codegen/src/generators/TypeUtils/Java/index.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. + * + * @flow strict + * @format + * @oncall react_native + */ + +const objectTypeForPrimitiveType = { + boolean: 'Boolean', + double: 'Double', + float: 'Float', + int: 'Integer', +}; + +function wrapOptional(type: string, isRequired: boolean): string { + return isRequired + ? type + : `@Nullable ${objectTypeForPrimitiveType[type] ?? type}`; +} + +module.exports = { + wrapOptional, +}; diff --git a/packages/react-native-codegen/src/generators/TypeUtils/Objective-C/index.js b/packages/react-native-codegen/src/generators/TypeUtils/Objective-C/index.js new file mode 100644 index 00000000000000..529bfe64a9ad08 --- /dev/null +++ b/packages/react-native-codegen/src/generators/TypeUtils/Objective-C/index.js @@ -0,0 +1,18 @@ +/** + * 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 + */ + +function wrapOptional(type: string, isRequired: boolean): string { + return isRequired ? type : `${type} _Nullable`; +} + +module.exports = { + wrapOptional, +}; diff --git a/packages/react-native-codegen/src/generators/__tests__/RNCodegen-test.js b/packages/react-native-codegen/src/generators/__tests__/RNCodegen-test.js index 44a70349ab2ec9..5ac18862490340 100644 --- a/packages/react-native-codegen/src/generators/__tests__/RNCodegen-test.js +++ b/packages/react-native-codegen/src/generators/__tests__/RNCodegen-test.js @@ -11,8 +11,8 @@ 'use strict'; -const rnCodegen = require('../RNCodegen.js'); const fixture = require('../__test_fixtures__/fixtures.js'); +const rnCodegen = require('../RNCodegen.js'); const packageName = 'na'; describe('RNCodegen.generate', () => { @@ -46,6 +46,7 @@ describe('RNCodegen.generate', () => { 'EventEmitters.h': componentsOutputDir, 'EventEmitters.cpp': componentsOutputDir, 'ComponentDescriptors.h': componentsOutputDir, + 'ComponentDescriptors.cpp': componentsOutputDir, }; let receivedDir = path.dirname(location); diff --git a/packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js b/packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js index c43768a1593439..3a0138224c0bf5 100644 --- a/packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js +++ b/packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js @@ -11,26 +11,24 @@ 'use strict'; import type {NamedShape, PropTypeAnnotation} from '../../CodegenSchema'; - import type { - StringTypeAnnotation, - ReservedPropTypeAnnotation, - ObjectTypeAnnotation, - Int32TypeAnnotation, - FloatTypeAnnotation, - DoubleTypeAnnotation, BooleanTypeAnnotation, + DoubleTypeAnnotation, + FloatTypeAnnotation, + Int32TypeAnnotation, + ObjectTypeAnnotation, + ReservedPropTypeAnnotation, + StringTypeAnnotation, } from '../../CodegenSchema'; +const {getEnumName} = require('../Utils'); const { + generateStructName, getCppTypeForAnnotation, getEnumMaskName, - generateStructName, getImports, } = require('./CppHelpers.js'); -const {getEnumName} = require('../Utils'); - function getNativeTypeFromAnnotation( componentName: string, prop: diff --git a/packages/react-native-codegen/src/generators/components/ComponentsProviderUtils.js b/packages/react-native-codegen/src/generators/components/ComponentsProviderUtils.js new file mode 100644 index 00000000000000..0ee2c4afa76aa6 --- /dev/null +++ b/packages/react-native-codegen/src/generators/components/ComponentsProviderUtils.js @@ -0,0 +1,60 @@ +/** + * 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 + */ + +const APPLE_PLATFORMS_MACRO_MAP = { + ios: 'TARGET_OS_IOS', + macos: 'TARGET_OS_OSX', + tvos: 'TARGET_OS_TV', + visionos: 'TARGET_OS_VISION', +}; + +/** + * Adds compiler macros to the file template to exclude unsupported platforms. + */ +function generateSupportedApplePlatformsMacro( + fileTemplate: string, + supportedPlatformsMap: ?{[string]: boolean}, +): string { + if (!supportedPlatformsMap) { + return fileTemplate; + } + + // According to Podspec Syntax Reference, when `platform` or `deployment_target` is not specified, it defaults to all platforms. + // https://guides.cocoapods.org/syntax/podspec.html#platform + const everyPlatformIsUnsupported = Object.keys(supportedPlatformsMap).every( + platform => supportedPlatformsMap[platform] === false, + ); + + if (everyPlatformIsUnsupported) { + return fileTemplate; + } + + const compilerMacroString = Object.keys(supportedPlatformsMap) + .reduce((acc: string[], platform) => { + if (!supportedPlatformsMap[platform]) { + return [...acc, `!${APPLE_PLATFORMS_MACRO_MAP[platform]}`]; + } + return acc; + }, []) + .join(' && '); + + if (!compilerMacroString) { + return fileTemplate; + } + + return `#if ${compilerMacroString} +${fileTemplate} +#endif +`; +} + +module.exports = { + generateSupportedApplePlatformsMacro, +}; diff --git a/packages/react-native-codegen/src/generators/components/CppHelpers.js b/packages/react-native-codegen/src/generators/components/CppHelpers.js index ccecb1bcd08073..9f8fd10387507f 100644 --- a/packages/react-native-codegen/src/generators/components/CppHelpers.js +++ b/packages/react-native-codegen/src/generators/components/CppHelpers.js @@ -256,6 +256,19 @@ function convertDefaultTypeToString( } } +const IncludeTemplate = ({ + headerPrefix, + file, +}: { + headerPrefix: string, + file: string, +}): string => { + if (headerPrefix === '') { + return `#include "${file}"`; + } + return `#include <${headerPrefix}${file}>`; +}; + module.exports = { convertDefaultTypeToString, getCppArrayTypeForAnnotation, @@ -265,4 +278,5 @@ module.exports = { toIntEnumValueName, generateStructName, generateEventStructName, + IncludeTemplate, }; diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorCpp.js b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorCpp.js new file mode 100644 index 00000000000000..794e04765742a2 --- /dev/null +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorCpp.js @@ -0,0 +1,101 @@ +/** + * 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 + */ + +'use strict'; + +import type {SchemaType} from '../../CodegenSchema'; + +const {IncludeTemplate} = require('./CppHelpers'); + +// File path -> contents +type FilesOutput = Map; + +const FileTemplate = ({ + libraryName, + componentRegistrations, + headerPrefix, +}: { + libraryName: string, + componentRegistrations: string, + headerPrefix: string, +}) => ` +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * ${'@'}generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +${IncludeTemplate({headerPrefix, file: 'ComponentDescriptors.h'})} +#include +#include + +namespace facebook::react { + +void ${libraryName}_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +${componentRegistrations} +} + +} // namespace facebook::react +`; + +const ComponentRegistrationTemplate = ({className}: {className: string}) => + ` +registry->add(concreteComponentDescriptorProvider<${className}ComponentDescriptor>()); +`.trim(); + +module.exports = { + generate( + libraryName: string, + schema: SchemaType, + packageName?: string, + assumeNonnull: boolean = false, + headerPrefix?: string, + ): FilesOutput { + const fileName = 'ComponentDescriptors.cpp'; + + const componentRegistrations = Object.keys(schema.modules) + .map(moduleName => { + const module = schema.modules[moduleName]; + if (module.type !== 'Component') { + return; + } + + const {components} = module; + // No components in this module + if (components == null) { + return null; + } + + return Object.keys(components) + .map(componentName => { + if (components[componentName].interfaceOnly === true) { + return; + } + + return ComponentRegistrationTemplate({className: componentName}); + }) + .join('\n'); + }) + .filter(Boolean) + .join('\n'); + + const replacedTemplate = FileTemplate({ + libraryName, + componentRegistrations, + headerPrefix: headerPrefix ?? '', + }); + + return new Map([[fileName, replacedTemplate]]); + }, +}; diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js index a7c795622f9082..0a68446cd1af71 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js @@ -12,15 +12,19 @@ import type {SchemaType} from '../../CodegenSchema'; +const {IncludeTemplate} = require('./CppHelpers'); + // File path -> contents type FilesOutput = Map; const FileTemplate = ({ - componentDescriptors, libraryName, + componentDefinitions, + headerPrefix, }: { - componentDescriptors: string, libraryName: string, + componentDefinitions: string, + headerPrefix: string, }) => ` /** * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). @@ -33,19 +37,21 @@ const FileTemplate = ({ #pragma once -#include +${IncludeTemplate({headerPrefix, file: 'ShadowNodes.h'})} #include +#include + +namespace facebook::react { -namespace facebook { -namespace react { +${componentDefinitions} -${componentDescriptors} +void ${libraryName}_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); -} // namespace react -} // namespace facebook +} // namespace facebook::react `; -const ComponentTemplate = ({className}: {className: string}) => +const ComponentDefinitionTemplate = ({className}: {className: string}) => ` using ${className}ComponentDescriptor = ConcreteComponentDescriptor<${className}ShadowNode>; `.trim(); @@ -56,10 +62,11 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'ComponentDescriptors.h'; - const componentDescriptors = Object.keys(schema.modules) + const componentDefinitions = Object.keys(schema.modules) .map(moduleName => { const module = schema.modules[moduleName]; if (module.type !== 'Component') { @@ -78,7 +85,7 @@ module.exports = { return; } - return ComponentTemplate({className: componentName}); + return ComponentDefinitionTemplate({className: componentName}); }) .join('\n'); }) @@ -86,8 +93,9 @@ module.exports = { .join('\n'); const replacedTemplate = FileTemplate({ - componentDescriptors, libraryName, + componentDefinitions, + headerPrefix: headerPrefix ?? '', }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js index ee619f4617f769..79724d1810eb67 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js @@ -11,11 +11,11 @@ 'use strict'; import type { - NamedShape, + CommandParamTypeAnnotation, CommandTypeAnnotation, ComponentShape, + NamedShape, SchemaType, - CommandParamTypeAnnotation, } from '../../CodegenSchema'; type FilesOutput = Map; @@ -171,6 +171,8 @@ function getObjCParamType(param: Param): string { return 'NSInteger'; case 'StringTypeAnnotation': return 'NSString *'; + case 'ArrayTypeAnnotation': + return 'const NSArray *'; default: (typeAnnotation.type: empty); throw new Error('Received invalid param type annotation'); @@ -199,6 +201,8 @@ function getObjCExpectedKindParamType(param: Param): string { return '[NSNumber class]'; case 'StringTypeAnnotation': return '[NSString class]'; + case 'ArrayTypeAnnotation': + return '[NSArray class]'; default: (typeAnnotation.type: empty); throw new Error('Received invalid param type annotation'); @@ -227,6 +231,8 @@ function getReadableExpectedKindParamType(param: Param): string { return 'number'; case 'StringTypeAnnotation': return 'string'; + case 'ArrayTypeAnnotation': + return 'array'; default: (typeAnnotation.type: empty); throw new Error('Received invalid param type annotation'); @@ -258,6 +264,8 @@ function getObjCRightHandAssignmentParamType( return `[(NSNumber *)arg${index} intValue]`; case 'StringTypeAnnotation': return `(NSString *)arg${index}`; + case 'ArrayTypeAnnotation': + return `(NSArray *)arg${index}`; default: (typeAnnotation.type: empty); throw new Error('Received invalid param type annotation'); @@ -372,6 +380,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'RCTComponentViewHelpers.h'; diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js index 7a43aea0a2b54e..2f2a829d19955d 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js @@ -10,18 +10,17 @@ 'use strict'; import type {EventTypeShape} from '../../CodegenSchema'; - -const {generateEventStructName} = require('./CppHelpers'); -const {indent} = require('../Utils'); - import type { ComponentShape, - NamedShape, EventTypeAnnotation, - SchemaType, + NamedShape, ObjectTypeAnnotation, + SchemaType, } from '../../CodegenSchema'; +const {indent} = require('../Utils'); +const {IncludeTemplate, generateEventStructName} = require('./CppHelpers'); + // File path -> contents type FilesOutput = Map; @@ -32,12 +31,12 @@ type ComponentCollection = $ReadOnly<{ const FileTemplate = ({ events, - libraryName, extraIncludes, + headerPrefix, }: { events: string, - libraryName: string, extraIncludes: Set, + headerPrefix: string, }) => ` /** * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). @@ -48,14 +47,12 @@ const FileTemplate = ({ * ${'@'}generated by codegen project: GenerateEventEmitterCpp.js */ -#include +${IncludeTemplate({headerPrefix, file: 'EventEmitters.h'})} ${[...extraIncludes].join('\n')} -namespace facebook { -namespace react { +namespace facebook::react { ${events} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; const ComponentTemplate = ({ @@ -372,9 +369,10 @@ function generateEvent( // In order to migrate to this new system we have to support the current // naming scheme. We should delete this once we are able to control this name // throughout the system. - const dispatchEventName = `${event.name[2].toLowerCase()}${event.name.slice( - 3, - )}`; + const dispatchEventName = + event.paperTopLevelNameDeprecated != null + ? event.paperTopLevelNameDeprecated + : `${event.name[2].toLowerCase()}${event.name.slice(3)}`; if (event.typeAnnotation.argument) { const implementation = ` @@ -414,6 +412,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const moduleComponents: ComponentCollection = Object.keys(schema.modules) .map(moduleName => { @@ -445,9 +444,9 @@ module.exports = { const fileName = 'EventEmitters.cpp'; const replacedTemplate = FileTemplate({ - libraryName, events: componentEmitters, extraIncludes, + headerPrefix: headerPrefix ?? '', }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js index b5d55033f063b4..0e753e24d2c544 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js @@ -10,24 +10,23 @@ 'use strict'; -const nullthrows = require('nullthrows'); - -const { - getImports, - getCppArrayTypeForAnnotation, - getCppTypeForAnnotation, - generateEventStructName, -} = require('./CppHelpers'); -const {indent, toSafeCppString} = require('../Utils'); - import type { ComponentShape, + EventTypeAnnotation, EventTypeShape, NamedShape, - EventTypeAnnotation, SchemaType, } from '../../CodegenSchema'; +const {indent, toSafeCppString} = require('../Utils'); +const { + generateEventStructName, + getCppArrayTypeForAnnotation, + getCppTypeForAnnotation, + getImports, +} = require('./CppHelpers'); +const nullthrows = require('nullthrows'); + // File path -> contents type FilesOutput = Map; type StructsMap = Map; @@ -57,11 +56,9 @@ const FileTemplate = ({ #include ${[...extraIncludes].join('\n')} -namespace facebook { -namespace react { +namespace facebook::react { ${componentEmitters} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; const ComponentTemplate = ({ @@ -314,6 +311,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const moduleComponents: ComponentCollection = Object.keys(schema.modules) .map(moduleName => { diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js index ad9d6aac61f45a..d925abce9984b8 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js @@ -11,19 +11,24 @@ 'use strict'; import type {ComponentShape, SchemaType} from '../../CodegenSchema'; -const {convertDefaultTypeToString, getImports} = require('./CppHelpers'); + +const { + IncludeTemplate, + convertDefaultTypeToString, + getImports, +} = require('./CppHelpers'); // File path -> contents type FilesOutput = Map; const FileTemplate = ({ - libraryName, imports, componentClasses, + headerPrefix, }: { - libraryName: string, imports: string, componentClasses: string, + headerPrefix: string, }) => ` /** * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). @@ -34,16 +39,14 @@ const FileTemplate = ({ * ${'@'}generated by codegen project: GeneratePropsCpp.js */ -#include +${IncludeTemplate({headerPrefix, file: 'Props.h'})} ${imports} -namespace facebook { -namespace react { +namespace facebook::react { ${componentClasses} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; const ComponentTemplate = ({ @@ -105,6 +108,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'Props.cpp'; const allImports: Set = new Set([ @@ -152,8 +156,8 @@ module.exports = { const replacedTemplate = FileTemplate({ componentClasses: componentProps, - libraryName, imports: Array.from(allImports).sort().join('\n').trim(), + headerPrefix: headerPrefix ?? '', }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js index 479c82cd50aa04..da7da65f3a992e 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js @@ -10,28 +10,25 @@ 'use strict'; import type {ComponentShape} from '../../CodegenSchema'; +import type { + ExtendsPropsShape, + NamedShape, + PropTypeAnnotation, + SchemaType, +} from '../../CodegenSchema'; +const {getEnumName, toSafeCppString} = require('../Utils'); const { - getNativeTypeFromAnnotation, getLocalImports, + getNativeTypeFromAnnotation, } = require('./ComponentsGeneratorUtils.js'); - const { convertDefaultTypeToString, - getEnumMaskName, generateStructName, + getEnumMaskName, toIntEnumValueName, } = require('./CppHelpers.js'); -const {getEnumName, toSafeCppString} = require('../Utils'); - -import type { - ExtendsPropsShape, - NamedShape, - PropTypeAnnotation, - SchemaType, -} from '../../CodegenSchema'; - // File path -> contents type FilesOutput = Map; type StructsMap = Map; @@ -55,13 +52,11 @@ const FileTemplate = ({ ${imports} -namespace facebook { -namespace react { +namespace facebook::react { ${componentClasses} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; const ClassTemplate = ({ @@ -711,6 +706,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'Props.h'; diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js index 68875b3b6caa6c..e45a4df573bcd7 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js @@ -10,19 +10,19 @@ 'use strict'; import type {CommandParamTypeAnnotation} from '../../CodegenSchema'; - import type { - NamedShape, CommandTypeAnnotation, ComponentShape, + NamedShape, PropTypeAnnotation, SchemaType, } from '../../CodegenSchema'; + const { + getDelegateJavaClassName, getImports, - toSafeJavaString, getInterfaceJavaClassName, - getDelegateJavaClassName, + toSafeJavaString, } = require('./JavaHelpers'); // File path -> contents @@ -202,6 +202,8 @@ function getCommandArgJavaType( return `args.getInt(${index})`; case 'StringTypeAnnotation': return `args.getString(${index})`; + case 'ArrayTypeAnnotation': + return `args.getArray(${index})`; default: (typeAnnotation.type: empty); throw new Error(`Receieved invalid type: ${typeAnnotation.type}`); @@ -295,6 +297,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { // TODO: This doesn't support custom package name yet. const normalizedPackageName = 'com.facebook.react.viewmanagers'; diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js index a71f9b696ede6d..28888b203e245b 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js @@ -10,18 +10,18 @@ 'use strict'; import type {CommandParamTypeAnnotation} from '../../CodegenSchema'; - import type { - NamedShape, CommandTypeAnnotation, ComponentShape, + NamedShape, PropTypeAnnotation, SchemaType, } from '../../CodegenSchema'; + const { getImports, - toSafeJavaString, getInterfaceJavaClassName, + toSafeJavaString, } = require('./JavaHelpers'); // File path -> contents @@ -171,6 +171,8 @@ function getCommandArgJavaType(param: NamedShape) { return 'int'; case 'StringTypeAnnotation': return 'String'; + case 'ArrayTypeAnnotation': + return 'ReadableArray'; default: (typeAnnotation.type: empty); throw new Error('Receieved invalid typeAnnotation'); @@ -235,6 +237,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { // TODO: This doesn't support custom package name yet. const normalizedPackageName = 'com.facebook.react.viewmanagers'; diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/PojoCollector.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/PojoCollector.js index 7aaa6d297bf539..6f5e19e88fd243 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/PojoCollector.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/PojoCollector.js @@ -11,17 +11,17 @@ 'use strict'; import type { - ReservedPropTypeAnnotation, - NamedShape, - ObjectTypeAnnotation, + ArrayTypeAnnotation, BooleanTypeAnnotation, - StringTypeAnnotation, DoubleTypeAnnotation, FloatTypeAnnotation, Int32TypeAnnotation, - PropTypeAnnotation, MixedTypeAnnotation, - ArrayTypeAnnotation, + NamedShape, + ObjectTypeAnnotation, + PropTypeAnnotation, + ReservedPropTypeAnnotation, + StringTypeAnnotation, } from '../../../CodegenSchema'; const {capitalize} = require('../../Utils'); diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/index.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/index.js index 66b11f26c8c3e8..a60583debc5474 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/index.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/index.js @@ -12,8 +12,8 @@ import type {SchemaType} from '../../../CodegenSchema'; -const PojoCollector = require('./PojoCollector'); const {capitalize} = require('../../Utils'); +const PojoCollector = require('./PojoCollector'); const {serializePojo} = require('./serializePojo'); type FilesOutput = Map; diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/serializePojo.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/serializePojo.js index f9f7234931fee0..7ca6df11d081cd 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/serializePojo.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/serializePojo.js @@ -11,6 +11,7 @@ 'use strict'; import type {Pojo, PojoProperty, PojoTypeAnnotation} from './PojoCollector'; + const {capitalize} = require('../../Utils'); type ImportCollector = ($import: string) => void; diff --git a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js index 82cb8ffd5ab559..c6d9f7b738f608 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js @@ -12,15 +12,17 @@ import type {SchemaType} from '../../CodegenSchema'; +const {IncludeTemplate} = require('./CppHelpers'); + // File path -> contents type FilesOutput = Map; const FileTemplate = ({ - libraryName, componentNames, + headerPrefix, }: { - libraryName: string, componentNames: string, + headerPrefix: string, }) => ` /** * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). @@ -31,15 +33,13 @@ const FileTemplate = ({ * ${'@'}generated by codegen project: GenerateShadowNodeCpp.js */ -#include +${IncludeTemplate({headerPrefix, file: 'ShadowNodes.h'})} -namespace facebook { -namespace react { +namespace facebook::react { ${componentNames} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; const ComponentTemplate = ({className}: {className: string}) => @@ -53,6 +53,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'ShadowNodes.cpp'; @@ -87,7 +88,7 @@ module.exports = { const replacedTemplate = FileTemplate({ componentNames, - libraryName, + headerPrefix: headerPrefix ?? '', }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js index 3e7cf71117ef22..8218495e940073 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js @@ -12,17 +12,17 @@ import type {SchemaType} from '../../CodegenSchema'; +const {IncludeTemplate} = require('./CppHelpers'); + // File path -> contents type FilesOutput = Map; const FileTemplate = ({ - imports, - libraryName, componentClasses, + headerPrefix, }: { - imports: string, - libraryName: string, componentClasses: string, + headerPrefix: string, }) => ` /** * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). @@ -35,18 +35,17 @@ const FileTemplate = ({ #pragma once -${imports}#include -#include +${IncludeTemplate({headerPrefix, file: 'EventEmitters.h'})} +${IncludeTemplate({headerPrefix, file: 'Props.h'})} +${IncludeTemplate({headerPrefix, file: 'States.h'})} #include #include -namespace facebook { -namespace react { +namespace facebook::react { ${componentClasses} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; const ComponentTemplate = ({ @@ -74,6 +73,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'ShadowNodes.h'; @@ -111,12 +111,9 @@ module.exports = { .filter(Boolean) .join('\n\n'); - const eventEmitterImport = `#include \n`; - const replacedTemplate = FileTemplate({ componentClasses: moduleResults, - libraryName, - imports: eventEmitterImport, + headerPrefix: headerPrefix ?? '', }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/components/GenerateStateCpp.js b/packages/react-native-codegen/src/generators/components/GenerateStateCpp.js index 36c84339819207..87d734a10a7aeb 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateStateCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateStateCpp.js @@ -12,15 +12,17 @@ import type {SchemaType} from '../../CodegenSchema'; +const {IncludeTemplate} = require('./CppHelpers'); + // File path -> contents type FilesOutput = Map; const FileTemplate = ({ - libraryName, stateClasses, + headerPrefix, }: { - libraryName: string, stateClasses: string, + headerPrefix: string, }) => ` /** * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). @@ -30,15 +32,13 @@ const FileTemplate = ({ * * ${'@'}generated by codegen project: GenerateStateCpp.js */ -#include +${IncludeTemplate({headerPrefix, file: 'States.h'})} -namespace facebook { -namespace react { +namespace facebook::react { ${stateClasses} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; const StateTemplate = ({stateName}: {stateName: string}) => ''; @@ -49,6 +49,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'States.cpp'; @@ -83,8 +84,8 @@ module.exports = { .join('\n'); const replacedTemplate = FileTemplate({ - libraryName, stateClasses, + headerPrefix: headerPrefix ?? '', }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/components/GenerateStateH.js b/packages/react-native-codegen/src/generators/components/GenerateStateH.js index 658142eaea04eb..3aee725fca3058 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateStateH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateStateH.js @@ -39,13 +39,11 @@ const FileTemplate = ({ #include #endif -namespace facebook { -namespace react { +namespace facebook::react { ${stateClasses} -} // namespace react -} // namespace facebook +} // namespace facebook::react `.trim(); const StateTemplate = ({stateName}: {stateName: string}) => @@ -72,6 +70,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'States.h'; diff --git a/packages/react-native-codegen/src/generators/components/GenerateTests.js b/packages/react-native-codegen/src/generators/components/GenerateTests.js index 95f51da618d3dc..8017f933ef4467 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateTests.js +++ b/packages/react-native-codegen/src/generators/components/GenerateTests.js @@ -12,9 +12,8 @@ import type {ComponentShape, PropTypeAnnotation} from '../../CodegenSchema'; import type {SchemaType} from '../../CodegenSchema'; -const {getImports} = require('./CppHelpers'); - const {toSafeCppString} = require('../Utils'); +const {getImports} = require('./CppHelpers'); type FilesOutput = Map; type PropValueType = string | number | boolean; @@ -172,6 +171,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const fileName = 'Tests.cpp'; const allImports = new Set([ diff --git a/packages/react-native-codegen/src/generators/components/GenerateThirdPartyFabricComponentsProviderH.js b/packages/react-native-codegen/src/generators/components/GenerateThirdPartyFabricComponentsProviderH.js index 40b168372af7c1..cc42edb5a04b1e 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateThirdPartyFabricComponentsProviderH.js @@ -12,6 +12,10 @@ import type {SchemaType} from '../../CodegenSchema'; +const { + generateSupportedApplePlatformsMacro, +} = require('./ComponentsProviderUtils'); + // File path -> contents type FilesOutput = Map; @@ -35,11 +39,12 @@ extern "C" { #endif Class RCTThirdPartyFabricComponentsProvider(const char *name); - +#if RCT_NEW_ARCH_ENABLED #ifndef RCT_DYNAMIC_FRAMEWORKS ${lookupFuncs} +#endif #endif #ifdef __cplusplus @@ -62,13 +67,18 @@ Class ${className}Cls(void) __attribute__((used)); // `.trim(); module.exports = { - generate(schemas: {[string]: SchemaType}): FilesOutput { + generate( + schemas: {[string]: SchemaType}, + supportedApplePlatforms?: {[string]: {[string]: boolean}}, + ): FilesOutput { const fileName = 'RCTThirdPartyFabricComponentsProvider.h'; const lookupFuncs = Object.keys(schemas) .map(libraryName => { const schema = schemas[libraryName]; - return Object.keys(schema.modules) + const librarySupportedApplePlatforms = + supportedApplePlatforms?.[libraryName]; + const generatedLookup = Object.keys(schema.modules) .map(moduleName => { const module = schema.modules[moduleName]; if (module.type !== 'Component') { @@ -99,6 +109,11 @@ module.exports = { }) .filter(Boolean) .join('\n'); + + return generateSupportedApplePlatformsMacro( + generatedLookup, + librarySupportedApplePlatforms, + ); }) .join('\n'); diff --git a/packages/react-native-codegen/src/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js b/packages/react-native-codegen/src/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js index 06e964845d3f52..ad99c964437eaa 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js @@ -12,6 +12,10 @@ import type {SchemaType} from '../../CodegenSchema'; +const { + generateSupportedApplePlatformsMacro, +} = require('./ComponentsProviderUtils'); + // File path -> contents type FilesOutput = Map; @@ -34,9 +38,11 @@ const FileTemplate = ({lookupMap}: {lookupMap: string}) => ` Class RCTThirdPartyFabricComponentsProvider(const char *name) { static std::unordered_map sFabricComponentsClassMap = { + #if RCT_NEW_ARCH_ENABLED #ifndef RCT_DYNAMIC_FRAMEWORKS ${lookupMap} #endif + #endif }; auto p = sFabricComponentsClassMap.find(name); @@ -58,13 +64,19 @@ const LookupMapTemplate = ({ {"${className}", ${className}Cls}, // ${libraryName}`; module.exports = { - generate(schemas: {[string]: SchemaType}): FilesOutput { + generate( + schemas: {[string]: SchemaType}, + supportedApplePlatforms?: {[string]: {[string]: boolean}}, + ): FilesOutput { const fileName = 'RCTThirdPartyFabricComponentsProvider.mm'; const lookupMap = Object.keys(schemas) .map(libraryName => { const schema = schemas[libraryName]; - return Object.keys(schema.modules) + const librarySupportedApplePlatforms = + supportedApplePlatforms?.[libraryName]; + + const generatedLookup = Object.keys(schema.modules) .map(moduleName => { const module = schema.modules[moduleName]; if (module.type !== 'Component') { @@ -96,7 +108,13 @@ module.exports = { return componentTemplates.length > 0 ? componentTemplates : null; }) - .filter(Boolean); + .filter(Boolean) + .join('\n'); + + return generateSupportedApplePlatformsMacro( + generatedLookup, + librarySupportedApplePlatforms, + ); }) .join('\n'); diff --git a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js index c8d96823129b78..f09b38c7885f52 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js +++ b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js @@ -197,7 +197,7 @@ function generateBubblingEventInfo( ) { return j.property( 'init', - j.identifier(nameOveride || normalizeInputEventName(event.name)), + j.identifier(normalizeInputEventName(nameOveride || event.name)), j.objectExpression([ j.property( 'init', @@ -221,7 +221,7 @@ function generateDirectEventInfo( ) { return j.property( 'init', - j.identifier(nameOveride || normalizeInputEventName(event.name)), + j.identifier(normalizeInputEventName(nameOveride || event.name)), j.objectExpression([ j.property( 'init', diff --git a/packages/react-native-codegen/src/generators/components/JavaHelpers.js b/packages/react-native-codegen/src/generators/components/JavaHelpers.js index 48556d47db6636..9b835bb6f91820 100644 --- a/packages/react-native-codegen/src/generators/components/JavaHelpers.js +++ b/packages/react-native-codegen/src/generators/components/JavaHelpers.js @@ -127,6 +127,15 @@ function getImports( } }); + component.commands.forEach(command => { + command.typeAnnotation.params.forEach(param => { + const cmdParamType = param.typeAnnotation.type; + if (cmdParamType === 'ArrayTypeAnnotation') { + imports.add('import com.facebook.react.bridge.ReadableArray;'); + } + }); + }); + return imports; } diff --git a/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js index 65f7a46d25ba2c..3b6915f33f9ec2 100644 --- a/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js @@ -1726,6 +1726,28 @@ const COMMANDS_AND_PROPS: SchemaType = { }, }, }, + { + name: 'addItems', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + params: [ + { + name: 'items', + optional: false, + typeAnnotation: { + type: 'ArrayTypeAnnotation', + elementType: { + type: 'StringTypeAnnotation', + }, + }, + }, + ], + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + }, + }, ], }, }, diff --git a/packages/react-native-codegen/src/generators/components/__tests__/GenerateComponentDescriptorCpp-test.js b/packages/react-native-codegen/src/generators/components/__tests__/GenerateComponentDescriptorCpp-test.js new file mode 100644 index 00000000000000..ebef5169033a4c --- /dev/null +++ b/packages/react-native-codegen/src/generators/components/__tests__/GenerateComponentDescriptorCpp-test.js @@ -0,0 +1,35 @@ +/** + * 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 + */ + +'use strict'; + +const fixtures = require('../__test_fixtures__/fixtures.js'); +const generator = require('../GenerateComponentDescriptorCpp.js'); + +describe('GenerateComponentDescriptorCpp', () => { + Object.keys(fixtures) + .sort() + .forEach(fixtureName => { + const fixture = fixtures[fixtureName]; + + it(`can generate fixture ${fixtureName}`, () => { + expect( + generator.generate( + fixtureName, + fixture, + '', + false, + `react/renderer/components/${fixtureName}/`, + ), + ).toMatchSnapshot(); + }); + }); +}); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/GenerateComponentDescriptorH-test.js b/packages/react-native-codegen/src/generators/components/__tests__/GenerateComponentDescriptorH-test.js index 4074282cc57a38..e82eddd170c32a 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/GenerateComponentDescriptorH-test.js +++ b/packages/react-native-codegen/src/generators/components/__tests__/GenerateComponentDescriptorH-test.js @@ -21,7 +21,15 @@ describe('GenerateComponentDescriptorH', () => { const fixture = fixtures[fixtureName]; it(`can generate fixture ${fixtureName}`, () => { - expect(generator.generate(fixtureName, fixture)).toMatchSnapshot(); + expect( + generator.generate( + fixtureName, + fixture, + '', + false, + `react/renderer/components/${fixtureName}/`, + ), + ).toMatchSnapshot(); }); }); }); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/GenerateEventEmitterCpp-test.js b/packages/react-native-codegen/src/generators/components/__tests__/GenerateEventEmitterCpp-test.js index 11c6328ab729da..65edf61ff7c5ef 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/GenerateEventEmitterCpp-test.js +++ b/packages/react-native-codegen/src/generators/components/__tests__/GenerateEventEmitterCpp-test.js @@ -21,7 +21,15 @@ describe('GenerateEventEmitterCpp', () => { const fixture = fixtures[fixtureName]; it(`can generate fixture ${fixtureName}`, () => { - expect(generator.generate(fixtureName, fixture)).toMatchSnapshot(); + expect( + generator.generate( + fixtureName, + fixture, + '', + false, + `react/renderer/components/${fixtureName}/`, + ), + ).toMatchSnapshot(); }); }); }); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/GeneratePropsCpp-test.js b/packages/react-native-codegen/src/generators/components/__tests__/GeneratePropsCpp-test.js index ff77b09ca49b77..0ee57230d1c1c0 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/GeneratePropsCpp-test.js +++ b/packages/react-native-codegen/src/generators/components/__tests__/GeneratePropsCpp-test.js @@ -21,7 +21,15 @@ describe('GeneratePropsCpp', () => { const fixture = fixtures[fixtureName]; it(`can generate fixture ${fixtureName}`, () => { - expect(generator.generate(fixtureName, fixture)).toMatchSnapshot(); + expect( + generator.generate( + fixtureName, + fixture, + '', + false, + `react/renderer/components/${fixtureName}/`, + ), + ).toMatchSnapshot(); }); }); }); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/GenerateShadowNodeCpp-test.js b/packages/react-native-codegen/src/generators/components/__tests__/GenerateShadowNodeCpp-test.js index 3acb8162fe65a3..71903e8b92e334 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/GenerateShadowNodeCpp-test.js +++ b/packages/react-native-codegen/src/generators/components/__tests__/GenerateShadowNodeCpp-test.js @@ -22,7 +22,13 @@ describe('GenerateShadowNodeCpp', () => { it(`can generate fixture ${fixtureName}`, () => { expect( - generator.generate(fixtureName, fixture, 'SampleSpec'), + generator.generate( + fixtureName, + fixture, + 'SampleSpec', + false, + `react/renderer/components/${fixtureName}/`, + ), ).toMatchSnapshot(); }); }); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/GenerateShadowNodeH-test.js b/packages/react-native-codegen/src/generators/components/__tests__/GenerateShadowNodeH-test.js index cafe5cf886f75b..0ab80f0b559e19 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/GenerateShadowNodeH-test.js +++ b/packages/react-native-codegen/src/generators/components/__tests__/GenerateShadowNodeH-test.js @@ -21,7 +21,15 @@ describe('GenerateShadowNodeH', () => { const fixture = fixtures[fixtureName]; it(`can generate fixture ${fixtureName}`, () => { - expect(generator.generate(fixtureName, fixture)).toMatchSnapshot(); + expect( + generator.generate( + fixtureName, + fixture, + '', + false, + `react/renderer/components/${fixtureName}/`, + ), + ).toMatchSnapshot(); }); }); }); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/GenerateStateCpp-test.js b/packages/react-native-codegen/src/generators/components/__tests__/GenerateStateCpp-test.js index 1ccba96ba02d9b..218bf057b4aa0b 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/GenerateStateCpp-test.js +++ b/packages/react-native-codegen/src/generators/components/__tests__/GenerateStateCpp-test.js @@ -21,7 +21,15 @@ describe('GenerateStateCpp', () => { const fixture = fixtures[fixtureName]; it(`can generate fixture ${fixtureName}`, () => { - expect(generator.generate(fixtureName, fixture)).toMatchSnapshot(); + expect( + generator.generate( + fixtureName, + fixture, + '', + false, + `react/renderer/components/${fixtureName}/`, + ), + ).toMatchSnapshot(); }); }); }); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentDescriptorCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentDescriptorCpp-test.js.snap new file mode 100644 index 00000000000000..84accf396ae90a --- /dev/null +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentDescriptorCpp-test.js.snap @@ -0,0 +1,816 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateComponentDescriptorCpp can generate fixture ARRAY_PROPS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void ARRAY_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture ARRAY_PROPS_WITH_NESTED_OBJECT 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void ARRAY_PROPS_WITH_NESTED_OBJECT_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture BOOLEAN_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void BOOLEAN_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture COLOR_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void COLOR_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture COMMANDS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void COMMANDS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture COMMANDS_AND_PROPS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void COMMANDS_AND_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture DIMENSION_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void DIMENSION_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture DOUBLE_PROPS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void DOUBLE_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture EVENT_NESTED_OBJECT_PROPS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void EVENT_NESTED_OBJECT_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture EVENT_PROPS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void EVENT_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture EVENTS_WITH_PAPER_NAME 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void EVENTS_WITH_PAPER_NAME_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { + +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture EXCLUDE_ANDROID 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void EXCLUDE_ANDROID_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture EXCLUDE_ANDROID_IOS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void EXCLUDE_ANDROID_IOS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture EXCLUDE_IOS_TWO_COMPONENTS_DIFFERENT_FILES 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void EXCLUDE_IOS_TWO_COMPONENTS_DIFFERENT_FILES_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture FLOAT_PROPS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void FLOAT_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture IMAGE_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void IMAGE_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture INSETS_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void INSETS_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture INT32_ENUM_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void INT32_ENUM_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture INTEGER_PROPS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void INTEGER_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture INTERFACE_ONLY 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void INTERFACE_ONLY_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { + +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture MIXED_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void MIXED_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture MULTI_NATIVE_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void MULTI_NATIVE_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture NO_PROPS_NO_EVENTS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void NO_PROPS_NO_EVENTS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture OBJECT_PROPS 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void OBJECT_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture POINT_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void POINT_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture STRING_ENUM_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void STRING_ENUM_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture STRING_PROP 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void STRING_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture TWO_COMPONENTS_DIFFERENT_FILES 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void TWO_COMPONENTS_DIFFERENT_FILES_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; + +exports[`GenerateComponentDescriptorCpp can generate fixture TWO_COMPONENTS_SAME_FILE 1`] = ` +Map { + "ComponentDescriptors.cpp" => " +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateComponentDescriptorCpp.js + */ + +#include +#include +#include + +namespace facebook::react { + +void TWO_COMPONENTS_SAME_FILE_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry) { +registry->add(concreteComponentDescriptorProvider()); +registry->add(concreteComponentDescriptorProvider()); +} + +} // namespace facebook::react +", +} +`; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentDescriptorH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentDescriptorH-test.js.snap index 72653d4c56f282..605f4a21938960 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentDescriptorH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentDescriptorH-test.js.snap @@ -16,14 +16,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ArrayPropsNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void ARRAY_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -44,14 +46,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ArrayPropsNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void ARRAY_PROPS_WITH_NESTED_OBJECT_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -72,14 +76,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using BooleanPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void BOOLEAN_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -100,14 +106,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ColorPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void COLOR_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -128,14 +136,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using CommandNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void COMMANDS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -156,14 +166,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using CommandNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void COMMANDS_AND_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -184,14 +196,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using DimensionPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void DIMENSION_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -212,14 +226,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using DoublePropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void DOUBLE_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -240,14 +256,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using EventsNestedObjectNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void EVENT_NESTED_OBJECT_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -268,14 +286,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using EventsNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void EVENT_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -296,14 +316,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +void EVENTS_WITH_PAPER_NAME_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -324,14 +346,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ExcludedAndroidComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void EXCLUDE_ANDROID_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -352,14 +376,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ExcludedAndroidIosComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void EXCLUDE_ANDROID_IOS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -380,15 +406,17 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ExcludedIosComponentComponentDescriptor = ConcreteComponentDescriptor; using MultiFileIncludedNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void EXCLUDE_IOS_TWO_COMPONENTS_DIFFERENT_FILES_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -409,14 +437,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using FloatPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void FLOAT_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -437,14 +467,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ImagePropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void IMAGE_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -465,14 +497,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using InsetsPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void INSETS_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -493,14 +527,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using Int32EnumPropsNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void INT32_ENUM_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -521,14 +557,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using IntegerPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void INTEGER_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -549,14 +587,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +void INTERFACE_ONLY_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -577,14 +617,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using MixedPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void MIXED_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -605,14 +647,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ImageColorPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void MULTI_NATIVE_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -633,14 +677,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using NoPropsNoEventsComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void NO_PROPS_NO_EVENTS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -661,14 +707,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using ObjectPropsComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void OBJECT_PROPS_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -689,14 +737,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using PointPropNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void POINT_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -717,14 +767,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using StringEnumPropsNativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void STRING_ENUM_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -745,14 +797,16 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using StringPropComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void STRING_PROP_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -773,15 +827,17 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using MultiFile1NativeComponentComponentDescriptor = ConcreteComponentDescriptor; using MultiFile2NativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void TWO_COMPONENTS_DIFFERENT_FILES_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; @@ -802,15 +858,17 @@ Map { #include #include +#include -namespace facebook { -namespace react { +namespace facebook::react { using MultiComponent1NativeComponentComponentDescriptor = ConcreteComponentDescriptor; using MultiComponent2NativeComponentComponentDescriptor = ConcreteComponentDescriptor; -} // namespace react -} // namespace facebook +void TWO_COMPONENTS_SAME_FILE_registerComponentDescriptorsFromCodegen( + std::shared_ptr registry); + +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentHObjCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentHObjCpp-test.js.snap index b232a9446ff12f..c8b74b0aeb278e 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentHObjCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentHObjCpp-test.js.snap @@ -222,6 +222,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol RCTCommandNativeComponentViewProtocol - (void)handleRootTag:(double)rootTag; - (void)hotspotUpdate:(NSInteger)x y:(NSInteger)y; +- (void)addItems:(const NSArray *)items; @end RCT_EXTERN inline void RCTCommandNativeComponentHandleCommand( @@ -277,6 +278,26 @@ NSObject *arg1 = args[1]; return; } +if ([commandName isEqualToString:@\\"addItems\\"]) { +#if RCT_DEBUG + if ([args count] != 1) { + RCTLogError(@\\"%@ command %@ received %d arguments, expected %d.\\", @\\"CommandNativeComponent\\", commandName, (int)[args count], 1); + return; + } +#endif + + NSObject *arg0 = args[0]; +#if RCT_DEBUG + if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSArray class], @\\"array\\", @\\"CommandNativeComponent\\", commandName, @\\"1st\\")) { + return; + } +#endif + const NSArray * items = (NSArray *)arg0; + + [componentView addItems:items]; + return; +} + #if RCT_DEBUG RCTLogError(@\\"%@ received command %@, which is not a supported command.\\", @\\"CommandNativeComponent\\", commandName); #endif diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap index 2ec6051506eab0..ff3dea1de62bda 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap @@ -15,11 +15,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -39,11 +37,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -63,11 +59,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -87,11 +81,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -111,11 +103,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -135,11 +125,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -159,11 +147,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -183,11 +169,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -207,8 +191,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { void EventsNestedObjectNativeComponentEventEmitter::onChange(OnChange $event) const { dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) { @@ -228,8 +211,7 @@ void EventsNestedObjectNativeComponentEventEmitter::onChange(OnChange $event) co }); } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -249,8 +231,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { void EventsNativeComponentEventEmitter::onChange(OnChange $event) const { dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) { @@ -357,8 +338,7 @@ void EventsNativeComponentEventEmitter::onEventWithMixedPropAttribute(OnEventWit }); } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -378,11 +358,10 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { void InterfaceOnlyComponentEventEmitter::onChange(OnChange $event) const { - dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) { + dispatchEvent(\\"paperChange\\", [$event=std::move($event)](jsi::Runtime &runtime) { auto $payload = jsi::Object(runtime); $payload.setProperty(runtime, \\"value\\", $event.value); return $payload; @@ -391,15 +370,14 @@ void InterfaceOnlyComponentEventEmitter::onChange(OnChange $event) const { void InterfaceOnlyComponentEventEmitter::onDirectChange(OnDirectChange $event) const { - dispatchEvent(\\"directChange\\", [$event=std::move($event)](jsi::Runtime &runtime) { + dispatchEvent(\\"paperDirectChange\\", [$event=std::move($event)](jsi::Runtime &runtime) { auto $payload = jsi::Object(runtime); $payload.setProperty(runtime, \\"value\\", $event.value); return $payload; }); } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -419,11 +397,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -443,11 +419,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -467,12 +441,10 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -492,11 +464,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -516,11 +486,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -540,11 +508,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -564,11 +530,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -588,11 +552,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -612,8 +574,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { void InterfaceOnlyComponentEventEmitter::onChange(OnChange $event) const { dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) { @@ -623,8 +584,7 @@ void InterfaceOnlyComponentEventEmitter::onChange(OnChange $event) const { }); } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -644,11 +604,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -668,11 +626,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -692,11 +648,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -716,11 +670,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -740,11 +692,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -764,11 +714,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -788,11 +736,9 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -812,12 +758,10 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -837,12 +781,10 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterH-test.js.snap index ca4237ab4d7474..b6de40820ccb6d 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterH-test.js.snap @@ -16,8 +16,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ArrayPropsNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -25,8 +24,7 @@ class ArrayPropsNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -47,8 +45,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ArrayPropsNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -56,8 +53,7 @@ class ArrayPropsNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -78,8 +74,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class BooleanPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -87,8 +82,7 @@ class BooleanPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -109,8 +103,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ColorPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -118,8 +111,7 @@ class ColorPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -140,8 +132,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class CommandNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -149,8 +140,7 @@ class CommandNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -171,8 +161,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class CommandNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -180,8 +169,7 @@ class CommandNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -202,8 +190,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class DimensionPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -211,8 +198,7 @@ class DimensionPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -233,8 +219,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class DoublePropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -242,8 +227,7 @@ class DoublePropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -264,8 +248,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class EventsNestedObjectNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -285,8 +268,7 @@ class EventsNestedObjectNativeComponentEventEmitter : public ViewEventEmitter { }; void onChange(OnChange value) const; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -307,8 +289,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class EventsNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -381,8 +362,7 @@ class EventsNativeComponentEventEmitter : public ViewEventEmitter { void onEventWithMixedPropAttribute(OnEventWithMixedPropAttribute value) const; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -403,8 +383,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class InterfaceOnlyComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -420,8 +399,7 @@ class InterfaceOnlyComponentEventEmitter : public ViewEventEmitter { void onDirectChange(OnDirectChange value) const; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -442,8 +420,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedAndroidComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -451,8 +428,7 @@ class ExcludedAndroidComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -473,8 +449,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedAndroidIosComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -482,8 +457,7 @@ class ExcludedAndroidIosComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -504,8 +478,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedIosComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -520,8 +493,7 @@ class MultiFileIncludedNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -542,8 +514,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class FloatPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -551,8 +522,7 @@ class FloatPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -573,8 +543,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ImagePropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -582,8 +551,7 @@ class ImagePropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -604,8 +572,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class InsetsPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -613,8 +580,7 @@ class InsetsPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -635,8 +601,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class Int32EnumPropsNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -644,8 +609,7 @@ class Int32EnumPropsNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -666,8 +630,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class IntegerPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -675,8 +638,7 @@ class IntegerPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -697,8 +659,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class InterfaceOnlyComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -708,8 +669,7 @@ class InterfaceOnlyComponentEventEmitter : public ViewEventEmitter { }; void onChange(OnChange value) const; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -730,8 +690,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class MixedPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -739,8 +698,7 @@ class MixedPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -761,8 +719,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ImageColorPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -770,8 +727,7 @@ class ImageColorPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -792,8 +748,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class NoPropsNoEventsComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -801,8 +756,7 @@ class NoPropsNoEventsComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -823,8 +777,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class ObjectPropsEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -832,8 +785,7 @@ class ObjectPropsEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -854,8 +806,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class PointPropNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -863,8 +814,7 @@ class PointPropNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -885,8 +835,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class StringEnumPropsNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -894,8 +843,7 @@ class StringEnumPropsNativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -916,8 +864,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class StringPropComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -925,8 +872,7 @@ class StringPropComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -947,8 +893,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class MultiFile1NativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -963,8 +908,7 @@ class MultiFile2NativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -985,8 +929,7 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { class MultiComponent1NativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; @@ -1001,8 +944,7 @@ class MultiComponent2NativeComponentEventEmitter : public ViewEventEmitter { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap index 2dd8e73764b4c6..8d21560f105d53 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap @@ -18,8 +18,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ArrayPropsNativeComponentProps::ArrayPropsNativeComponentProps( const PropsParserContext &context, @@ -40,8 +39,7 @@ ArrayPropsNativeComponentProps::ArrayPropsNativeComponentProps( arrayOfArrayOfObject(convertRawProp(context, rawProps, \\"arrayOfArrayOfObject\\", sourceProps.arrayOfArrayOfObject, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -62,8 +60,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ArrayPropsNativeComponentProps::ArrayPropsNativeComponentProps( const PropsParserContext &context, @@ -73,8 +70,7 @@ ArrayPropsNativeComponentProps::ArrayPropsNativeComponentProps( nativePrimitives(convertRawProp(context, rawProps, \\"nativePrimitives\\", sourceProps.nativePrimitives, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -95,8 +91,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { BooleanPropNativeComponentProps::BooleanPropNativeComponentProps( const PropsParserContext &context, @@ -106,8 +101,7 @@ BooleanPropNativeComponentProps::BooleanPropNativeComponentProps( disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -128,8 +122,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ColorPropNativeComponentProps::ColorPropNativeComponentProps( const PropsParserContext &context, @@ -139,8 +132,7 @@ ColorPropNativeComponentProps::ColorPropNativeComponentProps( tintColor(convertRawProp(context, rawProps, \\"tintColor\\", sourceProps.tintColor, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -161,8 +153,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { CommandNativeComponentProps::CommandNativeComponentProps( const PropsParserContext &context, @@ -172,8 +163,7 @@ CommandNativeComponentProps::CommandNativeComponentProps( {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -194,8 +184,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { CommandNativeComponentProps::CommandNativeComponentProps( const PropsParserContext &context, @@ -205,8 +194,7 @@ CommandNativeComponentProps::CommandNativeComponentProps( accessibilityHint(convertRawProp(context, rawProps, \\"accessibilityHint\\", sourceProps.accessibilityHint, {\\"\\"})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -228,8 +216,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { DimensionPropNativeComponentProps::DimensionPropNativeComponentProps( const PropsParserContext &context, @@ -239,8 +226,7 @@ DimensionPropNativeComponentProps::DimensionPropNativeComponentProps( marginBack(convertRawProp(context, rawProps, \\"marginBack\\", sourceProps.marginBack, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -261,8 +247,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { DoublePropNativeComponentProps::DoublePropNativeComponentProps( const PropsParserContext &context, @@ -277,8 +262,7 @@ DoublePropNativeComponentProps::DoublePropNativeComponentProps( blurRadius6(convertRawProp(context, rawProps, \\"blurRadius6\\", sourceProps.blurRadius6, {0.0})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -299,8 +283,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { EventsNestedObjectNativeComponentProps::EventsNestedObjectNativeComponentProps( const PropsParserContext &context, @@ -310,8 +293,7 @@ EventsNestedObjectNativeComponentProps::EventsNestedObjectNativeComponentProps( disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -332,8 +314,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { EventsNativeComponentProps::EventsNativeComponentProps( const PropsParserContext &context, @@ -343,8 +324,7 @@ EventsNativeComponentProps::EventsNativeComponentProps( disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -365,8 +345,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { InterfaceOnlyComponentProps::InterfaceOnlyComponentProps( const PropsParserContext &context, @@ -376,8 +355,7 @@ InterfaceOnlyComponentProps::InterfaceOnlyComponentProps( {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -398,8 +376,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ExcludedAndroidComponentProps::ExcludedAndroidComponentProps( const PropsParserContext &context, @@ -409,8 +386,7 @@ ExcludedAndroidComponentProps::ExcludedAndroidComponentProps( {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -431,8 +407,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ExcludedAndroidIosComponentProps::ExcludedAndroidIosComponentProps( const PropsParserContext &context, @@ -442,8 +417,7 @@ ExcludedAndroidIosComponentProps::ExcludedAndroidIosComponentProps( {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -464,8 +438,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ExcludedIosComponentProps::ExcludedIosComponentProps( const PropsParserContext &context, @@ -482,8 +455,7 @@ MultiFileIncludedNativeComponentProps::MultiFileIncludedNativeComponentProps( disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {true})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -504,8 +476,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { FloatPropNativeComponentProps::FloatPropNativeComponentProps( const PropsParserContext &context, @@ -520,8 +491,7 @@ FloatPropNativeComponentProps::FloatPropNativeComponentProps( blurRadius6(convertRawProp(context, rawProps, \\"blurRadius6\\", sourceProps.blurRadius6, {0.0})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -543,8 +513,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ImagePropNativeComponentProps::ImagePropNativeComponentProps( const PropsParserContext &context, @@ -554,8 +523,7 @@ ImagePropNativeComponentProps::ImagePropNativeComponentProps( thumbImage(convertRawProp(context, rawProps, \\"thumbImage\\", sourceProps.thumbImage, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -576,8 +544,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { InsetsPropNativeComponentProps::InsetsPropNativeComponentProps( const PropsParserContext &context, @@ -587,8 +554,7 @@ InsetsPropNativeComponentProps::InsetsPropNativeComponentProps( contentInset(convertRawProp(context, rawProps, \\"contentInset\\", sourceProps.contentInset, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -609,8 +575,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { Int32EnumPropsNativeComponentProps::Int32EnumPropsNativeComponentProps( const PropsParserContext &context, @@ -620,8 +585,7 @@ Int32EnumPropsNativeComponentProps::Int32EnumPropsNativeComponentProps( maxInterval(convertRawProp(context, rawProps, \\"maxInterval\\", sourceProps.maxInterval, {Int32EnumPropsNativeComponentMaxInterval::MaxInterval0})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -642,8 +606,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { IntegerPropNativeComponentProps::IntegerPropNativeComponentProps( const PropsParserContext &context, @@ -655,8 +618,7 @@ IntegerPropNativeComponentProps::IntegerPropNativeComponentProps( progress3(convertRawProp(context, rawProps, \\"progress3\\", sourceProps.progress3, {10})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -677,8 +639,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { InterfaceOnlyComponentProps::InterfaceOnlyComponentProps( const PropsParserContext &context, @@ -688,8 +649,7 @@ InterfaceOnlyComponentProps::InterfaceOnlyComponentProps( accessibilityHint(convertRawProp(context, rawProps, \\"accessibilityHint\\", sourceProps.accessibilityHint, {\\"\\"})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -711,8 +671,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { MixedPropNativeComponentProps::MixedPropNativeComponentProps( const PropsParserContext &context, @@ -722,8 +681,7 @@ MixedPropNativeComponentProps::MixedPropNativeComponentProps( mixedProp(convertRawProp(context, rawProps, \\"mixedProp\\", sourceProps.mixedProp, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -745,8 +703,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ImageColorPropNativeComponentProps::ImageColorPropNativeComponentProps( const PropsParserContext &context, @@ -759,8 +716,7 @@ ImageColorPropNativeComponentProps::ImageColorPropNativeComponentProps( point(convertRawProp(context, rawProps, \\"point\\", sourceProps.point, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -781,8 +737,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { NoPropsNoEventsComponentProps::NoPropsNoEventsComponentProps( const PropsParserContext &context, @@ -792,8 +747,7 @@ NoPropsNoEventsComponentProps::NoPropsNoEventsComponentProps( {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -815,8 +769,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { ObjectPropsProps::ObjectPropsProps( const PropsParserContext &context, @@ -826,8 +779,7 @@ ObjectPropsProps::ObjectPropsProps( objectProp(convertRawProp(context, rawProps, \\"objectProp\\", sourceProps.objectProp, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -848,8 +800,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { PointPropNativeComponentProps::PointPropNativeComponentProps( const PropsParserContext &context, @@ -859,8 +810,7 @@ PointPropNativeComponentProps::PointPropNativeComponentProps( startPoint(convertRawProp(context, rawProps, \\"startPoint\\", sourceProps.startPoint, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -881,8 +831,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { StringEnumPropsNativeComponentProps::StringEnumPropsNativeComponentProps( const PropsParserContext &context, @@ -892,8 +841,7 @@ StringEnumPropsNativeComponentProps::StringEnumPropsNativeComponentProps( alignment(convertRawProp(context, rawProps, \\"alignment\\", sourceProps.alignment, {StringEnumPropsNativeComponentAlignment::Center})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -914,8 +862,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { StringPropComponentProps::StringPropComponentProps( const PropsParserContext &context, @@ -926,8 +873,7 @@ StringPropComponentProps::StringPropComponentProps( accessibilityRole(convertRawProp(context, rawProps, \\"accessibilityRole\\", sourceProps.accessibilityRole, {})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -948,8 +894,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { MultiFile1NativeComponentProps::MultiFile1NativeComponentProps( const PropsParserContext &context, @@ -966,8 +911,7 @@ MultiFile2NativeComponentProps::MultiFile2NativeComponentProps( disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {true})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -988,8 +932,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { MultiComponent1NativeComponentProps::MultiComponent1NativeComponentProps( const PropsParserContext &context, @@ -1006,8 +949,7 @@ MultiComponent2NativeComponentProps::MultiComponent2NativeComponentProps( disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {true})) {} -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap index d22ef6b85965ab..de244b9f33b380 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap @@ -23,8 +23,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { using ArrayPropsNativeComponentSizesMask = uint32_t; @@ -213,8 +212,7 @@ class ArrayPropsNativeComponentProps final : public ViewProps { std::vector> arrayOfArrayOfObject{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -241,8 +239,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { struct ArrayPropsNativeComponentNativePrimitivesStruct { std::vector colors; @@ -290,8 +287,7 @@ class ArrayPropsNativeComponentProps final : public ViewProps { std::vector nativePrimitives{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -312,8 +308,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class BooleanPropNativeComponentProps final : public ViewProps { public: @@ -325,8 +320,7 @@ class BooleanPropNativeComponentProps final : public ViewProps { bool disabled{false}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -348,8 +342,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class ColorPropNativeComponentProps final : public ViewProps { public: @@ -361,8 +354,7 @@ class ColorPropNativeComponentProps final : public ViewProps { SharedColor tintColor{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -383,8 +375,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class CommandNativeComponentProps final : public ViewProps { public: @@ -396,8 +387,7 @@ class CommandNativeComponentProps final : public ViewProps { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -418,8 +408,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class CommandNativeComponentProps final : public ViewProps { public: @@ -431,8 +420,7 @@ class CommandNativeComponentProps final : public ViewProps { std::string accessibilityHint{\\"\\"}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -454,8 +442,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class DimensionPropNativeComponentProps final : public ViewProps { public: @@ -467,8 +454,7 @@ class DimensionPropNativeComponentProps final : public ViewProps { YGValue marginBack{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -489,8 +475,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class DoublePropNativeComponentProps final : public ViewProps { public: @@ -507,8 +492,7 @@ class DoublePropNativeComponentProps final : public ViewProps { double blurRadius6{0.0}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -529,8 +513,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class EventsNestedObjectNativeComponentProps final : public ViewProps { public: @@ -542,8 +525,7 @@ class EventsNestedObjectNativeComponentProps final : public ViewProps { bool disabled{false}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -564,8 +546,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class EventsNativeComponentProps final : public ViewProps { public: @@ -577,8 +558,7 @@ class EventsNativeComponentProps final : public ViewProps { bool disabled{false}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -599,8 +579,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class InterfaceOnlyComponentProps final : public ViewProps { public: @@ -612,8 +591,7 @@ class InterfaceOnlyComponentProps final : public ViewProps { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -634,8 +612,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedAndroidComponentProps final : public ViewProps { public: @@ -647,8 +624,7 @@ class ExcludedAndroidComponentProps final : public ViewProps { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -669,8 +645,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedAndroidIosComponentProps final : public ViewProps { public: @@ -682,8 +657,7 @@ class ExcludedAndroidIosComponentProps final : public ViewProps { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -704,8 +678,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedIosComponentProps final : public ViewProps { public: @@ -727,8 +700,7 @@ class MultiFileIncludedNativeComponentProps final : public ViewProps { bool disabled{true}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -749,8 +721,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class FloatPropNativeComponentProps final : public ViewProps { public: @@ -767,8 +738,7 @@ class FloatPropNativeComponentProps final : public ViewProps { Float blurRadius6{0.0}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -790,8 +760,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class ImagePropNativeComponentProps final : public ViewProps { public: @@ -803,8 +772,7 @@ class ImagePropNativeComponentProps final : public ViewProps { ImageSource thumbImage{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -826,8 +794,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class InsetsPropNativeComponentProps final : public ViewProps { public: @@ -839,8 +806,7 @@ class InsetsPropNativeComponentProps final : public ViewProps { EdgeInsets contentInset{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -861,8 +827,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { enum class Int32EnumPropsNativeComponentMaxInterval { MaxInterval0 = 0, MaxInterval1 = 1, MaxInterval2 = 2 }; @@ -901,8 +866,7 @@ class Int32EnumPropsNativeComponentProps final : public ViewProps { Int32EnumPropsNativeComponentMaxInterval maxInterval{Int32EnumPropsNativeComponentMaxInterval::MaxInterval0}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -923,8 +887,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class IntegerPropNativeComponentProps final : public ViewProps { public: @@ -938,8 +901,7 @@ class IntegerPropNativeComponentProps final : public ViewProps { int progress3{10}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -960,8 +922,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class InterfaceOnlyComponentProps final : public ViewProps { public: @@ -973,8 +934,7 @@ class InterfaceOnlyComponentProps final : public ViewProps { std::string accessibilityHint{\\"\\"}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -995,8 +955,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class MixedPropNativeComponentProps final : public ViewProps { public: @@ -1008,8 +967,7 @@ class MixedPropNativeComponentProps final : public ViewProps { folly::dynamic mixedProp{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1033,8 +991,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class ImageColorPropNativeComponentProps final : public ViewProps { public: @@ -1049,8 +1006,7 @@ class ImageColorPropNativeComponentProps final : public ViewProps { Point point{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1071,8 +1027,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class NoPropsNoEventsComponentProps final : public ViewProps { public: @@ -1084,8 +1039,7 @@ class NoPropsNoEventsComponentProps final : public ViewProps { }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1112,8 +1066,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { enum class ObjectPropsStringEnumProp { Option1 }; @@ -1339,8 +1292,7 @@ class ObjectPropsProps final : public ViewProps { ObjectPropsObjectPropStruct objectProp{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1362,8 +1314,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class PointPropNativeComponentProps final : public ViewProps { public: @@ -1375,8 +1326,7 @@ class PointPropNativeComponentProps final : public ViewProps { Point startPoint{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1397,8 +1347,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { enum class StringEnumPropsNativeComponentAlignment { Top, Center, BottomRight }; @@ -1428,8 +1377,7 @@ class StringEnumPropsNativeComponentProps final : public ViewProps { StringEnumPropsNativeComponentAlignment alignment{StringEnumPropsNativeComponentAlignment::Center}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1450,8 +1398,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class StringPropComponentProps final : public ViewProps { public: @@ -1464,8 +1411,7 @@ class StringPropComponentProps final : public ViewProps { std::string accessibilityRole{}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1486,8 +1432,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class MultiFile1NativeComponentProps final : public ViewProps { public: @@ -1509,8 +1454,7 @@ class MultiFile2NativeComponentProps final : public ViewProps { bool disabled{true}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1531,8 +1475,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class MultiComponent1NativeComponentProps final : public ViewProps { public: @@ -1554,8 +1497,7 @@ class MultiComponent2NativeComponentProps final : public ViewProps { bool disabled{true}; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap index 9bec5993102bd3..3e4de5ef984867 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap @@ -271,6 +271,9 @@ public class CommandNativeComponentManagerDelegate { void setAccessibilityHint(T view, @Nullable String value); void handleRootTag(T view, double rootTag); void hotspotUpdate(T view, int x, int y); + void addItems(T view, ReadableArray items); } ", } diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateShadowNodeCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateShadowNodeCpp-test.js.snap index 6172d9ae625739..fb6c6404a1ee45 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateShadowNodeCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateShadowNodeCpp-test.js.snap @@ -14,13 +14,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ArrayPropsNativeComponentComponentName[] = \\"ArrayPropsNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -39,13 +37,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ArrayPropsNativeComponentComponentName[] = \\"ArrayPropsNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -64,13 +60,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char BooleanPropNativeComponentComponentName[] = \\"BooleanPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -89,13 +83,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ColorPropNativeComponentComponentName[] = \\"ColorPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -114,13 +106,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char CommandNativeComponentComponentName[] = \\"CommandNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -139,13 +129,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char CommandNativeComponentComponentName[] = \\"CommandNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -164,13 +152,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char DimensionPropNativeComponentComponentName[] = \\"DimensionPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -189,13 +175,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char DoublePropNativeComponentComponentName[] = \\"DoublePropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -214,13 +198,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char EventsNestedObjectNativeComponentComponentName[] = \\"EventsNestedObjectNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -239,13 +221,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char EventsNativeComponentComponentName[] = \\"EventsNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -264,13 +244,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -289,13 +267,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ExcludedAndroidComponentComponentName[] = \\"ExcludedAndroidComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -314,13 +290,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ExcludedAndroidIosComponentComponentName[] = \\"ExcludedAndroidIosComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -339,14 +313,12 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ExcludedIosComponentComponentName[] = \\"ExcludedIosComponent\\"; extern const char MultiFileIncludedNativeComponentComponentName[] = \\"MultiFileIncludedNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -365,13 +337,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char FloatPropNativeComponentComponentName[] = \\"FloatPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -390,13 +360,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ImagePropNativeComponentComponentName[] = \\"ImagePropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -415,13 +383,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char InsetsPropNativeComponentComponentName[] = \\"InsetsPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -440,13 +406,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char Int32EnumPropsNativeComponentComponentName[] = \\"Int32EnumPropsNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -465,13 +429,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char IntegerPropNativeComponentComponentName[] = \\"IntegerPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -490,13 +452,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -515,13 +475,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char MixedPropNativeComponentComponentName[] = \\"MixedPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -540,13 +498,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ImageColorPropNativeComponentComponentName[] = \\"ImageColorPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -565,13 +521,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char NoPropsNoEventsComponentComponentName[] = \\"NoPropsNoEventsComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -590,13 +544,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char ObjectPropsComponentName[] = \\"ObjectProps\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -615,13 +567,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char PointPropNativeComponentComponentName[] = \\"PointPropNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -640,13 +590,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char StringEnumPropsNativeComponentComponentName[] = \\"StringEnumPropsNativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -665,13 +613,11 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char StringPropComponentComponentName[] = \\"StringPropComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -690,14 +636,12 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char MultiFile1NativeComponentComponentName[] = \\"MultiFile1NativeComponent\\"; extern const char MultiFile2NativeComponentComponentName[] = \\"MultiFile2NativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -716,14 +660,12 @@ Map { #include -namespace facebook { -namespace react { +namespace facebook::react { extern const char MultiComponent1NativeComponentComponentName[] = \\"MultiComponent1NativeComponent\\"; extern const char MultiComponent2NativeComponentComponentName[] = \\"MultiComponent2NativeComponent\\"; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateShadowNodeH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateShadowNodeH-test.js.snap index f8e76bfa9e41d2..00c65ca1865cbc 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateShadowNodeH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateShadowNodeH-test.js.snap @@ -20,8 +20,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ArrayPropsNativeComponentComponentName[]; @@ -34,8 +33,7 @@ using ArrayPropsNativeComponentShadowNode = ConcreteViewShadowNode< ArrayPropsNativeComponentEventEmitter, ArrayPropsNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -60,8 +58,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ArrayPropsNativeComponentComponentName[]; @@ -74,8 +71,7 @@ using ArrayPropsNativeComponentShadowNode = ConcreteViewShadowNode< ArrayPropsNativeComponentEventEmitter, ArrayPropsNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -100,8 +96,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char BooleanPropNativeComponentComponentName[]; @@ -114,8 +109,7 @@ using BooleanPropNativeComponentShadowNode = ConcreteViewShadowNode< BooleanPropNativeComponentEventEmitter, BooleanPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -140,8 +134,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ColorPropNativeComponentComponentName[]; @@ -154,8 +147,7 @@ using ColorPropNativeComponentShadowNode = ConcreteViewShadowNode< ColorPropNativeComponentEventEmitter, ColorPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -180,8 +172,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char CommandNativeComponentComponentName[]; @@ -194,8 +185,7 @@ using CommandNativeComponentShadowNode = ConcreteViewShadowNode< CommandNativeComponentEventEmitter, CommandNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -220,8 +210,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char CommandNativeComponentComponentName[]; @@ -234,8 +223,7 @@ using CommandNativeComponentShadowNode = ConcreteViewShadowNode< CommandNativeComponentEventEmitter, CommandNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -260,8 +248,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char DimensionPropNativeComponentComponentName[]; @@ -274,8 +261,7 @@ using DimensionPropNativeComponentShadowNode = ConcreteViewShadowNode< DimensionPropNativeComponentEventEmitter, DimensionPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -300,8 +286,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char DoublePropNativeComponentComponentName[]; @@ -314,8 +299,7 @@ using DoublePropNativeComponentShadowNode = ConcreteViewShadowNode< DoublePropNativeComponentEventEmitter, DoublePropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -340,8 +324,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char EventsNestedObjectNativeComponentComponentName[]; @@ -354,8 +337,7 @@ using EventsNestedObjectNativeComponentShadowNode = ConcreteViewShadowNode< EventsNestedObjectNativeComponentEventEmitter, EventsNestedObjectNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -380,8 +362,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char EventsNativeComponentComponentName[]; @@ -394,8 +375,7 @@ using EventsNativeComponentShadowNode = ConcreteViewShadowNode< EventsNativeComponentEventEmitter, EventsNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -420,13 +400,11 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -451,8 +429,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ExcludedAndroidComponentComponentName[]; @@ -465,8 +442,7 @@ using ExcludedAndroidComponentShadowNode = ConcreteViewShadowNode< ExcludedAndroidComponentEventEmitter, ExcludedAndroidComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -491,8 +467,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ExcludedAndroidIosComponentComponentName[]; @@ -505,8 +480,7 @@ using ExcludedAndroidIosComponentShadowNode = ConcreteViewShadowNode< ExcludedAndroidIosComponentEventEmitter, ExcludedAndroidIosComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -531,8 +505,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ExcludedIosComponentComponentName[]; @@ -556,8 +529,7 @@ using MultiFileIncludedNativeComponentShadowNode = ConcreteViewShadowNode< MultiFileIncludedNativeComponentEventEmitter, MultiFileIncludedNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -582,8 +554,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char FloatPropNativeComponentComponentName[]; @@ -596,8 +567,7 @@ using FloatPropNativeComponentShadowNode = ConcreteViewShadowNode< FloatPropNativeComponentEventEmitter, FloatPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -622,8 +592,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ImagePropNativeComponentComponentName[]; @@ -636,8 +605,7 @@ using ImagePropNativeComponentShadowNode = ConcreteViewShadowNode< ImagePropNativeComponentEventEmitter, ImagePropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -662,8 +630,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char InsetsPropNativeComponentComponentName[]; @@ -676,8 +643,7 @@ using InsetsPropNativeComponentShadowNode = ConcreteViewShadowNode< InsetsPropNativeComponentEventEmitter, InsetsPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -702,8 +668,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char Int32EnumPropsNativeComponentComponentName[]; @@ -716,8 +681,7 @@ using Int32EnumPropsNativeComponentShadowNode = ConcreteViewShadowNode< Int32EnumPropsNativeComponentEventEmitter, Int32EnumPropsNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -742,8 +706,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char IntegerPropNativeComponentComponentName[]; @@ -756,8 +719,7 @@ using IntegerPropNativeComponentShadowNode = ConcreteViewShadowNode< IntegerPropNativeComponentEventEmitter, IntegerPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -782,13 +744,11 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -813,8 +773,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char MixedPropNativeComponentComponentName[]; @@ -827,8 +786,7 @@ using MixedPropNativeComponentShadowNode = ConcreteViewShadowNode< MixedPropNativeComponentEventEmitter, MixedPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -853,8 +811,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ImageColorPropNativeComponentComponentName[]; @@ -867,8 +824,7 @@ using ImageColorPropNativeComponentShadowNode = ConcreteViewShadowNode< ImageColorPropNativeComponentEventEmitter, ImageColorPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -893,8 +849,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char NoPropsNoEventsComponentComponentName[]; @@ -907,8 +862,7 @@ using NoPropsNoEventsComponentShadowNode = ConcreteViewShadowNode< NoPropsNoEventsComponentEventEmitter, NoPropsNoEventsComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -933,8 +887,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char ObjectPropsComponentName[]; @@ -947,8 +900,7 @@ using ObjectPropsShadowNode = ConcreteViewShadowNode< ObjectPropsEventEmitter, ObjectPropsState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -973,8 +925,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char PointPropNativeComponentComponentName[]; @@ -987,8 +938,7 @@ using PointPropNativeComponentShadowNode = ConcreteViewShadowNode< PointPropNativeComponentEventEmitter, PointPropNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1013,8 +963,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char StringEnumPropsNativeComponentComponentName[]; @@ -1027,8 +976,7 @@ using StringEnumPropsNativeComponentShadowNode = ConcreteViewShadowNode< StringEnumPropsNativeComponentEventEmitter, StringEnumPropsNativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1053,8 +1001,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char StringPropComponentComponentName[]; @@ -1067,8 +1014,7 @@ using StringPropComponentShadowNode = ConcreteViewShadowNode< StringPropComponentEventEmitter, StringPropComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1093,8 +1039,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char MultiFile1NativeComponentComponentName[]; @@ -1118,8 +1063,7 @@ using MultiFile2NativeComponentShadowNode = ConcreteViewShadowNode< MultiFile2NativeComponentEventEmitter, MultiFile2NativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1144,8 +1088,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT extern const char MultiComponent1NativeComponentComponentName[]; @@ -1169,8 +1112,7 @@ using MultiComponent2NativeComponentShadowNode = ConcreteViewShadowNode< MultiComponent2NativeComponentEventEmitter, MultiComponent2NativeComponentState>; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateStateCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateStateCpp-test.js.snap index 81112bcefb78cf..0a4a8d39f1606e 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateStateCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateStateCpp-test.js.snap @@ -13,13 +13,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -37,13 +35,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -61,13 +57,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -85,13 +79,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -109,13 +101,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -133,13 +123,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -157,13 +145,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -181,13 +167,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -205,13 +189,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -229,13 +211,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -253,13 +233,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -277,13 +255,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -301,13 +277,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -325,13 +299,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -349,13 +321,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -373,13 +343,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -397,13 +365,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -421,13 +387,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -445,13 +409,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -469,13 +431,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -493,13 +453,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -517,13 +475,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -541,13 +497,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -565,13 +519,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -589,13 +541,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -613,13 +563,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -637,13 +585,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -661,13 +607,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -685,13 +629,11 @@ Map { */ #include -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateStateH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateStateH-test.js.snap index c295dcfc57a1fb..58b9b1d9ca3d43 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateStateH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateStateH-test.js.snap @@ -18,8 +18,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ArrayPropsNativeComponentState { public: @@ -36,8 +35,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -59,8 +57,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ArrayPropsNativeComponentState { public: @@ -77,8 +74,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -100,8 +96,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class BooleanPropNativeComponentState { public: @@ -118,8 +113,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -141,8 +135,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ColorPropNativeComponentState { public: @@ -159,8 +152,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -182,8 +174,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class CommandNativeComponentState { public: @@ -200,8 +191,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -223,8 +213,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class CommandNativeComponentState { public: @@ -241,8 +230,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -264,8 +252,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class DimensionPropNativeComponentState { public: @@ -282,8 +269,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -305,8 +291,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class DoublePropNativeComponentState { public: @@ -323,8 +308,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -346,8 +330,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class EventsNestedObjectNativeComponentState { public: @@ -364,8 +347,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -387,8 +369,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class EventsNativeComponentState { public: @@ -405,8 +386,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -428,13 +408,11 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -456,8 +434,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedAndroidComponentState { public: @@ -474,8 +451,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -497,8 +473,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedAndroidIosComponentState { public: @@ -515,8 +490,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -538,8 +512,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ExcludedIosComponentState { public: @@ -571,8 +544,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -594,8 +566,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class FloatPropNativeComponentState { public: @@ -612,8 +583,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -635,8 +605,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ImagePropNativeComponentState { public: @@ -653,8 +622,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -676,8 +644,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class InsetsPropNativeComponentState { public: @@ -694,8 +661,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -717,8 +683,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class Int32EnumPropsNativeComponentState { public: @@ -735,8 +700,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -758,8 +722,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class IntegerPropNativeComponentState { public: @@ -776,8 +739,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -799,13 +761,11 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -827,8 +787,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class MixedPropNativeComponentState { public: @@ -845,8 +804,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -868,8 +826,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ImageColorPropNativeComponentState { public: @@ -886,8 +843,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -909,8 +865,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class NoPropsNoEventsComponentState { public: @@ -927,8 +882,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -950,8 +904,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class ObjectPropsState { public: @@ -968,8 +921,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -991,8 +943,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class PointPropNativeComponentState { public: @@ -1009,8 +960,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -1032,8 +982,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class StringEnumPropsNativeComponentState { public: @@ -1050,8 +999,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -1073,8 +1021,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class StringPropComponentState { public: @@ -1091,8 +1038,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -1114,8 +1060,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class MultiFile1NativeComponentState { public: @@ -1147,8 +1092,7 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; @@ -1170,8 +1114,7 @@ Map { #include #endif -namespace facebook { -namespace react { +namespace facebook::react { class MultiComponent1NativeComponentState { public: @@ -1203,7 +1146,6 @@ public: #endif }; -} // namespace react -} // namespace facebook", +} // namespace facebook::react", } `; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateThirdPartyFabricComponentsProviderH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateThirdPartyFabricComponentsProviderH-test.js.snap index f1b25981b31701..e20b751dda7807 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateThirdPartyFabricComponentsProviderH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateThirdPartyFabricComponentsProviderH-test.js.snap @@ -22,7 +22,7 @@ extern \\"C\\" { #endif Class RCTThirdPartyFabricComponentsProvider(const char *name); - +#if RCT_NEW_ARCH_ENABLED #ifndef RCT_DYNAMIC_FRAMEWORKS Class NoPropsNoEventsComponentCls(void) __attribute__((used)); // NO_PROPS_NO_EVENTS @@ -57,6 +57,7 @@ Class ExcludedAndroidComponentCls(void) __attribute__( Class MultiFileIncludedNativeComponentCls(void) __attribute__((used)); // EXCLUDE_IOS_TWO_COMPONENTS_DIFFERENT_FILES +#endif #endif #ifdef __cplusplus diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateThirdPartyFabricComponentsProviderObjCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateThirdPartyFabricComponentsProviderObjCpp-test.js.snap index eb6d622917a2d0..7543550f9946f4 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateThirdPartyFabricComponentsProviderObjCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateThirdPartyFabricComponentsProviderObjCpp-test.js.snap @@ -21,6 +21,7 @@ Map { Class RCTThirdPartyFabricComponentsProvider(const char *name) { static std::unordered_map sFabricComponentsClassMap = { + #if RCT_NEW_ARCH_ENABLED #ifndef RCT_DYNAMIC_FRAMEWORKS {\\"NoPropsNoEventsComponent\\", NoPropsNoEventsComponentCls}, // NO_PROPS_NO_EVENTS @@ -70,7 +71,8 @@ Class RCTThirdPartyFabricComponentsProvider(const char {\\"MultiComponent1NativeComponent\\", MultiComponent1NativeComponentCls}, // TWO_COMPONENTS_SAME_FILE, {\\"MultiComponent2NativeComponent\\", MultiComponent2NativeComponentCls}, // TWO_COMPONENTS_SAME_FILE - {\\"MultiFile1NativeComponent\\", MultiFile1NativeComponentCls}, // TWO_COMPONENTS_DIFFERENT_FILES, + {\\"MultiFile1NativeComponent\\", MultiFile1NativeComponentCls}, // TWO_COMPONENTS_DIFFERENT_FILES + {\\"MultiFile2NativeComponent\\", MultiFile2NativeComponentCls}, // TWO_COMPONENTS_DIFFERENT_FILES {\\"CommandNativeComponent\\", CommandNativeComponentCls}, // COMMANDS @@ -82,6 +84,7 @@ Class RCTThirdPartyFabricComponentsProvider(const char {\\"MultiFileIncludedNativeComponent\\", MultiFileIncludedNativeComponentCls}, // EXCLUDE_IOS_TWO_COMPONENTS_DIFFERENT_FILES #endif + #endif }; auto p = sFabricComponentsClassMap.find(name); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap index e88cd1abe901cc..8212d94634c79d 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -234,6 +234,10 @@ export const Commands = { hotspotUpdate(ref, x, y) { dispatchCommand(ref, \\"hotspotUpdate\\", [x, y]); + }, + + addItems(ref, items) { + dispatchCommand(ref, \\"addItems\\", [items]); } }; ", @@ -468,7 +472,7 @@ export const __INTERNAL_VIEW_CONFIG = { uiViewClassName: 'RCTInterfaceOnlyComponent', bubblingEventTypes: { - paperChange: { + topPaperChange: { phasedRegistrationNames: { captured: 'onChangeCapture', bubbled: 'onChange', @@ -477,7 +481,7 @@ export const __INTERNAL_VIEW_CONFIG = { }, directEventTypes: { - paperDirectChange: { + topPaperDirectChange: { registrationName: 'onDirectChange', }, }, diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js index fa02920516e55f..e435945e5c7f0d 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js @@ -11,19 +11,19 @@ 'use strict'; import type { - SchemaType, - Nullable, NamedShape, - NativeModulePropertyShape, + NativeModuleEnumMap, NativeModuleFunctionTypeAnnotation, NativeModuleParamTypeAnnotation, + NativeModulePropertyShape, NativeModuleTypeAnnotation, - NativeModuleEnumMap, + Nullable, + SchemaType, } from '../../CodegenSchema'; - import type {AliasResolver} from './Utils'; -const {createAliasResolver, getModules} = require('./Utils'); + const {unwrapNullable} = require('../../parsers/parsers-commons'); +const {createAliasResolver, getModules} = require('./Utils'); type FilesOutput = Map; @@ -101,14 +101,12 @@ const FileTemplate = ({ #include "${libraryName}JSI.h" -namespace facebook { -namespace react { +namespace facebook::react { ${modules} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; }; @@ -236,6 +234,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const nativeModules = getModules(schema); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index e2107bde8f8f6b..6cfbdd06097230 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -10,33 +10,33 @@ 'use strict'; import type { - NativeModuleBaseTypeAnnotation, NamedShape, + NativeModuleBaseTypeAnnotation, } from '../../CodegenSchema'; - import type { - Nullable, - SchemaType, - NativeModuleTypeAnnotation, - NativeModuleFunctionTypeAnnotation, - NativeModulePropertyShape, NativeModuleAliasMap, NativeModuleEnumMap, NativeModuleEnumMembers, NativeModuleEnumMemberType, + NativeModuleFunctionTypeAnnotation, + NativeModulePropertyShape, + NativeModuleTypeAnnotation, + Nullable, + SchemaType, } from '../../CodegenSchema'; - import type {AliasResolver} from './Utils'; +const {unwrapNullable} = require('../../parsers/parsers-commons'); +const {wrapOptional} = require('../TypeUtils/Cxx'); const {getEnumName, toSafeCppString} = require('../Utils'); - +const {indent} = require('../Utils'); const { createAliasResolver, - getModules, getAreEnumMembersInteger, + getModules, + isArrayRecursiveMember, + isDirectRecursiveMember, } = require('./Utils'); -const {indent} = require('../Utils'); -const {unwrapNullable} = require('../../parsers/parsers-commons'); type FilesOutput = Map; @@ -83,7 +83,7 @@ public: protected: ${hasteModuleName}CxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public ${hasteModuleName}CxxSpecJSI { @@ -120,18 +120,17 @@ const FileTemplate = ({ #include #include -namespace facebook { -namespace react { +namespace facebook::react { ${modules.join('\n\n')} -} // namespace react -} // namespace facebook +} // namespace facebook::react `; }; function translatePrimitiveJSTypeToCpp( moduleName: string, + parentObjectAliasName: ?string, nullableTypeAnnotation: Nullable, optional: boolean, createErrorMessage: (typeName: string) => string, @@ -141,22 +140,21 @@ function translatePrimitiveJSTypeToCpp( const [typeAnnotation, nullable] = unwrapNullable( nullableTypeAnnotation, ); - const isRequired = !optional && !nullable; - + const isRecursiveType = isDirectRecursiveMember( + parentObjectAliasName, + nullableTypeAnnotation, + ); + const isRequired = (!optional && !nullable) || isRecursiveType; let realTypeAnnotation = typeAnnotation; if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') { realTypeAnnotation = resolveAlias(realTypeAnnotation.name); } - function wrap(type: string) { - return isRequired ? type : `std::optional<${type}>`; - } - switch (realTypeAnnotation.type) { case 'ReservedTypeAnnotation': switch (realTypeAnnotation.name) { case 'RootTag': - return wrap('double'); + return wrapOptional('double', isRequired); default: (realTypeAnnotation.name: empty); throw new Error(createErrorMessage(realTypeAnnotation.name)); @@ -164,53 +162,49 @@ function translatePrimitiveJSTypeToCpp( case 'VoidTypeAnnotation': return 'void'; case 'StringTypeAnnotation': - return wrap('jsi::String'); + return wrapOptional('jsi::String', isRequired); case 'NumberTypeAnnotation': - return wrap('double'); + return wrapOptional('double', isRequired); case 'DoubleTypeAnnotation': - return wrap('double'); + return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': - return wrap('double'); + return wrapOptional('double', isRequired); case 'Int32TypeAnnotation': - return wrap('int'); + return wrapOptional('int', isRequired); case 'BooleanTypeAnnotation': - return wrap('bool'); + return wrapOptional('bool', isRequired); case 'EnumDeclaration': switch (realTypeAnnotation.memberType) { case 'NumberTypeAnnotation': - return getAreEnumMembersInteger( - enumMap[realTypeAnnotation.name].members, - ) - ? wrap('int') - : wrap('double'); + return wrapOptional('jsi::Value', isRequired); case 'StringTypeAnnotation': - return wrap('jsi::String'); + return wrapOptional('jsi::String', isRequired); default: throw new Error(createErrorMessage(realTypeAnnotation.type)); } case 'GenericObjectTypeAnnotation': - return wrap('jsi::Object'); + return wrapOptional('jsi::Object', isRequired); case 'UnionTypeAnnotation': switch (typeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrap('double'); + return wrapOptional('double', isRequired); case 'ObjectTypeAnnotation': - return wrap('jsi::Object'); + return wrapOptional('jsi::Object', isRequired); case 'StringTypeAnnotation': - return wrap('jsi::String'); + return wrapOptional('jsi::String', isRequired); default: throw new Error(createErrorMessage(realTypeAnnotation.type)); } case 'ObjectTypeAnnotation': - return wrap('jsi::Object'); + return wrapOptional('jsi::Object', isRequired); case 'ArrayTypeAnnotation': - return wrap('jsi::Array'); + return wrapOptional('jsi::Array', isRequired); case 'FunctionTypeAnnotation': - return wrap('jsi::Function'); + return wrapOptional('jsi::Function', isRequired); case 'PromiseTypeAnnotation': - return wrap('jsi::Value'); + return wrapOptional('jsi::Value', isRequired); case 'MixedTypeAnnotation': - return wrap('jsi::Value'); + return wrapOptional('jsi::Value', isRequired); default: (realTypeAnnotation.type: empty); throw new Error(createErrorMessage(realTypeAnnotation.type)); @@ -224,10 +218,12 @@ function createStructsString( enumMap: NativeModuleEnumMap, ): string { const getCppType = ( + parentObjectAlias: string, v: NamedShape>, ) => translatePrimitiveJSTypeToCpp( moduleName, + parentObjectAlias, v.typeAnnotation, false, typeName => `Unsupported type for param "${v.name}". Found: ${typeName}`, @@ -235,33 +231,36 @@ function createStructsString( enumMap, ); - return Object.keys(aliasMap) - .map(alias => { - const value = aliasMap[alias]; - if (value.properties.length === 0) { - return ''; - } - const structName = `${moduleName}Base${alias}`; - const templateParameterWithTypename = value.properties - .map((v, i) => `typename P${i}`) - .join(', '); - const templateParameter = value.properties - .map((v, i) => 'P' + i) - .join(', '); - const debugParameterConversion = value.properties - .map( - (v, i) => ` static ${getCppType(v)} ${ - v.name - }ToJs(jsi::Runtime &rt, P${i} value) { + // TODO: T171006733 [Begin] Remove deprecated Cxx TMs structs after a new release. + return ( + Object.keys(aliasMap) + .map(alias => { + const value = aliasMap[alias]; + if (value.properties.length === 0) { + return ''; + } + const structName = `${moduleName}Base${alias}`; + const structNameNew = `${moduleName}${alias}`; + const templateParameterWithTypename = value.properties + .map((v, i) => `typename P${i}`) + .join(', '); + const templateParameter = value.properties + .map((v, i) => 'P' + i) + .join(', '); + const debugParameterConversion = value.properties + .map( + (v, i) => ` static ${getCppType(alias, v)} ${ + v.name + }ToJs(jsi::Runtime &rt, P${i} value) { return bridging::toJs(rt, value); }`, - ) - .join('\n\n'); - return ` + ) + .join('\n\n'); + return ` #pragma mark - ${structName} template <${templateParameterWithTypename}> -struct ${structName} { +struct [[deprecated("Use ${structNameNew} instead.")]] ${structName} { ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')}; bool operator==(const ${structName} &other) const { return ${value.properties @@ -271,7 +270,7 @@ ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')}; }; template <${templateParameterWithTypename}> -struct ${structName}Bridging { +struct [[deprecated("Use ${structNameNew}Bridging instead.")]] ${structName}Bridging { static ${structName}<${templateParameter}> fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -311,8 +310,121 @@ ${value.properties }; `; - }) - .join('\n'); + }) + .join('\n') + + // TODO: T171006733 [End] Remove deprecated Cxx TMs structs after a new release. + Object.keys(aliasMap) + .map(alias => { + const value = aliasMap[alias]; + if (value.properties.length === 0) { + return ''; + } + const structName = `${moduleName}${alias}`; + const templateParameter = value.properties.filter( + v => + !isDirectRecursiveMember(alias, v.typeAnnotation) && + !isArrayRecursiveMember(alias, v.typeAnnotation), + ); + const templateParameterWithTypename = templateParameter + .map((v, i) => `typename P${i}`) + .join(', '); + const templateParameterWithoutTypename = templateParameter + .map((v, i) => `P${i}`) + .join(', '); + let i = -1; + const templateMemberTypes = value.properties.map(v => { + if (isDirectRecursiveMember(alias, v.typeAnnotation)) { + return `std::unique_ptr<${structName}<${templateParameterWithoutTypename}>> ${v.name}`; + } else if (isArrayRecursiveMember(alias, v.typeAnnotation)) { + const [nullable] = unwrapNullable( + v.typeAnnotation, + ); + return ( + (nullable + ? `std::optional>>` + : `std::vector<${structName}<${templateParameterWithoutTypename}>>`) + + ` ${v.name}` + ); + } else { + i++; + return `P${i} ${v.name}`; + } + }); + const debugParameterConversion = value.properties + .map( + v => ` static ${getCppType(alias, v)} ${ + v.name + }ToJs(jsi::Runtime &rt, decltype(types.${v.name}) value) { + return bridging::toJs(rt, value); + }`, + ) + .join('\n\n'); + return ` +#pragma mark - ${structName} + +template <${templateParameterWithTypename}> +struct ${structName} { +${templateMemberTypes.map(v => ' ' + v).join(';\n')}; + bool operator==(const ${structName} &other) const { + return ${value.properties + .map(v => `${v.name} == other.${v.name}`) + .join(' && ')}; + } +}; + +template +struct ${structName}Bridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ +${value.properties + .map(v => { + if (isDirectRecursiveMember(alias, v.typeAnnotation)) { + return ` value.hasProperty(rt, "${v.name}") ? std::make_unique(bridging::fromJs(rt, value.getProperty(rt, "${v.name}"), jsInvoker)) : nullptr`; + } else { + return ` bridging::fromJs(rt, value.getProperty(rt, "${v.name}"), jsInvoker)`; + } + }) + .join(',\n')}}; + return result; + } + +#ifdef DEBUG +${debugParameterConversion} +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); +${value.properties + .map(v => { + if (isDirectRecursiveMember(alias, v.typeAnnotation)) { + return ` if (value.${v.name}) { + result.setProperty(rt, "${v.name}", bridging::toJs(rt, *value.${v.name}, jsInvoker)); + }`; + } else if (v.optional) { + return ` if (value.${v.name}) { + result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker)); + }`; + } else { + return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}, jsInvoker));`; + } + }) + .join('\n')} + return result; + } +}; + +`; + }) + .join('\n') + ); } type NativeEnumMemberValueType = 'std::string' | 'int32_t' | 'float'; @@ -346,7 +458,7 @@ const EnumTemplate = ({ return ` #pragma mark - ${enumName} -enum ${enumName} { ${values} }; +enum class ${enumName} { ${values} }; template <> struct Bridging<${enumName}> { @@ -449,6 +561,7 @@ function translatePropertyToCpp( const paramTypes = propTypeAnnotation.params.map(param => { const translatedParam = translatePrimitiveJSTypeToCpp( moduleName, + null, param.typeAnnotation, param.optional, typeName => @@ -461,6 +574,7 @@ function translatePropertyToCpp( const returnType = translatePrimitiveJSTypeToCpp( moduleName, + null, propTypeAnnotation.returnTypeAnnotation, false, typeName => `Unsupported return type for ${prop.name}. Found: ${typeName}`, @@ -493,6 +607,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const nativeModules = getModules(schema); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js index 24fba85b697aa6..2dc407f303476f 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js @@ -11,18 +11,19 @@ 'use strict'; import type { - Nullable, NamedShape, - SchemaType, - NativeModulePropertyShape, - NativeModuleReturnTypeAnnotation, NativeModuleFunctionTypeAnnotation, NativeModuleParamTypeAnnotation, + NativeModulePropertyShape, + NativeModuleReturnTypeAnnotation, + Nullable, + SchemaType, } from '../../CodegenSchema'; - import type {AliasResolver} from './Utils'; -const {createAliasResolver, getModules} = require('./Utils'); + const {unwrapNullable} = require('../../parsers/parsers-commons'); +const {wrapOptional} = require('../TypeUtils/Java'); +const {createAliasResolver, getModules} = require('./Utils'); type FilesOutput = Map; @@ -111,13 +112,8 @@ function translateFunctionParamToJavaType( const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation); const isRequired = !optional && !nullable; - - function wrapNullable(javaType: string, nullableType?: string) { - if (!isRequired) { - imports.add('javax.annotation.Nullable'); - return `@Nullable ${nullableType ?? javaType}`; - } - return javaType; + if (!isRequired) { + imports.add('javax.annotation.Nullable'); } // FIXME: support class alias for args @@ -130,41 +126,41 @@ function translateFunctionParamToJavaType( case 'ReservedTypeAnnotation': switch (realTypeAnnotation.name) { case 'RootTag': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); default: (realTypeAnnotation.name: empty); throw new Error(createErrorMessage(realTypeAnnotation.name)); } case 'StringTypeAnnotation': - return wrapNullable('String'); + return wrapOptional('String', isRequired); case 'NumberTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('float', isRequired); case 'DoubleTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'Int32TypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('int', isRequired); case 'BooleanTypeAnnotation': - return wrapNullable('boolean', 'Boolean'); + return wrapOptional('boolean', isRequired); case 'EnumDeclaration': switch (realTypeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'StringTypeAnnotation': - return wrapNullable('String'); + return wrapOptional('String', isRequired); default: throw new Error(createErrorMessage(realTypeAnnotation.type)); } case 'UnionTypeAnnotation': switch (typeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'ObjectTypeAnnotation': imports.add('com.facebook.react.bridge.ReadableMap'); - return wrapNullable('ReadableMap'); + return wrapOptional('ReadableMap', isRequired); case 'StringTypeAnnotation': - return wrapNullable('String'); + return wrapOptional('String', isRequired); default: throw new Error( `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`, @@ -172,17 +168,17 @@ function translateFunctionParamToJavaType( } case 'ObjectTypeAnnotation': imports.add('com.facebook.react.bridge.ReadableMap'); - return wrapNullable('ReadableMap'); + return wrapOptional('ReadableMap', isRequired); case 'GenericObjectTypeAnnotation': // Treat this the same as ObjectTypeAnnotation for now. imports.add('com.facebook.react.bridge.ReadableMap'); - return wrapNullable('ReadableMap'); + return wrapOptional('ReadableMap', isRequired); case 'ArrayTypeAnnotation': imports.add('com.facebook.react.bridge.ReadableArray'); - return wrapNullable('ReadableArray'); + return wrapOptional('ReadableArray', isRequired); case 'FunctionTypeAnnotation': imports.add('com.facebook.react.bridge.Callback'); - return wrapNullable('Callback'); + return wrapOptional('Callback', isRequired); default: (realTypeAnnotation.type: 'MixedTypeAnnotation'); throw new Error(createErrorMessage(realTypeAnnotation.type)); @@ -200,14 +196,12 @@ function translateFunctionReturnTypeToJavaType( nullableReturnTypeAnnotation, ); - function wrapNullable(javaType: string, nullableType?: string) { - if (nullable) { - imports.add('javax.annotation.Nullable'); - return `@Nullable ${nullableType ?? javaType}`; - } - return javaType; + if (nullable) { + imports.add('javax.annotation.Nullable'); } + const isRequired = !nullable; + // FIXME: support class alias for args let realTypeAnnotation = returnTypeAnnotation; if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') { @@ -218,7 +212,7 @@ function translateFunctionReturnTypeToJavaType( case 'ReservedTypeAnnotation': switch (realTypeAnnotation.name) { case 'RootTag': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); default: (realTypeAnnotation.name: empty); throw new Error(createErrorMessage(realTypeAnnotation.name)); @@ -228,35 +222,35 @@ function translateFunctionReturnTypeToJavaType( case 'PromiseTypeAnnotation': return 'void'; case 'StringTypeAnnotation': - return wrapNullable('String'); + return wrapOptional('String', isRequired); case 'NumberTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'DoubleTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'Int32TypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'BooleanTypeAnnotation': - return wrapNullable('boolean', 'Boolean'); + return wrapOptional('boolean', isRequired); case 'EnumDeclaration': switch (realTypeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'StringTypeAnnotation': - return wrapNullable('String'); + return wrapOptional('String', isRequired); default: throw new Error(createErrorMessage(realTypeAnnotation.type)); } case 'UnionTypeAnnotation': switch (realTypeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrapNullable('double', 'Double'); + return wrapOptional('double', isRequired); case 'ObjectTypeAnnotation': imports.add('com.facebook.react.bridge.WritableMap'); - return wrapNullable('WritableMap'); + return wrapOptional('WritableMap', isRequired); case 'StringTypeAnnotation': - return wrapNullable('String'); + return wrapOptional('String', isRequired); default: throw new Error( `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`, @@ -264,13 +258,13 @@ function translateFunctionReturnTypeToJavaType( } case 'ObjectTypeAnnotation': imports.add('com.facebook.react.bridge.WritableMap'); - return wrapNullable('WritableMap'); + return wrapOptional('WritableMap', isRequired); case 'GenericObjectTypeAnnotation': imports.add('com.facebook.react.bridge.WritableMap'); - return wrapNullable('WritableMap'); + return wrapOptional('WritableMap', isRequired); case 'ArrayTypeAnnotation': imports.add('com.facebook.react.bridge.WritableArray'); - return wrapNullable('WritableArray'); + return wrapOptional('WritableArray', isRequired); default: (realTypeAnnotation.type: 'MixedTypeAnnotation'); throw new Error(createErrorMessage(realTypeAnnotation.type)); @@ -441,6 +435,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const files = new Map(); const nativeModules = getModules(schema); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js index ad23221bc4ce56..d024c4078a1fa9 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js @@ -11,18 +11,18 @@ 'use strict'; import type { - Nullable, NamedShape, - SchemaType, + NativeModuleFunctionTypeAnnotation, + NativeModuleParamTypeAnnotation, NativeModulePropertyShape, NativeModuleReturnTypeAnnotation, - NativeModuleParamTypeAnnotation, - NativeModuleFunctionTypeAnnotation, + Nullable, + SchemaType, } from '../../CodegenSchema'; - import type {AliasResolver} from './Utils'; -const {createAliasResolver, getModules} = require('./Utils'); + const {unwrapNullable} = require('../../parsers/parsers-commons'); +const {createAliasResolver, getModules} = require('./Utils'); type FilesOutput = Map; @@ -108,8 +108,7 @@ const FileTemplate = ({ #include ${include} -namespace facebook { -namespace react { +namespace facebook::react { ${modules} @@ -118,8 +117,7 @@ ${moduleLookups.map(ModuleLookupTemplate).join('\n')} return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react `; }; @@ -336,9 +334,9 @@ function translateReturnTypeToJniType( case 'DoubleTypeAnnotation': return nullable ? 'Ljava/lang/Double;' : 'D'; case 'FloatTypeAnnotation': - return nullable ? 'Ljava/lang/Double;' : 'D'; + return nullable ? 'Ljava/lang/Float;' : 'F'; case 'Int32TypeAnnotation': - return nullable ? 'Ljava/lang/Double;' : 'D'; + return nullable ? 'Ljava/lang/Integer;' : 'I'; case 'PromiseTypeAnnotation': return 'Lcom/facebook/react/bridge/Promise;'; case 'GenericObjectTypeAnnotation': @@ -424,6 +422,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const nativeModules = getModules(schema); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js index fb98080755456c..0bb2b35d15cbf1 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js @@ -12,10 +12,10 @@ import type {SchemaType} from '../../CodegenSchema'; -type FilesOutput = Map; - const {getModules} = require('./Utils'); +type FilesOutput = Map; + const ModuleClassDeclarationTemplate = ({ hasteModuleName, }: $ReadOnly<{hasteModuleName: string}>) => { @@ -49,16 +49,14 @@ const HeaderFileTemplate = ({ #include #include -namespace facebook { -namespace react { +namespace facebook::react { ${modules} JSI_EXPORT std::shared_ptr ${libraryName}_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react `; }; @@ -93,10 +91,13 @@ target_link_libraries( ${libraryName !== 'rncore' ? 'react_codegen_rncore' : ''} react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni @@ -121,6 +122,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean = false, + headerPrefix?: string, ): FilesOutput { const nativeModules = getModules(schema); const modules = Object.keys(nativeModules) diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js index ef7af6ae44a13e..d85d093948ad27 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js @@ -11,29 +11,28 @@ 'use strict'; import type { - Nullable, - NativeModuleObjectTypeAnnotation, - NativeModuleStringTypeAnnotation, - NativeModuleNumberTypeAnnotation, - NativeModuleInt32TypeAnnotation, - NativeModuleDoubleTypeAnnotation, - NativeModuleFloatTypeAnnotation, + NativeModuleArrayTypeAnnotation, + NativeModuleBaseTypeAnnotation, NativeModuleBooleanTypeAnnotation, + NativeModuleDoubleTypeAnnotation, NativeModuleEnumDeclaration, + NativeModuleFloatTypeAnnotation, NativeModuleGenericObjectTypeAnnotation, - ReservedTypeAnnotation, + NativeModuleInt32TypeAnnotation, + NativeModuleNumberTypeAnnotation, + NativeModuleObjectTypeAnnotation, + NativeModuleStringTypeAnnotation, NativeModuleTypeAliasTypeAnnotation, - NativeModuleArrayTypeAnnotation, - NativeModuleBaseTypeAnnotation, + Nullable, + ReservedTypeAnnotation, } from '../../../CodegenSchema'; - import type {AliasResolver} from '../Utils'; -const {capitalize} = require('../../Utils'); const { unwrapNullable, wrapNullable, } = require('../../../parsers/parsers-commons'); +const {capitalize} = require('../../Utils'); type StructContext = 'CONSTANTS' | 'REGULAR'; diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js index 0fa67683e66215..ad7918d686f855 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js @@ -10,14 +10,17 @@ 'use strict'; -const {getSafePropertyName, getNamespacedStructName} = require('../Utils'); -const {capitalize} = require('../../../Utils'); - import type {Nullable} from '../../../../CodegenSchema'; -import type {StructTypeAnnotation, ConstantsStruct} from '../StructCollector'; +import type {ConstantsStruct, StructTypeAnnotation} from '../StructCollector'; import type {StructSerilizationOutput} from './serializeStruct'; const {unwrapNullable} = require('../../../../parsers/parsers-commons'); +const {wrapOptional: wrapCxxOptional} = require('../../../TypeUtils/Cxx'); +const { + wrapOptional: wrapObjCOptional, +} = require('../../../TypeUtils/Objective-C'); +const {capitalize} = require('../../../Utils'); +const {getNamespacedStructName, getSafePropertyName} = require('../Utils'); const StructTemplate = ({ hasteModuleName, @@ -79,15 +82,12 @@ function toObjCType( ): string { const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation); const isRequired = !nullable && !isOptional; - const wrapOptional = (type: string) => { - return isRequired ? type : `std::optional<${type}>`; - }; switch (typeAnnotation.type) { case 'ReservedTypeAnnotation': switch (typeAnnotation.name) { case 'RootTag': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); default: (typeAnnotation.name: empty); throw new Error(`Unknown prop type, found: ${typeAnnotation.name}"`); @@ -95,19 +95,19 @@ function toObjCType( case 'StringTypeAnnotation': return 'NSString *'; case 'NumberTypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'FloatTypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'Int32TypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'DoubleTypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'BooleanTypeAnnotation': - return wrapOptional('bool'); + return wrapCxxOptional('bool', isRequired); case 'EnumDeclaration': switch (typeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'StringTypeAnnotation': return 'NSString *'; default: @@ -116,17 +116,18 @@ function toObjCType( ); } case 'GenericObjectTypeAnnotation': - return isRequired ? 'id ' : 'id _Nullable '; + return wrapObjCOptional('id', isRequired); case 'ArrayTypeAnnotation': if (typeAnnotation.elementType == null) { - return isRequired ? 'id ' : 'id _Nullable '; + return wrapObjCOptional('id', isRequired); } - return wrapOptional( + return wrapCxxOptional( `std::vector<${toObjCType( hasteModuleName, typeAnnotation.elementType, )}>`, + isRequired, ); case 'TypeAliasTypeAnnotation': const structName = capitalize(typeAnnotation.name); @@ -134,7 +135,7 @@ function toObjCType( hasteModuleName, structName, ); - return wrapOptional(`${namespacedStructName}::Builder`); + return wrapCxxOptional(`${namespacedStructName}::Builder`, isRequired); default: (typeAnnotation.type: empty); throw new Error( diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js index e6c73c73388892..9ea93a1da7a192 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js @@ -10,14 +10,17 @@ 'use strict'; -const {getSafePropertyName, getNamespacedStructName} = require('../Utils'); -const {capitalize} = require('../../../Utils'); - import type {Nullable} from '../../../../CodegenSchema'; -import type {StructTypeAnnotation, RegularStruct} from '../StructCollector'; +import type {RegularStruct, StructTypeAnnotation} from '../StructCollector'; import type {StructSerilizationOutput} from './serializeStruct'; const {unwrapNullable} = require('../../../../parsers/parsers-commons'); +const {wrapOptional: wrapCxxOptional} = require('../../../TypeUtils/Cxx'); +const { + wrapOptional: wrapObjCOptional, +} = require('../../../TypeUtils/Objective-C'); +const {capitalize} = require('../../../Utils'); +const {getNamespacedStructName, getSafePropertyName} = require('../Utils'); const StructTemplate = ({ hasteModuleName, @@ -70,15 +73,12 @@ function toObjCType( ): string { const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation); const isRequired = !nullable && !isOptional; - const wrapOptional = (type: string) => { - return isRequired ? type : `std::optional<${type}>`; - }; switch (typeAnnotation.type) { case 'ReservedTypeAnnotation': switch (typeAnnotation.name) { case 'RootTag': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); default: (typeAnnotation.name: empty); throw new Error(`Unknown prop type, found: ${typeAnnotation.name}"`); @@ -86,19 +86,19 @@ function toObjCType( case 'StringTypeAnnotation': return 'NSString *'; case 'NumberTypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'FloatTypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'Int32TypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'DoubleTypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'BooleanTypeAnnotation': - return wrapOptional('bool'); + return wrapCxxOptional('bool', isRequired); case 'EnumDeclaration': switch (typeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrapOptional('double'); + return wrapCxxOptional('double', isRequired); case 'StringTypeAnnotation': return 'NSString *'; default: @@ -107,16 +107,17 @@ function toObjCType( ); } case 'GenericObjectTypeAnnotation': - return isRequired ? 'id ' : 'id _Nullable'; + return wrapObjCOptional('id', isRequired); case 'ArrayTypeAnnotation': if (typeAnnotation.elementType == null) { - return isRequired ? 'id ' : 'id _Nullable'; + return wrapObjCOptional('id', isRequired); } - return wrapOptional( + return wrapCxxOptional( `facebook::react::LazyVector<${toObjCType( hasteModuleName, typeAnnotation.elementType, )}>`, + isRequired, ); case 'TypeAliasTypeAnnotation': const structName = capitalize(typeAnnotation.name); @@ -124,7 +125,7 @@ function toObjCType( hasteModuleName, structName, ); - return wrapOptional(namespacedStructName); + return wrapCxxOptional(namespacedStructName, isRequired); default: (typeAnnotation.type: empty); throw new Error( diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js index 9524327b87137e..ce4c1048cd36c1 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js @@ -10,16 +10,14 @@ 'use strict'; import type {NativeModulePropertyShape} from '../../../CodegenSchema'; - import type {SchemaType} from '../../../CodegenSchema'; import type {MethodSerializationOutput} from './serializeMethod'; const {createAliasResolver, getModules} = require('../Utils'); - -const {StructCollector} = require('./StructCollector'); const {serializeStruct} = require('./header/serializeStruct'); const {serializeMethod} = require('./serializeMethod'); const {serializeModuleSource} = require('./source/serializeModule'); +const {StructCollector} = require('./StructCollector'); type FilesOutput = Map; @@ -37,17 +35,15 @@ const ModuleDeclarationTemplate = ({ ${protocolMethods} @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module '${hasteModuleName}' - */ - class JSI_EXPORT ${hasteModuleName}SpecJSI : public ObjCTurboModule { - public: - ${hasteModuleName}SpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook`; +namespace facebook::react { + /** + * ObjC++ class for module '${hasteModuleName}' + */ + class JSI_EXPORT ${hasteModuleName}SpecJSI : public ObjCTurboModule { + public: + ${hasteModuleName}SpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react`; const HeaderFileTemplate = ({ moduleDeclarations, @@ -122,6 +118,7 @@ module.exports = { schema: SchemaType, packageName?: string, assumeNonnull: boolean, + headerPrefix?: string, ): FilesOutput { const nativeModules = getModules(schema); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js index 9dcf621c7096ff..14f0ed724c78d4 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js @@ -11,23 +11,23 @@ 'use strict'; import type { - Nullable, NamedShape, NativeModuleParamTypeAnnotation, - NativeModuleReturnTypeAnnotation, NativeModulePropertyShape, + NativeModuleReturnTypeAnnotation, + Nullable, } from '../../../CodegenSchema'; - import type {AliasResolver} from '../Utils'; import type {StructCollector} from './StructCollector'; -const invariant = require('invariant'); -const {getNamespacedStructName} = require('./Utils'); -const {capitalize} = require('../../Utils'); const { - wrapNullable, unwrapNullable, + wrapNullable, } = require('../../../parsers/parsers-commons'); +const {wrapOptional} = require('../../TypeUtils/Objective-C'); +const {capitalize} = require('../../Utils'); +const {getNamespacedStructName} = require('./Utils'); +const invariant = require('invariant'); const ProtocolMethodTemplate = ({ returnObjCType, @@ -189,11 +189,7 @@ function getParamObjCType( ): $ReadOnly<{objCType: string, isStruct: boolean}> { const {name: paramName, typeAnnotation: nullableTypeAnnotation} = param; const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation); - const notRequired = param.optional || nullable; - - function wrapIntoNullableIfNeeded(generatedType: string) { - return nullable ? `${generatedType} _Nullable` : generatedType; - } + const isRequired = !param.optional && !nullable; const isStruct = (objCType: string) => ({ isStruct: true, @@ -221,7 +217,7 @@ function getParamObjCType( * type Animal = {}; * Array => NSArray, etc. */ - return notStruct(wrapIntoNullableIfNeeded('NSArray *')); + return notStruct(wrapOptional('NSArray *', !nullable)); } } @@ -252,7 +248,7 @@ function getParamObjCType( case 'ReservedTypeAnnotation': switch (structTypeAnnotation.name) { case 'RootTag': - return notStruct(notRequired ? 'NSNumber *' : 'double'); + return notStruct(isRequired ? 'double' : 'NSNumber *'); default: (structTypeAnnotation.name: empty); throw new Error( @@ -260,30 +256,30 @@ function getParamObjCType( ); } case 'StringTypeAnnotation': - return notStruct(wrapIntoNullableIfNeeded('NSString *')); + return notStruct(wrapOptional('NSString *', !nullable)); case 'NumberTypeAnnotation': - return notStruct(notRequired ? 'NSNumber *' : 'double'); + return notStruct(isRequired ? 'double' : 'NSNumber *'); case 'FloatTypeAnnotation': - return notStruct(notRequired ? 'NSNumber *' : 'double'); + return notStruct(isRequired ? 'float' : 'NSNumber *'); case 'DoubleTypeAnnotation': - return notStruct(notRequired ? 'NSNumber *' : 'double'); + return notStruct(isRequired ? 'double' : 'NSNumber *'); case 'Int32TypeAnnotation': - return notStruct(notRequired ? 'NSNumber *' : 'double'); + return notStruct(isRequired ? 'NSInteger' : 'NSNumber *'); case 'BooleanTypeAnnotation': - return notStruct(notRequired ? 'NSNumber *' : 'BOOL'); + return notStruct(isRequired ? 'BOOL' : 'NSNumber *'); case 'EnumDeclaration': switch (typeAnnotation.memberType) { case 'NumberTypeAnnotation': - return notStruct(notRequired ? 'NSNumber *' : 'double'); + return notStruct(isRequired ? 'double' : 'NSNumber *'); case 'StringTypeAnnotation': - return notStruct(wrapIntoNullableIfNeeded('NSString *')); + return notStruct(wrapOptional('NSString *', !nullable)); default: throw new Error( `Unsupported enum type for param "${paramName}" in ${methodName}. Found: ${typeAnnotation.type}`, ); } case 'GenericObjectTypeAnnotation': - return notStruct(wrapIntoNullableIfNeeded('NSDictionary *')); + return notStruct(wrapOptional('NSDictionary *', !nullable)); default: (structTypeAnnotation.type: empty); throw new Error( @@ -297,10 +293,7 @@ function getReturnObjCType( nullableTypeAnnotation: Nullable, ): string { const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation); - - function wrapIntoNullableIfNeeded(generatedType: string) { - return nullable ? `${generatedType} _Nullable` : generatedType; - } + const isRequired = !nullable; switch (typeAnnotation.type) { case 'VoidTypeAnnotation': @@ -308,24 +301,25 @@ function getReturnObjCType( case 'PromiseTypeAnnotation': return 'void'; case 'ObjectTypeAnnotation': - return wrapIntoNullableIfNeeded('NSDictionary *'); + return wrapOptional('NSDictionary *', isRequired); case 'TypeAliasTypeAnnotation': - return wrapIntoNullableIfNeeded('NSDictionary *'); + return wrapOptional('NSDictionary *', isRequired); case 'ArrayTypeAnnotation': if (typeAnnotation.elementType == null) { - return wrapIntoNullableIfNeeded('NSArray> *'); + return wrapOptional('NSArray> *', isRequired); } - return wrapIntoNullableIfNeeded( + return wrapOptional( `NSArray<${getReturnObjCType( methodName, typeAnnotation.elementType, )}> *`, + isRequired, ); case 'ReservedTypeAnnotation': switch (typeAnnotation.name) { case 'RootTag': - return wrapIntoNullableIfNeeded('NSNumber *'); + return wrapOptional('NSNumber *', isRequired); default: (typeAnnotation.name: empty); throw new Error( @@ -335,23 +329,23 @@ function getReturnObjCType( case 'StringTypeAnnotation': // TODO: Can NSString * returns not be _Nullable? // In the legacy codegen, we don't surround NSSTring * with _Nullable - return wrapIntoNullableIfNeeded('NSString *'); + return wrapOptional('NSString *', isRequired); case 'NumberTypeAnnotation': - return wrapIntoNullableIfNeeded('NSNumber *'); + return wrapOptional('NSNumber *', isRequired); case 'FloatTypeAnnotation': - return wrapIntoNullableIfNeeded('NSNumber *'); + return wrapOptional('NSNumber *', isRequired); case 'DoubleTypeAnnotation': - return wrapIntoNullableIfNeeded('NSNumber *'); + return wrapOptional('NSNumber *', isRequired); case 'Int32TypeAnnotation': - return wrapIntoNullableIfNeeded('NSNumber *'); + return wrapOptional('NSNumber *', isRequired); case 'BooleanTypeAnnotation': - return wrapIntoNullableIfNeeded('NSNumber *'); + return wrapOptional('NSNumber *', isRequired); case 'EnumDeclaration': switch (typeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrapIntoNullableIfNeeded('NSNumber *'); + return wrapOptional('NSNumber *', isRequired); case 'StringTypeAnnotation': - return wrapIntoNullableIfNeeded('NSString *'); + return wrapOptional('NSString *', isRequired); default: throw new Error( `Unsupported enum return type for ${methodName}. Found: ${typeAnnotation.type}`, @@ -360,20 +354,20 @@ function getReturnObjCType( case 'UnionTypeAnnotation': switch (typeAnnotation.memberType) { case 'NumberTypeAnnotation': - return wrapIntoNullableIfNeeded('NSNumber *'); + return wrapOptional('NSNumber *', isRequired); case 'ObjectTypeAnnotation': - return wrapIntoNullableIfNeeded('NSDictionary *'); + return wrapOptional('NSDictionary *', isRequired); case 'StringTypeAnnotation': // TODO: Can NSString * returns not be _Nullable? // In the legacy codegen, we don't surround NSSTring * with _Nullable - return wrapIntoNullableIfNeeded('NSString *'); + return wrapOptional('NSString *', isRequired); default: throw new Error( `Unsupported union return type for ${methodName}, found: ${typeAnnotation.memberType}"`, ); } case 'GenericObjectTypeAnnotation': - return wrapIntoNullableIfNeeded('NSDictionary *'); + return wrapOptional('NSDictionary *', isRequired); default: (typeAnnotation.type: 'MixedTypeAnnotation'); throw new Error( diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/source/serializeModule.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/source/serializeModule.js index 2d9eb34d2564f8..62cc5e204ff088 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/source/serializeModule.js @@ -10,11 +10,11 @@ 'use strict'; -import type {Struct} from '../StructCollector'; import type { MethodSerializationOutput, StructParameterRecord, } from '../serializeMethod'; +import type {Struct} from '../StructCollector'; const ModuleTemplate = ({ hasteModuleName, @@ -29,34 +29,32 @@ const ModuleTemplate = ({ RCTCxxConvertCategoryTemplate({hasteModuleName, structName: struct.name}), ) .join('\n')} -namespace facebook { - namespace react { - ${methodSerializationOutputs - .map(serializedMethodParts => - InlineHostFunctionTemplate({ - hasteModuleName, - methodName: serializedMethodParts.methodName, - returnJSType: serializedMethodParts.returnJSType, - selector: serializedMethodParts.selector, - }), - ) - .join('\n')} +namespace facebook::react { + ${methodSerializationOutputs + .map(serializedMethodParts => + InlineHostFunctionTemplate({ + hasteModuleName, + methodName: serializedMethodParts.methodName, + returnJSType: serializedMethodParts.returnJSType, + selector: serializedMethodParts.selector, + }), + ) + .join('\n')} - ${hasteModuleName}SpecJSI::${hasteModuleName}SpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - ${methodSerializationOutputs - .map(({methodName, structParamRecords, argCount}) => - MethodMapEntryTemplate({ - hasteModuleName, - methodName, - structParamRecords, - argCount, - }), - ) - .join('\n' + ' '.repeat(8))} - } - } // namespace react -} // namespace facebook`; + ${hasteModuleName}SpecJSI::${hasteModuleName}SpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + ${methodSerializationOutputs + .map(({methodName, structParamRecords, argCount}) => + MethodMapEntryTemplate({ + hasteModuleName, + methodName, + structParamRecords, + argCount, + }), + ) + .join('\n' + ' '.repeat(8))} + } +} // namespace facebook::react`; const RCTCxxConvertCategoryTemplate = ({ hasteModuleName, diff --git a/packages/react-native-codegen/src/generators/modules/Utils.js b/packages/react-native-codegen/src/generators/modules/Utils.js index 8d172d32abc814..20e7a482b245a3 100644 --- a/packages/react-native-codegen/src/generators/modules/Utils.js +++ b/packages/react-native-codegen/src/generators/modules/Utils.js @@ -11,13 +11,16 @@ 'use strict'; import type { - SchemaType, NativeModuleAliasMap, + NativeModuleEnumMembers, NativeModuleObjectTypeAnnotation, NativeModuleSchema, - NativeModuleEnumMembers, + NativeModuleTypeAnnotation, + Nullable, + SchemaType, } from '../../CodegenSchema'; +const {unwrapNullable} = require('../../parsers/parsers-commons'); const invariant = require('invariant'); export type AliasResolver = ( @@ -48,6 +51,33 @@ function getModules( ); } +function isDirectRecursiveMember( + parentObjectAliasName: ?string, + nullableTypeAnnotation: Nullable, +): boolean { + const [typeAnnotation] = unwrapNullable( + nullableTypeAnnotation, + ); + return ( + parentObjectAliasName !== undefined && + typeAnnotation.name === parentObjectAliasName + ); +} + +function isArrayRecursiveMember( + parentObjectAliasName: ?string, + nullableTypeAnnotation: Nullable, +): boolean { + const [typeAnnotation] = unwrapNullable( + nullableTypeAnnotation, + ); + return ( + parentObjectAliasName !== undefined && + typeAnnotation.type === 'ArrayTypeAnnotation' && + typeAnnotation.elementType?.name === parentObjectAliasName + ); +} + function getAreEnumMembersInteger(members: NativeModuleEnumMembers): boolean { return !members.some(m => `${m.value}`.includes('.')); } @@ -56,4 +86,6 @@ module.exports = { createAliasResolver, getModules, getAreEnumMembersInteger, + isDirectRecursiveMember, + isArrayRecursiveMember, }; diff --git a/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js index 8f96919d4c3843..387126e40ed8f1 100644 --- a/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js @@ -1569,7 +1569,117 @@ const CXX_ONLY_NATIVE_MODULES: SchemaType = { NativeSampleTurboModule: { type: 'NativeModule', aliasMap: { - ObjectAlias: { + ConstantsStruct: { + type: 'ObjectTypeAnnotation', + properties: [ + { + name: 'const1', + optional: false, + typeAnnotation: { + type: 'BooleanTypeAnnotation', + }, + }, + { + name: 'const2', + optional: false, + typeAnnotation: { + type: 'NumberTypeAnnotation', + }, + }, + { + name: 'const3', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + ], + }, + CustomHostObject: { + type: 'ObjectTypeAnnotation', + properties: [], + }, + BinaryTreeNode: { + type: 'ObjectTypeAnnotation', + properties: [ + { + name: 'left', + optional: true, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'BinaryTreeNode', + }, + }, + { + name: 'value', + optional: false, + typeAnnotation: { + type: 'NumberTypeAnnotation', + }, + }, + { + name: 'right', + optional: true, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'BinaryTreeNode', + }, + }, + ], + }, + GraphNode: { + type: 'ObjectTypeAnnotation', + properties: [ + { + name: 'label', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + { + name: 'neighbors', + optional: true, + typeAnnotation: { + type: 'ArrayTypeAnnotation', + elementType: { + type: 'TypeAliasTypeAnnotation', + name: 'GraphNode', + }, + }, + }, + ], + }, + ObjectStruct: { + type: 'ObjectTypeAnnotation', + properties: [ + { + name: 'a', + optional: false, + typeAnnotation: { + type: 'NumberTypeAnnotation', + }, + }, + { + name: 'b', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + { + name: 'c', + optional: true, + typeAnnotation: { + type: 'NullableTypeAnnotation', + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + }, + ], + }, + ValueStruct: { type: 'ObjectTypeAnnotation', properties: [ { @@ -1579,56 +1689,141 @@ const CXX_ONLY_NATIVE_MODULES: SchemaType = { type: 'NumberTypeAnnotation', }, }, + { + name: 'y', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + { + name: 'z', + optional: false, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'ObjectStruct', + }, + }, + ], + }, + MenuItem: { + type: 'ObjectTypeAnnotation', + properties: [ + { + name: 'label', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + { + name: 'onPress', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + params: [ + { + name: 'value', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + { + name: 'flag', + optional: false, + typeAnnotation: { + type: 'BooleanTypeAnnotation', + }, + }, + ], + }, + }, + { + name: 'shortcut', + optional: true, + typeAnnotation: { + type: 'NullableTypeAnnotation', + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + }, + { + name: 'items', + optional: true, + typeAnnotation: { + type: 'ArrayTypeAnnotation', + elementType: { + type: 'TypeAliasTypeAnnotation', + name: 'MenuItem', + }, + }, + }, ], }, }, enumMap: { - NumEnum: { + EnumInt: { + name: 'EnumInt', type: 'EnumDeclarationWithMembers', - name: 'NumEnum', memberType: 'NumberTypeAnnotation', members: [ { - name: 'ONE', - value: '1', + name: 'IA', + value: '23', }, { - name: 'TWO', - value: '2', + name: 'IB', + value: '42', }, ], }, - FloatEnum: { + EnumFloat: { + name: 'EnumFloat', type: 'EnumDeclarationWithMembers', - name: 'FloatEnum', memberType: 'NumberTypeAnnotation', members: [ { - name: 'POINT_ZERO', - value: '0.0', + name: 'FA', + value: '1.23', }, { - name: 'POINT_ONE', - value: '0.1', + name: 'FB', + value: '4.56', }, + ], + }, + EnumNone: { + name: 'EnumNone', + type: 'EnumDeclarationWithMembers', + memberType: 'StringTypeAnnotation', + members: [ { - name: 'POINT_TWO', - value: '0.2', + name: 'NA', + value: 'NA', + }, + { + name: 'NB', + value: 'NB', }, ], }, - StringEnum: { + EnumStr: { + name: 'EnumStr', type: 'EnumDeclarationWithMembers', - name: 'StringEnum', memberType: 'StringTypeAnnotation', members: [ { - name: 'HELLO', - value: 'hello', + name: 'SA', + value: 's---a', }, { - name: 'GoodBye', - value: 'goodbye', + name: 'SB', + value: 's---b', }, ], }, @@ -1636,147 +1831,574 @@ const CXX_ONLY_NATIVE_MODULES: SchemaType = { spec: { properties: [ { - name: 'getMixed', + name: 'getArray', optional: false, typeAnnotation: { type: 'FunctionTypeAnnotation', returnTypeAnnotation: { - type: 'MixedTypeAnnotation', + type: 'ArrayTypeAnnotation', }, params: [ { name: 'arg', optional: false, typeAnnotation: { - type: 'MixedTypeAnnotation', + type: 'ArrayTypeAnnotation', }, }, ], }, }, { - name: 'getNullableNumberFromNullableAlias', + name: 'getBool', optional: false, typeAnnotation: { type: 'FunctionTypeAnnotation', returnTypeAnnotation: { - type: 'NullableTypeAnnotation', - typeAnnotation: { - type: 'NumberTypeAnnotation', - }, + type: 'BooleanTypeAnnotation', }, params: [ { - name: 'a', + name: 'arg', optional: false, typeAnnotation: { - type: 'NullableTypeAnnotation', - typeAnnotation: { - type: 'TypeAliasTypeAnnotation', - name: 'ObjectAlias', - }, + type: 'BooleanTypeAnnotation', }, }, ], }, }, { - name: 'getEnums', + name: 'getConstants', optional: false, typeAnnotation: { type: 'FunctionTypeAnnotation', returnTypeAnnotation: { - type: 'StringTypeAnnotation', + type: 'TypeAliasTypeAnnotation', + name: 'ConstantsStruct', + }, + params: [], + }, + }, + { + name: 'getCustomEnum', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + name: 'EnumInt', + type: 'EnumDeclaration', + memberType: 'NumberTypeAnnotation', }, params: [ { - name: 'enumInt', + name: 'arg', optional: false, typeAnnotation: { - name: 'NumEnum', + name: 'EnumInt', type: 'EnumDeclaration', memberType: 'NumberTypeAnnotation', }, }, + ], + }, + }, + { + name: 'getCustomHostObject', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'CustomHostObject', + }, + params: [], + }, + }, + { + name: 'consumeCustomHostObject', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'StringTypeAnnotation', + }, + params: [ { - name: 'enumFloat', + name: 'customHostObject', optional: false, typeAnnotation: { - name: 'FloatEnum', - type: 'EnumDeclaration', - memberType: 'NumberTypeAnnotation', + type: 'TypeAliasTypeAnnotation', + name: 'CustomHostObject', }, }, + ], + }, + }, + { + name: 'getBinaryTreeNode', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'BinaryTreeNode', + }, + params: [ { - name: 'enumString', + name: 'arg', optional: false, typeAnnotation: { - name: 'StringEnum', - type: 'EnumDeclaration', - memberType: 'StringTypeAnnotation', + type: 'TypeAliasTypeAnnotation', + name: 'BinaryTreeNode', }, }, ], }, }, { - name: 'getUnion', + name: 'getGraphNode', optional: false, typeAnnotation: { type: 'FunctionTypeAnnotation', returnTypeAnnotation: { - type: 'UnionTypeAnnotation', - memberType: 'ObjectTypeAnnotation', + type: 'TypeAliasTypeAnnotation', + name: 'GraphNode', }, params: [ { - name: 'chooseInt', + name: 'arg', optional: false, typeAnnotation: { - type: 'UnionTypeAnnotation', - memberType: 'NumberTypeAnnotation', + type: 'TypeAliasTypeAnnotation', + name: 'GraphNode', }, }, - { - name: 'chooseFloat', - optional: false, + ], + }, + }, + { + name: 'getNumEnum', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + name: 'EnumFloat', + type: 'EnumDeclaration', + memberType: 'NumberTypeAnnotation', + }, + params: [ + { + name: 'arg', + optional: false, typeAnnotation: { - type: 'UnionTypeAnnotation', + name: 'EnumInt', + type: 'EnumDeclaration', memberType: 'NumberTypeAnnotation', }, }, + ], + }, + }, + { + name: 'getStrEnum', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + name: 'EnumStr', + type: 'EnumDeclaration', + memberType: 'StringTypeAnnotation', + }, + params: [ { - name: 'chooseObject', + name: 'arg', + optional: false, + typeAnnotation: { + name: 'EnumNone', + type: 'EnumDeclaration', + memberType: 'StringTypeAnnotation', + }, + }, + ], + }, + }, + { + name: 'getMap', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'GenericObjectTypeAnnotation', + dictionaryValueType: { + type: 'NullableTypeAnnotation', + typeAnnotation: { + type: 'NumberTypeAnnotation', + }, + }, + }, + params: [ + { + name: 'arg', + optional: false, + typeAnnotation: { + type: 'GenericObjectTypeAnnotation', + dictionaryValueType: { + type: 'NullableTypeAnnotation', + typeAnnotation: { + type: 'NumberTypeAnnotation', + }, + }, + }, + }, + ], + }, + }, + { + name: 'getNumber', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'NumberTypeAnnotation', + }, + params: [ + { + name: 'arg', + optional: false, + typeAnnotation: { + type: 'NumberTypeAnnotation', + }, + }, + ], + }, + }, + { + name: 'getObject', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'ObjectStruct', + }, + params: [ + { + name: 'arg', + optional: false, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'ObjectStruct', + }, + }, + ], + }, + }, + { + name: 'getSet', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'ArrayTypeAnnotation', + elementType: { + type: 'NumberTypeAnnotation', + }, + }, + params: [ + { + name: 'arg', + optional: false, + typeAnnotation: { + type: 'ArrayTypeAnnotation', + elementType: { + type: 'NumberTypeAnnotation', + }, + }, + }, + ], + }, + }, + { + name: 'getString', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'StringTypeAnnotation', + }, + params: [ + { + name: 'arg', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + ], + }, + }, + { + name: 'getUnion', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'StringTypeAnnotation', + }, + params: [ + { + name: 'x', optional: false, typeAnnotation: { type: 'UnionTypeAnnotation', - memberType: 'ObjectTypeAnnotation', + memberType: 'NumberTypeAnnotation', }, }, { - name: 'chooseString', + name: 'y', optional: false, typeAnnotation: { type: 'UnionTypeAnnotation', memberType: 'StringTypeAnnotation', }, }, + { + name: 'z', + optional: false, + typeAnnotation: { + type: 'UnionTypeAnnotation', + memberType: 'ObjectTypeAnnotation', + }, + }, ], }, }, { - name: 'getEnumReturn', + name: 'getValue', optional: false, typeAnnotation: { type: 'FunctionTypeAnnotation', returnTypeAnnotation: { - type: 'EnumDeclaration', - name: 'NumEnum', - memberType: 'NumberTypeAnnotation', + type: 'TypeAliasTypeAnnotation', + name: 'ValueStruct', + }, + params: [ + { + name: 'x', + optional: false, + typeAnnotation: { + type: 'NumberTypeAnnotation', + }, + }, + { + name: 'y', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + { + name: 'z', + optional: false, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'ObjectStruct', + }, + }, + ], + }, + }, + { + name: 'getValueWithCallback', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + params: [ + { + name: 'callback', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + params: [ + { + name: 'value', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + ], + }, + }, + ], + }, + }, + { + name: 'getValueWithPromise', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'PromiseTypeAnnotation', + elementType: { + type: 'StringTypeAnnotation', + }, + }, + params: [ + { + name: 'error', + optional: false, + typeAnnotation: { + type: 'BooleanTypeAnnotation', + }, + }, + ], + }, + }, + { + name: 'getWithWithOptionalArgs', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'NullableTypeAnnotation', + typeAnnotation: { + type: 'BooleanTypeAnnotation', + }, + }, + params: [ + { + name: 'optionalArg', + optional: true, + typeAnnotation: { + type: 'BooleanTypeAnnotation', + }, + }, + ], + }, + }, + { + name: 'voidFunc', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + params: [], + }, + }, + { + name: 'setMenu', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + params: [ + { + name: 'menuItem', + optional: false, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'MenuItem', + }, + }, + ], + }, + }, + { + name: 'emitCustomDeviceEvent', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + params: [ + { + name: 'eventName', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + ], + }, + }, + { + name: 'voidFuncThrows', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', }, params: [], }, }, + + { + name: 'getObjectThrows', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'ObjectStruct', + }, + params: [ + { + name: 'arg', + optional: false, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'ObjectStruct', + }, + }, + ], + }, + }, + { + name: 'voidFuncAssert', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + params: [], + }, + }, + { + name: 'getObjectAssert', + optional: false, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + returnTypeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'ObjectStruct', + }, + params: [ + { + name: 'arg', + optional: false, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: 'ObjectStruct', + }, + }, + ], + }, + }, ], }, moduleName: 'SampleTurboModuleCxx', diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleCpp-test.js.snap index b04d1afa0b57c8..cef33f44c2ef3f 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleCpp-test.js.snap @@ -13,8 +13,7 @@ Map { #include \\"SampleWithUppercaseNameJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { @@ -24,8 +23,7 @@ NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -43,8 +41,7 @@ Map { #include \\"complex_objectsJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_difficult(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->difficult( @@ -106,8 +103,7 @@ NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -125,57 +121,210 @@ Map { #include \\"cxx_only_native_modulesJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { -static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getMixed(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { - return static_cast(&turboModule)->getMixed( +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getArray(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getArray( rt, - jsi::Value(rt, args[0]) + args[0].asObject(rt).asArray(rt) ); } -static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNullableNumberFromNullableAlias(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { - auto result = static_cast(&turboModule)->getNullableNumberFromNullableAlias( +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBool(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getBool( rt, - args[0].isNull() || args[0].isUndefined() ? std::nullopt : std::make_optional(args[0].asObject(rt)) + args[0].asBool() ); - return result ? jsi::Value(std::move(*result)) : jsi::Value::null(); } -static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getEnums(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { - return static_cast(&turboModule)->getEnums( +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getCustomEnum(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getCustomEnum( rt, - args[0].asNumber(), - args[1].asNumber(), - args[2].asString(rt) + args[0].asNumber() + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getCustomHostObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getCustomHostObject( + rt + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_consumeCustomHostObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->consumeCustomHostObject( + rt, + args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBinaryTreeNode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getBinaryTreeNode( + rt, + args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getGraphNode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getGraphNode( + rt, + args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumEnum(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getNumEnum( + rt, + args[0].asNumber() + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getStrEnum(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getStrEnum( + rt, + args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getMap(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getMap( + rt, + args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getNumber( + rt, + args[0].asNumber() + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getObject( + rt, + args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getSet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getSet( + rt, + args[0].asObject(rt).asArray(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getString(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getString( + rt, + args[0].asString(rt) ); } static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getUnion(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->getUnion( rt, args[0].asNumber(), - args[1].asNumber(), - args[2].asObject(rt), - args[3].asString(rt) + args[1].asString(rt), + args[2].asObject(rt) ); } -static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getEnumReturn(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { - return static_cast(&turboModule)->getEnumReturn( +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValue(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getValue( + rt, + args[0].asNumber(), + args[1].asString(rt), + args[2].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithCallback(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->getValueWithCallback( + rt, + args[0].asObject(rt).asFunction(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getValueWithPromise( + rt, + args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getWithWithOptionalArgs(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + auto result = static_cast(&turboModule)->getWithWithOptionalArgs( + rt, + count <= 0 || args[0].isNull() || args[0].isUndefined() ? std::nullopt : std::make_optional(args[0].asBool()) + ); + return result ? jsi::Value(std::move(*result)) : jsi::Value::null(); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->voidFunc( rt ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_setMenu(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setMenu( + rt, + args[0].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_emitCustomDeviceEvent(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->emitCustomDeviceEvent( + rt, + args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFuncThrows(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->voidFuncThrows( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObjectThrows(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getObjectThrows( + rt, + args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFuncAssert(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->voidFuncAssert( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObjectAssert(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getObjectAssert( + rt, + args[0].asObject(rt) + ); } NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker) : TurboModule(\\"SampleTurboModuleCxx\\", jsInvoker) { - methodMap_[\\"getMixed\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getMixed}; - methodMap_[\\"getNullableNumberFromNullableAlias\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNullableNumberFromNullableAlias}; - methodMap_[\\"getEnums\\"] = MethodMetadata {3, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getEnums}; - methodMap_[\\"getUnion\\"] = MethodMetadata {4, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getUnion}; - methodMap_[\\"getEnumReturn\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getEnumReturn}; + methodMap_[\\"getArray\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getArray}; + methodMap_[\\"getBool\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBool}; + methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getConstants}; + methodMap_[\\"getCustomEnum\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getCustomEnum}; + methodMap_[\\"getCustomHostObject\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getCustomHostObject}; + methodMap_[\\"consumeCustomHostObject\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_consumeCustomHostObject}; + methodMap_[\\"getBinaryTreeNode\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBinaryTreeNode}; + methodMap_[\\"getGraphNode\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getGraphNode}; + methodMap_[\\"getNumEnum\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumEnum}; + methodMap_[\\"getStrEnum\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getStrEnum}; + methodMap_[\\"getMap\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getMap}; + methodMap_[\\"getNumber\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumber}; + methodMap_[\\"getObject\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObject}; + methodMap_[\\"getSet\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getSet}; + methodMap_[\\"getString\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getString}; + methodMap_[\\"getUnion\\"] = MethodMetadata {3, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getUnion}; + methodMap_[\\"getValue\\"] = MethodMetadata {3, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValue}; + methodMap_[\\"getValueWithCallback\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithCallback}; + methodMap_[\\"getValueWithPromise\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithPromise}; + methodMap_[\\"getWithWithOptionalArgs\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getWithWithOptionalArgs}; + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc}; + methodMap_[\\"setMenu\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_setMenu}; + methodMap_[\\"emitCustomDeviceEvent\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_emitCustomDeviceEvent}; + methodMap_[\\"voidFuncThrows\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFuncThrows}; + methodMap_[\\"getObjectThrows\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObjectThrows}; + methodMap_[\\"voidFuncAssert\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFuncAssert}; + methodMap_[\\"getObjectAssert\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObjectAssert}; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -193,8 +342,7 @@ Map { #include \\"empty_native_modulesJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { @@ -204,8 +352,7 @@ NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -223,8 +370,7 @@ Map { #include \\"native_modules_with_type_aliasesJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static jsi::Value __hostFunction_AliasTurboModuleCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->getConstants( @@ -246,8 +392,7 @@ AliasTurboModuleCxxSpecJSI::AliasTurboModuleCxxSpecJSI(std::shared_ptr(&turboModule)->getConstants( @@ -351,8 +495,7 @@ NativeExceptionsManagerCxxSpecJSI::NativeExceptionsManagerCxxSpecJSI(std::shared } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -370,8 +513,7 @@ Map { #include \\"simple_native_modulesJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { return static_cast(&turboModule)->getConstants( @@ -480,8 +622,7 @@ NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -499,8 +640,7 @@ Map { #include \\"two_modules_different_filesJSI.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { static_cast(&turboModule)->voidFunc( @@ -532,8 +672,7 @@ NativeSampleTurboModule2CxxSpecJSI::NativeSampleTurboModule2CxxSpecJSI(std::shar } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap index 20fb6911293a8a..8fcc178ac21168 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap @@ -16,8 +16,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { @@ -41,7 +40,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -58,8 +57,7 @@ private: Delegate delegate_; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -80,8 +78,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { @@ -111,7 +108,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -183,8 +180,7 @@ private: Delegate delegate_; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -205,381 +201,1306 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { -#pragma mark - SampleTurboModuleCxxNumEnum +#pragma mark - SampleTurboModuleCxxEnumInt -enum SampleTurboModuleCxxNumEnum { ONE, TWO }; +enum class SampleTurboModuleCxxEnumInt { IA, IB }; template <> -struct Bridging { - static SampleTurboModuleCxxNumEnum fromJs(jsi::Runtime &rt, const jsi::Value &rawValue) { +struct Bridging { + static SampleTurboModuleCxxEnumInt fromJs(jsi::Runtime &rt, const jsi::Value &rawValue) { double value = (double)rawValue.asNumber(); - if (value == 1) { - return SampleTurboModuleCxxNumEnum::ONE; - } else if (value == 2) { - return SampleTurboModuleCxxNumEnum::TWO; + if (value == 23) { + return SampleTurboModuleCxxEnumInt::IA; + } else if (value == 42) { + return SampleTurboModuleCxxEnumInt::IB; } else { throw jsi::JSError(rt, \\"No appropriate enum member found for value\\"); } } - static jsi::Value toJs(jsi::Runtime &rt, SampleTurboModuleCxxNumEnum value) { - if (value == SampleTurboModuleCxxNumEnum::ONE) { - return bridging::toJs(rt, 1); - } else if (value == SampleTurboModuleCxxNumEnum::TWO) { - return bridging::toJs(rt, 2); + static jsi::Value toJs(jsi::Runtime &rt, SampleTurboModuleCxxEnumInt value) { + if (value == SampleTurboModuleCxxEnumInt::IA) { + return bridging::toJs(rt, 23); + } else if (value == SampleTurboModuleCxxEnumInt::IB) { + return bridging::toJs(rt, 42); } else { throw jsi::JSError(rt, \\"No appropriate enum member found for enum value\\"); } } }; -#pragma mark - SampleTurboModuleCxxFloatEnum +#pragma mark - SampleTurboModuleCxxEnumFloat -enum SampleTurboModuleCxxFloatEnum { POINT_ZERO, POINT_ONE, POINT_TWO }; +enum class SampleTurboModuleCxxEnumFloat { FA, FB }; template <> -struct Bridging { - static SampleTurboModuleCxxFloatEnum fromJs(jsi::Runtime &rt, const jsi::Value &rawValue) { +struct Bridging { + static SampleTurboModuleCxxEnumFloat fromJs(jsi::Runtime &rt, const jsi::Value &rawValue) { double value = (double)rawValue.asNumber(); - if (value == 0.0f) { - return SampleTurboModuleCxxFloatEnum::POINT_ZERO; - } else if (value == 0.1f) { - return SampleTurboModuleCxxFloatEnum::POINT_ONE; - } else if (value == 0.2f) { - return SampleTurboModuleCxxFloatEnum::POINT_TWO; + if (value == 1.23f) { + return SampleTurboModuleCxxEnumFloat::FA; + } else if (value == 4.56f) { + return SampleTurboModuleCxxEnumFloat::FB; } else { throw jsi::JSError(rt, \\"No appropriate enum member found for value\\"); } } - static jsi::Value toJs(jsi::Runtime &rt, SampleTurboModuleCxxFloatEnum value) { - if (value == SampleTurboModuleCxxFloatEnum::POINT_ZERO) { - return bridging::toJs(rt, 0.0f); - } else if (value == SampleTurboModuleCxxFloatEnum::POINT_ONE) { - return bridging::toJs(rt, 0.1f); - } else if (value == SampleTurboModuleCxxFloatEnum::POINT_TWO) { - return bridging::toJs(rt, 0.2f); + static jsi::Value toJs(jsi::Runtime &rt, SampleTurboModuleCxxEnumFloat value) { + if (value == SampleTurboModuleCxxEnumFloat::FA) { + return bridging::toJs(rt, 1.23f); + } else if (value == SampleTurboModuleCxxEnumFloat::FB) { + return bridging::toJs(rt, 4.56f); } else { throw jsi::JSError(rt, \\"No appropriate enum member found for enum value\\"); } } }; -#pragma mark - SampleTurboModuleCxxStringEnum +#pragma mark - SampleTurboModuleCxxEnumNone -enum SampleTurboModuleCxxStringEnum { HELLO, GoodBye }; +enum class SampleTurboModuleCxxEnumNone { NA, NB }; template <> -struct Bridging { - static SampleTurboModuleCxxStringEnum fromJs(jsi::Runtime &rt, const jsi::String &rawValue) { +struct Bridging { + static SampleTurboModuleCxxEnumNone fromJs(jsi::Runtime &rt, const jsi::String &rawValue) { std::string value = rawValue.utf8(rt); - if (value == \\"hello\\") { - return SampleTurboModuleCxxStringEnum::HELLO; - } else if (value == \\"goodbye\\") { - return SampleTurboModuleCxxStringEnum::GoodBye; + if (value == \\"NA\\") { + return SampleTurboModuleCxxEnumNone::NA; + } else if (value == \\"NB\\") { + return SampleTurboModuleCxxEnumNone::NB; } else { throw jsi::JSError(rt, \\"No appropriate enum member found for value\\"); } } - static jsi::String toJs(jsi::Runtime &rt, SampleTurboModuleCxxStringEnum value) { - if (value == SampleTurboModuleCxxStringEnum::HELLO) { - return bridging::toJs(rt, \\"hello\\"); - } else if (value == SampleTurboModuleCxxStringEnum::GoodBye) { - return bridging::toJs(rt, \\"goodbye\\"); + static jsi::String toJs(jsi::Runtime &rt, SampleTurboModuleCxxEnumNone value) { + if (value == SampleTurboModuleCxxEnumNone::NA) { + return bridging::toJs(rt, \\"NA\\"); + } else if (value == SampleTurboModuleCxxEnumNone::NB) { + return bridging::toJs(rt, \\"NB\\"); + } else { + throw jsi::JSError(rt, \\"No appropriate enum member found for enum value\\"); + } + } +}; + +#pragma mark - SampleTurboModuleCxxEnumStr + +enum class SampleTurboModuleCxxEnumStr { SA, SB }; + +template <> +struct Bridging { + static SampleTurboModuleCxxEnumStr fromJs(jsi::Runtime &rt, const jsi::String &rawValue) { + std::string value = rawValue.utf8(rt); + if (value == \\"s---a\\") { + return SampleTurboModuleCxxEnumStr::SA; + } else if (value == \\"s---b\\") { + return SampleTurboModuleCxxEnumStr::SB; + } else { + throw jsi::JSError(rt, \\"No appropriate enum member found for value\\"); + } + } + + static jsi::String toJs(jsi::Runtime &rt, SampleTurboModuleCxxEnumStr value) { + if (value == SampleTurboModuleCxxEnumStr::SA) { + return bridging::toJs(rt, \\"s---a\\"); + } else if (value == SampleTurboModuleCxxEnumStr::SB) { + return bridging::toJs(rt, \\"s---b\\"); } else { throw jsi::JSError(rt, \\"No appropriate enum member found for enum value\\"); } } }; -#pragma mark - SampleTurboModuleCxxBaseObjectAlias +#pragma mark - SampleTurboModuleCxxBaseConstantsStruct -template -struct SampleTurboModuleCxxBaseObjectAlias { - P0 x; - bool operator==(const SampleTurboModuleCxxBaseObjectAlias &other) const { - return x == other.x; +template +struct [[deprecated(\\"Use SampleTurboModuleCxxConstantsStruct instead.\\")]] SampleTurboModuleCxxBaseConstantsStruct { + P0 const1; + P1 const2; + P2 const3; + bool operator==(const SampleTurboModuleCxxBaseConstantsStruct &other) const { + return const1 == other.const1 && const2 == other.const2 && const3 == other.const3; } }; -template -struct SampleTurboModuleCxxBaseObjectAliasBridging { - static SampleTurboModuleCxxBaseObjectAlias fromJs( +template +struct [[deprecated(\\"Use SampleTurboModuleCxxConstantsStructBridging instead.\\")]] SampleTurboModuleCxxBaseConstantsStructBridging { + static SampleTurboModuleCxxBaseConstantsStruct fromJs( jsi::Runtime &rt, const jsi::Object &value, const std::shared_ptr &jsInvoker) { - SampleTurboModuleCxxBaseObjectAlias result{ - bridging::fromJs(rt, value.getProperty(rt, \\"x\\"), jsInvoker)}; + SampleTurboModuleCxxBaseConstantsStruct result{ + bridging::fromJs(rt, value.getProperty(rt, \\"const1\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"const2\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"const3\\"), jsInvoker)}; return result; } #ifdef DEBUG - static double xToJs(jsi::Runtime &rt, P0 value) { + static bool const1ToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } + + static double const2ToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } + + static jsi::String const3ToJs(jsi::Runtime &rt, P2 value) { return bridging::toJs(rt, value); } #endif static jsi::Object toJs( jsi::Runtime &rt, - const SampleTurboModuleCxxBaseObjectAlias &value, + const SampleTurboModuleCxxBaseConstantsStruct &value, const std::shared_ptr &jsInvoker) { auto result = facebook::jsi::Object(rt); - result.setProperty(rt, \\"x\\", bridging::toJs(rt, value.x, jsInvoker)); + result.setProperty(rt, \\"const1\\", bridging::toJs(rt, value.const1, jsInvoker)); + result.setProperty(rt, \\"const2\\", bridging::toJs(rt, value.const2, jsInvoker)); + result.setProperty(rt, \\"const3\\", bridging::toJs(rt, value.const3, jsInvoker)); return result; } }; -class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { -protected: - NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); -public: - virtual jsi::Value getMixed(jsi::Runtime &rt, jsi::Value arg) = 0; - virtual std::optional getNullableNumberFromNullableAlias(jsi::Runtime &rt, std::optional a) = 0; - virtual jsi::String getEnums(jsi::Runtime &rt, int enumInt, double enumFloat, jsi::String enumString) = 0; - virtual jsi::Object getUnion(jsi::Runtime &rt, double chooseInt, double chooseFloat, jsi::Object chooseObject, jsi::String chooseString) = 0; - virtual int getEnumReturn(jsi::Runtime &rt) = 0; -}; -template -class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { -public: - jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { - return delegate_.get(rt, propName); - } +#pragma mark - SampleTurboModuleCxxBaseBinaryTreeNode - static constexpr std::string_view kModuleName = \\"SampleTurboModuleCxx\\"; +template +struct [[deprecated(\\"Use SampleTurboModuleCxxBinaryTreeNode instead.\\")]] SampleTurboModuleCxxBaseBinaryTreeNode { + P0 left; + P1 value; + P2 right; + bool operator==(const SampleTurboModuleCxxBaseBinaryTreeNode &other) const { + return left == other.left && value == other.value && right == other.right; + } +}; -protected: - NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} +template +struct [[deprecated(\\"Use SampleTurboModuleCxxBinaryTreeNodeBridging instead.\\")]] SampleTurboModuleCxxBaseBinaryTreeNodeBridging { + static SampleTurboModuleCxxBaseBinaryTreeNode fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + SampleTurboModuleCxxBaseBinaryTreeNode result{ + bridging::fromJs(rt, value.getProperty(rt, \\"left\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"value\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"right\\"), jsInvoker)}; + return result; + } -private: - class Delegate : public NativeSampleTurboModuleCxxSpecJSI { - public: - Delegate(T *instance, std::shared_ptr jsInvoker) : - NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} +#ifdef DEBUG + static jsi::Object leftToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } - jsi::Value getMixed(jsi::Runtime &rt, jsi::Value arg) override { - static_assert( - bridging::getParameterCount(&T::getMixed) == 2, - \\"Expected getMixed(...) to have 2 parameters\\"); + static double valueToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } - return bridging::callFromJs( - rt, &T::getMixed, jsInvoker_, instance_, std::move(arg)); - } - std::optional getNullableNumberFromNullableAlias(jsi::Runtime &rt, std::optional a) override { - static_assert( - bridging::getParameterCount(&T::getNullableNumberFromNullableAlias) == 2, - \\"Expected getNullableNumberFromNullableAlias(...) to have 2 parameters\\"); + static jsi::Object rightToJs(jsi::Runtime &rt, P2 value) { + return bridging::toJs(rt, value); + } +#endif - return bridging::callFromJs>( - rt, &T::getNullableNumberFromNullableAlias, jsInvoker_, instance_, std::move(a)); + static jsi::Object toJs( + jsi::Runtime &rt, + const SampleTurboModuleCxxBaseBinaryTreeNode &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.left) { + result.setProperty(rt, \\"left\\", bridging::toJs(rt, value.left.value(), jsInvoker)); } - jsi::String getEnums(jsi::Runtime &rt, int enumInt, double enumFloat, jsi::String enumString) override { - static_assert( - bridging::getParameterCount(&T::getEnums) == 4, - \\"Expected getEnums(...) to have 4 parameters\\"); - - return bridging::callFromJs( - rt, &T::getEnums, jsInvoker_, instance_, std::move(enumInt), std::move(enumFloat), std::move(enumString)); + result.setProperty(rt, \\"value\\", bridging::toJs(rt, value.value, jsInvoker)); + if (value.right) { + result.setProperty(rt, \\"right\\", bridging::toJs(rt, value.right.value(), jsInvoker)); } - jsi::Object getUnion(jsi::Runtime &rt, double chooseInt, double chooseFloat, jsi::Object chooseObject, jsi::String chooseString) override { - static_assert( - bridging::getParameterCount(&T::getUnion) == 5, - \\"Expected getUnion(...) to have 5 parameters\\"); + return result; + } +}; - return bridging::callFromJs( - rt, &T::getUnion, jsInvoker_, instance_, std::move(chooseInt), std::move(chooseFloat), std::move(chooseObject), std::move(chooseString)); - } - int getEnumReturn(jsi::Runtime &rt) override { - static_assert( - bridging::getParameterCount(&T::getEnumReturn) == 1, - \\"Expected getEnumReturn(...) to have 1 parameters\\"); - return bridging::callFromJs( - rt, &T::getEnumReturn, jsInvoker_, instance_); - } - private: - T *instance_; - }; +#pragma mark - SampleTurboModuleCxxBaseGraphNode - Delegate delegate_; +template +struct [[deprecated(\\"Use SampleTurboModuleCxxGraphNode instead.\\")]] SampleTurboModuleCxxBaseGraphNode { + P0 label; + P1 neighbors; + bool operator==(const SampleTurboModuleCxxBaseGraphNode &other) const { + return label == other.label && neighbors == other.neighbors; + } }; -} // namespace react -} // namespace facebook -", -} -`; - -exports[`GenerateModuleH can generate fixture empty_native_modules 1`] = ` -Map { - "empty_native_modulesJSI.h" => "/** - * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). - * - * Do not edit this file as changes may cause incorrect behavior and will be lost - * once the code is regenerated. - * - * @generated by codegen project: GenerateModuleH.js - */ +template +struct [[deprecated(\\"Use SampleTurboModuleCxxGraphNodeBridging instead.\\")]] SampleTurboModuleCxxBaseGraphNodeBridging { + static SampleTurboModuleCxxBaseGraphNode fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + SampleTurboModuleCxxBaseGraphNode result{ + bridging::fromJs(rt, value.getProperty(rt, \\"label\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"neighbors\\"), jsInvoker)}; + return result; + } -#pragma once +#ifdef DEBUG + static jsi::String labelToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } -#include -#include + static jsi::Array neighborsToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } +#endif -namespace facebook { -namespace react { + static jsi::Object toJs( + jsi::Runtime &rt, + const SampleTurboModuleCxxBaseGraphNode &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"label\\", bridging::toJs(rt, value.label, jsInvoker)); + if (value.neighbors) { + result.setProperty(rt, \\"neighbors\\", bridging::toJs(rt, value.neighbors.value(), jsInvoker)); + } + return result; + } +}; - class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { -protected: - NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); -public: - +#pragma mark - SampleTurboModuleCxxBaseObjectStruct +template +struct [[deprecated(\\"Use SampleTurboModuleCxxObjectStruct instead.\\")]] SampleTurboModuleCxxBaseObjectStruct { + P0 a; + P1 b; + P2 c; + bool operator==(const SampleTurboModuleCxxBaseObjectStruct &other) const { + return a == other.a && b == other.b && c == other.c; + } }; -template -class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { -public: - jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { - return delegate_.get(rt, propName); +template +struct [[deprecated(\\"Use SampleTurboModuleCxxObjectStructBridging instead.\\")]] SampleTurboModuleCxxBaseObjectStructBridging { + static SampleTurboModuleCxxBaseObjectStruct fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + SampleTurboModuleCxxBaseObjectStruct result{ + bridging::fromJs(rt, value.getProperty(rt, \\"a\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"b\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"c\\"), jsInvoker)}; + return result; } - static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; - -protected: - NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} - -private: - class Delegate : public NativeSampleTurboModuleCxxSpecJSI { - public: - Delegate(T *instance, std::shared_ptr jsInvoker) : - NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} +#ifdef DEBUG + static double aToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } - + static jsi::String bToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } - private: - T *instance_; - }; + static std::optional cToJs(jsi::Runtime &rt, P2 value) { + return bridging::toJs(rt, value); + } +#endif - Delegate delegate_; + static jsi::Object toJs( + jsi::Runtime &rt, + const SampleTurboModuleCxxBaseObjectStruct &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"a\\", bridging::toJs(rt, value.a, jsInvoker)); + result.setProperty(rt, \\"b\\", bridging::toJs(rt, value.b, jsInvoker)); + if (value.c) { + result.setProperty(rt, \\"c\\", bridging::toJs(rt, value.c.value(), jsInvoker)); + } + return result; + } }; -} // namespace react -} // namespace facebook -", -} -`; - -exports[`GenerateModuleH can generate fixture native_modules_with_type_aliases 1`] = ` -Map { - "native_modules_with_type_aliasesJSI.h" => "/** - * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). - * - * Do not edit this file as changes may cause incorrect behavior and will be lost - * once the code is regenerated. - * - * @generated by codegen project: GenerateModuleH.js - */ - -#pragma once - -#include -#include - -namespace facebook { -namespace react { - -#pragma mark - AliasTurboModuleBaseOptions +#pragma mark - SampleTurboModuleCxxBaseValueStruct -template -struct AliasTurboModuleBaseOptions { - P0 offset; - P1 size; - P2 displaySize; - P3 resizeMode; - P4 allowExternalStorage; - bool operator==(const AliasTurboModuleBaseOptions &other) const { - return offset == other.offset && size == other.size && displaySize == other.displaySize && resizeMode == other.resizeMode && allowExternalStorage == other.allowExternalStorage; +template +struct [[deprecated(\\"Use SampleTurboModuleCxxValueStruct instead.\\")]] SampleTurboModuleCxxBaseValueStruct { + P0 x; + P1 y; + P2 z; + bool operator==(const SampleTurboModuleCxxBaseValueStruct &other) const { + return x == other.x && y == other.y && z == other.z; } }; -template -struct AliasTurboModuleBaseOptionsBridging { - static AliasTurboModuleBaseOptions fromJs( +template +struct [[deprecated(\\"Use SampleTurboModuleCxxValueStructBridging instead.\\")]] SampleTurboModuleCxxBaseValueStructBridging { + static SampleTurboModuleCxxBaseValueStruct fromJs( jsi::Runtime &rt, const jsi::Object &value, const std::shared_ptr &jsInvoker) { - AliasTurboModuleBaseOptions result{ - bridging::fromJs(rt, value.getProperty(rt, \\"offset\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"size\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"displaySize\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"resizeMode\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"allowExternalStorage\\"), jsInvoker)}; + SampleTurboModuleCxxBaseValueStruct result{ + bridging::fromJs(rt, value.getProperty(rt, \\"x\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"y\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"z\\"), jsInvoker)}; return result; } #ifdef DEBUG - static jsi::Object offsetToJs(jsi::Runtime &rt, P0 value) { - return bridging::toJs(rt, value); - } - - static jsi::Object sizeToJs(jsi::Runtime &rt, P1 value) { - return bridging::toJs(rt, value); - } - - static jsi::Object displaySizeToJs(jsi::Runtime &rt, P2 value) { + static double xToJs(jsi::Runtime &rt, P0 value) { return bridging::toJs(rt, value); } - static jsi::String resizeModeToJs(jsi::Runtime &rt, P3 value) { + static jsi::String yToJs(jsi::Runtime &rt, P1 value) { return bridging::toJs(rt, value); } - static bool allowExternalStorageToJs(jsi::Runtime &rt, P4 value) { + static jsi::Object zToJs(jsi::Runtime &rt, P2 value) { return bridging::toJs(rt, value); } #endif static jsi::Object toJs( jsi::Runtime &rt, - const AliasTurboModuleBaseOptions &value, + const SampleTurboModuleCxxBaseValueStruct &value, const std::shared_ptr &jsInvoker) { auto result = facebook::jsi::Object(rt); - result.setProperty(rt, \\"offset\\", bridging::toJs(rt, value.offset, jsInvoker)); - result.setProperty(rt, \\"size\\", bridging::toJs(rt, value.size, jsInvoker)); - if (value.displaySize) { - result.setProperty(rt, \\"displaySize\\", bridging::toJs(rt, value.displaySize.value(), jsInvoker)); - } - if (value.resizeMode) { - result.setProperty(rt, \\"resizeMode\\", bridging::toJs(rt, value.resizeMode.value(), jsInvoker)); - } - if (value.allowExternalStorage) { - result.setProperty(rt, \\"allowExternalStorage\\", bridging::toJs(rt, value.allowExternalStorage.value(), jsInvoker)); - } + result.setProperty(rt, \\"x\\", bridging::toJs(rt, value.x, jsInvoker)); + result.setProperty(rt, \\"y\\", bridging::toJs(rt, value.y, jsInvoker)); + result.setProperty(rt, \\"z\\", bridging::toJs(rt, value.z, jsInvoker)); return result; } }; -class JSI_EXPORT AliasTurboModuleCxxSpecJSI : public TurboModule { -protected: - AliasTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); + + +#pragma mark - SampleTurboModuleCxxBaseMenuItem + +template +struct [[deprecated(\\"Use SampleTurboModuleCxxMenuItem instead.\\")]] SampleTurboModuleCxxBaseMenuItem { + P0 label; + P1 onPress; + P2 shortcut; + P3 items; + bool operator==(const SampleTurboModuleCxxBaseMenuItem &other) const { + return label == other.label && onPress == other.onPress && shortcut == other.shortcut && items == other.items; + } +}; + +template +struct [[deprecated(\\"Use SampleTurboModuleCxxMenuItemBridging instead.\\")]] SampleTurboModuleCxxBaseMenuItemBridging { + static SampleTurboModuleCxxBaseMenuItem fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + SampleTurboModuleCxxBaseMenuItem result{ + bridging::fromJs(rt, value.getProperty(rt, \\"label\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"onPress\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"shortcut\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"items\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String labelToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } + + static jsi::Function onPressToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } + + static std::optional shortcutToJs(jsi::Runtime &rt, P2 value) { + return bridging::toJs(rt, value); + } + + static jsi::Array itemsToJs(jsi::Runtime &rt, P3 value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const SampleTurboModuleCxxBaseMenuItem &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"label\\", bridging::toJs(rt, value.label, jsInvoker)); + result.setProperty(rt, \\"onPress\\", bridging::toJs(rt, value.onPress, jsInvoker)); + if (value.shortcut) { + result.setProperty(rt, \\"shortcut\\", bridging::toJs(rt, value.shortcut.value(), jsInvoker)); + } + if (value.items) { + result.setProperty(rt, \\"items\\", bridging::toJs(rt, value.items.value(), jsInvoker)); + } + return result; + } +}; + + +#pragma mark - SampleTurboModuleCxxConstantsStruct + +template +struct SampleTurboModuleCxxConstantsStruct { + P0 const1; + P1 const2; + P2 const3; + bool operator==(const SampleTurboModuleCxxConstantsStruct &other) const { + return const1 == other.const1 && const2 == other.const2 && const3 == other.const3; + } +}; + +template +struct SampleTurboModuleCxxConstantsStructBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"const1\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"const2\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"const3\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool const1ToJs(jsi::Runtime &rt, decltype(types.const1) value) { + return bridging::toJs(rt, value); + } + + static double const2ToJs(jsi::Runtime &rt, decltype(types.const2) value) { + return bridging::toJs(rt, value); + } + + static jsi::String const3ToJs(jsi::Runtime &rt, decltype(types.const3) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"const1\\", bridging::toJs(rt, value.const1, jsInvoker)); + result.setProperty(rt, \\"const2\\", bridging::toJs(rt, value.const2, jsInvoker)); + result.setProperty(rt, \\"const3\\", bridging::toJs(rt, value.const3, jsInvoker)); + return result; + } +}; + + + + +#pragma mark - SampleTurboModuleCxxBinaryTreeNode + +template +struct SampleTurboModuleCxxBinaryTreeNode { + std::unique_ptr> left; + P0 value; + std::unique_ptr> right; + bool operator==(const SampleTurboModuleCxxBinaryTreeNode &other) const { + return left == other.left && value == other.value && right == other.right; + } +}; + +template +struct SampleTurboModuleCxxBinaryTreeNodeBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + value.hasProperty(rt, \\"left\\") ? std::make_unique(bridging::fromJs(rt, value.getProperty(rt, \\"left\\"), jsInvoker)) : nullptr, + bridging::fromJs(rt, value.getProperty(rt, \\"value\\"), jsInvoker), + value.hasProperty(rt, \\"right\\") ? std::make_unique(bridging::fromJs(rt, value.getProperty(rt, \\"right\\"), jsInvoker)) : nullptr}; + return result; + } + +#ifdef DEBUG + static jsi::Object leftToJs(jsi::Runtime &rt, decltype(types.left) value) { + return bridging::toJs(rt, value); + } + + static double valueToJs(jsi::Runtime &rt, decltype(types.value) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object rightToJs(jsi::Runtime &rt, decltype(types.right) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.left) { + result.setProperty(rt, \\"left\\", bridging::toJs(rt, *value.left, jsInvoker)); + } + result.setProperty(rt, \\"value\\", bridging::toJs(rt, value.value, jsInvoker)); + if (value.right) { + result.setProperty(rt, \\"right\\", bridging::toJs(rt, *value.right, jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - SampleTurboModuleCxxGraphNode + +template +struct SampleTurboModuleCxxGraphNode { + P0 label; + std::optional>> neighbors; + bool operator==(const SampleTurboModuleCxxGraphNode &other) const { + return label == other.label && neighbors == other.neighbors; + } +}; + +template +struct SampleTurboModuleCxxGraphNodeBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"label\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"neighbors\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String labelToJs(jsi::Runtime &rt, decltype(types.label) value) { + return bridging::toJs(rt, value); + } + + static jsi::Array neighborsToJs(jsi::Runtime &rt, decltype(types.neighbors) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"label\\", bridging::toJs(rt, value.label, jsInvoker)); + if (value.neighbors) { + result.setProperty(rt, \\"neighbors\\", bridging::toJs(rt, value.neighbors.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - SampleTurboModuleCxxObjectStruct + +template +struct SampleTurboModuleCxxObjectStruct { + P0 a; + P1 b; + P2 c; + bool operator==(const SampleTurboModuleCxxObjectStruct &other) const { + return a == other.a && b == other.b && c == other.c; + } +}; + +template +struct SampleTurboModuleCxxObjectStructBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"a\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"b\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"c\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double aToJs(jsi::Runtime &rt, decltype(types.a) value) { + return bridging::toJs(rt, value); + } + + static jsi::String bToJs(jsi::Runtime &rt, decltype(types.b) value) { + return bridging::toJs(rt, value); + } + + static std::optional cToJs(jsi::Runtime &rt, decltype(types.c) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"a\\", bridging::toJs(rt, value.a, jsInvoker)); + result.setProperty(rt, \\"b\\", bridging::toJs(rt, value.b, jsInvoker)); + if (value.c) { + result.setProperty(rt, \\"c\\", bridging::toJs(rt, value.c.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - SampleTurboModuleCxxValueStruct + +template +struct SampleTurboModuleCxxValueStruct { + P0 x; + P1 y; + P2 z; + bool operator==(const SampleTurboModuleCxxValueStruct &other) const { + return x == other.x && y == other.y && z == other.z; + } +}; + +template +struct SampleTurboModuleCxxValueStructBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"x\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"y\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"z\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double xToJs(jsi::Runtime &rt, decltype(types.x) value) { + return bridging::toJs(rt, value); + } + + static jsi::String yToJs(jsi::Runtime &rt, decltype(types.y) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object zToJs(jsi::Runtime &rt, decltype(types.z) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"x\\", bridging::toJs(rt, value.x, jsInvoker)); + result.setProperty(rt, \\"y\\", bridging::toJs(rt, value.y, jsInvoker)); + result.setProperty(rt, \\"z\\", bridging::toJs(rt, value.z, jsInvoker)); + return result; + } +}; + + + +#pragma mark - SampleTurboModuleCxxMenuItem + +template +struct SampleTurboModuleCxxMenuItem { + P0 label; + P1 onPress; + P2 shortcut; + std::optional>> items; + bool operator==(const SampleTurboModuleCxxMenuItem &other) const { + return label == other.label && onPress == other.onPress && shortcut == other.shortcut && items == other.items; + } +}; + +template +struct SampleTurboModuleCxxMenuItemBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"label\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"onPress\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"shortcut\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"items\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String labelToJs(jsi::Runtime &rt, decltype(types.label) value) { + return bridging::toJs(rt, value); + } + + static jsi::Function onPressToJs(jsi::Runtime &rt, decltype(types.onPress) value) { + return bridging::toJs(rt, value); + } + + static std::optional shortcutToJs(jsi::Runtime &rt, decltype(types.shortcut) value) { + return bridging::toJs(rt, value); + } + + static jsi::Array itemsToJs(jsi::Runtime &rt, decltype(types.items) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"label\\", bridging::toJs(rt, value.label, jsInvoker)); + result.setProperty(rt, \\"onPress\\", bridging::toJs(rt, value.onPress, jsInvoker)); + if (value.shortcut) { + result.setProperty(rt, \\"shortcut\\", bridging::toJs(rt, value.shortcut.value(), jsInvoker)); + } + if (value.items) { + result.setProperty(rt, \\"items\\", bridging::toJs(rt, value.items.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { +protected: + NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Array getArray(jsi::Runtime &rt, jsi::Array arg) = 0; + virtual bool getBool(jsi::Runtime &rt, bool arg) = 0; + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value getCustomEnum(jsi::Runtime &rt, jsi::Value arg) = 0; + virtual jsi::Object getCustomHostObject(jsi::Runtime &rt) = 0; + virtual jsi::String consumeCustomHostObject(jsi::Runtime &rt, jsi::Object customHostObject) = 0; + virtual jsi::Object getBinaryTreeNode(jsi::Runtime &rt, jsi::Object arg) = 0; + virtual jsi::Object getGraphNode(jsi::Runtime &rt, jsi::Object arg) = 0; + virtual jsi::Value getNumEnum(jsi::Runtime &rt, jsi::Value arg) = 0; + virtual jsi::String getStrEnum(jsi::Runtime &rt, jsi::String arg) = 0; + virtual jsi::Object getMap(jsi::Runtime &rt, jsi::Object arg) = 0; + virtual double getNumber(jsi::Runtime &rt, double arg) = 0; + virtual jsi::Object getObject(jsi::Runtime &rt, jsi::Object arg) = 0; + virtual jsi::Array getSet(jsi::Runtime &rt, jsi::Array arg) = 0; + virtual jsi::String getString(jsi::Runtime &rt, jsi::String arg) = 0; + virtual jsi::String getUnion(jsi::Runtime &rt, double x, jsi::String y, jsi::Object z) = 0; + virtual jsi::Object getValue(jsi::Runtime &rt, double x, jsi::String y, jsi::Object z) = 0; + virtual void getValueWithCallback(jsi::Runtime &rt, jsi::Function callback) = 0; + virtual jsi::Value getValueWithPromise(jsi::Runtime &rt, bool error) = 0; + virtual std::optional getWithWithOptionalArgs(jsi::Runtime &rt, std::optional optionalArg) = 0; + virtual void voidFunc(jsi::Runtime &rt) = 0; + virtual void setMenu(jsi::Runtime &rt, jsi::Object menuItem) = 0; + virtual void emitCustomDeviceEvent(jsi::Runtime &rt, jsi::String eventName) = 0; + virtual void voidFuncThrows(jsi::Runtime &rt) = 0; + virtual jsi::Object getObjectThrows(jsi::Runtime &rt, jsi::Object arg) = 0; + virtual void voidFuncAssert(jsi::Runtime &rt) = 0; + virtual jsi::Object getObjectAssert(jsi::Runtime &rt, jsi::Object arg) = 0; + +}; + +template +class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + + static constexpr std::string_view kModuleName = \\"SampleTurboModuleCxx\\"; + +protected: + NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeSampleTurboModuleCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + jsi::Array getArray(jsi::Runtime &rt, jsi::Array arg) override { + static_assert( + bridging::getParameterCount(&T::getArray) == 2, + \\"Expected getArray(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getArray, jsInvoker_, instance_, std::move(arg)); + } + bool getBool(jsi::Runtime &rt, bool arg) override { + static_assert( + bridging::getParameterCount(&T::getBool) == 2, + \\"Expected getBool(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getBool, jsInvoker_, instance_, std::move(arg)); + } + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + \\"Expected getConstants(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value getCustomEnum(jsi::Runtime &rt, jsi::Value arg) override { + static_assert( + bridging::getParameterCount(&T::getCustomEnum) == 2, + \\"Expected getCustomEnum(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getCustomEnum, jsInvoker_, instance_, std::move(arg)); + } + jsi::Object getCustomHostObject(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getCustomHostObject) == 1, + \\"Expected getCustomHostObject(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::getCustomHostObject, jsInvoker_, instance_); + } + jsi::String consumeCustomHostObject(jsi::Runtime &rt, jsi::Object customHostObject) override { + static_assert( + bridging::getParameterCount(&T::consumeCustomHostObject) == 2, + \\"Expected consumeCustomHostObject(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::consumeCustomHostObject, jsInvoker_, instance_, std::move(customHostObject)); + } + jsi::Object getBinaryTreeNode(jsi::Runtime &rt, jsi::Object arg) override { + static_assert( + bridging::getParameterCount(&T::getBinaryTreeNode) == 2, + \\"Expected getBinaryTreeNode(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getBinaryTreeNode, jsInvoker_, instance_, std::move(arg)); + } + jsi::Object getGraphNode(jsi::Runtime &rt, jsi::Object arg) override { + static_assert( + bridging::getParameterCount(&T::getGraphNode) == 2, + \\"Expected getGraphNode(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getGraphNode, jsInvoker_, instance_, std::move(arg)); + } + jsi::Value getNumEnum(jsi::Runtime &rt, jsi::Value arg) override { + static_assert( + bridging::getParameterCount(&T::getNumEnum) == 2, + \\"Expected getNumEnum(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getNumEnum, jsInvoker_, instance_, std::move(arg)); + } + jsi::String getStrEnum(jsi::Runtime &rt, jsi::String arg) override { + static_assert( + bridging::getParameterCount(&T::getStrEnum) == 2, + \\"Expected getStrEnum(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getStrEnum, jsInvoker_, instance_, std::move(arg)); + } + jsi::Object getMap(jsi::Runtime &rt, jsi::Object arg) override { + static_assert( + bridging::getParameterCount(&T::getMap) == 2, + \\"Expected getMap(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getMap, jsInvoker_, instance_, std::move(arg)); + } + double getNumber(jsi::Runtime &rt, double arg) override { + static_assert( + bridging::getParameterCount(&T::getNumber) == 2, + \\"Expected getNumber(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getNumber, jsInvoker_, instance_, std::move(arg)); + } + jsi::Object getObject(jsi::Runtime &rt, jsi::Object arg) override { + static_assert( + bridging::getParameterCount(&T::getObject) == 2, + \\"Expected getObject(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getObject, jsInvoker_, instance_, std::move(arg)); + } + jsi::Array getSet(jsi::Runtime &rt, jsi::Array arg) override { + static_assert( + bridging::getParameterCount(&T::getSet) == 2, + \\"Expected getSet(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getSet, jsInvoker_, instance_, std::move(arg)); + } + jsi::String getString(jsi::Runtime &rt, jsi::String arg) override { + static_assert( + bridging::getParameterCount(&T::getString) == 2, + \\"Expected getString(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getString, jsInvoker_, instance_, std::move(arg)); + } + jsi::String getUnion(jsi::Runtime &rt, double x, jsi::String y, jsi::Object z) override { + static_assert( + bridging::getParameterCount(&T::getUnion) == 4, + \\"Expected getUnion(...) to have 4 parameters\\"); + + return bridging::callFromJs( + rt, &T::getUnion, jsInvoker_, instance_, std::move(x), std::move(y), std::move(z)); + } + jsi::Object getValue(jsi::Runtime &rt, double x, jsi::String y, jsi::Object z) override { + static_assert( + bridging::getParameterCount(&T::getValue) == 4, + \\"Expected getValue(...) to have 4 parameters\\"); + + return bridging::callFromJs( + rt, &T::getValue, jsInvoker_, instance_, std::move(x), std::move(y), std::move(z)); + } + void getValueWithCallback(jsi::Runtime &rt, jsi::Function callback) override { + static_assert( + bridging::getParameterCount(&T::getValueWithCallback) == 2, + \\"Expected getValueWithCallback(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getValueWithCallback, jsInvoker_, instance_, std::move(callback)); + } + jsi::Value getValueWithPromise(jsi::Runtime &rt, bool error) override { + static_assert( + bridging::getParameterCount(&T::getValueWithPromise) == 2, + \\"Expected getValueWithPromise(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getValueWithPromise, jsInvoker_, instance_, std::move(error)); + } + std::optional getWithWithOptionalArgs(jsi::Runtime &rt, std::optional optionalArg) override { + static_assert( + bridging::getParameterCount(&T::getWithWithOptionalArgs) == 2, + \\"Expected getWithWithOptionalArgs(...) to have 2 parameters\\"); + + return bridging::callFromJs>( + rt, &T::getWithWithOptionalArgs, jsInvoker_, instance_, std::move(optionalArg)); + } + void voidFunc(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::voidFunc) == 1, + \\"Expected voidFunc(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::voidFunc, jsInvoker_, instance_); + } + void setMenu(jsi::Runtime &rt, jsi::Object menuItem) override { + static_assert( + bridging::getParameterCount(&T::setMenu) == 2, + \\"Expected setMenu(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::setMenu, jsInvoker_, instance_, std::move(menuItem)); + } + void emitCustomDeviceEvent(jsi::Runtime &rt, jsi::String eventName) override { + static_assert( + bridging::getParameterCount(&T::emitCustomDeviceEvent) == 2, + \\"Expected emitCustomDeviceEvent(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::emitCustomDeviceEvent, jsInvoker_, instance_, std::move(eventName)); + } + void voidFuncThrows(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::voidFuncThrows) == 1, + \\"Expected voidFuncThrows(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::voidFuncThrows, jsInvoker_, instance_); + } + jsi::Object getObjectThrows(jsi::Runtime &rt, jsi::Object arg) override { + static_assert( + bridging::getParameterCount(&T::getObjectThrows) == 2, + \\"Expected getObjectThrows(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getObjectThrows, jsInvoker_, instance_, std::move(arg)); + } + void voidFuncAssert(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::voidFuncAssert) == 1, + \\"Expected voidFuncAssert(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::voidFuncAssert, jsInvoker_, instance_); + } + jsi::Object getObjectAssert(jsi::Runtime &rt, jsi::Object arg) override { + static_assert( + bridging::getParameterCount(&T::getObjectAssert) == 2, + \\"Expected getObjectAssert(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getObjectAssert, jsInvoker_, instance_, std::move(arg)); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react +", +} +`; + +exports[`GenerateModuleH can generate fixture empty_native_modules 1`] = ` +Map { + "empty_native_modulesJSI.h" => "/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { +protected: + NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + + +}; + +template +class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + +protected: + NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeSampleTurboModuleCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + + + private: + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react +", +} +`; + +exports[`GenerateModuleH can generate fixture native_modules_with_type_aliases 1`] = ` +Map { + "native_modules_with_type_aliasesJSI.h" => "/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - AliasTurboModuleBaseOptions + +template +struct [[deprecated(\\"Use AliasTurboModuleOptions instead.\\")]] AliasTurboModuleBaseOptions { + P0 offset; + P1 size; + P2 displaySize; + P3 resizeMode; + P4 allowExternalStorage; + bool operator==(const AliasTurboModuleBaseOptions &other) const { + return offset == other.offset && size == other.size && displaySize == other.displaySize && resizeMode == other.resizeMode && allowExternalStorage == other.allowExternalStorage; + } +}; + +template +struct [[deprecated(\\"Use AliasTurboModuleOptionsBridging instead.\\")]] AliasTurboModuleBaseOptionsBridging { + static AliasTurboModuleBaseOptions fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + AliasTurboModuleBaseOptions result{ + bridging::fromJs(rt, value.getProperty(rt, \\"offset\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"size\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"displaySize\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"resizeMode\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"allowExternalStorage\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object offsetToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } + + static jsi::Object sizeToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } + + static jsi::Object displaySizeToJs(jsi::Runtime &rt, P2 value) { + return bridging::toJs(rt, value); + } + + static jsi::String resizeModeToJs(jsi::Runtime &rt, P3 value) { + return bridging::toJs(rt, value); + } + + static bool allowExternalStorageToJs(jsi::Runtime &rt, P4 value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const AliasTurboModuleBaseOptions &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"offset\\", bridging::toJs(rt, value.offset, jsInvoker)); + result.setProperty(rt, \\"size\\", bridging::toJs(rt, value.size, jsInvoker)); + if (value.displaySize) { + result.setProperty(rt, \\"displaySize\\", bridging::toJs(rt, value.displaySize.value(), jsInvoker)); + } + if (value.resizeMode) { + result.setProperty(rt, \\"resizeMode\\", bridging::toJs(rt, value.resizeMode.value(), jsInvoker)); + } + if (value.allowExternalStorage) { + result.setProperty(rt, \\"allowExternalStorage\\", bridging::toJs(rt, value.allowExternalStorage.value(), jsInvoker)); + } + return result; + } +}; + + +#pragma mark - AliasTurboModuleOptions + +template +struct AliasTurboModuleOptions { + P0 offset; + P1 size; + P2 displaySize; + P3 resizeMode; + P4 allowExternalStorage; + bool operator==(const AliasTurboModuleOptions &other) const { + return offset == other.offset && size == other.size && displaySize == other.displaySize && resizeMode == other.resizeMode && allowExternalStorage == other.allowExternalStorage; + } +}; + +template +struct AliasTurboModuleOptionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"offset\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"size\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"displaySize\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"resizeMode\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"allowExternalStorage\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object offsetToJs(jsi::Runtime &rt, decltype(types.offset) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object sizeToJs(jsi::Runtime &rt, decltype(types.size) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object displaySizeToJs(jsi::Runtime &rt, decltype(types.displaySize) value) { + return bridging::toJs(rt, value); + } + + static jsi::String resizeModeToJs(jsi::Runtime &rt, decltype(types.resizeMode) value) { + return bridging::toJs(rt, value); + } + + static bool allowExternalStorageToJs(jsi::Runtime &rt, decltype(types.allowExternalStorage) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"offset\\", bridging::toJs(rt, value.offset, jsInvoker)); + result.setProperty(rt, \\"size\\", bridging::toJs(rt, value.size, jsInvoker)); + if (value.displaySize) { + result.setProperty(rt, \\"displaySize\\", bridging::toJs(rt, value.displaySize.value(), jsInvoker)); + } + if (value.resizeMode) { + result.setProperty(rt, \\"resizeMode\\", bridging::toJs(rt, value.resizeMode.value(), jsInvoker)); + } + if (value.allowExternalStorage) { + result.setProperty(rt, \\"allowExternalStorage\\", bridging::toJs(rt, value.allowExternalStorage.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT AliasTurboModuleCxxSpecJSI : public TurboModule { +protected: + AliasTurboModuleCxxSpecJSI(std::shared_ptr jsInvoker); public: virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; @@ -599,7 +1520,7 @@ public: protected: AliasTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{AliasTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public AliasTurboModuleCxxSpecJSI { @@ -628,96 +1549,349 @@ private: T *instance_; }; - Delegate delegate_; -}; + Delegate delegate_; +}; + +} // namespace facebook::react +", +} +`; + +exports[`GenerateModuleH can generate fixture real_module_example 1`] = ` +Map { + "real_module_exampleJSI.h" => "/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - CameraRollManagerBasePhotoIdentifierImage + +template +struct [[deprecated(\\"Use CameraRollManagerPhotoIdentifierImage instead.\\")]] CameraRollManagerBasePhotoIdentifierImage { + P0 uri; + P1 playableDuration; + P2 width; + P3 height; + P4 isStored; + P5 filename; + bool operator==(const CameraRollManagerBasePhotoIdentifierImage &other) const { + return uri == other.uri && playableDuration == other.playableDuration && width == other.width && height == other.height && isStored == other.isStored && filename == other.filename; + } +}; + +template +struct [[deprecated(\\"Use CameraRollManagerPhotoIdentifierImageBridging instead.\\")]] CameraRollManagerBasePhotoIdentifierImageBridging { + static CameraRollManagerBasePhotoIdentifierImage fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + CameraRollManagerBasePhotoIdentifierImage result{ + bridging::fromJs(rt, value.getProperty(rt, \\"uri\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"playableDuration\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"width\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"height\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"isStored\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"filename\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String uriToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } + + static double playableDurationToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } + + static double widthToJs(jsi::Runtime &rt, P2 value) { + return bridging::toJs(rt, value); + } + + static double heightToJs(jsi::Runtime &rt, P3 value) { + return bridging::toJs(rt, value); + } + + static bool isStoredToJs(jsi::Runtime &rt, P4 value) { + return bridging::toJs(rt, value); + } + + static jsi::String filenameToJs(jsi::Runtime &rt, P5 value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const CameraRollManagerBasePhotoIdentifierImage &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"uri\\", bridging::toJs(rt, value.uri, jsInvoker)); + result.setProperty(rt, \\"playableDuration\\", bridging::toJs(rt, value.playableDuration, jsInvoker)); + result.setProperty(rt, \\"width\\", bridging::toJs(rt, value.width, jsInvoker)); + result.setProperty(rt, \\"height\\", bridging::toJs(rt, value.height, jsInvoker)); + if (value.isStored) { + result.setProperty(rt, \\"isStored\\", bridging::toJs(rt, value.isStored.value(), jsInvoker)); + } + result.setProperty(rt, \\"filename\\", bridging::toJs(rt, value.filename, jsInvoker)); + return result; + } +}; + + + +#pragma mark - CameraRollManagerBasePhotoIdentifier + +template +struct [[deprecated(\\"Use CameraRollManagerPhotoIdentifier instead.\\")]] CameraRollManagerBasePhotoIdentifier { + P0 node; + bool operator==(const CameraRollManagerBasePhotoIdentifier &other) const { + return node == other.node; + } +}; + +template +struct [[deprecated(\\"Use CameraRollManagerPhotoIdentifierBridging instead.\\")]] CameraRollManagerBasePhotoIdentifierBridging { + static CameraRollManagerBasePhotoIdentifier fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + CameraRollManagerBasePhotoIdentifier result{ + bridging::fromJs(rt, value.getProperty(rt, \\"node\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object nodeToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const CameraRollManagerBasePhotoIdentifier &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"node\\", bridging::toJs(rt, value.node, jsInvoker)); + return result; + } +}; + + + +#pragma mark - CameraRollManagerBasePhotoIdentifiersPage + +template +struct [[deprecated(\\"Use CameraRollManagerPhotoIdentifiersPage instead.\\")]] CameraRollManagerBasePhotoIdentifiersPage { + P0 edges; + P1 page_info; + bool operator==(const CameraRollManagerBasePhotoIdentifiersPage &other) const { + return edges == other.edges && page_info == other.page_info; + } +}; + +template +struct [[deprecated(\\"Use CameraRollManagerPhotoIdentifiersPageBridging instead.\\")]] CameraRollManagerBasePhotoIdentifiersPageBridging { + static CameraRollManagerBasePhotoIdentifiersPage fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + CameraRollManagerBasePhotoIdentifiersPage result{ + bridging::fromJs(rt, value.getProperty(rt, \\"edges\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"page_info\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Array edgesToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } + + static jsi::Object page_infoToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const CameraRollManagerBasePhotoIdentifiersPage &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"edges\\", bridging::toJs(rt, value.edges, jsInvoker)); + result.setProperty(rt, \\"page_info\\", bridging::toJs(rt, value.page_info, jsInvoker)); + return result; + } +}; + + + +#pragma mark - CameraRollManagerBaseGetPhotosParams + +template +struct [[deprecated(\\"Use CameraRollManagerGetPhotosParams instead.\\")]] CameraRollManagerBaseGetPhotosParams { + P0 first; + P1 after; + P2 groupName; + P3 groupTypes; + P4 assetType; + P5 maxSize; + P6 mimeTypes; + bool operator==(const CameraRollManagerBaseGetPhotosParams &other) const { + return first == other.first && after == other.after && groupName == other.groupName && groupTypes == other.groupTypes && assetType == other.assetType && maxSize == other.maxSize && mimeTypes == other.mimeTypes; + } +}; + +template +struct [[deprecated(\\"Use CameraRollManagerGetPhotosParamsBridging instead.\\")]] CameraRollManagerBaseGetPhotosParamsBridging { + static CameraRollManagerBaseGetPhotosParams fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + CameraRollManagerBaseGetPhotosParams result{ + bridging::fromJs(rt, value.getProperty(rt, \\"first\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"after\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"groupName\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"groupTypes\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"assetType\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"maxSize\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"mimeTypes\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double firstToJs(jsi::Runtime &rt, P0 value) { + return bridging::toJs(rt, value); + } + + static jsi::String afterToJs(jsi::Runtime &rt, P1 value) { + return bridging::toJs(rt, value); + } -} // namespace react -} // namespace facebook -", -} -`; + static jsi::String groupNameToJs(jsi::Runtime &rt, P2 value) { + return bridging::toJs(rt, value); + } -exports[`GenerateModuleH can generate fixture real_module_example 1`] = ` -Map { - "real_module_exampleJSI.h" => "/** - * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). - * - * Do not edit this file as changes may cause incorrect behavior and will be lost - * once the code is regenerated. - * - * @generated by codegen project: GenerateModuleH.js - */ + static jsi::String groupTypesToJs(jsi::Runtime &rt, P3 value) { + return bridging::toJs(rt, value); + } -#pragma once + static jsi::String assetTypeToJs(jsi::Runtime &rt, P4 value) { + return bridging::toJs(rt, value); + } -#include -#include + static double maxSizeToJs(jsi::Runtime &rt, P5 value) { + return bridging::toJs(rt, value); + } + + static jsi::Array mimeTypesToJs(jsi::Runtime &rt, P6 value) { + return bridging::toJs(rt, value); + } +#endif -namespace facebook { -namespace react { + static jsi::Object toJs( + jsi::Runtime &rt, + const CameraRollManagerBaseGetPhotosParams &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"first\\", bridging::toJs(rt, value.first, jsInvoker)); + if (value.after) { + result.setProperty(rt, \\"after\\", bridging::toJs(rt, value.after.value(), jsInvoker)); + } + if (value.groupName) { + result.setProperty(rt, \\"groupName\\", bridging::toJs(rt, value.groupName.value(), jsInvoker)); + } + if (value.groupTypes) { + result.setProperty(rt, \\"groupTypes\\", bridging::toJs(rt, value.groupTypes.value(), jsInvoker)); + } + if (value.assetType) { + result.setProperty(rt, \\"assetType\\", bridging::toJs(rt, value.assetType.value(), jsInvoker)); + } + if (value.maxSize) { + result.setProperty(rt, \\"maxSize\\", bridging::toJs(rt, value.maxSize.value(), jsInvoker)); + } + if (value.mimeTypes) { + result.setProperty(rt, \\"mimeTypes\\", bridging::toJs(rt, value.mimeTypes.value(), jsInvoker)); + } + return result; + } +}; - -#pragma mark - CameraRollManagerBasePhotoIdentifierImage +#pragma mark - CameraRollManagerPhotoIdentifierImage template -struct CameraRollManagerBasePhotoIdentifierImage { +struct CameraRollManagerPhotoIdentifierImage { P0 uri; P1 playableDuration; P2 width; P3 height; P4 isStored; P5 filename; - bool operator==(const CameraRollManagerBasePhotoIdentifierImage &other) const { + bool operator==(const CameraRollManagerPhotoIdentifierImage &other) const { return uri == other.uri && playableDuration == other.playableDuration && width == other.width && height == other.height && isStored == other.isStored && filename == other.filename; } }; -template -struct CameraRollManagerBasePhotoIdentifierImageBridging { - static CameraRollManagerBasePhotoIdentifierImage fromJs( +template +struct CameraRollManagerPhotoIdentifierImageBridging { + static T types; + + static T fromJs( jsi::Runtime &rt, const jsi::Object &value, const std::shared_ptr &jsInvoker) { - CameraRollManagerBasePhotoIdentifierImage result{ - bridging::fromJs(rt, value.getProperty(rt, \\"uri\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"playableDuration\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"width\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"height\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"isStored\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"filename\\"), jsInvoker)}; + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"uri\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"playableDuration\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"width\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"height\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"isStored\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"filename\\"), jsInvoker)}; return result; } #ifdef DEBUG - static jsi::String uriToJs(jsi::Runtime &rt, P0 value) { + static jsi::String uriToJs(jsi::Runtime &rt, decltype(types.uri) value) { return bridging::toJs(rt, value); } - static double playableDurationToJs(jsi::Runtime &rt, P1 value) { + static double playableDurationToJs(jsi::Runtime &rt, decltype(types.playableDuration) value) { return bridging::toJs(rt, value); } - static double widthToJs(jsi::Runtime &rt, P2 value) { + static double widthToJs(jsi::Runtime &rt, decltype(types.width) value) { return bridging::toJs(rt, value); } - static double heightToJs(jsi::Runtime &rt, P3 value) { + static double heightToJs(jsi::Runtime &rt, decltype(types.height) value) { return bridging::toJs(rt, value); } - static bool isStoredToJs(jsi::Runtime &rt, P4 value) { + static bool isStoredToJs(jsi::Runtime &rt, decltype(types.isStored) value) { return bridging::toJs(rt, value); } - static jsi::String filenameToJs(jsi::Runtime &rt, P5 value) { + static jsi::String filenameToJs(jsi::Runtime &rt, decltype(types.filename) value) { return bridging::toJs(rt, value); } #endif static jsi::Object toJs( jsi::Runtime &rt, - const CameraRollManagerBasePhotoIdentifierImage &value, + const T &value, const std::shared_ptr &jsInvoker) { auto result = facebook::jsi::Object(rt); result.setProperty(rt, \\"uri\\", bridging::toJs(rt, value.uri, jsInvoker)); @@ -734,36 +1908,38 @@ struct CameraRollManagerBasePhotoIdentifierImageBridging { -#pragma mark - CameraRollManagerBasePhotoIdentifier +#pragma mark - CameraRollManagerPhotoIdentifier template -struct CameraRollManagerBasePhotoIdentifier { +struct CameraRollManagerPhotoIdentifier { P0 node; - bool operator==(const CameraRollManagerBasePhotoIdentifier &other) const { + bool operator==(const CameraRollManagerPhotoIdentifier &other) const { return node == other.node; } }; -template -struct CameraRollManagerBasePhotoIdentifierBridging { - static CameraRollManagerBasePhotoIdentifier fromJs( +template +struct CameraRollManagerPhotoIdentifierBridging { + static T types; + + static T fromJs( jsi::Runtime &rt, const jsi::Object &value, const std::shared_ptr &jsInvoker) { - CameraRollManagerBasePhotoIdentifier result{ - bridging::fromJs(rt, value.getProperty(rt, \\"node\\"), jsInvoker)}; + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"node\\"), jsInvoker)}; return result; } #ifdef DEBUG - static jsi::Object nodeToJs(jsi::Runtime &rt, P0 value) { + static jsi::Object nodeToJs(jsi::Runtime &rt, decltype(types.node) value) { return bridging::toJs(rt, value); } #endif static jsi::Object toJs( jsi::Runtime &rt, - const CameraRollManagerBasePhotoIdentifier &value, + const T &value, const std::shared_ptr &jsInvoker) { auto result = facebook::jsi::Object(rt); result.setProperty(rt, \\"node\\", bridging::toJs(rt, value.node, jsInvoker)); @@ -773,42 +1949,44 @@ struct CameraRollManagerBasePhotoIdentifierBridging { -#pragma mark - CameraRollManagerBasePhotoIdentifiersPage +#pragma mark - CameraRollManagerPhotoIdentifiersPage template -struct CameraRollManagerBasePhotoIdentifiersPage { +struct CameraRollManagerPhotoIdentifiersPage { P0 edges; P1 page_info; - bool operator==(const CameraRollManagerBasePhotoIdentifiersPage &other) const { + bool operator==(const CameraRollManagerPhotoIdentifiersPage &other) const { return edges == other.edges && page_info == other.page_info; } }; -template -struct CameraRollManagerBasePhotoIdentifiersPageBridging { - static CameraRollManagerBasePhotoIdentifiersPage fromJs( +template +struct CameraRollManagerPhotoIdentifiersPageBridging { + static T types; + + static T fromJs( jsi::Runtime &rt, const jsi::Object &value, const std::shared_ptr &jsInvoker) { - CameraRollManagerBasePhotoIdentifiersPage result{ - bridging::fromJs(rt, value.getProperty(rt, \\"edges\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"page_info\\"), jsInvoker)}; + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"edges\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"page_info\\"), jsInvoker)}; return result; } #ifdef DEBUG - static jsi::Array edgesToJs(jsi::Runtime &rt, P0 value) { + static jsi::Array edgesToJs(jsi::Runtime &rt, decltype(types.edges) value) { return bridging::toJs(rt, value); } - static jsi::Object page_infoToJs(jsi::Runtime &rt, P1 value) { + static jsi::Object page_infoToJs(jsi::Runtime &rt, decltype(types.page_info) value) { return bridging::toJs(rt, value); } #endif static jsi::Object toJs( jsi::Runtime &rt, - const CameraRollManagerBasePhotoIdentifiersPage &value, + const T &value, const std::shared_ptr &jsInvoker) { auto result = facebook::jsi::Object(rt); result.setProperty(rt, \\"edges\\", bridging::toJs(rt, value.edges, jsInvoker)); @@ -819,10 +1997,10 @@ struct CameraRollManagerBasePhotoIdentifiersPageBridging { -#pragma mark - CameraRollManagerBaseGetPhotosParams +#pragma mark - CameraRollManagerGetPhotosParams template -struct CameraRollManagerBaseGetPhotosParams { +struct CameraRollManagerGetPhotosParams { P0 first; P1 after; P2 groupName; @@ -830,61 +2008,63 @@ struct CameraRollManagerBaseGetPhotosParams { P4 assetType; P5 maxSize; P6 mimeTypes; - bool operator==(const CameraRollManagerBaseGetPhotosParams &other) const { + bool operator==(const CameraRollManagerGetPhotosParams &other) const { return first == other.first && after == other.after && groupName == other.groupName && groupTypes == other.groupTypes && assetType == other.assetType && maxSize == other.maxSize && mimeTypes == other.mimeTypes; } }; -template -struct CameraRollManagerBaseGetPhotosParamsBridging { - static CameraRollManagerBaseGetPhotosParams fromJs( +template +struct CameraRollManagerGetPhotosParamsBridging { + static T types; + + static T fromJs( jsi::Runtime &rt, const jsi::Object &value, const std::shared_ptr &jsInvoker) { - CameraRollManagerBaseGetPhotosParams result{ - bridging::fromJs(rt, value.getProperty(rt, \\"first\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"after\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"groupName\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"groupTypes\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"assetType\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"maxSize\\"), jsInvoker), - bridging::fromJs(rt, value.getProperty(rt, \\"mimeTypes\\"), jsInvoker)}; + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"first\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"after\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"groupName\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"groupTypes\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"assetType\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"maxSize\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"mimeTypes\\"), jsInvoker)}; return result; } #ifdef DEBUG - static double firstToJs(jsi::Runtime &rt, P0 value) { + static double firstToJs(jsi::Runtime &rt, decltype(types.first) value) { return bridging::toJs(rt, value); } - static jsi::String afterToJs(jsi::Runtime &rt, P1 value) { + static jsi::String afterToJs(jsi::Runtime &rt, decltype(types.after) value) { return bridging::toJs(rt, value); } - static jsi::String groupNameToJs(jsi::Runtime &rt, P2 value) { + static jsi::String groupNameToJs(jsi::Runtime &rt, decltype(types.groupName) value) { return bridging::toJs(rt, value); } - static jsi::String groupTypesToJs(jsi::Runtime &rt, P3 value) { + static jsi::String groupTypesToJs(jsi::Runtime &rt, decltype(types.groupTypes) value) { return bridging::toJs(rt, value); } - static jsi::String assetTypeToJs(jsi::Runtime &rt, P4 value) { + static jsi::String assetTypeToJs(jsi::Runtime &rt, decltype(types.assetType) value) { return bridging::toJs(rt, value); } - static double maxSizeToJs(jsi::Runtime &rt, P5 value) { + static double maxSizeToJs(jsi::Runtime &rt, decltype(types.maxSize) value) { return bridging::toJs(rt, value); } - static jsi::Array mimeTypesToJs(jsi::Runtime &rt, P6 value) { + static jsi::Array mimeTypesToJs(jsi::Runtime &rt, decltype(types.mimeTypes) value) { return bridging::toJs(rt, value); } #endif static jsi::Object toJs( jsi::Runtime &rt, - const CameraRollManagerBaseGetPhotosParams &value, + const T &value, const std::shared_ptr &jsInvoker) { auto result = facebook::jsi::Object(rt); result.setProperty(rt, \\"first\\", bridging::toJs(rt, value.first, jsInvoker)); @@ -934,7 +2114,7 @@ public: protected: NativeCameraRollManagerCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeCameraRollManagerCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeCameraRollManagerCxxSpecJSI { @@ -987,7 +2167,7 @@ private: #pragma mark - ExceptionsManagerBaseStackFrame template -struct ExceptionsManagerBaseStackFrame { +struct [[deprecated(\\"Use ExceptionsManagerStackFrame instead.\\")]] ExceptionsManagerBaseStackFrame { P0 column; P1 file; P2 lineNumber; @@ -999,7 +2179,7 @@ struct ExceptionsManagerBaseStackFrame { }; template -struct ExceptionsManagerBaseStackFrameBridging { +struct [[deprecated(\\"Use ExceptionsManagerStackFrameBridging instead.\\")]] ExceptionsManagerBaseStackFrameBridging { static ExceptionsManagerBaseStackFrame fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -1060,7 +2240,7 @@ struct ExceptionsManagerBaseStackFrameBridging { #pragma mark - ExceptionsManagerBaseExceptionData template -struct ExceptionsManagerBaseExceptionData { +struct [[deprecated(\\"Use ExceptionsManagerExceptionData instead.\\")]] ExceptionsManagerBaseExceptionData { P0 message; P1 originalMessage; P2 name; @@ -1075,7 +2255,7 @@ struct ExceptionsManagerBaseExceptionData { }; template -struct ExceptionsManagerBaseExceptionDataBridging { +struct [[deprecated(\\"Use ExceptionsManagerExceptionDataBridging instead.\\")]] ExceptionsManagerBaseExceptionDataBridging { static ExceptionsManagerBaseExceptionData fromJs( jsi::Runtime &rt, const jsi::Object &value, @@ -1145,6 +2325,172 @@ struct ExceptionsManagerBaseExceptionDataBridging { } }; + +#pragma mark - ExceptionsManagerStackFrame + +template +struct ExceptionsManagerStackFrame { + P0 column; + P1 file; + P2 lineNumber; + P3 methodName; + P4 collapse; + bool operator==(const ExceptionsManagerStackFrame &other) const { + return column == other.column && file == other.file && lineNumber == other.lineNumber && methodName == other.methodName && collapse == other.collapse; + } +}; + +template +struct ExceptionsManagerStackFrameBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"column\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"file\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"lineNumber\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"methodName\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"collapse\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double columnToJs(jsi::Runtime &rt, decltype(types.column) value) { + return bridging::toJs(rt, value); + } + + static jsi::String fileToJs(jsi::Runtime &rt, decltype(types.file) value) { + return bridging::toJs(rt, value); + } + + static double lineNumberToJs(jsi::Runtime &rt, decltype(types.lineNumber) value) { + return bridging::toJs(rt, value); + } + + static jsi::String methodNameToJs(jsi::Runtime &rt, decltype(types.methodName) value) { + return bridging::toJs(rt, value); + } + + static bool collapseToJs(jsi::Runtime &rt, decltype(types.collapse) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.column) { + result.setProperty(rt, \\"column\\", bridging::toJs(rt, value.column.value(), jsInvoker)); + } + result.setProperty(rt, \\"file\\", bridging::toJs(rt, value.file, jsInvoker)); + if (value.lineNumber) { + result.setProperty(rt, \\"lineNumber\\", bridging::toJs(rt, value.lineNumber.value(), jsInvoker)); + } + result.setProperty(rt, \\"methodName\\", bridging::toJs(rt, value.methodName, jsInvoker)); + if (value.collapse) { + result.setProperty(rt, \\"collapse\\", bridging::toJs(rt, value.collapse.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - ExceptionsManagerExceptionData + +template +struct ExceptionsManagerExceptionData { + P0 message; + P1 originalMessage; + P2 name; + P3 componentStack; + P4 stack; + P5 id; + P6 isFatal; + P7 extraData; + bool operator==(const ExceptionsManagerExceptionData &other) const { + return message == other.message && originalMessage == other.originalMessage && name == other.name && componentStack == other.componentStack && stack == other.stack && id == other.id && isFatal == other.isFatal && extraData == other.extraData; + } +}; + +template +struct ExceptionsManagerExceptionDataBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, \\"message\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"originalMessage\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"name\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"componentStack\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"stack\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"id\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"isFatal\\"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, \\"extraData\\"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String messageToJs(jsi::Runtime &rt, decltype(types.message) value) { + return bridging::toJs(rt, value); + } + + static jsi::String originalMessageToJs(jsi::Runtime &rt, decltype(types.originalMessage) value) { + return bridging::toJs(rt, value); + } + + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } + + static jsi::String componentStackToJs(jsi::Runtime &rt, decltype(types.componentStack) value) { + return bridging::toJs(rt, value); + } + + static jsi::Array stackToJs(jsi::Runtime &rt, decltype(types.stack) value) { + return bridging::toJs(rt, value); + } + + static double idToJs(jsi::Runtime &rt, decltype(types.id) value) { + return bridging::toJs(rt, value); + } + + static bool isFatalToJs(jsi::Runtime &rt, decltype(types.isFatal) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object extraDataToJs(jsi::Runtime &rt, decltype(types.extraData) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, \\"message\\", bridging::toJs(rt, value.message, jsInvoker)); + result.setProperty(rt, \\"originalMessage\\", bridging::toJs(rt, value.originalMessage, jsInvoker)); + result.setProperty(rt, \\"name\\", bridging::toJs(rt, value.name, jsInvoker)); + result.setProperty(rt, \\"componentStack\\", bridging::toJs(rt, value.componentStack, jsInvoker)); + result.setProperty(rt, \\"stack\\", bridging::toJs(rt, value.stack, jsInvoker)); + result.setProperty(rt, \\"id\\", bridging::toJs(rt, value.id, jsInvoker)); + result.setProperty(rt, \\"isFatal\\", bridging::toJs(rt, value.isFatal, jsInvoker)); + if (value.extraData) { + result.setProperty(rt, \\"extraData\\", bridging::toJs(rt, value.extraData.value(), jsInvoker)); + } + return result; + } +}; + class JSI_EXPORT NativeExceptionsManagerCxxSpecJSI : public TurboModule { protected: NativeExceptionsManagerCxxSpecJSI(std::shared_ptr jsInvoker); @@ -1170,7 +2516,7 @@ public: protected: NativeExceptionsManagerCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeExceptionsManagerCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeExceptionsManagerCxxSpecJSI { @@ -1226,8 +2572,7 @@ private: Delegate delegate_; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1248,13 +2593,12 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { #pragma mark - SampleTurboModuleNumEnum -enum SampleTurboModuleNumEnum { ONE, TWO }; +enum class SampleTurboModuleNumEnum { ONE, TWO }; template <> struct Bridging { @@ -1282,7 +2626,7 @@ struct Bridging { #pragma mark - SampleTurboModuleFloatEnum -enum SampleTurboModuleFloatEnum { POINT_ZERO, POINT_ONE, POINT_TWO }; +enum class SampleTurboModuleFloatEnum { POINT_ZERO, POINT_ONE, POINT_TWO }; template <> struct Bridging { @@ -1314,7 +2658,7 @@ struct Bridging { #pragma mark - SampleTurboModuleStringEnum -enum SampleTurboModuleStringEnum { HELLO, GoodBye }; +enum class SampleTurboModuleStringEnum { HELLO, GoodBye }; template <> struct Bridging { @@ -1353,11 +2697,11 @@ public: virtual jsi::Object getObject(jsi::Runtime &rt, jsi::Object arg) = 0; virtual double getRootTag(jsi::Runtime &rt, double arg) = 0; virtual jsi::Object getValue(jsi::Runtime &rt, double x, jsi::String y, jsi::Object z) = 0; - virtual int getEnumReturn(jsi::Runtime &rt) = 0; + virtual jsi::Value getEnumReturn(jsi::Runtime &rt) = 0; virtual void getValueWithCallback(jsi::Runtime &rt, jsi::Function callback) = 0; virtual jsi::Value getValueWithPromise(jsi::Runtime &rt, bool error) = 0; virtual jsi::Value getValueWithOptionalArg(jsi::Runtime &rt, std::optional parameter) = 0; - virtual jsi::String getEnums(jsi::Runtime &rt, int enumInt, double enumFloat, jsi::String enumString) = 0; + virtual jsi::String getEnums(jsi::Runtime &rt, jsi::Value enumInt, jsi::Value enumFloat, jsi::String enumString) = 0; }; @@ -1373,7 +2717,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -1453,12 +2797,12 @@ private: return bridging::callFromJs( rt, &T::getValue, jsInvoker_, instance_, std::move(x), std::move(y), std::move(z)); } - int getEnumReturn(jsi::Runtime &rt) override { + jsi::Value getEnumReturn(jsi::Runtime &rt) override { static_assert( bridging::getParameterCount(&T::getEnumReturn) == 1, \\"Expected getEnumReturn(...) to have 1 parameters\\"); - return bridging::callFromJs( + return bridging::callFromJs( rt, &T::getEnumReturn, jsInvoker_, instance_); } void getValueWithCallback(jsi::Runtime &rt, jsi::Function callback) override { @@ -1485,7 +2829,7 @@ private: return bridging::callFromJs( rt, &T::getValueWithOptionalArg, jsInvoker_, instance_, std::move(parameter)); } - jsi::String getEnums(jsi::Runtime &rt, int enumInt, double enumFloat, jsi::String enumString) override { + jsi::String getEnums(jsi::Runtime &rt, jsi::Value enumInt, jsi::Value enumFloat, jsi::String enumString) override { static_assert( bridging::getParameterCount(&T::getEnums) == 4, \\"Expected getEnums(...) to have 4 parameters\\"); @@ -1501,8 +2845,7 @@ private: Delegate delegate_; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -1523,8 +2866,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { class JSI_EXPORT NativeSampleTurboModuleCxxSpecJSI : public TurboModule { @@ -1548,7 +2890,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -1595,7 +2937,7 @@ public: protected: NativeSampleTurboModule2CxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModule2CxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModule2CxxSpecJSI { @@ -1627,8 +2969,7 @@ private: Delegate delegate_; }; -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap index fdd04f630546b5..d65cd4166702ae 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap @@ -35,17 +35,15 @@ Map { @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModule' - */ - class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModule' + */ + class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react ", } @@ -197,17 +195,15 @@ namespace JS { - (NSArray> * _Nullable)getNullableArray; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModule' - */ - class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModule' + */ + class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react inline bool JS::NativeSampleTurboModule::SpecDifficultAE::D() const { id const p = _v[@\\"D\\"]; @@ -382,17 +378,15 @@ Map { @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModule' - */ - class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModule' + */ + class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react ", } @@ -499,17 +493,15 @@ namespace JS { - (void)cropImage:(JS::AliasTurboModule::Options &)cropData; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'AliasTurboModule' - */ - class JSI_EXPORT AliasTurboModuleSpecJSI : public ObjCTurboModule { - public: - AliasTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'AliasTurboModule' + */ + class JSI_EXPORT AliasTurboModuleSpecJSI : public ObjCTurboModule { + public: + AliasTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react inline double JS::AliasTurboModule::OptionsOffset::x() const { id const p = _v[@\\"x\\"]; @@ -633,17 +625,15 @@ namespace JS { reject:(RCTPromiseRejectBlock)reject; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeCameraRollManager' - */ - class JSI_EXPORT NativeCameraRollManagerSpecJSI : public ObjCTurboModule { - public: - NativeCameraRollManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeCameraRollManager' + */ + class JSI_EXPORT NativeCameraRollManagerSpecJSI : public ObjCTurboModule { + public: + NativeCameraRollManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react namespace JS { namespace NativeExceptionsManager { struct StackFrame { @@ -700,17 +690,15 @@ namespace JS { - (void)dismissRedbox; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeExceptionsManager' - */ - class JSI_EXPORT NativeExceptionsManagerSpecJSI : public ObjCTurboModule { - public: - NativeExceptionsManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeExceptionsManager' + */ + class JSI_EXPORT NativeExceptionsManagerSpecJSI : public ObjCTurboModule { + public: + NativeExceptionsManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react inline double JS::NativeCameraRollManager::GetPhotosParams::first() const { id const p = _v[@\\"first\\"]; @@ -900,17 +888,15 @@ namespace JS { - (facebook::react::ModuleConstants)getConstants; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModule' - */ - class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModule' + */ + class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react inline JS::NativeSampleTurboModule::Constants::Builder::Builder(const Input i) : _factory(^{ NSMutableDictionary *d = [NSMutableDictionary new]; auto const1 = i.const1.get(); @@ -963,34 +949,30 @@ Map { - (void)voidFunc; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModule' - */ - class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModule' + */ + class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react @protocol NativeSampleTurboModule2Spec - (void)voidFunc; @end -namespace facebook { - namespace react { - /** - * ObjC++ class for module 'NativeSampleTurboModule2' - */ - class JSI_EXPORT NativeSampleTurboModule2SpecJSI : public ObjCTurboModule { - public: - NativeSampleTurboModule2SpecJSI(const ObjCTurboModule::InitParams ¶ms); - }; - } // namespace react -} // namespace facebook +namespace facebook::react { + /** + * ObjC++ class for module 'NativeSampleTurboModule2' + */ + class JSI_EXPORT NativeSampleTurboModule2SpecJSI : public ObjCTurboModule { + public: + NativeSampleTurboModule2SpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react ", diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap index 177f066876aa61..27f98851161d91 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap @@ -14,8 +14,7 @@ Map { #include \\"SampleWithUppercaseName.h\\" -namespace facebook { -namespace react { +namespace facebook::react { @@ -31,8 +30,7 @@ std::shared_ptr SampleWithUppercaseName_ModuleProvider(const std::s return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -51,8 +49,7 @@ Map { #include \\"complex_objects.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_difficult(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { static jmethodID cachedMethodId = nullptr; @@ -107,8 +104,7 @@ std::shared_ptr complex_objects_ModuleProvider(const std::string &m return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -127,8 +123,7 @@ Map { #include \\"cxx_only_native_modules.h\\" -namespace facebook { -namespace react { +namespace facebook::react { @@ -137,8 +132,7 @@ std::shared_ptr cxx_only_native_modules_ModuleProvider(const std::s return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -157,8 +151,7 @@ Map { #include \\"empty_native_modules.h\\" -namespace facebook { -namespace react { +namespace facebook::react { @@ -174,8 +167,7 @@ std::shared_ptr empty_native_modules_ModuleProvider(const std::stri return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -194,8 +186,7 @@ Map { #include \\"native_modules_with_type_aliases.h\\" -namespace facebook { -namespace react { +namespace facebook::react { @@ -216,8 +207,7 @@ std::shared_ptr native_modules_with_type_aliases_ModuleProvider(con return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -236,8 +226,7 @@ Map { #include \\"real_module_example.h\\" -namespace facebook { -namespace react { +namespace facebook::react { @@ -306,8 +295,7 @@ std::shared_ptr real_module_example_ModuleProvider(const std::strin return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -326,8 +314,7 @@ Map { #include \\"simple_native_modules.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { static jmethodID cachedMethodId = nullptr; @@ -424,8 +411,7 @@ std::shared_ptr simple_native_modules_ModuleProvider(const std::str return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; @@ -444,8 +430,7 @@ Map { #include \\"two_modules_different_files.h\\" -namespace facebook { -namespace react { +namespace facebook::react { static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { static jmethodID cachedMethodId = nullptr; @@ -478,8 +463,7 @@ std::shared_ptr two_modules_different_files_ModuleProvider(const st return nullptr; } -} // namespace react -} // namespace facebook +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap index cc203a0927bd07..72877187166bd8 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap @@ -18,8 +18,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { /** * JNI C++ class for module 'NativeSampleTurboModule' @@ -33,8 +32,7 @@ public: JSI_EXPORT std::shared_ptr SampleWithUppercaseName_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", "jni/CMakeLists.txt" => "# Copyright (c) Meta Platforms, Inc. and affiliates. # @@ -63,10 +61,13 @@ target_link_libraries( react_codegen_rncore react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni @@ -104,8 +105,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { /** * JNI C++ class for module 'NativeSampleTurboModule' @@ -119,8 +119,7 @@ public: JSI_EXPORT std::shared_ptr complex_objects_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", "jni/CMakeLists.txt" => "# Copyright (c) Meta Platforms, Inc. and affiliates. # @@ -149,10 +148,13 @@ target_link_libraries( react_codegen_rncore react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni @@ -190,16 +192,14 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { JSI_EXPORT std::shared_ptr cxx_only_native_modules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", "jni/CMakeLists.txt" => "# Copyright (c) Meta Platforms, Inc. and affiliates. # @@ -228,10 +228,13 @@ target_link_libraries( react_codegen_rncore react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni @@ -269,8 +272,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { /** * JNI C++ class for module 'NativeSampleTurboModule' @@ -284,8 +286,7 @@ public: JSI_EXPORT std::shared_ptr empty_native_modules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", "jni/CMakeLists.txt" => "# Copyright (c) Meta Platforms, Inc. and affiliates. # @@ -314,10 +315,13 @@ target_link_libraries( react_codegen_rncore react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni @@ -355,8 +359,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { /** * JNI C++ class for module 'AliasTurboModule' @@ -370,8 +373,7 @@ public: JSI_EXPORT std::shared_ptr native_modules_with_type_aliases_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", "jni/CMakeLists.txt" => "# Copyright (c) Meta Platforms, Inc. and affiliates. # @@ -400,10 +402,13 @@ target_link_libraries( react_codegen_rncore react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni @@ -441,8 +446,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { /** * JNI C++ class for module 'NativeCameraRollManager' @@ -464,8 +468,7 @@ public: JSI_EXPORT std::shared_ptr real_module_example_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", "jni/CMakeLists.txt" => "# Copyright (c) Meta Platforms, Inc. and affiliates. # @@ -494,10 +497,13 @@ target_link_libraries( react_codegen_rncore react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni @@ -535,8 +541,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { /** * JNI C++ class for module 'NativeSampleTurboModule' @@ -550,8 +555,7 @@ public: JSI_EXPORT std::shared_ptr simple_native_modules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", "jni/CMakeLists.txt" => "# Copyright (c) Meta Platforms, Inc. and affiliates. # @@ -580,10 +584,13 @@ target_link_libraries( react_codegen_rncore react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni @@ -621,8 +628,7 @@ Map { #include #include -namespace facebook { -namespace react { +namespace facebook::react { /** * JNI C++ class for module 'NativeSampleTurboModule' @@ -644,8 +650,7 @@ public: JSI_EXPORT std::shared_ptr two_modules_different_files_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); -} // namespace react -} // namespace facebook +} // namespace facebook::react ", "jni/CMakeLists.txt" => "# Copyright (c) Meta Platforms, Inc. and affiliates. # @@ -674,10 +679,13 @@ target_link_libraries( react_codegen_rncore react_debug react_nativemodule_core + react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager + react_render_mapbuffer + react_utils rrc_image rrc_view turbomodulejsijni diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleMm-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleMm-test.js.snap index d9936be271e6d8..630f41fbbb2b5a 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleMm-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleMm-test.js.snap @@ -18,16 +18,14 @@ Map { #import \\"SampleWithUppercaseName.h\\" -namespace facebook { - namespace react { - - - NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - - } - } // namespace react -} // namespace facebook +namespace facebook::react { + + + NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + } +} // namespace facebook::react ", } `; @@ -85,9 +83,8 @@ Map { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_difficult(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"difficult\\", @selector(difficult:), args, count); } @@ -116,9 +113,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ArrayKind, \\"getNullableArray\\", @selector(getNullableArray), args, count); } - NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"difficult\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleSpecJSI_difficult}; setMethodArgConversionSelector(@\\"difficult\\", 0, @\\"JS_NativeSampleTurboModule_SpecDifficultA:\\"); @@ -139,9 +136,8 @@ namespace facebook { methodMap_[\\"getNullableArray\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleSpecJSI_getNullableArray}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react ", } `; @@ -186,16 +182,14 @@ Map { #import \\"empty_native_modules.h\\" -namespace facebook { - namespace react { - +namespace facebook::react { + - NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - - } - } // namespace react -} // namespace facebook + NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + } +} // namespace facebook::react ", } `; @@ -241,21 +235,19 @@ Map { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_AliasTurboModuleSpecJSI_cropImage(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"cropImage\\", @selector(cropImage:), args, count); } - AliasTurboModuleSpecJSI::AliasTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + AliasTurboModuleSpecJSI::AliasTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"cropImage\\"] = MethodMetadata {1, __hostFunction_AliasTurboModuleSpecJSI_cropImage}; setMethodArgConversionSelector(@\\"cropImage\\", 0, @\\"JS_AliasTurboModule_Options:\\"); - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react ", } `; @@ -283,9 +275,8 @@ Map { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeCameraRollManagerSpecJSI_getPhotos(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, \\"getPhotos\\", @selector(getPhotos:resolve:reject:), args, count); } @@ -298,9 +289,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, \\"deletePhotos\\", @selector(deletePhotos:resolve:reject:), args, count); } - NativeCameraRollManagerSpecJSI::NativeCameraRollManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeCameraRollManagerSpecJSI::NativeCameraRollManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"getPhotos\\"] = MethodMetadata {1, __hostFunction_NativeCameraRollManagerSpecJSI_getPhotos}; setMethodArgConversionSelector(@\\"getPhotos\\", 0, @\\"JS_NativeCameraRollManager_GetPhotosParams:\\"); @@ -309,9 +300,8 @@ namespace facebook { methodMap_[\\"deletePhotos\\"] = MethodMetadata {1, __hostFunction_NativeCameraRollManagerSpecJSI_deletePhotos}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react @implementation RCTCxxConvert (NativeExceptionsManager_StackFrame) + (RCTManagedPointer *)JS_NativeExceptionsManager_StackFrame:(id)json { @@ -324,9 +314,8 @@ namespace facebook { return facebook::react::managedPointer(json); } @end -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeExceptionsManagerSpecJSI_reportFatalException(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"reportFatalException\\", @selector(reportFatalException:stack:exceptionId:), args, count); } @@ -347,9 +336,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"dismissRedbox\\", @selector(dismissRedbox), args, count); } - NativeExceptionsManagerSpecJSI::NativeExceptionsManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeExceptionsManagerSpecJSI::NativeExceptionsManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"reportFatalException\\"] = MethodMetadata {3, __hostFunction_NativeExceptionsManagerSpecJSI_reportFatalException}; @@ -364,9 +353,8 @@ namespace facebook { methodMap_[\\"dismissRedbox\\"] = MethodMetadata {0, __hostFunction_NativeExceptionsManagerSpecJSI_dismissRedbox}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react ", } `; @@ -389,9 +377,8 @@ Map { #import \\"simple_native_modules.h\\" -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"voidFunc\\", @selector(voidFunc), args, count); } @@ -448,9 +435,9 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, \\"getConstants\\", @selector(getConstants), args, count); } - NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc}; @@ -492,9 +479,8 @@ namespace facebook { methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react ", } `; @@ -517,37 +503,33 @@ Map { #import \\"two_modules_different_files.h\\" -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"voidFunc\\", @selector(voidFunc), args, count); } - NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react -namespace facebook { - namespace react { - +namespace facebook::react { + static facebook::jsi::Value __hostFunction_NativeSampleTurboModule2SpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, \\"voidFunc\\", @selector(voidFunc), args, count); } - NativeSampleTurboModule2SpecJSI::NativeSampleTurboModule2SpecJSI(const ObjCTurboModule::InitParams ¶ms) - : ObjCTurboModule(params) { - + NativeSampleTurboModule2SpecJSI::NativeSampleTurboModule2SpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModule2SpecJSI_voidFunc}; - } - } // namespace react -} // namespace facebook + } +} // namespace facebook::react ", } `; diff --git a/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js b/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js index 36eafbe5884aec..12d42258b985d2 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js @@ -15,42 +15,41 @@ const { throwIfConfigNotfound, throwIfMoreThanOneConfig, } = require('../error-utils'); - const { - throwIfModuleInterfaceNotFound, - throwIfMoreThanOneModuleRegistryCalls, - throwIfModuleInterfaceIsMisnamed, - throwIfUnusedModuleInterfaceParserError, - throwIfWrongNumberOfCallExpressionArgs, - throwIfIncorrectModuleRegistryCallTypeParameterParserError, + throwIfArgumentPropsAreNull, + throwIfArrayElementTypeAnnotationIsUnsupported, + throwIfBubblingTypeIsNull, + throwIfEventHasNoName, throwIfIncorrectModuleRegistryCallArgument, - throwIfUnsupportedFunctionReturnTypeAnnotationParserError, - throwIfMoreThanOneModuleInterfaceParserError, + throwIfIncorrectModuleRegistryCallTypeParameterParserError, + throwIfModuleInterfaceIsMisnamed, + throwIfModuleInterfaceNotFound, throwIfModuleTypeIsUnsupported, - throwIfUntypedModule, - throwIfUnsupportedFunctionParamTypeAnnotationParserError, - throwIfArrayElementTypeAnnotationIsUnsupported, + throwIfMoreThanOneCodegenNativecommands, + throwIfMoreThanOneModuleInterfaceParserError, + throwIfMoreThanOneModuleRegistryCalls, throwIfPartialNotAnnotatingTypeParameter, throwIfPartialWithMoreParameter, - throwIfMoreThanOneCodegenNativecommands, - throwIfEventHasNoName, - throwIfBubblingTypeIsNull, - throwIfArgumentPropsAreNull, throwIfTypeAliasIsNotInterface, + throwIfUnsupportedFunctionParamTypeAnnotationParserError, + throwIfUnsupportedFunctionReturnTypeAnnotationParserError, + throwIfUntypedModule, + throwIfUnusedModuleInterfaceParserError, + throwIfWrongNumberOfCallExpressionArgs, } = require('../error-utils'); const { - UnsupportedModulePropertyParserError, - ModuleInterfaceNotFoundParserError, - MoreThanOneModuleRegistryCallsParserError, - MisnamedModuleInterfaceParserError, - UnusedModuleInterfaceParserError, + IncorrectModuleRegistryCallArgumentTypeParserError, IncorrectModuleRegistryCallArityParserError, IncorrectModuleRegistryCallTypeParameterParserError, - IncorrectModuleRegistryCallArgumentTypeParserError, - UnsupportedFunctionReturnTypeAnnotationParserError, - UntypedModuleRegistryCallParserError, + MisnamedModuleInterfaceParserError, + ModuleInterfaceNotFoundParserError, MoreThanOneModuleInterfaceParserError, + MoreThanOneModuleRegistryCallsParserError, UnsupportedFunctionParamTypeAnnotationParserError, + UnsupportedFunctionReturnTypeAnnotationParserError, + UnsupportedModulePropertyParserError, + UntypedModuleRegistryCallParserError, + UnusedModuleInterfaceParserError, } = require('../errors'); const {FlowParser} = require('../flow/parser'); const {TypeScriptParser} = require('../typescript/parser'); diff --git a/packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js b/packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js index bd62076f6e3d40..44e25e7687648e 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js @@ -11,56 +11,54 @@ 'use-strict'; +import type {ParserType} from '../errors'; + +import {FlowParser} from '../flow/parser'; +import {MockedParser} from '../parserMock'; import { assertGenericTypeAnnotationHasExactlyOneTypeParameter, - isObjectProperty, - parseObjectProperty, - wrapNullable, - unwrapNullable, - buildSchemaFromConfigType, buildSchema, - parseModuleName, + buildSchemaFromConfigType, createComponentConfig, - propertyNames, getCommandOptions, - getOptions, getCommandTypeNameAndOptionsExpression, + getOptions, getTypeResolutionStatus, handleGenericTypeAnnotation, + isObjectProperty, + parseModuleName, + parseObjectProperty, + propertyNames, + unwrapNullable, + wrapNullable, } from '../parsers-commons'; -import type {ParserType} from '../errors'; -const {Visitor} = require('../parsers-primitives'); -const {wrapComponentSchema} = require('../schema.js'); -const {buildComponentSchema} = require('../flow/components'); -const {buildModuleSchema} = require('../parsers-commons.js'); -const { - isModuleRegistryCall, - createParserErrorCapturer, -} = require('../utils.js'); const { - ParserError, - UnsupportedObjectPropertyTypeAnnotationParserError, - UnusedModuleInterfaceParserError, - MoreThanOneModuleRegistryCallsParserError, - IncorrectModuleRegistryCallArityParserError, IncorrectModuleRegistryCallArgumentTypeParserError, - UntypedModuleRegistryCallParserError, + IncorrectModuleRegistryCallArityParserError, + MisnamedModuleInterfaceParserError, ModuleInterfaceNotFoundParserError, MoreThanOneModuleInterfaceParserError, - MisnamedModuleInterfaceParserError, + MoreThanOneModuleRegistryCallsParserError, + ParserError, + UnsupportedObjectPropertyTypeAnnotationParserError, + UntypedModuleRegistryCallParserError, + UnusedModuleInterfaceParserError, } = require('../errors'); - -import {MockedParser} from '../parserMock'; -import {FlowParser} from '../flow/parser'; +const {buildComponentSchema} = require('../flow/components'); +const {flowTranslateTypeAnnotation} = require('../flow/modules/index'); +const {buildModuleSchema} = require('../parsers-commons.js'); +const {Visitor} = require('../parsers-primitives'); +const {wrapComponentSchema} = require('../schema.js'); +const typeScriptTranslateTypeAnnotation = require('../typescript/modules/index'); +const { + createParserErrorCapturer, + isModuleRegistryCall, +} = require('../utils.js'); const parser = new MockedParser(); - const flowParser = new FlowParser(); -const {flowTranslateTypeAnnotation} = require('../flow/modules/index'); -const typeScriptTranslateTypeAnnotation = require('../typescript/modules/index'); - beforeEach(() => { jest.clearAllMocks(); }); @@ -324,6 +322,7 @@ describe('parseObjectProperty', () => { ); expect(() => parseObjectProperty( + null, // parentObject property, moduleName, types, @@ -358,6 +357,7 @@ describe('parseObjectProperty', () => { ); expect(() => parseObjectProperty( + null, // parentObject property, moduleName, types, @@ -716,7 +716,63 @@ describe('buildSchema', () => { expect(getConfigTypeSpy).toHaveBeenCalledTimes(1); expect(getConfigTypeSpy).toHaveBeenCalledWith( - parser.getAst(contents), + parser.getAst(contents, 'fileName'), + Visitor, + ); + expect(schema).toEqual({ + modules: { + Module: { + type: 'Component', + components: { + Module: { + extendsProps: [ + { + type: 'ReactNativeBuiltInType', + knownTypeName: 'ReactNativeCoreViewProps', + }, + ], + events: [], + props: [], + commands: [], + }, + }, + }, + }, + }); + }); + }); + + describe('when there is a codegenNativeComponent, using `as`', () => { + const contents = ` + import type {ViewProps} from 'ViewPropTypes'; + import type {HostComponent} from 'react-native'; + + const codegenNativeComponent = require('codegenNativeComponent'); + + export type ModuleProps = $ReadOnly<{| + ...ViewProps, + |}>; + + export default codegenNativeComponent( + 'Module', + ) as HostComponent; + `; + + it('returns a module with good properties', () => { + const schema = buildSchema( + contents, + 'fileName', + wrapComponentSchema, + buildComponentSchema, + buildModuleSchema, + Visitor, + flowParser, + flowTranslateTypeAnnotation, + ); + + expect(getConfigTypeSpy).toHaveBeenCalledTimes(1); + expect(getConfigTypeSpy).toHaveBeenCalledWith( + parser.getAst(contents, 'fileName'), Visitor, ); expect(schema).toEqual({ @@ -770,7 +826,7 @@ describe('buildSchema', () => { expect(getConfigTypeSpy).toHaveBeenCalledTimes(1); expect(getConfigTypeSpy).toHaveBeenCalledWith( - parser.getAst(contents), + parser.getAst(contents, 'fileName'), Visitor, ); expect(schema).toEqual({ @@ -1085,7 +1141,7 @@ describe('buildModuleSchema', () => { const contents = ` import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; - + export interface Spec extends TurboModule { +getBool: (arg: boolean) => boolean; } export interface SpecOther extends TurboModule { @@ -1135,11 +1191,11 @@ describe('buildModuleSchema', () => { const contents = ` import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; - + export interface MisnamedSpec extends TurboModule { +getArray: (a: Array) => Array; } - + export default (TurboModuleRegistry.getEnforcing( 'SampleTurboModule', ): Spec); diff --git a/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js b/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js index 770f78a04b3359..02aa6b3a535f7c 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js @@ -17,40 +17,40 @@ import type { UnionTypeAnnotationMemberType, } from '../../CodegenSchema'; +const {UnsupportedUnionTypeAnnotationParserError} = require('../errors'); +const {extractArrayElementType} = require('../flow/components/events'); +const {FlowParser} = require('../flow/parser'); +const {MockedParser} = require('../parserMock'); +const {emitUnion} = require('../parsers-primitives'); const { + Visitor, emitArrayType, emitBoolean, emitBoolProp, + emitCommonTypes, emitDouble, emitDoubleProp, emitFloat, emitFloatProp, - emitNumber, + emitGenericObject, emitInt32, emitInt32Prop, - emitGenericObject, + emitMixed, + emitNumber, emitObject, + emitObjectProp, + emitPartial, emitPromise, emitRootTag, - emitVoid, emitString, emitStringish, - emitMixed, - emitPartial, - emitCommonTypes, - typeAliasResolution, - typeEnumResolution, - Visitor, emitStringProp, - emitObjectProp, emitUnionProp, + emitVoid, + typeAliasResolution, + typeEnumResolution, } = require('../parsers-primitives.js'); -const {MockedParser} = require('../parserMock'); -const {emitUnion} = require('../parsers-primitives'); -const {UnsupportedUnionTypeAnnotationParserError} = require('../errors'); -const {FlowParser} = require('../flow/parser'); const {TypeScriptParser} = require('../typescript/parser'); -const {extractArrayElementType} = require('../flow/components/events'); const parser = new MockedParser(); const flowParser = new FlowParser(); diff --git a/packages/react-native-codegen/src/parsers/__tests__/parsers-test.js b/packages/react-native-codegen/src/parsers/__tests__/parsers-test.js index 32eef3dcf5caae..41014b875069c1 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/parsers-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/parsers-test.js @@ -11,13 +11,13 @@ 'use-strict'; +import {FlowParser} from '../flow/parser'; +import {TypeScriptParser} from '../typescript/parser'; + const { UnsupportedObjectPropertyTypeAnnotationParserError, } = require('../errors'); -import {TypeScriptParser} from '../typescript/parser'; -import {FlowParser} from '../flow/parser'; - const hasteModuleName = 'moduleName'; describe('FlowParser', () => { const parser = new FlowParser(); diff --git a/packages/react-native-codegen/src/parsers/__tests__/utils-test.js b/packages/react-native-codegen/src/parsers/__tests__/utils-test.js index 65b681bc736f1f..31b396be361010 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/utils-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/utils-test.js @@ -11,13 +11,13 @@ 'use strict'; +const {ParserError} = require('../errors'); const { - extractNativeModuleName, createParserErrorCapturer, + extractNativeModuleName, verifyPlatforms, visit, } = require('../utils.js'); -const {ParserError} = require('../errors'); beforeEach(() => { jest.clearAllMocks(); diff --git a/packages/react-native-codegen/src/parsers/consistency/__tests__/checkComponentSnaps-test.js b/packages/react-native-codegen/src/parsers/consistency/__tests__/checkComponentSnaps-test.js index b06dd17789c9a9..907de44d7d3a35 100644 --- a/packages/react-native-codegen/src/parsers/consistency/__tests__/checkComponentSnaps-test.js +++ b/packages/react-native-codegen/src/parsers/consistency/__tests__/checkComponentSnaps-test.js @@ -10,13 +10,13 @@ 'use strict'; +const flowSnaps = require('../../../../src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap'); +const tsSnaps = require('../../../../src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap'); +const flowFixtures = require('../../flow/components/__test_fixtures__/fixtures.js'); +const tsFixtures = require('../../typescript/components/__test_fixtures__/fixtures.js'); const {compareSnaps, compareTsArraySnaps} = require('../compareSnaps.js'); -const flowFixtures = require('../../flow/components/__test_fixtures__/fixtures.js'); -const flowSnaps = require('../../../../src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap'); const flowExtraCases = []; -const tsFixtures = require('../../typescript/components/__test_fixtures__/fixtures.js'); -const tsSnaps = require('../../../../src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap'); const tsExtraCases = [ 'ARRAY2_PROP_TYPES_NO_EVENTS', 'PROPS_AND_EVENTS_WITH_INTERFACES', diff --git a/packages/react-native-codegen/src/parsers/consistency/__tests__/checkModuleSnaps-test.js b/packages/react-native-codegen/src/parsers/consistency/__tests__/checkModuleSnaps-test.js index 1e1fe3909c103f..846598b467990c 100644 --- a/packages/react-native-codegen/src/parsers/consistency/__tests__/checkModuleSnaps-test.js +++ b/packages/react-native-codegen/src/parsers/consistency/__tests__/checkModuleSnaps-test.js @@ -10,13 +10,13 @@ 'use strict'; +const flowSnaps = require('../../../../src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap'); +const tsSnaps = require('../../../../src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap'); +const flowFixtures = require('../../flow/modules/__test_fixtures__/fixtures.js'); +const tsFixtures = require('../../typescript/modules/__test_fixtures__/fixtures.js'); const {compareSnaps, compareTsArraySnaps} = require('../compareSnaps.js'); -const flowFixtures = require('../../flow/modules/__test_fixtures__/fixtures.js'); -const flowSnaps = require('../../../../src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap'); const flowExtraCases = ['PROMISE_WITH_COMMONLY_USED_TYPES']; -const tsFixtures = require('../../typescript/modules/__test_fixtures__/fixtures.js'); -const tsSnaps = require('../../../../src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap'); const tsExtraCases = [ 'NATIVE_MODULE_WITH_ARRAY2_WITH_ALIAS', 'NATIVE_MODULE_WITH_ARRAY2_WITH_UNION_AND_TOUPLE', diff --git a/packages/react-native-codegen/src/parsers/error-utils.js b/packages/react-native-codegen/src/parsers/error-utils.js index 1fedbe2529919a..eb11370bd00415 100644 --- a/packages/react-native-codegen/src/parsers/error-utils.js +++ b/packages/react-native-codegen/src/parsers/error-utils.js @@ -11,25 +11,25 @@ 'use strict'; import type {NativeModuleTypeAnnotation} from '../CodegenSchema'; +import type {TypeDeclarationMap} from '../parsers/utils'; import type {ParserType} from './errors'; import type {Parser} from './parser'; -import type {TypeDeclarationMap} from '../parsers/utils'; const { + IncorrectModuleRegistryCallArgumentTypeParserError, + IncorrectModuleRegistryCallArityParserError, + IncorrectModuleRegistryCallTypeParameterParserError, MisnamedModuleInterfaceParserError, - UnsupportedFunctionReturnTypeAnnotationParserError, ModuleInterfaceNotFoundParserError, + MoreThanOneModuleInterfaceParserError, MoreThanOneModuleRegistryCallsParserError, - UnusedModuleInterfaceParserError, - IncorrectModuleRegistryCallArityParserError, - IncorrectModuleRegistryCallTypeParameterParserError, - IncorrectModuleRegistryCallArgumentTypeParserError, + UnsupportedArrayElementTypeAnnotationParserError, + UnsupportedFunctionParamTypeAnnotationParserError, + UnsupportedFunctionReturnTypeAnnotationParserError, + UnsupportedModulePropertyParserError, UnsupportedObjectPropertyValueTypeAnnotationParserError, UntypedModuleRegistryCallParserError, - UnsupportedModulePropertyParserError, - MoreThanOneModuleInterfaceParserError, - UnsupportedFunctionParamTypeAnnotationParserError, - UnsupportedArrayElementTypeAnnotationParserError, + UnusedModuleInterfaceParserError, } = require('./errors'); function throwIfModuleInterfaceIsMisnamed( diff --git a/packages/react-native-codegen/src/parsers/errors.js b/packages/react-native-codegen/src/parsers/errors.js index b0e42ecad9555e..6a13264b2c8059 100644 --- a/packages/react-native-codegen/src/parsers/errors.js +++ b/packages/react-native-codegen/src/parsers/errors.js @@ -11,7 +11,6 @@ 'use strict'; import type {UnionTypeAnnotationMemberType} from '../CodegenSchema'; - import type {Parser} from './parser'; export type ParserType = 'Flow' | 'TypeScript'; @@ -218,6 +217,20 @@ class UnsupportedObjectPropertyValueTypeAnnotationParserError extends ParserErro } } +class UnsupportedObjectDirectRecursivePropertyParserError extends ParserError { + constructor( + propertyName: string, + propertyValueAST: $FlowFixMe, + nativeModuleName: string, + ) { + super( + nativeModuleName, + propertyValueAST, + `Object property '${propertyName}' is direct recursive and must be nullable.`, + ); + } +} + /** * Function parsing errors */ @@ -406,6 +419,7 @@ module.exports = { UnsupportedModulePropertyParserError, UnsupportedObjectPropertyTypeAnnotationParserError, UnsupportedObjectPropertyValueTypeAnnotationParserError, + UnsupportedObjectDirectRecursivePropertyParserError, UnusedModuleInterfaceParserError, MoreThanOneModuleRegistryCallsParserError, UntypedModuleRegistryCallParserError, diff --git a/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js index 64cefa676f6bf9..7b93444feca642 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js @@ -1001,10 +1001,16 @@ export type ScrollTo = ( interface NativeCommands { +scrollTo: ScrollTo; + +addOverlays: ( + viewRef: React.ElementRef, + overlayColorsReadOnly: $ReadOnlyArray, + overlayColorsArray: Array, + overlayColorsArrayAnnotation: string[], + ) => void; } export const Commands = codegenNativeCommands({ - supportedCommands: ['scrollTo'], + supportedCommands: ['scrollTo', 'addOverlays'], }); export default (codegenNativeComponent( diff --git a/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap b/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap index dbcae681e81b9a..c99cf8de162999 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap +++ b/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap @@ -4598,6 +4598,48 @@ exports[`RN Codegen Flow Parser can generate fixture COMMANDS_WITH_EXTERNAL_TYPE 'type': 'VoidTypeAnnotation' } } + }, + { + 'name': 'addOverlays', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'params': [ + { + 'name': 'overlayColorsReadOnly', + 'optional': false, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'StringTypeAnnotation' + } + } + }, + { + 'name': 'overlayColorsArray', + 'optional': false, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'StringTypeAnnotation' + } + } + }, + { + 'name': 'overlayColorsArrayAnnotation', + 'optional': false, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'StringTypeAnnotation' + } + } + } + ], + 'returnTypeAnnotation': { + 'type': 'VoidTypeAnnotation' + } + } } ] } diff --git a/packages/react-native-codegen/src/parsers/flow/components/__tests__/component-parser-test.js b/packages/react-native-codegen/src/parsers/flow/components/__tests__/component-parser-test.js index e01d1ade6e1f42..50f0dfdc5567b0 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/__tests__/component-parser-test.js +++ b/packages/react-native-codegen/src/parsers/flow/components/__tests__/component-parser-test.js @@ -11,9 +11,9 @@ 'use strict'; -const {FlowParser} = require('../../parser'); -const fixtures = require('../__test_fixtures__/fixtures.js'); const failureFixtures = require('../__test_fixtures__/failures.js'); +const fixtures = require('../__test_fixtures__/fixtures.js'); +const {FlowParser} = require('../../parser'); jest.mock('fs', () => ({ readFileSync: filename => { // Jest in the OSS does not allow to capture variables in closures. diff --git a/packages/react-native-codegen/src/parsers/flow/components/commands.js b/packages/react-native-codegen/src/parsers/flow/components/commands.js index bf789178d996d1..c8ce0b157cbc5a 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/commands.js +++ b/packages/react-native-codegen/src/parsers/flow/components/commands.js @@ -11,8 +11,9 @@ 'use strict'; import type { - NamedShape, + CommandParamTypeAnnotation, CommandTypeAnnotation, + NamedShape, } from '../../../CodegenSchema.js'; import type {TypeDeclarationMap} from '../../utils'; @@ -21,7 +22,24 @@ const {getValueFromTypes} = require('../utils.js'); // $FlowFixMe[unclear-type] there's no flowtype for ASTs type EventTypeAST = Object; -function buildCommandSchema(property: EventTypeAST, types: TypeDeclarationMap) { +function buildCommandSchema( + property: EventTypeAST, + types: TypeDeclarationMap, +): $ReadOnly<{ + name: string, + optional: boolean, + typeAnnotation: { + type: 'FunctionTypeAnnotation', + params: $ReadOnlyArray<{ + name: string, + optional: boolean, + typeAnnotation: CommandParamTypeAnnotation, + }>, + returnTypeAnnotation: { + type: 'VoidTypeAnnotation', + }, + }, +}> { const name = property.key.name; const optional = property.optional; const value = getValueFromTypes(property.value, types); @@ -48,7 +66,7 @@ function buildCommandSchema(property: EventTypeAST, types: TypeDeclarationMap) { paramValue.type === 'GenericTypeAnnotation' ? paramValue.id.name : paramValue.type; - let returnType; + let returnType: CommandParamTypeAnnotation; switch (type) { case 'RootTag': @@ -82,6 +100,30 @@ function buildCommandSchema(property: EventTypeAST, types: TypeDeclarationMap) { type: 'StringTypeAnnotation', }; break; + case 'Array': + case '$ReadOnlyArray': + if (!paramValue.type === 'GenericTypeAnnotation') { + throw new Error( + 'Array and $ReadOnlyArray are GenericTypeAnnotation for array', + ); + } + returnType = { + type: 'ArrayTypeAnnotation', + elementType: { + // TODO: T172453752 support complex type annotation for array element + type: paramValue.typeParameters.params[0].type, + }, + }; + break; + case 'ArrayTypeAnnotation': + returnType = { + type: 'ArrayTypeAnnotation', + elementType: { + // TODO: T172453752 support complex type annotation for array element + type: paramValue.elementType.type, + }, + }; + break; default: (type: empty); throw new Error( diff --git a/packages/react-native-codegen/src/parsers/flow/components/componentsUtils.js b/packages/react-native-codegen/src/parsers/flow/components/componentsUtils.js index e827bcecbbd7f5..4d6ab405eb8fc0 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/componentsUtils.js +++ b/packages/react-native-codegen/src/parsers/flow/components/componentsUtils.js @@ -10,10 +10,11 @@ 'use strict'; -const {getValueFromTypes} = require('../utils.js'); -const {verifyPropNotAlreadyDefined} = require('../../parsers-commons'); -import type {TypeDeclarationMap, PropAST, ASTNode} from '../../utils'; import type {BuildSchemaFN, Parser} from '../../parser'; +import type {ASTNode, PropAST, TypeDeclarationMap} from '../../utils'; + +const {verifyPropNotAlreadyDefined} = require('../../parsers-commons'); +const {getValueFromTypes} = require('../utils.js'); // $FlowFixMe[unsupported-variance-annotation] function getTypeAnnotationForArray<+T>( diff --git a/packages/react-native-codegen/src/parsers/flow/components/events.js b/packages/react-native-codegen/src/parsers/flow/components/events.js index 17b3c933b326b7..940706e086c3d2 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/events.js +++ b/packages/react-native-codegen/src/parsers/flow/components/events.js @@ -11,32 +11,32 @@ 'use strict'; import type { + EventTypeAnnotation, EventTypeShape, NamedShape, - EventTypeAnnotation, } from '../../../CodegenSchema.js'; import type {Parser} from '../../parser'; import type {EventArgumentReturnType} from '../../parsers-commons'; const { - throwIfEventHasNoName, - throwIfBubblingTypeIsNull, throwIfArgumentPropsAreNull, + throwIfBubblingTypeIsNull, + throwIfEventHasNoName, } = require('../../error-utils'); const { - getEventArgument, buildPropertiesForEvent, - handleEventHandler, emitBuildEventSchema, + getEventArgument, + handleEventHandler, } = require('../../parsers-commons'); const { emitBoolProp, emitDoubleProp, emitFloatProp, - emitMixedProp, - emitStringProp, emitInt32Prop, + emitMixedProp, emitObjectProp, + emitStringProp, emitUnionProp, } = require('../../parsers-primitives'); diff --git a/packages/react-native-codegen/src/parsers/flow/components/index.js b/packages/react-native-codegen/src/parsers/flow/components/index.js index 9b7acbba20824b..0cae27b0607946 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/index.js +++ b/packages/react-native-codegen/src/parsers/flow/components/index.js @@ -12,13 +12,13 @@ import type {Parser} from '../../parser'; import type {ComponentSchemaBuilderConfig} from '../../schema.js'; -const {getCommands} = require('./commands'); -const {getEvents} = require('./events'); const { - getOptions, findComponentConfig, getCommandProperties, + getOptions, } = require('../../parsers-commons'); +const {getCommands} = require('./commands'); +const {getEvents} = require('./events'); // $FlowFixMe[signature-verification-failure] there's no flowtype for AST function buildComponentSchema( diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js index a7a81e017831bc..c661f988517c60 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js @@ -731,10 +731,23 @@ export enum StringOptions { Three = 'three', } +export type BinaryTreeNode = { + left?: BinaryTreeNode, + value: number, + right?: BinaryTreeNode, +}; + +export type GraphNode = { + label: string, + neighbors?: Array, +}; + export interface Spec extends TurboModule { +getCallback: () => () => void; +getMixed: (arg: mixed) => mixed; +getEnums: (quality: Quality, resolution?: Resolution, floppy: Floppy, stringOptions: StringOptions) => string; + +getBinaryTreeNode: (arg: BinaryTreeNode) => BinaryTreeNode; + +getGraphNode: (arg: GraphNode) => GraphNode; +getMap: (arg: {[a: string]: ?number}) => {[b: string]: ?number}; +getAnotherMap: (arg: {[string]: string}) => {[string]: string}; +getUnion: (chooseInt: ChooseInt, chooseFloat: ChooseFloat, chooseObject: ChooseObject, chooseString: ChooseString) => ChooseObject; diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap index 00d66fd81de929..64e6ed07e66b71 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap @@ -2,7 +2,14 @@ exports[`RN Codegen Flow Parser Fails with error message EMPTY_ENUM_NATIVE_MODULE 1`] = `"Module NativeSampleTurboModule: Failed parsing the enum SomeEnum in NativeSampleTurboModule with the error: Enums should have at least one member and member values can not be mixed- they all must be either blank, number, or string values."`; -exports[`RN Codegen Flow Parser Fails with error message MIXED_VALUES_ENUM_NATIVE_MODULE 1`] = `"Module NativeSampleTurboModule: Failed parsing the enum SomeEnum in NativeSampleTurboModule with the error: Enums should have at least one member and member values can not be mixed- they all must be either blank, number, or string values."`; +exports[`RN Codegen Flow Parser Fails with error message MIXED_VALUES_ENUM_NATIVE_MODULE 1`] = ` +"Syntax error in path/NativeSampleTurboModule.js: cannot use string initializer in number enum (19:2) + STR = 'str', + ^~~~~~~~~~~ +note: start of enum body (17:21) +export enum SomeEnum { + ^" +`; exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_ARRAY_WITH_NO_TYPE_FOR_CONTENT 1`] = `"Module NativeSampleTurboModule: Generic 'Array' must have type parameters."`; @@ -44,7 +51,59 @@ exports[`RN Codegen Flow Parser can generate fixture CXX_ONLY_NATIVE_MODULE 1`] 'modules': { 'NativeSampleTurboModule': { 'type': 'NativeModule', - 'aliasMap': {}, + 'aliasMap': { + 'BinaryTreeNode': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'left', + 'optional': true, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'BinaryTreeNode' + } + }, + { + 'name': 'value', + 'optional': false, + 'typeAnnotation': { + 'type': 'NumberTypeAnnotation' + } + }, + { + 'name': 'right', + 'optional': true, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'BinaryTreeNode' + } + } + ] + }, + 'GraphNode': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'label', + 'optional': false, + 'typeAnnotation': { + 'type': 'StringTypeAnnotation' + } + }, + { + 'name': 'neighbors', + 'optional': true, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'GraphNode' + } + } + } + ] + } + }, 'enumMap': { 'Quality': { 'name': 'Quality', @@ -195,6 +254,48 @@ exports[`RN Codegen Flow Parser can generate fixture CXX_ONLY_NATIVE_MODULE 1`] ] } }, + { + 'name': 'getBinaryTreeNode', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'returnTypeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'BinaryTreeNode' + }, + 'params': [ + { + 'name': 'arg', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'BinaryTreeNode' + } + } + ] + } + }, + { + 'name': 'getGraphNode', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'returnTypeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'GraphNode' + }, + 'params': [ + { + 'name': 'arg', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'GraphNode' + } + } + ] + } + }, { 'name': 'getMap', 'optional': false, diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-e2e-test.js b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-e2e-test.js index 6cda41648a0013..e66808ba6a2b88 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-e2e-test.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-e2e-test.js @@ -9,22 +9,21 @@ */ import type { - NativeModuleReturnTypeAnnotation, NativeModuleBaseTypeAnnotation, - NativeModuleSchema, NativeModuleParamTypeAnnotation, + NativeModuleReturnTypeAnnotation, + NativeModuleSchema, } from '../../../../CodegenSchema'; -const invariant = require('invariant'); - -const {unwrapNullable} = require('../../../parsers-commons'); const { + MissingTypeParameterGenericParserError, + UnnamedFunctionParamParserError, UnsupportedGenericParserError, UnsupportedTypeAnnotationParserError, - UnnamedFunctionParamParserError, - MissingTypeParameterGenericParserError, } = require('../../../errors'); +const {unwrapNullable} = require('../../../parsers-commons'); const {FlowParser} = require('../../parser'); +const invariant = require('invariant'); const flowParser = new FlowParser(); @@ -85,7 +84,7 @@ describe('Flow Module Parser', () => { import type {TurboModule} from 'RCTExport'; import * as TurboModuleRegistry from 'TurboModuleRegistry'; export interface Spec extends TurboModule { - +useArg(arg: any): void; + useArg(arg: any): void; } export default TurboModuleRegistry.get('Foo'); `); @@ -99,7 +98,7 @@ describe('Flow Module Parser', () => { import type {TurboModule} from 'RCTExport'; import * as TurboModuleRegistry from 'TurboModuleRegistry'; export interface Spec extends TurboModule { - +useArg(boolean): void; + useArg(boolean): void; } export default TurboModuleRegistry.get('Foo'); `); @@ -146,7 +145,7 @@ describe('Flow Module Parser', () => { ${TYPE_ALIAS_DECLARATIONS} export interface Spec extends TurboModule { - +useArg(${annotateArg(paramName, paramType)}): void; + useArg(${annotateArg(paramName, paramType)}): void; } export default TurboModuleRegistry.get('Foo'); `); @@ -357,7 +356,7 @@ describe('Flow Module Parser', () => { type AnimalPointer = Animal; export interface Spec extends TurboModule { - +useArg(${annotateArg('arg', 'AnimalPointer')}): void; + useArg(${annotateArg('arg', 'AnimalPointer')}): void; } export default TurboModuleRegistry.get('Foo'); `); @@ -694,7 +693,7 @@ describe('Flow Module Parser', () => { import type {TurboModule} from 'RCTExport'; import * as TurboModuleRegistry from 'TurboModuleRegistry'; export interface Spec extends TurboModule { - +useArg(): void; + useArg(): void; } export default TurboModuleRegistry.get('Foo'); `); @@ -728,7 +727,7 @@ describe('Flow Module Parser', () => { ${TYPE_ALIAS_DECLARATIONS} export interface Spec extends TurboModule { - +useArg(): ${annotateRet(flowType)}; + useArg(): ${annotateRet(flowType)}; } export default TurboModuleRegistry.get('Foo'); `); diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-snapshot-test.js b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-snapshot-test.js index ec20817c2bfba2..0fb4e8a15e6ce0 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-snapshot-test.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-snapshot-test.js @@ -11,10 +11,9 @@ 'use strict'; -const {FlowParser} = require('../../parser'); - -const fixtures = require('../__test_fixtures__/fixtures.js'); const failureFixtures = require('../__test_fixtures__/failures.js'); +const fixtures = require('../__test_fixtures__/fixtures.js'); +const {FlowParser} = require('../../parser'); const flowParser = new FlowParser(); diff --git a/packages/react-native-codegen/src/parsers/flow/modules/index.js b/packages/react-native-codegen/src/parsers/flow/modules/index.js index c50c45f2d69900..93e68955323960 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -13,38 +13,36 @@ import type { NamedShape, NativeModuleAliasMap, - NativeModuleEnumMap, NativeModuleBaseTypeAnnotation, + NativeModuleEnumMap, NativeModuleTypeAnnotation, Nullable, } from '../../../CodegenSchema'; - import type {Parser} from '../../parser'; import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils'; const { - unwrapNullable, - wrapNullable, + UnsupportedGenericParserError, + UnsupportedTypeAnnotationParserError, +} = require('../../errors'); +const { assertGenericTypeAnnotationHasExactlyOneTypeParameter, parseObjectProperty, + unwrapNullable, + wrapNullable, } = require('../../parsers-commons'); const { emitArrayType, - emitFunction, + emitCommonTypes, emitDictionary, + emitFunction, emitPromise, emitRootTag, emitUnion, - emitCommonTypes, typeAliasResolution, typeEnumResolution, } = require('../../parsers-primitives'); -const { - UnsupportedTypeAnnotationParserError, - UnsupportedGenericParserError, -} = require('../../errors'); - function translateTypeAnnotation( hasteModuleName: string, /** @@ -178,6 +176,7 @@ function translateTypeAnnotation( property => { return tryParse(() => { return parseObjectProperty( + flowTypeAnnotation, property, hasteModuleName, types, diff --git a/packages/react-native-codegen/src/parsers/flow/parseFlowAndThrowErrors.js b/packages/react-native-codegen/src/parsers/flow/parseFlowAndThrowErrors.js new file mode 100644 index 00000000000000..8ffb03422e4fc0 --- /dev/null +++ b/packages/react-native-codegen/src/parsers/flow/parseFlowAndThrowErrors.js @@ -0,0 +1,41 @@ +/** + * 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 + */ + +'use strict'; + +import type {Program as ESTreeProgram} from 'hermes-estree'; + +const hermesParser = require('hermes-parser'); + +function parseFlowAndThrowErrors( + code: string, + options: $ReadOnly<{filename?: ?string}> = {}, +): ESTreeProgram { + let ast; + try { + ast = hermesParser.parse(code, { + // Produce an ESTree-compliant AST + babel: false, + // Parse Flow without a pragma + flow: 'all', + ...(options.filename != null ? {sourceFilename: options.filename} : {}), + }); + } catch (e) { + if (options.filename != null) { + e.message = `Syntax error in ${options.filename}: ${e.message}`; + } + throw e; + } + return ast; +} + +module.exports = { + parseFlowAndThrowErrors, +}; diff --git a/packages/react-native-codegen/src/parsers/flow/parser.js b/packages/react-native-codegen/src/parsers/flow/parser.js index b0d1f2df2b50d8..91cac322b93b4e 100644 --- a/packages/react-native-codegen/src/parsers/flow/parser.js +++ b/packages/react-native-codegen/src/parsers/flow/parser.js @@ -11,17 +11,17 @@ 'use strict'; import type { - UnionTypeAnnotationMemberType, - SchemaType, + ExtendsPropsShape, NamedShape, - Nullable, - NativeModuleParamTypeAnnotation, - NativeModuleEnumMemberType, - NativeModuleEnumMembers, NativeModuleAliasMap, NativeModuleEnumMap, + NativeModuleEnumMembers, + NativeModuleEnumMemberType, + NativeModuleParamTypeAnnotation, + Nullable, PropTypeAnnotation, - ExtendsPropsShape, + SchemaType, + UnionTypeAnnotationMemberType, } from '../../CodegenSchema'; import type {ParserType} from '../errors'; import type { @@ -32,44 +32,37 @@ import type { } from '../parser'; import type { ParserErrorCapturer, - TypeDeclarationMap, PropAST, + TypeDeclarationMap, TypeResolutionStatus, } from '../utils'; -type ExtendsForProp = null | { - type: 'ReactNativeBuiltInType', - knownTypeName: 'ReactNativeCoreViewProps', -}; - -const invariant = require('invariant'); - const { - getSchemaInfo, - getTypeAnnotation, - flattenProperties, -} = require('./components/componentsUtils'); - -const {flowTranslateTypeAnnotation} = require('./modules'); - -// $FlowFixMe[untyped-import] there's no flowtype flow-parser -const flowParser = require('flow-parser'); - + UnsupportedObjectPropertyTypeAnnotationParserError, +} = require('../errors'); const { - buildSchema, - buildPropSchema, buildModuleSchema, + buildPropSchema, + buildSchema, handleGenericTypeAnnotation, } = require('../parsers-commons'); const {Visitor} = require('../parsers-primitives'); -const {buildComponentSchema} = require('./components'); const {wrapComponentSchema} = require('../schema.js'); - +const {buildComponentSchema} = require('./components'); +const { + flattenProperties, + getSchemaInfo, + getTypeAnnotation, +} = require('./components/componentsUtils'); +const {flowTranslateTypeAnnotation} = require('./modules'); +const {parseFlowAndThrowErrors} = require('./parseFlowAndThrowErrors'); const fs = require('fs'); +const invariant = require('invariant'); -const { - UnsupportedObjectPropertyTypeAnnotationParserError, -} = require('../errors'); +type ExtendsForProp = null | { + type: 'ReactNativeBuiltInType', + knownTypeName: 'ReactNativeCoreViewProps', +}; class FlowParser implements Parser { typeParameterInstantiation: string = 'TypeParameterInstantiation'; @@ -149,10 +142,8 @@ class FlowParser implements Parser { return this.parseString(contents, 'path/NativeSampleTurboModule.js'); } - getAst(contents: string): $FlowFixMe { - return flowParser.parse(contents, { - enums: true, - }); + getAst(contents: string, filename?: ?string): $FlowFixMe { + return parseFlowAndThrowErrors(contents, {filename}); } getFunctionTypeAnnotationParameters( diff --git a/packages/react-native-codegen/src/parsers/flow/utils.js b/packages/react-native-codegen/src/parsers/flow/utils.js index 73e71760df4423..02af5916606827 100644 --- a/packages/react-native-codegen/src/parsers/flow/utils.js +++ b/packages/react-native-codegen/src/parsers/flow/utils.js @@ -10,7 +10,7 @@ 'use strict'; -import type {TypeDeclarationMap, ASTNode} from '../utils'; +import type {ASTNode, TypeDeclarationMap} from '../utils'; function getValueFromTypes(value: ASTNode, types: TypeDeclarationMap): ASTNode { if (value.type === 'GenericTypeAnnotation' && types[value.id.name]) { diff --git a/packages/react-native-codegen/src/parsers/parser.js b/packages/react-native-codegen/src/parsers/parser.js index 7835107642da3e..4c0d0257ed54ac 100644 --- a/packages/react-native-codegen/src/parsers/parser.js +++ b/packages/react-native-codegen/src/parsers/parser.js @@ -11,24 +11,24 @@ 'use strict'; import type { - UnionTypeAnnotationMemberType, - SchemaType, + ExtendsPropsShape, NamedShape, - Nullable, - NativeModuleParamTypeAnnotation, - NativeModuleEnumMemberType, - NativeModuleEnumMembers, NativeModuleAliasMap, NativeModuleEnumMap, + NativeModuleEnumMembers, + NativeModuleEnumMemberType, + NativeModuleParamTypeAnnotation, + Nullable, PropTypeAnnotation, - ExtendsPropsShape, + SchemaType, + UnionTypeAnnotationMemberType, } from '../CodegenSchema'; import type {ParserType} from './errors'; import type { + ASTNode, ParserErrorCapturer, - TypeDeclarationMap, PropAST, - ASTNode, + TypeDeclarationMap, TypeResolutionStatus, } from './utils'; @@ -169,9 +169,11 @@ export interface Parser { /** * Given the content of a file, it returns an AST. * @parameter contents: the content of the file. + * @parameter filename: the name of the file, if available. + * @throws if there is a syntax error. * @returns: the AST of the file. */ - getAst(contents: string): $FlowFixMe; + getAst(contents: string, filename?: ?string): $FlowFixMe; /** * Given a FunctionTypeAnnotation, it returns an array of its parameters. diff --git a/packages/react-native-codegen/src/parsers/parserMock.js b/packages/react-native-codegen/src/parsers/parserMock.js index 1a775b3079cb23..7b0cc7ed53f093 100644 --- a/packages/react-native-codegen/src/parsers/parserMock.js +++ b/packages/react-native-codegen/src/parsers/parserMock.js @@ -11,46 +11,45 @@ 'use strict'; import type { - GetSchemaInfoFN, - GetTypeAnnotationFN, - Parser, - ResolveTypeAnnotationFN, -} from './parser'; -import type {ParserType} from './errors'; -type ExtendsForProp = null | { - type: 'ReactNativeBuiltInType', - knownTypeName: 'ReactNativeCoreViewProps', -}; -import type { - UnionTypeAnnotationMemberType, - SchemaType, + ExtendsPropsShape, NamedShape, - Nullable, - NativeModuleParamTypeAnnotation, - NativeModuleEnumMemberType, - NativeModuleEnumMembers, NativeModuleAliasMap, NativeModuleEnumMap, + NativeModuleEnumMembers, + NativeModuleEnumMemberType, + NativeModuleParamTypeAnnotation, + Nullable, PropTypeAnnotation, - ExtendsPropsShape, + SchemaType, + UnionTypeAnnotationMemberType, } from '../CodegenSchema'; +import type {ParserType} from './errors'; +import type { + GetSchemaInfoFN, + GetTypeAnnotationFN, + Parser, + ResolveTypeAnnotationFN, +} from './parser'; import type { ParserErrorCapturer, PropAST, TypeDeclarationMap, TypeResolutionStatus, } from './utils'; -import invariant from 'invariant'; -const {flattenProperties} = require('./typescript/components/componentsUtils'); - -const {buildPropSchema} = require('./parsers-commons'); +import invariant from 'invariant'; -// $FlowFixMe[untyped-import] there's no flowtype flow-parser -const flowParser = require('flow-parser'); const { UnsupportedObjectPropertyTypeAnnotationParserError, } = require('./errors'); +const {parseFlowAndThrowErrors} = require('./flow/parseFlowAndThrowErrors'); +const {buildPropSchema} = require('./parsers-commons'); +const {flattenProperties} = require('./typescript/components/componentsUtils'); + +type ExtendsForProp = null | { + type: 'ReactNativeBuiltInType', + knownTypeName: 'ReactNativeCoreViewProps', +}; const schemaMock = { modules: { @@ -122,10 +121,8 @@ export class MockedParser implements Parser { return schemaMock; } - getAst(contents: string): $FlowFixMe { - return flowParser.parse(contents, { - enums: true, - }); + getAst(contents: string, filename?: ?string): $FlowFixMe { + return parseFlowAndThrowErrors(contents, {filename}); } getFunctionTypeAnnotationParameters( diff --git a/packages/react-native-codegen/src/parsers/parsers-commons.js b/packages/react-native-codegen/src/parsers/parsers-commons.js index f2f5a3839d5518..81b7a446aa87cd 100644 --- a/packages/react-native-codegen/src/parsers/parsers-commons.js +++ b/packages/react-native-codegen/src/parsers/parsers-commons.js @@ -11,69 +11,66 @@ 'use strict'; import type { - Nullable, + EventTypeAnnotation, + EventTypeShape, NamedShape, NativeModuleAliasMap, NativeModuleBaseTypeAnnotation, - NativeModuleSchema, - NativeModuleTypeAnnotation, + NativeModuleEnumMap, NativeModuleFunctionTypeAnnotation, NativeModuleParamTypeAnnotation, NativeModulePropertyShape, - SchemaType, - NativeModuleEnumMap, + NativeModuleSchema, + NativeModuleTypeAnnotation, + Nullable, + ObjectTypeAnnotation, OptionsShape, PropTypeAnnotation, - EventTypeAnnotation, - ObjectTypeAnnotation, - EventTypeShape, + SchemaType, } from '../CodegenSchema.js'; - -import type {Parser} from './parser'; import type {ParserType} from './errors'; +import type {Parser} from './parser'; +import type {ComponentSchemaBuilderConfig} from './schema.js'; import type { ParserErrorCapturer, - TypeDeclarationMap, PropAST, + TypeDeclarationMap, TypeResolutionStatus, } from './utils'; -import type {ComponentSchemaBuilderConfig} from './schema.js'; - -const { - getConfigType, - extractNativeModuleName, - createParserErrorCapturer, - visit, - isModuleRegistryCall, - verifyPlatforms, -} = require('./utils'); const { - throwIfPropertyValueTypeIsUnsupported, - throwIfUnsupportedFunctionParamTypeAnnotationParserError, - throwIfUnsupportedFunctionReturnTypeAnnotationParserError, - throwIfModuleTypeIsUnsupported, - throwIfUnusedModuleInterfaceParserError, - throwIfMoreThanOneModuleRegistryCalls, - throwIfWrongNumberOfCallExpressionArgs, - throwIfUntypedModule, - throwIfIncorrectModuleRegistryCallTypeParameterParserError, + throwIfConfigNotfound, throwIfIncorrectModuleRegistryCallArgument, - throwIfModuleInterfaceNotFound, - throwIfMoreThanOneModuleInterfaceParserError, + throwIfIncorrectModuleRegistryCallTypeParameterParserError, throwIfModuleInterfaceIsMisnamed, + throwIfModuleInterfaceNotFound, + throwIfModuleTypeIsUnsupported, throwIfMoreThanOneCodegenNativecommands, - throwIfConfigNotfound, throwIfMoreThanOneConfig, + throwIfMoreThanOneModuleInterfaceParserError, + throwIfMoreThanOneModuleRegistryCalls, + throwIfPropertyValueTypeIsUnsupported, throwIfTypeAliasIsNotInterface, + throwIfUnsupportedFunctionParamTypeAnnotationParserError, + throwIfUnsupportedFunctionReturnTypeAnnotationParserError, + throwIfUntypedModule, + throwIfUnusedModuleInterfaceParserError, + throwIfWrongNumberOfCallExpressionArgs, } = require('./error-utils'); - const { MissingTypeParameterGenericParserError, MoreThanOneTypeParameterGenericParserError, UnnamedFunctionParamParserError, + UnsupportedObjectDirectRecursivePropertyParserError, } = require('./errors'); - +const { + createParserErrorCapturer, + extractNativeModuleName, + getConfigType, + isModuleRegistryCall, + verifyPlatforms, + visit, +} = require('./utils'); const invariant = require('invariant'); export type CommandOptions = $ReadOnly<{ @@ -175,6 +172,7 @@ function isObjectProperty(property: $FlowFixMe, language: ParserType): boolean { } function parseObjectProperty( + parentObject?: $FlowFixMe, property: $FlowFixMe, hasteModuleName: string, types: TypeDeclarationMap, @@ -195,6 +193,41 @@ function parseObjectProperty( ? property.typeAnnotation.typeAnnotation : property.value; + // Handle recursive types + if (parentObject) { + const propertyType = parser.getResolveTypeAnnotationFN()( + languageTypeAnnotation, + types, + parser, + ); + if ( + propertyType.typeResolutionStatus.successful === true && + propertyType.typeResolutionStatus.type === 'alias' && + (language === 'TypeScript' + ? parentObject.typeName && + parentObject.typeName.name === languageTypeAnnotation.typeName?.name + : parentObject.id && + parentObject.id.name === languageTypeAnnotation.id?.name) + ) { + if (!optional) { + throw new UnsupportedObjectDirectRecursivePropertyParserError( + name, + languageTypeAnnotation, + hasteModuleName, + ); + } + return { + name, + optional, + typeAnnotation: { + type: 'TypeAliasTypeAnnotation', + name: propertyType.typeResolutionStatus.name, + }, + }; + } + } + + // Handle non-recursive types const [propertyTypeAnnotation, isPropertyNullable] = unwrapNullable<$FlowFixMe>( translateTypeAnnotation( @@ -210,7 +243,7 @@ function parseObjectProperty( ); if ( - propertyTypeAnnotation.type === 'FunctionTypeAnnotation' || + (propertyTypeAnnotation.type === 'FunctionTypeAnnotation' && !cxxOnly) || propertyTypeAnnotation.type === 'PromiseTypeAnnotation' || propertyTypeAnnotation.type === 'VoidTypeAnnotation' ) { @@ -484,7 +517,7 @@ function buildSchema( return {modules: {}}; } - const ast = parser.getAst(contents); + const ast = parser.getAst(contents, filename); const configType = getConfigType(ast, Visitor); return buildSchemaFromConfigType( @@ -707,6 +740,7 @@ function findNativeComponentType( // expression so we need to go one level deeper if ( declaration.type === 'TSAsExpression' || + declaration.type === 'AsExpression' || declaration.type === 'TypeCastExpression' ) { declaration = declaration.expression; diff --git a/packages/react-native-codegen/src/parsers/parsers-primitives.js b/packages/react-native-codegen/src/parsers/parsers-primitives.js index e632570db09cec..dbc2c564cc4f88 100644 --- a/packages/react-native-codegen/src/parsers/parsers-primitives.js +++ b/packages/react-native-codegen/src/parsers/parsers-primitives.js @@ -11,57 +11,55 @@ 'use strict'; import type { - Nullable, BooleanTypeAnnotation, DoubleTypeAnnotation, EventTypeAnnotation, Int32TypeAnnotation, NamedShape, NativeModuleAliasMap, - NativeModuleEnumMap, NativeModuleBaseTypeAnnotation, - NativeModuleTypeAnnotation, + NativeModuleEnumDeclaration, + NativeModuleEnumMap, NativeModuleFloatTypeAnnotation, NativeModuleFunctionTypeAnnotation, NativeModuleGenericObjectTypeAnnotation, NativeModuleMixedTypeAnnotation, NativeModuleNumberTypeAnnotation, + NativeModuleObjectTypeAnnotation, NativeModulePromiseTypeAnnotation, NativeModuleTypeAliasTypeAnnotation, + NativeModuleTypeAnnotation, NativeModuleUnionTypeAnnotation, + Nullable, ObjectTypeAnnotation, ReservedTypeAnnotation, StringTypeAnnotation, VoidTypeAnnotation, - NativeModuleObjectTypeAnnotation, - NativeModuleEnumDeclaration, } from '../CodegenSchema'; import type {Parser} from './parser'; import type { ParserErrorCapturer, - TypeResolutionStatus, TypeDeclarationMap, + TypeResolutionStatus, } from './utils'; -const { - UnsupportedUnionTypeAnnotationParserError, - UnsupportedTypeAnnotationParserError, - ParserError, -} = require('./errors'); - const { throwIfArrayElementTypeAnnotationIsUnsupported, throwIfPartialNotAnnotatingTypeParameter, throwIfPartialWithMoreParameter, } = require('./error-utils'); -const {nullGuard} = require('./parsers-utils'); +const { + ParserError, + UnsupportedTypeAnnotationParserError, + UnsupportedUnionTypeAnnotationParserError, +} = require('./errors'); const { assertGenericTypeAnnotationHasExactlyOneTypeParameter, - wrapNullable, - unwrapNullable, translateFunctionTypeAnnotation, + unwrapNullable, + wrapNullable, } = require('./parsers-commons'); - +const {nullGuard} = require('./parsers-utils'); const {isModuleRegistryCall} = require('./utils'); function emitBoolean(nullable: boolean): Nullable { diff --git a/packages/react-native-codegen/src/parsers/schema.js b/packages/react-native-codegen/src/parsers/schema.js index 0fdf3c3751148a..2ebf6158b2dcba 100644 --- a/packages/react-native-codegen/src/parsers/schema.js +++ b/packages/react-native-codegen/src/parsers/schema.js @@ -11,13 +11,13 @@ 'use strict'; import type { + CommandTypeAnnotation, EventTypeShape, + ExtendsPropsShape, NamedShape, - CommandTypeAnnotation, + OptionsShape, PropTypeAnnotation, - ExtendsPropsShape, SchemaType, - OptionsShape, } from '../CodegenSchema.js'; export type ComponentSchemaBuilderConfig = $ReadOnly<{ diff --git a/packages/react-native-codegen/src/parsers/typescript/components/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/typescript/components/__test_fixtures__/fixtures.js index 7f81b17e6cc3fe..ed237a0b6c9ef8 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/__test_fixtures__/fixtures.js @@ -1108,13 +1108,20 @@ export type ScrollTo = ( y: Int, animated: Boolean, ) => Void; +export type AddOverlays = ( + viewRef: React.ElementRef, + overlayColorsReadOnly: ReadOnlyArray, + overlayColorsArray: Array, + overlayColorsArrayAnnotation: string[], +) => Void; interface NativeCommands { readonly scrollTo: ScrollTo; + readonly addOverlays: AddOverlays; } export const Commands = codegenNativeCommands({ - supportedCommands: ['scrollTo'], + supportedCommands: ['scrollTo', 'addOverlays'], }); export default codegenNativeComponent('Module') as NativeType; diff --git a/packages/react-native-codegen/src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap index 59699c28576fb4..5c31630cb3c8f7 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap @@ -5303,6 +5303,48 @@ exports[`RN Codegen TypeScript Parser can generate fixture COMMANDS_WITH_EXTERNA 'type': 'VoidTypeAnnotation' } } + }, + { + 'name': 'addOverlays', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'params': [ + { + 'name': 'overlayColorsReadOnly', + 'optional': false, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'StringTypeAnnotation' + } + } + }, + { + 'name': 'overlayColorsArray', + 'optional': false, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'StringTypeAnnotation' + } + } + }, + { + 'name': 'overlayColorsArrayAnnotation', + 'optional': false, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'StringTypeAnnotation' + } + } + } + ], + 'returnTypeAnnotation': { + 'type': 'VoidTypeAnnotation' + } + } } ] } diff --git a/packages/react-native-codegen/src/parsers/typescript/components/__tests__/typescript-component-parser-test.js b/packages/react-native-codegen/src/parsers/typescript/components/__tests__/typescript-component-parser-test.js index dd56de0b1351be..cd31e4f4d71edf 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/__tests__/typescript-component-parser-test.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/__tests__/typescript-component-parser-test.js @@ -11,9 +11,9 @@ 'use strict'; -const {TypeScriptParser} = require('../../parser'); -const fixtures = require('../__test_fixtures__/fixtures.js'); const failureFixtures = require('../__test_fixtures__/failures.js'); +const fixtures = require('../__test_fixtures__/fixtures.js'); +const {TypeScriptParser} = require('../../parser'); jest.mock('fs', () => ({ readFileSync: filename => { // Jest in the OSS does not allow to capture variables in closures. diff --git a/packages/react-native-codegen/src/parsers/typescript/components/commands.js b/packages/react-native-codegen/src/parsers/typescript/components/commands.js index 390a6d71b9607c..882f7002d9a4b6 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/commands.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/commands.js @@ -11,11 +11,13 @@ 'use strict'; import type { - NamedShape, CommandTypeAnnotation, + NamedShape, } from '../../../CodegenSchema.js'; import type {TypeDeclarationMap} from '../../utils'; + const {parseTopLevelType} = require('../parseTopLevelType'); +const {getPrimitiveTypeAnnotation} = require('./componentsUtils'); // $FlowFixMe[unclear-type] there's no flowtype for ASTs type EventTypeAST = Object; @@ -61,28 +63,34 @@ function buildCommandSchemaInternal( }; break; case 'TSBooleanKeyword': - returnType = { - type: 'BooleanTypeAnnotation', - }; - break; case 'Int32': - returnType = { - type: 'Int32TypeAnnotation', - }; - break; case 'Double': - returnType = { - type: 'DoubleTypeAnnotation', - }; - break; case 'Float': + case 'TSStringKeyword': + returnType = getPrimitiveTypeAnnotation(type); + break; + case 'Array': + case 'ReadOnlyArray': + if (!paramValue.type === 'TSTypeReference') { + throw new Error( + 'Array and ReadOnlyArray are TSTypeReference for array', + ); + } returnType = { - type: 'FloatTypeAnnotation', + type: 'ArrayTypeAnnotation', + elementType: getPrimitiveTypeAnnotation( + // TODO: T172453752 support complex type annotation for array element + paramValue.typeParameters.params[0].type, + ), }; break; - case 'TSStringKeyword': + case 'TSArrayType': returnType = { - type: 'StringTypeAnnotation', + type: 'ArrayTypeAnnotation', + elementType: { + // TODO: T172453752 support complex type annotation for array element + type: getPrimitiveTypeAnnotation(paramValue.elementType.type).type, + }, }; break; default: diff --git a/packages/react-native-codegen/src/parsers/typescript/components/componentsUtils.js b/packages/react-native-codegen/src/parsers/typescript/components/componentsUtils.js index bbe56a973e5bdb..f6eb2f12042d2b 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/componentsUtils.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/componentsUtils.js @@ -9,13 +9,15 @@ */ 'use strict'; + +import type {BuildSchemaFN, Parser} from '../../parser'; +import type {ASTNode, PropAST, TypeDeclarationMap} from '../../utils'; + +const {verifyPropNotAlreadyDefined} = require('../../parsers-commons'); const { - parseTopLevelType, flattenIntersectionType, + parseTopLevelType, } = require('../parseTopLevelType'); -const {verifyPropNotAlreadyDefined} = require('../../parsers-commons'); -import type {TypeDeclarationMap, PropAST, ASTNode} from '../../utils'; -import type {BuildSchemaFN, Parser} from '../../parser'; function getUnionOfLiterals( name: string, @@ -157,6 +159,34 @@ function buildObjectType( }; } +function getPrimitiveTypeAnnotation(type: string): $FlowFixMe { + switch (type) { + case 'Int32': + return { + type: 'Int32TypeAnnotation', + }; + case 'Double': + return { + type: 'DoubleTypeAnnotation', + }; + case 'Float': + return { + type: 'FloatTypeAnnotation', + }; + case 'TSBooleanKeyword': + return { + type: 'BooleanTypeAnnotation', + }; + case 'Stringish': + case 'TSStringKeyword': + return { + type: 'StringTypeAnnotation', + }; + default: + throw new Error(`Unknown primitive type "${type}"`); + } +} + function getCommonTypeAnnotation( name: string, forArray: boolean, @@ -224,26 +254,12 @@ function getCommonTypeAnnotation( types, ); case 'Int32': - return { - type: 'Int32TypeAnnotation', - }; case 'Double': - return { - type: 'DoubleTypeAnnotation', - }; case 'Float': - return { - type: 'FloatTypeAnnotation', - }; case 'TSBooleanKeyword': - return { - type: 'BooleanTypeAnnotation', - }; case 'Stringish': case 'TSStringKeyword': - return { - type: 'StringTypeAnnotation', - }; + return getPrimitiveTypeAnnotation(type); case 'UnsafeMixed': return { type: 'MixedTypeAnnotation', @@ -512,5 +528,6 @@ function flattenProperties( module.exports = { getSchemaInfo, getTypeAnnotation, + getPrimitiveTypeAnnotation, flattenProperties, }; diff --git a/packages/react-native-codegen/src/parsers/typescript/components/events.js b/packages/react-native-codegen/src/parsers/typescript/components/events.js index 0be6d104d580f0..a0672ac3570448 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/events.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/events.js @@ -11,35 +11,36 @@ 'use strict'; import type { + EventTypeAnnotation, EventTypeShape, NamedShape, - EventTypeAnnotation, } from '../../../CodegenSchema.js'; -import type {TypeDeclarationMap} from '../../utils'; import type {Parser} from '../../parser'; -const {flattenProperties} = require('./componentsUtils'); -const {parseTopLevelType} = require('../parseTopLevelType'); +import type {TypeDeclarationMap} from '../../utils'; + const { - throwIfEventHasNoName, - throwIfBubblingTypeIsNull, throwIfArgumentPropsAreNull, + throwIfBubblingTypeIsNull, + throwIfEventHasNoName, } = require('../../error-utils'); const { - getEventArgument, buildPropertiesForEvent, - handleEventHandler, emitBuildEventSchema, + getEventArgument, + handleEventHandler, } = require('../../parsers-commons'); const { emitBoolProp, emitDoubleProp, emitFloatProp, - emitMixedProp, - emitStringProp, emitInt32Prop, + emitMixedProp, emitObjectProp, + emitStringProp, emitUnionProp, } = require('../../parsers-primitives'); +const {parseTopLevelType} = require('../parseTopLevelType'); +const {flattenProperties} = require('./componentsUtils'); function getPropertyType( /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's * LTI update could not be added via codemod */ diff --git a/packages/react-native-codegen/src/parsers/typescript/components/extends.js b/packages/react-native-codegen/src/parsers/typescript/components/extends.js index fa0ed221a9578e..6e29af9caf1379 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/extends.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/extends.js @@ -11,6 +11,7 @@ 'use strict'; import type {TypeDeclarationMap} from '../../utils'; + const {parseTopLevelType} = require('../parseTopLevelType'); function isEvent(typeAnnotation: $FlowFixMe): boolean { diff --git a/packages/react-native-codegen/src/parsers/typescript/components/index.js b/packages/react-native-codegen/src/parsers/typescript/components/index.js index 4d3523c6a1941a..fa95c8f7e41b8f 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/index.js @@ -12,14 +12,14 @@ import type {Parser} from '../../parser'; import type {ComponentSchemaBuilderConfig} from '../../schema.js'; -const {getCommands} = require('./commands'); -const {getEvents} = require('./events'); -const {categorizeProps} = require('./extends'); const { - getOptions, findComponentConfig, getCommandProperties, + getOptions, } = require('../../parsers-commons'); +const {getCommands} = require('./commands'); +const {getEvents} = require('./events'); +const {categorizeProps} = require('./extends'); // $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser type PropsAST = Object; diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js index 5f6377869afb1d..09a26837f09339 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js @@ -825,10 +825,23 @@ export type ChooseFloat = 1.44 | 2.88 | 5.76; export type ChooseObject = {} | {low: string}; export type ChooseString = 'One' | 'Two' | 'Three'; +export type BinaryTreeNode = { + left?: BinaryTreeNode, + value: number, + right?: BinaryTreeNode, +}; + +export type GraphNode = { + label: string, + neighbors?: Array, +}; + export interface Spec extends TurboModule { readonly getCallback: () => () => void; readonly getMixed: (arg: unknown) => unknown; readonly getEnums: (quality: Quality, resolution?: Resolution, floppy: Floppy, stringOptions: StringOptions) => string; + readonly getBinaryTreeNode: (arg: BinaryTreeNode) => BinaryTreeNode; + readonly getGraphNode: (arg: GraphNode) => GraphNode; readonly getMap: (arg: {[a: string]: number | null;}) => {[b: string]: number | null;}; readonly getAnotherMap: (arg: {[key: string]: string}) => {[key: string]: string}; readonly getUnion: (chooseInt: ChooseInt, chooseFloat: ChooseFloat, chooseObject: ChooseObject, chooseString: ChooseString) => ChooseObject; diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap index 870a93494166d8..e18ec2843dd1fb 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap @@ -42,7 +42,59 @@ exports[`RN Codegen TypeScript Parser can generate fixture CXX_ONLY_NATIVE_MODUL 'modules': { 'NativeSampleTurboModule': { 'type': 'NativeModule', - 'aliasMap': {}, + 'aliasMap': { + 'BinaryTreeNode': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'left', + 'optional': true, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'BinaryTreeNode' + } + }, + { + 'name': 'value', + 'optional': false, + 'typeAnnotation': { + 'type': 'NumberTypeAnnotation' + } + }, + { + 'name': 'right', + 'optional': true, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'BinaryTreeNode' + } + } + ] + }, + 'GraphNode': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'label', + 'optional': false, + 'typeAnnotation': { + 'type': 'StringTypeAnnotation' + } + }, + { + 'name': 'neighbors', + 'optional': true, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'GraphNode' + } + } + } + ] + } + }, 'enumMap': { 'Quality': { 'name': 'Quality', @@ -193,6 +245,48 @@ exports[`RN Codegen TypeScript Parser can generate fixture CXX_ONLY_NATIVE_MODUL ] } }, + { + 'name': 'getBinaryTreeNode', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'returnTypeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'BinaryTreeNode' + }, + 'params': [ + { + 'name': 'arg', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'BinaryTreeNode' + } + } + ] + } + }, + { + 'name': 'getGraphNode', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'returnTypeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'GraphNode' + }, + 'params': [ + { + 'name': 'arg', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'GraphNode' + } + } + ] + } + }, { 'name': 'getMap', 'optional': false, diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-e2e-test.js b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-e2e-test.js index 04b471ac808dd0..58b9444b46e502 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-e2e-test.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-e2e-test.js @@ -9,22 +9,21 @@ */ import type { - NativeModuleReturnTypeAnnotation, NativeModuleBaseTypeAnnotation, - NativeModuleSchema, NativeModuleParamTypeAnnotation, + NativeModuleReturnTypeAnnotation, + NativeModuleSchema, } from '../../../../CodegenSchema'; -const invariant = require('invariant'); - -const {unwrapNullable} = require('../../../parsers-commons'); const { + MissingTypeParameterGenericParserError, + UnnamedFunctionParamParserError, UnsupportedGenericParserError, UnsupportedTypeAnnotationParserError, - UnnamedFunctionParamParserError, - MissingTypeParameterGenericParserError, } = require('../../../errors'); +const {unwrapNullable} = require('../../../parsers-commons'); const {TypeScriptParser} = require('../../parser'); +const invariant = require('invariant'); const typescriptParser = new TypeScriptParser(); diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-snapshot-test.js b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-snapshot-test.js index 68b1e694dbf28b..d375d0bbae99f4 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-snapshot-test.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-snapshot-test.js @@ -11,10 +11,9 @@ 'use strict'; -const {TypeScriptParser} = require('../../parser'); - -const fixtures = require('../__test_fixtures__/fixtures.js'); const failureFixtures = require('../__test_fixtures__/failures.js'); +const fixtures = require('../__test_fixtures__/fixtures.js'); +const {TypeScriptParser} = require('../../parser'); const typeScriptParser = new TypeScriptParser(); diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index 4668924375cce3..0b92061702db1b 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -13,46 +13,44 @@ import type { NamedShape, NativeModuleAliasMap, - NativeModuleEnumMap, NativeModuleBaseTypeAnnotation, + NativeModuleEnumMap, NativeModuleTypeAnnotation, Nullable, } from '../../../CodegenSchema'; - import type {Parser} from '../../parser'; import type { ParserErrorCapturer, - TypeResolutionStatus, TypeDeclarationMap, + TypeResolutionStatus, } from '../../utils'; -const {flattenIntersectionType} = require('../parseTopLevelType'); -const {flattenProperties} = require('../components/componentsUtils'); +const { + UnsupportedGenericParserError, + UnsupportedTypeAnnotationParserError, +} = require('../../errors'); const {parseObjectProperty} = require('../../parsers-commons'); - const { emitArrayType, - emitFunction, + emitCommonTypes, emitDictionary, + emitFunction, emitPromise, emitRootTag, emitUnion, - emitCommonTypes, + translateArrayTypeAnnotation, typeAliasResolution, typeEnumResolution, - translateArrayTypeAnnotation, } = require('../../parsers-primitives'); - -const { - UnsupportedGenericParserError, - UnsupportedTypeAnnotationParserError, -} = require('../../errors'); +const {flattenProperties} = require('../components/componentsUtils'); +const {flattenIntersectionType} = require('../parseTopLevelType'); function translateObjectTypeAnnotation( hasteModuleName: string, /** * TODO(T108222691): Use flow-types for @babel/parser */ + typeScriptTypeAnnotation: $FlowFixMe, nullable: boolean, objectMembers: $ReadOnlyArray<$FlowFixMe>, typeResolutionStatus: TypeResolutionStatus, @@ -69,6 +67,7 @@ function translateObjectTypeAnnotation( .map>>(property => { return tryParse(() => { return parseObjectProperty( + typeScriptTypeAnnotation, property, hasteModuleName, types, @@ -269,6 +268,7 @@ function translateTypeAnnotation( return translateObjectTypeAnnotation( hasteModuleName, + typeScriptTypeAnnotation, nullable, flattenProperties([typeAnnotation], types, parser), typeResolutionStatus, @@ -284,6 +284,7 @@ function translateTypeAnnotation( case 'TSIntersectionType': { return translateObjectTypeAnnotation( hasteModuleName, + typeScriptTypeAnnotation, nullable, flattenProperties( flattenIntersectionType(typeAnnotation, types), @@ -327,6 +328,7 @@ function translateTypeAnnotation( return translateObjectTypeAnnotation( hasteModuleName, + typeScriptTypeAnnotation, nullable, typeAnnotation.members, typeResolutionStatus, diff --git a/packages/react-native-codegen/src/parsers/typescript/parser.js b/packages/react-native-codegen/src/parsers/typescript/parser.js index 9e8dc836b4ed3a..7262b60301bfed 100644 --- a/packages/react-native-codegen/src/parsers/typescript/parser.js +++ b/packages/react-native-codegen/src/parsers/typescript/parser.js @@ -11,17 +11,17 @@ 'use strict'; import type { - UnionTypeAnnotationMemberType, - SchemaType, + ExtendsPropsShape, NamedShape, - Nullable, - NativeModuleParamTypeAnnotation, - NativeModuleEnumMembers, - NativeModuleEnumMemberType, NativeModuleAliasMap, NativeModuleEnumMap, + NativeModuleEnumMembers, + NativeModuleEnumMemberType, + NativeModuleParamTypeAnnotation, + Nullable, PropTypeAnnotation, - ExtendsPropsShape, + SchemaType, + UnionTypeAnnotationMemberType, } from '../../CodegenSchema'; import type {ParserType} from '../errors'; import type { @@ -32,39 +32,35 @@ import type { } from '../parser'; import type { ParserErrorCapturer, - TypeDeclarationMap, PropAST, + TypeDeclarationMap, TypeResolutionStatus, } from '../utils'; -const invariant = require('invariant'); - -const {typeScriptTranslateTypeAnnotation} = require('./modules'); - -// $FlowFixMe[untyped-import] Use flow-types for @babel/parser -const babelParser = require('@babel/parser'); -const {Visitor} = require('../parsers-primitives'); -const {buildComponentSchema} = require('./components'); -const {wrapComponentSchema} = require('../schema.js'); const { - buildSchema, + UnsupportedObjectPropertyTypeAnnotationParserError, +} = require('../errors'); +const { buildModuleSchema, - extendsForProp, buildPropSchema, + buildSchema, + extendsForProp, handleGenericTypeAnnotation, } = require('../parsers-commons.js'); - -const {parseTopLevelType} = require('./parseTopLevelType'); +const {Visitor} = require('../parsers-primitives'); +const {wrapComponentSchema} = require('../schema.js'); +const {buildComponentSchema} = require('./components'); const { + flattenProperties, getSchemaInfo, getTypeAnnotation, - flattenProperties, } = require('./components/componentsUtils'); +const {typeScriptTranslateTypeAnnotation} = require('./modules'); +const {parseTopLevelType} = require('./parseTopLevelType'); +// $FlowFixMe[untyped-import] Use flow-types for @babel/parser +const babelParser = require('@babel/parser'); const fs = require('fs'); - -const { - UnsupportedObjectPropertyTypeAnnotationParserError, -} = require('../errors'); +const invariant = require('invariant'); class TypeScriptParser implements Parser { typeParameterInstantiation: string = 'TSTypeParameterInstantiation'; @@ -146,7 +142,7 @@ class TypeScriptParser implements Parser { return this.parseString(contents, 'path/NativeSampleTurboModule.ts'); } - getAst(contents: string): $FlowFixMe { + getAst(contents: string, filename?: ?string): $FlowFixMe { return babelParser.parse(contents, { sourceType: 'module', plugins: ['typescript'], diff --git a/packages/react-native-codegen/src/parsers/utils.js b/packages/react-native-codegen/src/parsers/utils.js index 5c904c6c80fecf..77c30275951211 100644 --- a/packages/react-native-codegen/src/parsers/utils.js +++ b/packages/react-native-codegen/src/parsers/utils.js @@ -11,7 +11,6 @@ 'use strict'; const {ParserError} = require('./errors'); - const path = require('path'); export type TypeDeclarationMap = {[declarationName: string]: $FlowFixMe}; @@ -86,6 +85,12 @@ function verifyPlatforms( return; } + if (name.endsWith('Windows')) { + excludedPlatforms.add('iOS'); + excludedPlatforms.add('android'); + return; + } + if (name.endsWith('Cxx')) { cxxOnly = true; excludedPlatforms.add('iOS'); diff --git a/packages/react-native-gradle-plugin/build.gradle.kts b/packages/react-native-gradle-plugin/build.gradle.kts index c4a31beb010e19..6e09a3e22a7508 100644 --- a/packages/react-native-gradle-plugin/build.gradle.kts +++ b/packages/react-native-gradle-plugin/build.gradle.kts @@ -26,6 +26,10 @@ gradlePlugin { id = "com.facebook.react" implementationClass = "com.facebook.react.ReactPlugin" } + create("reactrootproject") { + id = "com.facebook.react.rootproject" + implementationClass = "com.facebook.react.ReactRootProjectPlugin" + } } } @@ -63,7 +67,7 @@ kotlin { jvmToolchain(17) } tasks.withType().configureEach { kotlinOptions { - apiVersion = "1.5" + apiVersion = "1.6" // See comment above on JDK 11 support jvmTarget = "11" allWarningsAsErrors = true diff --git a/packages/react-native-gradle-plugin/gradle/libs.versions.toml b/packages/react-native-gradle-plugin/gradle/libs.versions.toml index f2a1d2edab765a..24a77d1f56d040 100644 --- a/packages/react-native-gradle-plugin/gradle/libs.versions.toml +++ b/packages/react-native-gradle-plugin/gradle/libs.versions.toml @@ -1,10 +1,10 @@ [versions] -agp = "8.1.1" +agp = "8.2.1" gson = "2.8.9" guava = "31.0.1-jre" javapoet = "1.13.0" junit = "4.13.2" -kotlin = "1.8.0" +kotlin = "1.9.22" [libraries] kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } diff --git a/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.jar b/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765..d64cd4917707c1 100644 Binary files a/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.jar and b/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.jar differ diff --git a/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.properties b/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.properties index 8838ba97ba0914..2ea3535dc058bd 100644 --- a/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.properties +++ b/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/packages/react-native-gradle-plugin/gradlew.bat b/packages/react-native-gradle-plugin/gradlew.bat index 6689b85beecde6..7101f8e4676fca 100644 --- a/packages/react-native-gradle-plugin/gradlew.bat +++ b/packages/react-native-gradle-plugin/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/packages/react-native-gradle-plugin/package.json b/packages/react-native-gradle-plugin/package.json index 9bb950512b5d26..33b450a9e9166c 100644 --- a/packages/react-native-gradle-plugin/package.json +++ b/packages/react-native-gradle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/gradle-plugin", - "version": "0.73.0", + "version": "0.74.0", "description": "Gradle Plugin for React Native", "license": "MIT", "repository": { diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt index 8f7c78043c5e09..2c5bea4099c53f 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt @@ -12,8 +12,10 @@ import com.android.build.gradle.internal.tasks.factory.dependsOn import com.facebook.react.internal.PrivateReactExtension import com.facebook.react.tasks.GenerateCodegenArtifactsTask import com.facebook.react.tasks.GenerateCodegenSchemaTask -import com.facebook.react.utils.AgpConfiguratorUtils.configureBuildConfigFields +import com.facebook.react.utils.AgpConfiguratorUtils.configureBuildConfigFieldsForApp +import com.facebook.react.utils.AgpConfiguratorUtils.configureBuildConfigFieldsForLibraries import com.facebook.react.utils.AgpConfiguratorUtils.configureDevPorts +import com.facebook.react.utils.AgpConfiguratorUtils.configureNamespaceForLibraries import com.facebook.react.utils.BackwardCompatUtils.configureBackwardCompatibilityReactMap import com.facebook.react.utils.DependencyUtils.configureDependencies import com.facebook.react.utils.DependencyUtils.configureRepositories @@ -66,9 +68,10 @@ class ReactPlugin : Plugin { } configureReactNativeNdk(project, extension) - configureBuildConfigFields(project, extension) + configureBuildConfigFieldsForApp(project, extension) configureDevPorts(project) configureBackwardCompatibilityReactMap(project) + configureJavaToolChains(project) project.extensions.getByType(AndroidComponentsExtension::class.java).apply { onVariants(selector().all()) { variant -> @@ -79,12 +82,11 @@ class ReactPlugin : Plugin { } // Library Only Configuration + configureBuildConfigFieldsForLibraries(project) + configureNamespaceForLibraries(project) project.pluginManager.withPlugin("com.android.library") { configureCodegen(project, extension, rootExtension, isLibrary = true) } - - // Library and App Configurations - configureJavaToolChains(project) } private fun checkJvmVersion(project: Project) { @@ -159,6 +161,8 @@ class ReactPlugin : Plugin { val parsedPackageJson = packageJson?.let { JsonUtils.fromPackageJson(it) } val jsSrcsDirInPackageJson = parsedPackageJson?.codegenConfig?.jsSrcsDir + val includesGeneratedCode = + parsedPackageJson?.codegenConfig?.includesGeneratedCode ?: false if (jsSrcsDirInPackageJson != null) { it.jsRootDir.set(File(packageJson.parentFile, jsSrcsDirInPackageJson)) } else { @@ -166,7 +170,7 @@ class ReactPlugin : Plugin { } val needsCodegenFromPackageJson = project.needsCodegenFromPackageJson(rootExtension.root) - it.onlyIf { isLibrary || needsCodegenFromPackageJson } + it.onlyIf { (isLibrary || needsCodegenFromPackageJson) && !includesGeneratedCode } } // We create the task to generate Java code from schema. @@ -186,7 +190,11 @@ class ReactPlugin : Plugin { // Therefore, the appNeedsCodegen needs to be invoked inside this lambda. val needsCodegenFromPackageJson = project.needsCodegenFromPackageJson(rootExtension.root) - it.onlyIf { isLibrary || needsCodegenFromPackageJson } + val packageJson = findPackageJsonFile(project, rootExtension.root) + val parsedPackageJson = packageJson?.let { JsonUtils.fromPackageJson(it) } + val includesGeneratedCode = + parsedPackageJson?.codegenConfig?.includesGeneratedCode ?: false + it.onlyIf { (isLibrary || needsCodegenFromPackageJson) && !includesGeneratedCode } } // We update the android configuration to include the generated sources. diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactRootProjectPlugin.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactRootProjectPlugin.kt new file mode 100644 index 00000000000000..5f232cd0e581a5 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactRootProjectPlugin.kt @@ -0,0 +1,30 @@ +/* + * 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. + */ + +package com.facebook.react + +import org.gradle.api.Plugin +import org.gradle.api.Project + +/** + * Gradle plugin applied to the `android/build.gradle` file. + * + * This plugin allows to specify project wide configurations that can be applied to both apps and + * libraries before they're evaluated. + */ +class ReactRootProjectPlugin : Plugin { + override fun apply(project: Project) { + project.subprojects { + // As the :app project (i.e. ReactPlugin) configures both namespaces and JVM toolchains + // for libraries, its evaluation must happen before the libraries' evaluation. + // Eventually the configuration of namespace/JVM toolchain can be moved inside this plugin. + if (it.path != ":app") { + it.evaluationDependsOn(":app") + } + } + } +} diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt index e839e5c37ba3b7..b676d471b4c688 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt @@ -23,7 +23,7 @@ internal fun Project.configureReactTasks(variant: Variant, config: ReactExtensio val targetName = variant.name.capitalizeCompat() val targetPath = variant.name - val buildDir = this.layout.buildDirectory.get().asFile + val buildDir = layout.buildDirectory.get().asFile // Resources: generated/assets/react//index.android.bundle val resourcesDir = File(buildDir, "generated/res/react/$targetPath") // Bundle: generated/assets/react//index.android.bundle diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/model/ModelCodegenConfig.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/model/ModelCodegenConfig.kt index 26d7f08d95d3c7..afd02bc06ab490 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/model/ModelCodegenConfig.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/model/ModelCodegenConfig.kt @@ -11,5 +11,6 @@ data class ModelCodegenConfig( val name: String?, val type: String?, val jsSrcsDir: String?, - val android: ModelCodegenConfigAndroid? + val android: ModelCodegenConfigAndroid?, + val includesGeneratedCode: Boolean?, ) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTask.kt index 3c65387a4036c9..828a145b0076a0 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTask.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTask.kt @@ -67,6 +67,8 @@ abstract class GenerateCodegenSchemaTask : Exec() { .cliPath(workingDir), "--platform", "android", + "--exclude", + "NativeSampleTurboModule", generatedSchemaFile.get().asFile.cliPath(workingDir), jsRootDir.asFile.get().cliPath(workingDir), )) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareBoostTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareBoostTask.kt index ee680337af4977..e3da9e4aa448b3 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareBoostTask.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareBoostTask.kt @@ -40,7 +40,7 @@ abstract class PrepareBoostTask : DefaultTask() { it.into(outputDir) } File(outputDir.asFile.get(), "boost").apply { - renameTo(File(this.parentFile, "boost_${boostVersion.get()}")) + renameTo(File(parentFile, "boost_${boostVersion.get()}")) } } } diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTask.kt deleted file mode 100644 index fb00626557f307..00000000000000 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTask.kt +++ /dev/null @@ -1,51 +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. - */ - -package com.facebook.react.tasks.internal - -import java.io.File -import org.gradle.api.DefaultTask -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.* - -/** - * A task that takes care of extracting Libevent from a source folder/zip and preparing it to be - * consumed by the NDK. - */ -abstract class PrepareLibeventTask : DefaultTask() { - - @get:InputFiles abstract val libeventPath: ConfigurableFileCollection - - @get:Input abstract val libeventVersion: Property - - @get:OutputDirectory abstract val outputDir: DirectoryProperty - - @TaskAction - fun taskAction() { - project.copy { it -> - it.from(libeventPath) - it.from(project.file("src/main/jni/third-party/libevent/")) - it.include( - "libevent-${libeventVersion.get()}-stable/*.c", - "libevent-${libeventVersion.get()}-stable/*.h", - "libevent-${libeventVersion.get()}-stable/include/**/*", - "evconfig-private.h", - "event-config.h", - "CMakeLists.txt") - it.eachFile { it.path = it.path.removePrefix("libevent-${libeventVersion.get()}-stable/") } - it.includeEmptyDirs = false - it.into(outputDir) - } - File(outputDir.asFile.get(), "event-config.h").apply { - val destination = - File(this.parentFile, "include/event2/event-config.h").apply { parentFile.mkdirs() } - renameTo(destination) - } - } -} diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt index 0312095b0fe7dd..39344aac7716cb 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt @@ -8,17 +8,22 @@ package com.facebook.react.utils import com.android.build.api.variant.AndroidComponentsExtension +import com.android.build.gradle.LibraryExtension import com.facebook.react.ReactExtension import com.facebook.react.utils.ProjectUtils.isHermesEnabled import com.facebook.react.utils.ProjectUtils.isNewArchEnabled +import java.io.File +import javax.xml.parsers.DocumentBuilder +import javax.xml.parsers.DocumentBuilderFactory import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.plugins.AppliedPlugin +import org.w3c.dom.Element @Suppress("UnstableApiUsage") internal object AgpConfiguratorUtils { - fun configureBuildConfigFields(project: Project, extension: ReactExtension) { + fun configureBuildConfigFieldsForApp(project: Project, extension: ReactExtension) { val action = Action { project.extensions.getByType(AndroidComponentsExtension::class.java).finalizeDsl { ext -> @@ -35,24 +40,67 @@ internal object AgpConfiguratorUtils { project.pluginManager.withPlugin("com.android.library", action) } + fun configureBuildConfigFieldsForLibraries(appProject: Project) { + appProject.rootProject.allprojects { subproject -> + subproject.pluginManager.withPlugin("com.android.library") { + subproject.extensions.getByType(AndroidComponentsExtension::class.java).finalizeDsl { ext -> + ext.buildFeatures.buildConfig = true + } + } + } + } + fun configureDevPorts(project: Project) { val devServerPort = project.properties["reactNativeDevServerPort"]?.toString() ?: DEFAULT_DEV_SERVER_PORT - val inspectorProxyPort = - project.properties["reactNativeInspectorProxyPort"]?.toString() ?: devServerPort val action = Action { project.extensions.getByType(AndroidComponentsExtension::class.java).finalizeDsl { ext -> ext.defaultConfig.resValue("integer", "react_native_dev_server_port", devServerPort) - ext.defaultConfig.resValue( - "integer", "react_native_inspector_proxy_port", inspectorProxyPort) } } project.pluginManager.withPlugin("com.android.application", action) project.pluginManager.withPlugin("com.android.library", action) } + + fun configureNamespaceForLibraries(appProject: Project) { + appProject.rootProject.allprojects { subproject -> + subproject.pluginManager.withPlugin("com.android.library") { + subproject.extensions.getByType(AndroidComponentsExtension::class.java).finalizeDsl { ext -> + if (ext.namespace == null) { + val android = subproject.extensions.getByType(LibraryExtension::class.java) + val manifestFile = android.sourceSets.getByName("main").manifest.srcFile + + manifestFile + .takeIf { it.exists() } + ?.let { file -> + getPackageNameFromManifest(file)?.let { packageName -> + ext.namespace = packageName + } + } + } + } + } + } + } } const val DEFAULT_DEV_SERVER_PORT = "8081" + +fun getPackageNameFromManifest(manifest: File): String? { + val factory: DocumentBuilderFactory = DocumentBuilderFactory.newInstance() + val builder: DocumentBuilder = factory.newDocumentBuilder() + + try { + val xmlDocument = builder.parse(manifest) + + val manifestElement = xmlDocument.getElementsByTagName("manifest").item(0) as? Element + val packageName = manifestElement?.getAttribute("package") + + return if (packageName.isNullOrEmpty()) null else packageName + } catch (e: Exception) { + return null + } +} diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt index eb91dc556343a3..aedd296d40eea5 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt @@ -36,6 +36,12 @@ internal object DependencyUtils { repositories.mavenCentral { repo -> // We don't want to fetch JSC from Maven Central as there are older versions there. repo.content { it.excludeModule("org.webkit", "android-jsc") } + + // If the user provided a react.internal.mavenLocalRepo, do not attempt to load + // anything from Maven Central that is react related. + if (hasProperty(INTERNAL_REACT_NATIVE_MAVEN_LOCAL_REPO)) { + repo.content { it.excludeGroup("com.facebook.react") } + } } // Android JSC is installed from npm mavenRepoFromURI(File(reactNativeDir, "../jsc-android/dist").toURI()) @@ -48,8 +54,7 @@ internal object DependencyUtils { /** * This method takes care of configuring the resolution strategy for both the app and all the 3rd * party libraries which are auto-linked. Specifically it takes care of: - * - Forcing the react-android/hermes-android/flipper-integration version to the one specified in - * the package.json + * - Forcing the react-android/hermes-android version to the one specified in the package.json * - Substituting `react-native` with `react-android` and `hermes-engine` with `hermes-android`. */ fun configureDependencies( @@ -71,7 +76,6 @@ internal object DependencyUtils { } configuration.resolutionStrategy.force( "${groupString}:react-android:${versionString}", - "${groupString}:flipper-integration:${versionString}", ) if (!(eachProject.findProperty(INTERNAL_USE_HERMES_NIGHTLY) as? String).toBoolean()) { // Contributors only: The hermes-engine version is forced only if the user has @@ -115,7 +119,7 @@ internal object DependencyUtils { fun readVersionAndGroupStrings(propertiesFile: File): Pair { val reactAndroidProperties = Properties() propertiesFile.inputStream().use { reactAndroidProperties.load(it) } - val versionStringFromFile = reactAndroidProperties[INTERNAL_VERSION_NAME] as? String ?: "" + val versionStringFromFile = (reactAndroidProperties[INTERNAL_VERSION_NAME] as? String).orEmpty() // If on a nightly, we need to fetch the -SNAPSHOT artifact from Sonatype. val versionString = if (versionStringFromFile.startsWith("0.0.0") || "-nightly-" in versionStringFromFile) { diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt index 9434b5a3c52f84..d24a9ee99021eb 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt @@ -102,6 +102,7 @@ internal object NdkConfiguratorUtils { "**/libreact_debug.so", "**/libreact_nativemodule_core.so", "**/libreact_newarchdefaults.so", + "**/libreact_cxxreactpackage.so", "**/libreact_render_componentregistry.so", "**/libreact_render_core.so", "**/libreact_render_debug.so", diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/Os.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/Os.kt index 6b3fa4a3e88b21..e00a793ca86d66 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/Os.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/Os.kt @@ -40,6 +40,6 @@ internal object Os { if (isWindows()) { this.relativeTo(base).path } else { - this.absolutePath + absolutePath } } diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt index 48b02e7496f6fe..62f4019ae33e18 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt @@ -28,11 +28,9 @@ internal object ProjectUtils { internal fun Project.isNewArchEnabled(extension: ReactExtension): Boolean { return (project.hasProperty(NEW_ARCH_ENABLED) && project.property(NEW_ARCH_ENABLED).toString().toBoolean()) || - (project.hasProperty(SCOPED_NEW_ARCH_ENABLED) && project.property(SCOPED_NEW_ARCH_ENABLED).toString().toBoolean()) || shouldEnableNewArchForReactNativeVersion(project.reactNativeDir(extension)) - } internal val Project.isHermesEnabled: Boolean @@ -123,7 +121,6 @@ internal object ProjectUtils { (this.hasPropertySetToFalse(NEW_ARCH_ENABLED)) || (this.hasPropertySetToFalse(SCOPED_NEW_ARCH_ENABLED)) - val shouldEnableNewArch = shouldEnableNewArchForReactNativeVersion(this.reactNativeDir(extension)) @@ -132,5 +129,4 @@ internal object ProjectUtils { internal fun Project.hasPropertySetToFalse(property: String): Boolean = this.hasProperty(property) && this.property(property).toString().toBoolean() == false - } diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt index 780710cce45539..447c58aaa4cb0c 100644 --- a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt @@ -141,7 +141,7 @@ class GenerateCodegenArtifactsTaskTest { writeText( """ { - "name": "@a/libray", + "name": "@a/library", "codegenConfig": { "name": "an-awesome-library", "android": { @@ -174,7 +174,7 @@ class GenerateCodegenArtifactsTaskTest { writeText( """ { - "name": "@a/libray", + "name": "@a/library", "codegenConfig": { } } diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTaskTest.kt index b97c1b29a204f6..0d0f159923821a 100644 --- a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTaskTest.kt +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTaskTest.kt @@ -145,6 +145,8 @@ class GenerateCodegenSchemaTaskTest { File(codegenDir, "lib/cli/combine/combine-js-to-schema-cli.js").toString(), "--platform", "android", + "--exclude", + "NativeSampleTurboModule", File(outputDir, "schema.json").toString(), jsRootDir.toString(), ), @@ -180,6 +182,8 @@ class GenerateCodegenSchemaTaskTest { .path, "--platform", "android", + "--exclude", + "NativeSampleTurboModule", File(outputDir, "schema.json").relativeTo(project.projectDir).path, jsRootDir.relativeTo(project.projectDir).path, ), diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTaskTest.kt deleted file mode 100644 index f5085df947a484..00000000000000 --- a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTaskTest.kt +++ /dev/null @@ -1,101 +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. - */ - -package com.facebook.react.tasks.internal - -import com.facebook.react.tests.createProject -import com.facebook.react.tests.createTestTask -import java.io.* -import org.junit.Assert.* -import org.junit.Rule -import org.junit.Test -import org.junit.rules.TemporaryFolder - -class PrepareLibeventTaskTest { - - @get:Rule val tempFolder = TemporaryFolder() - - @Test(expected = IllegalStateException::class) - fun prepareBoostTask_withMissingConfiguration_fails() { - val task = createTestTask() - - task.taskAction() - } - - @Test - fun prepareBoostTask_copiesCMakefile() { - val libeventPath = tempFolder.newFolder("libeventPath") - val output = tempFolder.newFolder("output") - val project = createProject() - val task = - createTestTask(project = project) { - it.libeventPath.setFrom(libeventPath) - it.libeventVersion.set("1.0.0") - it.outputDir.set(output) - } - File(project.projectDir, "src/main/jni/third-party/libevent/CMakeLists.txt").apply { - parentFile.mkdirs() - createNewFile() - } - task.taskAction() - - assertTrue(File(output, "CMakeLists.txt").exists()) - } - - @Test - fun prepareBoostTask_copiesConfigFiles() { - val libeventPath = tempFolder.newFolder("libeventPath") - val output = tempFolder.newFolder("output") - val project = createProject() - val task = - createTestTask(project = project) { - it.libeventPath.setFrom(libeventPath) - it.libeventVersion.set("1.0.0") - it.outputDir.set(output) - } - File(project.projectDir, "src/main/jni/third-party/libevent/event-config.h").apply { - parentFile.mkdirs() - createNewFile() - } - File(project.projectDir, "src/main/jni/third-party/libevent/evconfig-private.h").createNewFile() - - task.taskAction() - - assertTrue(File(output, "evconfig-private.h").exists()) - assertTrue(File(output, "include/event2/event-config.h").exists()) - } - - @Test - fun prepareBoostTask_copiesSourceFiles() { - val libeventPath = tempFolder.newFolder("libeventPath") - val output = tempFolder.newFolder("output") - val task = - createTestTask { - it.libeventPath.setFrom(libeventPath) - it.libeventVersion.set("1.0.0") - it.outputDir.set(output) - } - File(libeventPath, "libevent-1.0.0-stable/sample.c").apply { - parentFile.mkdirs() - createNewFile() - } - File(libeventPath, "libevent-1.0.0-stable/sample.h").apply { - parentFile.mkdirs() - createNewFile() - } - File(libeventPath, "libevent-1.0.0-stable/include/sample.h").apply { - parentFile.mkdirs() - createNewFile() - } - - task.taskAction() - - assertTrue(File(output, "sample.c").exists()) - assertTrue(File(output, "sample.h").exists()) - assertTrue(File(output, "include/sample.h").exists()) - } -} diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/AgpConfiguratorUtilsTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/AgpConfiguratorUtilsTest.kt new file mode 100644 index 00000000000000..1c9c07eb0b6fb7 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/AgpConfiguratorUtilsTest.kt @@ -0,0 +1,65 @@ +/* + * 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. + */ + +package com.facebook.react.utils + +import java.io.File +import org.junit.Assert.* +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class AgpConfiguratorUtilsTest { + + @get:Rule val tempFolder = TemporaryFolder() + + @Test + fun getPackageNameFromManifest_withEmptyFile_returnsNull() { + val mainFolder = tempFolder.newFolder("awesome-module/src/main/") + val manifest = File(mainFolder, "AndroidManifest.xml").apply { writeText("") } + + val actual = getPackageNameFromManifest(manifest) + assertNull(actual) + } + + @Test + fun getPackageNameFromManifest_withMissingPackage_returnsNull() { + val mainFolder = tempFolder.newFolder("awesome-module/src/main/") + val manifest = + File(mainFolder, "AndroidManifest.xml").apply { + writeText( + // language=xml + """ + + + """ + .trimIndent()) + } + + val actual = getPackageNameFromManifest(manifest) + assertNull(actual) + } + + @Test + fun getPackageNameFromManifest_withPackage_returnsPackage() { + val mainFolder = tempFolder.newFolder("awesome-module/src/main/") + val manifest = + File(mainFolder, "AndroidManifest.xml").apply { + writeText( + // language=xml + """ + + + """ + .trimIndent()) + } + + val actual = getPackageNameFromManifest(manifest) + assertNotNull(actual) + assertEquals("com.facebook.react", actual) + } +} diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt index 2dbc3f432ecbf3..6c87c88edac641 100644 --- a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt @@ -263,7 +263,7 @@ class ProjectUtilsTest { @Test fun needsCodegenFromPackageJson_withCodegenConfigInModel_returnsTrue() { val project = createProject() - val model = ModelPackageJson("1000.0.0", ModelCodegenConfig(null, null, null, null)) + val model = ModelPackageJson("1000.0.0", ModelCodegenConfig(null, null, null, null, false)) assertTrue(project.needsCodegenFromPackageJson(model)) } diff --git a/packages/react-native-test-renderer/babel.config.js b/packages/react-native-test-renderer/babel.config.js new file mode 100644 index 00000000000000..7cd251d7825948 --- /dev/null +++ b/packages/react-native-test-renderer/babel.config.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 strict-local + * @format + */ + +module.exports = { + presets: [ + ['@babel/preset-env', {targets: {node: 'current'}}], + '@babel/preset-flow', + ], + plugins: ['@babel/plugin-transform-react-jsx'], +}; diff --git a/packages/react-native-test-renderer/jest.config.js b/packages/react-native-test-renderer/jest.config.js new file mode 100644 index 00000000000000..d1c17f8cc89caf --- /dev/null +++ b/packages/react-native-test-renderer/jest.config.js @@ -0,0 +1,25 @@ +/** + * 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 + */ + +'use strict'; + +module.exports = { + haste: { + defaultPlatform: 'ios', + platforms: ['android', 'ios', 'native'], + }, + transform: { + '^.+\\.(js|ts|tsx)$': 'babel-jest', + }, + transformIgnorePatterns: [ + 'node_modules/(?!((jest-)?react-native|@react-native(-community)?)/)', + ], + setupFilesAfterEnv: ['./src/jest/setup-files-after-env'], + testEnvironment: './src/jest/environment', +}; diff --git a/packages/react-native-test-renderer/package.json b/packages/react-native-test-renderer/package.json new file mode 100644 index 00000000000000..86101d626984d5 --- /dev/null +++ b/packages/react-native-test-renderer/package.json @@ -0,0 +1,17 @@ +{ + "name": "@react-native/test-renderer", + "private": true, + "version": "0.0.0", + "description": "A Test rendering library for React Native", + "license": "MIT", + "devDependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/preset-env": "^7.20.0", + "@babel/preset-flow": "^7.20.0" + }, + "main": "src/index.js", + "peerDependencies": { + "jest": "^29.7.0" + } +} diff --git a/packages/react-native/ReactAndroid/src/androidTest/js/TestBundle.js b/packages/react-native-test-renderer/src/index.js similarity index 59% rename from packages/react-native/ReactAndroid/src/androidTest/js/TestBundle.js rename to packages/react-native-test-renderer/src/index.js index e4c8a519e1aadb..4317334b56253c 100644 --- a/packages/react-native/ReactAndroid/src/androidTest/js/TestBundle.js +++ b/packages/react-native-test-renderer/src/index.js @@ -4,12 +4,11 @@ * 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 */ -'use strict'; +export {render} from './renderer/index.js'; -const {AppRegistry} = require('react-native'); -const TestApps = require('./TestApps'); - -AppRegistry.registerConfig(TestApps); +export {ReactNativeEnvironment} from './jest/environment.js'; diff --git a/packages/react-native-test-renderer/src/jest/environment.js b/packages/react-native-test-renderer/src/jest/environment.js new file mode 100644 index 00000000000000..166bba2c2140b0 --- /dev/null +++ b/packages/react-native-test-renderer/src/jest/environment.js @@ -0,0 +1,75 @@ +/** + * 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 + */ + +'use strict'; + +const NodeEnv = require('jest-environment-node').TestEnvironment; + +module.exports = class ReactNativeEnvironment extends NodeEnv { + customExportConditions = ['require', 'react-native']; + + constructor(config, context) { + super(config, context); + } + + async setup() { + await super.setup(); + this.assignGlobals(); + this.initializeTurboModuleRegistry(); + } + + assignGlobals() { + Object.defineProperties(this.global, { + __DEV__: { + configurable: true, + enumerable: true, + value: true, + writable: true, + }, + }); + this.global.IS_REACT_ACT_ENVIRONMENT = true; + } + + initializeTurboModuleRegistry() { + const dims = {width: 100, height: 100, scale: 1, fontScale: 1}; + const DIMS = { + screen: { + ...dims, + }, + window: { + ...dims, + }, + }; + this.global.nativeModuleProxy = name => ({})[name]; + this.global.__turboModuleProxy = name => + ({ + SourceCode: {getConstants: () => ({scriptURL: ''})}, + WebSocketModule: {connect: () => {}}, + FileReaderModule: {}, + AppState: {getConstants: () => ({}), getCurrentAppState: () => ({})}, + DeviceInfo: {getConstants: () => ({Dimensions: DIMS})}, + UIManager: {getConstants: () => ({})}, + Timing: {}, + DevSettings: {}, + PlatformConstants: { + getConstants: () => ({reactNativeVersion: '1000.0.0'}), + }, + Networking: {}, + ImageLoader: {}, + NativePerformanceCxx: {}, + NativePerformanceObserverCxx: {}, + LogBox: {}, + SettingsManager: { + getConstants: () => ({settings: {}}), + }, + LinkingManager: {}, + I18n: {getConstants: () => ({})}, + })[name]; + } +}; diff --git a/packages/react-native-test-renderer/src/jest/setup-files-after-env.js b/packages/react-native-test-renderer/src/jest/setup-files-after-env.js new file mode 100644 index 00000000000000..6dc49eedab97cb --- /dev/null +++ b/packages/react-native-test-renderer/src/jest/setup-files-after-env.js @@ -0,0 +1,222 @@ +/** + * 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 + */ + +'use strict'; + +jest.requireActual('@react-native/js-polyfills/error-guard'); + +jest + .mock('react-native/Libraries/ReactNative/UIManager', () => ({ + AndroidViewPager: { + Commands: { + setPage: jest.fn(), + setPageWithoutAnimation: jest.fn(), + }, + }, + blur: jest.fn(), + createView: jest.fn(), + customBubblingEventTypes: {}, + customDirectEventTypes: {}, + getConstants: () => ({ + ViewManagerNames: [], + }), + getDefaultEventTypes: jest.fn(), + dispatchViewManagerCommand: jest.fn(), + focus: jest.fn(), + getViewManagerConfig: jest.fn(name => { + if (name === 'AndroidDrawerLayout') { + return { + Constants: { + DrawerPosition: { + Left: 10, + }, + }, + }; + } + + return {NativeProps: {}}; + }), + hasViewManagerConfig: jest.fn(name => { + return name === 'AndroidDrawerLayout'; + }), + measure: jest.fn(), + manageChildren: jest.fn(), + removeSubviewsFromContainerWithID: jest.fn(), + replaceExistingNonRootView: jest.fn(), + setChildren: jest.fn(), + updateView: jest.fn(), + AndroidDrawerLayout: { + Constants: { + DrawerPosition: { + Left: 10, + }, + }, + }, + AndroidTextInput: { + Commands: {}, + }, + ScrollView: { + Constants: {}, + }, + View: { + Constants: {}, + }, + })) + // Mock modules defined by the native layer (ex: Objective-C, Java) + .mock('react-native/Libraries/BatchedBridge/NativeModules', () => ({ + AlertManager: { + alertWithArgs: jest.fn(), + }, + AsyncLocalStorage: { + multiGet: jest.fn((keys, callback) => + process.nextTick(() => callback(null, [])), + ), + multiSet: jest.fn((entries, callback) => + process.nextTick(() => callback(null)), + ), + multiRemove: jest.fn((keys, callback) => + process.nextTick(() => callback(null)), + ), + multiMerge: jest.fn((entries, callback) => + process.nextTick(() => callback(null)), + ), + clear: jest.fn(callback => process.nextTick(() => callback(null))), + getAllKeys: jest.fn(callback => + process.nextTick(() => callback(null, [])), + ), + }, + DeviceInfo: { + getConstants() { + return { + Dimensions: { + window: { + fontScale: 2, + height: 1334, + scale: 2, + width: 750, + }, + screen: { + fontScale: 2, + height: 1334, + scale: 2, + width: 750, + }, + }, + }; + }, + }, + DevSettings: { + addMenuItem: jest.fn(), + reload: jest.fn(), + }, + ImageLoader: { + getSize: jest.fn(url => Promise.resolve([320, 240])), + prefetchImage: jest.fn(), + }, + ImageViewManager: { + getSize: jest.fn((uri, success) => + process.nextTick(() => success(320, 240)), + ), + prefetchImage: jest.fn(), + }, + KeyboardObserver: { + addListener: jest.fn(), + removeListeners: jest.fn(), + }, + Networking: { + sendRequest: jest.fn(), + abortRequest: jest.fn(), + addListener: jest.fn(), + removeListeners: jest.fn(), + }, + PlatformConstants: { + getConstants() { + return { + reactNativeVersion: { + major: 1000, + minor: 0, + patch: 0, + }, + }; + }, + }, + PushNotificationManager: { + presentLocalNotification: jest.fn(), + scheduleLocalNotification: jest.fn(), + cancelAllLocalNotifications: jest.fn(), + removeAllDeliveredNotifications: jest.fn(), + getDeliveredNotifications: jest.fn(callback => + process.nextTick(() => []), + ), + removeDeliveredNotifications: jest.fn(), + setApplicationIconBadgeNumber: jest.fn(), + getApplicationIconBadgeNumber: jest.fn(callback => + process.nextTick(() => callback(0)), + ), + cancelLocalNotifications: jest.fn(), + getScheduledLocalNotifications: jest.fn(callback => + process.nextTick(() => callback()), + ), + requestPermissions: jest.fn(() => + Promise.resolve({alert: true, badge: true, sound: true}), + ), + abandonPermissions: jest.fn(), + checkPermissions: jest.fn(callback => + process.nextTick(() => + callback({alert: true, badge: true, sound: true}), + ), + ), + getInitialNotification: jest.fn(() => Promise.resolve(null)), + addListener: jest.fn(), + removeListeners: jest.fn(), + }, + StatusBarManager: { + setColor: jest.fn(), + setStyle: jest.fn(), + setHidden: jest.fn(), + setNetworkActivityIndicatorVisible: jest.fn(), + setBackgroundColor: jest.fn(), + setTranslucent: jest.fn(), + getConstants: () => ({ + HEIGHT: 42, + }), + }, + Timing: { + createTimer: jest.fn(), + deleteTimer: jest.fn(), + }, + UIManager: {}, + BlobModule: { + getConstants: () => ({BLOB_URI_SCHEME: 'content', BLOB_URI_HOST: null}), + addNetworkingHandler: jest.fn(), + enableBlobSupport: jest.fn(), + disableBlobSupport: jest.fn(), + createFromParts: jest.fn(), + sendBlob: jest.fn(), + release: jest.fn(), + }, + WebSocketModule: { + connect: jest.fn(), + send: jest.fn(), + sendBinary: jest.fn(), + ping: jest.fn(), + close: jest.fn(), + addListener: jest.fn(), + removeListeners: jest.fn(), + }, + I18nManager: { + allowRTL: jest.fn(), + forceRTL: jest.fn(), + swapLeftAndRightInRTL: jest.fn(), + getConstants: () => ({ + isRTL: false, + doLeftAndRightSwapInRTL: true, + }), + }, + })); diff --git a/packages/react-native-test-renderer/src/renderer/__tests__/__snapshots__/render-test.js.snap b/packages/react-native-test-renderer/src/renderer/__tests__/__snapshots__/render-test.js.snap new file mode 100644 index 00000000000000..edd8a0c422dfa7 --- /dev/null +++ b/packages/react-native-test-renderer/src/renderer/__tests__/__snapshots__/render-test.js.snap @@ -0,0 +1,39 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`render toJSON renders View props 1`] = ` + + + Hello + + + +`; + +exports[`render toJSON returns expected JSON output based on renderer component 1`] = ` + + + Hello + + + +`; diff --git a/packages/react-native-test-renderer/src/renderer/__tests__/render-test.js b/packages/react-native-test-renderer/src/renderer/__tests__/render-test.js new file mode 100644 index 00000000000000..f1776daee9c82b --- /dev/null +++ b/packages/react-native-test-renderer/src/renderer/__tests__/render-test.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 + * @flow + */ + +'use strict'; + +import * as ReactNativeTestRenderer from '../index'; +import * as React from 'react'; +import {Text, View} from 'react-native'; +import 'react-native/Libraries/Components/View/ViewNativeComponent'; + +function TestComponent() { + return ( + + Hello + + + ); +} + +function TestComponentWithProps() { + return ( + + Hello + + + ); +} + +describe('render', () => { + describe('toJSON', () => { + it('returns expected JSON output based on renderer component', () => { + const result = ReactNativeTestRenderer.render(); + expect(result.toJSON()).toMatchSnapshot(); + }); + + it('renders View props', () => { + const result = ReactNativeTestRenderer.render(); + expect(result.toJSON()).toMatchSnapshot(); + }); + }); + + describe('findAll', () => { + it('returns all nodes matching the predicate', () => { + const result = ReactNativeTestRenderer.render(); + const textNode = result.findAll(node => { + return node.props?.text === 'Hello'; + })[0]; + expect(textNode).not.toBeUndefined(); + + const viewNodes = result.findAll(node => { + return node.viewName === 'RCTView'; + }); + expect(viewNodes.length).toBe(2); + }); + }); +}); diff --git a/packages/react-native-test-renderer/src/renderer/index.js b/packages/react-native-test-renderer/src/renderer/index.js new file mode 100644 index 00000000000000..0beebea01573cd --- /dev/null +++ b/packages/react-native-test-renderer/src/renderer/index.js @@ -0,0 +1,116 @@ +/** + * 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 + * @flow + */ + +'use strict'; + +import type {Element, ElementType} from 'react'; + +import * as FabricUIManager from 'react-native/Libraries/ReactNative/__mocks__/FabricUIManager'; +import ReactFabric from 'react-native/Libraries/Renderer/shims/ReactFabric'; +import {act} from 'react-test-renderer'; + +type FiberPartial = { + pendingProps: { + children: $ReadOnlyArray, + ... + }, + ... +}; + +type ReactNode = { + children: ?Array, + props: {text?: string | null, ...}, + viewName: string, + instanceHandle: FiberPartial, +}; + +type RenderedNodeJSON = { + type: string, + props: {[propName: string]: any, ...}, + children: null | Array, + $$typeof?: symbol, // Optional because we add it with defineProperty(). +}; +type RenderedJSON = RenderedNodeJSON | string; + +type RenderResult = { + toJSON: () => Array | RenderedJSON | null, + findAll: (predicate: (ReactNode) => boolean) => Array, +}; + +function buildRenderResult(rootNode: ReactNode): RenderResult { + return { + toJSON: () => toJSON(rootNode), + findAll: (predicate: ReactNode => boolean) => findAll(rootNode, predicate), + }; +} + +export function render(element: Element): RenderResult { + const manager = FabricUIManager.getFabricUIManager(); + if (!manager) { + throw new Error('No FabricUIManager found'); + } + const containerTag = Math.round(Math.random() * 1000000); + act(() => { + ReactFabric.render(element, containerTag, () => {}, true); + }); + + // $FlowFixMe + const root: [ReactNode] = manager.getRoot(containerTag); + + if (root == null) { + throw new Error('No root found for containerTag ' + containerTag); + } + + return buildRenderResult(root[0]); +} + +function toJSON(node: ReactNode): RenderedJSON { + let renderedChildren = null; + if (node.children != null && node.children.length > 0) { + renderedChildren = node.children.map(c => toJSON(c)); + } + + if (node.viewName === 'RCTRawText') { + return node.props.text ?? ''; + } + + const {children: _children, ...props} = + node.instanceHandle?.pendingProps ?? {}; + const json: RenderedNodeJSON = { + type: node.viewName, + props, + children: renderedChildren, + }; + + Object.defineProperty(json, '$$typeof', { + value: Symbol.for('react.test.json'), + }); + + return json; +} + +function findAll( + node: ReactNode, + predicate: ReactNode => boolean, +): Array { + const results = []; + + if (predicate(node)) { + results.push(node); + } + + if (node.children != null && node.children.length > 0) { + for (const child of node.children) { + results.push(...findAll(child, predicate)); + } + } + + return results; +} diff --git a/packages/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.js b/packages/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.js index 5366c0ccc2cb9f..e970cdc06a68a2 100644 --- a/packages/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.js +++ b/packages/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.js @@ -89,7 +89,9 @@ const ActionSheetIOS = { RCTActionSheetManager.showActionSheetWithOptions( { ...remainingOptions, + // $FlowFixMe[incompatible-call] tintColor: processedTintColor, + // $FlowFixMe[incompatible-call] cancelButtonTintColor: processedCancelButtonTintColor, destructiveButtonIndices, }, diff --git a/packages/react-native/Libraries/ActionSheetIOS/NativeActionSheetManager.js b/packages/react-native/Libraries/ActionSheetIOS/NativeActionSheetManager.js index 8247ac260aff99..06fec75530e48e 100644 --- a/packages/react-native/Libraries/ActionSheetIOS/NativeActionSheetManager.js +++ b/packages/react-native/Libraries/ActionSheetIOS/NativeActionSheetManager.js @@ -4,51 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ -import type {TurboModule} from '../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; - -export interface Spec extends TurboModule { - +getConstants: () => {||}; - +showActionSheetWithOptions: ( - options: {| - +title?: ?string, - +message?: ?string, - +options: ?Array, - +destructiveButtonIndices?: ?Array, - +cancelButtonIndex?: ?number, - +anchor?: ?number, - +tintColor?: ?number, - +cancelButtonTintColor?: ?number, - +userInterfaceStyle?: ?string, - +disabledButtonIndices?: Array, - |}, - callback: (buttonIndex: number) => void, - ) => void; - +showShareActionSheetWithOptions: ( - options: {| - +message?: ?string, - +url?: ?string, - +subject?: ?string, - +anchor?: ?number, - +tintColor?: ?number, - +cancelButtonTintColor?: ?number, - +excludedActivityTypes?: ?Array, - +userInterfaceStyle?: ?string, - |}, - failureCallback: (error: {| - +domain: string, - +code: string, - +userInfo?: ?Object, - +message: string, - |}) => void, - successCallback: (completed: boolean, activityType: ?string) => void, - ) => void; - +dismissActionSheet?: () => void; -} - -export default (TurboModuleRegistry.get('ActionSheetManager'): ?Spec); +export * from '../../src/private/specs/modules/NativeActionSheetManager'; +import NativeActionSheetManager from '../../src/private/specs/modules/NativeActionSheetManager'; +export default NativeActionSheetManager; diff --git a/packages/react-native/Libraries/Alert/NativeAlertManager.js b/packages/react-native/Libraries/Alert/NativeAlertManager.js index 9bd3836bb4d720..33d2102f6e3d83 100644 --- a/packages/react-native/Libraries/Alert/NativeAlertManager.js +++ b/packages/react-native/Libraries/Alert/NativeAlertManager.js @@ -4,37 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ -import type {TurboModule} from '../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; - -export type Args = {| - title?: string, - message?: string, - buttons?: Array, // TODO(T67565166): have a better type - type?: string, - defaultValue?: string, - cancelButtonKey?: string, - destructiveButtonKey?: string, - preferredButtonKey?: string, - keyboardType?: string, - userInterfaceStyle?: string, - // [macOS - defaultInputs?: Array, - modal?: ?boolean, - critical?: ?boolean, - // macOS] -|}; - -export interface Spec extends TurboModule { - +alertWithArgs: ( - args: Args, - callback: (id: number, value: string) => void, - ) => void; -} - -export default (TurboModuleRegistry.get('AlertManager'): ?Spec); +export * from '../../src/private/specs/modules/NativeAlertManager'; +import NativeAlertManager from '../../src/private/specs/modules/NativeAlertManager'; +export default NativeAlertManager; diff --git a/packages/react-native/Libraries/Animated/Animated.js b/packages/react-native/Libraries/Animated/Animated.js index a9df993ad2981c..509e33880db5d5 100644 --- a/packages/react-native/Libraries/Animated/Animated.js +++ b/packages/react-native/Libraries/Animated/Animated.js @@ -21,9 +21,9 @@ import Platform from '../Utilities/Platform'; import AnimatedImplementation from './AnimatedImplementation'; import AnimatedMock from './AnimatedMock'; -const Animated = ((Platform.isDisableAnimations +const Animated: typeof AnimatedImplementation = Platform.isDisableAnimations ? AnimatedMock - : AnimatedImplementation): typeof AnimatedImplementation); + : AnimatedImplementation; export default { get FlatList(): AnimatedFlatList { diff --git a/packages/react-native/Libraries/Animated/AnimatedPlatformConfig.js b/packages/react-native/Libraries/Animated/AnimatedPlatformConfig.js index fb0b52f3f1c8bd..c495cedb669641 100644 --- a/packages/react-native/Libraries/Animated/AnimatedPlatformConfig.js +++ b/packages/react-native/Libraries/Animated/AnimatedPlatformConfig.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ diff --git a/packages/react-native/Libraries/Animated/NativeAnimatedHelper.js b/packages/react-native/Libraries/Animated/NativeAnimatedHelper.js index ef8943b9866fef..5a8ccaa4053b5a 100644 --- a/packages/react-native/Libraries/Animated/NativeAnimatedHelper.js +++ b/packages/react-native/Libraries/Animated/NativeAnimatedHelper.js @@ -18,9 +18,9 @@ import type { } from './NativeAnimatedModule'; import type {InterpolationConfigType} from './nodes/AnimatedInterpolation'; +import * as ReactNativeFeatureFlags from '../../src/private/featureflags/ReactNativeFeatureFlags'; import NativeEventEmitter from '../EventEmitter/NativeEventEmitter'; import RCTDeviceEventEmitter from '../EventEmitter/RCTDeviceEventEmitter'; -import ReactNativeFeatureFlags from '../ReactNative/ReactNativeFeatureFlags'; import Platform from '../Utilities/Platform'; import NativeAnimatedNonTurboModule from './NativeAnimatedModule'; import NativeAnimatedTurboModule from './NativeAnimatedTurboModule'; @@ -48,10 +48,10 @@ const useSingleOpBatching = let flushQueueTimeout = null; const eventListenerGetValueCallbacks: { - [$FlowFixMe | number]: ((value: number) => void) | void, + [number]: (value: number) => void, } = {}; const eventListenerAnimationFinishedCallbacks: { - [$FlowFixMe | number]: EndCallback | void, + [number]: EndCallback, } = {}; let globalEventEmitterGetValueListener: ?EventSubscription = null; let globalEventEmitterAnimationFinishedListener: ?EventSubscription = null; @@ -339,7 +339,7 @@ const API = { function setupGlobalEventEmitterListeners() { globalEventEmitterGetValueListener = RCTDeviceEventEmitter.addListener( 'onNativeAnimatedModuleGetValue', - function (params) { + params => { const {tag} = params; const callback = eventListenerGetValueCallbacks[tag]; if (!callback) { @@ -352,14 +352,17 @@ function setupGlobalEventEmitterListeners() { globalEventEmitterAnimationFinishedListener = RCTDeviceEventEmitter.addListener( 'onNativeAnimatedModuleAnimationFinished', - function (params) { - const {animationId} = params; - const callback = eventListenerAnimationFinishedCallbacks[animationId]; - if (!callback) { - return; + params => { + // TODO: remove Array.isArray once native changes have propagated + const animations = Array.isArray(params) ? params : [params]; + for (const animation of animations) { + const {animationId} = animation; + const callback = eventListenerAnimationFinishedCallbacks[animationId]; + if (callback) { + callback(animation); + delete eventListenerAnimationFinishedCallbacks[animationId]; + } } - callback(params); - delete eventListenerAnimationFinishedCallbacks[animationId]; }, ); } diff --git a/packages/react-native/Libraries/Animated/NativeAnimatedModule.js b/packages/react-native/Libraries/Animated/NativeAnimatedModule.js index 5094739f4fd90d..74a9cbb3f46474 100644 --- a/packages/react-native/Libraries/Animated/NativeAnimatedModule.js +++ b/packages/react-native/Libraries/Animated/NativeAnimatedModule.js @@ -4,74 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ -import type {TurboModule} from '../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; -import shouldUseTurboAnimatedModule from './shouldUseTurboAnimatedModule'; - -type EndResult = {finished: boolean, value?: number, ...}; -type EndCallback = (result: EndResult) => void; -type SaveValueCallback = (value: number) => void; - -export type EventMapping = {| - nativeEventPath: Array, - animatedValueTag: ?number, -|}; - -// The config has different keys depending on the type of the Node -// TODO(T54896888): Make these types strict -export type AnimatedNodeConfig = Object; -export type AnimatingNodeConfig = Object; - -export interface Spec extends TurboModule { - +startOperationBatch: () => void; - +finishOperationBatch: () => void; - +createAnimatedNode: (tag: number, config: AnimatedNodeConfig) => void; - +updateAnimatedNodeConfig?: (tag: number, config: AnimatedNodeConfig) => void; - +getValue: (tag: number, saveValueCallback: SaveValueCallback) => void; - +startListeningToAnimatedNodeValue: (tag: number) => void; - +stopListeningToAnimatedNodeValue: (tag: number) => void; - +connectAnimatedNodes: (parentTag: number, childTag: number) => void; - +disconnectAnimatedNodes: (parentTag: number, childTag: number) => void; - +startAnimatingNode: ( - animationId: number, - nodeTag: number, - config: AnimatingNodeConfig, - endCallback: EndCallback, - ) => void; - +stopAnimation: (animationId: number) => void; - +setAnimatedNodeValue: (nodeTag: number, value: number) => void; - +setAnimatedNodeOffset: (nodeTag: number, offset: number) => void; - +flattenAnimatedNodeOffset: (nodeTag: number) => void; - +extractAnimatedNodeOffset: (nodeTag: number) => void; - +connectAnimatedNodeToView: (nodeTag: number, viewTag: number) => void; - +disconnectAnimatedNodeFromView: (nodeTag: number, viewTag: number) => void; - +restoreDefaultValues: (nodeTag: number) => void; - +dropAnimatedNode: (tag: number) => void; - +addAnimatedEventToView: ( - viewTag: number, - eventName: string, - eventMapping: EventMapping, - ) => void; - +removeAnimatedEventFromView: ( - viewTag: number, - eventName: string, - animatedNodeTag: number, - ) => void; - - // Events - +addListener: (eventName: string) => void; - +removeListeners: (count: number) => void; - - // All of the above in a batched mode - +queueAndExecuteBatchedOperations?: (operationsAndArgs: Array) => void; -} - -const NativeModule: ?Spec = !shouldUseTurboAnimatedModule() - ? TurboModuleRegistry.get('NativeAnimatedModule') - : null; -export default NativeModule; +export * from '../../src/private/specs/modules/NativeAnimatedModule'; +import NativeAnimatedModule from '../../src/private/specs/modules/NativeAnimatedModule'; +export default NativeAnimatedModule; diff --git a/packages/react-native/Libraries/Animated/NativeAnimatedTurboModule.js b/packages/react-native/Libraries/Animated/NativeAnimatedTurboModule.js index 35a4ffa16bf576..36086746940fcd 100644 --- a/packages/react-native/Libraries/Animated/NativeAnimatedTurboModule.js +++ b/packages/react-native/Libraries/Animated/NativeAnimatedTurboModule.js @@ -4,75 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ -import type {TurboModule} from '../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; -import shouldUseTurboAnimatedModule from './shouldUseTurboAnimatedModule'; - -type EndResult = {finished: boolean, value?: number, ...}; -type EndCallback = (result: EndResult) => void; -type SaveValueCallback = (value: number) => void; - -export type EventMapping = {| - nativeEventPath: Array, - animatedValueTag: ?number, -|}; - -// The config has different keys depending on the type of the Node -// TODO(T54896888): Make these types strict -export type AnimatedNodeConfig = Object; -export type AnimatingNodeConfig = Object; - -export interface Spec extends TurboModule { - +startOperationBatch: () => void; - +finishOperationBatch: () => void; - +createAnimatedNode: (tag: number, config: AnimatedNodeConfig) => void; - +updateAnimatedNodeConfig?: (tag: number, config: AnimatedNodeConfig) => void; - +getValue: (tag: number, saveValueCallback: SaveValueCallback) => void; - +startListeningToAnimatedNodeValue: (tag: number) => void; - +stopListeningToAnimatedNodeValue: (tag: number) => void; - +connectAnimatedNodes: (parentTag: number, childTag: number) => void; - +disconnectAnimatedNodes: (parentTag: number, childTag: number) => void; - +startAnimatingNode: ( - animationId: number, - nodeTag: number, - config: AnimatingNodeConfig, - endCallback: EndCallback, - ) => void; - +stopAnimation: (animationId: number) => void; - +setAnimatedNodeValue: (nodeTag: number, value: number) => void; - +setAnimatedNodeOffset: (nodeTag: number, offset: number) => void; - +flattenAnimatedNodeOffset: (nodeTag: number) => void; - +extractAnimatedNodeOffset: (nodeTag: number) => void; - +connectAnimatedNodeToView: (nodeTag: number, viewTag: number) => void; - +disconnectAnimatedNodeFromView: (nodeTag: number, viewTag: number) => void; - +restoreDefaultValues: (nodeTag: number) => void; - +dropAnimatedNode: (tag: number) => void; - +addAnimatedEventToView: ( - viewTag: number, - eventName: string, - eventMapping: EventMapping, - ) => void; - +removeAnimatedEventFromView: ( - viewTag: number, - eventName: string, - animatedNodeTag: number, - ) => void; - - // Events - +addListener: (eventName: string) => void; - +removeListeners: (count: number) => void; - - // All of the above in a batched mode - +queueAndExecuteBatchedOperations?: (operationsAndArgs: Array) => void; -} - -const NativeModule: ?Spec = shouldUseTurboAnimatedModule() - ? TurboModuleRegistry.get('NativeAnimatedTurboModule') - : null; - -export default NativeModule; +export * from '../../src/private/specs/modules/NativeAnimatedTurboModule'; +import NativeAnimatedTurboModule from '../../src/private/specs/modules/NativeAnimatedTurboModule'; +export default NativeAnimatedTurboModule; diff --git a/packages/react-native/Libraries/Animated/__tests__/Animated-test.js b/packages/react-native/Libraries/Animated/__tests__/Animated-test.js index 96802ebf575a6d..b58175ac46e275 100644 --- a/packages/react-native/Libraries/Animated/__tests__/Animated-test.js +++ b/packages/react-native/Libraries/Animated/__tests__/Animated-test.js @@ -1094,9 +1094,7 @@ describe('Animated tests', () => { const listener = jest.fn(); color.addListener(listener); - const callback = jest.fn(() => { - console.log('callback', color.__getValue()); - }); + const callback = jest.fn(); const node = new AnimatedProps({style: {color}}, callback); node.__attach(); diff --git a/packages/react-native/Libraries/Animated/animations/Animation.js b/packages/react-native/Libraries/Animated/animations/Animation.js index d8e955f9fda49b..c93dc21f58b7b0 100644 --- a/packages/react-native/Libraries/Animated/animations/Animation.js +++ b/packages/react-native/Libraries/Animated/animations/Animation.js @@ -14,11 +14,8 @@ import type {PlatformConfig} from '../AnimatedPlatformConfig'; import type AnimatedNode from '../nodes/AnimatedNode'; import type AnimatedValue from '../nodes/AnimatedValue'; -import Platform from '../../Utilities/Platform'; import NativeAnimatedHelper from '../NativeAnimatedHelper'; -import AnimatedColor from '../nodes/AnimatedColor'; import AnimatedProps from '../nodes/AnimatedProps'; -import AnimatedValueXY from '../nodes/AnimatedValueXY'; export type EndResult = {finished: boolean, value?: number, ...}; export type EndCallback = (result: EndResult) => void; @@ -39,10 +36,11 @@ let startNativeAnimationNextId = 1; export default class Animation { __active: boolean; __isInteraction: boolean; - __nativeId: number; __onEnd: ?EndCallback; __iterations: number; + _nativeId: number; + start( fromValue: number, onUpdate: (value: number) => void, @@ -52,8 +50,8 @@ export default class Animation { ): void {} stop(): void { - if (this.__nativeId) { - NativeAnimatedHelper.API.stopAnimation(this.__nativeId); + if (this._nativeId) { + NativeAnimatedHelper.API.stopAnimation(this._nativeId); } } @@ -78,20 +76,6 @@ export default class Animation { return result; } - // Vectorized animations (animations on AnimatedValueXY, AnimatedColor nodes) - // are split into multiple animations for each component that execute in parallel. - // Calling update() on AnimatedProps when each animation completes results in - // potential flickering as all animations that are part of the vectorized animation - // may not have completed yet. For example, only the animation for the red channel of - // an animating color may have been completed, resulting in a temporary red color - // being rendered. So, for now, ignore AnimatedProps that use a vectorized animation. - if ( - Platform.OS === 'ios' && - (node instanceof AnimatedValueXY || node instanceof AnimatedColor) - ) { - return result; - } - for (const child of node.__getChildren()) { result.push(...this.__findAnimatedPropsNodes(child)); } @@ -108,9 +92,9 @@ export default class Animation { try { const config = this.__getNativeAnimationConfig(); animatedValue.__makeNative(config.platformConfig); - this.__nativeId = NativeAnimatedHelper.generateNewAnimationId(); + this._nativeId = NativeAnimatedHelper.generateNewAnimationId(); NativeAnimatedHelper.API.startAnimatingNode( - this.__nativeId, + this._nativeId, animatedValue.__getNativeTag(), config, result => { diff --git a/packages/react-native/Libraries/Animated/components/AnimatedFlatList.js b/packages/react-native/Libraries/Animated/components/AnimatedFlatList.js index a3a24355cba038..adfb8639585656 100644 --- a/packages/react-native/Libraries/Animated/components/AnimatedFlatList.js +++ b/packages/react-native/Libraries/Animated/components/AnimatedFlatList.js @@ -14,22 +14,7 @@ import FlatList from '../../Lists/FlatList'; import createAnimatedComponent from '../createAnimatedComponent'; import * as React from 'react'; -/** - * @see https://github.com/facebook/react-native/commit/b8c8562 - */ -const FlatListWithEventThrottle = React.forwardRef( - // $FlowFixMe[incompatible-call] - ( - props: React.ElementConfig, - ref: - | ((null | FlatList) => mixed) - | {current: null | FlatList, ...}, - ) => , -); - -export default (createAnimatedComponent( - FlatListWithEventThrottle, -): AnimatedComponentType< +export default (createAnimatedComponent(FlatList): AnimatedComponentType< React.ElementConfig, React.ElementRef, >); diff --git a/packages/react-native/Libraries/Animated/components/AnimatedScrollView.js b/packages/react-native/Libraries/Animated/components/AnimatedScrollView.js index e2b48d0ce9af9b..029563d4bb9059 100644 --- a/packages/react-native/Libraries/Animated/components/AnimatedScrollView.js +++ b/packages/react-native/Libraries/Animated/components/AnimatedScrollView.js @@ -30,39 +30,44 @@ type Instance = React.ElementRef; * @see https://github.com/facebook/react-native/commit/b8c8562 */ const AnimatedScrollView: AnimatedComponentType = - React.forwardRef((props, forwardedRef) => { - // (Android only) When a ScrollView has a RefreshControl and - // any `style` property set with an Animated.Value, the CSS - // gets incorrectly applied twice. This is because ScrollView - // swaps the parent/child relationship of itself and the - // RefreshControl component (see ScrollView.js for more details). - if ( - Platform.OS === 'android' && - props.refreshControl != null && - props.style != null + React.forwardRef( + function AnimatedScrollViewWithOrWithoutInvertedRefreshControl( + props, + forwardedRef, ) { - return ( - - ); - } else { - return ( - - ); - } - }); + // (Android only) When a ScrollView has a RefreshControl and + // any `style` property set with an Animated.Value, the CSS + // gets incorrectly applied twice. This is because ScrollView + // swaps the parent/child relationship of itself and the + // RefreshControl component (see ScrollView.js for more details). + if ( + Platform.OS === 'android' && + props.refreshControl != null && + props.style != null + ) { + return ( + + ); + } else { + return ( + + ); + } + }, + ); const AnimatedScrollViewWithInvertedRefreshControl = React.forwardRef( // $FlowFixMe[incompatible-call] - ( + function AnimatedScrollViewWithInvertedRefreshControl( props: { ...React.ElementConfig, // $FlowFixMe[unclear-type] Same Flow type as `refreshControl` in ScrollView @@ -71,7 +76,7 @@ const AnimatedScrollViewWithInvertedRefreshControl = React.forwardRef( forwardedRef: | {current: Instance | null, ...} | ((Instance | null) => mixed), - ) => { + ) { // Split `props` into the animate-able props for the parent (RefreshControl) // and child (ScrollView). const {intermediatePropsForRefreshControl, intermediatePropsForScrollView} = @@ -103,7 +108,7 @@ const AnimatedScrollViewWithInvertedRefreshControl = React.forwardRef( Props, Instance, >(intermediatePropsForScrollView); - const ref = useMergeRefs(scrollViewRef, forwardedRef); + const ref = useMergeRefs(scrollViewRef, forwardedRef); return ( // $FlowFixMe[incompatible-use] Investigate useAnimatedProps return value diff --git a/packages/react-native/Libraries/Animated/components/AnimatedSectionList.js b/packages/react-native/Libraries/Animated/components/AnimatedSectionList.js index 083d9be05eb3a2..5b2f80c2c53eab 100644 --- a/packages/react-native/Libraries/Animated/components/AnimatedSectionList.js +++ b/packages/react-native/Libraries/Animated/components/AnimatedSectionList.js @@ -8,32 +8,13 @@ * @format */ -import type {SectionBase} from '../../Lists/SectionList'; import type {AnimatedComponentType} from '../createAnimatedComponent'; import SectionList from '../../Lists/SectionList'; import createAnimatedComponent from '../createAnimatedComponent'; import * as React from 'react'; -/** - * @see https://github.com/facebook/react-native/commit/b8c8562 - */ -const SectionListWithEventThrottle = React.forwardRef( - // $FlowFixMe[incompatible-call] - ( - props: React.ElementConfig, - ref: - | ((null | SectionList>) => mixed) - | { - current: null | SectionList>, - ... - }, - ) => , -); - -export default (createAnimatedComponent( - SectionListWithEventThrottle, -): AnimatedComponentType< +export default (createAnimatedComponent(SectionList): AnimatedComponentType< React.ElementConfig, React.ElementRef, >); diff --git a/packages/react-native/Libraries/Animated/createAnimatedComponent.js b/packages/react-native/Libraries/Animated/createAnimatedComponent.js index 878b1d34a4391c..78b66e094812d2 100644 --- a/packages/react-native/Libraries/Animated/createAnimatedComponent.js +++ b/packages/react-native/Libraries/Animated/createAnimatedComponent.js @@ -13,50 +13,55 @@ import useMergeRefs from '../Utilities/useMergeRefs'; import useAnimatedProps from './useAnimatedProps'; import * as React from 'react'; +// $FlowFixMe[deprecated-type] +export type AnimatedProps = $ObjMap< + Props & + $ReadOnly<{ + passthroughAnimatedPropExplicitValues?: React.ElementConfig, + }>, + () => any, +>; + export type AnimatedComponentType< - -Props: {+[string]: mixed, ...}, + Props: {...}, +Instance = mixed, -> = React.AbstractComponent< - $ObjMap< - Props & - $ReadOnly<{ - passthroughAnimatedPropExplicitValues?: React.ElementConfig< - typeof View, - >, - }>, - () => any, - >, - Instance, ->; +> = React.AbstractComponent, Instance>; export default function createAnimatedComponent( Component: React.AbstractComponent, ): AnimatedComponentType { - return React.forwardRef((props, forwardedRef) => { - const [reducedProps, callbackRef] = useAnimatedProps( - // $FlowFixMe[incompatible-call] - props, - ); - // $FlowFixMe[incompatible-call] - const ref = useMergeRefs(callbackRef, forwardedRef); - - // Some components require explicit passthrough values for animation - // to work properly. For example, if an animated component is - // transformed and Pressable, onPress will not work after transform - // without these passthrough values. - // $FlowFixMe[prop-missing] - const {passthroughAnimatedPropExplicitValues, style} = reducedProps; - const {style: passthroughStyle, ...passthroughProps} = - passthroughAnimatedPropExplicitValues ?? {}; - const mergedStyle = {...style, ...passthroughStyle}; - - return ( - - ); - }); + const AnimatedComponent = React.forwardRef, TInstance>( + (props, forwardedRef) => { + const [reducedProps, callbackRef] = useAnimatedProps( + // $FlowFixMe[incompatible-call] + props, + ); + const ref = useMergeRefs(callbackRef, forwardedRef); + + // Some components require explicit passthrough values for animation + // to work properly. For example, if an animated component is + // transformed and Pressable, onPress will not work after transform + // without these passthrough values. + // $FlowFixMe[prop-missing] + const {passthroughAnimatedPropExplicitValues, style} = reducedProps; + const {style: passthroughStyle, ...passthroughProps} = + passthroughAnimatedPropExplicitValues ?? {}; + const mergedStyle = {...style, ...passthroughStyle}; + + return ( + + ); + }, + ); + + AnimatedComponent.displayName = `Animated(${ + Component.displayName || 'Anonymous' + })`; + + return AnimatedComponent; } diff --git a/packages/react-native/Libraries/Animated/nodes/AnimatedStyle.js b/packages/react-native/Libraries/Animated/nodes/AnimatedStyle.js index 8fdc6532aeb2e3..840e1264ddb582 100644 --- a/packages/react-native/Libraries/Animated/nodes/AnimatedStyle.js +++ b/packages/react-native/Libraries/Animated/nodes/AnimatedStyle.js @@ -12,7 +12,7 @@ import type {PlatformConfig} from '../AnimatedPlatformConfig'; -import ReactNativeFeatureFlags from '../../ReactNative/ReactNativeFeatureFlags'; +import * as ReactNativeFeatureFlags from '../../../src/private/featureflags/ReactNativeFeatureFlags'; import flattenStyle from '../../StyleSheet/flattenStyle'; import Platform from '../../Utilities/Platform'; import NativeAnimatedHelper from '../NativeAnimatedHelper'; @@ -30,7 +30,7 @@ function createAnimatedStyle( const animatedStyles: any = {}; for (const key in style) { const value = style[key]; - if (key === 'transform') { + if (value != null && key === 'transform') { animatedStyles[key] = ReactNativeFeatureFlags.shouldUseAnimatedObjectForTransform() ? new AnimatedObject(value) diff --git a/packages/react-native/Libraries/Animated/shouldUseTurboAnimatedModule.js b/packages/react-native/Libraries/Animated/shouldUseTurboAnimatedModule.js index c112ba99aca60c..0a780617e48309 100644 --- a/packages/react-native/Libraries/Animated/shouldUseTurboAnimatedModule.js +++ b/packages/react-native/Libraries/Animated/shouldUseTurboAnimatedModule.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ diff --git a/packages/react-native/Libraries/Animated/useAnimatedProps.js b/packages/react-native/Libraries/Animated/useAnimatedProps.js index 2d87e367d81c46..6be9fac9cd86cf 100644 --- a/packages/react-native/Libraries/Animated/useAnimatedProps.js +++ b/packages/react-native/Libraries/Animated/useAnimatedProps.js @@ -10,8 +10,8 @@ 'use strict'; +import * as ReactNativeFeatureFlags from '../../src/private/featureflags/ReactNativeFeatureFlags'; import {isPublicInstance as isFabricPublicInstance} from '../ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstanceUtils'; -import ReactNativeFeatureFlags from '../ReactNative/ReactNativeFeatureFlags'; import useRefEffect from '../Utilities/useRefEffect'; import {AnimatedEvent} from './AnimatedEvent'; import NativeAnimatedHelper from './NativeAnimatedHelper'; @@ -37,6 +37,7 @@ export default function useAnimatedProps( ): [ReducedProps, CallbackRef] { const [, scheduleUpdate] = useReducer(count => count + 1, 0); const onUpdateRef = useRef void>(null); + const timerRef = useRef(null); // TODO: Only invalidate `node` if animated props or `style` change. In the // previous implementation, we permitted `style` to override props with the @@ -87,6 +88,25 @@ export default function useAnimatedProps( // $FlowIgnore[not-a-function] - Assume it's still a function. // $FlowFixMe[incompatible-use] instance.setNativeProps(node.__getAnimatedValue()); + if (isFabricInstance(instance)) { + // Keeping state of Fiber tree and Shadow tree in sync. + // + // This is done by calling `scheduleUpdate` which will trigger a commit. + // However, React commit is not fast enough to drive animations. + // This is where setNativeProps comes in handy but the state between + // Fiber tree and Shadow tree needs to be kept in sync. + // The goal is to call `scheduleUpdate` as little as possible to maintain + // performance but frequently enough to keep state in sync. + // Debounce is set to 48ms, which is 3 * the duration of a frame. + // 3 frames was the highest value where flickering state was not observed. + if (timerRef.current != null) { + clearTimeout(timerRef.current); + } + timerRef.current = setTimeout(() => { + timerRef.current = null; + scheduleUpdate(); + }, 48); + } } }; diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h index fabb691c700bfb..ffbff6ae9eb535 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h @@ -11,8 +11,11 @@ @class RCTBridge; @protocol RCTBridgeDelegate; @protocol RCTComponentViewProtocol; +@class RCTRootView; @class RCTSurfacePresenterBridgeAdapter; +NS_ASSUME_NONNULL_BEGIN + /** * The RCTAppDelegate is an utility class that implements some base configurations for all the React Native apps. * It is not mandatory to use it, but it could simplify your AppDelegate code. @@ -39,7 +42,6 @@ * - (UIViewController *)createRootViewController; * - (void)setRootView:(UIView *)rootView toRootViewController:(UIViewController *)rootViewController; * New Architecture: - * - (BOOL)concurrentRootEnabled * - (BOOL)turboModuleEnabled; * - (BOOL)fabricEnabled; * - (NSDictionary *)prepareInitialProps @@ -57,10 +59,10 @@ @interface RCTAppDelegate : NSResponder #endif // macOS] /// The window object, used to render the UViewControllers -@property (nonatomic, strong) RCTPlatformWindow *window; // [macOS] -@property (nonatomic, strong) RCTBridge *bridge; -@property (nonatomic, strong) NSString *moduleName; -@property (nonatomic, strong) NSDictionary *initialProps; +@property (nonatomic, strong, nonnull) RCTPlatformWindow *window; // [macOS] +@property (nonatomic, strong, nullable) RCTBridge *bridge; +@property (nonatomic, strong, nullable) NSString *moduleName; +@property (nonatomic, strong, nullable) NSDictionary *initialProps; /** * It creates a `RCTBridge` using a delegate and some launch options. @@ -87,8 +89,28 @@ * @returns: a UIView properly configured with a bridge for React Native. */ - (RCTPlatformView *)createRootViewWithBridge:(RCTBridge *)bridge // [macOS] - moduleName:(NSString *)moduleName - initProps:(NSDictionary *)initProps; + moduleName:(NSString *)moduleName + initProps:(NSDictionary *)initProps; +/** + * This method can be used to customize the rootView that is passed to React Native. + * A typical example is to override this method in the AppDelegate to change the background color. + * To achieve this, add in your `AppDelegate.mm`: + * ``` + * - (void)customizeRootView:(RCTRootView *)rootView + * { + * rootView.backgroundColor = [UIColor colorWithDynamicProvider:^UIColor *(UITraitCollection *traitCollection) { + * if ([traitCollection userInterfaceStyle] == UIUserInterfaceStyleDark) { + * return [UIColor blackColor]; + * } else { + * return [UIColor whiteColor]; + * } + * }]; + * } + * ``` + * + * @parameter: rootView - The root view to customize. + */ +- (void)customizeRootView:(RCTRootView *)rootView; /** * It creates the RootViewController. @@ -104,8 +126,6 @@ * By default, it assigns the rootView to the view property of the rootViewController * If you are not using a simple UIViewController, then there could be other methods to use to setup the rootView. * For example: UISplitViewController requires `setViewController(_:for:)` - * - * @return: void */ - (void)setRootView:(RCTPlatformView *)rootView toRootViewController:(UIViewController *)rootViewController; // [macOS] @@ -114,7 +134,6 @@ /// @return: `YES` to use RuntimeScheduler, `NO` to use JavaScript scheduler. The default value is `YES`. - (BOOL)runtimeSchedulerEnabled; -#if RCT_NEW_ARCH_ENABLED @property (nonatomic, strong) RCTSurfacePresenterBridgeAdapter *bridgeAdapter; /// This method returns a map of Component Descriptors and Components classes that needs to be registered in the @@ -142,8 +161,8 @@ - (BOOL)bridgelessEnabled; /// Return the bundle URL for the main bundle. -- (NSURL *)getBundleURL; - -#endif +- (NSURL *__nullable)bundleURL; @end + +NS_ASSUME_NONNULL_END diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm index 4bfb4344475fa1..ee3368f397f6e7 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm @@ -7,13 +7,13 @@ #import "RCTAppDelegate.h" #import +#import #import #import +#import #import #import "RCTAppSetupUtils.h" -#import "RCTLegacyInteropComponents.h" -#if RCT_NEW_ARCH_ENABLED #if RN_DISABLE_OSS_PLUGIN_HEADER #import #else @@ -23,7 +23,6 @@ #import #import #import -#import #import #import #import @@ -38,9 +37,7 @@ #import #import #import -#import - -static NSString *const kRNConcurrentRoot = @"concurrentRoot"; +#import @interface RCTAppDelegate () < RCTTurboModuleManagerDelegate, @@ -51,7 +48,11 @@ @interface RCTAppDelegate () < } @end -#endif +static NSDictionary *updateInitialProps(NSDictionary *initialProps, BOOL isFabricEnabled) +{ + NSMutableDictionary *mutableProps = [initialProps mutableCopy] ?: [NSMutableDictionary new]; + return mutableProps; +} @interface RCTAppDelegate () { std::shared_ptr _runtimeScheduler; @@ -59,12 +60,9 @@ @interface RCTAppDelegate () { @end @implementation RCTAppDelegate { -#if RCT_NEW_ARCH_ENABLED RCTHost *_reactHost; -#endif } -#if RCT_NEW_ARCH_ENABLED - (instancetype)init { if (self = [super init]) { @@ -74,7 +72,6 @@ - (instancetype)init } return self; } -#endif #if !TARGET_OS_OSX // [macOS] - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions @@ -85,53 +82,53 @@ - (void)applicationDidFinishLaunching:(NSNotification *)notification NSApplication *application = [notification object]; NSDictionary *launchOptions = [notification userInfo]; #endif // macOS] - BOOL enableTM = NO; - BOOL enableBridgeless = NO; -#if RCT_NEW_ARCH_ENABLED - enableTM = self.turboModuleEnabled; - enableBridgeless = self.bridgelessEnabled; -#endif + RCTSetNewArchEnabled([self newArchEnabled]); + BOOL enableTM = self.turboModuleEnabled; + BOOL fabricEnabled = self.fabricEnabled; + BOOL enableBridgeless = self.bridgelessEnabled; + + NSDictionary *initProps = updateInitialProps([self prepareInitialProps], fabricEnabled); RCTAppSetupPrepareApp(application, enableTM); - RCTPlatformView *rootView; // [macOS] + RCTUIView *rootView; // [macOS] if (enableBridgeless) { -#if RCT_NEW_ARCH_ENABLED // Enable native view config interop only if both bridgeless mode and Fabric is enabled. - RCTSetUseNativeViewConfigsInBridgelessMode([self fabricEnabled]); + RCTSetUseNativeViewConfigsInBridgelessMode(fabricEnabled); // Enable TurboModule interop by default in Bridgeless mode RCTEnableTurboModuleInterop(YES); RCTEnableTurboModuleInteropBridgeProxy(YES); [self createReactHost]; - [self unstable_registerLegacyComponents]; [RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self; - RCTFabricSurface *surface = [_reactHost createSurfaceWithModuleName:self.moduleName - initialProperties:launchOptions]; + RCTFabricSurface *surface = [_reactHost createSurfaceWithModuleName:self.moduleName initialProperties:initProps]; RCTSurfaceHostingProxyRootView *surfaceHostingProxyRootView = [[RCTSurfaceHostingProxyRootView alloc] initWithSurface:surface sizeMeasureMode:RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightExact]; rootView = (RCTRootView *)surfaceHostingProxyRootView; -#endif +#if !TARGET_OS_OSX // [macOS] + rootView.backgroundColor = [UIColor systemBackgroundColor]; +#else // [macOS + rootView.layer.backgroundColor = [[NSColor windowBackgroundColor] CGColor]; +#endif // macOS] } else { if (!self.bridge) { self.bridge = [self createBridgeWithDelegate:self launchOptions:launchOptions]; } -#if RCT_NEW_ARCH_ENABLED - self.bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:self.bridge - contextContainer:_contextContainer]; - self.bridge.surfacePresenter = self.bridgeAdapter.surfacePresenter; + if ([self newArchEnabled]) { + self.bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:self.bridge + contextContainer:_contextContainer]; + self.bridge.surfacePresenter = self.bridgeAdapter.surfacePresenter; - [self unstable_registerLegacyComponents]; - [RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self; -#endif - NSDictionary *initProps = [self prepareInitialProps]; + [RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self; + } rootView = [self createRootViewWithBridge:self.bridge moduleName:self.moduleName initProps:initProps]; } + [self customizeRootView:(RCTRootView *)rootView]; #if !TARGET_OS_OSX // [macOS] #if !TARGET_OS_VISION // [visionOS] self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; @@ -162,6 +159,11 @@ - (void)applicationDidFinishLaunching:(NSNotification *)notification #endif // macOS] } +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + // Noop +} + - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { [NSException raise:@"RCTBridgeDelegate::sourceURLForBridge not implemented" @@ -171,15 +173,7 @@ - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge - (NSDictionary *)prepareInitialProps { - NSMutableDictionary *initProps = self.initialProps ? [self.initialProps mutableCopy] : [NSMutableDictionary new]; - -#ifdef RCT_NEW_ARCH_ENABLED - // Hardcoding the Concurrent Root as it it not recommended to - // have the concurrentRoot turned off when Fabric is enabled. - initProps[kRNConcurrentRoot] = @([self fabricEnabled]); -#endif - - return initProps; + return self.initialProps; } - (RCTBridge *)createBridgeWithDelegate:(id)delegate launchOptions:(NSDictionary *)launchOptions @@ -187,14 +181,17 @@ - (RCTBridge *)createBridgeWithDelegate:(id)delegate launchOp return [[RCTBridge alloc] initWithDelegate:delegate launchOptions:launchOptions]; } +- (void)customizeRootView:(RCTRootView *)rootView +{ + // Override point for customization after application launch. +} + - (RCTPlatformView *)createRootViewWithBridge:(RCTBridge *)bridge // [macOS] moduleName:(NSString *)moduleName initProps:(NSDictionary *)initProps { - BOOL enableFabric = NO; -#if RCT_NEW_ARCH_ENABLED - enableFabric = self.fabricEnabled; -#endif + [self _logWarnIfCreateRootViewWithBridgeIsOverridden]; + BOOL enableFabric = self.fabricEnabled; RCTPlatformView *rootView = RCTAppSetupDefaultRootView(bridge, moduleName, initProps, enableFabric); // [macOS] #if !TARGET_OS_OSX // [macOS] @@ -206,6 +203,21 @@ - (RCTPlatformView *)createRootViewWithBridge:(RCTBridge *)bridge // [macOS] return rootView; } +// TODO T173939093 - Remove _logWarnIfCreateRootViewWithBridgeIsOverridden after 0.74 is cut +- (void)_logWarnIfCreateRootViewWithBridgeIsOverridden +{ + SEL selector = @selector(createRootViewWithBridge:moduleName:initProps:); + IMP baseClassImp = method_getImplementation(class_getInstanceMethod([RCTAppDelegate class], selector)); + IMP currentClassImp = method_getImplementation(class_getInstanceMethod([self class], selector)); + if (currentClassImp != baseClassImp) { + NSString *warnMessage = + @"If you are using the `createRootViewWithBridge` to customize the root view appearence," + "for example to set the backgroundColor, please migrate to `customiseView` method.\n" + "The `createRootViewWithBridge` method is not invoked in bridgeless."; + RCTLogWarn(@"%@", warnMessage); + } +} + #if !TARGET_OS_OSX // [macOS] - (UIViewController *)createRootViewController { @@ -229,6 +241,7 @@ - (BOOL)runtimeSchedulerEnabled } #pragma mark - UISceneDelegate + #if !TARGET_OS_OSX // [macOS] - (void)windowScene:(UIWindowScene *)windowScene didUpdateCoordinateSpace:(id)previousCoordinateSpace @@ -240,52 +253,48 @@ - (void)windowScene:(UIWindowScene *)windowScene #endif // [macOS] #pragma mark - RCTCxxBridgeDelegate + - (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge { _runtimeScheduler = std::make_shared(RCTRuntimeExecutorFromBridge(bridge)); -#if RCT_NEW_ARCH_ENABLED - std::shared_ptr callInvoker = - std::make_shared(_runtimeScheduler); - RCTTurboModuleManager *turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge - delegate:self - jsInvoker:callInvoker]; - _contextContainer->erase("RuntimeScheduler"); - _contextContainer->insert("RuntimeScheduler", _runtimeScheduler); - return RCTAppSetupDefaultJsExecutorFactory(bridge, turboModuleManager, _runtimeScheduler); -#else - return RCTAppSetupJsExecutorFactoryForOldArch(bridge, _runtimeScheduler); -#endif + if ([self newArchEnabled]) { + std::shared_ptr callInvoker = + std::make_shared(_runtimeScheduler); + RCTTurboModuleManager *turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge + delegate:self + jsInvoker:callInvoker]; + _contextContainer->erase("RuntimeScheduler"); + _contextContainer->insert("RuntimeScheduler", _runtimeScheduler); + return RCTAppSetupDefaultJsExecutorFactory(bridge, turboModuleManager, _runtimeScheduler); + } else { + return RCTAppSetupJsExecutorFactoryForOldArch(bridge, _runtimeScheduler); + } } -#if RCT_NEW_ARCH_ENABLED - -#pragma mark - RCTTurboModuleManagerDelegate +#pragma mark - New Arch Enabled settings -- (Class)getModuleClassFromName:(const char *)name +- (BOOL)newArchEnabled { -#if RN_DISABLE_OSS_PLUGIN_HEADER - return RCTTurboModulePluginClassProvider(name); +#if RCT_NEW_ARCH_ENABLED + return YES; #else - return RCTCoreModulesClassProvider(name); + return NO; #endif } -- (std::shared_ptr)getTurboModule:(const std::string &)name - jsInvoker:(std::shared_ptr)jsInvoker +- (BOOL)turboModuleEnabled { - return nullptr; + return [self newArchEnabled]; } -- (std::shared_ptr)getTurboModule:(const std::string &)name - initParams: - (const facebook::react::ObjCTurboModule::InitParams &)params +- (BOOL)fabricEnabled { - return nullptr; + return [self newArchEnabled]; } -- (id)getModuleInstanceFromClass:(Class)moduleClass +- (BOOL)bridgelessEnabled { - return RCTAppSetupDefaultModuleFromClass(moduleClass); + return [self newArchEnabled]; } #pragma mark - RCTComponentViewFactoryComponentProvider @@ -295,49 +304,54 @@ - (Class)getModuleClassFromName:(const char *)name return @{}; } -#pragma mark - New Arch Enabled settings +#pragma mark - RCTTurboModuleManagerDelegate -- (BOOL)turboModuleEnabled +- (Class)getModuleClassFromName:(const char *)name { - return YES; +#if RN_DISABLE_OSS_PLUGIN_HEADER + return RCTTurboModulePluginClassProvider(name); +#else + return RCTCoreModulesClassProvider(name); +#endif } -- (BOOL)fabricEnabled +- (std::shared_ptr)getTurboModule:(const std::string &)name + jsInvoker:(std::shared_ptr)jsInvoker { - return YES; + return nullptr; } -- (BOOL)bridgelessEnabled +- (std::shared_ptr)getTurboModule:(const std::string &)name + initParams: + (const facebook::react::ObjCTurboModule::InitParams &)params { - return NO; + return nullptr; } -#pragma mark - New Arch Utilities - -- (void)unstable_registerLegacyComponents +- (id)getModuleInstanceFromClass:(Class)moduleClass { - for (NSString *legacyComponent in [RCTLegacyInteropComponents legacyInteropComponents]) { - [RCTLegacyViewManagerInteropComponentView supportLegacyViewManagerWithName:legacyComponent]; - } + return RCTAppSetupDefaultModuleFromClass(moduleClass); } +#pragma mark - New Arch Utilities + - (void)createReactHost { __weak __typeof(self) weakSelf = self; - _reactHost = [[RCTHost alloc] initWithBundleURL:[self getBundleURL] + _reactHost = [[RCTHost alloc] initWithBundleURL:[self bundleURL] hostDelegate:nil turboModuleManagerDelegate:self - jsEngineProvider:^std::shared_ptr() { - return [weakSelf createJSEngineInstance]; + jsEngineProvider:^std::shared_ptr() { + return [weakSelf createJSRuntimeFactory]; }]; [_reactHost setBundleURLProvider:^NSURL *() { - return [weakSelf getBundleURL]; + return [weakSelf bundleURL]; }]; [_reactHost setContextContainerHandler:self]; [_reactHost start]; } -- (std::shared_ptr)createJSEngineInstance +- (std::shared_ptr)createJSRuntimeFactory { #if USE_HERMES return std::make_shared(_reactNativeConfig, nullptr); @@ -351,13 +365,11 @@ - (void)didCreateContextContainer:(std::shared_ptrinsert("ReactNativeConfig", _reactNativeConfig); } -- (NSURL *)getBundleURL +- (NSURL *)bundleURL { - [NSException raise:@"RCTAppDelegate::getBundleURL not implemented" + [NSException raise:@"RCTAppDelegate::bundleURL not implemented" format:@"Subclasses must implement a valid getBundleURL method"]; return nullptr; } -#endif - @end diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h index 0037caa0151a13..3b6d0cae1e8df9 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h +++ b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h @@ -13,41 +13,33 @@ #import -#ifndef RCT_USE_HERMES +#if USE_HERMES #if __has_include() #import -#define RCT_USE_HERMES 1 #elif __has_include() #import -#define RCT_USE_HERMES 1 -#else -#import -#define RCT_USE_HERMES 0 -#endif #endif +#else // USE_HERMES +#import +#endif // USE_HERMES -#if RCT_NEW_ARCH_ENABLED #import -#endif // Forward declaration to decrease compilation coupling namespace facebook::react { class RuntimeScheduler; } -#if RCT_NEW_ARCH_ENABLED - RCT_EXTERN id RCTAppSetupDefaultModuleFromClass(Class moduleClass); std::unique_ptr RCTAppSetupDefaultJsExecutorFactory( RCTBridge *bridge, RCTTurboModuleManager *turboModuleManager, const std::shared_ptr &runtimeScheduler); -#else + std::unique_ptr RCTAppSetupJsExecutorFactoryForOldArch( RCTBridge *bridge, const std::shared_ptr &runtimeScheduler); -#endif #endif // __cplusplus diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm index ad0fb3b9a56783..fcc5b08af0b160 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm @@ -11,7 +11,6 @@ #import #import -#if RCT_NEW_ARCH_ENABLED // Turbo Module #import #import @@ -24,38 +23,24 @@ // Fabric #import #import -#endif -#ifdef FB_SONARKIT_ENABLED -#import -#import -#import -#import -#import -#import +// jsinspector-modern +#import -static void InitializeFlipper(UIApplication *application) -{ - FlipperClient *client = [FlipperClient sharedClient]; - SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults]; - [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application - withDescriptorMapper:layoutDescriptorMapper]]; - [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]]; - [client addPlugin:[FlipperKitReactPlugin new]]; - [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]]; - [client start]; -} +#if __has_include() +#define USE_OSS_CODEGEN 1 +#import +#elif __has_include() +#define USE_OSS_CODEGEN 1 +#import +#else +// Meta internal system do not generate the RCTModulesConformingToProtocolsProvider.h file +#define USE_OSS_CODEGEN 0 #endif void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled) { -#ifdef FB_SONARKIT_ENABLED - InitializeFlipper(application); -#endif - -#if RCT_NEW_ARCH_ENABLED RCTEnableTurboModule(turboModuleEnabled); -#endif #if DEBUG #if !TARGET_OS_OSX // [macOS] @@ -69,37 +54,70 @@ void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled) RCTUIView * // [macOS] RCTAppSetupDefaultRootView(RCTBridge *bridge, NSString *moduleName, NSDictionary *initialProperties, BOOL fabricEnabled) { -#if RCT_NEW_ARCH_ENABLED if (fabricEnabled) { id surface = [[RCTFabricSurface alloc] initWithBridge:bridge moduleName:moduleName initialProperties:initialProperties]; return [[RCTSurfaceHostingProxyRootView alloc] initWithSurface:surface]; } -#endif return [[RCTRootView alloc] initWithBridge:bridge moduleName:moduleName initialProperties:initialProperties]; } -#if RCT_NEW_ARCH_ENABLED id RCTAppSetupDefaultModuleFromClass(Class moduleClass) { + // private block used to filter out modules depending on protocol conformance + NSArray * (^extractModuleConformingToProtocol)(RCTModuleRegistry *, Protocol *) = + ^NSArray *(RCTModuleRegistry *moduleRegistry, Protocol *protocol) + { + NSArray *classNames = @[]; + +#if USE_OSS_CODEGEN + if (protocol == @protocol(RCTImageURLLoader)) { + classNames = [RCTModulesConformingToProtocolsProvider imageURLLoaderClassNames]; + } else if (protocol == @protocol(RCTImageDataDecoder)) { + classNames = [RCTModulesConformingToProtocolsProvider imageDataDecoderClassNames]; + } else if (protocol == @protocol(RCTURLRequestHandler)) { + classNames = [RCTModulesConformingToProtocolsProvider URLRequestHandlerClassNames]; + } +#endif + + NSMutableArray *modules = [NSMutableArray new]; + + for (NSString *className in classNames) { + const char *cModuleName = [className cStringUsingEncoding:NSUTF8StringEncoding]; + id moduleFromLibrary = [moduleRegistry moduleForName:cModuleName]; + if (![moduleFromLibrary conformsToProtocol:protocol]) { + continue; + } + [modules addObject:moduleFromLibrary]; + } + return modules; + }; + // Set up the default RCTImageLoader and RCTNetworking modules. if (moduleClass == RCTImageLoader.class) { return [[moduleClass alloc] initWithRedirectDelegate:nil loadersProvider:^NSArray> *(RCTModuleRegistry *moduleRegistry) { - return @[ [RCTBundleAssetImageLoader new] ]; + NSArray *imageURLLoaderModules = + extractModuleConformingToProtocol(moduleRegistry, @protocol(RCTImageURLLoader)); + + return [@[ [RCTBundleAssetImageLoader new] ] arrayByAddingObjectsFromArray:imageURLLoaderModules]; } decodersProvider:^NSArray> *(RCTModuleRegistry *moduleRegistry) { - return @[ [RCTGIFImageDecoder new] ]; + NSArray *imageDataDecoder = extractModuleConformingToProtocol(moduleRegistry, @protocol(RCTImageDataDecoder)); + return [@[ [RCTGIFImageDecoder new] ] arrayByAddingObjectsFromArray:imageDataDecoder]; }]; } else if (moduleClass == RCTNetworking.class) { return [[moduleClass alloc] initWithHandlersProvider:^NSArray> *(RCTModuleRegistry *moduleRegistry) { - return @[ + NSArray *URLRequestHandlerModules = + extractModuleConformingToProtocol(moduleRegistry, @protocol(RCTURLRequestHandler)); + return [@[ [RCTHTTPRequestHandler new], [RCTDataRequestHandler new], [RCTFileRequestHandler new], - ]; + [moduleRegistry moduleForName:"BlobModule"], + ] arrayByAddingObjectsFromArray:URLRequestHandlerModules]; }]; } // No custom initializer here. @@ -124,11 +142,11 @@ void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled) [turboModuleManager moduleForName:"RCTDevMenu"]; #endif // end RCT_DEV -#if RCT_USE_HERMES +#if USE_HERMES return std::make_unique( #else return std::make_unique( -#endif // end RCT_USE_HERMES +#endif // USE_HERMES facebook::react::RCTJSIExecutorRuntimeInstaller( [turboModuleManager, bridge, runtimeScheduler](facebook::jsi::Runtime &runtime) { if (!bridge || !turboModuleManager) { @@ -141,17 +159,15 @@ void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled) })); } -#else // else !RCT_NEW_ARCH_ENABLED - std::unique_ptr RCTAppSetupJsExecutorFactoryForOldArch( RCTBridge *bridge, const std::shared_ptr &runtimeScheduler) { -#if RCT_USE_HERMES +#if USE_HERMES return std::make_unique( #else return std::make_unique( -#endif // end RCT_USE_HERMES +#endif // USE_HERMES facebook::react::RCTJSIExecutorRuntimeInstaller([bridge, runtimeScheduler](facebook::jsi::Runtime &runtime) { if (!bridge) { return; @@ -161,4 +177,3 @@ void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled) } })); } -#endif // end RCT_NEW_ARCH_ENABLED diff --git a/packages/react-native/Libraries/AppDelegate/RCTLegacyInteropComponents.mm b/packages/react-native/Libraries/AppDelegate/RCTLegacyInteropComponents.mm deleted file mode 100644 index f15a903bca474c..00000000000000 --- a/packages/react-native/Libraries/AppDelegate/RCTLegacyInteropComponents.mm +++ /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. - */ - -#import "RCTLegacyInteropComponents.h" - -@implementation RCTLegacyInteropComponents - -+ (NSArray *)legacyInteropComponents -{ - return @[ - @"RNTMyLegacyNativeView", - @"RNTMyNativeView" - ]; -} - -@end diff --git a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec index 1956cbbbf09dba..146ff1ea5ccf83 100644 --- a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec +++ b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec @@ -16,18 +16,17 @@ else source[:tag] = "v#{version}" end -folly_flags = ' -DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_CFG_NO_COROUTINES=1 -DFOLLY_HAVE_CLOCK_GETTIME=1' -folly_compiler_flags = folly_flags + ' ' + '-Wno-comma -Wno-shorten-64-to-32' +folly_config = get_folly_config() +folly_compiler_flags = folly_config[:compiler_flags] +folly_version = folly_config[:version] is_new_arch_enabled = ENV["RCT_NEW_ARCH_ENABLED"] == "1" use_hermes = ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == '1' -use_frameworks = ENV['USE_FRAMEWORKS'] != nil new_arch_enabled_flag = (is_new_arch_enabled ? " -DRCT_NEW_ARCH_ENABLED" : "") -is_fabric_enabled = is_new_arch_enabled || ENV["RCT_FABRIC_ENABLED"] -fabric_flag = (is_fabric_enabled ? " -DRN_FABRIC_ENABLED" : "") +is_fabric_enabled = true #is_new_arch_enabled || ENV["RCT_FABRIC_ENABLED"] hermes_flag = (use_hermes ? " -DUSE_HERMES" : "") -other_cflags = "$(inherited)" + folly_flags + new_arch_enabled_flag + fabric_flag + hermes_flag +other_cflags = "$(inherited)" + folly_compiler_flags + new_arch_enabled_flag + hermes_flag header_search_paths = [ "$(PODS_TARGET_SRCROOT)/../../ReactCommon", @@ -43,21 +42,7 @@ header_search_paths = [ ].concat(use_hermes ? [ "$(PODS_ROOT)/Headers/Public/React-hermes", "$(PODS_ROOT)/Headers/Public/hermes-engine" -] : []).concat(use_frameworks ? [ - "$(PODS_CONFIGURATION_BUILD_DIR)/React-Fabric/React_Fabric.framework/Headers/", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/view/platform/cxx/", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-graphics/React_graphics.framework/Headers/", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", - "$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-RuntimeApple/React_RuntimeApple.framework/Headers", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-RuntimeCore/React_RuntimeCore.framework/Headers", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-RCTFabric/RCTFabric.framework/Headers/", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-utils/React_utils.framework/Headers/", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers/", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-runtimescheduler/React_runtimescheduler.framework/Headers/", - "$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers/", -] : []).map{|p| "\"#{p}\""}.join(" ") +] : []) Pod::Spec.new do |s| s.name = "React-RCTAppDelegate" @@ -84,49 +69,31 @@ Pod::Spec.new do |s| use_hermes = ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" s.dependency "React-Core" - s.dependency "RCT-Folly" + s.dependency "RCT-Folly", folly_version s.dependency "RCTRequired" s.dependency "RCTTypeSafety" - s.dependency "ReactCommon/turbomodule/core" s.dependency "React-RCTNetwork" s.dependency "React-RCTImage" - s.dependency "React-NativeModulesApple" s.dependency "React-CoreModules" s.dependency "React-nativeconfig" - s.dependency "React-runtimescheduler" - s.dependency "React-RCTFabric" + s.dependency "React-Codegen" - if is_new_arch_enabled - s.dependency "React-RuntimeCore" - s.dependency "React-RuntimeApple" - if use_hermes - s.dependency "React-RuntimeHermes" - end - end + add_dependency(s, "ReactCommon", :subspec => "turbomodule/core", :additional_framework_paths => ["react/nativemodule/core"]) + add_dependency(s, "React-NativeModulesApple") + add_dependency(s, "React-runtimescheduler") + add_dependency(s, "React-RCTFabric", :framework_name => "RCTFabric") + add_dependency(s, "React-RuntimeCore") + add_dependency(s, "React-RuntimeApple") + add_dependency(s, "React-Fabric", :additional_framework_paths => ["react/renderer/components/view/platform/cxx"]) + add_dependency(s, "React-graphics", :additional_framework_paths => ["react/renderer/graphics/platform/ios"]) + add_dependency(s, "React-utils") + add_dependency(s, "React-debug") + add_dependency(s, "React-rendererdebug") if use_hermes s.dependency "React-hermes" + s.dependency "React-RuntimeHermes" else s.dependency "React-jsc" end - - if is_new_arch_enabled - s.dependency "React-Fabric" - s.dependency "React-graphics" - s.dependency "React-utils" - s.dependency "React-debug" - s.dependency "React-rendererdebug" - - s.script_phases = { - :name => "Generate Legacy Components Interop", - :script => " -WITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\" -source $WITH_ENVIRONMENT -${NODE_BINARY} ${REACT_NATIVE_PATH}/scripts/codegen/generate-legacy-interop-components.js -p #{ENV['APP_PATH']} -o ${REACT_NATIVE_PATH}/Libraries/AppDelegate - ", - :execution_position => :before_compile, - :input_files => ["#{ENV['APP_PATH']}/react-native.config.js"], - :output_files => ["${REACT_NATIVE_PATH}/Libraries/AppDelegate/RCTLegacyInteropComponents.mm"], - } - end end diff --git a/packages/react-native/Libraries/AppState/NativeAppState.js b/packages/react-native/Libraries/AppState/NativeAppState.js index 41c2048864897d..fdcebcd2f87492 100644 --- a/packages/react-native/Libraries/AppState/NativeAppState.js +++ b/packages/react-native/Libraries/AppState/NativeAppState.js @@ -4,30 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ -import type {TurboModule} from '../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; - -export type AppStateConstants = {| - initialAppState: string, -|}; - -export type AppState = {|app_state: string|}; - -export interface Spec extends TurboModule { - +getConstants: () => AppStateConstants; - +getCurrentAppState: ( - success: (appState: AppState) => void, - error: (error: Object) => void, - ) => void; - - // Events - +addListener: (eventName: string) => void; - +removeListeners: (count: number) => void; -} - -export default (TurboModuleRegistry.getEnforcing('AppState'): Spec); +export * from '../../src/private/specs/modules/NativeAppState'; +import NativeAppState from '../../src/private/specs/modules/NativeAppState'; +export default NativeAppState; diff --git a/packages/react-native/Libraries/BatchedBridge/NativeModules.js b/packages/react-native/Libraries/BatchedBridge/NativeModules.js index 26961d7f830d0c..612915f6ea0325 100644 --- a/packages/react-native/Libraries/BatchedBridge/NativeModules.js +++ b/packages/react-native/Libraries/BatchedBridge/NativeModules.js @@ -177,7 +177,7 @@ function updateErrorWithErrorData( let NativeModules: {[moduleName: string]: $FlowFixMe, ...} = {}; if (global.nativeModuleProxy) { NativeModules = global.nativeModuleProxy; -} else if (!global.nativeExtensions) { +} else { const bridgeConfig = global.__fbBatchedBridgeConfig; invariant( bridgeConfig, diff --git a/packages/react-native/Libraries/Blob/Blob.js b/packages/react-native/Libraries/Blob/Blob.js index 98ae81ba84042a..886e257336411f 100644 --- a/packages/react-native/Libraries/Blob/Blob.js +++ b/packages/react-native/Libraries/Blob/Blob.js @@ -57,10 +57,7 @@ class Blob { * Currently we only support creating Blobs from other Blobs. * Reference: https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob */ - constructor( - parts: Array<$ArrayBufferView | ArrayBuffer | Blob | string> = [], - options?: BlobOptions, - ) { + constructor(parts: Array = [], options?: BlobOptions) { const BlobManager = require('./BlobManager'); this.data = BlobManager.createFromParts(parts, options).data; } diff --git a/packages/react-native/Libraries/Blob/BlobManager.js b/packages/react-native/Libraries/Blob/BlobManager.js index 73deaf6f9ff561..f4c5ed374995a4 100644 --- a/packages/react-native/Libraries/Blob/BlobManager.js +++ b/packages/react-native/Libraries/Blob/BlobManager.js @@ -11,7 +11,6 @@ import type {BlobCollector, BlobData, BlobOptions} from './BlobTypes'; import NativeBlobModule from './NativeBlobModule'; -import {fromByteArray} from 'base64-js'; import invariant from 'invariant'; const Blob = require('./Blob'); @@ -60,7 +59,7 @@ class BlobManager { * Create blob from existing array of blobs. */ static createFromParts( - parts: Array<$ArrayBufferView | ArrayBuffer | Blob | string>, + parts: Array, options?: BlobOptions, ): Blob { invariant(NativeBlobModule, 'NativeBlobModule is available.'); @@ -68,12 +67,11 @@ class BlobManager { const blobId = uuidv4(); const items = parts.map(part => { if (part instanceof ArrayBuffer || ArrayBuffer.isView(part)) { - return { - // $FlowFixMe[incompatible-cast] - data: fromByteArray(new Uint8Array((part: ArrayBuffer))), - type: 'string', - }; - } else if (part instanceof Blob) { + throw new Error( + "Creating blobs from 'ArrayBuffer' and 'ArrayBufferView' are not supported", + ); + } + if (part instanceof Blob) { return { data: part.data, type: 'blob', diff --git a/packages/react-native/Libraries/Blob/File.js b/packages/react-native/Libraries/Blob/File.js index c89744190ad965..6f643307c5d021 100644 --- a/packages/react-native/Libraries/Blob/File.js +++ b/packages/react-native/Libraries/Blob/File.js @@ -23,7 +23,7 @@ class File extends Blob { * Constructor for JS consumers. */ constructor( - parts: Array<$ArrayBufferView | ArrayBuffer | Blob | string>, + parts: Array, name: string, options?: BlobOptions, ) { diff --git a/packages/react-native/Libraries/Blob/NativeBlobModule.js b/packages/react-native/Libraries/Blob/NativeBlobModule.js index 00a86fae31bfb8..1971794371d04c 100644 --- a/packages/react-native/Libraries/Blob/NativeBlobModule.js +++ b/packages/react-native/Libraries/Blob/NativeBlobModule.js @@ -4,56 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ -import type {TurboModule} from '../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; - -export interface Spec extends TurboModule { - +getConstants: () => {|BLOB_URI_SCHEME: ?string, BLOB_URI_HOST: ?string|}; - +addNetworkingHandler: () => void; - +addWebSocketHandler: (id: number) => void; - +removeWebSocketHandler: (id: number) => void; - +sendOverSocket: (blob: Object, socketID: number) => void; - +createFromParts: (parts: Array, withId: string) => void; - +release: (blobId: string) => void; -} - -const NativeModule = TurboModuleRegistry.get('BlobModule'); - -let constants = null; -let NativeBlobModule = null; - -if (NativeModule != null) { - NativeBlobModule = { - getConstants(): {|BLOB_URI_SCHEME: ?string, BLOB_URI_HOST: ?string|} { - if (constants == null) { - constants = NativeModule.getConstants(); - } - return constants; - }, - addNetworkingHandler(): void { - NativeModule.addNetworkingHandler(); - }, - addWebSocketHandler(id: number): void { - NativeModule.addWebSocketHandler(id); - }, - removeWebSocketHandler(id: number): void { - NativeModule.removeWebSocketHandler(id); - }, - sendOverSocket(blob: Object, socketID: number): void { - NativeModule.sendOverSocket(blob, socketID); - }, - createFromParts(parts: Array, withId: string): void { - NativeModule.createFromParts(parts, withId); - }, - release(blobId: string): void { - NativeModule.release(blobId); - }, - }; -} - -export default (NativeBlobModule: ?Spec); +export * from '../../src/private/specs/modules/NativeBlobModule'; +import NativeBlobModule from '../../src/private/specs/modules/NativeBlobModule'; +export default NativeBlobModule; diff --git a/packages/react-native/Libraries/Blob/NativeFileReaderModule.js b/packages/react-native/Libraries/Blob/NativeFileReaderModule.js index e581aba74d176b..9d620af0a1ba9f 100644 --- a/packages/react-native/Libraries/Blob/NativeFileReaderModule.js +++ b/packages/react-native/Libraries/Blob/NativeFileReaderModule.js @@ -4,19 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ -import type {TurboModule} from '../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; - -export interface Spec extends TurboModule { - +readAsDataURL: (data: Object) => Promise; - +readAsText: (data: Object, encoding: string) => Promise; -} - -export default (TurboModuleRegistry.getEnforcing( - 'FileReaderModule', -): Spec); +export * from '../../src/private/specs/modules/NativeFileReaderModule'; +import NativeFileReaderModule from '../../src/private/specs/modules/NativeFileReaderModule'; +export default NativeFileReaderModule; diff --git a/packages/react-native/Libraries/Blob/RCTBlobCollector.mm b/packages/react-native/Libraries/Blob/RCTBlobCollector.mm index c9afc78057c955..9b2ca8cb3a0973 100644 --- a/packages/react-native/Libraries/Blob/RCTBlobCollector.mm +++ b/packages/react-native/Libraries/Blob/RCTBlobCollector.mm @@ -21,7 +21,7 @@ { RCTBlobManager *blobManager = blobManager_; NSString *blobId = [NSString stringWithUTF8String:blobId_.c_str()]; - dispatch_async([blobManager_ methodQueue], ^{ + dispatch_async([blobManager_ executionQueue], ^{ [blobManager remove:blobId]; }); } diff --git a/packages/react-native/Libraries/Blob/RCTBlobManager.h b/packages/react-native/Libraries/Blob/RCTBlobManager.h index 317b202911df48..bceb8eb5d81f68 100755 --- a/packages/react-native/Libraries/Blob/RCTBlobManager.h +++ b/packages/react-native/Libraries/Blob/RCTBlobManager.h @@ -10,6 +10,8 @@ #import #import +RCT_EXTERN void RCTEnableBlobManagerProcessingQueue(BOOL enabled); + @interface RCTBlobManager : NSObject - (NSString *)store:(NSData *)data; @@ -26,4 +28,6 @@ - (void)createFromParts:(NSArray *> *)parts withId:(NSString *)blobId; +- (dispatch_queue_t)executionQueue; + @end diff --git a/packages/react-native/Libraries/Blob/RCTBlobManager.mm b/packages/react-native/Libraries/Blob/RCTBlobManager.mm index 14496f7e491099..286710d69105cf 100755 --- a/packages/react-native/Libraries/Blob/RCTBlobManager.mm +++ b/packages/react-native/Libraries/Blob/RCTBlobManager.mm @@ -11,6 +11,7 @@ #import #import +#import #import #import #import @@ -18,6 +19,16 @@ #import "RCTBlobCollector.h" #import "RCTBlobPlugins.h" +RCT_MOCK_DEF(RCTBlobManager, dispatch_async); +#define dispatch_async RCT_MOCK_USE(RCTBlobManager, dispatch_async) + +static BOOL gBlobManagerProcessingQueueEnabled = NO; + +RCT_EXTERN void RCTEnableBlobManagerProcessingQueue(BOOL enabled) +{ + gBlobManagerProcessingQueueEnabled = enabled; +} + static NSString *const kBlobURIScheme = @"blob"; @interface RCTBlobManager () < @@ -35,6 +46,7 @@ @implementation RCTBlobManager { std::mutex _blobsMutex; NSOperationQueue *_queue; + dispatch_queue_t _processingQueue; } RCT_EXPORT_MODULE(BlobModule) @@ -48,6 +60,10 @@ - (void)initialize std::lock_guard lock(_blobsMutex); _blobs = [NSMutableDictionary new]; + if (gBlobManagerProcessingQueueEnabled) { + _processingQueue = dispatch_queue_create("com.facebook.react.blobmanager.processing", DISPATCH_QUEUE_SERIAL); + } + facebook::react::RCTBlobCollector::install(self); } @@ -143,11 +159,11 @@ - (void)remove:(NSString *)blobId // TODO(T63516227): Why can methodQueue be nil here? // We don't want to do anything when methodQueue is nil. - if (!networking.methodQueue) { + if (![networking requestQueue]) { return; } - dispatch_async(networking.methodQueue, ^{ + dispatch_async([networking requestQueue], ^{ [networking addRequestHandler:self]; [networking addResponseHandler:self]; }); @@ -194,12 +210,22 @@ - (void)remove:(NSString *)blobId [NSException raise:@"Invalid type for blob" format:@"%@ is invalid", type]; } } - [self store:data withId:blobId]; + + dispatch_async([self executionQueue], ^{ + [self store:data withId:blobId]; + }); } RCT_EXPORT_METHOD(release : (NSString *)blobId) { - [self remove:blobId]; + dispatch_async([self executionQueue], ^{ + [self remove:blobId]; + }); +} + +- (dispatch_queue_t)executionQueue +{ + return gBlobManagerProcessingQueueEnabled ? _processingQueue : _methodQueue; } #pragma mark - RCTURLRequestHandler methods diff --git a/packages/react-native/Libraries/Blob/RCTFileReaderModule.mm b/packages/react-native/Libraries/Blob/RCTFileReaderModule.mm index 685d86b48d80ae..caa554029f735e 100644 --- a/packages/react-native/Libraries/Blob/RCTFileReaderModule.mm +++ b/packages/react-native/Libraries/Blob/RCTFileReaderModule.mm @@ -31,7 +31,7 @@ @implementation RCTFileReaderModule : (RCTPromiseRejectBlock)reject) { RCTBlobManager *blobManager = [_moduleRegistry moduleForName:"BlobModule"]; - dispatch_async(blobManager.methodQueue, ^{ + dispatch_async([blobManager executionQueue], ^{ NSData *data = [blobManager resolve:blob]; if (data == nil) { @@ -62,7 +62,7 @@ @implementation RCTFileReaderModule : (RCTPromiseRejectBlock)reject) { RCTBlobManager *blobManager = [_moduleRegistry moduleForName:"BlobModule"]; - dispatch_async(blobManager.methodQueue, ^{ + dispatch_async([blobManager executionQueue], ^{ NSData *data = [blobManager resolve:blob]; if (data == nil) { diff --git a/packages/react-native/Libraries/Blob/React-RCTBlob.podspec b/packages/react-native/Libraries/Blob/React-RCTBlob.podspec index eccfe09e0f595e..8b48d45e7f4067 100644 --- a/packages/react-native/Libraries/Blob/React-RCTBlob.podspec +++ b/packages/react-native/Libraries/Blob/React-RCTBlob.podspec @@ -16,22 +16,18 @@ else source[:tag] = "v#{version}" end -folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_CFG_NO_COROUTINES=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -Wno-comma -Wno-shorten-64-to-32' -folly_version = '2023.08.07.00' +folly_config = get_folly_config() +folly_compiler_flags = folly_config[:compiler_flags] +folly_version = folly_config[:version] header_search_paths = [ "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/DoubleConversion\"", + "\"$(PODS_ROOT)/fmt/include\"", "\"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Codegen/React_Codegen.framework/Headers\"" ] -if ENV["USE_FRAMEWORKS"] - header_search_paths = header_search_paths.concat([ - "\"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\"", - "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"" - ]) -end - Pod::Spec.new do |s| s.name = "React-RCTBlob" s.version = version @@ -51,13 +47,18 @@ Pod::Spec.new do |s| "HEADER_SEARCH_PATHS" => header_search_paths.join(' ') } + s.dependency "DoubleConversion" + s.dependency "fmt", "9.1.0" s.dependency "RCT-Folly", folly_version - s.dependency "React-Codegen", version - s.dependency "ReactCommon/turbomodule/core", version - s.dependency "React-jsi", version - s.dependency "React-Core/RCTBlobHeaders", version - s.dependency "React-Core/RCTWebSocket", version - s.dependency "React-RCTNetwork", version + s.dependency "React-jsi" + s.dependency "React-Core/RCTBlobHeaders" + s.dependency "React-Core/RCTWebSocket" + s.dependency "React-RCTNetwork" + + add_dependency(s, "React-Codegen") + add_dependency(s, "React-NativeModulesApple") + add_dependency(s, "React-jsinspector", :framework_name => 'jsinspector_modern') + add_dependency(s, "ReactCommon", :subspec => "turbomodule/core", :additional_framework_paths => ["react/nativemodule/core"]) if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" s.dependency "hermes-engine" diff --git a/packages/react-native/Libraries/Blob/__tests__/Blob-test.js b/packages/react-native/Libraries/Blob/__tests__/Blob-test.js index f33667c9ed6470..303fe1d9fb66bc 100644 --- a/packages/react-native/Libraries/Blob/__tests__/Blob-test.js +++ b/packages/react-native/Libraries/Blob/__tests__/Blob-test.js @@ -15,7 +15,6 @@ jest.setMock('../../BatchedBridge/NativeModules', { }); const Blob = require('../Blob'); -const {fromByteArray} = require('base64-js'); describe('Blob', function () { it('should create empty blob', () => { @@ -27,7 +26,7 @@ describe('Blob', function () { expect(blob.type).toBe(''); }); - it('should create blob from ArrayBuffer, other blobs, strings', () => { + it('should create blob from other blobs and strings', () => { const blobA = new Blob(); const blobB = new Blob(); const textA = 'i \u2665 dogs'; @@ -44,20 +43,14 @@ describe('Blob', function () { blobA.data.size = 34540; blobB.data.size = 65452; - const buffer = new ArrayBuffer(4); - - const blob = new Blob([blobA, blobB, textA, textB, textC, buffer]); + const blob = new Blob([blobA, blobB, textA, textB, textC]); expect(blob.size).toBe( blobA.size + blobB.size + global.Buffer.byteLength(textA, 'UTF-8') + global.Buffer.byteLength(textB, 'UTF-8') + - global.Buffer.byteLength(textC, 'UTF-8') + - global.Buffer.byteLength( - fromByteArray(new Uint8Array(buffer)), - 'UTF-8', - ), + global.Buffer.byteLength(textC, 'UTF-8'), ); expect(blob.type).toBe(''); }); diff --git a/packages/react-native/Libraries/Blob/__tests__/BlobRegistry-test.js b/packages/react-native/Libraries/Blob/__tests__/BlobRegistry-test.js index 0e88734532e4ed..0f80035d379946 100644 --- a/packages/react-native/Libraries/Blob/__tests__/BlobRegistry-test.js +++ b/packages/react-native/Libraries/Blob/__tests__/BlobRegistry-test.js @@ -1,3 +1,13 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @oncall react_native + */ + 'use strict'; const BlobRegistry = require('../BlobRegistry'); diff --git a/packages/react-native/Libraries/BugReporting/NativeBugReporting.js b/packages/react-native/Libraries/BugReporting/NativeBugReporting.js index f886208de3d3f3..ca0edbf81af079 100644 --- a/packages/react-native/Libraries/BugReporting/NativeBugReporting.js +++ b/packages/react-native/Libraries/BugReporting/NativeBugReporting.js @@ -4,18 +4,10 @@ * 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 - * @flow */ -import type {TurboModule} from '../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; - -export interface Spec extends TurboModule { - +startReportAProblemFlow: () => void; - +setExtraData: (extraData: Object, extraFiles: Object) => void; - +setCategoryID: (categoryID: string) => void; -} - -export default (TurboModuleRegistry.get('BugReporting'): ?Spec); +export * from '../../src/private/specs/modules/NativeBugReporting'; +import NativeBugReporting from '../../src/private/specs/modules/NativeBugReporting'; +export default NativeBugReporting; diff --git a/packages/react-native/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js b/packages/react-native/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js index e4661589749a04..5e310f43042392 100644 --- a/packages/react-native/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js +++ b/packages/react-native/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js @@ -8,26 +8,6 @@ * @format */ -import type {TurboModule} from '../../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../../TurboModule/TurboModuleRegistry'; - -export interface Spec extends TurboModule { - +isReduceMotionEnabled: ( - onSuccess: (isReduceMotionEnabled: boolean) => void, - ) => void; - +isTouchExplorationEnabled: ( - onSuccess: (isScreenReaderEnabled: boolean) => void, - ) => void; - +isAccessibilityServiceEnabled?: ?( - onSuccess: (isAccessibilityServiceEnabled: boolean) => void, - ) => void; - +setAccessibilityFocus: (reactTag: number) => void; - +announceForAccessibility: (announcement: string) => void; - +getRecommendedTimeoutMillis?: ( - mSec: number, - onSuccess: (recommendedTimeoutMillis: number) => void, - ) => void; -} - -export default (TurboModuleRegistry.get('AccessibilityInfo'): ?Spec); +export * from '../../../src/private/specs/modules/NativeAccessibilityInfo'; +import NativeAccessibilityInfo from '../../../src/private/specs/modules/NativeAccessibilityInfo'; +export default NativeAccessibilityInfo; diff --git a/packages/react-native/Libraries/Components/AccessibilityInfo/NativeAccessibilityManager.js b/packages/react-native/Libraries/Components/AccessibilityInfo/NativeAccessibilityManager.js index 35e54a2340021c..7cbe73f6186b6d 100644 --- a/packages/react-native/Libraries/Components/AccessibilityInfo/NativeAccessibilityManager.js +++ b/packages/react-native/Libraries/Components/AccessibilityInfo/NativeAccessibilityManager.js @@ -4,69 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow + * @flow strict-local * @format */ -import type {TurboModule} from '../../TurboModule/RCTExport'; - -import * as TurboModuleRegistry from '../../TurboModule/TurboModuleRegistry'; - -export interface Spec extends TurboModule { - +getCurrentBoldTextState: ( - onSuccess: (isBoldTextEnabled: boolean) => void, - onError: (error: Object) => void, - ) => void; - +getCurrentGrayscaleState: ( - onSuccess: (isGrayscaleEnabled: boolean) => void, - onError: (error: Object) => void, - ) => void; - // [macOS - +getCurrentHighContrastState: ( - onSuccess: (isHighContrastEnabled: boolean) => void, - onError: (error: Object) => void, - ) => void; - // macOS] - +getCurrentInvertColorsState: ( - onSuccess: (isInvertColorsEnabled: boolean) => void, - onError: (error: Object) => void, - ) => void; - +getCurrentReduceMotionState: ( - onSuccess: (isReduceMotionEnabled: boolean) => void, - onError: (error: Object) => void, - ) => void; - +getCurrentPrefersCrossFadeTransitionsState?: ( - onSuccess: (prefersCrossFadeTransitions: boolean) => void, - onError: (error: Object) => void, - ) => void; - +getCurrentReduceTransparencyState: ( - onSuccess: (isReduceTransparencyEnabled: boolean) => void, - onError: (error: Object) => void, - ) => void; - +getCurrentVoiceOverState: ( - onSuccess: (isScreenReaderEnabled: boolean) => void, - onError: (error: Object) => void, - ) => void; - +setAccessibilityContentSizeMultipliers: (JSMultipliers: {| - +extraSmall?: ?number, - +small?: ?number, - +medium?: ?number, - +large?: ?number, - +extraLarge?: ?number, - +extraExtraLarge?: ?number, - +extraExtraExtraLarge?: ?number, - +accessibilityMedium?: ?number, - +accessibilityLarge?: ?number, - +accessibilityExtraLarge?: ?number, - +accessibilityExtraExtraLarge?: ?number, - +accessibilityExtraExtraExtraLarge?: ?number, - |}) => void; - +setAccessibilityFocus: (reactTag: number) => void; - +announceForAccessibility: (announcement: string) => void; - +announceForAccessibilityWithOptions?: ( - announcement: string, - options: {queue?: boolean}, - ) => void; -} - -export default (TurboModuleRegistry.get('AccessibilityManager'): ?Spec); +export * from '../../../src/private/specs/modules/NativeAccessibilityManager'; +import NativeAccessibilityManager from '../../../src/private/specs/modules/NativeAccessibilityManager'; +export default NativeAccessibilityManager; diff --git a/packages/react-native/Libraries/Components/AccessibilityInfo/legacySendAccessibilityEvent.android.js b/packages/react-native/Libraries/Components/AccessibilityInfo/legacySendAccessibilityEvent.android.js index 09556be26a4644..fdbabb475c7f93 100644 --- a/packages/react-native/Libraries/Components/AccessibilityInfo/legacySendAccessibilityEvent.android.js +++ b/packages/react-native/Libraries/Components/AccessibilityInfo/legacySendAccessibilityEvent.android.js @@ -9,6 +9,7 @@ */ import UIManager from '../../ReactNative/UIManager'; +import nullthrows from 'nullthrows'; /** * This is a function exposed to the React Renderer that can be used by the @@ -19,13 +20,13 @@ function legacySendAccessibilityEvent( eventType: string, ): void { if (eventType === 'focus') { - UIManager.sendAccessibilityEvent( + nullthrows(UIManager.sendAccessibilityEvent)( reactTag, UIManager.getConstants().AccessibilityEventTypes.typeViewFocused, ); } if (eventType === 'click') { - UIManager.sendAccessibilityEvent( + nullthrows(UIManager.sendAccessibilityEvent)( reactTag, UIManager.getConstants().AccessibilityEventTypes.typeViewClicked, ); diff --git a/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.js b/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.js index 655d13d67ce4d6..7f724524add5ce 100644 --- a/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.js +++ b/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.js @@ -6,7 +6,6 @@ * * @format * @flow - * @generate-docs */ 'use strict'; @@ -125,9 +124,9 @@ const ActivityIndicator = ( /** Displays a circular loading indicator. - ```SnackPlayer name=ActivityIndicator%20Function%20Component%20Example - import React from "react"; - import { ActivityIndicator, StyleSheet, Text, View } from "react-native"; + ```SnackPlayer name=ActivityIndicator%20Example + import React from 'react'; + import {ActivityIndicator, StyleSheet, View} from 'react-native'; const App = () => ( @@ -141,47 +140,17 @@ const ActivityIndicator = ( const styles = StyleSheet.create({ container: { flex: 1, - justifyContent: "center" + justifyContent: 'center', }, horizontal: { - flexDirection: "row", - justifyContent: "space-around", - padding: 10 - } - }); - export default App; - ``` - - ```SnackPlayer name=ActivityIndicator%20Class%20Component%20Example - import React, { Component } from "react"; - import { ActivityIndicator, StyleSheet, Text, View } from "react-native"; - - class App extends Component { - render() { - return ( - - - - - - - ); - } - } - - const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: "center" + flexDirection: 'row', + justifyContent: 'space-around', + padding: 10, }, - horizontal: { - flexDirection: "row", - justifyContent: "space-around", - padding: 10 - } }); + export default App; - ``` +``` */ const ActivityIndicatorWithRef: React.AbstractComponent< diff --git a/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicatorViewNativeComponent.js b/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicatorViewNativeComponent.js index 7394582902dcf0..6a7a7e7367b4d4 100644 --- a/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicatorViewNativeComponent.js +++ b/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicatorViewNativeComponent.js @@ -8,46 +8,6 @@ * @flow strict-local */ -import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes'; -import type {ColorValue} from '../../StyleSheet/StyleSheet'; -import type {WithDefault} from '../../Types/CodegenTypes'; -import type {ViewProps} from '../View/ViewPropTypes'; - -import codegenNativeComponent from '../../Utilities/codegenNativeComponent'; - -type NativeProps = $ReadOnly<{| - ...ViewProps, - - /** - * Whether the indicator should hide when not animating (true by default). - * - * See https://reactnative.dev/docs/activityindicator#hideswhenstopped - */ - hidesWhenStopped?: WithDefault, - - /** - * Whether to show the indicator (true, the default) or hide it (false). - * - * See https://reactnative.dev/docs/activityindicator#animating - */ - animating?: WithDefault, - - /** - * The foreground color of the spinner (default is gray). - * - * See https://reactnative.dev/docs/activityindicator#color - */ - color?: ?ColorValue, - - /** - * Size of the indicator (default is 'small'). - * Passing a number to the size prop is only supported on Android. - * - * See https://reactnative.dev/docs/activityindicator#size - */ - size?: WithDefault<'small' | 'large', 'small'>, -|}>; - -export default (codegenNativeComponent('ActivityIndicatorView', { - paperComponentName: 'RCTActivityIndicatorView', -}): HostComponent); +export * from '../../../src/private/specs/components/ActivityIndicatorViewNativeComponent'; +import ActivityIndicatorViewNativeComponent from '../../../src/private/specs/components/ActivityIndicatorViewNativeComponent'; +export default ActivityIndicatorViewNativeComponent; diff --git a/packages/react-native/Libraries/Components/Button.flow.js b/packages/react-native/Libraries/Components/Button.flow.js deleted file mode 100644 index 1cf32db90e76dc..00000000000000 --- a/packages/react-native/Libraries/Components/Button.flow.js +++ /dev/null @@ -1,318 +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. - * - * @format - * @flow - * @generate-docs - */ - -'use strict'; - -import type {PressEvent} from '../Types/CoreEventTypes'; -import type {BlurEvent, FocusEvent, KeyEvent} from '../Types/CoreEventTypes'; // [macOS] -import type { - AccessibilityActionEvent, - AccessibilityActionInfo, - // [macOS - AccessibilityRole, - // macOS] - AccessibilityState, -} from './View/ViewAccessibility'; - -import {type ColorValue} from '../StyleSheet/StyleSheet'; -import * as React from 'react'; - -type ButtonProps = $ReadOnly<{| - /** - Text to display inside the button. On Android the given title will be - converted to the uppercased form. - */ - title: string, - - /** - Handler to be called when the user taps the button. The first function - argument is an event in form of [PressEvent](pressevent). - */ - onPress: (event?: PressEvent) => mixed, - - /** - If `true`, doesn't play system sound on touch. - - @platform android - - @default false - */ - touchSoundDisabled?: ?boolean, - - /** - Color of the text (iOS), or background color of the button (Android). - - @default {@platform android} '#2196F3' - @default {@platform ios} '#007AFF' - */ - color?: ?ColorValue, - - /** - TV preferred focus. - - @platform tv - - @default false - */ - hasTVPreferredFocus?: ?boolean, - - /** - Designates the next view to receive focus when the user navigates down. See - the [Android documentation][android:nextFocusDown]. - - [android:nextFocusDown]: - https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusDown - - @platform android, tv - */ - nextFocusDown?: ?number, - - /** - Designates the next view to receive focus when the user navigates forward. - See the [Android documentation][android:nextFocusForward]. - - [android:nextFocusForward]: - https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusForward - - @platform android, tv - */ - nextFocusForward?: ?number, - - /** - Designates the next view to receive focus when the user navigates left. See - the [Android documentation][android:nextFocusLeft]. - - [android:nextFocusLeft]: - https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusLeft - - @platform android, tv - */ - nextFocusLeft?: ?number, - - /** - Designates the next view to receive focus when the user navigates right. See - the [Android documentation][android:nextFocusRight]. - - [android:nextFocusRight]: - https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusRight - - @platform android, tv - */ - nextFocusRight?: ?number, - - /** - Designates the next view to receive focus when the user navigates up. See - the [Android documentation][android:nextFocusUp]. - - [android:nextFocusUp]: - https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusUp - - @platform android, tv - */ - nextFocusUp?: ?number, - - /** - Text to display for blindness accessibility features. - */ - accessibilityLabel?: ?string, - /** - * Alias for accessibilityLabel https://reactnative.dev/docs/view#accessibilitylabel - * https://github.com/facebook/react-native/issues/34424 - */ - 'aria-label'?: ?string, - /** - If `true`, disable all interactions for this component. - - @default false - */ - disabled?: ?boolean, - - /** - Used to locate this view in end-to-end tests. - */ - testID?: ?string, - - /** - * Accessibility props. - */ - accessible?: ?boolean, - accessibilityActions?: ?$ReadOnlyArray, - onAccessibilityAction?: ?(event: AccessibilityActionEvent) => mixed, - accessibilityState?: ?AccessibilityState, - - /** - * [Android] Controlling if a view fires accessibility events and if it is reported to accessibility services. - */ - importantForAccessibility?: ?('auto' | 'yes' | 'no' | 'no-hide-descendants'), - accessibilityHint?: ?string, - accessibilityLanguage?: ?Stringish, - - // [macOS - /** - * Custom accessibility role -- otherwise we use button - */ - accessibilityRole?: ?AccessibilityRole, - - /** - * Accessibility action handlers - */ - onAccessibilityAction?: ?(event: AccessibilityActionEvent) => mixed, - - /** - * Handler to be called when the button receives key focus - */ - onBlur?: ?(e: BlurEvent) => void, - - /** - * Handler to be called when the button loses key focus - */ - onFocus?: ?(e: FocusEvent) => void, - - /** - * Handler to be called when a key down press is detected - */ - onKeyDown?: ?(e: KeyEvent) => void, - - /** - * Handler to be called when a key up press is detected - */ - onKeyUp?: ?(e: KeyEvent) => void, - - /* - * Array of keys to receive key down events for - * For arrow keys, add "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", - */ - validKeysDown?: ?Array, - - /* - * Array of keys to receive key up events for - * For arrow keys, add "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", - */ - validKeysUp?: ?Array, - - /* - * Specifies the Tooltip for the view - */ - tooltip?: string, - // macOS] -|}>; - -/** - A basic button component that should render nicely on any platform. Supports a - minimal level of customization. - - If this button doesn't look right for your app, you can build your own button - using [TouchableOpacity](touchableopacity) or - [TouchableWithoutFeedback](touchablewithoutfeedback). For inspiration, look at - the [source code for this button component][button:source]. Or, take a look at - the [wide variety of button components built by the community] - [button:examples]. - - [button:source]: - https://github.com/facebook/react-native/blob/HEAD/Libraries/Components/Button.js - - [button:examples]: - https://js.coach/?menu%5Bcollections%5D=React%20Native&page=1&query=button - - ```jsx -