diff --git a/.circleci/config.yml b/.circleci/config.yml
index a642711e33d1af..ff5476dd49dff4 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -71,7 +71,7 @@ jobs:
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
+ node ./scripts/circleci/pipeline_selection.js filter-jobs
- when:
condition:
not:
diff --git a/.circleci/configurations/executors.yml b/.circleci/configurations/executors.yml
index 3884b21abfdfc1..360049670c2503 100644
--- a/.circleci/configurations/executors.yml
+++ b/.circleci/configurations/executors.yml
@@ -36,3 +36,17 @@ executors:
resource_class: macos.x86.medium.gen2
environment:
- RCT_BUILD_HERMES_FROM_SOURCE: true
+ reactnativeios-lts:
+ <<: *defaults
+ macos:
+ xcode: '14.3.1'
+ resource_class: macos.x86.medium.gen2
+ environment:
+ - RCT_BUILD_HERMES_FROM_SOURCE: true
+ reactnative-visionos:
+ <<: *defaults
+ resource_class: macos.m1.medium.gen1
+ macos:
+ xcode: '15.2'
+ environment:
+ - RCT_BUILD_HERMES_FROM_SOURCE: true
diff --git a/.circleci/configurations/jobs.yml b/.circleci/configurations/jobs.yml
index 7f14131a504818..4eddadb0b13085 100644
--- a/.circleci/configurations/jobs.yml
+++ b/.circleci/configurations/jobs.yml
@@ -96,8 +96,8 @@ jobs:
- run:
name: "Run Tests: JavaScript Tests"
command: node ./scripts/run-ci-javascript-tests.js --maxWorkers 2
- - run_e2e:
- platform: js
+ # - run_e2e:
+ # platform: js
# Optionally, run disabled tests
- when:
@@ -360,7 +360,7 @@ jobs:
command: |
REPO_ROOT=$(pwd)
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
+ node ./scripts/template/initialize.js --reactNativeRootPath $REPO_ROOT --templateName $PROJECT_NAME --templateConfigPath "$REPO_ROOT/packages/react-native" --directory "/tmp/$PROJECT_NAME"
- with_gradle_cache:
steps:
- run:
@@ -458,7 +458,7 @@ jobs:
PACKAGE=$(cat build/react-native-package-version)
PATH_TO_PACKAGE="$REPO_ROOT/build/$PACKAGE"
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
+ node ./scripts/template/initialize.js --reactNativeRootPath $REPO_ROOT --templateName $PROJECT_NAME --templateConfigPath "$REPO_ROOT/packages/react-native" --directory "/tmp/$PROJECT_NAME"
- with_xcodebuild_cache:
podfile_lock_path: << parameters.podfile_lock_path >>
pods_build_folder: << parameters.pods_build_folder >>
@@ -590,6 +590,74 @@ jobs:
steps:
- run_ios_tests
+ # -------------------------
+ # JOBS: Test visionOS RNTester
+ # -------------------------
+ test_visionos_rntester:
+
+ parameters:
+ jsengine:
+ default: "JSC"
+ 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"]
+ ruby_version:
+ default: "2.6.10"
+ description: The version of ruby that must be used
+ type: string
+ run_unit_tests:
+ description: whether unit tests should run or not.
+ default: false
+ type: boolean
+ executor:
+ description: The executor to use
+ default: reactnative-visionos
+ type: string
+ executor: << parameters.executor >>
+ steps:
+ - checkout_code_with_cache
+ - run_yarn
+ - setup_ruby:
+ ruby_version: << parameters.ruby_version >>
+ - with_xcodebuild_cache:
+ steps:
+ - run:
+ name: "Install pods"
+ 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 USE_FRAMEWORKS=dynamic
+ fi
+
+ cd packages/rn-tester
+
+ bundle install
+ bundle exec pod install
+ - run:
+ name: "Build rn-tester"
+ command: |
+ xcodebuild build \
+ -workspace packages/rn-tester/RNTesterPods.xcworkspace \
+ -scheme RNTester-visionOS \
+ -sdk xrsimulator
+
# -------------------------
# JOBS: Build Hermes
# -------------------------
@@ -1286,4 +1354,4 @@ jobs:
command: echo "//registry.npmjs.org/:_authToken=${CIRCLE_NPM_TOKEN}" > ~/.npmrc
- run:
name: Find and publish all bumped packages
- command: node ./scripts/releases-ci/publish-updated-packages.js
+ command: node ./scripts/monorepo/find-and-publish-all-bumped-packages.js
diff --git a/.circleci/configurations/test_workflows/testAll.yml b/.circleci/configurations/test_workflows/testAll.yml
index 03ba79b8e388c7..4f41ddad44b43c 100644
--- a/.circleci/configurations/test_workflows/testAll.yml
+++ b/.circleci/configurations/test_workflows/testAll.yml
@@ -11,8 +11,8 @@
tag: test
dry_run: true
- prepare_hermes_workspace
- - build_android:
- release_type: "dry-run"
+ # - build_android:
+ # release_type: "dry-run"
- build_hermesc_linux:
requires:
- prepare_hermes_workspace
@@ -39,21 +39,21 @@
# Build a release package on every untagged commit, but do not publish to npm.
release_type: "dry-run"
requires:
- - build_android
+ # - build_android
- build_hermesc_linux
- build_hermes_macos
- build_hermesc_windows
- - test_android:
- requires:
- - build_android
- - test_android_template:
- requires:
- - build_npm_package
- matrix:
- parameters:
- architecture: ["NewArch", "OldArch"]
- jsengine: ["Hermes", "JSC"]
- flavor: ["Debug", "Release"]
+ # - test_android:
+ # requires:
+ # - build_android
+ # - test_android_template:
+ # requires:
+ # - build_npm_package
+ # matrix:
+ # parameters:
+ # architecture: ["NewArch", "OldArch"]
+ # jsengine: ["Hermes", "JSC"]
+ # flavor: ["Debug", "Release"]
- test_ios_template:
requires:
- build_npm_package
diff --git a/.circleci/configurations/test_workflows/testAndroid.yml b/.circleci/configurations/test_workflows/testAndroid.yml
index 83a1d0e36c99c9..3613a212693cf0 100644
--- a/.circleci/configurations/test_workflows/testAndroid.yml
+++ b/.circleci/configurations/test_workflows/testAndroid.yml
@@ -1,6 +1,7 @@
tests_android:
when:
and:
+ - equal: [ true, false ] # Disable for visionOS
- equal: [ false, << pipeline.parameters.run_release_workflow >> ]
- equal: [ false, << pipeline.parameters.run_nightly_workflow >> ]
jobs:
diff --git a/.circleci/configurations/test_workflows/testE2E.yml b/.circleci/configurations/test_workflows/testE2E.yml
index 998abf796ffe8c..6f0704a514cf0d 100644
--- a/.circleci/configurations/test_workflows/testE2E.yml
+++ b/.circleci/configurations/test_workflows/testE2E.yml
@@ -1,6 +1,7 @@
tests_e2e:
when:
and:
+ - equal: [ true, false ] # Disable for visionOS
- equal: [ false, << pipeline.parameters.run_release_workflow >> ]
- equal: [ false, << pipeline.parameters.run_nightly_workflow >> ]
jobs:
diff --git a/.circleci/configurations/test_workflows/testIOS.yml b/.circleci/configurations/test_workflows/testIOS.yml
index 3e8e24239e1952..d380ea6732e283 100644
--- a/.circleci/configurations/test_workflows/testIOS.yml
+++ b/.circleci/configurations/test_workflows/testIOS.yml
@@ -1,6 +1,7 @@
test_ios:
when:
and:
+ - equal: [ true, false ] # Disable for visionOS
- equal: [ false, << pipeline.parameters.run_release_workflow >> ]
- equal: [ false, << pipeline.parameters.run_nightly_workflow >> ]
jobs:
diff --git a/.circleci/configurations/test_workflows/testVisionOS.yml b/.circleci/configurations/test_workflows/testVisionOS.yml
new file mode 100644
index 00000000000000..37f3fd3f6a9c9d
--- /dev/null
+++ b/.circleci/configurations/test_workflows/testVisionOS.yml
@@ -0,0 +1,6 @@
+ test_visionos:
+ jobs:
+ - test_visionos_rntester:
+ matrix:
+ parameters:
+ architecture: ["OldArch", "NewArch"]
diff --git a/.circleci/configurations/top_level.yml b/.circleci/configurations/top_level.yml
index 2167897d295fe1..09f793ad2ec967 100644
--- a/.circleci/configurations/top_level.yml
+++ b/.circleci/configurations/top_level.yml
@@ -74,25 +74,25 @@ references:
gems_cache_key: &gems_cache_key v1-gems-{{ checksum "Gemfile.lock" }}
gradle_cache_key: &gradle_cache_key v3-gradle-{{ .Environment.CIRCLE_JOB }}-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "packages/react-native/ReactAndroid/gradle.properties" }}
yarn_cache_key: &yarn_cache_key v6-yarn-cache-{{ .Environment.CIRCLE_JOB }}
- rbenv_cache_key: &rbenv_cache_key v1-rbenv-{{ checksum "/tmp/required_ruby" }}
- hermes_workspace_cache_key: &hermes_workspace_cache_key v5-hermes-{{ .Environment.CIRCLE_JOB }}-{{ checksum "/tmp/hermes/hermesversion" }}
- hermes_workspace_debug_cache_key: &hermes_workspace_debug_cache_key v2-hermes-{{ .Environment.CIRCLE_JOB }}-debug-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }}
- hermes_workspace_release_cache_key: &hermes_workspace_release_cache_key v2-hermes-{{ .Environment.CIRCLE_JOB }}-release-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }}
- 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" }}
+ rbenv_cache_key: &rbenv_cache_key v2-rbenv-{{ checksum "/tmp/required_ruby" }}
+ hermes_workspace_cache_key: &hermes_workspace_cache_key v7-visionos-hermes-{{ .Environment.CIRCLE_JOB }}-{{ checksum "/tmp/hermes/hermesversion" }}
+ hermes_workspace_debug_cache_key: &hermes_workspace_debug_cache_key v2-visionos-hermes-{{ .Environment.CIRCLE_JOB }}-debug-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }}
+ hermes_workspace_release_cache_key: &hermes_workspace_release_cache_key v2-visionos-hermes-{{ .Environment.CIRCLE_JOB }}-release-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}-{{ checksum "packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh" }}
+ hermes_linux_cache_key: &hermes_linux_cache_key v1-visionos-hermes-{{ .Environment.CIRCLE_JOB }}-linux-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}
+ hermes_windows_cache_key: &hermes_windows_cache_key v2-visionos-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 v3-hermesc-apple-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}
- hermes_apple_slices_cache_key: &hermes_apple_slices_cache_key v7-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 v4-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" }}
+ hermesc_apple_cache_key: &hermesc_apple_cache_key v4-visionos-hermesc-apple-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}
+ hermes_apple_slices_cache_key: &hermes_apple_slices_cache_key v4-visionos-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 v7-visionos-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-visionos-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-visionos-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-visionos-hermes-debug-macosx-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}
+ hermes_dsym_debug_cache_key: &hermes_dsym_debug_cache_key v2-visionos-hermes-debug-dsym-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}
+ hermes_dsym_release_cache_key: &hermes_dsym_release_cache_key v2-visionos-hermes-release-dsym-{{ checksum "/tmp/hermes/hermesversion" }}-{{ checksum "/tmp/react-native-version" }}
# Cocoapods - RNTester
- 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 v10-podfilelock-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile" }}-{{ checksum "/tmp/week_year" }}-{{ checksum "/tmp/hermes/hermesversion" }}
+ pods_cache_key: &pods_cache_key v11-visionos-pods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile.lock.bak" }}-{{ checksum "packages/rn-tester/Podfile" }}
+ cocoapods_cache_key: &cocoapods_cache_key v11-visionos-cocoapods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile.lock" }}-{{ checksum "packages/rn-tester/Podfile" }}
+ rntester_podfile_lock_cache_key: &rntester_podfile_lock_cache_key v9-visionos-podfilelock-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile" }}-{{ checksum "/tmp/week_year" }}
# Cocoapods - Template
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" }}
diff --git a/.circleci/configurations/workflows.yml b/.circleci/configurations/workflows.yml
index e74f8ce39cd132..7bd1cf32c7bc34 100644
--- a/.circleci/configurations/workflows.yml
+++ b/.circleci/configurations/workflows.yml
@@ -128,6 +128,7 @@ workflows:
publish_bumped_packages:
when:
and:
+ - equal: [ 'https://github.com/facebook/react-native', << pipeline.project.git_url >> ]
- equal: [ false, << pipeline.parameters.run_release_workflow >> ]
- equal: [ false, << pipeline.parameters.run_nightly_workflow >> ]
jobs:
diff --git a/.github/workflows/ios-tests.yml b/.github/workflows/ios-tests.yml
index d2aae0c7791801..84daa3ebc06a18 100644
--- a/.github/workflows/ios-tests.yml
+++ b/.github/workflows/ios-tests.yml
@@ -1,12 +1,18 @@
name: ios-tests
+
+# on:
+# push:
+# branches:
+# - main
+# pull_request:
+# branches:
+# - "*"
+
+# For visionOS we run iOS tests every night
on:
- push:
- branches:
- - main
- pull_request:
- branches:
- - "*"
+ schedule:
+ - cron: '0 0 * * *'
jobs:
test_ios_rntester-Hermes:
diff --git a/.gitignore b/.gitignore
index b331cd3cd3ea91..8eb742809e30c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -163,3 +163,6 @@ vendor/
# CircleCI
.circleci/generated_config.yml
+.circleci/storage
+
+.yarn
diff --git a/README.md b/README.md
index 4d8883c511c666..fe5b8e5e1b2103 100644
--- a/README.md
+++ b/README.md
@@ -1,147 +1,52 @@
Learn once, write anywhere:
- Build mobile apps with React.
+ Build spatial apps with React.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-React Native brings [**React**'s][r] declarative UI framework to iOS and Android. With React Native, you use native UI controls and have full access to the native platform.
-
-- **Declarative.** React makes it painless to create interactive UIs. Declarative views make your code more predictable and easier to debug.
-- **Component-Based.** Build encapsulated components that manage their state, then compose them to make complex UIs.
-- **Developer Velocity.** See local changes in seconds. Changes to JavaScript code can be live reloaded without rebuilding the native app.
-- **Portability.** Reuse code across iOS, Android, and [other platforms][p].
-
-React Native is developed and supported by many companies and individual core contributors. Find out more in our [ecosystem overview][e].
-
-[r]: https://react.dev/
-[p]: https://reactnative.dev/docs/out-of-tree-platforms
-[e]: https://github.com/facebook/react-native/blob/HEAD/ECOSYSTEM.md
-
-## Contents
-
-- [Requirements](#-requirements)
-- [Building your first React Native app](#-building-your-first-react-native-app)
-- [Documentation](#-documentation)
-- [Upgrading](#-upgrading)
-- [How to Contribute](#-how-to-contribute)
-- [Code of Conduct](#code-of-conduct)
-- [License](#-license)
-
-
-## 📋 Requirements
-
-React Native apps may target iOS 13.4 and Android 6.0 (API 23) or newer. You may use Windows, macOS, or Linux as your development operating system, though building and running iOS apps is limited to macOS. Tools like [Expo](https://expo.dev) can be used to work around this.
+React Native visionOS allows you to write visionOS with full support for platform SDK. This is a full fork of the main repository with changes needed to support visionOS.
-## 🎉 Building your first React Native app
+
-Follow the [Getting Started guide](https://reactnative.dev/docs/getting-started). The recommended way to install React Native depends on your project. Here you can find short guides for the most common scenarios:
+## 🎉 Building your first spatial React Native app
+Follow the [Getting Started](https://callstack.github.io/react-native-visionos-docs/category/getting-started) guide. If you wish to get started quickly, you can utilize this command:
-- [Trying out React Native][hello-world]
-- [Creating a New Application][new-app]
-- [Adding React Native to an Existing Application][existing]
+```sh
+npx @callstack/react-native-visionos@latest init YourApp
+```
-[hello-world]: https://snack.expo.dev/@samples/hello-world
-[new-app]: https://reactnative.dev/docs/getting-started
-[existing]: https://reactnative.dev/docs/integration-with-existing-apps
## 📖 Documentation
-The full documentation for React Native can be found on our [website][docs].
-
-The React Native documentation discusses components, APIs, and topics that are specific to React Native. For further documentation on the React API that is shared between React Native and React DOM, refer to the [React documentation][r-docs].
-
-The source for the React Native documentation and website is hosted on a separate repo, [**@facebook/react-native-website**][repo-website].
-
-[docs]: https://reactnative.dev/docs/getting-started
-[r-docs]: https://react.dev/learn
-[repo-website]: https://github.com/facebook/react-native-website
-
-## 🚀 Upgrading
-
-Upgrading to new versions of React Native may give you access to more APIs, views, developer tools, and other goodies. See the [Upgrading Guide][u] for instructions.
-
-React Native releases are discussed [in this discussion repo](https://github.com/reactwg/react-native-releases/discussions).
-
-[u]: https://reactnative.dev/docs/upgrading
-[repo-releases]: https://github.com/react-native-community/react-native-releases
-
-## 👏 How to Contribute
-
-The main purpose of this repository is to continue evolving React Native core. We want to make contributing to this project as easy and transparent as possible, and we are grateful to the community for contributing bug fixes and improvements. Read below to learn how you can take part in improving React Native.
-
-### [Code of Conduct][code]
-
-Facebook has adopted a Code of Conduct that we expect project participants to adhere to.
-Please read the [full text][code] so that you can understand what actions will and will not be tolerated.
-
-[code]: https://code.fb.com/codeofconduct/
-
-### [Contributing Guide][contribute]
-
-Read our [**Contributing Guide**][contribute] to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to React Native.
-
-[contribute]: https://reactnative.dev/docs/contributing
-
-### [Open Source Roadmap][roadmap]
-
-You can learn more about our vision for React Native in the [**Roadmap**][roadmap].
+The full documentation for React Native visionOS can be found on our [website](https://callstack.github.io/react-native-visionos-docs).
-[roadmap]: https://github.com/facebook/react-native/wiki/Roadmap
+The source for the React Native visionOS documentation and website is hosted on a separate repo, @callstack/react-native-visionos-docs.
-### Good First Issues
+## Contributing
-We have a list of [good first issues][gfi] that contain bugs which have a relatively limited scope. This is a great place to get started, gain experience, and get familiar with our contribution process.
+Prerequisites:
+- Download the latest Xcode (at least 15.2)
+- Install the latest version of CMake (at least v3.28.0)
-[gfi]: https://github.com/facebook/react-native/labels/good%20first%20issue
+Check out `rn-tester` [README.md](./packages/rn-tester/README.md) to build React Native from the source.
-### Discussions
+Remember to use `RNTester-visionOS` target
-Larger discussions and proposals are discussed in [**@react-native-community/discussions-and-proposals**][repo-meta].
+If `RNTester-visionOS` scheme is not showing up, click "New Scheme", which should be pre-populated with `RNTester-visionOS`. Build the app using Xcode.
-[repo-meta]: https://github.com/react-native-community/discussions-and-proposals
+## Release process
-## 📄 License
+We use a script called `oot-release.js` which automatically releases `visionos` packages and aligns versions of dependencies with React Native core.
-React Native is MIT licensed, as found in the [LICENSE][l] file.
+Usage:
-React Native documentation is Creative Commons licensed, as found in the [LICENSE-docs][ld] file.
+```sh
+node ./scripts/oot-release.js --new-version "" --react-native-version "" --one-time-password ""
+```
-[l]: https://github.com/facebook/react-native/blob/main/LICENSE
-[ld]: https://github.com/facebook/react-native/blob/main/LICENSE-docs
+To test releases and template we use [Verdaccio](https://verdaccio.org/).
diff --git a/jest.config.js b/jest.config.js
index 933d17ec51500f..fcec1dc447fa43 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -41,6 +41,15 @@ module.exports = {
defaultPlatform: 'ios',
platforms: ['ios', 'android'],
},
+ moduleNameMapper: {
+ // These mappers allow out-of-tree platforms tests to seamlessly resolve RN imports
+ '^react-native/(.*)': '/packages/react-native/$1',
+ '^react-native$': '/packages/react-native/index.js',
+ // This module is internal to Meta and used by their custom React renderer.
+ // In tests, we can just use a mock.
+ '^ReactNativeInternalFeatureFlags$':
+ '/packages/react-native/jest/ReactNativeInternalFeatureFlagsMock.js',
+ },
moduleFileExtensions: ['fb.js'].concat(defaults.moduleFileExtensions),
modulePathIgnorePatterns: ['scripts/.*/__fixtures__/'],
unmockedModulePathPatterns: [
diff --git a/packages/out-of-tree-platforms/.gitignore b/packages/out-of-tree-platforms/.gitignore
new file mode 100644
index 00000000000000..ac0720f94136cd
--- /dev/null
+++ b/packages/out-of-tree-platforms/.gitignore
@@ -0,0 +1,2 @@
+# Build output
+/dist
\ No newline at end of file
diff --git a/packages/out-of-tree-platforms/README.md b/packages/out-of-tree-platforms/README.md
new file mode 100644
index 00000000000000..972663edaca00e
--- /dev/null
+++ b/packages/out-of-tree-platforms/README.md
@@ -0,0 +1,19 @@
+# @callstack/out-of-tree-platforms
+
+[![Version][version-badge]][package]
+
+Utilities for Out of Tree (OOT) platforms.
+
+## `getPlatformResolver`
+
+```js
+getPlatformResolver(options: ResolverConfig): CustomResolver
+```
+
+### options
+
+```js
+type ResolverConfig = {
+ platformImplementations: {[platform: string]: string},
+};
+```
diff --git a/packages/out-of-tree-platforms/index.js.flow b/packages/out-of-tree-platforms/index.js.flow
new file mode 100644
index 00000000000000..8420b1093fdb2f
--- /dev/null
+++ b/packages/out-of-tree-platforms/index.js.flow
@@ -0,0 +1 @@
+export * from './src';
diff --git a/packages/out-of-tree-platforms/package.json b/packages/out-of-tree-platforms/package.json
new file mode 100644
index 00000000000000..ee09627611fd41
--- /dev/null
+++ b/packages/out-of-tree-platforms/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "@callstack/out-of-tree-platforms",
+ "version": "0.75.0-main",
+ "description": "Utils for React Native out of tree platforms.",
+ "keywords": ["out-of-tree", "react-native"],
+ "homepage": "https://github.com/callstack/react-native-visionos/tree/HEAD/packages/out-of-tree-platforms#readme",
+ "bugs": "https://github.com/callstack/react-native-visionos/issues",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/callstack/react-native-visionos.git",
+ "directory": "packages/out-of-tree-platforms"
+ },
+ "license": "MIT",
+ "exports": {
+ ".": "./src/index.js",
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "dist"
+ ],
+ "devDependencies": {
+ "metro-resolver": "^0.80.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+}
diff --git a/packages/out-of-tree-platforms/src/getPlatformResolver.js b/packages/out-of-tree-platforms/src/getPlatformResolver.js
new file mode 100644
index 00000000000000..70e3acde5c1d78
--- /dev/null
+++ b/packages/out-of-tree-platforms/src/getPlatformResolver.js
@@ -0,0 +1,43 @@
+/**
+ * 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
+ */
+
+import type {CustomResolver} from 'metro-resolver';
+
+type ResolverConfig = {
+ platformNameMap: {[platform: string]: string},
+};
+
+/**
+ * Creates a custom Metro resolver that maps platform extensions to package names.
+ * To be used in app's `metro.config.js` as `resolver.resolveRequest`.
+ */
+export const getPlatformResolver = (config: ResolverConfig): CustomResolver => {
+ return (context, moduleName, platform) => {
+ // `customResolverOptions` is populated through `?resolver.platformExtension` query params
+ // in the jsBundleURLForBundleRoot method of the react-native/React/Base/RCTBundleURLProvider.mm
+ const platformExtension = context.customResolverOptions?.platformExtension;
+ let modifiedModuleName = moduleName;
+ if (
+ typeof platformExtension === 'string' &&
+ config.platformNameMap?.[platformExtension]
+ ) {
+ const packageName = config.platformNameMap[platformExtension];
+ if (moduleName === 'react-native') {
+ modifiedModuleName = packageName;
+ } else if (moduleName.startsWith('react-native/')) {
+ modifiedModuleName = `${packageName}/${modifiedModuleName.slice(
+ 'react-native/'.length,
+ )}`;
+ }
+ }
+
+ return context.resolveRequest(context, modifiedModuleName, platform);
+ };
+};
diff --git a/packages/out-of-tree-platforms/src/index.js b/packages/out-of-tree-platforms/src/index.js
new file mode 100644
index 00000000000000..2244b1ce77d29e
--- /dev/null
+++ b/packages/out-of-tree-platforms/src/index.js
@@ -0,0 +1,5 @@
+if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) {
+ require('../../../scripts/build/babel-register').registerForMonorepo();
+}
+
+export * from './getPlatformResolver';
diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h
index 741dfa92f7fcdc..1466ba2c599923 100644
--- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h
+++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h
@@ -59,7 +59,9 @@ NS_ASSUME_NONNULL_BEGIN
/// The window object, used to render the UViewControllers
@property (nonatomic, strong, nonnull) UIWindow *window;
-@property (nonatomic, nullable) RCTBridge *bridge;
+/// Store last focused window to properly handle multi-window scenarios
+@property (nonatomic, weak, nullable) UIWindow *lastFocusedWindow;
+@property (nonatomic, strong, nullable) RCTBridge *bridge;
@property (nonatomic, strong, nullable) NSString *moduleName;
@property (nonatomic, strong, nullable) NSDictionary *initialProps;
@property (nonatomic, strong, nonnull) RCTRootViewFactory *rootViewFactory;
diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm
index b02fe560843634..413ac7e96867e7 100644
--- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm
+++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm
@@ -17,6 +17,7 @@
#import
#import "RCTAppDelegate+Protected.h"
#import "RCTAppSetupUtils.h"
+#import
#if RN_DISABLE_OSS_PLUGIN_HEADER
#import
@@ -47,21 +48,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
self.rootViewFactory = [self createRCTRootViewFactory];
- UIView *rootView = [self.rootViewFactory viewWithModuleName:self.moduleName
- initialProperties:self.initialProps
- launchOptions:launchOptions];
-
if (self.newArchEnabled || self.fabricEnabled) {
[RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self;
}
- [self customizeRootView:(RCTRootView *)rootView];
-
- self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
- UIViewController *rootViewController = [self createRootViewController];
- [self setRootView:rootView toRootViewController:rootViewController];
- self.window.rootViewController = rootViewController;
- self.window.windowScene.delegate = self;
- [self.window makeKeyAndVisible];
return YES;
}
@@ -90,7 +79,11 @@ - (UIView *)createRootViewWithBridge:(RCTBridge *)bridge
BOOL enableFabric = self.fabricEnabled;
UIView *rootView = RCTAppSetupDefaultRootView(bridge, moduleName, initProps, enableFabric);
+#if TARGET_OS_VISION
+ rootView.backgroundColor = [UIColor clearColor];
+#else
rootView.backgroundColor = [UIColor systemBackgroundColor];
+#endif
return rootView;
}
diff --git a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm
index dd85650179a025..fb1b81651538dd 100644
--- a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm
+++ b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm
@@ -149,7 +149,11 @@ - (UIView *)viewWithModuleName:(NSString *)moduleName
initWithSurface:surface
sizeMeasureMode:RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightExact];
+#if TARGET_OS_VISION
+ surfaceHostingProxyRootView.backgroundColor = [UIColor clearColor];
+#else
surfaceHostingProxyRootView.backgroundColor = [UIColor systemBackgroundColor];
+#endif
return surfaceHostingProxyRootView;
}
@@ -175,7 +179,11 @@ - (UIView *)createRootViewWithBridge:(RCTBridge *)bridge
BOOL enableFabric = self->_configuration.fabricEnabled;
UIView *rootView = RCTAppSetupDefaultRootView(bridge, moduleName, initProps, enableFabric);
+#if TARGET_OS_VISION
+ rootView.backgroundColor = [UIColor clearColor];
+#else
rootView.backgroundColor = [UIColor systemBackgroundColor];
+#endif
return rootView;
}
diff --git a/packages/react-native/Libraries/Components/Keyboard/Keyboard.js b/packages/react-native/Libraries/Components/Keyboard/Keyboard.js
index 8aae204e97f328..fd23d472e95a57 100644
--- a/packages/react-native/Libraries/Components/Keyboard/Keyboard.js
+++ b/packages/react-native/Libraries/Components/Keyboard/Keyboard.js
@@ -15,6 +15,7 @@ import LayoutAnimation from '../../LayoutAnimation/LayoutAnimation';
import dismissKeyboard from '../../Utilities/dismissKeyboard';
import Platform from '../../Utilities/Platform';
import NativeKeyboardObserver from './NativeKeyboardObserver';
+import warnOnce from '../../Utilities/warnOnce';
export type KeyboardEventName = $Keys;
@@ -114,6 +115,10 @@ class Keyboard {
);
constructor() {
+ if (Platform.isVision) {
+ return;
+ }
+
this.addListener('keyboardDidShow', ev => {
this._currentlyShowing = ev;
});
@@ -151,6 +156,14 @@ class Keyboard {
listener: (...$ElementType) => mixed,
context?: mixed,
): EventSubscription {
+ if (Platform.isVision) {
+ warnOnce(
+ 'Keyboard-unavailable',
+ 'Keyboard API is not available on visionOS platform. The system displays the keyboard in a separate window, leaving the app’s window unaffected by the keyboard’s appearance and disappearance',
+ );
+ return {remove() {}};
+ }
+
return this._emitter.addListener(eventType, listener);
}
@@ -160,6 +173,10 @@ class Keyboard {
* @param {string} eventType The native event string listeners are watching which will be removed.
*/
removeAllListeners>(eventType: ?K): void {
+ if (Platform.isVision) {
+ return;
+ }
+
this._emitter.removeAllListeners(eventType);
}
diff --git a/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js b/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js
index e26d6771c47209..efea2b6683f40f 100644
--- a/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js
+++ b/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js
@@ -24,6 +24,7 @@ import AccessibilityInfo from '../AccessibilityInfo/AccessibilityInfo';
import View from '../View/View';
import Keyboard from './Keyboard';
import * as React from 'react';
+import warnOnce from '../../Utilities/warnOnce';
type Props = $ReadOnly<{|
...ViewProps,
@@ -176,6 +177,13 @@ class KeyboardAvoidingView extends React.Component {
componentDidMount(): void {
if (Platform.OS === 'ios') {
+ if (Platform.isVision) {
+ warnOnce(
+ 'KeyboardAvoidingView-unavailable',
+ 'KeyboardAvoidingView is not available on visionOS platform. The system displays the keyboard in a separate window, leaving the app’s window unaffected by the keyboard’s appearance and disappearance',
+ );
+ return;
+ }
this._subscriptions = [
Keyboard.addListener('keyboardWillChangeFrame', this._onKeyboardChange),
];
@@ -205,6 +213,16 @@ class KeyboardAvoidingView extends React.Component {
onLayout,
...props
} = this.props;
+
+ if (Platform.isVision) {
+ // KeyboardAvoidingView is not supported on VisionOS, so we return a simple View without the onLayout handler
+ return (
+
+ {children}
+
+ );
+ }
+
const bottomHeight = enabled === true ? this.state.bottom : 0;
switch (behavior) {
case 'height':
diff --git a/packages/react-native/Libraries/Components/Pressable/Pressable.js b/packages/react-native/Libraries/Components/Pressable/Pressable.js
index bd0d6a43a3a666..8b4bc667bdbf38 100644
--- a/packages/react-native/Libraries/Components/Pressable/Pressable.js
+++ b/packages/react-native/Libraries/Components/Pressable/Pressable.js
@@ -24,6 +24,7 @@ import type {
import {PressabilityDebugView} from '../../Pressability/PressabilityDebug';
import usePressability from '../../Pressability/usePressability';
import {type RectOrSize} from '../../StyleSheet/Rect';
+import StyleSheet from '../../StyleSheet/StyleSheet';
import useMergeRefs from '../../Utilities/useMergeRefs';
import View from '../View/View';
import useAndroidRippleForView, {
@@ -347,7 +348,10 @@ function Pressable(
{...restPropsWithDefaults}
{...eventHandlers}
ref={mergedRef}
- style={typeof style === 'function' ? style({pressed}) : style}
+ style={[
+ styles.pressable,
+ typeof style === 'function' ? style({pressed}) : style,
+ ]}
collapsable={false}>
{typeof children === 'function' ? children({pressed}) : children}
{__DEV__ ? : null}
@@ -355,6 +359,12 @@ function Pressable(
);
}
+const styles = StyleSheet.create({
+ pressable: {
+ cursor: 'pointer',
+ },
+});
+
function usePressState(forcePressed: boolean): [boolean, (boolean) => void] {
const [pressed, setPressed] = useState(false);
return [pressed || forcePressed, setPressed];
diff --git a/packages/react-native/Libraries/Components/Pressable/__tests__/__snapshots__/Pressable-test.js.snap b/packages/react-native/Libraries/Components/Pressable/__tests__/__snapshots__/Pressable-test.js.snap
index e348e02347e52b..2f9286b98987d6 100644
--- a/packages/react-native/Libraries/Components/Pressable/__tests__/__snapshots__/Pressable-test.js.snap
+++ b/packages/react-native/Libraries/Components/Pressable/__tests__/__snapshots__/Pressable-test.js.snap
@@ -31,6 +31,14 @@ exports[` should render as expected: should deep render when mocked
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -67,6 +75,14 @@ exports[` should render as expected: should deep render when not mo
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -115,6 +131,14 @@ exports[` should be disabled when disabled is true:
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -151,6 +175,14 @@ exports[` should be disabled when disabled is true:
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -203,6 +235,14 @@ exports[` should be disable
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -239,6 +279,14 @@ exports[` should be disable
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -293,6 +341,14 @@ exports[` shou
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -329,6 +385,14 @@ exports[` shou
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -391,6 +455,14 @@ exports[` sh
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -427,6 +499,14 @@ exports[` sh
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
diff --git a/packages/react-native/Libraries/Components/ScrollView/ScrollView.js b/packages/react-native/Libraries/Components/ScrollView/ScrollView.js
index dbe5bf1f218a68..6e8282ec0c3c3e 100644
--- a/packages/react-native/Libraries/Components/ScrollView/ScrollView.js
+++ b/packages/react-native/Libraries/Components/ScrollView/ScrollView.js
@@ -783,22 +783,24 @@ class ScrollView extends React.Component {
this._keyboardMetrics = Keyboard.metrics();
this._additionalScrollOffset = 0;
- this._subscriptionKeyboardWillShow = Keyboard.addListener(
- 'keyboardWillShow',
- this.scrollResponderKeyboardWillShow,
- );
- this._subscriptionKeyboardWillHide = Keyboard.addListener(
- 'keyboardWillHide',
- this.scrollResponderKeyboardWillHide,
- );
- this._subscriptionKeyboardDidShow = Keyboard.addListener(
- 'keyboardDidShow',
- this.scrollResponderKeyboardDidShow,
- );
- this._subscriptionKeyboardDidHide = Keyboard.addListener(
- 'keyboardDidHide',
- this.scrollResponderKeyboardDidHide,
- );
+ if (!Platform.isVision) {
+ this._subscriptionKeyboardWillShow = Keyboard.addListener(
+ 'keyboardWillShow',
+ this.scrollResponderKeyboardWillShow,
+ );
+ this._subscriptionKeyboardWillHide = Keyboard.addListener(
+ 'keyboardWillHide',
+ this.scrollResponderKeyboardWillHide,
+ );
+ this._subscriptionKeyboardDidShow = Keyboard.addListener(
+ 'keyboardDidShow',
+ this.scrollResponderKeyboardDidShow,
+ );
+ this._subscriptionKeyboardDidHide = Keyboard.addListener(
+ 'keyboardDidHide',
+ this.scrollResponderKeyboardDidHide,
+ );
+ }
this._updateAnimatedNodeAttachment();
}
diff --git a/packages/react-native/Libraries/Components/StatusBar/StatusBar.js b/packages/react-native/Libraries/Components/StatusBar/StatusBar.js
index 20c2cf49d9fe69..a533c7d63acdbd 100644
--- a/packages/react-native/Libraries/Components/StatusBar/StatusBar.js
+++ b/packages/react-native/Libraries/Components/StatusBar/StatusBar.js
@@ -12,6 +12,7 @@ import type {ColorValue} from '../../StyleSheet/StyleSheet';
import processColor from '../../StyleSheet/processColor';
import Platform from '../../Utilities/Platform';
+import warnOnce from '../../Utilities/warnOnce';
import NativeStatusBarManagerAndroid from './NativeStatusBarManagerAndroid';
import NativeStatusBarManagerIOS from './NativeStatusBarManagerIOS';
import invariant from 'invariant';
@@ -373,6 +374,13 @@ class StatusBar extends React.Component {
_stackEntry = null;
componentDidMount() {
+ if (Platform.isVision) {
+ warnOnce(
+ 'StatusBar-unavailable',
+ 'StatusBar is not available on visionOS platform.',
+ );
+ return;
+ }
// Every time a StatusBar component is mounted, we push it's prop to a stack
// and always update the native status bar with the props from the top of then
// stack. This allows having multiple StatusBar components and the one that is
diff --git a/packages/react-native/Libraries/Components/TextInput/InputAccessoryView.js b/packages/react-native/Libraries/Components/TextInput/InputAccessoryView.js
index 43294aab0e4690..4f8a405cf55bfd 100644
--- a/packages/react-native/Libraries/Components/TextInput/InputAccessoryView.js
+++ b/packages/react-native/Libraries/Components/TextInput/InputAccessoryView.js
@@ -86,7 +86,7 @@ type Props = $ReadOnly<{|
|}>;
const InputAccessoryView: React.AbstractComponent = (props: Props) => {
- if (Platform.OS === 'ios') {
+ if (Platform.OS === 'ios' && !Platform.isVision) {
if (React.Children.count(props.children) === 0) {
return null;
}
diff --git a/packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js b/packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js
index 9cdc5f76cb2ea4..60231d8704222f 100644
--- a/packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js
+++ b/packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js
@@ -329,10 +329,13 @@ class TouchableHighlight extends React.Component {
accessibilityElementsHidden={
this.props['aria-hidden'] ?? this.props.accessibilityElementsHidden
}
- style={StyleSheet.compose(
- this.props.style,
- this.state.extraStyles?.underlay,
- )}
+ style={[
+ styles.touchable,
+ StyleSheet.compose(
+ this.props.style,
+ this.state.extraStyles?.underlay,
+ ),
+ ]}
onLayout={this.props.onLayout}
hitSlop={this.props.hitSlop}
hasTVPreferredFocus={this.props.hasTVPreferredFocus}
@@ -379,6 +382,12 @@ class TouchableHighlight extends React.Component {
}
}
+const styles = StyleSheet.create({
+ touchable: {
+ cursor: 'pointer',
+ },
+});
+
const Touchable: React.AbstractComponent<
$ReadOnly<$Diff|}>>,
React.ElementRef,
diff --git a/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js b/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js
index a11eb7cafe3fb9..85e6d7eed82688 100644
--- a/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js
+++ b/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js
@@ -18,6 +18,7 @@ import Pressability, {
} from '../../Pressability/Pressability';
import {PressabilityDebugView} from '../../Pressability/PressabilityDebug';
import flattenStyle from '../../StyleSheet/flattenStyle';
+import StyleSheet from '../../StyleSheet/StyleSheet';
import Platform from '../../Utilities/Platform';
import * as React from 'react';
@@ -275,7 +276,7 @@ class TouchableOpacity extends React.Component {
accessibilityElementsHidden={
this.props['aria-hidden'] ?? this.props.accessibilityElementsHidden
}
- style={[this.props.style, {opacity: this.state.anim}]}
+ style={[styles.touchable, this.props.style, {opacity: this.state.anim}]}
nativeID={this.props.id ?? this.props.nativeID}
testID={this.props.testID}
onLayout={this.props.onLayout}
@@ -324,6 +325,12 @@ class TouchableOpacity extends React.Component {
}
}
+const styles = StyleSheet.create({
+ touchable: {
+ cursor: 'pointer',
+ },
+});
+
const Touchable: React.AbstractComponent<
Props,
React.ElementRef,
diff --git a/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableHighlight-test.js.snap b/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableHighlight-test.js.snap
index 35c845e97493fc..f26560d45d738a 100644
--- a/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableHighlight-test.js.snap
+++ b/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableHighlight-test.js.snap
@@ -19,7 +19,14 @@ exports[`TouchableHighlight renders correctly 1`] = `
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
- style={Object {}}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ Object {},
+ ]
+ }
>
Touchable
@@ -51,6 +58,14 @@ exports[`TouchableHighlight with disabled state should be disabled when disabled
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -80,6 +95,14 @@ exports[`TouchableHighlight with disabled state should be disabled when disabled
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -109,6 +132,14 @@ exports[`TouchableHighlight with disabled state should disable button when acces
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -139,6 +170,14 @@ exports[`TouchableHighlight with disabled state should keep accessibilityState w
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
@@ -168,6 +207,14 @@ exports[`TouchableHighlight with disabled state should overwrite accessibilitySt
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
+ style={
+ Array [
+ Object {
+ "cursor": "pointer",
+ },
+ undefined,
+ ]
+ }
>
diff --git a/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableOpacity-test.js.snap b/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableOpacity-test.js.snap
index 17f2e7f6f764e0..ca634909ca5afc 100644
--- a/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableOpacity-test.js.snap
+++ b/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableOpacity-test.js.snap
@@ -31,6 +31,7 @@ exports[`TouchableOpacity renders correctly 1`] = `
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -72,6 +73,7 @@ exports[`TouchableOpacity renders in disabled state when a disabled prop is pass
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -113,6 +115,7 @@ exports[`TouchableOpacity renders in disabled state when a key disabled in acces
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
diff --git a/packages/react-native/Libraries/Components/__tests__/__snapshots__/Button-test.js.snap b/packages/react-native/Libraries/Components/__tests__/__snapshots__/Button-test.js.snap
index 5b4294e0e8c850..a3efb80e477bfc 100644
--- a/packages/react-native/Libraries/Components/__tests__/__snapshots__/Button-test.js.snap
+++ b/packages/react-native/Libraries/Components/__tests__/__snapshots__/Button-test.js.snap
@@ -32,6 +32,7 @@ exports[` should be disabled and it should set accessibilityState to d
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -98,6 +99,7 @@ exports[` should be disabled when disabled is empty and accessibilityS
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -164,6 +166,7 @@ exports[` should be disabled when disabled={true} and accessibilitySta
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -231,6 +234,7 @@ exports[` should be set importantForAccessibility={no-hide-descendants
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -293,6 +297,7 @@ exports[` should be set importantForAccessibility={no-hide-descendants
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -354,6 +359,7 @@ exports[` should not be disabled when disabled={false} and accessibili
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -416,6 +422,7 @@ exports[` should not be disabled when disabled={false} and accessibili
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -478,6 +485,7 @@ exports[` should overwrite accessibilityState with value of disabled p
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
@@ -544,6 +552,7 @@ exports[` should render as expected 1`] = `
onStartShouldSetResponder={[Function]}
style={
Object {
+ "cursor": "pointer",
"opacity": 1,
}
}
diff --git a/packages/react-native/Libraries/Image/React-RCTImage.podspec b/packages/react-native/Libraries/Image/React-RCTImage.podspec
index 5aacf0d7999c32..8f77a54b2372b5 100644
--- a/packages/react-native/Libraries/Image/React-RCTImage.podspec
+++ b/packages/react-native/Libraries/Image/React-RCTImage.podspec
@@ -45,7 +45,7 @@ Pod::Spec.new do |s|
"CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
"HEADER_SEARCH_PATHS" => header_search_paths.join(' ')
}
- s.framework = ["Accelerate", "UIKit"]
+ s.framework = ["Accelerate", "UIKit", "QuartzCore", "ImageIO", "CoreGraphics"]
s.dependency "RCT-Folly", folly_version
s.dependency "RCTTypeSafety"
diff --git a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h
index eff3b0c5461422..8bfee5fa745420 100644
--- a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h
+++ b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h
@@ -24,4 +24,6 @@
continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:(nonnull void (^)(NSArray> *_Nullable))restorationHandler;
++ (void)onOpenURL:(nonnull NSURL *)url NS_SWIFT_NAME(onOpenURL(url:));
+
@end
diff --git a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm
index 3fa06c43979bfd..b63c6340640452 100644
--- a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm
+++ b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm
@@ -15,6 +15,7 @@
#import "RCTLinkingPlugins.h"
static NSString *const kOpenURLNotification = @"RCTOpenURLNotification";
+static NSURL *initialURL = nil;
static void postNotificationWithURL(NSURL *URL, id sender)
{
@@ -81,6 +82,16 @@ + (BOOL)application:(UIApplication *)application
return YES;
}
+
++ (void)onOpenURL:(NSURL *)url
+{
+ if (initialURL == nil) {
+ initialURL = url;
+ } else {
+ postNotificationWithURL(url, self);
+ }
+}
+
- (void)handleOpenURLNotification:(NSNotification *)notification
{
[self sendEventWithName:@"url" body:notification.userInfo];
@@ -153,6 +164,7 @@ - (void)handleOpenURLNotification:(NSNotification *)notification
RCT_EXPORT_METHOD(getInitialURL : (RCTPromiseResolveBlock)resolve reject : (__unused RCTPromiseRejectBlock)reject)
{
+#if !TARGET_OS_VISION
NSURL *initialURL = nil;
if (self.bridge.launchOptions[UIApplicationLaunchOptionsURLKey]) {
initialURL = self.bridge.launchOptions[UIApplicationLaunchOptionsURLKey];
@@ -163,6 +175,8 @@ - (void)handleOpenURLNotification:(NSNotification *)notification
initialURL = ((NSUserActivity *)userActivityDictionary[@"UIApplicationLaunchOptionsUserActivityKey"]).webpageURL;
}
}
+#endif
+ // React Native visionOS uses static property to retrieve initialURL.
resolve(RCTNullIfNil(initialURL.absoluteString));
}
diff --git a/packages/react-native/Libraries/LinkingIOS/React-RCTLinking.podspec b/packages/react-native/Libraries/LinkingIOS/React-RCTLinking.podspec
index eff125c9615056..bc7316170eae11 100644
--- a/packages/react-native/Libraries/LinkingIOS/React-RCTLinking.podspec
+++ b/packages/react-native/Libraries/LinkingIOS/React-RCTLinking.podspec
@@ -45,6 +45,8 @@ Pod::Spec.new do |s|
"HEADER_SEARCH_PATHS" => header_search_paths.join(' ')
}
+ s.framework = "UIKit"
+
s.dependency "React-Core/RCTLinkingHeaders", version
s.dependency "ReactCommon/turbomodule/core", version
s.dependency "React-jsi", version
diff --git a/packages/react-native/Libraries/NativeAnimation/React-RCTAnimation.podspec b/packages/react-native/Libraries/NativeAnimation/React-RCTAnimation.podspec
index c9f32c9eea7e36..be3896746a4abc 100644
--- a/packages/react-native/Libraries/NativeAnimation/React-RCTAnimation.podspec
+++ b/packages/react-native/Libraries/NativeAnimation/React-RCTAnimation.podspec
@@ -44,6 +44,8 @@ Pod::Spec.new do |s|
"HEADER_SEARCH_PATHS" => header_search_paths.join(" ")
}
+ s.framework = ["UIKit", "QuartzCore"]
+
s.dependency "RCT-Folly", folly_version
s.dependency "RCTTypeSafety"
s.dependency "React-jsi"
diff --git a/packages/react-native/Libraries/NewAppScreen/components/Header.js b/packages/react-native/Libraries/NewAppScreen/components/Header.js
index 5e44c81a37b4a0..149e464311e629 100644
--- a/packages/react-native/Libraries/NewAppScreen/components/Header.js
+++ b/packages/react-native/Libraries/NewAppScreen/components/Header.js
@@ -42,7 +42,7 @@ const Header = (): Node => {
]}>
Welcome to
{'\n'}
- React Native
+ React Native visionOS
);
@@ -56,7 +56,7 @@ const styles = StyleSheet.create({
},
logo: {
opacity: 0.2,
- overflow: 'visible',
+ overflow: 'hidden',
resizeMode: 'cover',
/*
* These negative margins allow the image to be offset similarly across screen sizes and component sizes.
@@ -65,7 +65,6 @@ const styles = StyleSheet.create({
* source image's size.
*/
marginLeft: -128,
- marginBottom: -192,
},
text: {
fontSize: 40,
diff --git a/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm b/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm
index 86f11c42f60cc4..9ad375fa299621 100644
--- a/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm
+++ b/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm
@@ -510,6 +510,7 @@ - (void)handleRemoteNotificationRegistrationError:(NSNotification *)notification
: (RCTPromiseResolveBlock)resolve reject
: (__unused RCTPromiseRejectBlock)reject)
{
+#if !TARGET_OS_VISION
// The user actioned a local or remote notification to launch the app. Notification is represented by UNNotification.
// Set this property in the implementation of
// userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler.
@@ -529,6 +530,7 @@ - (void)handleRemoteNotificationRegistrationError:(NSNotification *)notification
}
resolve((id)kCFNull);
+#endif
}
RCT_EXPORT_METHOD(getScheduledLocalNotifications : (RCTResponseSenderBlock)callback)
diff --git a/packages/react-native/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec b/packages/react-native/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec
index 7a82e20d911a68..6f274ca83d4dea 100644
--- a/packages/react-native/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec
+++ b/packages/react-native/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec
@@ -44,7 +44,7 @@ Pod::Spec.new do |s|
"CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
"HEADER_SEARCH_PATHS" => header_search_paths.join(' ')
}
- s.framework = "UserNotifications"
+ s.framework = ["UIKit", "UserNotifications"]
s.dependency "RCTTypeSafety"
s.dependency "React-Core/RCTPushNotificationHeaders"
diff --git a/packages/react-native/Libraries/SwiftExtensions/RCTMainWindow.swift b/packages/react-native/Libraries/SwiftExtensions/RCTMainWindow.swift
new file mode 100644
index 00000000000000..415d843c693953
--- /dev/null
+++ b/packages/react-native/Libraries/SwiftExtensions/RCTMainWindow.swift
@@ -0,0 +1,115 @@
+import SwiftUI
+
+/**
+ This SwiftUI struct returns main React Native scene. It should be used only once as it conains setup code.
+
+ Example:
+ ```swift
+ @main
+ struct YourApp: App {
+ @UIApplicationDelegateAdaptor var delegate: AppDelegate
+
+ var body: some Scene {
+ RCTMainWindow(moduleName: "YourApp")
+ }
+ }
+ ```
+
+ Note: If you want to create additional windows in your app, use `RCTWindow()`.
+ */
+public struct RCTMainWindow: Scene {
+ var moduleName: String
+ var initialProps: RCTRootViewRepresentable.InitialPropsType
+ var onOpenURLCallback: ((URL) -> ())?
+ let windowId: String = "0"
+
+ @Environment(\.scenePhase) private var scenePhase
+
+
+ public init(moduleName: String, initialProps: RCTRootViewRepresentable.InitialPropsType = nil) {
+ self.moduleName = moduleName
+ self.initialProps = initialProps
+ }
+
+ public var body: some Scene {
+ WindowGroup {
+ RCTRootViewRepresentable(moduleName: moduleName, initialProps: initialProps)
+ .modifier(WindowHandlingModifier())
+ .onChange(of: scenePhase, { _, newValue in
+ postWindowStateNotification(windowId: windowId, state: newValue)
+ })
+ .onOpenURL(perform: { url in
+ onOpenURLCallback?(url)
+ })
+ }
+ }
+}
+
+public func postWindowStateNotification(windowId: String, state: SwiftUI.ScenePhase) {
+ NotificationCenter.default.post(
+ name: NSNotification.Name(rawValue: "RCTWindowStateDidChange"),
+ object: nil,
+ userInfo: [
+ "windowId": windowId,
+ "state": "\(state)"
+ ]
+ )
+}
+
+extension RCTMainWindow {
+ public func onOpenURL(perform action: @escaping (URL) -> ()) -> some Scene {
+ var scene = self
+ scene.onOpenURLCallback = action
+ return scene
+ }
+}
+
+/**
+ Handles data sharing between React Native and SwiftUI views.
+ */
+public struct WindowHandlingModifier: ViewModifier {
+ typealias UserInfoType = Dictionary
+
+ @Environment(\.reactContext) private var reactContext
+ @Environment(\.openWindow) private var openWindow
+ @Environment(\.dismissWindow) private var dismissWindow
+ @Environment(\.supportsMultipleWindows) private var supportsMultipleWindows
+
+ public init() {}
+
+ public func body(content: Content) -> some View {
+ // Attach listeners only if app supports multiple windows
+ if supportsMultipleWindows {
+ content
+ .onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("RCTOpenWindow"))) { data in
+ guard let id = data.userInfo?["id"] as? String else { return }
+ reactContext.scenes.updateValue(RCTSceneData(id: id, props: data.userInfo?["userInfo"] as? UserInfoType), forKey: id)
+ openWindow(id: id)
+ }
+ .onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("RCTUpdateWindow"))) { data in
+ guard
+ let id = data.userInfo?["id"] as? String,
+ let userInfo = data.userInfo?["userInfo"] as? UserInfoType else { return }
+ reactContext.scenes[id]?.props = userInfo
+ }
+ .onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("RCTDismissWindow"))) { data in
+ guard let id = data.userInfo?["id"] as? String else { return }
+ dismissWindow(id: id)
+ reactContext.scenes.removeValue(forKey: id)
+ }
+ .onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("RCTOpenImmersiveSpace"))) { data in
+ guard let id = data.userInfo?["id"] as? String else { return }
+ reactContext.scenes.updateValue(
+ RCTSceneData(id: id, props: data.userInfo?["userInfo"] as? UserInfoType),
+ forKey: id
+ )
+ }
+ .onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("RCTDismissImmersiveSpace"))) { data in
+ guard let id = data.userInfo?["id"] as? String else { return }
+ reactContext.scenes.removeValue(forKey: id)
+ }
+ } else {
+ content
+ }
+ }
+}
diff --git a/packages/react-native/Libraries/SwiftExtensions/RCTReactContext.swift b/packages/react-native/Libraries/SwiftExtensions/RCTReactContext.swift
new file mode 100644
index 00000000000000..4f5c3b3738b0e7
--- /dev/null
+++ b/packages/react-native/Libraries/SwiftExtensions/RCTReactContext.swift
@@ -0,0 +1,45 @@
+import SwiftUI
+import Observation
+
+@Observable
+public class RCTSceneData: Identifiable {
+ public var id: String
+ public var props: Dictionary?
+
+ init(id: String, props: Dictionary?) {
+ self.id = id
+ self.props = props
+ }
+}
+
+extension RCTSceneData: Equatable {
+ public static func == (lhs: RCTSceneData, rhs: RCTSceneData) -> Bool {
+ lhs.id == rhs.id && NSDictionary(dictionary: lhs.props ?? [:]).isEqual(to: rhs.props ?? [:])
+ }
+}
+
+@Observable
+public class RCTReactContext {
+ public var scenes: Dictionary = [:]
+
+ public func getSceneData(id: String) -> RCTSceneData? {
+ return scenes[id]
+ }
+}
+
+extension RCTReactContext: Equatable {
+ public static func == (lhs: RCTReactContext, rhs: RCTReactContext) -> Bool {
+ NSDictionary(dictionary: lhs.scenes).isEqual(to: rhs.scenes)
+ }
+}
+
+public extension EnvironmentValues {
+ var reactContext: RCTReactContext {
+ get { self[RCTSceneContextKey.self] }
+ set { self[RCTSceneContextKey.self] = newValue }
+ }
+}
+
+private struct RCTSceneContextKey: EnvironmentKey {
+ static var defaultValue: RCTReactContext = RCTReactContext()
+}
diff --git a/packages/react-native/Libraries/SwiftExtensions/RCTReactViewController.h b/packages/react-native/Libraries/SwiftExtensions/RCTReactViewController.h
new file mode 100644
index 00000000000000..aa77150ce21c92
--- /dev/null
+++ b/packages/react-native/Libraries/SwiftExtensions/RCTReactViewController.h
@@ -0,0 +1,18 @@
+#import
+
+/**
+ A `UIViewController` responsible for embeding `RCTRootView` inside. Uses Factory pattern to retrive new view instances.
+
+ Note: Used to in `RCTRootViewRepresentable` to display React views.
+ */
+@interface RCTReactViewController : UIViewController
+
+@property (nonatomic, strong, nonnull) NSString *moduleName;
+@property (nonatomic, strong, nullable) NSDictionary *initialProps;
+
+- (instancetype _Nonnull)initWithModuleName:(NSString *_Nonnull)moduleName
+ initProps:(NSDictionary *_Nullable)initProps;
+
+-(void)updateProps:(NSDictionary *_Nullable)newProps;
+
+@end
diff --git a/packages/react-native/Libraries/SwiftExtensions/RCTReactViewController.m b/packages/react-native/Libraries/SwiftExtensions/RCTReactViewController.m
new file mode 100644
index 00000000000000..e051b6a1aabe48
--- /dev/null
+++ b/packages/react-native/Libraries/SwiftExtensions/RCTReactViewController.m
@@ -0,0 +1,71 @@
+#import "RCTReactViewController.h"
+#import
+#import
+#import
+#import
+
+@protocol RCTRootViewFactoryProtocol
+
+- (UIView *)viewWithModuleName:(NSString *)moduleName initialProperties:(NSDictionary*)initialProperties launchOptions:(NSDictionary*)launchOptions;
+
+@end
+
+@protocol RCTFocusedWindowProtocol
+
+@property (nonatomic, nullable) UIWindow *lastFocusedWindow;
+
+@end
+
+@implementation RCTReactViewController
+
+- (instancetype)initWithModuleName:(NSString *)moduleName initProps:(NSDictionary *)initProps {
+ if (self = [super init]) {
+ _moduleName = moduleName;
+ _initialProps = initProps;
+ }
+ return self;
+}
+
+- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator {
+ [[NSNotificationCenter defaultCenter] postNotificationName:RCTWindowFrameDidChangeNotification object:self];
+}
+
+- (void)loadView {
+ RCTAppDelegate * appDelegate = (RCTAppDelegate *)[UIApplication sharedApplication].delegate;
+ if ([appDelegate respondsToSelector:@selector(rootViewFactory)]) {
+ self.view = [appDelegate.rootViewFactory viewWithModuleName:_moduleName initialProperties:_initialProps];
+ } else {
+ [NSException raise:@"UIApplicationDelegate:viewWithModuleName:initialProperties:launchOptions: not implemented"
+ format:@"Make sure you subclass RCTAppDelegate"];
+ }
+}
+
+- (void)viewDidLoad {
+ UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
+ [self.view addGestureRecognizer:tapGesture];
+}
+
+- (void)tapGesture:(UITapGestureRecognizer*)recognizer {
+ id appDelegate = (id)RCTSharedApplication().delegate;
+
+ if (![appDelegate respondsToSelector:@selector(lastFocusedWindow)]) {
+ return;
+ }
+
+ UIWindow *targetWindow = recognizer.view.window;
+ if (targetWindow != appDelegate.lastFocusedWindow) {
+ appDelegate.lastFocusedWindow = targetWindow;
+ }
+}
+
+- (void)updateProps:(NSDictionary *)newProps {
+ RCTRootView *rootView = (RCTRootView *)self.view;
+ if (rootView.appProperties == newProps) {
+ return;
+ }
+
+ if (newProps != nil && ![rootView.appProperties isEqualToDictionary:newProps]) {
+ [rootView setAppProperties:newProps];
+ }
+}
+@end
diff --git a/packages/react-native/Libraries/SwiftExtensions/RCTRootViewRepresentable.swift b/packages/react-native/Libraries/SwiftExtensions/RCTRootViewRepresentable.swift
new file mode 100644
index 00000000000000..8a839541ebb8ea
--- /dev/null
+++ b/packages/react-native/Libraries/SwiftExtensions/RCTRootViewRepresentable.swift
@@ -0,0 +1,32 @@
+import SwiftUI
+
+/**
+ SwiftUI view enclosing `RCTReactViewController`. Its main purpose is to display React Native views inside of SwiftUI lifecycle.
+
+ Use it create new windows in your app:
+ Example:
+ ```swift
+ WindowGroup {
+ RCTRootViewRepresentable(moduleName: "YourAppName")
+ }
+ ```
+*/
+public struct RCTRootViewRepresentable: UIViewControllerRepresentable {
+ public typealias InitialPropsType = [AnyHashable: Any]?
+
+ var moduleName: String
+ var initialProps: InitialPropsType
+
+ public init(moduleName: String, initialProps: InitialPropsType = nil) {
+ self.moduleName = moduleName
+ self.initialProps = initialProps
+ }
+
+ public func makeUIViewController(context: Context) -> RCTReactViewController {
+ RCTReactViewController(moduleName: moduleName, initProps: initialProps)
+ }
+
+ public func updateUIViewController(_ uiViewController: RCTReactViewController, context: Context) {
+ uiViewController.updateProps(initialProps)
+ }
+}
diff --git a/packages/react-native/Libraries/SwiftExtensions/RCTWindow.swift b/packages/react-native/Libraries/SwiftExtensions/RCTWindow.swift
new file mode 100644
index 00000000000000..bed6245877a6fe
--- /dev/null
+++ b/packages/react-native/Libraries/SwiftExtensions/RCTWindow.swift
@@ -0,0 +1,50 @@
+import SwiftUI
+import React
+
+/**
+ `RCTWindow` is a SwiftUI struct that returns additional scenes.
+
+ Example usage:
+ ```
+ RCTWindow(id: "SecondWindow", sceneData: reactContext.getSceneData(id: "SecondWindow"))
+ ```
+ */
+public struct RCTWindow : Scene {
+ var id: String
+ var sceneData: RCTSceneData?
+ var moduleName: String
+ @Environment(\.scenePhase) private var scenePhase
+
+
+ public init(id: String, moduleName: String, sceneData: RCTSceneData?) {
+ self.id = id
+ self.moduleName = moduleName
+ self.sceneData = sceneData
+ }
+
+ public var body: some Scene {
+ WindowGroup(id: id) {
+ Group {
+ if let sceneData {
+ RCTRootViewRepresentable(moduleName: moduleName, initialProps: sceneData.props)
+ .onChange(of: scenePhase) { _, newValue in
+ postWindowStateNotification(windowId: id, state: newValue)
+ }
+ }
+ }
+ .onAppear {
+ if sceneData == nil {
+ RCTFatal(RCTErrorWithMessage("Passed scene data is nil, make sure to pass sceneContext to RCTWindow() in App.swift"))
+ }
+ }
+ }
+ }
+}
+
+extension RCTWindow {
+ public init(id: String, sceneData: RCTSceneData?) {
+ self.id = id
+ self.moduleName = id
+ self.sceneData = sceneData
+ }
+}
diff --git a/packages/react-native/Libraries/SwiftExtensions/React-RCTSwiftExtensions.podspec b/packages/react-native/Libraries/SwiftExtensions/React-RCTSwiftExtensions.podspec
new file mode 100644
index 00000000000000..9d61b8e4cf31c3
--- /dev/null
+++ b/packages/react-native/Libraries/SwiftExtensions/React-RCTSwiftExtensions.podspec
@@ -0,0 +1,29 @@
+require "json"
+
+package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
+version = package['version']
+
+source = { :git => 'https://github.com/facebook/react-native.git' }
+if version == '1000.0.0'
+ # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
+ source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
+else
+ source[:tag] = "v#{version}"
+end
+
+Pod::Spec.new do |s|
+ s.name = "React-RCTSwiftExtensions"
+ s.version = version
+ s.summary = "A library for easier React Native integration with SwiftUI."
+ s.homepage = "https://reactnative.dev/"
+ s.license = package["license"]
+ s.author = "Callstack"
+ s.platforms = min_supported_versions
+ s.source = source
+ s.source_files = "*.{swift,h,m}"
+ s.frameworks = ["UIKit", "SwiftUI"]
+
+ s.dependency "React-Core"
+ s.dependency "React-RCTXR"
+ s.dependency "React-RCTWindowManager"
+end
diff --git a/packages/react-native/Libraries/Text/Text/RCTTextView.mm b/packages/react-native/Libraries/Text/Text/RCTTextView.mm
index 47632aa885cdb3..c68f1d706a6be4 100644
--- a/packages/react-native/Libraries/Text/Text/RCTTextView.mm
+++ b/packages/react-native/Libraries/Text/Text/RCTTextView.mm
@@ -247,6 +247,7 @@ - (void)handleLongPress:(UILongPressGestureRecognizer *)gesture
[_editMenuInteraction presentEditMenuWithConfiguration:config];
}
} else {
+#if !TARGET_OS_VISION
UIMenuController *menuController = [UIMenuController sharedMenuController];
if (menuController.isMenuVisible) {
@@ -254,6 +255,7 @@ - (void)handleLongPress:(UILongPressGestureRecognizer *)gesture
}
[menuController showMenuFromView:self rect:self.bounds];
+#endif
}
}
diff --git a/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm b/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm
index 20b953520b6e92..ef13e1d6a223ac 100644
--- a/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm
+++ b/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm
@@ -629,6 +629,7 @@ - (void)didSetProps:(NSArray *)changedProps
- (void)setCustomInputAccessoryViewWithNativeID:(NSString *)nativeID
{
+#if !TARGET_OS_VISION
__weak RCTBaseTextInputView *weakSelf = self;
[_bridge.uiManager rootViewForReactTag:self.reactTag
withCompletion:^(UIView *rootView) {
@@ -643,10 +644,12 @@ - (void)setCustomInputAccessoryViewWithNativeID:(NSString *)nativeID
}
}
}];
+#endif
}
- (void)setDefaultInputAccessoryView
{
+#if !TARGET_OS_VISION
UIView *textInputView = self.backedTextInputView;
UIKeyboardType keyboardType = textInputView.keyboardType;
@@ -678,6 +681,7 @@ - (void)setDefaultInputAccessoryView
textInputView.inputAccessoryView = nil;
}
[self reloadInputViewsIfNecessary];
+#endif
}
- (void)reloadInputViewsIfNecessary
diff --git a/packages/react-native/Libraries/WindowManager/NativeWindowManager.js b/packages/react-native/Libraries/WindowManager/NativeWindowManager.js
new file mode 100644
index 00000000000000..a1904df0228866
--- /dev/null
+++ b/packages/react-native/Libraries/WindowManager/NativeWindowManager.js
@@ -0,0 +1,8 @@
+/**
+ * @flow strict
+ * @format
+ */
+
+export * from '../../src/private/specs/visionos_modules/NativeWindowManager';
+import NativeWindowManager from '../../src/private/specs/visionos_modules/NativeWindowManager';
+export default NativeWindowManager;
diff --git a/packages/react-native/Libraries/WindowManager/RCTWindowManager.h b/packages/react-native/Libraries/WindowManager/RCTWindowManager.h
new file mode 100644
index 00000000000000..1e1bf4dd95e7c8
--- /dev/null
+++ b/packages/react-native/Libraries/WindowManager/RCTWindowManager.h
@@ -0,0 +1,7 @@
+#import
+#import
+#import
+
+@interface RCTWindowManager : RCTEventEmitter
+
+@end
diff --git a/packages/react-native/Libraries/WindowManager/RCTWindowManager.mm b/packages/react-native/Libraries/WindowManager/RCTWindowManager.mm
new file mode 100644
index 00000000000000..3f101782044bf5
--- /dev/null
+++ b/packages/react-native/Libraries/WindowManager/RCTWindowManager.mm
@@ -0,0 +1,137 @@
+#import
+
+#import
+
+#import
+#import
+#import
+
+// Events
+static NSString *const RCTOpenWindow = @"RCTOpenWindow";
+static NSString *const RCTDismissWindow = @"RCTDismissWindow";
+static NSString *const RCTUpdateWindow = @"RCTUpdateWindow";
+static NSString *const RCTWindowStateDidChangeEvent = @"windowStateDidChange";
+
+static NSString *const RCTWindowStateDidChange = @"RCTWindowStateDidChange";
+
+@interface RCTWindowManager () {
+ BOOL _hasAnyListeners;
+}
+@end
+
+@implementation RCTWindowManager
+
+RCT_EXPORT_MODULE(WindowManager)
+
+- (void)initialize {
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(handleWindowStateChanges:)
+ name:RCTWindowStateDidChange
+ object:nil];
+}
+
+- (void)invalidate {
+ [super invalidate];
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+-(void)startObserving
+{
+ _hasAnyListeners = YES;
+}
+
+- (void)stopObserving
+{
+ _hasAnyListeners = NO;
+}
+
+RCT_EXPORT_METHOD(openWindow
+ : (NSString *)windowId userInfo
+ : (NSDictionary *)userInfo resolve
+ : (RCTPromiseResolveBlock)resolve reject
+ : (RCTPromiseRejectBlock)reject)
+{
+ RCTExecuteOnMainQueue(^{
+ if (!RCTSharedApplication().supportsMultipleScenes) {
+ reject(@"ERROR", @"Multiple scenes not supported", nil);
+ }
+ NSMutableDictionary *userInfoDict = [[NSMutableDictionary alloc] init];
+ [userInfoDict setValue:windowId forKey:@"id"];
+ if (userInfo != nil) {
+ [userInfoDict setValue:userInfo forKey:@"userInfo"];
+ }
+ [[NSNotificationCenter defaultCenter] postNotificationName:RCTOpenWindow object:self userInfo:userInfoDict];
+ resolve(nil);
+ });
+}
+
+RCT_EXPORT_METHOD(closeWindow
+ : (NSString *)windowId resolve
+ : (RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
+{
+ RCTExecuteOnMainQueue(^{
+ [[NSNotificationCenter defaultCenter] postNotificationName:RCTDismissWindow object:self userInfo:@{@"id": windowId}];
+ resolve(nil);
+ });
+}
+
+RCT_EXPORT_METHOD(updateWindow
+ : (NSString *)windowId userInfo
+ : (NSDictionary *)userInfo resolve
+ : (RCTPromiseResolveBlock)resolve reject
+ : (RCTPromiseRejectBlock)reject)
+{
+ RCTExecuteOnMainQueue(^{
+ if (!RCTSharedApplication().supportsMultipleScenes) {
+ reject(@"ERROR", @"Multiple scenes not supported", nil);
+ }
+ NSMutableDictionary *userInfoDict = [[NSMutableDictionary alloc] init];
+ [userInfoDict setValue:windowId forKey:@"id"];
+ if (userInfo != nil) {
+ [userInfoDict setValue:userInfo forKey:@"userInfo"];
+ }
+ [[NSNotificationCenter defaultCenter] postNotificationName:RCTUpdateWindow object:self userInfo:userInfoDict];
+ resolve(nil);
+ });
+}
+
+- (void) handleWindowStateChanges:(NSNotification *)notification {
+
+ if (_hasAnyListeners) {
+ [self sendEventWithName:RCTWindowStateDidChangeEvent body:notification.userInfo];
+ }
+}
+
+- (NSArray *)supportedEvents {
+ return @[RCTWindowStateDidChangeEvent];
+}
+
+- (facebook::react::ModuleConstants)constantsToExport {
+ return [self getConstants];
+}
+
+- (facebook::react::ModuleConstants)getConstants {
+ __block facebook::react::ModuleConstants constants;
+ RCTUnsafeExecuteOnMainQueueSync(^{
+ constants = facebook::react::typedConstants({
+ .supportsMultipleScenes = RCTSharedApplication().supportsMultipleScenes
+ });
+ });
+
+ return constants;
+}
+
+- (std::shared_ptr)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
+ return std::make_shared(params);
+}
+
++ (BOOL)requiresMainQueueSetup {
+ return YES;
+}
+
+- (dispatch_queue_t)methodQueue
+{
+ return dispatch_get_main_queue();
+}
+
+@end
diff --git a/packages/react-native/Libraries/WindowManager/React-RCTWindowManager.podspec b/packages/react-native/Libraries/WindowManager/React-RCTWindowManager.podspec
new file mode 100644
index 00000000000000..10dffa748f7e15
--- /dev/null
+++ b/packages/react-native/Libraries/WindowManager/React-RCTWindowManager.podspec
@@ -0,0 +1,51 @@
+require "json"
+
+package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
+version = package['version']
+
+source = { :git => 'https://github.com/facebook/react-native.git' }
+if version == '1000.0.0'
+ # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
+ source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
+else
+ source[:tag] = "v#{version}"
+end
+
+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}/Headers/Public/React_Codegen/react/renderer/components\"",
+]
+
+Pod::Spec.new do |s|
+ s.name = "React-RCTWindowManager"
+ s.version = version
+ s.summary = "Window manager module for React Native."
+ s.homepage = "https://callstack.github.io/react-native-visionos-docs"
+ s.documentation_url = "https://callstack.github.io/react-native-visionos-docs/api/windowmanager"
+ s.license = package["license"]
+ s.author = "Callstack"
+ s.platforms = min_supported_versions
+ s.compiler_flags = folly_compiler_flags + ' -Wno-nullability-completeness'
+ s.source = source
+ s.source_files = "*.{m,mm,swift}"
+ s.preserve_paths = "package.json", "LICENSE", "LICENSE-docs"
+ s.header_dir = "RCTWindowManager"
+ s.pod_target_xcconfig = {
+ "USE_HEADERMAP" => "YES",
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
+ "HEADER_SEARCH_PATHS" => header_search_paths.join(' ')
+ }
+
+ s.dependency "RCT-Folly", folly_version
+ s.dependency "RCTTypeSafety"
+ s.dependency "React-jsi"
+ s.dependency "React-Core/RCTWindowManagerHeaders"
+
+ add_dependency(s, "ReactCodegen", :additional_framework_paths => ["build/generated/ios"])
+ add_dependency(s, "ReactCommon", :subspec => "turbomodule/core", :additional_framework_paths => ["react/nativemodule/core"])
+ add_dependency(s, "React-NativeModulesApple", :additional_framework_paths => ["build/generated/ios"])
+end
diff --git a/packages/react-native/Libraries/WindowManager/WindowManager.d.ts b/packages/react-native/Libraries/WindowManager/WindowManager.d.ts
new file mode 100644
index 00000000000000..b77d7ff695d1b7
--- /dev/null
+++ b/packages/react-native/Libraries/WindowManager/WindowManager.d.ts
@@ -0,0 +1,26 @@
+import {NativeEventSubscription} from '../EventEmitter/RCTNativeAppEventEmitter';
+
+type WindowManagerEvents = 'windowStateDidChange';
+
+type WindowState = {
+ windowId: string;
+ state: 'active' | 'inactive' | 'background';
+};
+
+export interface WindowStatic {
+ id: String;
+ open (props?: Object): Promise;
+ update (props: Object): Promise;
+ close (): Promise;
+ addEventListener (type: WindowManagerEvents, handler: (info: WindowState) => void): NativeEventSubscription;
+}
+
+export interface WindowManagerStatic {
+ getWindow(id: String): Window;
+ supportsMultipleScenes: boolean;
+}
+
+export const WindowManager: WindowManagerStatic;
+export type WindowManager = WindowManagerStatic;
+export const Window: WindowStatic;
+export type Window = WindowStatic;
diff --git a/packages/react-native/Libraries/WindowManager/WindowManager.js b/packages/react-native/Libraries/WindowManager/WindowManager.js
new file mode 100644
index 00000000000000..8eb113cce66a79
--- /dev/null
+++ b/packages/react-native/Libraries/WindowManager/WindowManager.js
@@ -0,0 +1,87 @@
+/**
+ * @format
+ * @flow strict-local
+ * @jsdoc
+ */
+
+import NativeEventEmitter from '../EventEmitter/NativeEventEmitter';
+import Platform from '../Utilities/Platform';
+import {type EventSubscription} from '../vendor/emitter/EventEmitter';
+import NativeWindowManager from './NativeWindowManager';
+
+export type WindowStateValues = 'inactive' | 'background' | 'active';
+
+type WindowManagerEventDefinitions = {
+ windowStateDidChange: [{state: WindowStateValues, windowId: string}],
+};
+
+let emitter: ?NativeEventEmitter;
+
+if (NativeWindowManager != null) {
+ emitter = new NativeEventEmitter(
+ Platform.OS !== 'ios' ? null : NativeWindowManager,
+ );
+}
+
+class WindowManager {
+ static getWindow = function (id: string): Window {
+ return new Window(id);
+ };
+
+ static addEventListener>(
+ type: K,
+ handler: (...$ElementType) => void,
+ ): ?EventSubscription {
+ return emitter?.addListener(type, handler);
+ }
+
+ // $FlowIgnore[unsafe-getters-setters]
+ static get supportsMultipleScenes(): boolean {
+ if (NativeWindowManager == null) {
+ return false;
+ }
+
+ const nativeConstants = NativeWindowManager.getConstants();
+ return nativeConstants.supportsMultipleScenes || false;
+ }
+}
+
+class Window {
+ id: string;
+
+ constructor(id: string) {
+ this.id = id;
+ }
+
+ // $FlowIgnore[unclear-type]
+ open(props: ?Object): Promise {
+ if (NativeWindowManager != null && NativeWindowManager.openWindow != null) {
+ return NativeWindowManager.openWindow(this.id, props);
+ }
+ return Promise.reject(new Error('NativeWindowManager is not available'));
+ }
+
+ // $FlowIgnore[unclear-type]
+ close(): Promise {
+ if (
+ NativeWindowManager != null &&
+ NativeWindowManager.closeWindow != null
+ ) {
+ return NativeWindowManager.closeWindow(this.id);
+ }
+ return Promise.reject(new Error('NativeWindowManager is not available'));
+ }
+
+ // $FlowIgnore[unclear-type]
+ update(props: ?Object): Promise {
+ if (
+ NativeWindowManager != null &&
+ NativeWindowManager.updateWindow != null
+ ) {
+ return NativeWindowManager.updateWindow(this.id, props);
+ }
+ return Promise.reject(new Error('NativeWindowManager is not available'));
+ }
+}
+
+module.exports = WindowManager;
diff --git a/packages/react-native/Libraries/XR/ImmersiveBridge.swift b/packages/react-native/Libraries/XR/ImmersiveBridge.swift
new file mode 100644
index 00000000000000..43bdfe5b170739
--- /dev/null
+++ b/packages/react-native/Libraries/XR/ImmersiveBridge.swift
@@ -0,0 +1,61 @@
+import Foundation
+import SwiftUI
+
+@objc public enum ImmersiveSpaceResult: Int {
+ case opened
+ case userCancelled
+ case error
+}
+
+public typealias CompletionHandlerType = (_ result: ImmersiveSpaceResult) -> Void
+
+#if os(visionOS)
+/**
+ * Utility view used to bridge the gap between SwiftUI environment and UIKit.
+ *
+ * Calls `openImmersiveSpace` when view appears in the UIKit hierarchy and `dismissImmersiveSpace` when removed.
+ */
+struct ImmersiveBridgeView: View {
+ @Environment(\.openImmersiveSpace) private var openImmersiveSpace
+ @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace
+
+ var spaceId: String
+ var completionHandler: CompletionHandlerType
+
+ var body: some View {
+ EmptyView()
+ .onAppear {
+ Task {
+ let result = await openImmersiveSpace(id: spaceId)
+
+ switch result {
+ case .opened:
+ completionHandler(.opened)
+ case .error:
+ completionHandler(.error)
+ case .userCancelled:
+ completionHandler(.userCancelled)
+ default:
+ break
+ }
+ }
+ }
+ .onDisappear {
+ Task { await dismissImmersiveSpace() }
+ }
+ }
+}
+#endif
+
+@objc public class SwiftUIBridgeFactory: NSObject {
+ @objc public static func makeImmersiveBridgeView(
+ spaceId: String,
+ completionHandler: @escaping CompletionHandlerType
+ ) -> UIViewController {
+#if os(visionOS)
+ return UIHostingController(rootView: ImmersiveBridgeView(spaceId: spaceId, completionHandler: completionHandler))
+#else
+ return UIViewController()
+#endif
+ }
+}
diff --git a/packages/react-native/Libraries/XR/NativeXRModule.js b/packages/react-native/Libraries/XR/NativeXRModule.js
new file mode 100644
index 00000000000000..c34b296bc3e4a5
--- /dev/null
+++ b/packages/react-native/Libraries/XR/NativeXRModule.js
@@ -0,0 +1,8 @@
+/**
+ * @flow strict
+ * @format
+ */
+
+export * from '../../src/private/specs/visionos_modules/NativeXRModule';
+import NativeXRModule from '../../src/private/specs/visionos_modules/NativeXRModule';
+export default NativeXRModule;
diff --git a/packages/react-native/Libraries/XR/RCTXRModule.h b/packages/react-native/Libraries/XR/RCTXRModule.h
new file mode 100644
index 00000000000000..450d8ad4681619
--- /dev/null
+++ b/packages/react-native/Libraries/XR/RCTXRModule.h
@@ -0,0 +1,6 @@
+#import
+#import
+
+@interface RCTXRModule : NSObject
+
+@end
diff --git a/packages/react-native/Libraries/XR/RCTXRModule.mm b/packages/react-native/Libraries/XR/RCTXRModule.mm
new file mode 100644
index 00000000000000..f0c600b3a09c99
--- /dev/null
+++ b/packages/react-native/Libraries/XR/RCTXRModule.mm
@@ -0,0 +1,101 @@
+#import
+
+#import
+
+#import
+#import
+#import
+#import "RCTXR-Swift.h"
+
+// Events
+static NSString *const RCTOpenImmersiveSpace = @"RCTOpenImmersiveSpace";
+static NSString *const RCTDismissImmersiveSpace = @"RCTDismissImmersiveSpace";
+
+@interface RCTXRModule ()
+@end
+
+@implementation RCTXRModule {
+ UIViewController *_immersiveBridgeView;
+ NSString *_currentSessionId;
+}
+
+RCT_EXPORT_MODULE()
+
+RCT_EXPORT_METHOD(endSession
+ : (RCTPromiseResolveBlock)resolve reject
+ : (RCTPromiseRejectBlock)reject)
+{
+ [self removeViewController:self->_immersiveBridgeView];
+ self->_immersiveBridgeView = nil;
+ RCTExecuteOnMainQueue(^{
+ if (self->_currentSessionId != nil) {
+ [[NSNotificationCenter defaultCenter] postNotificationName:RCTDismissImmersiveSpace object:self userInfo:@{@"id": self->_currentSessionId}];
+ }
+ });
+ _currentSessionId = nil;
+ resolve(nil);
+}
+
+
+RCT_EXPORT_METHOD(requestSession
+ : (NSString *)sessionId userInfo
+ : (NSDictionary *)userInfo resolve
+ : (RCTPromiseResolveBlock)resolve reject
+ : (RCTPromiseRejectBlock)reject)
+{
+ RCTExecuteOnMainQueue(^{
+ if (!RCTSharedApplication().supportsMultipleScenes) {
+ reject(@"ERROR", @"Multiple scenes not supported", nil);
+ }
+ UIWindow *keyWindow = RCTKeyWindow();
+ UIViewController *rootViewController = keyWindow.rootViewController;
+
+ if (self->_immersiveBridgeView == nil) {
+ NSMutableDictionary *userInfoDict = [[NSMutableDictionary alloc] init];
+ [userInfoDict setValue:sessionId forKey:@"id"];
+ if (userInfo != nil) {
+ [userInfoDict setValue:userInfo forKey:@"userInfo"];
+ }
+ NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
+ [notificationCenter postNotificationName:RCTOpenImmersiveSpace object:self userInfo:userInfoDict];
+ self->_currentSessionId = sessionId;
+
+ self->_immersiveBridgeView = [SwiftUIBridgeFactory makeImmersiveBridgeViewWithSpaceId:sessionId
+ completionHandler:^(enum ImmersiveSpaceResult result){
+ if (result == ImmersiveSpaceResultError) {
+ reject(@"ERROR", @"Immersive Space failed to open, the system cannot fulfill the request.", nil);
+ [self removeViewController:self->_immersiveBridgeView];
+ self->_immersiveBridgeView = nil;
+ } else if (result == ImmersiveSpaceResultUserCancelled) {
+ reject(@"ERROR", @"Immersive Space canceled by user", nil);
+ [self removeViewController:self->_immersiveBridgeView];
+ self->_immersiveBridgeView = nil;
+ } else if (result == ImmersiveSpaceResultOpened) {
+ resolve(nil);
+ }
+ }];
+
+ [rootViewController.view addSubview:self->_immersiveBridgeView.view];
+ [rootViewController addChildViewController:self->_immersiveBridgeView];
+ [self->_immersiveBridgeView didMoveToParentViewController:rootViewController];
+ } else {
+ reject(@"ERROR", @"Immersive Space already opened", nil);
+ }
+ });
+}
+
+
+- (void)removeViewController:(UIViewController*)viewController
+{
+ RCTExecuteOnMainQueue(^{
+ [viewController willMoveToParentViewController:nil];
+ [viewController.view removeFromSuperview];
+ [viewController removeFromParentViewController];
+ });
+}
+
+- (std::shared_ptr)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
+ return std::make_shared(params);
+}
+
+@end
diff --git a/packages/react-native/Libraries/XR/React-RCTXR.podspec b/packages/react-native/Libraries/XR/React-RCTXR.podspec
new file mode 100644
index 00000000000000..23fc4ba7c2f481
--- /dev/null
+++ b/packages/react-native/Libraries/XR/React-RCTXR.podspec
@@ -0,0 +1,51 @@
+require "json"
+
+package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
+version = package['version']
+
+source = { :git => 'https://github.com/facebook/react-native.git' }
+if version == '1000.0.0'
+ # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
+ source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
+else
+ source[:tag] = "v#{version}"
+end
+
+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}/Headers/Public/React_Codegen/react/renderer/components\"",
+]
+
+Pod::Spec.new do |s|
+ s.name = "React-RCTXR"
+ s.version = version
+ s.summary = "XR module for React Native."
+ s.homepage = "https://callstack.github.io/react-native-visionos-docs/"
+ s.documentation_url = "https://callstack.github.io/react-native-visionos-docs/api/XR"
+ s.license = package["license"]
+ s.author = "Callstack"
+ s.platforms = min_supported_versions
+ s.compiler_flags = folly_compiler_flags + ' -Wno-nullability-completeness'
+ s.source = source
+ s.source_files = "*.{m,mm,swift}"
+ s.preserve_paths = "package.json", "LICENSE", "LICENSE-docs"
+ s.header_dir = "RCTXR"
+ s.pod_target_xcconfig = {
+ "USE_HEADERMAP" => "YES",
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
+ "HEADER_SEARCH_PATHS" => header_search_paths.join(' ')
+ }
+
+ s.dependency "RCT-Folly", folly_version
+ s.dependency "RCTTypeSafety"
+ s.dependency "React-jsi"
+ s.dependency "React-Core/RCTXRHeaders"
+
+ add_dependency(s, "ReactCodegen", :additional_framework_paths => ["build/generated/ios"])
+ add_dependency(s, "ReactCommon", :subspec => "turbomodule/core", :additional_framework_paths => ["react/nativemodule/core"])
+ add_dependency(s, "React-NativeModulesApple", :additional_framework_paths => ["build/generated/ios"])
+end
diff --git a/packages/react-native/Libraries/XR/XR.d.ts b/packages/react-native/Libraries/XR/XR.d.ts
new file mode 100644
index 00000000000000..293a97bb084c3e
--- /dev/null
+++ b/packages/react-native/Libraries/XR/XR.d.ts
@@ -0,0 +1,8 @@
+
+export interface XRStatic {
+ requestSession(sessionId: string, userInfo: Object): Promise;
+ endSession(): Promise;
+}
+
+export const XR: XRStatic;
+export type XR = XRStatic;
diff --git a/packages/react-native/Libraries/XR/XR.js b/packages/react-native/Libraries/XR/XR.js
new file mode 100644
index 00000000000000..923a3184c71dea
--- /dev/null
+++ b/packages/react-native/Libraries/XR/XR.js
@@ -0,0 +1,25 @@
+/**
+ * @format
+ * @flow strict
+ * @jsdoc
+ */
+
+import NativeXRModule from './NativeXRModule';
+
+const XR = {
+ // $FlowIgnore[unclear-type]
+ requestSession: (sessionId: string, userInfo: ?Object): Promise => {
+ if (NativeXRModule != null && NativeXRModule.requestSession != null) {
+ return NativeXRModule.requestSession(sessionId, userInfo);
+ }
+ return Promise.reject(new Error('NativeXRModule is not available'));
+ },
+ endSession: (): Promise => {
+ if (NativeXRModule != null && NativeXRModule.endSession != null) {
+ return NativeXRModule.endSession();
+ }
+ return Promise.reject(new Error('NativeXRModule is not available'));
+ },
+};
+
+module.exports = XR;
diff --git a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap
index 86f5dac239ce2e..059d2afa252784 100644
--- a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap
+++ b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap
@@ -9028,6 +9028,44 @@ exports[`public API should not change unintentionally Libraries/WebSocket/WebSoc
exports[`public API should not change unintentionally Libraries/WebSocket/WebSocketInterceptor.js 1`] = `"UNTYPED MODULE"`;
+exports[`public API should not change unintentionally Libraries/WindowManager/NativeWindowManager.js 1`] = `
+"export * from \\"../../src/private/specs/visionos_modules/NativeWindowManager\\";
+declare export default typeof NativeWindowManager;
+"
+`;
+
+exports[`public API should not change unintentionally Libraries/WindowManager/WindowManager.js 1`] = `
+"export type WindowStateValues = \\"inactive\\" | \\"background\\" | \\"active\\";
+type WindowManagerEventDefinitions = {
+ windowStateDidChange: [{ state: WindowStateValues, windowId: string }],
+};
+declare class WindowManager {
+ static getWindow: $FlowFixMe;
+ static addEventListener>(
+ type: K,
+ handler: (...$ElementType) => void
+ ): ?EventSubscription;
+ static get supportsMultipleScenes(): boolean;
+}
+declare module.exports: WindowManager;
+"
+`;
+
+exports[`public API should not change unintentionally Libraries/XR/NativeXRModule.js 1`] = `
+"export * from \\"../../src/private/specs/visionos_modules/NativeXRModule\\";
+declare export default typeof NativeXRModule;
+"
+`;
+
+exports[`public API should not change unintentionally Libraries/XR/XR.js 1`] = `
+"declare const XR: {
+ requestSession: (sessionId: string, userInfo: ?Object) => Promise,
+ endSession: () => Promise,
+};
+declare module.exports: XR;
+"
+`;
+
exports[`public API should not change unintentionally Libraries/YellowBox/YellowBoxDeprecated.js 1`] = `
"declare const React: $FlowFixMe;
type Props = $ReadOnly<{||}>;
@@ -9146,6 +9184,8 @@ declare module.exports: {
get PushNotificationIOS(): PushNotificationIOS,
get Settings(): Settings,
get Share(): Share,
+ get XR(): XR,
+ get WindowManager(): WindowManager,
get StyleSheet(): StyleSheet,
get Systrace(): Systrace,
get ToastAndroid(): ToastAndroid,
diff --git a/packages/react-native/React-Core.podspec b/packages/react-native/React-Core.podspec
index 45ddb79f5c79cb..bdb8138dd1f4a4 100644
--- a/packages/react-native/React-Core.podspec
+++ b/packages/react-native/React-Core.podspec
@@ -19,7 +19,7 @@ end
folly_config = get_folly_config()
folly_compiler_flags = folly_config[:compiler_flags]
folly_version = folly_config[:version]
-socket_rocket_version = '0.7.0'
+socket_rocket_version = '0.7.0.1'
boost_compiler_flags = '-Wno-documentation'
use_hermes = ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == '1'
@@ -37,6 +37,8 @@ header_subspecs = {
'RCTSettingsHeaders' => 'Libraries/Settings/*.h',
'RCTTextHeaders' => 'Libraries/Text/**/*.h',
'RCTVibrationHeaders' => 'Libraries/Vibration/*.h',
+ 'RCTXRHeaders' => 'Libraries/XR/*.h',
+ 'RCTWindowManagerHeaders' => 'Libraries/WindowManager/*.h',
}
frameworks_search_paths = []
diff --git a/packages/react-native/React.podspec b/packages/react-native/React.podspec
index 59b9f8319ae306..50397b11182021 100644
--- a/packages/react-native/React.podspec
+++ b/packages/react-native/React.podspec
@@ -53,4 +53,6 @@ Pod::Spec.new do |s|
s.dependency "React-RCTSettings", version
s.dependency "React-RCTText", version
s.dependency "React-RCTVibration", version
+ s.dependency "React-RCTXR", version
+ s.dependency "React-RCTWindowManager", version
end
diff --git a/packages/react-native/React/Base/RCTBundleURLProvider.mm b/packages/react-native/React/Base/RCTBundleURLProvider.mm
index 8c32440fc7f741..fd9531ffd0033d 100644
--- a/packages/react-native/React/Base/RCTBundleURLProvider.mm
+++ b/packages/react-native/React/Base/RCTBundleURLProvider.mm
@@ -276,6 +276,9 @@ + (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot
BOOL lazy = enableDev;
NSArray *queryItems = @[
[[NSURLQueryItem alloc] initWithName:@"platform" value:RCTPlatformName],
+#if TARGET_OS_VISION
+ [[NSURLQueryItem alloc] initWithName:@"resolver.platformExtension" value:RCTPlatformExtension],
+#endif
[[NSURLQueryItem alloc] initWithName:@"dev" value:enableDev ? @"true" : @"false"],
[[NSURLQueryItem alloc] initWithName:@"lazy" value:lazy ? @"true" : @"false"],
[[NSURLQueryItem alloc] initWithName:@"minify" value:enableMinification ? @"true" : @"false"],
diff --git a/packages/react-native/React/Base/RCTConstants.h b/packages/react-native/React/Base/RCTConstants.h
index 289e8a090334a5..9c69969916375d 100644
--- a/packages/react-native/React/Base/RCTConstants.h
+++ b/packages/react-native/React/Base/RCTConstants.h
@@ -8,6 +8,9 @@
#import
RCT_EXTERN NSString *const RCTPlatformName;
+#if TARGET_OS_VISION
+RCT_EXTERN NSString *const RCTPlatformExtension;
+#endif
RCT_EXTERN NSString *const RCTUserInterfaceStyleDidChangeNotification;
RCT_EXTERN NSString *const RCTUserInterfaceStyleDidChangeNotificationTraitCollectionKey;
diff --git a/packages/react-native/React/Base/RCTConstants.m b/packages/react-native/React/Base/RCTConstants.m
index 70e94ca6b65e03..b6b6acd412c05d 100644
--- a/packages/react-native/React/Base/RCTConstants.m
+++ b/packages/react-native/React/Base/RCTConstants.m
@@ -8,6 +8,9 @@
#import "RCTConstants.h"
NSString *const RCTPlatformName = @"ios";
+#if TARGET_OS_VISION
+NSString *const RCTPlatformExtension = @"visionos";
+#endif
NSString *const RCTUserInterfaceStyleDidChangeNotification = @"RCTUserInterfaceStyleDidChangeNotification";
NSString *const RCTUserInterfaceStyleDidChangeNotificationTraitCollectionKey = @"traitCollection";
diff --git a/packages/react-native/React/Base/RCTConvert.mm b/packages/react-native/React/Base/RCTConvert.mm
index c4b15a1df20b52..97b9d98b6efecb 100644
--- a/packages/react-native/React/Base/RCTConvert.mm
+++ b/packages/react-native/React/Base/RCTConvert.mm
@@ -550,8 +550,13 @@ + (UIKeyboardType)UIKeyboardType:(id)json RCT_DYNAMIC
(@{
@"default" : @(UIBarStyleDefault),
@"black" : @(UIBarStyleBlack),
+#if TARGET_OS_VISION
+ @"blackOpaque" : @(UIBarStyleBlack),
+ @"blackTranslucent" : @(UIBarStyleBlack),
+#else
@"blackOpaque" : @(UIBarStyleBlackOpaque),
@"blackTranslucent" : @(UIBarStyleBlackTranslucent),
+#endif
}),
UIBarStyleDefault,
integerValue)
diff --git a/packages/react-native/React/Base/RCTKeyCommands.m b/packages/react-native/React/Base/RCTKeyCommands.m
index 19ef5b1f0d461a..013d7de38914f4 100644
--- a/packages/react-native/React/Base/RCTKeyCommands.m
+++ b/packages/react-native/React/Base/RCTKeyCommands.m
@@ -127,8 +127,11 @@ - (void)handleKeyUIEventSwizzle:(UIEvent *)event
if ([event respondsToSelector:@selector(_isKeyDown)]) {
isKeyDown = [event _isKeyDown];
}
-
+#if !TARGET_OS_VISION
BOOL interactionEnabled = !RCTSharedApplication().isIgnoringInteractionEvents;
+#else
+ BOOL interactionEnabled = true;
+#endif
BOOL hasFirstResponder = NO;
if (isKeyDown && modifiedInput.length > 0 && interactionEnabled) {
UIResponder *firstResponder = nil;
diff --git a/packages/react-native/React/Base/RCTUtils.m b/packages/react-native/React/Base/RCTUtils.m
index 190c06aab0098c..5f1e13390b37c7 100644
--- a/packages/react-native/React/Base/RCTUtils.m
+++ b/packages/react-native/React/Base/RCTUtils.m
@@ -361,9 +361,14 @@ CGSize RCTScreenSize(void)
static CGSize size;
static dispatch_once_t onceToken;
+
dispatch_once(&onceToken, ^{
RCTUnsafeExecuteOnMainQueueSync(^{
+#if TARGET_OS_VISION
+ size = RCTKeyWindow().bounds.size;
+#else
size = [UIScreen mainScreen].bounds.size;
+#endif
});
});
@@ -561,7 +566,17 @@ BOOL RCTRunningInAppExtension(void)
if (RCTRunningInAppExtension()) {
return nil;
}
-
+
+ id delegate = RCTSharedApplication().delegate;
+
+ SEL lastFocusedWindowSelector = NSSelectorFromString(@"lastFocusedWindow");
+ if ([delegate respondsToSelector:lastFocusedWindowSelector]) {
+ UIWindow *lastFocusedWindow = [delegate performSelector:lastFocusedWindowSelector];
+ if (lastFocusedWindow) {
+ return lastFocusedWindow;
+ }
+ }
+
NSSet *connectedScenes = RCTSharedApplication().connectedScenes;
UIScene *foregroundActiveScene;
@@ -572,6 +587,13 @@ BOOL RCTRunningInAppExtension(void)
continue;
}
+ #if TARGET_OS_VISION
+ /// Presenting scenes over Immersive Spaces leads to crash: "Presentations are not permitted within volumetric window scenes."
+ if (scene.session.role == UISceneSessionRoleImmersiveSpaceApplication) {
+ continue;
+ }
+#endif
+
if (scene.activationState == UISceneActivationStateForegroundActive) {
foregroundActiveScene = scene;
break;
diff --git a/packages/react-native/React/CoreModules/RCTAlertController.mm b/packages/react-native/React/CoreModules/RCTAlertController.mm
index b47ce0adefa06f..1e3f8da53350b4 100644
--- a/packages/react-native/React/CoreModules/RCTAlertController.mm
+++ b/packages/react-native/React/CoreModules/RCTAlertController.mm
@@ -9,6 +9,20 @@
#import
+#if TARGET_OS_VISION
+@interface TransparentViewController : UIViewController
+
+@end
+
+@implementation TransparentViewController
+
+- (UIContainerBackgroundStyle)preferredContainerBackgroundStyle {
+ return UIContainerBackgroundStyleHidden;
+}
+
+@end
+#endif
+
@interface RCTAlertController ()
@property (nonatomic, strong) UIWindow *alertWindow;
@@ -23,7 +37,11 @@ - (UIWindow *)alertWindow
_alertWindow = [[UIWindow alloc] initWithWindowScene:RCTKeyWindow().windowScene];
if (_alertWindow) {
+#if TARGET_OS_VISION
+ _alertWindow.rootViewController = [TransparentViewController new];
+#else
_alertWindow.rootViewController = [UIViewController new];
+#endif
_alertWindow.windowLevel = UIWindowLevelAlert + 1;
}
}
diff --git a/packages/react-native/React/CoreModules/RCTAppearance.mm b/packages/react-native/React/CoreModules/RCTAppearance.mm
index 4f7350faad7f97..49820547762de3 100644
--- a/packages/react-native/React/CoreModules/RCTAppearance.mm
+++ b/packages/react-native/React/CoreModules/RCTAppearance.mm
@@ -64,7 +64,9 @@ void RCTUseKeyWindowForSystemStyle(BOOL useMainScreen)
}
UIUserInterfaceStyle systemStyle = sUseKeyWindowForSystemStyle ? RCTKeyWindow().traitCollection.userInterfaceStyle
: traitCollection.userInterfaceStyle;
- return appearances[@(systemStyle)] ?: RCTAppearanceColorSchemeLight;
+
+ // Fallback to dark mode on visionOS
+ return appearances[@(systemStyle)] ?: RCTAppearanceColorSchemeDark;
}
@interface RCTAppearance ()
diff --git a/packages/react-native/React/CoreModules/RCTDevLoadingView.mm b/packages/react-native/React/CoreModules/RCTDevLoadingView.mm
index 12736cd5297f18..9e15a4ebd43c55 100644
--- a/packages/react-native/React/CoreModules/RCTDevLoadingView.mm
+++ b/packages/react-native/React/CoreModules/RCTDevLoadingView.mm
@@ -119,8 +119,15 @@ - (void)showMessage:(NSString *)message color:(UIColor *)color backgroundColor:(
CGFloat windowWidth = window.bounds.size.width;
self->_window = [[UIWindow alloc] initWithWindowScene:window.windowScene];
+#if TARGET_OS_VISION
+ self->_window.frame = CGRectMake(0, 0, windowWidth, window.safeAreaInsets.top + 30);
+ self->_label =
+ [[UILabel alloc] initWithFrame:CGRectMake(0, window.safeAreaInsets.top + 5, windowWidth, 20)];
+#else
self->_window.frame = CGRectMake(0, 0, windowWidth, window.safeAreaInsets.top + 10);
self->_label = [[UILabel alloc] initWithFrame:CGRectMake(0, window.safeAreaInsets.top - 10, windowWidth, 20)];
+#endif
+
[self->_window addSubview:self->_label];
self->_window.windowLevel = UIWindowLevelStatusBar + 1;
@@ -139,6 +146,7 @@ - (void)showMessage:(NSString *)message color:(UIColor *)color backgroundColor:(
});
[self hideBannerAfter:15.0];
+
}
RCT_EXPORT_METHOD(showMessage
diff --git a/packages/react-native/React/CoreModules/RCTDevMenu.mm b/packages/react-native/React/CoreModules/RCTDevMenu.mm
index 2f57d4b0b46a3d..f3c5ca675a8e51 100644
--- a/packages/react-native/React/CoreModules/RCTDevMenu.mm
+++ b/packages/react-native/React/CoreModules/RCTDevMenu.mm
@@ -424,9 +424,15 @@ - (RCTDevMenuAlertActionHandler)alertActionHandlerForDevItem:(RCTDevMenuItem *__
{
return ^(__unused UIAlertAction *action) {
if (item) {
+#if TARGET_OS_VISION
+ /// Execute this handler after the action sheet is dismissed to properly retrieve window when using SwiftUI entry point.
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{
+ [item callHandler];
+ });
+#else
[item callHandler];
+#endif
}
-
self->_actionSheet = nil;
};
}
diff --git a/packages/react-native/React/CoreModules/RCTDeviceInfo.mm b/packages/react-native/React/CoreModules/RCTDeviceInfo.mm
index 573c0c320a0c6e..cb76ba400213f2 100644
--- a/packages/react-native/React/CoreModules/RCTDeviceInfo.mm
+++ b/packages/react-native/React/CoreModules/RCTDeviceInfo.mm
@@ -51,9 +51,21 @@ - (void)initialize
selector:@selector(didReceiveNewContentSizeMultiplier)
name:RCTAccessibilityManagerDidUpdateMultiplierNotification
object:[_moduleRegistry moduleForName:"AccessibilityManager"]];
+
+#if !TARGET_OS_VISION
_currentInterfaceOrientation = [RCTSharedApplication() statusBarOrientation];
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(interfaceOrientationDidChange)
+ name:UIApplicationDidChangeStatusBarOrientationNotification
+ object:nil];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(interfaceFrameDidChange)
+ name:UIDeviceOrientationDidChangeNotification
+ object:nil];
+#endif
_currentInterfaceDimensions = [self _exportedDimensions];
[[NSNotificationCenter defaultCenter] addObserver:self
@@ -70,10 +82,6 @@ - (void)initialize
selector:@selector(interfaceFrameDidChange)
name:RCTWindowFrameDidChangeNotification
object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(interfaceFrameDidChange)
- name:UIDeviceOrientationDidChangeNotification
- object:nil];
// TODO T175901725 - Registering the RCTDeviceInfo module to the notification is a short-term fix to unblock 0.73
// The actual behavior should be that the module is properly registered in the TurboModule/Bridge infrastructure
@@ -100,7 +108,12 @@ - (void)_cleanupObservers
[[NSNotificationCenter defaultCenter] removeObserver:self
name:RCTAccessibilityManagerDidUpdateMultiplierNotification
object:[_moduleRegistry moduleForName:"AccessibilityManager"]];
-
+#if !TARGET_OS_VISION
+ [[NSNotificationCenter defaultCenter] removeObserver:self
+ name:UIApplicationDidChangeStatusBarOrientationNotification
+ object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
+#endif
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:RCTUserInterfaceStyleDidChangeNotification object:nil];
@@ -109,21 +122,21 @@ - (void)_cleanupObservers
[[NSNotificationCenter defaultCenter] removeObserver:self name:RCTBridgeWillInvalidateModulesNotification object:nil];
- [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}
static BOOL RCTIsIPhoneNotched()
{
static BOOL isIPhoneNotched = NO;
- static dispatch_once_t onceToken;
+#if !TARGET_OS_VISION
+ static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- RCTAssertMainQueue();
-
- // 20pt is the top safeArea value in non-notched devices
- isIPhoneNotched = RCTSharedApplication().keyWindow.safeAreaInsets.top > 20;
- });
+ dispatch_once(&onceToken, ^{
+ RCTAssertMainQueue();
+ // 20pt is the top safeArea value in non-notched devices
+ isIPhoneNotched = RCTSharedApplication().keyWindow.safeAreaInsets.top > 20;
+ });
+#endif
return isIPhoneNotched;
}
@@ -206,6 +219,7 @@ - (void)interfaceOrientationDidChange
- (void)_interfaceOrientationDidChange
{
+#if !TARGET_OS_VISION
UIApplication *application = RCTSharedApplication();
UIInterfaceOrientation nextOrientation = [application statusBarOrientation];
@@ -235,6 +249,7 @@ - (void)_interfaceOrientationDidChange
_isFullscreen = isRunningInFullScreen;
#pragma clang diagnostic pop
}
+#endif
}
- (void)interfaceFrameDidChange
diff --git a/packages/react-native/React/CoreModules/RCTKeyboardObserver.mm b/packages/react-native/React/CoreModules/RCTKeyboardObserver.mm
index ce483ddceb95fc..0774d1f9a81ef7 100644
--- a/packages/react-native/React/CoreModules/RCTKeyboardObserver.mm
+++ b/packages/react-native/React/CoreModules/RCTKeyboardObserver.mm
@@ -23,6 +23,7 @@ @implementation RCTKeyboardObserver
- (void)startObserving
{
+#if !TARGET_OS_VISION
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
#define ADD_KEYBOARD_HANDLER(NAME, SELECTOR) [nc addObserver:self selector:@selector(SELECTOR:) name:NAME object:nil]
@@ -35,6 +36,7 @@ - (void)startObserving
ADD_KEYBOARD_HANDLER(UIKeyboardDidChangeFrameNotification, keyboardDidChangeFrame);
#undef ADD_KEYBOARD_HANDLER
+#endif
}
- (NSArray *)supportedEvents
@@ -51,9 +53,12 @@ - (void)startObserving
- (void)stopObserving
{
+#if !TARGET_OS_VISION
[[NSNotificationCenter defaultCenter] removeObserver:self];
+#endif
}
+#if !TARGET_OS_VISION
// Bridge might be already invalidated by the time the keyboard is about to be dismissed.
// This might happen, for example, when reload from the packager is performed.
// Thus we need to check against nil here.
@@ -72,6 +77,7 @@ -(void)EVENT : (NSNotification *)notification
IMPLEMENT_KEYBOARD_HANDLER(keyboardDidHide)
IMPLEMENT_KEYBOARD_HANDLER(keyboardWillChangeFrame)
IMPLEMENT_KEYBOARD_HANDLER(keyboardDidChangeFrame)
+#endif
- (std::shared_ptr)getTurboModule:
(const facebook::react::ObjCTurboModule::InitParams &)params
diff --git a/packages/react-native/React/CoreModules/RCTPerfMonitor.mm b/packages/react-native/React/CoreModules/RCTPerfMonitor.mm
index 023a5311db2e53..c028d95ef8e3e2 100644
--- a/packages/react-native/React/CoreModules/RCTPerfMonitor.mm
+++ b/packages/react-native/React/CoreModules/RCTPerfMonitor.mm
@@ -171,7 +171,8 @@ - (UIPanGestureRecognizer *)gestureRecognizer
- (UIView *)container
{
if (!_container) {
- CGSize statusBarSize = RCTSharedApplication().statusBarFrame.size;
+ CGSize statusBarSize = RCTUIStatusBarManager().statusBarFrame.size;
+
CGFloat statusBarHeight = statusBarSize.height;
_container = [[UIView alloc] initWithFrame:CGRectMake(10, statusBarHeight, 180, RCTPerfMonitorBarHeight)];
_container.layer.borderWidth = 2;
diff --git a/packages/react-native/React/CoreModules/RCTStatusBarManager.mm b/packages/react-native/React/CoreModules/RCTStatusBarManager.mm
index 015a91098e95cd..ab5b1e94d03088 100644
--- a/packages/react-native/React/CoreModules/RCTStatusBarManager.mm
+++ b/packages/react-native/React/CoreModules/RCTStatusBarManager.mm
@@ -79,6 +79,7 @@ + (BOOL)requiresMainQueueSetup
- (void)startObserving
{
+#if !TARGET_OS_VISION
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(applicationDidChangeStatusBarFrame:)
@@ -88,15 +89,19 @@ - (void)startObserving
selector:@selector(applicationWillChangeStatusBarFrame:)
name:UIApplicationWillChangeStatusBarFrameNotification
object:nil];
+#endif
}
- (void)stopObserving
{
+#if !TARGET_OS_VISION
[[NSNotificationCenter defaultCenter] removeObserver:self];
+#endif
}
- (void)emitEvent:(NSString *)eventName forNotification:(NSNotification *)notification
{
+#if !TARGET_OS_VISION
CGRect frame = [notification.userInfo[UIApplicationStatusBarFrameUserInfoKey] CGRectValue];
NSDictionary *event = @{
@"frame" : @{
@@ -107,6 +112,7 @@ - (void)emitEvent:(NSString *)eventName forNotification:(NSNotification *)notifi
},
};
[self sendEventWithName:eventName body:event];
+#endif
}
- (void)applicationDidChangeStatusBarFrame:(NSNotification *)notification
@@ -122,12 +128,13 @@ - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification
RCT_EXPORT_METHOD(getHeight : (RCTResponseSenderBlock)callback)
{
callback(@[ @{
- @"height" : @(RCTSharedApplication().statusBarFrame.size.height),
+ @"height" : @(RCTUIStatusBarManager().statusBarFrame.size),
} ]);
}
RCT_EXPORT_METHOD(setStyle : (NSString *)style animated : (BOOL)animated)
{
+#if !TARGET_OS_VISION
dispatch_async(dispatch_get_main_queue(), ^{
UIStatusBarStyle statusBarStyle = [RCTConvert UIStatusBarStyle:style];
if (RCTViewControllerBasedStatusBarAppearance()) {
@@ -136,14 +143,16 @@ - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [RCTSharedApplication() setStatusBarStyle:statusBarStyle animated:animated];
- }
+ [RCTSharedApplication() setStatusBarStyle:statusBarStyle animated:animated];
+ }
#pragma clang diagnostic pop
});
+#endif
}
RCT_EXPORT_METHOD(setHidden : (BOOL)hidden withAnimation : (NSString *)withAnimation)
{
+#if !TARGET_OS_VISION
dispatch_async(dispatch_get_main_queue(), ^{
UIStatusBarAnimation animation = [RCTConvert UIStatusBarAnimation:withAnimation];
if (RCTViewControllerBasedStatusBarAppearance()) {
@@ -152,17 +161,18 @@ - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [RCTSharedApplication() setStatusBarHidden:hidden withAnimation:animation];
+ [RCTSharedApplication() setStatusBarHidden:hidden withAnimation:animation];
#pragma clang diagnostic pop
}
});
+#endif
}
RCT_EXPORT_METHOD(setNetworkActivityIndicatorVisible : (BOOL)visible)
{
- dispatch_async(dispatch_get_main_queue(), ^{
+#if !TARGET_OS_VISION
RCTSharedApplication().networkActivityIndicatorVisible = visible;
- });
+#endif
}
- (facebook::react::ModuleConstants)getConstants
diff --git a/packages/react-native/React/CoreModules/React-CoreModules.podspec b/packages/react-native/React/CoreModules/React-CoreModules.podspec
index f29771e5c3eb2b..8af78493b73898 100644
--- a/packages/react-native/React/CoreModules/React-CoreModules.podspec
+++ b/packages/react-native/React/CoreModules/React-CoreModules.podspec
@@ -19,7 +19,7 @@ end
folly_config = get_folly_config()
folly_compiler_flags = folly_config[:compiler_flags]
folly_version = folly_config[:version]
-socket_rocket_version = '0.7.0'
+socket_rocket_version = '0.7.0.1'
header_search_paths = [
"\"$(PODS_ROOT)/boost\"",
diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm
index f152dabf3b9f4a..8dd2ba120b148b 100644
--- a/packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm
+++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm
@@ -66,7 +66,9 @@ - (void)didMoveToWindow
if (self.window && !_textInput) {
if (self.nativeId) {
_textInput = RCTFindTextInputWithNativeId(self.window, self.nativeId);
+#if !TARGET_OS_VISION
_textInput.inputAccessoryView = _contentView;
+#endif
} else {
_textInput = RCTFindTextInputWithNativeId(_contentView, nil);
}
@@ -82,10 +84,12 @@ - (BOOL)canBecomeFirstResponder
return true;
}
+#if !TARGET_OS_VISION
- (UIView *)inputAccessoryView
{
return _contentView;
}
+#endif
#pragma mark - RCTComponentViewProtocol
diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTFabricModalHostViewController.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTFabricModalHostViewController.mm
index ff8810cba4001d..7ceeb3e3f33ae9 100644
--- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTFabricModalHostViewController.mm
+++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTFabricModalHostViewController.mm
@@ -61,8 +61,13 @@ - (BOOL)prefersStatusBarHidden
#if RCT_DEV
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
+#if !TARGET_OS_VISION
UIInterfaceOrientationMask appSupportedOrientationsMask =
[RCTSharedApplication() supportedInterfaceOrientationsForWindow:[RCTSharedApplication() keyWindow]];
+#else
+ UIInterfaceOrientationMask appSupportedOrientationsMask = UIInterfaceOrientationMaskPortrait;
+#endif
+
if (!(_supportedInterfaceOrientations & appSupportedOrientationsMask)) {
RCTLogError(
@"Modal was presented with 0x%x orientations mask but the application only supports 0x%x."
diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm
index 83511c3afa1d2f..8df8e76f9bb552 100644
--- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm
+++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm
@@ -28,6 +28,7 @@
static const CGFloat kClippingLeeway = 44.0;
+#if !TARGET_OS_VISION
static UIScrollViewKeyboardDismissMode RCTUIKeyboardDismissModeFromProps(const ScrollViewProps &props)
{
switch (props.keyboardDismissMode) {
@@ -39,6 +40,7 @@ static UIScrollViewKeyboardDismissMode RCTUIKeyboardDismissModeFromProps(const S
return UIScrollViewKeyboardDismissModeInteractive;
}
}
+#endif
static UIScrollViewIndicatorStyle RCTUIScrollViewIndicatorStyleFromProps(const ScrollViewProps &props)
{
@@ -299,9 +301,11 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
MAP_SCROLL_VIEW_PROP(disableIntervalMomentum);
MAP_SCROLL_VIEW_PROP(snapToInterval);
+#if !TARGET_OS_VISION
if (oldScrollViewProps.keyboardDismissMode != newScrollViewProps.keyboardDismissMode) {
scrollView.keyboardDismissMode = RCTUIKeyboardDismissModeFromProps(newScrollViewProps);
}
+#endif
[super updateProps:props oldProps:oldProps];
}
diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm
index 2b81ef7db29184..337966b778b4ad 100644
--- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm
+++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm
@@ -267,6 +267,7 @@ - (void)handleLongPress:(UILongPressGestureRecognizer *)gesture
[_editMenuInteraction presentEditMenuWithConfiguration:config];
}
} else {
+#if !TARGET_OS_VISION
UIMenuController *menuController = [UIMenuController sharedMenuController];
if (menuController.isMenuVisible) {
@@ -274,6 +275,7 @@ - (void)handleLongPress:(UILongPressGestureRecognizer *)gesture
}
[menuController showMenuFromView:self rect:self.bounds];
+#endif
}
}
diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm
index 2216d0e96b2dbd..6cd0e4f06fdaa9 100644
--- a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm
+++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm
@@ -464,6 +464,7 @@ - (void)setTextAndSelection:(NSInteger)eventCount
- (void)setDefaultInputAccessoryView
{
+#if !TARGET_OS_VISION
// InputAccessoryView component sets the inputAccessoryView when inputAccessoryViewID exists
if (_backedTextInputView.inputAccessoryViewID) {
if (_backedTextInputView.isFirstResponder) {
@@ -503,6 +504,7 @@ - (void)setDefaultInputAccessoryView
if (_backedTextInputView.isFirstResponder) {
[_backedTextInputView reloadInputViews];
}
+#endif
}
- (void)handleInputAccessoryDoneButton
diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm
index d4b91c921b1114..3bc3f3a298e47f 100644
--- a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm
+++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm
@@ -26,7 +26,9 @@ void RCTCopyBackedTextInput(
toTextInput.placeholder = fromTextInput.placeholder;
toTextInput.placeholderColor = fromTextInput.placeholderColor;
toTextInput.textContainerInset = fromTextInput.textContainerInset;
+#if !TARGET_OS_VISION
toTextInput.inputAccessoryView = fromTextInput.inputAccessoryView;
+#endif
toTextInput.textInputDelegate = fromTextInput.textInputDelegate;
toTextInput.placeholderColor = fromTextInput.placeholderColor;
toTextInput.defaultTextAttributes = fromTextInput.defaultTextAttributes;
diff --git a/packages/react-native/React/Fabric/RCTSurfacePointerHandler.mm b/packages/react-native/React/Fabric/RCTSurfacePointerHandler.mm
index 78dec24a9bd3db..5af98fb1b2ad7d 100644
--- a/packages/react-native/React/Fabric/RCTSurfacePointerHandler.mm
+++ b/packages/react-native/React/Fabric/RCTSurfacePointerHandler.mm
@@ -286,9 +286,15 @@ static PointerEvent CreatePointerEventFromActivePointer(
if (eventType == RCTPointerEventTypeCancel) {
event.clientPoint = RCTPointFromCGPoint(CGPointZero);
+#if TARGET_OS_VISION
+ event.screenPoint =
+ RCTPointFromCGPoint([rootComponentView convertPoint:CGPointZero
+ toCoordinateSpace:rootComponentView.window.coordinateSpace]);
+#else
event.screenPoint =
RCTPointFromCGPoint([rootComponentView convertPoint:CGPointZero
toCoordinateSpace:rootComponentView.window.screen.coordinateSpace]);
+#endif
event.offsetPoint = RCTPointFromCGPoint([rootComponentView convertPoint:CGPointZero
toView:activePointer.componentView]);
} else {
@@ -329,7 +335,6 @@ static PointerEvent CreatePointerEventFromActivePointer(
event.tangentialPressure = 0.0;
event.twist = 0;
event.isPrimary = activePointer.isPrimary;
-
return event;
}
@@ -374,8 +379,13 @@ static void UpdateActivePointerWithUITouch(
activePointer.componentView = FindClosestFabricManagedTouchableView(hitTestedView);
activePointer.clientPoint = [uiTouch locationInView:rootComponentView];
+#if TARGET_OS_VISION
+ activePointer.screenPoint = [rootComponentView convertPoint:activePointer.clientPoint
+ toCoordinateSpace:rootComponentView.window.coordinateSpace];
+#else
activePointer.screenPoint = [rootComponentView convertPoint:activePointer.clientPoint
toCoordinateSpace:rootComponentView.window.screen.coordinateSpace];
+#endif
activePointer.offsetPoint = [uiTouch locationInView:activePointer.componentView];
activePointer.timestamp = uiTouch.timestamp;
@@ -742,9 +752,13 @@ - (void)hovering:(UIHoverGestureRecognizer *)recognizer
{
UIView *listenerView = recognizer.view;
CGPoint clientLocation = [recognizer locationInView:listenerView];
+#if TARGET_OS_VISION
+ CGPoint screenLocation = [listenerView convertPoint:clientLocation
+ toCoordinateSpace:listenerView.window.coordinateSpace];
+#else
CGPoint screenLocation = [listenerView convertPoint:clientLocation
toCoordinateSpace:listenerView.window.screen.coordinateSpace];
-
+#endif
UIView *targetView = [listenerView hitTest:clientLocation withEvent:nil];
targetView = FindClosestFabricManagedTouchableView(targetView);
diff --git a/packages/react-native/React/Fabric/RCTSurfaceTouchHandler.mm b/packages/react-native/React/Fabric/RCTSurfaceTouchHandler.mm
index a793251fc622c3..59feea710f2cec 100644
--- a/packages/react-native/React/Fabric/RCTSurfaceTouchHandler.mm
+++ b/packages/react-native/React/Fabric/RCTSurfaceTouchHandler.mm
@@ -56,8 +56,13 @@ static void UpdateActiveTouchWithUITouch(
{
CGPoint offsetPoint = [uiTouch locationInView:activeTouch.componentView];
CGPoint pagePoint = [uiTouch locationInView:rootComponentView];
+#if TARGET_OS_VISION
+ CGPoint screenPoint = [rootComponentView convertPoint:pagePoint
+ toCoordinateSpace:rootComponentView.window.coordinateSpace];
+#else
CGPoint screenPoint = [rootComponentView convertPoint:pagePoint
toCoordinateSpace:rootComponentView.window.screen.coordinateSpace];
+#endif
pagePoint = CGPointMake(pagePoint.x + rootViewOriginOffset.x, pagePoint.y + rootViewOriginOffset.y);
activeTouch.touch.offsetPoint = RCTPointFromCGPoint(offsetPoint);
diff --git a/packages/react-native/React/Modules/RCTUIManager.m b/packages/react-native/React/Modules/RCTUIManager.m
index 31c12fd22789bb..fd21eeed0210e3 100644
--- a/packages/react-native/React/Modules/RCTUIManager.m
+++ b/packages/react-native/React/Modules/RCTUIManager.m
@@ -196,10 +196,12 @@ - (void)setBridge:(RCTBridge *)bridge
name:@"RCTAccessibilityManagerDidUpdateMultiplierNotification"
object:a11yManager];
});
+#if !TARGET_OS_VISION
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(namedOrientationDidChange)
name:UIDeviceOrientationDidChangeNotification
object:nil];
+#endif
[RCTLayoutAnimation initializeStatics];
}
@@ -267,16 +269,17 @@ - (void)didReceiveNewContentSizeMultiplier
- (void)namedOrientationDidChange
{
+#if !TARGET_OS_VISION
NSDictionary *orientationEvent = deviceOrientationEventBody([UIDevice currentDevice].orientation);
if (!orientationEvent) {
return;
}
-
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[[_moduleRegistry moduleForName:"EventDispatcher"] sendDeviceEventWithName:@"namedOrientationDidChange"
body:orientationEvent];
#pragma clang diagnostic pop
+#endif
}
- (dispatch_queue_t)methodQueue
diff --git a/packages/react-native/React/UIUtils/RCTUIUtils.m b/packages/react-native/React/UIUtils/RCTUIUtils.m
index b0e655fb4c544a..e986af9d2643dd 100644
--- a/packages/react-native/React/UIUtils/RCTUIUtils.m
+++ b/packages/react-native/React/UIUtils/RCTUIUtils.m
@@ -11,18 +11,26 @@
RCTDimensions RCTGetDimensions(CGFloat fontScale)
{
+#if !TARGET_OS_VISION
UIScreen *mainScreen = UIScreen.mainScreen;
CGSize screenSize = mainScreen.bounds.size;
-
+#endif
+
UIView *mainWindow = RCTKeyWindow();
+ CGFloat screenScale = [UITraitCollection currentTraitCollection].displayScale;
+
+#if TARGET_OS_VISION
+ CGSize windowSize = mainWindow.bounds.size;
+ CGSize screenSize = mainWindow.bounds.size;
+#else
// We fallback to screen size if a key window is not found.
CGSize windowSize = mainWindow ? mainWindow.bounds.size : screenSize;
-
+#endif
RCTDimensions result;
typeof(result.screen) dimsScreen = {
- .width = screenSize.width, .height = screenSize.height, .scale = mainScreen.scale, .fontScale = fontScale};
+ .width = screenSize.width, .height = screenSize.height, .scale = screenScale, .fontScale = fontScale};
typeof(result.window) dimsWindow = {
- .width = windowSize.width, .height = windowSize.height, .scale = mainScreen.scale, .fontScale = fontScale};
+ .width = windowSize.width, .height = windowSize.height, .scale = screenScale, .fontScale = fontScale};
result.screen = dimsScreen;
result.window = dimsWindow;
diff --git a/packages/react-native/React/Views/RCTModalHostView.m b/packages/react-native/React/Views/RCTModalHostView.m
index dfde4ae47ab137..f9b0c2c39e2eba 100644
--- a/packages/react-native/React/Views/RCTModalHostView.m
+++ b/packages/react-native/React/Views/RCTModalHostView.m
@@ -75,8 +75,11 @@ - (void)notifyForOrientationChange
if (!_onOrientationChange) {
return;
}
-
+#if !TARGET_OS_VISION
UIInterfaceOrientation currentOrientation = [RCTSharedApplication() statusBarOrientation];
+#else
+ UIInterfaceOrientation currentOrientation = UIInterfaceOrientationUnknown;
+#endif
if (currentOrientation == _lastKnownOrientation) {
return;
}
diff --git a/packages/react-native/React/Views/RCTModalHostViewController.m b/packages/react-native/React/Views/RCTModalHostViewController.m
index 50075ffd4847c3..03d443f4776f15 100644
--- a/packages/react-native/React/Views/RCTModalHostViewController.m
+++ b/packages/react-native/React/Views/RCTModalHostViewController.m
@@ -23,10 +23,11 @@ - (instancetype)init
}
self.modalInPresentation = YES;
-
+#if !TARGET_OS_VISION
_preferredStatusBarStyle = [RCTUIStatusBarManager() statusBarStyle];
_preferredStatusBarHidden = [RCTUIStatusBarManager() isStatusBarHidden];
-
+#endif
+
return self;
}
@@ -53,8 +54,12 @@ - (BOOL)prefersStatusBarHidden
#if RCT_DEV
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
+#if !TARGET_OS_VISION
UIInterfaceOrientationMask appSupportedOrientationsMask =
[RCTSharedApplication() supportedInterfaceOrientationsForWindow:[RCTSharedApplication() keyWindow]];
+#else
+ UIInterfaceOrientationMask appSupportedOrientationsMask = UIInterfaceOrientationMaskPortrait;
+#endif
if (!(_supportedInterfaceOrientations & appSupportedOrientationsMask)) {
RCTLogError(
@"Modal was presented with 0x%x orientations mask but the application only supports 0x%x."
diff --git a/packages/react-native/React/Views/RCTViewManager.h b/packages/react-native/React/Views/RCTViewManager.h
index 1676e69f2aca86..9cde0f096d513d 100644
--- a/packages/react-native/React/Views/RCTViewManager.h
+++ b/packages/react-native/React/Views/RCTViewManager.h
@@ -79,6 +79,25 @@ typedef void (^RCTViewManagerUIBlock)(RCTUIManager *uiManager, NSDictionary
#import
+#if !TARGET_OS_VISION
+
@interface RCTConvert (UIScrollView)
+ (UIScrollViewKeyboardDismissMode)UIScrollViewKeyboardDismissMode:(id)json;
@end
+#endif
+
@interface RCTScrollViewManager : RCTViewManager
@end
diff --git a/packages/react-native/React/Views/ScrollView/RCTScrollViewManager.m b/packages/react-native/React/Views/ScrollView/RCTScrollViewManager.m
index 878825656f2710..971192def6570f 100644
--- a/packages/react-native/React/Views/ScrollView/RCTScrollViewManager.m
+++ b/packages/react-native/React/Views/ScrollView/RCTScrollViewManager.m
@@ -14,6 +14,7 @@
@implementation RCTConvert (UIScrollView)
+#if !TARGET_OS_VISION
RCT_ENUM_CONVERTER(
UIScrollViewKeyboardDismissMode,
(@{
@@ -25,6 +26,7 @@ @implementation RCTConvert (UIScrollView)
}),
UIScrollViewKeyboardDismissModeNone,
integerValue)
+#endif
RCT_ENUM_CONVERTER(
UIScrollViewIndicatorStyle,
@@ -49,6 +51,7 @@ @implementation RCTConvert (UIScrollView)
@end
+
@implementation RCTScrollViewManager
RCT_EXPORT_MODULE()
@@ -71,7 +74,7 @@ - (UIView *)view
RCT_EXPORT_VIEW_PROPERTY(endDraggingSensitivityMultiplier, CGFloat)
RCT_EXPORT_VIEW_PROPERTY(directionalLockEnabled, BOOL)
RCT_EXPORT_VIEW_PROPERTY(indicatorStyle, UIScrollViewIndicatorStyle)
-RCT_EXPORT_VIEW_PROPERTY(keyboardDismissMode, UIScrollViewKeyboardDismissMode)
+RCT_EXPORT_NOT_VISIONOS_VIEW_PROPERTY(keyboardDismissMode, UIScrollViewKeyboardDismissMode)
RCT_EXPORT_VIEW_PROPERTY(maximumZoomScale, CGFloat)
RCT_EXPORT_VIEW_PROPERTY(minimumZoomScale, CGFloat)
RCT_EXPORT_VIEW_PROPERTY(scrollEnabled, BOOL)
diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/localCommands.js b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/localCommands.js
new file mode 100644
index 00000000000000..dc87001156ac06
--- /dev/null
+++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/localCommands.js
@@ -0,0 +1,45 @@
+const {
+ createBuild,
+ createLog,
+ createRun,
+ getRunOptions,
+ getLogOptions,
+ getBuildOptions,
+} = require('@react-native-community/cli-platform-apple');
+
+const platformName = 'visionos';
+
+const run = {
+ name: 'run-visionos',
+ description: 'builds your app and starts it on visionOS simulator',
+ func: createRun({platformName}),
+ examples: [
+ {
+ desc: 'Run on a specific simulator',
+ cmd: 'npx @callstack/react-native-visionos run-visionos --simulator "Apple Vision Pro"',
+ },
+ ],
+ options: getRunOptions({platformName}),
+};
+
+const log = {
+ name: 'log-visionos',
+ description: 'starts visionOS device syslog tail',
+ func: createLog({platformName: 'visionos'}),
+ options: getLogOptions({platformName}),
+};
+
+const build = {
+ name: 'build-visionos',
+ description: 'builds your app for visionOS platform',
+ func: createBuild({platformName}),
+ examples: [
+ {
+ desc: 'Build the app for all visionOS devices in Release mode',
+ cmd: 'npx @callstack/react-native-visionos build-visionos --mode "Release"',
+ },
+ ],
+ options: getBuildOptions({platformName}),
+};
+
+module.exports = [run, log, build];
diff --git a/packages/react-native/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec b/packages/react-native/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec
index 5c6fc31aa5333d..e88b986d6e6204 100644
--- a/packages/react-native/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec
+++ b/packages/react-native/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec
@@ -49,6 +49,8 @@ Pod::Spec.new do |s|
"USE_HEADERMAP" => "YES",
"CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
"GCC_WARN_PEDANTIC" => "YES" }
+ s.framework = "UIKit"
+
if ENV['USE_FRAMEWORKS']
s.header_mappings_dir = './'
end
diff --git a/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm b/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm
index 1c7b70a7f30a26..a57fd65fc97eb3 100644
--- a/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm
+++ b/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm
@@ -47,12 +47,18 @@ - (NSDictionary *)getConstants
{
__block NSDictionary *constants;
RCTUnsafeExecuteOnMainQueueSync(^{
- UIScreen *mainScreen = UIScreen.mainScreen;
- CGSize screenSize = mainScreen.bounds.size;
-
+#if TARGET_OS_VISION
+ UIApplication *app = [[UIApplication class] performSelector:@selector(sharedApplication)];
+ UIWindowScene *scene = (UIWindowScene*)[app.connectedScenes anyObject];
+ UIWindow *window = [[UIWindow alloc] initWithWindowScene:scene];
+ CGSize screenSize = window.bounds.size;
+#else
+ UIScreen *mainScreen = UIScreen.mainScreen;
+ CGSize screenSize = mainScreen.bounds.size;
+#endif
constants = @{
@"const1" : @YES,
- @"const2" : @(screenSize.width),
+ @"const2" : @(screenSize),
@"const3" : @"something",
};
});
diff --git a/packages/react-native/ReactCommon/react/renderer/graphics/React-graphics.podspec b/packages/react-native/ReactCommon/react/renderer/graphics/React-graphics.podspec
index 94743610da2fe2..1ad4764b110c3e 100644
--- a/packages/react-native/ReactCommon/react/renderer/graphics/React-graphics.podspec
+++ b/packages/react-native/ReactCommon/react/renderer/graphics/React-graphics.podspec
@@ -53,6 +53,8 @@ Pod::Spec.new do |s|
s.header_mappings_dir = "../../.."
header_search_paths = header_search_paths + ["\"$(PODS_TARGET_SRCROOT)/platform/ios\""]
end
+
+ s.framework = "UIKit"
s.pod_target_xcconfig = { "USE_HEADERMAP" => "NO",
"HEADER_SEARCH_PATHS" => header_search_paths.join(" "),
diff --git a/packages/react-native/index.js b/packages/react-native/index.js
index f087b702545fcd..02b5377f43ed11 100644
--- a/packages/react-native/index.js
+++ b/packages/react-native/index.js
@@ -90,6 +90,8 @@ import typeof Platform from './Libraries/Utilities/Platform';
import typeof useColorScheme from './Libraries/Utilities/useColorScheme';
import typeof useWindowDimensions from './Libraries/Utilities/useWindowDimensions';
import typeof Vibration from './Libraries/Vibration/Vibration';
+import typeof WindowManager from './Libraries/WindowManager/WindowManager';
+import typeof XR from './Libraries/XR/XR';
import typeof YellowBox from './Libraries/YellowBox/YellowBoxDeprecated';
const warnOnce = require('./Libraries/Utilities/warnOnce');
@@ -300,6 +302,12 @@ module.exports = {
get Share(): Share {
return require('./Libraries/Share/Share');
},
+ get XR(): XR {
+ return require('./Libraries/XR/XR');
+ },
+ get WindowManager(): WindowManager {
+ return require('./Libraries/WindowManager/WindowManager');
+ },
get StyleSheet(): StyleSheet {
return require('./Libraries/StyleSheet/StyleSheet');
},
diff --git a/packages/react-native/local-cli/localCommands.js b/packages/react-native/local-cli/localCommands.js
new file mode 100644
index 00000000000000..dc87001156ac06
--- /dev/null
+++ b/packages/react-native/local-cli/localCommands.js
@@ -0,0 +1,45 @@
+const {
+ createBuild,
+ createLog,
+ createRun,
+ getRunOptions,
+ getLogOptions,
+ getBuildOptions,
+} = require('@react-native-community/cli-platform-apple');
+
+const platformName = 'visionos';
+
+const run = {
+ name: 'run-visionos',
+ description: 'builds your app and starts it on visionOS simulator',
+ func: createRun({platformName}),
+ examples: [
+ {
+ desc: 'Run on a specific simulator',
+ cmd: 'npx @callstack/react-native-visionos run-visionos --simulator "Apple Vision Pro"',
+ },
+ ],
+ options: getRunOptions({platformName}),
+};
+
+const log = {
+ name: 'log-visionos',
+ description: 'starts visionOS device syslog tail',
+ func: createLog({platformName: 'visionos'}),
+ options: getLogOptions({platformName}),
+};
+
+const build = {
+ name: 'build-visionos',
+ description: 'builds your app for visionOS platform',
+ func: createBuild({platformName}),
+ examples: [
+ {
+ desc: 'Build the app for all visionOS devices in Release mode',
+ cmd: 'npx @callstack/react-native-visionos build-visionos --mode "Release"',
+ },
+ ],
+ options: getBuildOptions({platformName}),
+};
+
+module.exports = [run, log, build];
diff --git a/packages/react-native/package.json b/packages/react-native/package.json
index b1e9f4a4a95ea2..16f2adc2501ed9 100644
--- a/packages/react-native/package.json
+++ b/packages/react-native/package.json
@@ -1,11 +1,11 @@
{
- "name": "react-native",
+ "name": "@callstack/react-native-visionos",
"version": "1000.0.0",
- "description": "A framework for building native apps using React",
+ "description": "React Native for visionOS",
"license": "MIT",
"repository": {
"type": "git",
- "url": "git+https://github.com/facebook/react-native.git",
+ "url": "https://github.com/callstack/react-native-visionos.git",
"directory": "packages/react-native"
},
"homepage": "https://reactnative.dev/",
@@ -111,6 +111,7 @@
"@react-native-community/cli": "14.0.0-alpha.2",
"@react-native-community/cli-platform-android": "14.0.0-alpha.2",
"@react-native-community/cli-platform-ios": "14.0.0-alpha.2",
+ "@react-native-community/cli-platform-apple": "14.0.0-alpha.2",
"@react-native/assets-registry": "0.75.0-main",
"@react-native/codegen": "0.75.0-main",
"@react-native/community-cli-plugin": "0.75.0-main",
@@ -155,6 +156,13 @@
"android": {},
"jsSrcsDir": "src"
},
+ {
+ "name": "FBReactNativeSpec_visionOS",
+ "type": "modules",
+ "ios": {},
+ "android": {},
+ "jsSrcsDir": "src/private/specs/visionos_modules"
+ },
{
"name": "rncore",
"type": "components",
diff --git a/packages/react-native/postInitScript.js b/packages/react-native/postInitScript.js
new file mode 100644
index 00000000000000..28d1618ff153e2
--- /dev/null
+++ b/packages/react-native/postInitScript.js
@@ -0,0 +1,40 @@
+/**
+ * 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
+ */
+
+import chalk from 'chalk';
+import {logger} from '@react-native-community/cli-tools';
+import path from 'path';
+
+function printInitScript(
+ projectName: string,
+) {
+ const relativeXcodeProjectPath = `visionos/${projectName}.xcworkspace`;
+ const projectDir = path.resolve();
+
+ const instructions = `
+ ${chalk.cyan(`Run instructions for ${chalk.bold('visionOS')}`)}:
+ • cd "${projectDir}/visionos"
+
+ • Install Cocoapods
+ • bundle install # you need to run this only once in your project.
+ • bundle exec pod install
+ • cd ..
+
+ • npx react-native run-visionos
+ ${chalk.dim('- or -')}
+ • Open ${relativeXcodeProjectPath} in Xcode or run "xed -b ${relativeXcodeProjectPath}"
+ • Hit the Run button
+ `;
+
+ logger.log(`
+ ${instructions}
+ `);
+}
+
+export default printInitScript;
diff --git a/packages/react-native/react-native.config.js b/packages/react-native/react-native.config.js
index b2dd5a5c643679..ce4cc832fbf961 100644
--- a/packages/react-native/react-native.config.js
+++ b/packages/react-native/react-native.config.js
@@ -32,8 +32,10 @@ try {
}
let ios;
+let apple;
try {
ios = require('@react-native-community/cli-platform-ios');
+ apple = require('@react-native-community/cli-platform-apple');
} catch {
if (verbose) {
console.warn(
@@ -42,6 +44,8 @@ try {
}
}
+const localCommands = require('./local-cli/localCommands');
+
const {
bundleCommand,
startCommand,
@@ -75,8 +79,14 @@ const codegenCommand = {
};
const config = {
- commands: [bundleCommand, startCommand, codegenCommand],
- platforms: {},
+ commands: [bundleCommand, startCommand, codegenCommand, ...localCommands],
+ platforms: {
+ visionos: {
+ npmPackageName: '@callstack/react-native-visionos',
+ projectConfig: apple.getProjectConfig({platformName: 'visionos'}),
+ dependencyConfig: apple.getDependencyConfig({platformName: 'visionos'}),
+ },
+ },
};
if (ios != null) {
diff --git a/packages/react-native/scripts/cocoapods/helpers.rb b/packages/react-native/scripts/cocoapods/helpers.rb
index 68017d1f0cc535..fb0260832f43af 100644
--- a/packages/react-native/scripts/cocoapods/helpers.rb
+++ b/packages/react-native/scripts/cocoapods/helpers.rb
@@ -40,6 +40,10 @@ class Constants
def self.min_ios_version_supported
return '13.4'
end
+
+ def self.min_visionos_version_supported
+ return '1.0'
+ end
def self.min_xcode_version_supported
return '14.3'
diff --git a/packages/react-native/scripts/cocoapods/utils.rb b/packages/react-native/scripts/cocoapods/utils.rb
index b5195aadc7cbbb..14c1bbbbcfc6f4 100644
--- a/packages/react-native/scripts/cocoapods/utils.rb
+++ b/packages/react-native/scripts/cocoapods/utils.rb
@@ -637,6 +637,7 @@ def self.react_native_pods
"glog",
"hermes-engine",
"React-hermes",
+ "React-RCTXR", # visionOS
]
end
diff --git a/packages/react-native/scripts/codegen/generate-artifacts-executor.js b/packages/react-native/scripts/codegen/generate-artifacts-executor.js
index df3c1e6ac0306d..a27fe8910a35c6 100644
--- a/packages/react-native/scripts/codegen/generate-artifacts-executor.js
+++ b/packages/react-native/scripts/codegen/generate-artifacts-executor.js
@@ -59,7 +59,7 @@ const CORE_LIBRARIES_WITH_OUTPUT_FOLDER = {
),
},
};
-const REACT_NATIVE = 'react-native';
+const REACT_NATIVE = '@callstack/react-native-visionos';
const MODULES_PROTOCOLS_H_TEMPLATE_PATH = path.join(
REACT_NATIVE_PACKAGE_ROOT_FOLDER,
diff --git a/packages/react-native/scripts/react-native-xcode.sh b/packages/react-native/scripts/react-native-xcode.sh
index 3e1742cd8d1f27..0e93b7ea6510cd 100755
--- a/packages/react-native/scripts/react-native-xcode.sh
+++ b/packages/react-native/scripts/react-native-xcode.sh
@@ -144,6 +144,7 @@ fi
--entry-file "$ENTRY_FILE" \
--platform "$BUNDLE_PLATFORM" \
--dev $DEV \
+ --resolver-option "platformExtension=visionos" \
--reset-cache \
--bundle-output "$BUNDLE_FILE" \
--assets-dest "$DEST" \
diff --git a/packages/react-native/scripts/react_native_pods.rb b/packages/react-native/scripts/react_native_pods.rb
index 77aca67f240e5a..abab3b2e364e8e 100644
--- a/packages/react-native/scripts/react_native_pods.rb
+++ b/packages/react-native/scripts/react_native_pods.rb
@@ -30,11 +30,15 @@ def min_ios_version_supported
return Helpers::Constants.min_ios_version_supported
end
+def min_visionos_version_supported
+ return Helpers::Constants.min_visionos_version_supported
+end
+
# This function returns the min supported OS versions supported by React Native
# By using this function, you won't have to manually change your Podfile
# when we change the minimum version supported by the framework.
def min_supported_versions
- return { :ios => min_ios_version_supported }
+ return { :ios => min_ios_version_supported, :visionos => min_visionos_version_supported }
end
# This function prepares the project for React Native, before processing
@@ -128,6 +132,9 @@ def use_react_native! (
pod 'React-jserrorhandler', :path => "#{prefix}/ReactCommon/jserrorhandler"
pod 'React-nativeconfig', :path => "#{prefix}/ReactCommon"
pod 'RCTDeprecation', :path => "#{prefix}/ReactApple/Libraries/RCTFoundation/RCTDeprecation"
+ pod 'React-RCTSwiftExtensions', :path => "#{prefix}/Libraries/SwiftExtensions"
+ pod 'React-RCTXR', :path => "#{prefix}/Libraries/XR"
+ pod 'React-RCTWindowManager', :path => "#{prefix}/Libraries/WindowManager", :modular_headers => true
if hermes_enabled
setup_hermes!(:react_native_path => prefix)
@@ -155,6 +162,9 @@ def use_react_native! (
pod 'boost', :podspec => "#{prefix}/third-party-podspecs/boost.podspec"
pod 'fmt', :podspec => "#{prefix}/third-party-podspecs/fmt.podspec"
pod 'RCT-Folly', :podspec => "#{prefix}/third-party-podspecs/RCT-Folly.podspec", :modular_headers => true
+ pod 'fmt', :podspec => "#{prefix}/third-party-podspecs/fmt.podspec", :modular_headers => true
+ pod 'SocketRocket', :podspec => "#{prefix}/third-party-podspecs/SocketRocket.podspec", :modular_headers => true
+
folly_config = get_folly_config()
run_codegen!(
diff --git a/packages/react-native/sdks/hermes-engine/hermes-engine.podspec b/packages/react-native/sdks/hermes-engine/hermes-engine.podspec
index 32d71f78fd7ada..cdfc4b50de949d 100644
--- a/packages/react-native/sdks/hermes-engine/hermes-engine.podspec
+++ b/packages/react-native/sdks/hermes-engine/hermes-engine.podspec
@@ -12,7 +12,8 @@ react_native_path = File.join(__dir__, "..", "..")
package = JSON.parse(File.read(File.join(react_native_path, "package.json")))
version = package['version']
-source_type = hermes_source_type(version, react_native_path)
+# Temporaily build from source until visionOS supports prebuilt binaries
+source_type = HermesEngineSourceType::BUILD_FROM_GITHUB_MAIN # hermes_source_type(version, react_native_path)
source = podspec_source(source_type, version, react_native_path)
Pod::Spec.new do |spec|
@@ -24,7 +25,7 @@ Pod::Spec.new do |spec|
spec.license = package['license']
spec.author = "Facebook"
spec.source = source
- spec.platforms = { :osx => "10.13", :ios => "13.4" }
+ spec.platforms = { :osx => "10.13", :ios => "13.4", :visionos => "1.0" }
spec.preserve_paths = '**/*.*'
spec.source_files = ''
@@ -35,6 +36,7 @@ Pod::Spec.new do |spec|
}
spec.ios.vendored_frameworks = "destroot/Library/Frameworks/ios/hermes.framework"
+ spec.visionos.vendored_frameworks = "destroot/Library/Frameworks/xros/hermes.framework"
spec.osx.vendored_frameworks = "destroot/Library/Frameworks/macosx/hermes.framework"
if HermesEngineSourceType::isPrebuilt(source_type) then
@@ -44,6 +46,7 @@ Pod::Spec.new do |spec|
ss.source_files = "destroot/include/hermes/**/*.h"
ss.header_mappings_dir = "destroot/include"
ss.ios.vendored_frameworks = "destroot/Library/Frameworks/universal/hermes.xcframework"
+ ss.visionos.vendored_frameworks = "destroot/Library/Frameworks/universal/hermes.xcframework"
ss.osx.vendored_frameworks = "destroot/Library/Frameworks/macosx/hermes.framework"
end
@@ -136,7 +139,7 @@ Pod::Spec.new do |spec|
:name => '[RN] [2] Build Hermes',
:input_files => ["#{hermesc_path}/ImportHermesc.cmake"],
:output_files => [
- "${PODS_ROOT}/hermes-engine/build/iphonesimulator/API/hermes/hermes.framework/hermes"
+ "${PODS_ROOT}/hermes-engine/build/xrsimulator/API/hermes/hermes.framework/hermes",
],
:script => <<-EOS
. "${REACT_NATIVE_PATH}/scripts/xcode/with-environment.sh"
diff --git a/packages/react-native/sdks/hermes-engine/utils/build-hermes-xcode.sh b/packages/react-native/sdks/hermes-engine/utils/build-hermes-xcode.sh
index 7d44c4cccb40b6..6062f221625d9d 100755
--- a/packages/react-native/sdks/hermes-engine/utils/build-hermes-xcode.sh
+++ b/packages/react-native/sdks/hermes-engine/utils/build-hermes-xcode.sh
@@ -16,8 +16,11 @@ function get_platform_copy_destination {
if [[ $1 == "macosx" ]]; then
echo "macosx"
return
+ elif [[ $1 == "xrsimulator" || $1 == "xros" ]]; then
+ echo "xros"
+ return
fi
-
+
echo "ios"
}
@@ -25,8 +28,10 @@ function get_deployment_target {
if [[ $1 == "macosx" ]]; then
echo ${MACOSX_DEPLOYMENT_TARGET}
return
+ elif [[ $1 == "xrsimulator" || $1 == "xros" ]]; then
+ echo ${XROS_DEPLOYMENT_TARGET}
+ return
fi
-
echo ${IPHONEOS_DEPLOYMENT_TARGET}
}
diff --git a/packages/react-native/sdks/hermes-engine/utils/build-hermesc-xcode.sh b/packages/react-native/sdks/hermes-engine/utils/build-hermesc-xcode.sh
index 132ee54c734566..f536b0c4c3b01c 100755
--- a/packages/react-native/sdks/hermes-engine/utils/build-hermesc-xcode.sh
+++ b/packages/react-native/sdks/hermes-engine/utils/build-hermesc-xcode.sh
@@ -9,6 +9,21 @@ set -x -e
hermesc_dir_path="$1"; shift
jsi_path="$1"
+
+# VisionOS support has been added to CMake from version 3.28.0 onwards. Error out if the version is lower.
+function check_cmake_version {
+ required_version="3.28.0"
+ cmake_version=$($CMAKE_BINARY --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n 1)
+
+ if ! printf "%s\n%s\n" "$required_version" "$cmake_version" | sort -V | head -n 1 | grep -q "$required_version"; then
+ echo "error: CMake version $required_version or higher is required. Found: $cmake_version"
+ exit 1
+ fi
+}
+
+check_cmake_version
+
+
# This script is supposed to be executed from Xcode "run script" phase.
# Xcode sets up its build environment based on the build target (iphone, iphonesimulator, macodsx).
# We want to make sure that hermesc is built for mac.
diff --git a/packages/react-native/sdks/hermes-engine/utils/create-dummy-hermes-xcframework.sh b/packages/react-native/sdks/hermes-engine/utils/create-dummy-hermes-xcframework.sh
index aa4482270ae983..4419de96bac7bc 100644
--- a/packages/react-native/sdks/hermes-engine/utils/create-dummy-hermes-xcframework.sh
+++ b/packages/react-native/sdks/hermes-engine/utils/create-dummy-hermes-xcframework.sh
@@ -19,7 +19,7 @@ pushd destroot/Library/Frameworks > /dev/null || exit 1
echo '' > dummy.c
-platforms=( "macosx" "ios" ) # Add other platforms here if needed
+platforms=( "macosx" "ios" "xros" ) # Add other platforms here if needed
for platform in "${platforms[@]}"
do
diff --git a/packages/react-native/src/private/specs/visionos_modules/NativeWindowManager.js b/packages/react-native/src/private/specs/visionos_modules/NativeWindowManager.js
new file mode 100644
index 00000000000000..d726a0c344279f
--- /dev/null
+++ b/packages/react-native/src/private/specs/visionos_modules/NativeWindowManager.js
@@ -0,0 +1,28 @@
+/**
+ * @flow strict
+ * @format
+ */
+
+import type {TurboModule} from '../../../../Libraries/TurboModule/RCTExport';
+
+import * as TurboModuleRegistry from '../../../../Libraries/TurboModule/TurboModuleRegistry';
+
+export type WindowManagerConstants = {|
+ +supportsMultipleScenes?: boolean,
+|};
+
+export interface Spec extends TurboModule {
+ +getConstants: () => WindowManagerConstants;
+
+ // $FlowIgnore[unclear-type]
+ +openWindow: (windowId: string, userInfo: Object) => Promise;
+ // $FlowIgnore[unclear-type]
+ +updateWindow: (windowId: string, userInfo: Object) => Promise;
+ +closeWindow: (windowId: string) => Promise;
+
+ // RCTEventEmitter
+ +addListener: (eventName: string) => void;
+ +removeListeners: (count: number) => void;
+}
+
+export default (TurboModuleRegistry.get('WindowManager'): ?Spec);
diff --git a/packages/react-native/src/private/specs/visionos_modules/NativeXRModule.js b/packages/react-native/src/private/specs/visionos_modules/NativeXRModule.js
new file mode 100644
index 00000000000000..f96c2a84a48ac4
--- /dev/null
+++ b/packages/react-native/src/private/specs/visionos_modules/NativeXRModule.js
@@ -0,0 +1,16 @@
+/**
+ * @flow strict
+ * @format
+ */
+
+import type {TurboModule} from '../../../../Libraries/TurboModule/RCTExport';
+
+import * as TurboModuleRegistry from '../../../../Libraries/TurboModule/TurboModuleRegistry';
+
+export interface Spec extends TurboModule {
+ // $FlowIgnore[unclear-type]
+ +requestSession: (sessionId?: string, userInfo: Object) => Promise;
+ +endSession: () => Promise;
+}
+
+export default (TurboModuleRegistry.get('XRModule'): ?Spec);
diff --git a/packages/react-native/template.config.js b/packages/react-native/template.config.js
index c075f1d2fd951f..d21bcccc3b9e15 100644
--- a/packages/react-native/template.config.js
+++ b/packages/react-native/template.config.js
@@ -9,4 +9,6 @@ module.exports = {
placeholderName: 'HelloWorld',
titlePlaceholder: 'Hello App Display Name',
templateDir: './template',
+ platforms: ['visionos'],
+ postInitScript: './postInitScript'
};
diff --git a/packages/react-native/template/App.tsx b/packages/react-native/template/App.tsx
index 125fe1b98eb3be..e50b7452929dd2 100644
--- a/packages/react-native/template/App.tsx
+++ b/packages/react-native/template/App.tsx
@@ -7,15 +7,7 @@
import React from 'react';
import type {PropsWithChildren} from 'react';
-import {
- SafeAreaView,
- ScrollView,
- StatusBar,
- StyleSheet,
- Text,
- useColorScheme,
- View,
-} from 'react-native';
+import {ScrollView, StyleSheet, Text, useColorScheme, View} from 'react-native';
import {
Colors,
@@ -56,43 +48,26 @@ function Section({children, title}: SectionProps): React.JSX.Element {
}
function App(): React.JSX.Element {
- const isDarkMode = useColorScheme() === 'dark';
-
- const backgroundStyle = {
- backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
- };
-
return (
-
-
-
-
-
-
- Edit App.tsx to change this
- screen and then come back to see your edits.
-
-
-
-
- Read the docs to discover what to do next:
-
-
-
-
-
+
+
+
+
+ Edit App.tsx to change this
+ screen and then come back to see your edits.
+
+
+
+
+ Read the docs to discover what to do next:
+
+
+
+
);
}
diff --git a/packages/react-native/template/metro.config.js b/packages/react-native/template/metro.config.js
index 9d41685ef1bfc2..d8a58b2b792d3d 100644
--- a/packages/react-native/template/metro.config.js
+++ b/packages/react-native/template/metro.config.js
@@ -1,4 +1,5 @@
const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
+const {getPlatformResolver} = require('@callstack/out-of-tree-platforms');
/**
* Metro configuration
@@ -6,6 +7,14 @@ const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
*
* @type {import('metro-config').MetroConfig}
*/
-const config = {};
+
+
+const config = {
+ resolver: {
+ resolveRequest: getPlatformResolver({
+ platformNameMap: {visionos: '@callstack/react-native-visionos'},
+ }),
+ },
+};
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
diff --git a/packages/react-native/template/package.json b/packages/react-native/template/package.json
index 525405e88263ee..629f6ae71cdb46 100644
--- a/packages/react-native/template/package.json
+++ b/packages/react-native/template/package.json
@@ -5,13 +5,15 @@
"scripts": {
"android": "react-native run-android",
"ios": "react-native run-ios",
+ "visionos": "react-native run-visionos",
"lint": "eslint .",
"start": "react-native start",
"test": "jest"
},
"dependencies": {
"react": "18.3.1",
- "react-native": "1000.0.0"
+ "react-native": "1000.0.0",
+ "@callstack/react-native-visionos": "1000.0.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
@@ -21,6 +23,7 @@
"@react-native/eslint-config": "0.75.0-main",
"@react-native/metro-config": "0.75.0-main",
"@react-native/typescript-config": "0.75.0-main",
+ "@callstack/out-of-tree-platforms": "0.75.0-main",
"@types/react": "^18.2.6",
"@types/react-test-renderer": "^18.0.0",
"babel-jest": "^29.6.3",
diff --git a/packages/react-native/template/visionos/HelloWorld.xcodeproj/project.pbxproj b/packages/react-native/template/visionos/HelloWorld.xcodeproj/project.pbxproj
new file mode 100644
index 00000000000000..b7d8ff5cd7e482
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorld.xcodeproj/project.pbxproj
@@ -0,0 +1,693 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 00E356F31AD99517003FC87E /* HelloWorldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* HelloWorldTests.m */; };
+ 0C80B921A6F3F58F76C31292 /* libPods-HelloWorld.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-HelloWorld.a */; };
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
+ 767CEBBC2B582F6B000139AD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767CEBBB2B582F6B000139AD /* AppDelegate.swift */; };
+ 767CEBBE2B582F78000139AD /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767CEBBD2B582F78000139AD /* App.swift */; };
+ 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = HelloWorld/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 7699B88040F8A987B510C191 /* libPods-HelloWorld-HelloWorldTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-HelloWorld-HelloWorldTests.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
+ remoteInfo = HelloWorld;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 00E356EE1AD99517003FC87E /* HelloWorldTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HelloWorldTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 00E356F21AD99517003FC87E /* HelloWorldTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HelloWorldTests.m; sourceTree = ""; };
+ 13B07F961A680F5B00A75B9A /* HelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HelloWorld/Images.xcassets; sourceTree = ""; };
+ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = HelloWorld/Info.plist; sourceTree = ""; };
+ 19F6CBCC0A4E27FBF8BF4A61 /* libPods-HelloWorld-HelloWorldTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HelloWorld-HelloWorldTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3B4392A12AC88292D35C810B /* Pods-HelloWorld.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.debug.xcconfig"; path = "Target Support Files/Pods-HelloWorld/Pods-HelloWorld.debug.xcconfig"; sourceTree = ""; };
+ 5709B34CF0A7D63546082F79 /* Pods-HelloWorld.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.release.xcconfig"; path = "Target Support Files/Pods-HelloWorld/Pods-HelloWorld.release.xcconfig"; sourceTree = ""; };
+ 5B7EB9410499542E8C5724F5 /* Pods-HelloWorld-HelloWorldTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld-HelloWorldTests.debug.xcconfig"; path = "Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests.debug.xcconfig"; sourceTree = ""; };
+ 5DCACB8F33CDC322A6C60F78 /* libPods-HelloWorld.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HelloWorld.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 767CEBBB2B582F6B000139AD /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = HelloWorld/AppDelegate.swift; sourceTree = ""; };
+ 767CEBBD2B582F78000139AD /* App.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = App.swift; path = HelloWorld/App.swift; sourceTree = ""; };
+ 89C6BE57DB24E9ADA2F236DE /* Pods-HelloWorld-HelloWorldTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld-HelloWorldTests.release.xcconfig"; path = "Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests.release.xcconfig"; sourceTree = ""; };
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 00E356EB1AD99517003FC87E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7699B88040F8A987B510C191 /* libPods-HelloWorld-HelloWorldTests.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0C80B921A6F3F58F76C31292 /* libPods-HelloWorld.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 00E356EF1AD99517003FC87E /* HelloWorldTests */ = {
+ isa = PBXGroup;
+ children = (
+ 00E356F21AD99517003FC87E /* HelloWorldTests.m */,
+ 00E356F01AD99517003FC87E /* Supporting Files */,
+ );
+ path = HelloWorldTests;
+ sourceTree = "";
+ };
+ 00E356F01AD99517003FC87E /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 00E356F11AD99517003FC87E /* Info.plist */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ 13B07FAE1A68108700A75B9A /* HelloWorld */ = {
+ isa = PBXGroup;
+ children = (
+ 767CEBBB2B582F6B000139AD /* AppDelegate.swift */,
+ 767CEBBD2B582F78000139AD /* App.swift */,
+ 13B07FB51A68108700A75B9A /* Images.xcassets */,
+ 13B07FB61A68108700A75B9A /* Info.plist */,
+ 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
+ );
+ name = HelloWorld;
+ sourceTree = "";
+ };
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
+ 5DCACB8F33CDC322A6C60F78 /* libPods-HelloWorld.a */,
+ 19F6CBCC0A4E27FBF8BF4A61 /* libPods-HelloWorld-HelloWorldTests.a */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Libraries;
+ sourceTree = "";
+ };
+ 83CBB9F61A601CBA00E9B192 = {
+ isa = PBXGroup;
+ children = (
+ 13B07FAE1A68108700A75B9A /* HelloWorld */,
+ 832341AE1AAA6A7D00B99B32 /* Libraries */,
+ 00E356EF1AD99517003FC87E /* HelloWorldTests */,
+ 83CBBA001A601CBA00E9B192 /* Products */,
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */,
+ BBD78D7AC51CEA395F1C20DB /* Pods */,
+ );
+ indentWidth = 2;
+ sourceTree = "";
+ tabWidth = 2;
+ usesTabs = 0;
+ };
+ 83CBBA001A601CBA00E9B192 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 13B07F961A680F5B00A75B9A /* HelloWorld.app */,
+ 00E356EE1AD99517003FC87E /* HelloWorldTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ BBD78D7AC51CEA395F1C20DB /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 3B4392A12AC88292D35C810B /* Pods-HelloWorld.debug.xcconfig */,
+ 5709B34CF0A7D63546082F79 /* Pods-HelloWorld.release.xcconfig */,
+ 5B7EB9410499542E8C5724F5 /* Pods-HelloWorld-HelloWorldTests.debug.xcconfig */,
+ 89C6BE57DB24E9ADA2F236DE /* Pods-HelloWorld-HelloWorldTests.release.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 00E356ED1AD99517003FC87E /* HelloWorldTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "HelloWorldTests" */;
+ buildPhases = (
+ A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */,
+ 00E356EA1AD99517003FC87E /* Sources */,
+ 00E356EB1AD99517003FC87E /* Frameworks */,
+ 00E356EC1AD99517003FC87E /* Resources */,
+ C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */,
+ F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 00E356F51AD99517003FC87E /* PBXTargetDependency */,
+ );
+ name = HelloWorldTests;
+ productName = HelloWorldTests;
+ productReference = 00E356EE1AD99517003FC87E /* HelloWorldTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 13B07F861A680F5B00A75B9A /* HelloWorld */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */;
+ buildPhases = (
+ C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */,
+ 13B07F871A680F5B00A75B9A /* Sources */,
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */,
+ 13B07F8E1A680F5B00A75B9A /* Resources */,
+ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
+ 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */,
+ E235C05ADACE081382539298 /* [CP] Copy Pods Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = HelloWorld;
+ productName = HelloWorld;
+ productReference = 13B07F961A680F5B00A75B9A /* HelloWorld.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 83CBB9F71A601CBA00E9B192 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 1210;
+ TargetAttributes = {
+ 00E356ED1AD99517003FC87E = {
+ CreatedOnToolsVersion = 6.2;
+ TestTargetID = 13B07F861A680F5B00A75B9A;
+ };
+ 13B07F861A680F5B00A75B9A = {
+ LastSwiftMigration = 1120;
+ };
+ };
+ };
+ buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "HelloWorld" */;
+ compatibilityVersion = "Xcode 12.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 83CBB9F61A601CBA00E9B192;
+ productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 13B07F861A680F5B00A75B9A /* HelloWorld */,
+ 00E356ED1AD99517003FC87E /* HelloWorldTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 00E356EC1AD99517003FC87E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F8E1A680F5B00A75B9A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "$(SRCROOT)/.xcode.env.local",
+ "$(SRCROOT)/.xcode.env",
+ );
+ name = "Bundle React Native code and images";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/@callstack/react-native-visionos/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/@callstack/react-native-visionos/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
+ };
+ 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-HelloWorld-HelloWorldTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-HelloWorld-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Copy Pods Resources";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests-resources-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Copy Pods Resources";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests-resources-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 00E356EA1AD99517003FC87E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 00E356F31AD99517003FC87E /* HelloWorldTests.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F871A680F5B00A75B9A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 767CEBBC2B582F6B000139AD /* AppDelegate.swift in Sources */,
+ 767CEBBE2B582F78000139AD /* App.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 13B07F861A680F5B00A75B9A /* HelloWorld */;
+ targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 00E356F61AD99517003FC87E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-HelloWorld-HelloWorldTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ INFOPLIST_FILE = HelloWorldTests/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.4;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ OTHER_LDFLAGS = (
+ "-ObjC",
+ "-lc++",
+ "$(inherited)",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloWorld.app/HelloWorld";
+ };
+ name = Debug;
+ };
+ 00E356F71AD99517003FC87E /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-HelloWorld-HelloWorldTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ COPY_PHASE_STRIP = NO;
+ INFOPLIST_FILE = HelloWorldTests/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.4;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ OTHER_LDFLAGS = (
+ "-ObjC",
+ "-lc++",
+ "$(inherited)",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloWorld.app/HelloWorld";
+ };
+ name = Release;
+ };
+ 13B07F941A680F5B00A75B9A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-HelloWorld.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = HelloWorld/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-ObjC",
+ "-lc++",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
+ PRODUCT_NAME = HelloWorld;
+ SUPPORTED_PLATFORMS = "xros xrsimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 7;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 13B07F951A680F5B00A75B9A /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-HelloWorld.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ INFOPLIST_FILE = HelloWorld/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-ObjC",
+ "-lc++",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
+ PRODUCT_NAME = HelloWorld;
+ SUPPORTED_PLATFORMS = "xros xrsimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 7;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+ 83CBBA201A601CBA00E9B192 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++20";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.4;
+ LD_RUNPATH_SEARCH_PATHS = (
+ /usr/lib/swift,
+ "$(inherited)",
+ );
+ LIBRARY_SEARCH_PATHS = (
+ "\"$(SDKROOT)/usr/lib/swift\"",
+ "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
+ "\"$(inherited)\"",
+ );
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_CPLUSPLUSFLAGS = (
+ "$(OTHER_CFLAGS)",
+ "-DFOLLY_NO_CONFIG",
+ "-DFOLLY_MOBILE=1",
+ "-DFOLLY_USE_LIBCPP=1",
+ "-DFOLLY_CFG_NO_COROUTINES=1",
+ "-DFOLLY_HAVE_CLOCK_GETTIME=1",
+ );
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 83CBBA211A601CBA00E9B192 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++20";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.4;
+ LD_RUNPATH_SEARCH_PATHS = (
+ /usr/lib/swift,
+ "$(inherited)",
+ );
+ LIBRARY_SEARCH_PATHS = (
+ "\"$(SDKROOT)/usr/lib/swift\"",
+ "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
+ "\"$(inherited)\"",
+ );
+ MTL_ENABLE_DEBUG_INFO = NO;
+ OTHER_CPLUSPLUSFLAGS = (
+ "$(OTHER_CFLAGS)",
+ "-DFOLLY_NO_CONFIG",
+ "-DFOLLY_MOBILE=1",
+ "-DFOLLY_USE_LIBCPP=1",
+ "-DFOLLY_CFG_NO_COROUTINES=1",
+ "-DFOLLY_HAVE_CLOCK_GETTIME=1",
+ );
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "HelloWorldTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 00E356F61AD99517003FC87E /* Debug */,
+ 00E356F71AD99517003FC87E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 13B07F941A680F5B00A75B9A /* Debug */,
+ 13B07F951A680F5B00A75B9A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "HelloWorld" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 83CBBA201A601CBA00E9B192 /* Debug */,
+ 83CBBA211A601CBA00E9B192 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
+}
diff --git a/packages/react-native/template/visionos/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme b/packages/react-native/template/visionos/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme
new file mode 100644
index 00000000000000..b57be22ab2d66f
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/react-native/template/visionos/HelloWorld/App.swift b/packages/react-native/template/visionos/HelloWorld/App.swift
new file mode 100644
index 00000000000000..c1d601b2201ba9
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorld/App.swift
@@ -0,0 +1,12 @@
+import SwiftUI
+import React
+import React_RCTSwiftExtensions
+
+@main
+struct HelloWorldApp: App {
+ @UIApplicationDelegateAdaptor var delegate: AppDelegate
+
+ var body: some Scene {
+ RCTMainWindow(moduleName: "HelloWorld")
+ }
+}
diff --git a/packages/react-native/template/visionos/HelloWorld/AppDelegate.swift b/packages/react-native/template/visionos/HelloWorld/AppDelegate.swift
new file mode 100644
index 00000000000000..4e68fb4c1bd7ab
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorld/AppDelegate.swift
@@ -0,0 +1,17 @@
+import UIKit
+import React
+import React_RCTAppDelegate
+
+class AppDelegate: RCTAppDelegate {
+ override func sourceURL(for bridge: RCTBridge) -> URL? {
+ self.bundleURL()
+ }
+
+ override func bundleURL() -> URL? {
+#if DEBUG
+ RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")
+#else
+ Bundle.main.url(forResource: "main", withExtension: "jsbundle")
+#endif
+ }
+}
diff --git a/packages/react-native/template/visionos/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json b/packages/react-native/template/visionos/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000000000..81213230deb40d
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,53 @@
+{
+ "images" : [
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "60x60"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "60x60"
+ },
+ {
+ "idiom" : "ios-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/react-native/template/visionos/HelloWorld/Images.xcassets/Contents.json b/packages/react-native/template/visionos/HelloWorld/Images.xcassets/Contents.json
new file mode 100644
index 00000000000000..2d92bd53fdb222
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorld/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/packages/react-native/template/visionos/HelloWorld/Info.plist b/packages/react-native/template/visionos/HelloWorld/Info.plist
new file mode 100644
index 00000000000000..2f57133ef1d075
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorld/Info.plist
@@ -0,0 +1,57 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleDisplayName
+ Hello App Display Name
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(MARKETING_VERSION)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(CURRENT_PROJECT_VERSION)
+ LSRequiresIPhoneOS
+
+ NSAppTransportSecurity
+
+
+ NSAllowsArbitraryLoads
+
+ NSAllowsLocalNetworking
+
+
+ NSLocationWhenInUseUsageDescription
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+
+
+
diff --git a/packages/react-native/template/visionos/HelloWorld/PrivacyInfo.xcprivacy b/packages/react-native/template/visionos/HelloWorld/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000000000..ef1896e70c88da
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorld/PrivacyInfo.xcprivacy
@@ -0,0 +1,38 @@
+
+
+
+
+ NSPrivacyCollectedDataTypes
+
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+
+ CA92.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategorySystemBootTime
+ NSPrivacyAccessedAPITypeReasons
+
+ 35F9.1
+
+
+
+ NSPrivacyTracking
+
+
+
diff --git a/packages/react-native/template/visionos/HelloWorldTests/HelloWorldTests.m b/packages/react-native/template/visionos/HelloWorldTests/HelloWorldTests.m
new file mode 100644
index 00000000000000..884d405d6579c6
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorldTests/HelloWorldTests.m
@@ -0,0 +1,66 @@
+#import
+#import
+
+#import
+#import
+
+#define TIMEOUT_SECONDS 600
+#define TEXT_TO_LOOK_FOR @"Welcome to React"
+
+@interface HelloWorldTests : XCTestCase
+
+@end
+
+@implementation HelloWorldTests
+
+- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test
+{
+ if (test(view)) {
+ return YES;
+ }
+ for (UIView *subview in [view subviews]) {
+ if ([self findSubviewInView:subview matching:test]) {
+ return YES;
+ }
+ }
+ return NO;
+}
+
+- (void)testRendersWelcomeScreen
+{
+ UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
+ BOOL foundElement = NO;
+
+ __block NSString *redboxError = nil;
+#ifdef DEBUG
+ RCTSetLogFunction(
+ ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
+ if (level >= RCTLogLevelError) {
+ redboxError = message;
+ }
+ });
+#endif
+
+ while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
+ [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
+ [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
+
+ foundElement = [self findSubviewInView:vc.view
+ matching:^BOOL(UIView *view) {
+ if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
+ return YES;
+ }
+ return NO;
+ }];
+ }
+
+#ifdef DEBUG
+ RCTSetLogFunction(RCTDefaultLogFunction);
+#endif
+
+ XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
+ XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
+}
+
+@end
diff --git a/packages/react-native/template/visionos/HelloWorldTests/Info.plist b/packages/react-native/template/visionos/HelloWorldTests/Info.plist
new file mode 100644
index 00000000000000..ba72822e8728ef
--- /dev/null
+++ b/packages/react-native/template/visionos/HelloWorldTests/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ BNDL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+
+
diff --git a/packages/react-native/template/visionos/Podfile b/packages/react-native/template/visionos/Podfile
new file mode 100644
index 00000000000000..c6d5ba6c29b336
--- /dev/null
+++ b/packages/react-native/template/visionos/Podfile
@@ -0,0 +1,40 @@
+# Resolve react_native_pods.rb with node to allow for hoisting
+require Pod::Executable.execute_command('node', ['-p',
+ 'require.resolve(
+ "@callstack/react-native-visionos/scripts/react_native_pods.rb",
+ {paths: [process.argv[1]]},
+ )', __dir__]).strip
+
+platform :visionos, min_visionos_version_supported
+prepare_react_native_project!
+
+linkage = ENV['USE_FRAMEWORKS']
+if linkage != nil
+ Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
+ use_frameworks! :linkage => linkage.to_sym
+end
+
+target 'HelloWorld' do
+ config = use_native_modules!
+ config[:reactNativePath] = '../node_modules/@callstack/react-native-visionos'
+
+ use_react_native!(
+ :path => config[:reactNativePath],
+ # An absolute path to your application root.
+ :app_path => "#{Pod::Config.instance.installation_root}/.."
+ )
+
+ target 'HelloWorldTests' do
+ inherit! :complete
+ # Pods for testing
+ end
+
+ post_install do |installer|
+ # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202
+ react_native_post_install(
+ installer,
+ config[:reactNativePath],
+ :mac_catalyst_enabled => false
+ )
+ end
+end
diff --git a/packages/react-native/template/visionos/_xcode.env b/packages/react-native/template/visionos/_xcode.env
new file mode 100644
index 00000000000000..3d5782c71568d3
--- /dev/null
+++ b/packages/react-native/template/visionos/_xcode.env
@@ -0,0 +1,11 @@
+# This `.xcode.env` file is versioned and is used to source the environment
+# used when running script phases inside Xcode.
+# To customize your local environment, you can create an `.xcode.env.local`
+# file that is not versioned.
+
+# NODE_BINARY variable contains the PATH to the node executable.
+#
+# Customize the NODE_BINARY variable here.
+# For example, to use nvm with brew, add the following line
+# . "$(brew --prefix nvm)/nvm.sh" --no-use
+export NODE_BINARY=$(command -v node)
diff --git a/packages/react-native/third-party-podspecs/SocketRocket.podspec b/packages/react-native/third-party-podspecs/SocketRocket.podspec
new file mode 100644
index 00000000000000..7e65ab07b1710a
--- /dev/null
+++ b/packages/react-native/third-party-podspecs/SocketRocket.podspec
@@ -0,0 +1,21 @@
+Pod::Spec.new do |s|
+ s.name = 'SocketRocket'
+ s.version = '0.7.0.1'
+ s.summary = 'A conforming WebSocket (RFC 6455) client library for iOS, macOS and tvOS.'
+ s.homepage = 'https://github.com/facebook/SocketRocket'
+ s.authors = { 'Nikita Lutsenko' => 'nlutsenko@me.com', 'Dan Federman' => 'federman@squareup.com', 'Mike Lewis' => 'mikelikespie@gmail.com' }
+ s.license = 'BSD'
+ s.source = { :git => 'https://github.com/facebook/SocketRocket.git', :tag => '0.7.0' }
+ s.requires_arc = true
+
+ s.source_files = 'SocketRocket/**/*.{h,m}'
+ s.public_header_files = 'SocketRocket/*.h'
+
+ s.platforms = min_supported_versions
+
+ s.ios.frameworks = 'CFNetwork', 'Security'
+ s.osx.frameworks = 'CoreServices', 'Security'
+ s.tvos.frameworks = 'CFNetwork', 'Security'
+ s.visionos.frameworks = 'CFNetwork', 'Security'
+ s.libraries = 'icucore'
+ end
\ No newline at end of file
diff --git a/packages/react-native/types/index.d.ts b/packages/react-native/types/index.d.ts
index 5aeec0685ed009..5c89c19b97c707 100644
--- a/packages/react-native/types/index.d.ts
+++ b/packages/react-native/types/index.d.ts
@@ -147,6 +147,8 @@ export * from '../Libraries/Utilities/Dimensions';
export * from '../Libraries/Utilities/PixelRatio';
export * from '../Libraries/Utilities/Platform';
export * from '../Libraries/Vibration/Vibration';
+export * from '../Libraries/XR/XR';
+export * from '../Libraries/WindowManager/WindowManager';
export * from '../Libraries/YellowBox/YellowBoxDeprecated';
export * from '../Libraries/vendor/core/ErrorUtils';
export {
diff --git a/packages/react-native/types/tsconfig.json b/packages/react-native/types/tsconfig.json
index 7cabbef31792d9..8f693581db76f3 100644
--- a/packages/react-native/types/tsconfig.json
+++ b/packages/react-native/types/tsconfig.json
@@ -1,15 +1,18 @@
{
- "compilerOptions": {
- "module": "commonjs",
- "lib": ["es6"],
- "noImplicitAny": true,
- "noImplicitThis": true,
- "strictFunctionTypes": true,
- "strictNullChecks": true,
- "types": [],
- "jsx": "react",
- "noEmit": true,
- "forceConsistentCasingInFileNames": true,
- "paths": {"react-native": ["."]}
+ "compilerOptions": {
+ "module": "commonjs",
+ "lib": ["es6"],
+ "noImplicitAny": true,
+ "noImplicitThis": true,
+ "strictFunctionTypes": true,
+ "strictNullChecks": true,
+ "types": [],
+ "jsx": "react",
+ "noEmit": true,
+ "forceConsistentCasingInFileNames": true,
+ "paths": {
+ "react-native": ["."],
+ "react-native/*": ["../*"]
}
}
+}
diff --git a/packages/rn-tester/NativeModuleExample/ScreenshotManager.podspec b/packages/rn-tester/NativeModuleExample/ScreenshotManager.podspec
index 17daaf5934d9fd..3177cf590fe73a 100644
--- a/packages/rn-tester/NativeModuleExample/ScreenshotManager.podspec
+++ b/packages/rn-tester/NativeModuleExample/ScreenshotManager.podspec
@@ -21,6 +21,7 @@ Pod::Spec.new do |s|
s.source_files = "**/*.{h,m,mm,swift}"
s.requires_arc = true
+ s.framework = ["UIKit", "CoreGraphics"]
install_modules_dependencies(s)
end
diff --git a/packages/rn-tester/Podfile b/packages/rn-tester/Podfile
index 7e723ec52341e6..819991e9294562 100644
--- a/packages/rn-tester/Podfile
+++ b/packages/rn-tester/Podfile
@@ -67,10 +67,15 @@ target 'RNTester' do
pods('RNTester')
end
+target('RNTester-visionOS') do
+ platform :visionos, min_visionos_version_supported
+ pods('RNTester-visionOS')
+end
+
target 'RNTesterUnitTests' do
pods('RNTesterUnitTests')
pod 'React-RCTTest', :path => "./RCTTest"
- pod 'OCMock', '~> 3.9.1'
+ pod 'OCMock', :git => 'https://github.com/erikdoe/ocmock.git', :tag => 'v3.9.2'
end
target 'RNTesterIntegrationTests' do
diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock
index 07b5b5b40b7d4e..023e51c7c43958 100644
--- a/packages/rn-tester/Podfile.lock
+++ b/packages/rn-tester/Podfile.lock
@@ -57,7 +57,28 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- - OCMock (3.9.1)
+ - OCMock (3.9.2)
+ - OSSLibraryExample (0.0.1):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.01.01.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
- RCT-Folly (2024.01.01.00):
- boost
- DoubleConversion
@@ -93,6 +114,8 @@ PODS:
- React-RCTSettings (= 1000.0.0)
- React-RCTText (= 1000.0.0)
- React-RCTVibration (= 1000.0.0)
+ - React-RCTWindowManager (= 1000.0.0)
+ - React-RCTXR (= 1000.0.0)
- React-callinvoker (1000.0.0)
- React-Core (1000.0.0):
- glog
@@ -109,7 +132,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/CoreModulesHeaders (1000.0.0):
- glog
@@ -126,7 +149,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/Default (1000.0.0):
- glog
@@ -142,7 +165,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/DevSupport (1000.0.0):
- glog
@@ -160,7 +183,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTActionSheetHeaders (1000.0.0):
- glog
@@ -177,7 +200,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTAnimationHeaders (1000.0.0):
- glog
@@ -194,7 +217,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTBlobHeaders (1000.0.0):
- glog
@@ -211,7 +234,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTImageHeaders (1000.0.0):
- glog
@@ -228,7 +251,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTLinkingHeaders (1000.0.0):
- glog
@@ -245,7 +268,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTNetworkHeaders (1000.0.0):
- glog
@@ -262,7 +285,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTPushNotificationHeaders (1000.0.0):
- glog
@@ -279,7 +302,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTSettingsHeaders (1000.0.0):
- glog
@@ -296,7 +319,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTTextHeaders (1000.0.0):
- glog
@@ -313,7 +336,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTVibrationHeaders (1000.0.0):
- glog
@@ -330,7 +353,7 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-Core/RCTWebSocket (1000.0.0):
- glog
@@ -347,7 +370,41 @@ PODS:
- React-perflogger
- React-runtimescheduler
- React-utils
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
+ - Yoga
+ - React-Core/RCTWindowManagerHeaders (1000.0.0):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.01.01.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.0.1)
+ - Yoga
+ - React-Core/RCTXRHeaders (1000.0.0):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.01.01.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.0.1)
- Yoga
- React-CoreModules (1000.0.0):
- DoubleConversion
@@ -362,7 +419,7 @@ PODS:
- React-RCTImage (= 1000.0.0)
- ReactCodegen
- ReactCommon
- - SocketRocket (= 0.7.0)
+ - SocketRocket (= 0.7.0.1)
- React-cxxreact (1000.0.0):
- boost
- DoubleConversion
@@ -378,6 +435,30 @@ PODS:
- React-perflogger (= 1000.0.0)
- React-runtimeexecutor (= 1000.0.0)
- React-debug (1000.0.0)
+ - React-defaultsnativemodule (1000.0.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.01.01.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-domnativemodule
+ - React-Fabric
+ - React-featureflags
+ - React-featureflagsnativemodule
+ - React-graphics
+ - React-ImageManager
+ - React-microtasksnativemodule
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
- React-domnativemodule (1000.0.0):
- DoubleConversion
- glog
@@ -388,9 +469,7 @@ PODS:
- React-Core
- React-debug
- React-Fabric
- - React-Fabric/components/root
- - React-Fabric/dom
- - React-Fabric/uimanager
+ - React-FabricComponents
- React-featureflags
- React-graphics
- React-ImageManager
@@ -423,10 +502,10 @@ PODS:
- React-Fabric/imagemanager (= 1000.0.0)
- React-Fabric/leakchecker (= 1000.0.0)
- React-Fabric/mounting (= 1000.0.0)
+ - React-Fabric/observers (= 1000.0.0)
- React-Fabric/scheduler (= 1000.0.0)
- React-Fabric/telemetry (= 1000.0.0)
- React-Fabric/templateprocessor (= 1000.0.0)
- - React-Fabric/textlayoutmanager (= 1000.0.0)
- React-Fabric/uimanager (= 1000.0.0)
- React-featureflags
- React-graphics
@@ -528,17 +607,8 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/components/inputaccessory (= 1000.0.0)
- - React-Fabric/components/iostextinput (= 1000.0.0)
- React-Fabric/components/legacyviewmanagerinterop (= 1000.0.0)
- - React-Fabric/components/modal (= 1000.0.0)
- - React-Fabric/components/rncore (= 1000.0.0)
- React-Fabric/components/root (= 1000.0.0)
- - React-Fabric/components/safeareaview (= 1000.0.0)
- - React-Fabric/components/scrollview (= 1000.0.0)
- - React-Fabric/components/text (= 1000.0.0)
- - React-Fabric/components/textinput (= 1000.0.0)
- - React-Fabric/components/unimplementedview (= 1000.0.0)
- React-Fabric/components/view (= 1000.0.0)
- React-featureflags
- React-graphics
@@ -549,7 +619,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/inputaccessory (1000.0.0):
+ - React-Fabric/components/legacyviewmanagerinterop (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -569,7 +639,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/iostextinput (1000.0.0):
+ - React-Fabric/components/root (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -589,7 +659,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/legacyviewmanagerinterop (1000.0.0):
+ - React-Fabric/components/view (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -609,7 +679,8 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/modal (1000.0.0):
+ - Yoga
+ - React-Fabric/core (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -629,7 +700,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/rncore (1000.0.0):
+ - React-Fabric/dom (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -649,7 +720,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/root (1000.0.0):
+ - React-Fabric/imagemanager (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -669,7 +740,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/safeareaview (1000.0.0):
+ - React-Fabric/leakchecker (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -689,7 +760,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/scrollview (1000.0.0):
+ - React-Fabric/mounting (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -709,7 +780,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/text (1000.0.0):
+ - React-Fabric/observers (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -720,6 +791,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric/observers/events (= 1000.0.0)
- React-featureflags
- React-graphics
- React-jsi
@@ -729,7 +801,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/textinput (1000.0.0):
+ - React-Fabric/observers/events (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -749,7 +821,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/unimplementedview (1000.0.0):
+ - React-Fabric/scheduler (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -760,16 +832,80 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric/observers/events
- React-featureflags
- React-graphics
- React-jsi
- React-jsiexecutor
- React-logger
+ - React-performancetimeline
- React-rendererdebug
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/view (1000.0.0):
+ - React-Fabric/telemetry (1000.0.0):
+ - DoubleConversion
+ - fmt (= 9.1.0)
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.01.01.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/templateprocessor (1000.0.0):
+ - DoubleConversion
+ - fmt (= 9.1.0)
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.01.01.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/uimanager (1000.0.0):
+ - DoubleConversion
+ - fmt (= 9.1.0)
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.01.01.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/uimanager/consistency (= 1000.0.0)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/uimanager/consistency (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -785,12 +921,37 @@ PODS:
- React-jsi
- React-jsiexecutor
- React-logger
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-FabricComponents (1000.0.0):
+ - DoubleConversion
+ - fmt (= 9.1.0)
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.01.01.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents/components (= 1000.0.0)
+ - React-FabricComponents/textlayoutmanager (= 1000.0.0)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- Yoga
- - React-Fabric/core (1000.0.0):
+ - React-FabricComponents/components (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -801,6 +962,16 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric
+ - React-FabricComponents/components/inputaccessory (= 1000.0.0)
+ - React-FabricComponents/components/iostextinput (= 1000.0.0)
+ - React-FabricComponents/components/modal (= 1000.0.0)
+ - React-FabricComponents/components/rncore (= 1000.0.0)
+ - React-FabricComponents/components/safeareaview (= 1000.0.0)
+ - React-FabricComponents/components/scrollview (= 1000.0.0)
+ - React-FabricComponents/components/text (= 1000.0.0)
+ - React-FabricComponents/components/textinput (= 1000.0.0)
+ - React-FabricComponents/components/unimplementedview (= 1000.0.0)
- React-featureflags
- React-graphics
- React-jsi
@@ -809,8 +980,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/dom (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/inputaccessory (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -821,9 +994,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/components/root
- - React-Fabric/components/text
- - React-Fabric/core
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
@@ -832,8 +1003,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/imagemanager (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/iostextinput (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -844,6 +1017,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
@@ -852,8 +1026,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/leakchecker (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/modal (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -864,6 +1040,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
@@ -872,8 +1049,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/mounting (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/rncore (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -884,6 +1063,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
@@ -892,8 +1072,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/scheduler (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/safeareaview (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -904,6 +1086,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
@@ -912,8 +1095,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/telemetry (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/scrollview (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -924,6 +1109,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
@@ -932,8 +1118,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/templateprocessor (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/text (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -944,6 +1132,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
@@ -952,8 +1141,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/textlayoutmanager (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/textinput (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -964,7 +1155,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/uimanager
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
@@ -973,8 +1164,10 @@ PODS:
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/uimanager (1000.0.0):
+ - Yoga
+ - React-FabricComponents/components/unimplementedview (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -985,19 +1178,19 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/dom
- - React-Fabric/uimanager/consistency (= 1000.0.0)
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
- React-jsiexecutor
- React-logger
- - React-rendererconsistency
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
- - React-Fabric/uimanager/consistency (1000.0.0):
+ - Yoga
+ - React-FabricComponents/textlayoutmanager (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -1008,17 +1201,18 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/dom
+ - React-Fabric
- React-featureflags
- React-graphics
- React-jsi
- React-jsiexecutor
- React-logger
- - React-rendererconsistency
- React-rendererdebug
- React-runtimescheduler
- React-utils
+ - ReactCodegen
- ReactCommon/turbomodule/core
+ - Yoga
- React-FabricImage (1000.0.0):
- DoubleConversion
- fmt (= 9.1.0)
@@ -1158,6 +1352,9 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- React-perflogger (1000.0.0)
+ - React-performancetimeline (1000.0.0):
+ - RCT-Folly (= 2024.01.01.00)
+ - React-cxxreact
- React-RCTActionSheet (1000.0.0):
- React-Core/RCTActionSheetHeaders (= 1000.0.0)
- React-RCTAnimation (1000.0.0):
@@ -1175,13 +1372,11 @@ PODS:
- React-Core
- React-CoreModules
- React-debug
- - React-domnativemodule
+ - React-defaultsnativemodule
- React-Fabric
- React-featureflags
- - React-featureflagsnativemodule
- React-graphics
- React-hermes
- - React-microtasksnativemodule
- React-nativeconfig
- React-NativeModulesApple
- React-RCTFabric
@@ -1215,6 +1410,7 @@ PODS:
- React-Core
- React-debug
- React-Fabric
+ - React-FabricComponents
- React-FabricImage
- React-featureflags
- React-graphics
@@ -1222,6 +1418,7 @@ PODS:
- React-jsi
- React-jsinspector
- React-nativeconfig
+ - React-performancetimeline
- React-RCTImage
- React-RCTText
- React-rendererconsistency
@@ -1268,6 +1465,10 @@ PODS:
- React-NativeModulesApple
- ReactCodegen
- ReactCommon
+ - React-RCTSwiftExtensions (1000.0.0):
+ - React-Core
+ - React-RCTWindowManager
+ - React-RCTXR
- React-RCTTest (1000.0.0):
- RCT-Folly (= 2024.01.01.00)
- React-Core (= 1000.0.0)
@@ -1284,6 +1485,22 @@ PODS:
- React-NativeModulesApple
- ReactCodegen
- ReactCommon
+ - React-RCTWindowManager (1000.0.0):
+ - RCT-Folly (= 2024.01.01.00)
+ - RCTTypeSafety
+ - React-Core/RCTWindowManagerHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTXR (1000.0.0):
+ - RCT-Folly (= 2024.01.01.00)
+ - RCTTypeSafety
+ - React-Core/RCTXRHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
- React-rendererconsistency (1000.0.0)
- React-rendererdebug (1000.0.0):
- DoubleConversion
@@ -1446,7 +1663,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- - SocketRocket (0.7.0)
+ - SocketRocket (0.7.0.1)
- Yoga (0.0.0)
DEPENDENCIES:
@@ -1458,7 +1675,8 @@ DEPENDENCIES:
- hermes-engine (from `../react-native/sdks/hermes-engine/hermes-engine.podspec`)
- MyNativeView (from `NativeComponentExample`)
- NativeCxxModuleExample (from `NativeCxxModuleExample`)
- - OCMock (~> 3.9.1)
+ - OCMock (from `https://github.com/erikdoe/ocmock.git`, tag `v3.9.2`)
+ - OSSLibraryExample (from `../react-native-test-library`)
- RCT-Folly (from `../react-native/third-party-podspecs/RCT-Folly.podspec`)
- RCT-Folly/Fabric (from `../react-native/third-party-podspecs/RCT-Folly.podspec`)
- RCTDeprecation (from `../react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)
@@ -1471,8 +1689,10 @@ DEPENDENCIES:
- React-CoreModules (from `../react-native/React/CoreModules`)
- React-cxxreact (from `../react-native/ReactCommon/cxxreact`)
- React-debug (from `../react-native/ReactCommon/react/debug`)
+ - React-defaultsnativemodule (from `../react-native/ReactCommon/react/nativemodule/defaults`)
- React-domnativemodule (from `../react-native/ReactCommon/react/nativemodule/dom`)
- React-Fabric (from `../react-native/ReactCommon`)
+ - React-FabricComponents (from `../react-native/ReactCommon`)
- React-FabricImage (from `../react-native/ReactCommon`)
- React-featureflags (from `../react-native/ReactCommon/react/featureflags`)
- React-featureflagsnativemodule (from `../react-native/ReactCommon/react/nativemodule/featureflags`)
@@ -1490,6 +1710,7 @@ DEPENDENCIES:
- React-nativeconfig (from `../react-native/ReactCommon`)
- React-NativeModulesApple (from `../react-native/ReactCommon/react/nativemodule/core/platform/ios`)
- React-perflogger (from `../react-native/ReactCommon/reactperflogger`)
+ - React-performancetimeline (from `../react-native/ReactCommon/react/performance/timeline`)
- React-RCTActionSheet (from `../react-native/Libraries/ActionSheetIOS`)
- React-RCTAnimation (from `../react-native/Libraries/NativeAnimation`)
- React-RCTAppDelegate (from `../react-native/Libraries/AppDelegate`)
@@ -1500,9 +1721,12 @@ DEPENDENCIES:
- React-RCTNetwork (from `../react-native/Libraries/Network`)
- React-RCTPushNotification (from `../react-native/Libraries/PushNotificationIOS`)
- React-RCTSettings (from `../react-native/Libraries/Settings`)
+ - React-RCTSwiftExtensions (from `../react-native/Libraries/SwiftExtensions`)
- React-RCTTest (from `./RCTTest`)
- React-RCTText (from `../react-native/Libraries/Text`)
- React-RCTVibration (from `../react-native/Libraries/Vibration`)
+ - React-RCTWindowManager (from `../react-native/Libraries/WindowManager`)
+ - React-RCTXR (from `../react-native/Libraries/XR`)
- React-rendererconsistency (from `../react-native/ReactCommon/react/renderer/consistency`)
- React-rendererdebug (from `../react-native/ReactCommon/react/renderer/debug`)
- React-rncore (from `../react-native/ReactCommon`)
@@ -1516,13 +1740,9 @@ DEPENDENCIES:
- ReactCommon-Samples (from `../react-native/ReactCommon/react/nativemodule/samples`)
- ReactCommon/turbomodule/core (from `../react-native/ReactCommon`)
- ScreenshotManager (from `NativeModuleExample`)
+ - SocketRocket (from `../react-native/third-party-podspecs/SocketRocket.podspec`)
- Yoga (from `../react-native/ReactCommon/yoga`)
-SPEC REPOS:
- trunk:
- - OCMock
- - SocketRocket
-
EXTERNAL SOURCES:
boost:
:podspec: "../react-native/third-party-podspecs/boost.podspec"
@@ -1541,6 +1761,11 @@ EXTERNAL SOURCES:
:path: NativeComponentExample
NativeCxxModuleExample:
:path: NativeCxxModuleExample
+ OCMock:
+ :git: https://github.com/erikdoe/ocmock.git
+ :tag: v3.9.2
+ OSSLibraryExample:
+ :path: "../react-native-test-library"
RCT-Folly:
:podspec: "../react-native/third-party-podspecs/RCT-Folly.podspec"
RCTDeprecation:
@@ -1561,10 +1786,14 @@ EXTERNAL SOURCES:
:path: "../react-native/ReactCommon/cxxreact"
React-debug:
:path: "../react-native/ReactCommon/react/debug"
+ React-defaultsnativemodule:
+ :path: "../react-native/ReactCommon/react/nativemodule/defaults"
React-domnativemodule:
:path: "../react-native/ReactCommon/react/nativemodule/dom"
React-Fabric:
:path: "../react-native/ReactCommon"
+ React-FabricComponents:
+ :path: "../react-native/ReactCommon"
React-FabricImage:
:path: "../react-native/ReactCommon"
React-featureflags:
@@ -1599,6 +1828,8 @@ EXTERNAL SOURCES:
:path: "../react-native/ReactCommon/react/nativemodule/core/platform/ios"
React-perflogger:
:path: "../react-native/ReactCommon/reactperflogger"
+ React-performancetimeline:
+ :path: "../react-native/ReactCommon/react/performance/timeline"
React-RCTActionSheet:
:path: "../react-native/Libraries/ActionSheetIOS"
React-RCTAnimation:
@@ -1619,12 +1850,18 @@ EXTERNAL SOURCES:
:path: "../react-native/Libraries/PushNotificationIOS"
React-RCTSettings:
:path: "../react-native/Libraries/Settings"
+ React-RCTSwiftExtensions:
+ :path: "../react-native/Libraries/SwiftExtensions"
React-RCTTest:
:path: "./RCTTest"
React-RCTText:
:path: "../react-native/Libraries/Text"
React-RCTVibration:
:path: "../react-native/Libraries/Vibration"
+ React-RCTWindowManager:
+ :path: "../react-native/Libraries/WindowManager"
+ React-RCTXR:
+ :path: "../react-native/Libraries/XR"
React-rendererconsistency:
:path: "../react-native/ReactCommon/react/renderer/consistency"
React-rendererdebug:
@@ -1651,77 +1888,91 @@ EXTERNAL SOURCES:
:path: "../react-native/ReactCommon/react/nativemodule/samples"
ScreenshotManager:
:path: NativeModuleExample
+ SocketRocket:
+ :podspec: "../react-native/third-party-podspecs/SocketRocket.podspec"
Yoga:
:path: "../react-native/ReactCommon/yoga"
+CHECKOUT OPTIONS:
+ OCMock:
+ :git: https://github.com/erikdoe/ocmock.git
+ :tag: v3.9.2
+
SPEC CHECKSUMS:
- boost: b6c2ab552684b545148f00ac9e0bb243cc0a43f5
- DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5
- FBLazyVector: f4492a543c5a8fa1502d3a5867e3f7252497cfe8
- fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120
- glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2
- hermes-engine: 221c62bc31d84593845e639e3288c6f64abc75ac
- MyNativeView: 1314dd52cc27c4a26957a5185aae6ecac6e4e2ff
- NativeCxxModuleExample: 65632ba6e8c216048f7af7d3c7bb1431d22bc2d0
- OCMock: 9491e4bec59e0b267d52a9184ff5605995e74be8
- RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47
+ boost: b6392ab8d665ef3aa7069eea9e57f5224ec9970a
+ DoubleConversion: 26c660c8d88372cca1a67f8101d2d962a7064361
+ FBLazyVector: d434a232713b779f3fa592271f974d581a4e5efe
+ fmt: 5d9ffa7ccba126c08b730252123601d514652320
+ glog: 63360cdb8e07e9542830fefdd73687e5af0db2ac
+ hermes-engine: c87fb20a7588a9a2e5112ca459a0faa58f90c0c6
+ MyNativeView: 285c6f70650ff53a276f7086047921e617a4d0e3
+ NativeCxxModuleExample: 1cd42853b5ec241c6b5e70f2dd4bbc26feb97b39
+ OCMock: 267d92c078398b7ce11d99e811e3a402744c06bc
+ OSSLibraryExample: d718b079a7ff6bb417fdbb6d98d58b9081b07b88
+ RCT-Folly: e75371281be586c821f9614489de0d370146e4a2
RCTDeprecation: 3808e36294137f9ee5668f4df2e73dc079cd1dcf
- RCTRequired: 82c56a03b3efd524bfdb581a906add903f78f978
- RCTTypeSafety: 5f57d4ae5dfafc85a0f575d756c909b584722c52
- React: cb6dc75e09f32aeddb4d8fb58a394a67219a92fe
- React-callinvoker: bae59cbd6affd712bbfc703839dad868ff35069d
- React-Core: 738c8db837b21aae813479f2eb284d5507a5c256
- React-CoreModules: 7647d54882adb778c614ac0053865ef1f92eb211
- React-cxxreact: 73a61f1e212fa084d3ae19a4ee4e3531aff646a9
- React-debug: 296b501a90c41f83961f58c6d96a01330d499da5
- React-domnativemodule: d38559c0807e0694565b806f347a465a2486a30e
- React-Fabric: 1ea5efc1cd04fd179021a481a82773bb6574f46a
- React-FabricImage: da62cc5089fe6bdaa6ec0ab6ccca75c7d679065d
- React-featureflags: 23f83a12963770bf3cff300e8990678192436b36
- React-featureflagsnativemodule: 7f69e5d1ddaf2dacd69ba0d75faf396c5f148508
- React-graphics: 62a954b0806e51009878ea1a65497bb3f5e32968
- React-hermes: 65dd94615e5cb47f0f2f7510231f80c65abf338c
- React-ImageManager: 716592dcbe11a4960e1eb3d82adb264ee15b5f6d
- React-jserrorhandler: 3dded3f19f30d85a3eb7c866921edbe954ca6439
- React-jsi: fe80ef997eef6f16a7ee40b585db2b6013d51db8
- React-jsiexecutor: 42eeb6b4e73e1b50caa3940ad0189171723c6b29
- React-jsinspector: 8c41e3113f94f08385a730aff19eb16af810c82d
- React-jsitracing: dd08057dd5b74119cb406beb42028da85ed5b8a5
- React-logger: 8486d7a1d32b972414b1d34a93470ee2562c6ee2
- React-Mapbuffer: fd0d0306c1c4326be5f18a61e978d32a66b20a85
- React-microtasksnativemodule: 0f4976afa97a9e6cac7e8ec7bf15b856c690c4d9
- React-nativeconfig: 40a2c848083ef4065c163c854e1c82b5f9e9db84
- React-NativeModulesApple: 48f0205edc54b8a1c24328f2deeb74b4f1570418
- React-perflogger: 70d009f755dd10002183454cdf5ad9b22de4a1d7
- React-RCTActionSheet: 943bd5f540f3af1e5a149c13c4de81858edf718a
- React-RCTAnimation: 4d88a95a05dbb9a5cbc9a55e08f1a79364aeb206
- React-RCTAppDelegate: 937edc1048069bc6ff393d594a258bd50a35b90d
- React-RCTBlob: 74c2fa0adba3a2e4ebbc4f9fc4ec3c3691b93854
- React-RCTFabric: 88e94c937c676ef00351244e8043908ba5b43e81
- React-RCTImage: 2413fa5ca25235b878fb2694115b26b176280f31
- React-RCTLinking: 7c821b30c5b4401037ed3da63f9580ac42b9e02e
- React-RCTNetwork: a556f5005d28d99df0b577d9ef8b28f29c0ff498
- React-RCTPushNotification: c0871d7ebfd7832a5763b571f68b936772654ed3
- React-RCTSettings: 25141964d76155f25dd993b87345656a29dd0d24
- React-RCTTest: 3b9f62c66c3814ccace402441597160aefc9e812
- React-RCTText: d9925903524a7b179cf7803162a98038e0bfb4fd
- React-RCTVibration: 63e015aa41be5e956440ebe8b8796f56ddd1acc8
- React-rendererconsistency: e4c6cb78c9cf114b3f3371f5e133c2db025951ef
- React-rendererdebug: 0abbd75e947eeae23542f3bf7491b048ae063141
- React-rncore: e903b3d2819a25674403c548ec103f34bf02ba2b
- React-RuntimeApple: b43ad6a5d60157f37ff3139e4dfb0cd6340e9be6
- React-RuntimeCore: 7cfdac312222d7260d8ba9604686fbb4aa4f8a13
- React-runtimeexecutor: e1c32bc249dd3cf3919cb4664fd8dc84ef70cff7
- React-RuntimeHermes: b19a99a600c6e1e33d7796cb91a5c76f92bd3407
- React-runtimescheduler: ca22ce34a60276d228399191dd039929cc9c6bc1
- React-utils: f5525c0072f467cf2f25bdd8dbbf0835f6384972
- ReactCodegen: 23192ed6132b7eb93d61cc2ee8e21a816b361a37
- ReactCommon: 37e362e6877a42d74cc3d71be3d15a73f5f8c8ff
- ReactCommon-Samples: e2bf03c8237c461fa36bda8e4638368fa82b633c
- ScreenshotManager: 16fcf9cbbee5b261ac46641a0f502fc1cb73a089
- SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d
- Yoga: f58ba5e0ac1e7eb3ef4caedcf80c5aa39985b039
+ RCTRequired: bd3cb7ab8bb259206a338f85d80a0ce5a0c69342
+ RCTTypeSafety: 371a1430e65d2a81dd029fe05c88702b34301a0e
+ React: 7746e376e9f9672d4907b143447e5557f06f1f6d
+ React-callinvoker: 233f1d1af1e59f50f9d1b1087a102b5403c45e03
+ React-Core: 8742f86305a4015972884366e080fc335af7f6ea
+ React-CoreModules: f25f234a4a358089b467ae1949741a68cf711af9
+ React-cxxreact: c4b02045aef8489770f6ba18cce3705bea338221
+ React-debug: 705fdf75d6e8bdd7181fb98d2d9a2c1f82ab5b2e
+ React-defaultsnativemodule: 310ef2d184e528a8842ae6835d1c2f3d07767816
+ React-domnativemodule: 0aa77e0bf58663d580acb4275fa624c65591824c
+ React-Fabric: 964ca5b70ecea26c82afd34c89c6c55f196b3193
+ React-FabricComponents: 0a82f5869eaebb00ba1da8d26802ad248ae5d75c
+ React-FabricImage: a51adb7fb0fd90772a2a1c92ed6c7637cc647f57
+ React-featureflags: 39b6b9923874d625b1dcd5edddab40695f390103
+ React-featureflagsnativemodule: e0b8c2e66e78cda76d22c6da578099891e2dff1d
+ React-graphics: 2ba6c1d134da57b4d97ae41dab33b6790df13ccc
+ React-hermes: 178f48ef2a77ae54647abf1cbbd7fda34b906530
+ React-ImageManager: 6faccfcb1895e63a086e7384e3179ffe24003628
+ React-jserrorhandler: 7ac3f665b5905703336086b4f32e6396b46ddea1
+ React-jsi: 7da88a67aff82f7d76b90f5fe8a6bec852c73234
+ React-jsiexecutor: 91240cb6478d422592b4b8769502067042439966
+ React-jsinspector: 9064f47464de6cdca6ec57e546cd70eef6d9f366
+ React-jsitracing: 724dd967eba7dda025e8be9caaa4b1573502d956
+ React-logger: e6a399500b7bbf65184c59360b2c6ad2ee241c91
+ React-Mapbuffer: 0ac85f1cd636a9a8fbfb2b5ee5bf009a8f769156
+ React-microtasksnativemodule: cbf04e1a4df2fe67fd80432e19966bdef3af9f05
+ React-nativeconfig: afba2adbd92757704f1f7a3aaac4a00d0633635a
+ React-NativeModulesApple: 272e293844ad7dc3336c9fd0cf7cd17536f96d95
+ React-perflogger: 061cf6456acee26ac4f9bfecf748c60c2721ae45
+ React-performancetimeline: 9d5316dd384abc051be89d571475a7b42bd9a327
+ React-RCTActionSheet: ff66b5f91f5ae71c78fe8a64836cd4115d45791e
+ React-RCTAnimation: 0cf807e00f29aeef17c05bd0e9159f19c39ba758
+ React-RCTAppDelegate: 4be422a1d397a7a3bb90fd3c37e4a3b37f777d73
+ React-RCTBlob: ff9bee678dd6d2d72a71bb800e8545446250999d
+ React-RCTFabric: baae0e17553ff6316c2f83eff1cd2081ac5bfce8
+ React-RCTImage: 9527e3983434738416a0c70436de710f4c943bd7
+ React-RCTLinking: 6f473ca17b6d63bc7f62921d2be5f543c053e4af
+ React-RCTNetwork: ec67d871ec029149650c6c8b5c6422f2a74e355b
+ React-RCTPushNotification: 4eabcb8ed729200218042864499cb4fe96ad4b34
+ React-RCTSettings: cd8990b36bbfd6cadb269d222842213c42385667
+ React-RCTSwiftExtensions: 1db3a5e13c30b72a0c3026c1710747c0fcc40e5e
+ React-RCTTest: d510ef04bfea9b9754a8a9f1bbbd3369ce5a9ba8
+ React-RCTText: 1957c3fc0fbf58e87df985d8db86f3789f2f28b3
+ React-RCTVibration: bf8d05a9edda5e1db5a2211aaa41a4f86d7f57d8
+ React-RCTWindowManager: 7492cc3591dfce401fed7cc58ead6d1af5f71f69
+ React-RCTXR: 6501e95cf47fed880dd55ebffd399417f164b8c7
+ React-rendererconsistency: 79c0102d79bf5f81561ec18ef9b37550684cc01c
+ React-rendererdebug: d77ea3945a1218e2733e8d263c4abb798a7bac38
+ React-rncore: 6a527db66df7d7e1d8d60248558f24665f3a635f
+ React-RuntimeApple: 6e129838bcb4b878dd146f121f19d8b819a722d8
+ React-RuntimeCore: c87ff5797c22510f8b0cb6c23fc594017354d077
+ React-runtimeexecutor: 108116665f2662482edc93895f9608d04d5b3b05
+ React-RuntimeHermes: 31458c92a3ac3af0fe6b061aaab9cf5102ce502e
+ React-runtimescheduler: 5c8f98d2e1fa112304431f9f47e3ba269c67e49c
+ React-utils: e40c193816da18c2fa5b8673985422974ee02039
+ ReactCodegen: 2fa2bfb8df604e5bbf2462cf3cced313c3131b96
+ ReactCommon: 9ec392ae3a44c2bdaf77448dfbc883cad9487806
+ ReactCommon-Samples: 0f25a353dc295796cc6a7f1cf67c4ad92ca2c60f
+ ScreenshotManager: 662151998cf5859591e72c76ceb9ebc6d04b425b
+ SocketRocket: 0ba3e799f983d2dfa878777017659ef6c866e5c6
+ Yoga: 6bd003ca9113d936e38452fe76de858ec02cc6db
-PODFILE CHECKSUM: 60b84dd598fc04e9ed84dbc82e2cb3b99b1d7adf
+PODFILE CHECKSUM: ecf8d73b0aefca76e0e218d8845b105ea9282718
COCOAPODS: 1.14.3
diff --git a/packages/rn-tester/RNTester-visionOS/App.swift b/packages/rn-tester/RNTester-visionOS/App.swift
new file mode 100644
index 00000000000000..4b18e6303461f9
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/App.swift
@@ -0,0 +1,24 @@
+import SwiftUI
+import React
+import React_RCTSwiftExtensions
+
+@main
+struct RNTesterApp: App {
+ @UIApplicationDelegateAdaptor var delegate: AppDelegate
+ @Environment(\.reactContext) private var reactContext
+
+ @State private var immersionLevel: ImmersionStyle = .full
+
+ var body: some Scene {
+ RCTMainWindow(moduleName: "RNTesterApp")
+ .onOpenURL(perform: { url in
+ RCTLinkingManager.onOpenURL(url: url)
+ })
+
+ RCTWindow(id: "SecondWindow", sceneData: reactContext.getSceneData(id: "SecondWindow"))
+ .defaultSize(CGSize(width: 400, height: 700))
+
+ ImmersiveSpace(id: "TestImmersiveSpace") {}
+ .immersionStyle(selection: $immersionLevel, in: .mixed, .progressive, .full)
+ }
+}
diff --git a/packages/rn-tester/RNTester-visionOS/AppDelegate.swift b/packages/rn-tester/RNTester-visionOS/AppDelegate.swift
new file mode 100644
index 00000000000000..cf164ab3877837
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import React
+import React_RCTAppDelegate
+
+class AppDelegate: RCTAppDelegate {
+ override func sourceURL(for bridge: RCTBridge) -> URL? {
+ self.bundleURL()
+ }
+
+ override func bundleURL() -> URL? {
+ RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "js/RNTesterApp.ios")
+ }
+}
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000000000..90f92021701acf
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "filename" : "back.jpg",
+ "idiom" : "vision",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/back.jpg b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/back.jpg
new file mode 100644
index 00000000000000..3abf32df01e9af
Binary files /dev/null and b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/back.jpg differ
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json
new file mode 100644
index 00000000000000..73c00596a7fca3
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Contents.json b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Contents.json
new file mode 100644
index 00000000000000..950af4d85a8e15
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Contents.json
@@ -0,0 +1,17 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "layers" : [
+ {
+ "filename" : "Front.solidimagestacklayer"
+ },
+ {
+ "filename" : "Middle.solidimagestacklayer"
+ },
+ {
+ "filename" : "Back.solidimagestacklayer"
+ }
+ ]
+}
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000000000..75fdd994465b3f
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "filename" : "front.png",
+ "idiom" : "vision",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/front.png b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/front.png
new file mode 100644
index 00000000000000..bddbc150c298d2
Binary files /dev/null and b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/front.png differ
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json
new file mode 100644
index 00000000000000..73c00596a7fca3
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000000000..04056a547f776e
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "idiom" : "vision",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json
new file mode 100644
index 00000000000000..73c00596a7fca3
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/rn-tester/RNTester-visionOS/Assets.xcassets/Contents.json b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/Contents.json
new file mode 100644
index 00000000000000..da4a164c918651
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/packages/rn-tester/RNTester-visionOS/Info.plist b/packages/rn-tester/RNTester-visionOS/Info.plist
new file mode 100644
index 00000000000000..a05d67cebe956c
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Info.plist
@@ -0,0 +1,28 @@
+
+
+
+
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ com.reactjs.ios
+ CFBundleURLSchemes
+
+ rntester
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationPreferredDefaultSceneSessionRole
+ UIWindowSceneSessionRoleApplication
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+
+
+
diff --git a/packages/rn-tester/RNTester-visionOS/Preview Content/Preview Assets.xcassets/Contents.json b/packages/rn-tester/RNTester-visionOS/Preview Content/Preview Assets.xcassets/Contents.json
new file mode 100644
index 00000000000000..73c00596a7fca3
--- /dev/null
+++ b/packages/rn-tester/RNTester-visionOS/Preview Content/Preview Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/packages/rn-tester/RNTester/AppDelegate.mm b/packages/rn-tester/RNTester/AppDelegate.mm
index eacc13101b2c61..abb61d492ac554 100644
--- a/packages/rn-tester/RNTester/AppDelegate.mm
+++ b/packages/rn-tester/RNTester/AppDelegate.mm
@@ -107,6 +107,7 @@ - (void)application:(__unused UIApplication *)application
[RCTPushNotificationManager didFailToRegisterForRemoteNotificationsWithError:error];
}
+#if !TARGET_OS_VISION
#pragma mark - UNUserNotificationCenterDelegate
// Required for the remoteNotificationReceived and localNotificationReceived events
@@ -136,6 +137,7 @@ - (void)userNotificationCenter:(UNUserNotificationCenter *)center
[RCTPushNotificationManager didReceiveNotification:notification];
completionHandler();
}
+#endif
#pragma mark - New Arch Enabled settings
diff --git a/packages/rn-tester/RNTester/PrivacyInfo.xcprivacy b/packages/rn-tester/RNTester/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000000000..41b8317f0652b9
--- /dev/null
+++ b/packages/rn-tester/RNTester/PrivacyInfo.xcprivacy
@@ -0,0 +1,37 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+
+ CA92.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategorySystemBootTime
+ NSPrivacyAccessedAPITypeReasons
+
+ 35F9.1
+
+
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj
index bbb6acb82c0f35..c90c916e99bff2 100644
--- a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj
+++ b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj
@@ -7,17 +7,23 @@
objects = {
/* Begin PBXBuildFile section */
- 08E25EBE4A584CD7B70FBB1E /* libPods-RNTester.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D74056A5352F0925816E50E0 /* libPods-RNTester.a */; };
+ 111FD3845C7358250C2702B6 /* libPods-RNTesterIntegrationTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C6B5E1C2465D85E9BDB6E5 /* libPods-RNTesterIntegrationTests.a */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
2DDEF0101F84BF7B00DBDF73 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2DDEF00F1F84BF7B00DBDF73 /* Images.xcassets */; };
383889DA23A7398900D06C3E /* RCTConvert_UIColorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 383889D923A7398900D06C3E /* RCTConvert_UIColorTests.m */; };
3D2AFAF51D646CF80089D1A3 /* legacy_image@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3D2AFAF41D646CF80089D1A3 /* legacy_image@2x.png */; };
5C60EB1C226440DB0018C04F /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C60EB1B226440DB0018C04F /* AppDelegate.mm */; };
+ 763DC37D2B0F824400D2C0C5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 763DC37C2B0F824400D2C0C5 /* Assets.xcassets */; };
+ 763DC3802B0F824400D2C0C5 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 763DC37F2B0F824400D2C0C5 /* Preview Assets.xcassets */; };
+ 76E4BB282B34909800B02A15 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E4BB272B34909800B02A15 /* App.swift */; };
+ 76E4BB2C2B34932200B02A15 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E4BB2B2B34932200B02A15 /* AppDelegate.swift */; };
8145AE06241172D900A3F8DA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8145AE05241172D900A3F8DA /* LaunchScreen.storyboard */; };
832F45BB2A8A6E1F0097B4E6 /* SwiftTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832F45BA2A8A6E1F0097B4E6 /* SwiftTest.swift */; };
- BEB82277FE76227A15DED9EF /* libPods-RNTesterIntegrationTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77E101C7D8E22A8E70EE76DF /* libPods-RNTesterIntegrationTests.a */; };
+ 927F7839B4D65A269FA4D198 /* libPods-RNTesterUnitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D6942D0981036096211E5BDC /* libPods-RNTesterUnitTests.a */; };
+ A2010DDF3B41C3E3D3A6B19C /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = C1142D4D3F85531561B1F08E /* PrivacyInfo.xcprivacy */; };
+ A425EC3215FAAE553BB048E9 /* libPods-RNTester-visionOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DF8AE154B671749B5880FDB /* libPods-RNTester-visionOS.a */; };
CD10C7A5290BD4EB0033E1ED /* RCTEventEmitterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CD10C7A4290BD4EB0033E1ED /* RCTEventEmitterTests.m */; };
- D626973C1F0D4ABDE2F9028A /* libPods-RNTesterUnitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8DE57E3292D41E28251988A /* libPods-RNTesterUnitTests.a */; };
+ DD6FAB12C0152128DD2DA1BE /* libPods-RNTester.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 175067970892CD30B8B0A8E0 /* libPods-RNTester.a */; };
E62F11832A5C6580000BF1C8 /* FlexibleSizeExampleView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.mm */; };
E62F11842A5C6584000BF1C8 /* UpdatePropertiesExampleView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.mm */; };
E7C1241A22BEC44B00DA25C0 /* RNTesterIntegrationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E7C1241922BEC44B00DA25C0 /* RNTesterIntegrationTests.m */; };
@@ -56,7 +62,7 @@
E7DB216422B2F3EC005AC45F /* RCTUIManagerScenarioTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E7DB215F22B2F3EC005AC45F /* RCTUIManagerScenarioTests.m */; };
E7DB216722B2F69F005AC45F /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7DB213022B2C649005AC45F /* JavaScriptCore.framework */; };
E7DB218C22B41FCD005AC45F /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7DB218B22B41FCD005AC45F /* XCTest.framework */; };
- F0D621C32BBB9E38005960AC /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = F0D621C22BBB9E38005960AC /* PrivacyInfo.xcprivacy */; };
+ F5867477FA3EFA44DE503A46 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 51202427770AB438DEA21CE7 /* PrivacyInfo.xcprivacy */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -81,6 +87,8 @@
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RNTester/AppDelegate.h; sourceTree = ""; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RNTester/Info.plist; sourceTree = ""; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RNTester/main.m; sourceTree = ""; };
+ 175067970892CD30B8B0A8E0 /* libPods-RNTester.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTester.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 22B01F4E0F077250C6C20B54 /* Pods-RNTester-visionOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester-visionOS.debug.xcconfig"; path = "Target Support Files/Pods-RNTester-visionOS/Pods-RNTester-visionOS.debug.xcconfig"; sourceTree = ""; };
272E6B3B1BEA849E001FCF37 /* UpdatePropertiesExampleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UpdatePropertiesExampleView.h; path = RNTester/NativeExampleViews/UpdatePropertiesExampleView.h; sourceTree = ""; };
272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UpdatePropertiesExampleView.mm; path = RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm; sourceTree = ""; };
2734C5E31C1D7A09BF872585 /* Pods-RNTester.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester.debug.xcconfig"; path = "Target Support Files/Pods-RNTester/Pods-RNTester.debug.xcconfig"; sourceTree = ""; };
@@ -90,18 +98,27 @@
359825B9A5AE4A3F4AA612DD /* Pods-RNTesterUnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterUnitTests.debug.xcconfig"; path = "Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests.debug.xcconfig"; sourceTree = ""; };
383889D923A7398900D06C3E /* RCTConvert_UIColorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTConvert_UIColorTests.m; sourceTree = ""; };
3D2AFAF41D646CF80089D1A3 /* legacy_image@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "legacy_image@2x.png"; path = "RNTester/legacy_image@2x.png"; sourceTree = ""; };
+ 51202427770AB438DEA21CE7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = ../RNTester/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 54DDA3DF154A732E76DCCEE8 /* Pods-RNTester-visionOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester-visionOS.release.xcconfig"; path = "Target Support Files/Pods-RNTester-visionOS/Pods-RNTester-visionOS.release.xcconfig"; sourceTree = ""; };
5C60EB1B226440DB0018C04F /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = RNTester/AppDelegate.mm; sourceTree = ""; };
+ 63C6B5E1C2465D85E9BDB6E5 /* libPods-RNTesterIntegrationTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTesterIntegrationTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
66C3087F2D5BF762FE9E6422 /* Pods-RNTesterIntegrationTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterIntegrationTests.debug.xcconfig"; path = "Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests.debug.xcconfig"; sourceTree = ""; };
- 77E101C7D8E22A8E70EE76DF /* libPods-RNTesterIntegrationTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTesterIntegrationTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 6DF8AE154B671749B5880FDB /* libPods-RNTester-visionOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTester-visionOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 763DC3722B0F824200D2C0C5 /* RNTester-visionOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "RNTester-visionOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 763DC37C2B0F824400D2C0C5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 763DC37F2B0F824400D2C0C5 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
+ 763DC3812B0F824400D2C0C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 76E4BB272B34909800B02A15 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; };
+ 76E4BB2B2B34932200B02A15 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7CDA7A212644C6BB8C0D00D8 /* Pods-RNTesterIntegrationTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterIntegrationTests.release.xcconfig"; path = "Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests.release.xcconfig"; sourceTree = ""; };
8145AE05241172D900A3F8DA /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = RNTester/LaunchScreen.storyboard; sourceTree = ""; };
832F45BA2A8A6E1F0097B4E6 /* SwiftTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SwiftTest.swift; path = RNTester/SwiftTest.swift; sourceTree = ""; };
8BFB9C61D7BDE894E24BF24F /* Pods-RNTesterUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterUnitTests.release.xcconfig"; path = "Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests.release.xcconfig"; sourceTree = ""; };
9B8542B8C590B51BD0588751 /* Pods-RNTester.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester.release.xcconfig"; path = "Target Support Files/Pods-RNTester/Pods-RNTester.release.xcconfig"; sourceTree = ""; };
AC474BFB29BBD4A1002BDAED /* RNTester.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = RNTester.xctestplan; path = RNTester/RNTester.xctestplan; sourceTree = ""; };
+ C1142D4D3F85531561B1F08E /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = RNTester/PrivacyInfo.xcprivacy; sourceTree = ""; };
CD10C7A4290BD4EB0033E1ED /* RCTEventEmitterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTEventEmitterTests.m; sourceTree = ""; };
- D74056A5352F0925816E50E0 /* libPods-RNTester.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTester.a"; sourceTree = BUILT_PRODUCTS_DIR; };
- D8DE57E3292D41E28251988A /* libPods-RNTesterUnitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTesterUnitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ D6942D0981036096211E5BDC /* libPods-RNTesterUnitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTesterUnitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
E771AEEA22B44E3100EA1189 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RNTester/Info.plist; sourceTree = ""; };
E7C1241922BEC44B00DA25C0 /* RNTesterIntegrationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNTesterIntegrationTests.m; sourceTree = ""; };
E7DB209F22B2BA84005AC45F /* RNTesterUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RNTesterUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -171,7 +188,15 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 08E25EBE4A584CD7B70FBB1E /* libPods-RNTester.a in Frameworks */,
+ DD6FAB12C0152128DD2DA1BE /* libPods-RNTester.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 763DC36F2B0F824200D2C0C5 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ A425EC3215FAAE553BB048E9 /* libPods-RNTester-visionOS.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -180,7 +205,7 @@
buildActionMask = 2147483647;
files = (
E7DB213122B2C649005AC45F /* JavaScriptCore.framework in Frameworks */,
- D626973C1F0D4ABDE2F9028A /* libPods-RNTesterUnitTests.a in Frameworks */,
+ 927F7839B4D65A269FA4D198 /* libPods-RNTesterUnitTests.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -190,7 +215,7 @@
files = (
E7DB218C22B41FCD005AC45F /* XCTest.framework in Frameworks */,
E7DB216722B2F69F005AC45F /* JavaScriptCore.framework in Frameworks */,
- BEB82277FE76227A15DED9EF /* libPods-RNTesterIntegrationTests.a in Frameworks */,
+ 111FD3845C7358250C2702B6 /* libPods-RNTesterIntegrationTests.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -221,6 +246,7 @@
680759612239798500290469 /* Fabric */,
272E6B3A1BEA846C001FCF37 /* NativeExampleViews */,
1323F18D1C04ABAC0091BED0 /* Supporting Files */,
+ C1142D4D3F85531561B1F08E /* PrivacyInfo.xcprivacy */,
);
name = RNTester;
sourceTree = "";
@@ -261,9 +287,10 @@
E7DB211822B2BD53005AC45F /* libReact-RCTText.a */,
E7DB211A22B2BD53005AC45F /* libReact-RCTVibration.a */,
E7DB212222B2BD53005AC45F /* libyoga.a */,
- D74056A5352F0925816E50E0 /* libPods-RNTester.a */,
- 77E101C7D8E22A8E70EE76DF /* libPods-RNTesterIntegrationTests.a */,
- D8DE57E3292D41E28251988A /* libPods-RNTesterUnitTests.a */,
+ 175067970892CD30B8B0A8E0 /* libPods-RNTester.a */,
+ 63C6B5E1C2465D85E9BDB6E5 /* libPods-RNTesterIntegrationTests.a */,
+ D6942D0981036096211E5BDC /* libPods-RNTesterUnitTests.a */,
+ 6DF8AE154B671749B5880FDB /* libPods-RNTester-visionOS.a */,
);
name = Frameworks;
sourceTree = "";
@@ -275,12 +302,42 @@
name = Fabric;
sourceTree = "";
};
+ 763DC3732B0F824200D2C0C5 /* RNTester-visionOS */ = {
+ isa = PBXGroup;
+ children = (
+ 76E4BB2B2B34932200B02A15 /* AppDelegate.swift */,
+ 76E4BB272B34909800B02A15 /* App.swift */,
+ 763DC37C2B0F824400D2C0C5 /* Assets.xcassets */,
+ 763DC3812B0F824400D2C0C5 /* Info.plist */,
+ 763DC37E2B0F824400D2C0C5 /* Preview Content */,
+ 51202427770AB438DEA21CE7 /* PrivacyInfo.xcprivacy */,
+ );
+ path = "RNTester-visionOS";
+ sourceTree = "";
+ };
+ 763DC3742B0F824200D2C0C5 /* Packages */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ path = Packages;
+ sourceTree = "";
+ };
+ 763DC37E2B0F824400D2C0C5 /* Preview Content */ = {
+ isa = PBXGroup;
+ children = (
+ 763DC37F2B0F824400D2C0C5 /* Preview Assets.xcassets */,
+ );
+ path = "Preview Content";
+ sourceTree = "";
+ };
83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup;
children = (
13B07FAE1A68108700A75B9A /* RNTester */,
E7DB20A022B2BA84005AC45F /* RNTesterUnitTests */,
E7DB215422B2F332005AC45F /* RNTesterIntegrationTests */,
+ 763DC3732B0F824200D2C0C5 /* RNTester-visionOS */,
+ 763DC3742B0F824200D2C0C5 /* Packages */,
83CBBA001A601CBA00E9B192 /* Products */,
2DE7E7D81FB2A4F3009E225D /* Frameworks */,
E23BD6487B06BD71F1A86914 /* Pods */,
@@ -296,6 +353,7 @@
13B07F961A680F5B00A75B9A /* RNTester.app */,
E7DB209F22B2BA84005AC45F /* RNTesterUnitTests.xctest */,
E7DB215322B2F332005AC45F /* RNTesterIntegrationTests.xctest */,
+ 763DC3722B0F824200D2C0C5 /* RNTester-visionOS.app */,
);
name = Products;
sourceTree = "";
@@ -309,6 +367,8 @@
7CDA7A212644C6BB8C0D00D8 /* Pods-RNTesterIntegrationTests.release.xcconfig */,
359825B9A5AE4A3F4AA612DD /* Pods-RNTesterUnitTests.debug.xcconfig */,
8BFB9C61D7BDE894E24BF24F /* Pods-RNTesterUnitTests.release.xcconfig */,
+ 22B01F4E0F077250C6C20B54 /* Pods-RNTester-visionOS.debug.xcconfig */,
+ 54DDA3DF154A732E76DCCEE8 /* Pods-RNTester-visionOS.release.xcconfig */,
);
path = Pods;
sourceTree = "";
@@ -378,8 +438,8 @@
13B07F8E1A680F5B00A75B9A /* Resources */,
68CD48B71D2BCB2C007E06A9 /* Build JS Bundle */,
79E8BE2B119D4C5CCD2F04B3 /* [RN] Copy Hermes Framework */,
- 02B6FEF7E86B613B42F31284 /* [CP] Embed Pods Frameworks */,
5625E703156DD564DE9175B0 /* [CP] Copy Pods Resources */,
+ 010C6668749A96FAD021029C /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -390,6 +450,27 @@
productReference = 13B07F961A680F5B00A75B9A /* RNTester.app */;
productType = "com.apple.product-type.application";
};
+ 763DC3712B0F824200D2C0C5 /* RNTester-visionOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 763DC3842B0F824400D2C0C5 /* Build configuration list for PBXNativeTarget "RNTester-visionOS" */;
+ buildPhases = (
+ 28541C798E9769A525E7C14E /* [CP] Check Pods Manifest.lock */,
+ 763DC36E2B0F824200D2C0C5 /* Sources */,
+ 763DC36F2B0F824200D2C0C5 /* Frameworks */,
+ 763DC3702B0F824200D2C0C5 /* Resources */,
+ 763DC38C2B10A42B00D2C0C5 /* Build JS Bundle */,
+ D88C968E3153313E61AE696C /* [CP] Embed Pods Frameworks */,
+ 8634A0D0E14BF96B8A2F986B /* [CP] Copy Pods Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "RNTester-visionOS";
+ productName = "RNTester-visionOS";
+ productReference = 763DC3722B0F824200D2C0C5 /* RNTester-visionOS.app */;
+ productType = "com.apple.product-type.application";
+ };
E7DB209E22B2BA84005AC45F /* RNTesterUnitTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = E7DB20A622B2BA84005AC45F /* Build configuration list for PBXNativeTarget "RNTesterUnitTests" */;
@@ -398,8 +479,8 @@
E7DB209B22B2BA84005AC45F /* Sources */,
E7DB209C22B2BA84005AC45F /* Frameworks */,
E7DB209D22B2BA84005AC45F /* Resources */,
- A904658C20543C2EDC217D15 /* [CP] Embed Pods Frameworks */,
01934C30687B8C926E4F59CD /* [CP] Copy Pods Resources */,
+ 4E3C3D35C3AFA4B5CE6A544E /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -419,8 +500,8 @@
E7DB214F22B2F332005AC45F /* Sources */,
E7DB215022B2F332005AC45F /* Frameworks */,
E7DB215122B2F332005AC45F /* Resources */,
- 4F27ACC9DB890B37D6C267F1 /* [CP] Embed Pods Frameworks */,
E446637427ECD101CAACE52B /* [CP] Copy Pods Resources */,
+ 20C82871DF97B61FA303C9C9 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -438,12 +519,16 @@
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
+ LastSwiftUpdateCheck = 1510;
LastUpgradeCheck = 1210;
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
13B07F861A680F5B00A75B9A = {
LastSwiftMigration = 1430;
};
+ 763DC3712B0F824200D2C0C5 = {
+ CreatedOnToolsVersion = 15.1;
+ };
E7DB209E22B2BA84005AC45F = {
CreatedOnToolsVersion = 10.2.1;
};
@@ -467,6 +552,7 @@
projectRoot = "";
targets = (
13B07F861A680F5B00A75B9A /* RNTester */,
+ 763DC3712B0F824200D2C0C5 /* RNTester-visionOS */,
E7DB209E22B2BA84005AC45F /* RNTesterUnitTests */,
E7DB215222B2F332005AC45F /* RNTesterIntegrationTests */,
);
@@ -480,8 +566,18 @@
files = (
2DDEF0101F84BF7B00DBDF73 /* Images.xcassets in Resources */,
8145AE06241172D900A3F8DA /* LaunchScreen.storyboard in Resources */,
- F0D621C32BBB9E38005960AC /* PrivacyInfo.xcprivacy in Resources */,
3D2AFAF51D646CF80089D1A3 /* legacy_image@2x.png in Resources */,
+ A2010DDF3B41C3E3D3A6B19C /* PrivacyInfo.xcprivacy in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 763DC3702B0F824200D2C0C5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 763DC3802B0F824400D2C0C5 /* Preview Assets.xcassets in Resources */,
+ 763DC37D2B0F824400D2C0C5 /* Assets.xcassets in Resources */,
+ F5867477FA3EFA44DE503A46 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -503,6 +599,23 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
+ 010C6668749A96FAD021029C /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
01934C30687B8C926E4F59CD /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@@ -520,38 +633,60 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
- 02B6FEF7E86B613B42F31284 /* [CP] Embed Pods Frameworks */ = {
+ 20C82871DF97B61FA303C9C9 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
- 4F27ACC9DB890B37D6C267F1 /* [CP] Embed Pods Frameworks */ = {
+ 28541C798E9769A525E7C14E /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RNTester-visionOS-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 4E3C3D35C3AFA4B5CE6A544E /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
4F76596957F7356516B534CE /* [CP] Check Pods Manifest.lock */ = {
@@ -609,6 +744,26 @@
shellPath = /bin/sh;
shellScript = "set -e\n\nexport PROJECT_ROOT=\"$SRCROOT\"\nexport ENTRY_FILE=\"$SRCROOT/js/RNTesterApp.ios.js\"\nexport SOURCEMAP_FILE=../sourcemap.ios.map\n# export FORCE_BUNDLING=true \n\nWITH_ENVIRONMENT=\"../react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
};
+ 763DC38C2B10A42B00D2C0C5 /* Build JS Bundle */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "$(SRCROOT)/.xcode.env.local",
+ "$(SRCROOT)/.xcode.env",
+ );
+ name = "Build JS Bundle";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "set -e\n\nexport PROJECT_ROOT=\"$SRCROOT\"\nexport ENTRY_FILE=\"$SRCROOT/js/RNTesterApp.ios.js\"\nexport SOURCEMAP_FILE=../sourcemap.ios.map\n# export FORCE_BUNDLING=true \n\nWITH_ENVIRONMENT=\"../react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
+ };
79E8BE2B119D4C5CCD2F04B3 /* [RN] Copy Hermes Framework */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@@ -627,21 +782,21 @@
shellPath = /bin/sh;
shellScript = ". ../react-native/sdks/hermes-engine/utils/copy-hermes-xcode.sh\n";
};
- A904658C20543C2EDC217D15 /* [CP] Embed Pods Frameworks */ = {
+ 8634A0D0E14BF96B8A2F986B /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ "${PODS_ROOT}/Target Support Files/Pods-RNTester-visionOS/Pods-RNTester-visionOS-resources-${CONFIGURATION}-input-files.xcfilelist",
);
- name = "[CP] Embed Pods Frameworks";
+ name = "[CP] Copy Pods Resources";
outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ "${PODS_ROOT}/Target Support Files/Pods-RNTester-visionOS/Pods-RNTester-visionOS-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTester-visionOS/Pods-RNTester-visionOS-resources.sh\"\n";
showEnvVarsInLog = 0;
};
ABDE2A52ACD1B95E14790B5E /* [CP] Check Pods Manifest.lock */ = {
@@ -688,6 +843,23 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
+ D88C968E3153313E61AE696C /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-RNTester-visionOS/Pods-RNTester-visionOS-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-RNTester-visionOS/Pods-RNTester-visionOS-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTester-visionOS/Pods-RNTester-visionOS-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
E446637427ECD101CAACE52B /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@@ -720,6 +892,15 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 763DC36E2B0F824200D2C0C5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 76E4BB2C2B34932200B02A15 /* AppDelegate.swift in Sources */,
+ 76E4BB282B34909800B02A15 /* App.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
E7DB209B22B2BA84005AC45F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -816,6 +997,9 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.meta.RNTester.localDevelopment;
PRODUCT_NAME = RNTester;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -854,11 +1038,207 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.meta.RNTester.localDevelopment;
PRODUCT_NAME = RNTester;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
+ 763DC3822B0F824400D2C0C5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 22B01F4E0F077250C6C20B54 /* Pods-RNTester-visionOS.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ DEVELOPMENT_ASSET_PATHS = "\"RNTester-visionOS/Preview Content\"";
+ ENABLE_PREVIEWS = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GENERATE_INFOPLIST_FILE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"${PODS_ROOT}/Headers/Public\"",
+ "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"",
+ "\"${PODS_ROOT}/Headers/Public/FBLazyVector\"",
+ "\"${PODS_ROOT}/Headers/Public/MyNativeView\"",
+ "\"${PODS_ROOT}/Headers/Public/NativeCxxModuleExample\"",
+ "\"${PODS_ROOT}/Headers/Public/RCT-Folly\"",
+ "\"${PODS_ROOT}/Headers/Public/RCTDeprecation\"",
+ "\"${PODS_ROOT}/Headers/Public/RCTRequired\"",
+ "\"${PODS_ROOT}/Headers/Public/RCTTypeSafety\"",
+ "\"${PODS_ROOT}/Headers/Public/React-Codegen\"",
+ "\"${PODS_ROOT}/Headers/Public/React-Core\"",
+ "\"${PODS_ROOT}/Headers/Public/React-Fabric\"",
+ "\"${PODS_ROOT}/Headers/Public/React-FabricImage\"",
+ "\"${PODS_ROOT}/Headers/Public/React-ImageManager\"",
+ "\"${PODS_ROOT}/Headers/Public/React-Mapbuffer\"",
+ "\"${PODS_ROOT}/Headers/Public/React-NativeModulesApple\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTAnimation\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTAppDelegate\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTBlob\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTFabric\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTText\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RuntimeApple\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RuntimeCore\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RuntimeHermes\"",
+ "\"${PODS_ROOT}/Headers/Public/React-callinvoker\"",
+ "\"${PODS_ROOT}/Headers/Public/React-cxxreact\"",
+ "\"${PODS_ROOT}/Headers/Public/React-debug\"",
+ "\"${PODS_ROOT}/Headers/Public/React-graphics\"",
+ "\"${PODS_ROOT}/Headers/Public/React-hermes\"",
+ "\"${PODS_ROOT}/Headers/Public/React-jserrorhandler\"",
+ "\"${PODS_ROOT}/Headers/Public/React-jsi\"",
+ "\"${PODS_ROOT}/Headers/Public/React-jsiexecutor\"",
+ "\"${PODS_ROOT}/Headers/Public/React-jsinspector\"",
+ "\"${PODS_ROOT}/Headers/Public/React-logger\"",
+ "\"${PODS_ROOT}/Headers/Public/React-nativeconfig\"",
+ "\"${PODS_ROOT}/Headers/Public/React-perflogger\"",
+ "\"${PODS_ROOT}/Headers/Public/React-rendererdebug\"",
+ "\"${PODS_ROOT}/Headers/Public/React-runtimeexecutor\"",
+ "\"${PODS_ROOT}/Headers/Public/React-runtimescheduler\"",
+ "\"${PODS_ROOT}/Headers/Public/React-utils\"",
+ "\"${PODS_ROOT}/Headers/Public/ReactCommon\"",
+ "\"${PODS_ROOT}/Headers/Public/ReactCommon-Samples\"",
+ "\"${PODS_ROOT}/Headers/Public/ScreenshotManager\"",
+ "\"${PODS_ROOT}/Headers/Public/SocketRocket\"",
+ "\"${PODS_ROOT}/Headers/Private/Yoga\"",
+ "\"${PODS_ROOT}/Headers/Public/Yoga\"",
+ "\"${PODS_ROOT}/Headers/Public/YogaKit\"",
+ "\"${PODS_ROOT}/Headers/Public/fmt\"",
+ "\"${PODS_ROOT}/Headers/Public/glog\"",
+ "\"${PODS_ROOT}/Headers/Public/hermes-engine\"",
+ "\"$(PODS_ROOT)/DoubleConversion\"",
+ "\"$(PODS_ROOT)/boost\"",
+ "\"$(PODS_ROOT)/Headers/Private/React-Core\"",
+ );
+ INFOPLIST_FILE = "$(TARGET_NAME)/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ /usr/lib/swift,
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MARKETING_VERSION = 1.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.meta.RNTester.localDevelopment.RNTester-visionOS";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "xros xrsimulator";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INCLUDE_PATHS = "$(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit-visionOS\" \"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit-iOS\"";
+ "SWIFT_INCLUDE_PATHS[arch=*]" = "$(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit-visionOS\" \"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit-iOS\"";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2,7";
+ };
+ name = Debug;
+ };
+ 763DC3832B0F824400D2C0C5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 54DDA3DF154A732E76DCCEE8 /* Pods-RNTester-visionOS.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DEVELOPMENT_ASSET_PATHS = "\"RNTester-visionOS/Preview Content\"";
+ ENABLE_PREVIEWS = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GENERATE_INFOPLIST_FILE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"${PODS_ROOT}/Headers/Public\"",
+ "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"",
+ "\"${PODS_ROOT}/Headers/Public/FBLazyVector\"",
+ "\"${PODS_ROOT}/Headers/Public/MyNativeView\"",
+ "\"${PODS_ROOT}/Headers/Public/NativeCxxModuleExample\"",
+ "\"${PODS_ROOT}/Headers/Public/RCT-Folly\"",
+ "\"${PODS_ROOT}/Headers/Public/RCTDeprecation\"",
+ "\"${PODS_ROOT}/Headers/Public/RCTRequired\"",
+ "\"${PODS_ROOT}/Headers/Public/RCTTypeSafety\"",
+ "\"${PODS_ROOT}/Headers/Public/React-Codegen\"",
+ "\"${PODS_ROOT}/Headers/Public/React-Core\"",
+ "\"${PODS_ROOT}/Headers/Public/React-Fabric\"",
+ "\"${PODS_ROOT}/Headers/Public/React-FabricImage\"",
+ "\"${PODS_ROOT}/Headers/Public/React-ImageManager\"",
+ "\"${PODS_ROOT}/Headers/Public/React-Mapbuffer\"",
+ "\"${PODS_ROOT}/Headers/Public/React-NativeModulesApple\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTAnimation\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTAppDelegate\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTBlob\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTFabric\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RCTText\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RuntimeApple\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RuntimeCore\"",
+ "\"${PODS_ROOT}/Headers/Public/React-RuntimeHermes\"",
+ "\"${PODS_ROOT}/Headers/Public/React-callinvoker\"",
+ "\"${PODS_ROOT}/Headers/Public/React-cxxreact\"",
+ "\"${PODS_ROOT}/Headers/Public/React-debug\"",
+ "\"${PODS_ROOT}/Headers/Public/React-graphics\"",
+ "\"${PODS_ROOT}/Headers/Public/React-hermes\"",
+ "\"${PODS_ROOT}/Headers/Public/React-jserrorhandler\"",
+ "\"${PODS_ROOT}/Headers/Public/React-jsi\"",
+ "\"${PODS_ROOT}/Headers/Public/React-jsiexecutor\"",
+ "\"${PODS_ROOT}/Headers/Public/React-jsinspector\"",
+ "\"${PODS_ROOT}/Headers/Public/React-logger\"",
+ "\"${PODS_ROOT}/Headers/Public/React-nativeconfig\"",
+ "\"${PODS_ROOT}/Headers/Public/React-perflogger\"",
+ "\"${PODS_ROOT}/Headers/Public/React-rendererdebug\"",
+ "\"${PODS_ROOT}/Headers/Public/React-runtimeexecutor\"",
+ "\"${PODS_ROOT}/Headers/Public/React-runtimescheduler\"",
+ "\"${PODS_ROOT}/Headers/Public/React-utils\"",
+ "\"${PODS_ROOT}/Headers/Public/ReactCommon\"",
+ "\"${PODS_ROOT}/Headers/Public/ReactCommon-Samples\"",
+ "\"${PODS_ROOT}/Headers/Public/ScreenshotManager\"",
+ "\"${PODS_ROOT}/Headers/Public/SocketRocket\"",
+ "\"${PODS_ROOT}/Headers/Public/Yoga\"",
+ "\"${PODS_ROOT}/Headers/Public/fmt\"",
+ "\"${PODS_ROOT}/Headers/Public/glog\"",
+ "\"${PODS_ROOT}/Headers/Public/hermes-engine\"",
+ "\"$(PODS_ROOT)/DoubleConversion\"",
+ "\"$(PODS_ROOT)/boost\"",
+ "\"$(PODS_ROOT)/Headers/Private/React-Core\"",
+ "\"${PODS_ROOT}/Headers/Private/Yoga\"",
+ );
+ INFOPLIST_FILE = "$(TARGET_NAME)/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ /usr/lib/swift,
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MARKETING_VERSION = 1.0;
+ MTL_FAST_MATH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.meta.RNTester.localDevelopment.RNTester-visionOS";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "xros xrsimulator";
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INCLUDE_PATHS = "$(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit-visionOS\" \"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit-iOS\"";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2,7";
+ };
+ name = Release;
+ };
83CBBA201A601CBA00E9B192 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -949,13 +1329,14 @@
"-lc++",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../react-native";
- SDKROOT = iphoneos;
+ SDKROOT = xros;
USE_HERMES = true;
WARNING_CFLAGS = (
"-Wextra",
"-Wall",
"-Wno-semicolon-before-method-body",
);
+ XROS_DEPLOYMENT_TARGET = 1.0;
};
name = Debug;
};
@@ -1041,7 +1422,7 @@
"-lc++",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../react-native";
- SDKROOT = iphoneos;
+ SDKROOT = xros;
USE_HERMES = true;
VALIDATE_PRODUCT = YES;
WARNING_CFLAGS = (
@@ -1049,6 +1430,7 @@
"-Wall",
"-Wno-semicolon-before-method-body",
);
+ XROS_DEPLOYMENT_TARGET = 1.0;
};
name = Release;
};
@@ -1086,6 +1468,8 @@
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = com.meta.RNTesterUnitTests;
PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
@@ -1124,6 +1508,8 @@
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = com.meta.RNTesterUnitTests;
PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
@@ -1162,6 +1548,8 @@
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = com.meta.RNTesterIntegrationTests;
PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RNTester.app/RNTester";
};
@@ -1197,6 +1585,8 @@
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = com.meta.RNTesterIntegrationTests;
PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RNTester.app/RNTester";
};
@@ -1214,6 +1604,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ 763DC3842B0F824400D2C0C5 /* Build configuration list for PBXNativeTarget "RNTester-visionOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 763DC3822B0F824400D2C0C5 /* Debug */,
+ 763DC3832B0F824400D2C0C5 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RNTesterPods" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/packages/rn-tester/js/RNTesterApp.ios.js b/packages/rn-tester/js/RNTesterApp.ios.js
index 281ee25afd77a1..8ea87c26361438 100644
--- a/packages/rn-tester/js/RNTesterApp.ios.js
+++ b/packages/rn-tester/js/RNTesterApp.ios.js
@@ -24,6 +24,9 @@ AppRegistry.registerComponent('SetPropertiesExampleApp', () =>
AppRegistry.registerComponent('RootViewSizeFlexibilityExampleApp', () =>
require('./examples/RootViewSizeFlexibilityExample/RootViewSizeFlexibilityExampleApp'),
);
+AppRegistry.registerComponent('SecondWindow', () =>
+ require('./examples/SecondWindow/SecondWindow'),
+);
AppRegistry.registerComponent('RNTesterApp', () => RNTesterApp);
// Register suitable examples for snapshot tests
diff --git a/packages/rn-tester/js/examples/SecondWindow/SecondWindow.js b/packages/rn-tester/js/examples/SecondWindow/SecondWindow.js
new file mode 100644
index 00000000000000..10f71a32dae917
--- /dev/null
+++ b/packages/rn-tester/js/examples/SecondWindow/SecondWindow.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.
+ *
+ * @format
+ * @flow
+ */
+
+'use strict';
+
+const {WindowManager} = require('@callstack/react-native-visionos');
+const React = require('react');
+const {Button, StyleSheet, Text, View} = require('react-native');
+
+type Props = $ReadOnly<{|
+ title?: String,
+|}>;
+
+const SecondWindow = ({title}: Props): React.Node => {
+ const [counter, setCounter] = React.useState(0);
+ return (
+
+ {title}
+ {counter}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ center: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ text: {
+ fontSize: 30,
+ color: 'white',
+ textAlign: 'center',
+ fontWeight: 'bold',
+ },
+});
+
+module.exports = SecondWindow;
diff --git a/packages/rn-tester/js/examples/XR/XRExample.js b/packages/rn-tester/js/examples/XR/XRExample.js
new file mode 100644
index 00000000000000..3b324b99b95dd3
--- /dev/null
+++ b/packages/rn-tester/js/examples/XR/XRExample.js
@@ -0,0 +1,102 @@
+/**
+ * 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';
+
+const {WindowManager, XR} = require('@callstack/react-native-visionos');
+const React = require('react');
+const {Alert, Button, StyleSheet, Text, View} = require('react-native');
+
+const secondWindow = WindowManager.getWindow('SecondWindow');
+
+const OpenXRSession = () => {
+ const [isOpen, setIsOpen] = React.useState(false);
+
+ React.useEffect(() => {
+ const listener = WindowManager.addEventListener(
+ 'windowStateDidChange',
+ data => {
+ console.log('Window state changed to:', data);
+ },
+ );
+ return () => {
+ listener?.remove();
+ };
+ }, []);
+ const openXRSession = async () => {
+ try {
+ if (!WindowManager.supportsMultipleScenes) {
+ Alert.alert('Error', 'Multiple scenes are not supported');
+ return;
+ }
+ await XR.requestSession('TestImmersiveSpace');
+ setIsOpen(true);
+ } catch (e) {
+ Alert.alert('Error', e.message);
+ setIsOpen(false);
+ }
+ };
+
+ const closeXRSession = async () => {
+ await XR.endSession();
+ setIsOpen(false);
+ };
+
+ const openWindow = async () => {
+ try {
+ await secondWindow.open({title: 'React Native Window'});
+ } catch (e) {
+ Alert.alert('Error', e.message);
+ }
+ };
+
+ const updateWindow = async () => {
+ await secondWindow.update({title: 'Updated Window'});
+ };
+
+ const closeWindow = async () => {
+ await secondWindow.close();
+ };
+
+ return (
+
+ Is XR session open: {isOpen}
+
+
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ title: {
+ fontSize: 30,
+ margin: 10,
+ textAlign: 'center',
+ },
+});
+
+exports.title = 'XR';
+exports.description = 'Spatial experiences';
+exports.examples = [
+ {
+ title: 'Open XR Session',
+ render(): React.Node {
+ return ;
+ },
+ },
+];
diff --git a/packages/rn-tester/js/utils/RNTesterList.ios.js b/packages/rn-tester/js/utils/RNTesterList.ios.js
index 7c2ab0ce383b75..2287fdce8caa20 100644
--- a/packages/rn-tester/js/utils/RNTesterList.ios.js
+++ b/packages/rn-tester/js/utils/RNTesterList.ios.js
@@ -183,6 +183,10 @@ const APIs: Array = ([
key: 'AppearanceExample',
module: require('../examples/Appearance/AppearanceExample'),
},
+ {
+ key: 'XRExample',
+ module: require('../examples/XR/XRExample'),
+ },
{
key: 'AppStateExample',
module: require('../examples/AppState/AppStateExample'),
diff --git a/packages/rn-tester/metro.config.js b/packages/rn-tester/metro.config.js
index 04a0f563992331..04136b91d6b20d 100644
--- a/packages/rn-tester/metro.config.js
+++ b/packages/rn-tester/metro.config.js
@@ -9,6 +9,7 @@
'use strict';
+const {getPlatformResolver} = require('@callstack/out-of-tree-platforms');
const {getDefaultConfig} = require('@react-native/metro-config');
const {mergeConfig} = require('metro-config');
const path = require('path');
@@ -38,6 +39,9 @@ const config = {
extraNodeModules: {
'react-native': path.resolve(__dirname, '../react-native'),
},
+ resolveRequest: getPlatformResolver({
+ platformNameMap: {visionos: '@callstack/react-native-visionos'},
+ }),
},
};
diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json
index 500bf13f60355a..0b2bde063b32b1 100644
--- a/packages/rn-tester/package.json
+++ b/packages/rn-tester/package.json
@@ -27,11 +27,13 @@
"invariant": "^2.2.4",
"nullthrows": "^1.1.1",
"@react-native/oss-library-example": "*",
- "@react-native/popup-menu-android": "0.75.0-main"
+ "@react-native/popup-menu-android": "0.75.0-main",
+ "@callstack/out-of-tree-platforms": "0.75.0-main"
},
"peerDependencies": {
"react": "18.3.1",
- "react-native": "*"
+ "react-native": "*",
+ "@callstack/react-native-visionos": "*"
},
"codegenConfig": {
"name": "AppSpecs",
diff --git a/scripts/build/config.js b/scripts/build/config.js
index e889eb4d1b7986..bd1926e5d756e5 100644
--- a/scripts/build/config.js
+++ b/scripts/build/config.js
@@ -58,6 +58,10 @@ const buildConfig /*: BuildConfig */ = {
emitTypeScriptDefs: true,
target: 'node',
},
+ 'out-of-tree-platforms': {
+ emitTypeScriptDefs: true,
+ target: 'node',
+ },
},
};
diff --git a/scripts/circleci/pipeline_selection.js b/scripts/circleci/pipeline_selection.js
index 5312caa03f6dc6..a6d90fbacb211d 100644
--- a/scripts/circleci/pipeline_selection.js
+++ b/scripts/circleci/pipeline_selection.js
@@ -155,6 +155,24 @@ function _computeAndSavePipelineParameters(
return;
}
+ // Custom config for visionOS
+ if (pipelineType === 'VISION_OS') {
+ const params = {
+ run_all: false,
+ run_ios: false,
+ run_visionos: true,
+ run_android: false,
+ run_js: true,
+ run_e2e: false,
+ };
+
+ const stringifiedParams = JSON.stringify(params, null, 2);
+ fs.writeFileSync(filePath, stringifiedParams);
+ console.info(`Generated params:\n${stringifiedParams}`);
+
+ return;
+ }
+
console.log(`Should run e2e? ${shouldRunE2E}`);
if (pipelineType === 'ALL') {
fs.writeFileSync(
@@ -167,6 +185,7 @@ function _computeAndSavePipelineParameters(
const params = {
run_all: false,
run_ios: pipelineType === 'RUN_IOS',
+ run_visionos: true,
run_android: pipelineType === 'RUN_ANDROID',
run_js: pipelineType === 'RUN_JS',
run_e2e: shouldRunE2E,
@@ -194,6 +213,7 @@ function createConfigs(inputPath, outputPath, configFile) {
const baseFolder = 'test_workflows';
const testConfigs = {
run_ios: ['testIOS.yml'],
+ run_visionos: ['testVisionOS.yml'],
run_android: ['testAndroid.yml'],
run_e2e: ['testE2E.yml'],
run_all: ['testJS.yml', 'testAll.yml'],
@@ -243,5 +263,5 @@ function filterJobs(outputPath) {
return;
}
}
- _computeAndSavePipelineParameters('ALL', outputPath, shouldRunE2E);
+ _computeAndSavePipelineParameters('VISION_OS', outputPath, shouldRunE2E);
}
diff --git a/scripts/e2e/verdaccio.yml b/scripts/e2e/verdaccio.yml
index 46e6710856a977..615f7344a80564 100644
--- a/scripts/e2e/verdaccio.yml
+++ b/scripts/e2e/verdaccio.yml
@@ -19,6 +19,10 @@ packages:
'@react-native/*':
access: $all
publish: $all
+ proxy: npmjs
+ '@callstack/*':
+ access: $all
+ publish: $all
'@*/*':
access: $all
publish: $authenticated
diff --git a/scripts/monorepo/for-each-package.js b/scripts/monorepo/for-each-package.js
new file mode 100644
index 00000000000000..f3d865dfdacffd
--- /dev/null
+++ b/scripts/monorepo/for-each-package.js
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @format
+ */
+
+const path = require('path');
+const {readdirSync, readFileSync} = require('fs');
+
+const ROOT_LOCATION = path.join(__dirname, '..', '..');
+const PACKAGES_LOCATION = path.join(ROOT_LOCATION, 'packages');
+
+const DEFAULT_OPTIONS = {includeReactNative: false};
+
+/**
+ * Function, which returns an array of all directories inside specified location
+ *
+ * @param {string} source Path to directory, where this should be executed
+ * @returns {string[]} List of directories names
+ */
+const getDirectories = source =>
+ readdirSync(source, {withFileTypes: true})
+ .filter(file => file.isDirectory())
+ .map(directory => directory.name);
+
+/**
+ * @callback forEachPackageCallback
+ * @param {string} packageAbsolutePath
+ * @param {string} packageRelativePathFromRoot
+ * @param {Object} packageManifest
+ */
+
+/**
+ * Iterate through every package inside /packages (ignoring react-native) and call provided callback for each of them
+ *
+ * @param {forEachPackageCallback} callback The callback which will be called for each package
+ * @param {{includeReactNative: (boolean|undefined)}} [options={}] description
+ */
+const forEachPackage = (callback, options = DEFAULT_OPTIONS) => {
+ const {includeReactNative} = options;
+
+ // We filter react-native package on purpose, so that no CI's script will be executed for this package in future
+ // Unless includeReactNative options is provided
+ const packagesDirectories = getDirectories(PACKAGES_LOCATION).filter(
+ directoryName => directoryName !== 'react-native' || includeReactNative,
+ );
+
+ packagesDirectories.forEach(packageDirectory => {
+ const packageAbsolutePath = path.join(PACKAGES_LOCATION, packageDirectory);
+ const packageRelativePathFromRoot = path.join('packages', packageDirectory);
+
+ const packageManifest = JSON.parse(
+ readFileSync(path.join(packageAbsolutePath, 'package.json')),
+ );
+
+ callback(packageAbsolutePath, packageRelativePathFromRoot, packageManifest);
+ });
+};
+
+module.exports = forEachPackage;
diff --git a/scripts/new-github-release-url.js b/scripts/new-github-release-url.js
new file mode 100644
index 00000000000000..3292eda6b6ac63
--- /dev/null
+++ b/scripts/new-github-release-url.js
@@ -0,0 +1,37 @@
+function newGithubReleaseUrl(options = {}) {
+ let repoUrl;
+ if (options.repoUrl) {
+ repoUrl = options.repoUrl;
+ } else if (options.user && options.repo) {
+ repoUrl = `https://github.com/${options.user}/${options.repo}`;
+ } else {
+ throw new Error('You need to specify either the `repoUrl` option or both the `user` and `repo` options');
+ }
+
+ const url = new URL(`${repoUrl}/releases/new`);
+
+ const types = [
+ 'tag',
+ 'target',
+ 'title',
+ 'body',
+ 'isPrerelease',
+ ];
+
+ for (let type of types) {
+ const value = options[type];
+ if (value === undefined) {
+ continue;
+ }
+
+ if (type === 'isPrerelease') {
+ type = 'prerelease';
+ }
+
+ url.searchParams.set(type, value);
+ }
+
+ return url.toString();
+}
+
+module.exports = newGithubReleaseUrl;
diff --git a/scripts/oot-release.js b/scripts/oot-release.js
new file mode 100644
index 00000000000000..a385a88f27b732
--- /dev/null
+++ b/scripts/oot-release.js
@@ -0,0 +1,199 @@
+/**
+ * Based on `scripts/trigger-react-native-release.js` and `set-rn-version.js`
+ *
+ * @format
+ */
+
+'use strict';
+
+const forEachPackage = require('./monorepo/for-each-package');
+const newGithubReleaseUrl = require('./new-github-release-url');
+const {applyPackageVersions, publishPackage} = require('./npm-utils');
+const updateTemplatePackage = require('./releases/update-template-package');
+const {execSync} = require('child_process');
+const fs = require('fs');
+const path = require('path');
+const {cat, echo, exit} = require('shelljs');
+const yargs = require('yargs');
+
+const REPO_ROOT = path.resolve(__dirname, '../');
+
+/**
+ * This script updates core packages to the version of React Native that we are basing on,
+ * updates internal visionOS packages and releases them.
+ */
+if (require.main === module) {
+ let {argv} = yargs
+ .option('v', {
+ alias: 'new-version',
+ type: 'string',
+ describe:
+ 'New version of `@callstack/react-native-visionos` to be released',
+ required: true,
+ })
+ .option('r', {
+ alias: 'react-native-version',
+ type: 'string',
+ describe:
+ 'React Native version that this release is based on. Ex. "0.72.7" or "0.74.0-nightly-20231130-7e5f15b88"',
+ required: true,
+ })
+ .option('t', {
+ alias: 'tag',
+ type: 'string',
+ describe: 'Tag to be used for publishing packages',
+ required: false,
+ })
+ .option('o', {
+ alias: 'one-time-password',
+ type: 'string',
+ describe: 'One time password for npm publish',
+ required: false,
+ });
+
+ releaseOOT(
+ argv.newVersion,
+ argv.reactNativeVersion,
+ argv.oneTimePassword,
+ argv.tag,
+ );
+ exit(0);
+}
+
+function getPackages() {
+ const packages = {};
+ forEachPackage(
+ (packageAbsolutePath, packageRelativePathFromRoot, packageManifest) => {
+ packages[packageManifest.name] = packageRelativePathFromRoot;
+ },
+ {includeReactNative: true},
+ );
+ return packages;
+}
+
+function setPackage(packagePath, version, dependencyVersions) {
+ const originalPackageJson = JSON.parse(cat(`${packagePath}/package.json`));
+ const packageJson =
+ dependencyVersions != null
+ ? applyPackageVersions(originalPackageJson, dependencyVersions)
+ : originalPackageJson;
+
+ packageJson.version = version;
+
+ fs.writeFileSync(
+ `${packagePath}/package.json`,
+ JSON.stringify(packageJson, null, 2),
+ 'utf-8',
+ );
+}
+
+function releaseOOT(
+ newVersion,
+ reactNativeVersion,
+ oneTimePassword,
+ tag = 'latest',
+) {
+ console.log('Releasing visionOS packages with tag: ', tag);
+ const isNightly = tag === 'nightly';
+ const allPackages = getPackages();
+ const corePackages = Object.keys(allPackages).filter(packageName =>
+ packageName.startsWith('@react-native/'),
+ );
+ const visionOSPackages = Object.keys(allPackages).filter(packageName =>
+ packageName.startsWith('@callstack/'),
+ );
+
+ const corePackagesVersions = corePackages.reduce(
+ (acc, pkg) => ({...acc, [pkg]: reactNativeVersion}),
+ {},
+ );
+
+ const visionOSPackagesVersions = visionOSPackages.reduce(
+ (acc, pkg) => ({...acc, [pkg]: newVersion}),
+ {},
+ );
+
+ // Update `packges/react-native` package.json and all visionOS packages
+ if (isNightly) {
+ visionOSPackages.forEach(pkg => {
+ echo(`Setting ${pkg} version to ${newVersion} `);
+ setPackage(allPackages[pkg], newVersion, corePackagesVersions);
+ });
+ } else {
+ visionOSPackages.forEach(pkg => {
+ echo(`Setting ${pkg} version to ${newVersion} `);
+ setPackage(allPackages[pkg], newVersion, visionOSPackagesVersions);
+ });
+ }
+
+ // Update template package.json
+ updateTemplatePackage({
+ 'react-native': reactNativeVersion,
+ ...visionOSPackagesVersions,
+ });
+
+ if (isNightly) {
+ updateTemplatePackage(corePackagesVersions);
+ }
+
+ echo(`Updating template and it's dependencies to ${reactNativeVersion}`);
+
+ echo('Building packages...\n');
+ execSync('node ./scripts/build/build.js', {
+ cwd: REPO_ROOT,
+ stdio: [process.stdin, process.stdout, process.stderr],
+ });
+
+ // Release visionOS packages only if OTP is passed
+ if (!oneTimePassword) {
+ return;
+ }
+
+ const gitTag = `v${newVersion}-visionos`;
+ // Create git tag
+ execSync(`git tag -a ${gitTag} -m "Release ${newVersion}"`, {
+ cwd: REPO_ROOT,
+ stdio: [process.stdin, process.stdout, process.stderr],
+ });
+
+ const results = visionOSPackages
+ .map(npmPackage => {
+ return path.join(__dirname, '..', allPackages[npmPackage]);
+ })
+ .map(packagePath => {
+ echo(`Releasing ${packagePath}`);
+ const result = publishPackage(packagePath, {
+ tags: [tag],
+ otp: oneTimePassword,
+ });
+
+ return result.code;
+ });
+
+ if (results.every(Boolean)) {
+ echo(`Failed to publish ${visionOSPackages.join(', ')} packages to npm`);
+ return exit(1);
+ } else {
+ echo(
+ `Published ${visionOSPackages.join(
+ ', ',
+ )} to npm with version: ${newVersion}`,
+ );
+
+ const releaseURL = newGithubReleaseUrl({
+ tag: gitTag,
+ title: `Release ${newVersion}`,
+ repo: 'react-native-visionos',
+ user: 'callstack',
+ });
+
+ echo('\n\n');
+ echo('-------------------------------------------\n');
+ echo(`Create a new release here: ${releaseURL}\n`);
+ echo('-------------------------------------------');
+
+ return exit(0);
+ }
+}
+
+module.exports = releaseOOT;
diff --git a/yarn.lock b/yarn.lock
index 0c994902b6303f..b777593948309f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -576,6 +576,16 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
"@babel/plugin-proposal-optional-chaining" "^7.18.9"
+"@babel/plugin-proposal-async-generator-functions@^7.0.0":
+ version "7.20.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
+ integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/helper-remap-async-to-generator" "^7.18.9"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
"@babel/plugin-proposal-async-generator-functions@^7.20.1":
version "7.20.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9"
@@ -586,7 +596,7 @@
"@babel/helper-remap-async-to-generator" "^7.18.9"
"@babel/plugin-syntax-async-generators" "^7.8.4"
-"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.6":
+"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0", "@babel/plugin-proposal-class-properties@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
@@ -635,6 +645,14 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-json-strings" "^7.8.3"
+"@babel/plugin-proposal-logical-assignment-operators@^7.18.0":
+ version "7.20.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83"
+ integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
"@babel/plugin-proposal-logical-assignment-operators@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23"
@@ -643,7 +661,7 @@
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
@@ -651,7 +669,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-"@babel/plugin-proposal-numeric-separator@^7.18.6":
+"@babel/plugin-proposal-numeric-separator@^7.0.0", "@babel/plugin-proposal-numeric-separator@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
@@ -659,7 +677,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.2":
+"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.0", "@babel/plugin-proposal-object-rest-spread@^7.20.2":
version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
@@ -670,7 +688,7 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-transform-parameters" "^7.20.7"
-"@babel/plugin-proposal-optional-catch-binding@^7.18.6":
+"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
@@ -678,7 +696,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9":
+"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.0":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea"
integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
@@ -2314,6 +2332,17 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
+"@jest/types@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
+ integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^16.0.0"
+ chalk "^4.0.0"
+
"@jest/types@^29.5.0":
version "29.5.0"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593"
@@ -2615,6 +2644,26 @@
optionalDependencies:
npmlog "2 || ^3.1.0 || ^4.0.0"
+"@react-native-community/cli-clean@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.5.1.tgz#383d02ed48379a6a21446d6fc28fc21617613e23"
+ integrity sha512-mfDSpQRSg6hw3QlWXRUcgHKueFwTB0nKamOBBNugPRF3DwCJ+vCS4NFTbjGnNCgkFCPDy42FmXC6nTkK8rtjvw==
+ dependencies:
+ "@react-native-community/cli-tools" "13.5.1"
+ chalk "^4.1.2"
+ execa "^5.0.0"
+ glob "^7.1.3"
+
+"@react-native-community/cli-clean@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.6.6.tgz#87c7ad8746c38dab0fe7b3c6ff89d44351d5d943"
+ integrity sha512-cBwJTwl0NyeA4nyMxbhkWZhxtILYkbU3TW3k8AXLg+iGphe0zikYMGB3T+haTvTc6alTyEFwPbimk9bGIqkjAQ==
+ dependencies:
+ "@react-native-community/cli-tools" "13.6.6"
+ chalk "^4.1.2"
+ execa "^5.0.0"
+ fast-glob "^3.3.2"
+
"@react-native-community/cli-clean@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-14.0.0-alpha.2.tgz#f87f1e313652360ad78b3008f91476af9d95e365"
@@ -2625,6 +2674,30 @@
execa "^5.0.0"
fast-glob "^3.3.2"
+"@react-native-community/cli-config@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-13.5.1.tgz#45b5a0e3dccd029a9260fd99919eaf13957c9a67"
+ integrity sha512-kwnkrUdSh7skFoRMn4bzL/lVtFbcFxfc8i7PZQjudvLJkFs8BAOXDLFwZeNSNnW1STdRJWGL6kIxwoHOKUbJUw==
+ dependencies:
+ "@react-native-community/cli-tools" "13.5.1"
+ chalk "^4.1.2"
+ cosmiconfig "^5.1.0"
+ deepmerge "^4.3.0"
+ glob "^7.1.3"
+ joi "^17.2.1"
+
+"@react-native-community/cli-config@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-13.6.6.tgz#69f590694b3a079c74f781baab3b762db74f5dbd"
+ integrity sha512-mbG425zCKr8JZhv/j11382arezwS/70juWMsn8j2lmrGTrP1cUdW0MF15CCIFtJsqyK3Qs+FTmqttRpq81QfSg==
+ dependencies:
+ "@react-native-community/cli-tools" "13.6.6"
+ chalk "^4.1.2"
+ cosmiconfig "^5.1.0"
+ deepmerge "^4.3.0"
+ fast-glob "^3.3.2"
+ joi "^17.2.1"
+
"@react-native-community/cli-config@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-14.0.0-alpha.2.tgz#392b0e7d768842b57ec594cb3995f3d4f6fbabe8"
@@ -2649,6 +2722,27 @@
fast-glob "^3.3.2"
joi "^17.2.1"
+"@react-native-community/cli-debugger-ui@12.0.0-alpha.15":
+ version "12.0.0-alpha.15"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.0.0-alpha.15.tgz#7b5f0e6ef7c379bba1eb56a10a30b1f0546c590c"
+ integrity sha512-s0W0EYFFDZr7fJgdi6g5I9/UFipNzup3dv5BwSESU+pRgJ2cBw+vdrPJ+K3gF/C/mL2gslGlVqj97FhlBEWIiw==
+ dependencies:
+ serve-static "^1.13.1"
+
+"@react-native-community/cli-debugger-ui@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.5.1.tgz#804a2e31754aa23a26782f4c411e5d73ed5c9b03"
+ integrity sha512-VASW7KZsATtvQNHb26pDJ1JDMq+B5sGZTgMjUfg4sLDnjZFmHtyX8MIjmTTKfurZ0Kqi7fxeGTiHiRXCXKHXzQ==
+ dependencies:
+ serve-static "^1.13.1"
+
+"@react-native-community/cli-debugger-ui@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.6.tgz#ac021ebd795b0fd66fb52a8987d1d41c5a4b8cb3"
+ integrity sha512-Vv9u6eS4vKSDAvdhA0OiQHoA7y39fiPIgJ6biT32tN4avHDtxlc6TWZGiqv7g98SBvDWvoVAmdPLcRf3kU+c8g==
+ dependencies:
+ serve-static "^1.13.1"
+
"@react-native-community/cli-debugger-ui@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0-alpha.2.tgz#484847fb01eef67ea2c26cd35a88342112c15ff9"
@@ -2656,6 +2750,53 @@
dependencies:
serve-static "^1.13.1"
+"@react-native-community/cli-doctor@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-13.5.1.tgz#4aef9ce3875fe1ce253ff69157ce89829db008f8"
+ integrity sha512-mTb1HwrMirV4RMjtk0B0+j3862Pz61/qjmL1FiR5QaDHD6KzNucwoY6DDQvltFmojmWpbEdiRf6x49sDz9VxmQ==
+ dependencies:
+ "@react-native-community/cli-config" "13.5.1"
+ "@react-native-community/cli-platform-android" "13.5.1"
+ "@react-native-community/cli-platform-apple" "13.5.1"
+ "@react-native-community/cli-platform-ios" "13.5.1"
+ "@react-native-community/cli-tools" "13.5.1"
+ chalk "^4.1.2"
+ command-exists "^1.2.8"
+ deepmerge "^4.3.0"
+ envinfo "^7.10.0"
+ execa "^5.0.0"
+ hermes-profile-transformer "^0.0.6"
+ ip "^1.1.5"
+ node-stream-zip "^1.9.1"
+ ora "^5.4.1"
+ semver "^7.5.2"
+ strip-ansi "^5.2.0"
+ wcwidth "^1.0.1"
+ yaml "^2.2.1"
+
+"@react-native-community/cli-doctor@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-13.6.6.tgz#ac0febff05601d9b86af3e03460e1a6b0a1d33a5"
+ integrity sha512-TWZb5g6EmQe2Ua2TEWNmyaEayvlWH4GmdD9ZC+p8EpKFpB1NpDGMK6sXbpb42TDvwZg5s4TDRplK0PBEA/SVDg==
+ dependencies:
+ "@react-native-community/cli-config" "13.6.6"
+ "@react-native-community/cli-platform-android" "13.6.6"
+ "@react-native-community/cli-platform-apple" "13.6.6"
+ "@react-native-community/cli-platform-ios" "13.6.6"
+ "@react-native-community/cli-tools" "13.6.6"
+ chalk "^4.1.2"
+ command-exists "^1.2.8"
+ deepmerge "^4.3.0"
+ envinfo "^7.10.0"
+ execa "^5.0.0"
+ hermes-profile-transformer "^0.0.6"
+ node-stream-zip "^1.9.1"
+ ora "^5.4.1"
+ semver "^7.5.2"
+ strip-ansi "^5.2.0"
+ wcwidth "^1.0.1"
+ yaml "^2.2.1"
+
"@react-native-community/cli-doctor@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-14.0.0-alpha.2.tgz#0a3e5b7512b930a079e9dacae2cc77073b111f95"
@@ -2678,6 +2819,51 @@
wcwidth "^1.0.1"
yaml "^2.2.1"
+"@react-native-community/cli-hermes@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-13.5.1.tgz#5bb94582009124874791297802389f7881d08cce"
+ integrity sha512-PE0UMJZx4OcsKXoRzeEkaSz+x9/GdZi/ezgJ5TCnuhoSpgUPO9g5UrkGcmWqDD41W+JWWwCE3N9eLryyXd0wmQ==
+ dependencies:
+ "@react-native-community/cli-platform-android" "13.5.1"
+ "@react-native-community/cli-tools" "13.5.1"
+ chalk "^4.1.2"
+ hermes-profile-transformer "^0.0.6"
+ ip "^1.1.5"
+
+"@react-native-community/cli-hermes@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-13.6.6.tgz#590f55f151fec23b55498228f92d100a0e71d474"
+ integrity sha512-La5Ie+NGaRl3klei6WxKoOxmCUSGGxpOk6vU5pEGf0/O7ky+Ay0io+zXYUZqlNMi/cGpO7ZUijakBYOB/uyuFg==
+ dependencies:
+ "@react-native-community/cli-platform-android" "13.6.6"
+ "@react-native-community/cli-tools" "13.6.6"
+ chalk "^4.1.2"
+ hermes-profile-transformer "^0.0.6"
+
+"@react-native-community/cli-platform-android@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-13.5.1.tgz#2d2f55be5d85fc911ff0b24b1c50bf8ad22d1b86"
+ integrity sha512-U6TixH8X1LsheCr5Sd7/68OpH4DbLcNhbqROfnezIByimjNpLby2mQ85yPXTrV1MYck0Q78L99yvevqLZbJ53Q==
+ dependencies:
+ "@react-native-community/cli-tools" "13.5.1"
+ chalk "^4.1.2"
+ execa "^5.0.0"
+ fast-xml-parser "^4.2.4"
+ glob "^7.1.3"
+ logkitty "^0.7.1"
+
+"@react-native-community/cli-platform-android@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.6.tgz#9e3863cb092709021f11848890bff0fc16fc1609"
+ integrity sha512-/tMwkBeNxh84syiSwNlYtmUz/Ppc+HfKtdopL/5RB+fd3SV1/5/NPNjMlyLNgFKnpxvKCInQ7dnl6jGHJjeHjg==
+ dependencies:
+ "@react-native-community/cli-tools" "13.6.6"
+ chalk "^4.1.2"
+ execa "^5.0.0"
+ fast-glob "^3.3.2"
+ fast-xml-parser "^4.2.4"
+ logkitty "^0.7.1"
+
"@react-native-community/cli-platform-android@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-14.0.0-alpha.2.tgz#a2ce4de0f3003db3cf34fcdbf384f701ae1dc16d"
@@ -2690,6 +2876,30 @@
fast-xml-parser "^4.2.4"
logkitty "^0.7.1"
+"@react-native-community/cli-platform-apple@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.5.1.tgz#facd4a7c03f905fde1636ca1fbf21f4adf3ccdbb"
+ integrity sha512-vhS0RGR/q+XM0ycIcfsK2nWkcYLXifJj5thXRvZEhn800OorhRHf6qYaN/y6RV9ruZLkrevSg17/fBpXTibpdw==
+ dependencies:
+ "@react-native-community/cli-tools" "13.5.1"
+ chalk "^4.1.2"
+ execa "^5.0.0"
+ fast-xml-parser "^4.0.12"
+ glob "^7.1.3"
+ ora "^5.4.1"
+
+"@react-native-community/cli-platform-apple@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.6.tgz#d445fd6ed02c5ae2f43f9c45501e04fee53a2790"
+ integrity sha512-bOmSSwoqNNT3AmCRZXEMYKz1Jf1l2F86Nhs7qBcXdY/sGiJ+Flng564LOqvdAlVLTbkgz47KjNKCS2pP4Jg0Mg==
+ dependencies:
+ "@react-native-community/cli-tools" "13.6.6"
+ chalk "^4.1.2"
+ execa "^5.0.0"
+ fast-glob "^3.3.2"
+ fast-xml-parser "^4.0.12"
+ ora "^5.4.1"
+
"@react-native-community/cli-platform-apple@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.0.0-alpha.2.tgz#feaa2770005dd08b6bff380c623ec177a65d2a65"
@@ -2714,6 +2924,20 @@
fast-xml-parser "^4.0.12"
ora "^5.4.1"
+"@react-native-community/cli-platform-ios@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.5.1.tgz#f4a5ee353bccf3a633ce6ea5e7af68e8ba26f252"
+ integrity sha512-AdTMgGF9W5KMYmI0iPViMKt3uzoahi9TBSilHoty8vZ5KLxmx1imB4Co54db8aIbwhpK0q5wBSJPjR1Ij99c1g==
+ dependencies:
+ "@react-native-community/cli-platform-apple" "13.5.1"
+
+"@react-native-community/cli-platform-ios@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.6.tgz#0cd700f36483ca37dda7ec044377f8a926b1df1f"
+ integrity sha512-vjDnRwhlSN5ryqKTas6/DPkxuouuyFBAqAROH4FR1cspTbn6v78JTZKDmtQy9JMMo7N5vZj1kASU5vbFep9IOQ==
+ dependencies:
+ "@react-native-community/cli-platform-apple" "13.6.6"
+
"@react-native-community/cli-platform-ios@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.0.0-alpha.2.tgz#6651691421d57d4230ee8d0dcd309af94a8303a7"
@@ -2721,6 +2945,51 @@
dependencies:
"@react-native-community/cli-platform-apple" "14.0.0-alpha.2"
+"@react-native-community/cli-server-api@12.0.0-alpha.15":
+ version "12.0.0-alpha.15"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-12.0.0-alpha.15.tgz#59ea9fdd8a9d9362c79597745771510cbed5b0c1"
+ integrity sha512-vGOnZsreBPaSpoGN2TkhJGfu56Ybf1PoC6PcrUzKh+QgsOiI0AWimWiKUUvnEaQlURI7CeiMe1N0zghhbfC3nA==
+ dependencies:
+ "@react-native-community/cli-debugger-ui" "12.0.0-alpha.15"
+ "@react-native-community/cli-tools" "12.0.0-alpha.15"
+ compression "^1.7.1"
+ connect "^3.6.5"
+ errorhandler "^1.5.1"
+ nocache "^3.0.1"
+ pretty-format "^26.6.2"
+ serve-static "^1.13.1"
+ ws "^7.5.1"
+
+"@react-native-community/cli-server-api@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-13.5.1.tgz#bb29480a9f982706d51e9a79bbaef2eae8cc6896"
+ integrity sha512-Ke1wWHfEZHcruA3kOpKGO6i21uXIt3AzUi3eLVLZWDtYnyfRUzkWwYycbrcmSgDfboWrFc4uHMk9uHT4PHsnZA==
+ dependencies:
+ "@react-native-community/cli-debugger-ui" "13.5.1"
+ "@react-native-community/cli-tools" "13.5.1"
+ compression "^1.7.1"
+ connect "^3.6.5"
+ errorhandler "^1.5.1"
+ nocache "^3.0.1"
+ pretty-format "^26.6.2"
+ serve-static "^1.13.1"
+ ws "^7.5.1"
+
+"@react-native-community/cli-server-api@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-13.6.6.tgz#467993006ef82361cdf7a9817999d5a09e85ca6a"
+ integrity sha512-ZtCXxoFlM7oDv3iZ3wsrT3SamhtUJuIkX2WePLPlN5bcbq7zimbPm2lHyicNJtpcGQ5ymsgpUWPCNZsWQhXBqQ==
+ dependencies:
+ "@react-native-community/cli-debugger-ui" "13.6.6"
+ "@react-native-community/cli-tools" "13.6.6"
+ compression "^1.7.1"
+ connect "^3.6.5"
+ errorhandler "^1.5.1"
+ nocache "^3.0.1"
+ pretty-format "^26.6.2"
+ serve-static "^1.13.1"
+ ws "^6.2.2"
+
"@react-native-community/cli-server-api@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-14.0.0-alpha.2.tgz#28ddb885f2fee76b325799f512ff0fbdd02570cd"
@@ -2736,6 +3005,38 @@
serve-static "^1.13.1"
ws "^7.5.1"
+"@react-native-community/cli-tools@12.0.0-alpha.15":
+ version "12.0.0-alpha.15"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-12.0.0-alpha.15.tgz#d9ee1fc6b49b0a34f982c6634a50e61ac332394a"
+ integrity sha512-AL/UskYhi4U79T5660oW/Aa27N/wp8lRgnpkFP7saL2zy/I0ZrBTUmHPt1pDdwMnjMfYXJGyyoomMbwqWUpLig==
+ dependencies:
+ appdirsjs "^1.2.4"
+ chalk "^4.1.2"
+ find-up "^5.0.0"
+ mime "^2.4.1"
+ node-fetch "^2.6.0"
+ open "^6.2.0"
+ ora "^5.4.1"
+ semver "^7.5.2"
+ shell-quote "^1.7.3"
+ sudo-prompt "^9.0.0"
+
+"@react-native-community/cli-tools@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.5.1.tgz#3e5b76e0083d106c5b0d06edf6fb5d6c9c456b23"
+ integrity sha512-IIC/xGjSJCKFnhedgP8FAL85IBYsEf80FNrPxmIcaHVTHxE4eXs5/Cc/d2NgL8BZGBT8QK3TV4XQuWbgDGBCoQ==
+ dependencies:
+ appdirsjs "^1.2.4"
+ chalk "^4.1.2"
+ find-up "^5.0.0"
+ mime "^2.4.1"
+ node-fetch "^2.6.0"
+ open "^6.2.0"
+ ora "^5.4.1"
+ semver "^7.5.2"
+ shell-quote "^1.7.3"
+ sudo-prompt "^9.0.0"
+
"@react-native-community/cli-tools@13.6.4", "@react-native-community/cli-tools@^13.6.4":
version "13.6.4"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.6.4.tgz#ab396604b6dcf215790807fe89656e779b11f0ec"
@@ -2753,6 +3054,23 @@
shell-quote "^1.7.3"
sudo-prompt "^9.0.0"
+"@react-native-community/cli-tools@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.6.6.tgz#55c40cbabafbfc56cfb95a4d5fbf73ef60ec3cbc"
+ integrity sha512-ptOnn4AJczY5njvbdK91k4hcYazDnGtEPrqIwEI+k/CTBHNdb27Rsm2OZ7ye6f7otLBqF8gj/hK6QzJs8CEMgw==
+ dependencies:
+ appdirsjs "^1.2.4"
+ chalk "^4.1.2"
+ execa "^5.0.0"
+ find-up "^5.0.0"
+ mime "^2.4.1"
+ node-fetch "^2.6.0"
+ open "^6.2.0"
+ ora "^5.4.1"
+ semver "^7.5.2"
+ shell-quote "^1.7.3"
+ sudo-prompt "^9.0.0"
+
"@react-native-community/cli-tools@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-14.0.0-alpha.2.tgz#fa898083fa48449d9a2a08624fa2d71057a37d2e"
@@ -2770,6 +3088,20 @@
shell-quote "^1.7.3"
sudo-prompt "^9.0.0"
+"@react-native-community/cli-types@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-13.5.1.tgz#a8d68f61a8ba7e59add7f492daa0288ed0ad61ce"
+ integrity sha512-hvRqXZdCPc8kPnKtXxH9dVlEFiMZTPlaJ1p5tV2p3Y+rFkK1mf0Kb6CHG3mDgJhSt1Ssbg159nfNzD0ApC25lA==
+ dependencies:
+ joi "^17.2.1"
+
+"@react-native-community/cli-types@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-13.6.6.tgz#b45af119d61888fea1074a7c32ddb093e3f119a9"
+ integrity sha512-733iaYzlmvNK7XYbnWlMjdE+2k0hlTBJW071af/xb6Bs+hbJqBP9c03FZuYH2hFFwDDntwj05bkri/P7VgSxug==
+ dependencies:
+ joi "^17.2.1"
+
"@react-native-community/cli-types@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-14.0.0-alpha.2.tgz#6ebb5d088350901ed6d9870ab9b1e75dd7609ca9"
@@ -2784,6 +3116,52 @@
dependencies:
joi "^17.2.1"
+"@react-native-community/cli@13.5.1":
+ version "13.5.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.5.1.tgz#f81936f79c4dc503d3e914fd214b56b42a57b771"
+ integrity sha512-k6Mk2cxCSvJ9bRWGvBtTdtcl+FPttrHPl91XezU0pjuXa9fwRRUInn0i5DcZWa31QDK/G5AGiNhdwIPADDkt3Q==
+ dependencies:
+ "@react-native-community/cli-clean" "13.5.1"
+ "@react-native-community/cli-config" "13.5.1"
+ "@react-native-community/cli-debugger-ui" "13.5.1"
+ "@react-native-community/cli-doctor" "13.5.1"
+ "@react-native-community/cli-hermes" "13.5.1"
+ "@react-native-community/cli-server-api" "13.5.1"
+ "@react-native-community/cli-tools" "13.5.1"
+ "@react-native-community/cli-types" "13.5.1"
+ chalk "^4.1.2"
+ commander "^9.4.1"
+ deepmerge "^4.3.0"
+ execa "^5.0.0"
+ find-up "^4.1.0"
+ fs-extra "^8.1.0"
+ graceful-fs "^4.1.3"
+ prompts "^2.4.2"
+ semver "^7.5.2"
+
+"@react-native-community/cli@13.6.6":
+ version "13.6.6"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.6.6.tgz#b929c8668e88344c03a46a3e635cb382dba16773"
+ integrity sha512-IqclB7VQ84ye8Fcs89HOpOscY4284VZg2pojHNl8H0Lzd4DadXJWQoxC7zWm8v2f8eyeX2kdhxp2ETD5tceIgA==
+ dependencies:
+ "@react-native-community/cli-clean" "13.6.6"
+ "@react-native-community/cli-config" "13.6.6"
+ "@react-native-community/cli-debugger-ui" "13.6.6"
+ "@react-native-community/cli-doctor" "13.6.6"
+ "@react-native-community/cli-hermes" "13.6.6"
+ "@react-native-community/cli-server-api" "13.6.6"
+ "@react-native-community/cli-tools" "13.6.6"
+ "@react-native-community/cli-types" "13.6.6"
+ chalk "^4.1.2"
+ commander "^9.4.1"
+ deepmerge "^4.3.0"
+ execa "^5.0.0"
+ find-up "^4.1.0"
+ fs-extra "^8.1.0"
+ graceful-fs "^4.1.3"
+ prompts "^2.4.2"
+ semver "^7.5.2"
+
"@react-native-community/cli@14.0.0-alpha.2":
version "14.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-14.0.0-alpha.2.tgz#39ca31ebe0ff615398012bacdd3de710229707a1"
@@ -2806,6 +3184,325 @@
prompts "^2.4.2"
semver "^7.5.2"
+"@react-native/assets-registry@0.74.0":
+ version "0.74.0"
+ resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.0.tgz#560bec29b2699c4d4cbfecfb4c2c5025397aac23"
+ integrity sha512-I8Yy6bCKU5R4qZX4jfXsAPsHyuGHlulbnbG3NqO9JgZ3T2DJxJiZE39rHORP0trLnRh0rIeRcs4Mc14fAE6hrw==
+
+"@react-native/assets-registry@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.83.tgz#c1815dc10f9e1075e0d03b4c8a9619145969522e"
+ integrity sha512-2vkLMVnp+YTZYTNSDIBZojSsjz8sl5PscP3j4GcV6idD8V978SZfwFlk8K0ti0BzRs11mzL0Pj17km597S/eTQ==
+
+"@react-native/babel-plugin-codegen@0.74.81":
+ version "0.74.81"
+ resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.81.tgz#80484fb9029038694a92193ae2653529e44aab64"
+ integrity sha512-Bj6g5/xkLMBAdC6665TbD3uCKCQSmLQpGv3gyqya/ydZpv3dDmDXfkGmO4fqTwEMunzu09Sk55st2ipmuXAaAg==
+ dependencies:
+ "@react-native/codegen" "0.74.81"
+
+"@react-native/babel-plugin-codegen@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.83.tgz#971f9cfec980dd05598d81964c05a26c6166f9fb"
+ integrity sha512-+S0st3t4Ro00bi9gjT1jnK8qTFOU+CwmziA7U9odKyWrCoRJrgmrvogq/Dr1YXlpFxexiGIupGut1VHxr+fxJA==
+ dependencies:
+ "@react-native/codegen" "0.74.83"
+
+"@react-native/babel-preset@0.74.81":
+ version "0.74.81"
+ resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.74.81.tgz#80d0b96eef35d671f97eaf223c4d770170d7f23f"
+ integrity sha512-H80B3Y3lBBVC4x9tceTEQq/04lx01gW6ajWCcVbd7sHvGEAxfMFEZUmVZr0451Cafn02wVnDJ8psto1F+0w5lw==
+ dependencies:
+ "@babel/core" "^7.20.0"
+ "@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"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.0.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.20.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+ "@babel/plugin-syntax-export-default-from" "^7.0.0"
+ "@babel/plugin-syntax-flow" "^7.18.0"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.0.0"
+ "@babel/plugin-transform-arrow-functions" "^7.0.0"
+ "@babel/plugin-transform-async-to-generator" "^7.20.0"
+ "@babel/plugin-transform-block-scoping" "^7.0.0"
+ "@babel/plugin-transform-classes" "^7.0.0"
+ "@babel/plugin-transform-computed-properties" "^7.0.0"
+ "@babel/plugin-transform-destructuring" "^7.20.0"
+ "@babel/plugin-transform-flow-strip-types" "^7.20.0"
+ "@babel/plugin-transform-function-name" "^7.0.0"
+ "@babel/plugin-transform-literals" "^7.0.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.0.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0"
+ "@babel/plugin-transform-parameters" "^7.0.0"
+ "@babel/plugin-transform-private-methods" "^7.22.5"
+ "@babel/plugin-transform-private-property-in-object" "^7.22.11"
+ "@babel/plugin-transform-react-display-name" "^7.0.0"
+ "@babel/plugin-transform-react-jsx" "^7.0.0"
+ "@babel/plugin-transform-react-jsx-self" "^7.0.0"
+ "@babel/plugin-transform-react-jsx-source" "^7.0.0"
+ "@babel/plugin-transform-runtime" "^7.0.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.0.0"
+ "@babel/plugin-transform-spread" "^7.0.0"
+ "@babel/plugin-transform-sticky-regex" "^7.0.0"
+ "@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" "0.74.81"
+ babel-plugin-transform-flow-enums "^0.0.2"
+ react-refresh "^0.14.0"
+
+"@react-native/babel-preset@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.74.83.tgz#9828457779b4ce0219078652327ce3203115cdf9"
+ integrity sha512-KJuu3XyVh3qgyUer+rEqh9a/JoUxsDOzkJNfRpDyXiAyjDRoVch60X/Xa/NcEQ93iCVHAWs0yQ+XGNGIBCYE6g==
+ dependencies:
+ "@babel/core" "^7.20.0"
+ "@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"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.0.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.20.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+ "@babel/plugin-syntax-export-default-from" "^7.0.0"
+ "@babel/plugin-syntax-flow" "^7.18.0"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.0.0"
+ "@babel/plugin-transform-arrow-functions" "^7.0.0"
+ "@babel/plugin-transform-async-to-generator" "^7.20.0"
+ "@babel/plugin-transform-block-scoping" "^7.0.0"
+ "@babel/plugin-transform-classes" "^7.0.0"
+ "@babel/plugin-transform-computed-properties" "^7.0.0"
+ "@babel/plugin-transform-destructuring" "^7.20.0"
+ "@babel/plugin-transform-flow-strip-types" "^7.20.0"
+ "@babel/plugin-transform-function-name" "^7.0.0"
+ "@babel/plugin-transform-literals" "^7.0.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.0.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0"
+ "@babel/plugin-transform-parameters" "^7.0.0"
+ "@babel/plugin-transform-private-methods" "^7.22.5"
+ "@babel/plugin-transform-private-property-in-object" "^7.22.11"
+ "@babel/plugin-transform-react-display-name" "^7.0.0"
+ "@babel/plugin-transform-react-jsx" "^7.0.0"
+ "@babel/plugin-transform-react-jsx-self" "^7.0.0"
+ "@babel/plugin-transform-react-jsx-source" "^7.0.0"
+ "@babel/plugin-transform-runtime" "^7.0.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.0.0"
+ "@babel/plugin-transform-spread" "^7.0.0"
+ "@babel/plugin-transform-sticky-regex" "^7.0.0"
+ "@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" "0.74.83"
+ babel-plugin-transform-flow-enums "^0.0.2"
+ react-refresh "^0.14.0"
+
+"@react-native/codegen@0.74.0":
+ version "0.74.0"
+ resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.0.tgz#59ae487528f828481beec017b12abab5bd077fe4"
+ integrity sha512-Y01QK7Ae789su7qgjOZiRyrsfOaD+oiHEpbAqqnGB6UmuTiS77gMFH8hzU45Hu4bC2iTP7FG5/5YvlzbSmR82g==
+ dependencies:
+ "@babel/parser" "^7.20.0"
+ flow-parser "^0.206.0"
+ jscodeshift "^0.14.0"
+ nullthrows "^1.1.1"
+
+"@react-native/codegen@0.74.81":
+ version "0.74.81"
+ resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.81.tgz#1025ffd41f2b4710fd700c9e8e85210b9651a7c4"
+ integrity sha512-hhXo4ccv2lYWaJrZDsdbRTZ5SzSOdyZ0MY6YXwf3xEFLuSunbUMu17Rz5LXemKXlpVx4KEgJ/TDc2pPVaRPZgA==
+ dependencies:
+ "@babel/parser" "^7.20.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"
+
+"@react-native/codegen@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.83.tgz#7c56a82fe7603f0867f0d80ff29db3757b71be55"
+ integrity sha512-GgvgHS3Aa2J8/mp1uC/zU8HuTh8ZT5jz7a4mVMWPw7+rGyv70Ba8uOVBq6UH2Q08o617IATYc+0HfyzAfm4n0w==
+ dependencies:
+ "@babel/parser" "^7.20.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"
+
+"@react-native/community-cli-plugin@0.74.0":
+ version "0.74.0"
+ resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.0.tgz#b4ca607ff97e7856a6da7bc00a4cc148538dd3a0"
+ integrity sha512-6ngHjG6a1aOhmGtDCIIWLehdOoBLF2ko1pYNiNgcnSw9M3MlkIbEqMFxmBy/3hclcTPvUrKDiNgPDQ7sq7CQYA==
+ 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.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"
+ node-fetch "^2.2.0"
+ readline "^1.3.0"
+
+"@react-native/community-cli-plugin@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.83.tgz#58808a58a5288895627548338731e72ebb5b507c"
+ integrity sha512-7GAFjFOg1mFSj8bnFNQS4u8u7+QtrEeflUIDVZGEfBZQ3wMNI5ycBzbBGycsZYiq00Xvoc6eKFC7kvIaqeJpUQ==
+ dependencies:
+ "@react-native-community/cli-server-api" "13.6.6"
+ "@react-native-community/cli-tools" "13.6.6"
+ "@react-native/dev-middleware" "0.74.83"
+ "@react-native/metro-babel-transformer" "0.74.83"
+ chalk "^4.0.0"
+ execa "^5.1.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"
+
+"@react-native/debugger-frontend@0.74.81":
+ version "0.74.81"
+ resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.81.tgz#17cefe2b3ff485071bd30d819995867fd145da27"
+ integrity sha512-HCYF1/88AfixG75558HkNh9wcvGweRaSZGBA71KoZj03umXM8XJy0/ZpacGOml2Fwiqpil72gi6uU+rypcc/vw==
+
+"@react-native/debugger-frontend@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.83.tgz#48050afa4e086438073b95f041c0cc84fe3f20de"
+ integrity sha512-RGQlVUegBRxAUF9c1ss1ssaHZh6CO+7awgtI9sDeU0PzDZY/40ImoPD5m0o0SI6nXoVzbPtcMGzU+VO590pRfA==
+
+"@react-native/dev-middleware@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.83.tgz#9d09cfdb763e8ef81c003b0f99ae4ed1a3539639"
+ integrity sha512-UH8iriqnf7N4Hpi20D7M2FdvSANwTVStwFCSD7VMU9agJX88Yk0D1T6Meh2RMhUu4kY2bv8sTkNRm7LmxvZqgA==
+ dependencies:
+ "@isaacs/ttlcache" "^1.4.1"
+ "@react-native/debugger-frontend" "0.74.83"
+ "@rnx-kit/chromium-edge-launcher" "^1.0.0"
+ chrome-launcher "^0.15.2"
+ 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"
+ ws "^6.2.2"
+
+"@react-native/dev-middleware@^0.74.0":
+ version "0.74.81"
+ resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.81.tgz#120ab62982a48cba90c7724d099ddaa50184c200"
+ integrity sha512-x2IpvUJN1LJE0WmPsSfQIbQaa9xwH+2VDFOUrzuO9cbQap8rNfZpcvVNbrZgrlKbgS4LXbbsj6VSL8b6SnMKMA==
+ dependencies:
+ "@isaacs/ttlcache" "^1.4.1"
+ "@react-native/debugger-frontend" "0.74.81"
+ "@rnx-kit/chromium-edge-launcher" "^1.0.0"
+ chrome-launcher "^0.15.2"
+ 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"
+ ws "^6.2.2"
+
+"@react-native/gradle-plugin@0.74.0":
+ version "0.74.0"
+ resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.0.tgz#dc02146c62b99c5910570f2cd315f90934900406"
+ integrity sha512-QwA4S96LXuT1URGU9CX4I+uvBieIxBya5J2E2QH/H5cgzJNOeXRMBMtUurxg9dIIJQbO/xlDHY5aYW1lehut6w==
+
+"@react-native/gradle-plugin@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.83.tgz#4ac60a6d6295d5b920173cbf184ee32e53690810"
+ integrity sha512-Pw2BWVyOHoBuJVKxGVYF6/GSZRf6+v1Ygc+ULGz5t20N8qzRWPa2fRZWqoxsN7TkNLPsECYY8gooOl7okOcPAQ==
+
+"@react-native/js-polyfills@0.74.0":
+ version "0.74.0"
+ resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.0.tgz#54f7d728b6c8ea52d29993d86d2a9d4be08072d2"
+ integrity sha512-DMpn5l1TVkIBFe9kE54pwOI2fQYbQNZ6cto0IuCUxQVUFJBcFMJ6Gbk8jhz8tvcWuDW3xVK9AWq9DJTkuchWsQ==
+
+"@react-native/js-polyfills@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.83.tgz#0e189ce3ab0efecd00223f3bfc53663ce08ba013"
+ integrity sha512-/t74n8r6wFhw4JEoOj3bN71N1NDLqaawB75uKAsSjeCwIR9AfCxlzZG0etsXtOexkY9KMeZIQ7YwRPqUdNXuqw==
+
+"@react-native/metro-babel-transformer@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.83.tgz#ba87c3cf041f4c0d2b991231af1a6b4a216e9b5d"
+ integrity sha512-hGdx5N8diu8y+GW/ED39vTZa9Jx1di2ZZ0aapbhH4egN1agIAusj5jXTccfNBwwWF93aJ5oVbRzfteZgjbutKg==
+ dependencies:
+ "@babel/core" "^7.20.0"
+ "@react-native/babel-preset" "0.74.83"
+ hermes-parser "0.19.1"
+ nullthrows "^1.1.1"
+
+"@react-native/metro-babel-transformer@^0.74.0":
+ version "0.74.81"
+ resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.81.tgz#f724eab91e6de82f8d098e6de57f25bb7501d2d6"
+ integrity sha512-PVcMjj23poAK6Uemflz4MIJdEpONpjqF7JASNqqQkY6wfDdaIiZSNk8EBCWKb0t7nKqhMvtTq11DMzYJ0JFITg==
+ dependencies:
+ "@babel/core" "^7.20.0"
+ "@react-native/babel-preset" "0.74.81"
+ hermes-parser "0.19.1"
+ nullthrows "^1.1.1"
+
+"@react-native/normalize-colors@0.74.1":
+ version "0.74.1"
+ resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.1.tgz#6e8ccf99954728dcd3cfe0d56e758ee5050a7bea"
+ integrity sha512-r+bTRs6pImqE3fx4h7bPzH2sOWSrnSHF/RJ7d00pNUj2P6ws3DdhS7WV+/7YosZkloYQfkiIkK3pIHvcYn665w==
+
+"@react-native/normalize-colors@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.83.tgz#86ef925bacf219d74df115bcfb615f62d8142e85"
+ integrity sha512-jhCY95gRDE44qYawWVvhTjTplW1g+JtKTKM3f8xYT1dJtJ8QWv+gqEtKcfmOHfDkSDaMKG0AGBaDTSK8GXLH8Q==
+
+"@react-native/virtualized-lists@0.74.0":
+ version "0.74.0"
+ resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.0.tgz#327123a27a9a9288e6935fbe27baafc4f62f85a6"
+ integrity sha512-erDS1vxGlnenoJ9wJ2wm5QZKPtdeJc/a+XPSOsYqxsu2OPbAq/6YYLHZg9uIWa1sOIrkoDPygH10R7hEAzFVtA==
+ dependencies:
+ invariant "^2.2.4"
+ nullthrows "^1.1.1"
+
+"@react-native/virtualized-lists@0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.83.tgz#5595d6aefd9679d1295c56a1d1653b1fb261bd62"
+ integrity sha512-rmaLeE34rj7py4FxTod7iMTC7BAsm+HrGA8WxYmEJeyTV7WSaxAkosKoYBz8038mOiwnG9VwA/7FrB6bEQvn1A==
+ dependencies:
+ invariant "^2.2.4"
+ nullthrows "^1.1.1"
+
+"@rnx-kit/chromium-edge-launcher@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz#c0df8ea00a902c7a417cd9655aab06de398b939c"
+ integrity sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==
+ dependencies:
+ "@types/node" "^18.0.0"
+ escape-string-regexp "^4.0.0"
+ is-wsl "^2.2.0"
+ lighthouse-logger "^1.0.0"
+ mkdirp "^1.0.4"
+ rimraf "^3.0.2"
+
"@rnx-kit/rn-changelog-generator@^0.4.0":
version "0.4.0"
resolved "https://registry.yarnpkg.com/@rnx-kit/rn-changelog-generator/-/rn-changelog-generator-0.4.0.tgz#637d87bcf8de6e87599930ed88d9375010277660"
@@ -3128,6 +3825,13 @@
dependencies:
"@types/yargs-parser" "*"
+"@types/yargs@^16.0.0":
+ version "16.0.9"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e"
+ integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==
+ dependencies:
+ "@types/yargs-parser" "*"
+
"@types/yargs@^17.0.8":
version "17.0.12"
resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.12.tgz#0745ff3e4872b4ace98616d4b7e37ccbd75f9526"
@@ -5572,7 +6276,7 @@ flow-enums-runtime@^0.0.6:
resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz#5bb0cd1b0a3e471330f4d109039b7eba5cb3e787"
integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==
-flow-parser@0.*:
+flow-parser@0.*, flow-parser@^0.206.0:
version "0.206.0"
resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef"
integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==
@@ -5960,6 +6664,11 @@ hermes-eslint@0.21.1:
hermes-estree "0.21.1"
hermes-parser "0.21.1"
+hermes-estree@0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.15.0.tgz#e32f6210ab18c7b705bdcb375f7700f2db15d6ba"
+ integrity sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==
+
hermes-estree@0.17.0:
version "0.17.0"
resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.17.0.tgz#4b1b0d8131826178f0af79a317ceaca3723e9012"
@@ -5970,11 +6679,23 @@ hermes-estree@0.18.2:
resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.18.2.tgz#fd450fa1659cf074ceaa2ddeeb21674f3b2342f3"
integrity sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==
+hermes-estree@0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.19.1.tgz#d5924f5fac2bf0532547ae9f506d6db8f3c96392"
+ integrity sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==
+
hermes-estree@0.21.1:
version "0.21.1"
resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.21.1.tgz#c0435abd6dd5f02be00e93f75965df1449fccfb6"
integrity sha512-ayfESdfG0wZM32uGw0CMfcW6pW6RM8htLXZI56A4rr7hIOjmKw+wd3+71wUc1uQfn90ZyY1NMCbQeMnunrIidg==
+hermes-parser@0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.15.0.tgz#f611a297c2a2dbbfbce8af8543242254f604c382"
+ integrity sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==
+ dependencies:
+ hermes-estree "0.15.0"
+
hermes-parser@0.17.0:
version "0.17.0"
resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.17.0.tgz#722bb8079b9081a0de4902b770d5d45dbeb380bd"
@@ -5989,6 +6710,13 @@ hermes-parser@0.18.2:
dependencies:
hermes-estree "0.18.2"
+hermes-parser@0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.19.1.tgz#1044348097165b7c93dc198a80b04ed5130d6b1a"
+ integrity sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==
+ dependencies:
+ hermes-estree "0.19.1"
+
hermes-parser@0.21.1:
version "0.21.1"
resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.21.1.tgz#b2ab42b6ee1bed8c659ed61a03d3f61a63183ada"
@@ -5996,6 +6724,13 @@ hermes-parser@0.21.1:
dependencies:
hermes-estree "0.21.1"
+hermes-profile-transformer@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b"
+ integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==
+ dependencies:
+ source-map "^0.7.3"
+
hermes-transform@0.21.1:
version "0.21.1"
resolved "https://registry.yarnpkg.com/hermes-transform/-/hermes-transform-0.21.1.tgz#2debc4118e5bd7c8cbcc52a77341cfadbf37c18a"
@@ -6232,6 +6967,11 @@ invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
+ip@^1.1.5:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396"
+ integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==
+
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -6874,6 +7614,18 @@ jest-snapshot@^29.6.3:
pretty-format "^29.6.3"
semver "^7.5.3"
+jest-util@^27.2.0:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9"
+ integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
jest-util@^29.5.0:
version "29.5.0"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f"
@@ -6936,6 +7688,15 @@ jest-watcher@^29.6.3:
jest-util "^29.6.3"
string-length "^4.0.1"
+jest-worker@^27.2.0:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
jest-worker@^29.6.3:
version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.3.tgz#7b1a47bbb6559f3c0882d16595938590e63915d5"
@@ -7559,6 +8320,15 @@ metro-babel-register@^0.80.0:
babel-plugin-transform-flow-enums "^0.0.2"
escape-string-regexp "^1.0.5"
+metro-babel-transformer@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.79.1.tgz#bb2392227d3db49ffc39b98d8aebe5f7cef46302"
+ integrity sha512-WvE/At9r0LoNoxGgGhULV4H5ieuLs8AHfVUtTpHaOpgE326BwHNiUYaWuCpaM/BTTlajQltK/U1t+MqbbvFG9A==
+ dependencies:
+ "@babel/core" "^7.20.0"
+ hermes-parser "0.15.0"
+ nullthrows "^1.1.1"
+
metro-babel-transformer@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.3.tgz#f1431682a02473c004912ed6e44777b0c88e3d86"
@@ -7568,11 +8338,24 @@ metro-babel-transformer@0.80.3:
hermes-parser "0.18.2"
nullthrows "^1.1.1"
+metro-cache-key@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.79.1.tgz#80e6f2cd45a3ae04abb6874c75684e91f8c3668e"
+ integrity sha512-/u48AuINgakqYEymRrD6MzKCSYU/JEXrqGX4x6gVHVa99TKPeg5SBi3MIjpZz/tWGpcQHCKItfjLD48YhEJr3Q==
+
metro-cache-key@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.3.tgz#94a5ab0ccf4ebf5158ebe0c9c757526e02fa4e9b"
integrity sha512-WNrtDpbhtW2Yqjp1t0WxJhKNR/Zbo1LZ4WvHsdv/PraAs2mr+SaM5bbiptBSKOOGJkV/FIQveW5riZi53JnCbw==
+metro-cache@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.79.1.tgz#197286fb0d3ee6827d91893b50237070c063c157"
+ integrity sha512-uRlo1cYewW9t6KuRED0G/iCnlqPc5Hq+I2VELBiJr4lBYwCz8P1KwcdzgSUpAzcZBcarq6rI9JqVPvV4t6P3YQ==
+ dependencies:
+ metro-core "0.79.1"
+ rimraf "^3.0.2"
+
metro-cache@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.3.tgz#89e6358d9f8940acdc7d4b5a1eb00ed8c45bca17"
@@ -7581,6 +8364,19 @@ metro-cache@0.80.3:
metro-core "0.80.3"
rimraf "^3.0.2"
+metro-config@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.79.1.tgz#34609c582202bc7a2b6712c77352758ffe6a6eed"
+ integrity sha512-gleXbytiPTsO88DDUuaprKQLfaOVfoj6L7yw1u6MRXmQdebK3TmWUajqnLdWDQ/D0+JBWfrkFhLjnWXHsA8Cgw==
+ dependencies:
+ connect "^3.6.5"
+ cosmiconfig "^5.0.5"
+ jest-validate "^29.6.3"
+ metro "0.79.1"
+ metro-cache "0.79.1"
+ metro-core "0.79.1"
+ metro-runtime "0.79.1"
+
metro-config@0.80.3, metro-config@^0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.3.tgz#30fbbbd443690c333668243c4f264dfe7537a380"
@@ -7594,6 +8390,14 @@ metro-config@0.80.3, metro-config@^0.80.3:
metro-core "0.80.3"
metro-runtime "0.80.3"
+metro-core@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.79.1.tgz#1beed31d6358291d95e42ddb048ed41674f7dea9"
+ integrity sha512-tPlpLLOKT5D5HSFQBrvgU2gupecCA0YcnQQVOByuLjY5JMXUBU7HISHv5gpbJTUt9KlPQ8OhZV/x6ivyXaVSQg==
+ dependencies:
+ lodash.throttle "^4.1.1"
+ metro-resolver "0.79.1"
+
metro-core@0.80.3, metro-core@^0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.3.tgz#066407be0cee413f5d1a52ebb64d123eaa0fb388"
@@ -7602,6 +8406,25 @@ metro-core@0.80.3, metro-core@^0.80.3:
lodash.throttle "^4.1.1"
metro-resolver "0.80.3"
+metro-file-map@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.79.1.tgz#c8aa95d1eac0e3fd7a2e54e4d55c6b9a300cfd95"
+ integrity sha512-PpPhfkj1Bj448f+5vZaaImJWFSsf6XveYGdRsfwvskcYlMsFBl4OX1WyGTJCCCzrtIOH5y1V3OADI/HS563sCA==
+ dependencies:
+ anymatch "^3.0.3"
+ debug "^2.2.0"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.4"
+ invariant "^2.2.4"
+ jest-util "^27.2.0"
+ jest-worker "^27.2.0"
+ micromatch "^4.0.4"
+ node-abort-controller "^3.1.1"
+ nullthrows "^1.1.1"
+ walker "^1.0.7"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
metro-file-map@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.3.tgz#d690b8f5ddacc268084ad12878636b2653e87711"
@@ -7625,6 +8448,13 @@ metro-memory-fs@^0.80.0:
resolved "https://registry.yarnpkg.com/metro-memory-fs/-/metro-memory-fs-0.80.0.tgz#e709aca65eabdf242e9dcb2cf79bd70274c4cd80"
integrity sha512-Va+pYE4VvgFP81694IpbY8lteWuqizfPdcpS9wHRdnHgKlOpxgiHUi6DiEyayvrvzQVkqNCaazZTE0FKeaRaFg==
+metro-minify-terser@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.79.1.tgz#006479abd5eea43525937a3d211af2f4b0c3133f"
+ integrity sha512-69zOvPazJFKE6tHlOF8PQcvXUfoXgeHreVaggjuqnCREMWBjEkTH9jOn8M3oB0JgKmEUBb4bzFr7Oz1kC7Jc3g==
+ dependencies:
+ terser "^5.15.0"
+
metro-minify-terser@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.3.tgz#a9fd39b512cd85a43a7c125af7f6d7f3d6fdd8cd"
@@ -7632,11 +8462,24 @@ metro-minify-terser@0.80.3:
dependencies:
terser "^5.15.0"
-metro-resolver@0.80.3, metro-resolver@^0.80.3:
+metro-resolver@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.79.1.tgz#80e6e27305eb446188009f54374b642f28f49b65"
+ integrity sha512-hiea5co7c5rhrdD5xYohBq2Sw20Ytzie71raIW9SsXKBKzsS0zAbrwNFW5z71lDUnp719vhobnDXJ+yE7Kq9Gg==
+
+metro-resolver@0.80.3, metro-resolver@^0.80.0, metro-resolver@^0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.3.tgz#f9676508583d81182c7afaabc908254dc928a345"
integrity sha512-zwa0i32rj/TI3NivcvMXHJwTG2gUgo2dXdcnAJlhEKKQvyN+7AfhNdQSlDdDqMQmU7FaLRdeWORnQJbYCrprQQ==
+metro-runtime@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.79.1.tgz#5598062de56a265b88cdfa735834809552829cf3"
+ integrity sha512-RRBFPjaex8/Q6M+4V0oOYrd4mDG0iNkRMSdT5iojUe9pF24pRmqwG2gm3NBBgh4UAzYPI0NsJ6AB8JTmchfCAg==
+ dependencies:
+ "@babel/runtime" "^7.0.0"
+ react-refresh "^0.4.0"
+
metro-runtime@0.80.3, metro-runtime@^0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.3.tgz#8bf371f2bcd5ae332855fa40089c3b6f2a4f0aa1"
@@ -7644,6 +8487,20 @@ metro-runtime@0.80.3, metro-runtime@^0.80.3:
dependencies:
"@babel/runtime" "^7.0.0"
+metro-source-map@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.79.1.tgz#6698910de296957207190f6376ef0d54f3b9b4cd"
+ integrity sha512-Rlgld4cfWUFs5NdAErSzWfX9C4eYLPXTBBmhTHaiQEgRb0ydrfhOcofT0gYTHzp6t9lW30IO5wxlzl6gU/nOjA==
+ dependencies:
+ "@babel/traverse" "^7.20.0"
+ "@babel/types" "^7.20.0"
+ invariant "^2.2.4"
+ metro-symbolicate "0.79.1"
+ nullthrows "^1.1.1"
+ ob1 "0.79.1"
+ source-map "^0.5.6"
+ vlq "^1.0.0"
+
metro-source-map@0.80.3, metro-source-map@^0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.3.tgz#25d88b05cb3383e9802d7543e29a57deacca07d7"
@@ -7658,6 +8515,18 @@ metro-source-map@0.80.3, metro-source-map@^0.80.3:
source-map "^0.5.6"
vlq "^1.0.0"
+metro-symbolicate@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.79.1.tgz#29b8f59ac32e2381ec6e44023931b1118b04e4b4"
+ integrity sha512-cB7Yxh5SKs24EsTaONpaEPoFC6H1ya0BeAR1Ety1qeeV/gFmC8YvkwFj9S8sy6whwIf4dM9xLF2iv7Ug78C4JA==
+ dependencies:
+ invariant "^2.2.4"
+ metro-source-map "0.79.1"
+ nullthrows "^1.1.1"
+ source-map "^0.5.6"
+ through2 "^2.0.1"
+ vlq "^1.0.0"
+
metro-symbolicate@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.3.tgz#7c7dacad94db3ef6a8576eff7efd32510d24a022"
@@ -7670,6 +8539,17 @@ metro-symbolicate@0.80.3:
through2 "^2.0.1"
vlq "^1.0.0"
+metro-transform-plugins@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.79.1.tgz#103c6b5562954b6dab6b9c0b73b13742d17fcb87"
+ integrity sha512-kGDpBJGpijC/OVrpngCiyvzrT6sfSPqFOiyEzU02j+8UCmxKCofbdv62nT97dzseR+iWkzFPcCbq8Nc7/CFwwA==
+ dependencies:
+ "@babel/core" "^7.20.0"
+ "@babel/generator" "^7.20.0"
+ "@babel/template" "^7.0.0"
+ "@babel/traverse" "^7.20.0"
+ nullthrows "^1.1.1"
+
metro-transform-plugins@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.3.tgz#2e082db3ee96175351fd6eaa2ee686c948f349da"
@@ -7681,6 +8561,23 @@ metro-transform-plugins@0.80.3:
"@babel/traverse" "^7.20.0"
nullthrows "^1.1.1"
+metro-transform-worker@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.79.1.tgz#1e48f68b532fbae15d6d82270519b9fc6e311598"
+ integrity sha512-WA15xo7EvJgutlhRKldgPTtwOWur4xDO5uQc5e/vZuhGtahcV0b4v2lXp+t3z5gs9DBqajsczce1A+3pY9wcQQ==
+ dependencies:
+ "@babel/core" "^7.20.0"
+ "@babel/generator" "^7.20.0"
+ "@babel/parser" "^7.20.0"
+ "@babel/types" "^7.20.0"
+ metro "0.79.1"
+ metro-babel-transformer "0.79.1"
+ metro-cache "0.79.1"
+ metro-cache-key "0.79.1"
+ metro-source-map "0.79.1"
+ metro-transform-plugins "0.79.1"
+ nullthrows "^1.1.1"
+
metro-transform-worker@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.3.tgz#33325ca9da22d2f9dcf6e63c6da608b2fb2ca4cc"
@@ -7698,6 +8595,56 @@ metro-transform-worker@0.80.3:
metro-transform-plugins "0.80.3"
nullthrows "^1.1.1"
+metro@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/metro/-/metro-0.79.1.tgz#e6e2db1d2aca30d88e419d97835572660aba2064"
+ integrity sha512-PDzLQn4fpV4cs6brPi3zSu3zOA3kG+x6algazYGz1FzrOIsIT+L0Hd294+V4xN73EjLrSD5vD5hNsWlBxRk/PA==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/core" "^7.20.0"
+ "@babel/generator" "^7.20.0"
+ "@babel/parser" "^7.20.0"
+ "@babel/template" "^7.0.0"
+ "@babel/traverse" "^7.20.0"
+ "@babel/types" "^7.20.0"
+ accepts "^1.3.7"
+ chalk "^4.0.0"
+ ci-info "^2.0.0"
+ connect "^3.6.5"
+ debug "^2.2.0"
+ denodeify "^1.2.1"
+ error-stack-parser "^2.0.6"
+ graceful-fs "^4.2.4"
+ hermes-parser "0.15.0"
+ image-size "^1.0.2"
+ invariant "^2.2.4"
+ jest-worker "^27.2.0"
+ jsc-safe-url "^0.2.2"
+ lodash.throttle "^4.1.1"
+ metro-babel-transformer "0.79.1"
+ metro-cache "0.79.1"
+ metro-cache-key "0.79.1"
+ metro-config "0.79.1"
+ metro-core "0.79.1"
+ metro-file-map "0.79.1"
+ metro-minify-terser "0.79.1"
+ metro-resolver "0.79.1"
+ metro-runtime "0.79.1"
+ metro-source-map "0.79.1"
+ metro-symbolicate "0.79.1"
+ metro-transform-plugins "0.79.1"
+ metro-transform-worker "0.79.1"
+ mime-types "^2.1.27"
+ node-fetch "^2.2.0"
+ nullthrows "^1.1.1"
+ rimraf "^3.0.2"
+ serialize-error "^2.1.0"
+ source-map "^0.5.6"
+ strip-ansi "^6.0.0"
+ throat "^5.0.0"
+ ws "^7.5.1"
+ yargs "^17.6.2"
+
metro@0.80.3, metro@^0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.3.tgz#9f45fdeecb5f9cb017a44466a8a1fb6db6dc771c"
@@ -8018,6 +8965,11 @@ oauth-sign@~0.9.0:
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+ob1@0.79.1:
+ version "0.79.1"
+ resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.79.1.tgz#11d43712ff2c089d576b13b05b0caeed28389c6b"
+ integrity sha512-Z05NdP9uwS6UWoqNQDqx/VuVBD7rhMBqCB52js9HRct5IsU/lcSC/9Rv4J977wcOrSmaYTXQa2HRkUg4QAIS3g==
+
ob1@0.80.3:
version "0.80.3"
resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.3.tgz#dd867fdf1ffe7863a3b32dc36dc220335a6e55f9"
@@ -8634,7 +9586,7 @@ range-parser@~1.2.1:
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-react-devtools-core@5.1.0:
+react-devtools-core@5.1.0, react-devtools-core@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.1.0.tgz#3396494ac94b21602cac4fd657d600e0b52f4a0b"
integrity sha512-NRtLBqYVLrIY+lOa2oTpFiAhI7Hru0AUXI0tP9neCyaPPAzlZyeH0i+VZ0shIyRTJbpvyqbD/uCsewA2hpfZHw==
@@ -8662,11 +9614,102 @@ react-is@^18.3.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+react-native@*:
+ version "0.74.1"
+ resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.74.1.tgz#8f5f59636242eb1b90ff675d9fcc7f5b8b1c9913"
+ integrity sha512-0H2XpmghwOtfPpM2LKqHIN7gxy+7G/r1hwJHKLV6uoyXGC/gCojRtoo5NqyKrWpFC8cqyT6wTYCLuG7CxEKilg==
+ dependencies:
+ "@jest/create-cache-key-function" "^29.6.3"
+ "@react-native-community/cli" "13.6.6"
+ "@react-native-community/cli-platform-android" "13.6.6"
+ "@react-native-community/cli-platform-ios" "13.6.6"
+ "@react-native/assets-registry" "0.74.83"
+ "@react-native/codegen" "0.74.83"
+ "@react-native/community-cli-plugin" "0.74.83"
+ "@react-native/gradle-plugin" "0.74.83"
+ "@react-native/js-polyfills" "0.74.83"
+ "@react-native/normalize-colors" "0.74.83"
+ "@react-native/virtualized-lists" "0.74.83"
+ abort-controller "^3.0.0"
+ anser "^1.4.9"
+ ansi-regex "^5.0.0"
+ base64-js "^1.5.1"
+ chalk "^4.0.0"
+ event-target-shim "^5.0.1"
+ flow-enums-runtime "^0.0.6"
+ invariant "^2.2.4"
+ jest-environment-node "^29.6.3"
+ jsc-android "^250231.0.0"
+ memoize-one "^5.0.0"
+ metro-runtime "^0.80.3"
+ metro-source-map "^0.80.3"
+ mkdirp "^0.5.1"
+ nullthrows "^1.1.1"
+ pretty-format "^26.5.2"
+ promise "^8.3.0"
+ react-devtools-core "^5.0.0"
+ react-refresh "^0.14.0"
+ react-shallow-renderer "^16.15.0"
+ regenerator-runtime "^0.13.2"
+ scheduler "0.24.0-canary-efb381bbf-20230505"
+ stacktrace-parser "^0.1.10"
+ whatwg-fetch "^3.0.0"
+ ws "^6.2.2"
+ yargs "^17.6.2"
+
+react-native@1000.0.0:
+ version "1000.0.0"
+ resolved "https://registry.yarnpkg.com/react-native/-/react-native-1000.0.0.tgz#fa82e1fc25af0bafd0c9bba26ece4d072d40b0de"
+ integrity sha512-EU4dtWSyykjp56/UD5OqhH+iaiqKlIo3VVP5WzNWhVUc+n8nd9bDFjetsH4AHTJtYVbK/YkMdGEjOsehdOEPzg==
+ dependencies:
+ "@jest/create-cache-key-function" "^29.6.3"
+ "@react-native-community/cli" "13.5.1"
+ "@react-native-community/cli-platform-android" "13.5.1"
+ "@react-native-community/cli-platform-ios" "13.5.1"
+ "@react-native/assets-registry" "0.74.0"
+ "@react-native/codegen" "0.74.0"
+ "@react-native/community-cli-plugin" "0.74.0"
+ "@react-native/gradle-plugin" "0.74.0"
+ "@react-native/js-polyfills" "0.74.0"
+ "@react-native/normalize-colors" "0.74.1"
+ "@react-native/virtualized-lists" "0.74.0"
+ abort-controller "^3.0.0"
+ anser "^1.4.9"
+ ansi-regex "^5.0.0"
+ base64-js "^1.5.1"
+ chalk "^4.0.0"
+ event-target-shim "^5.0.1"
+ flow-enums-runtime "^0.0.6"
+ invariant "^2.2.4"
+ jest-environment-node "^29.6.3"
+ jsc-android "^250231.0.0"
+ memoize-one "^5.0.0"
+ metro-runtime "^0.80.3"
+ metro-source-map "^0.80.3"
+ mkdirp "^0.5.1"
+ nullthrows "^1.1.1"
+ pretty-format "^26.5.2"
+ promise "^8.3.0"
+ react-devtools-core "^5.0.0"
+ react-refresh "^0.14.0"
+ react-shallow-renderer "^16.15.0"
+ regenerator-runtime "^0.13.2"
+ scheduler "0.24.0-canary-efb381bbf-20230505"
+ stacktrace-parser "^0.1.10"
+ whatwg-fetch "^3.0.0"
+ ws "^6.2.2"
+ yargs "^17.6.2"
+
react-refresh@^0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
+react-refresh@^0.4.0:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53"
+ integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==
+
react-shallow-renderer@^16.15.0:
version "16.15.0"
resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457"
@@ -9255,6 +10298,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+source-map@^0.7.3:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
+ integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+
spdx-correct@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
@@ -9567,6 +10615,11 @@ tar@^6.1.11:
mkdirp "^1.0.3"
yallist "^4.0.0"
+temp-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
+ integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==
+
temp@^0.8.4:
version "0.8.4"
resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2"