diff --git a/examples/unified/react-native-app/.bundle/config b/examples/unified/react-native-app/.bundle/config
new file mode 100644
index 0000000000..848943bb52
--- /dev/null
+++ b/examples/unified/react-native-app/.bundle/config
@@ -0,0 +1,2 @@
+BUNDLE_PATH: "vendor/bundle"
+BUNDLE_FORCE_RUBY_PLATFORM: 1
diff --git a/examples/unified/react-native-app/.eslintrc.js b/examples/unified/react-native-app/.eslintrc.js
new file mode 100644
index 0000000000..187894b6af
--- /dev/null
+++ b/examples/unified/react-native-app/.eslintrc.js
@@ -0,0 +1,4 @@
+module.exports = {
+ root: true,
+ extends: '@react-native',
+};
diff --git a/examples/unified/react-native-app/.gitignore b/examples/unified/react-native-app/.gitignore
new file mode 100644
index 0000000000..fbaf02d4fa
--- /dev/null
+++ b/examples/unified/react-native-app/.gitignore
@@ -0,0 +1,76 @@
+# OSX
+#
+.DS_Store
+
+# Xcode
+#
+build/
+build-old-arch/
+build-new-arch/
+.harness-pods-arch
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata
+*.xccheckout
+*.moved-aside
+DerivedData
+*.hmap
+*.ipa
+*.xcuserstate
+**/.xcode.env.local
+
+# Android/IntelliJ
+#
+build/
+.idea
+.gradle
+local.properties
+*.iml
+*.hprof
+.cxx/
+*.keystore
+!debug.keystore
+
+# node.js
+#
+node_modules/
+npm-debug.log
+yarn-error.log
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
+# screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/
+
+**/fastlane/report.xml
+**/fastlane/Preview.html
+**/fastlane/screenshots
+**/fastlane/test_output
+
+# Bundle artifact
+*.jsbundle
+
+# Ruby / CocoaPods
+**/Pods/
+/vendor/bundle/
+
+# Temporary files created by Metro to check the health of the file watcher
+.metro-health-check*
+
+# testing
+/coverage
+
+# Yarn
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/sdks
+!.yarn/versions
diff --git a/examples/unified/react-native-app/.prettierrc.js b/examples/unified/react-native-app/.prettierrc.js
new file mode 100644
index 0000000000..2b540746a7
--- /dev/null
+++ b/examples/unified/react-native-app/.prettierrc.js
@@ -0,0 +1,7 @@
+module.exports = {
+ arrowParens: 'avoid',
+ bracketSameLine: true,
+ bracketSpacing: false,
+ singleQuote: true,
+ trailingComma: 'all',
+};
diff --git a/examples/unified/react-native-app/.watchmanconfig b/examples/unified/react-native-app/.watchmanconfig
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/examples/unified/react-native-app/.watchmanconfig
@@ -0,0 +1 @@
+{}
diff --git a/examples/unified/react-native-app/App.tsx b/examples/unified/react-native-app/App.tsx
new file mode 100644
index 0000000000..5c1c38afe8
--- /dev/null
+++ b/examples/unified/react-native-app/App.tsx
@@ -0,0 +1,113 @@
+import React from 'react';
+import {
+ Button,
+ SafeAreaView,
+ ScrollView,
+ StatusBar,
+ StyleSheet,
+ Text,
+ useColorScheme,
+ View,
+} from 'react-native';
+import {init, Types} from '@amplitude/unified-react-native';
+
+const getApiKey = (): string => {
+ const apiKey = process.env.VITE_AMPLITUDE_API_KEY;
+ if (!apiKey || apiKey.startsWith('<')) {
+ throw new Error(
+ 'Set VITE_AMPLITUDE_API_KEY in the repository-root .env file, then restart Metro.',
+ );
+ }
+ return apiKey;
+};
+
+const API_KEY = getApiKey();
+
+function App(): React.JSX.Element {
+ const isDarkMode = useColorScheme() === 'dark';
+ const [status, setStatus] = React.useState(
+ 'Attach Android Studio Network Inspector, then initialize all SDK blades.',
+ );
+ const [isInitializing, setIsInitializing] = React.useState(false);
+ const [isInitialized, setIsInitialized] = React.useState(false);
+
+ const initializeAll = async () => {
+ setIsInitializing(true);
+ setStatus('Initializing all SDK blades…');
+ await init(API_KEY, {
+ logLevel: Types.LogLevel.Warn,
+ analytics: {userId: 'unified-example-user'},
+ sessionReplay: {
+ enableRemoteConfig: false,
+ logLevel: Types.LogLevel.Debug,
+ sampleRate: 1,
+ },
+ });
+ setIsInitialized(true);
+ setIsInitializing(false);
+ setStatus(
+ 'Initialization completed. Check Metro or Logcat for any blade errors.',
+ );
+ };
+
+ const colors = isDarkMode
+ ? {
+ background: '#111827',
+ card: '#1f2937',
+ text: '#f9fafb',
+ muted: '#d1d5db',
+ }
+ : {
+ background: '#f3f4f6',
+ card: '#ffffff',
+ text: '#111827',
+ muted: '#4b5563',
+ };
+
+ return (
+
+
+
+ AMPLITUDE
+
+ Unified React Native SDK
+
+
+ This app directly installs one Amplitude package and uses its
+ autolinking preset for every native blade.
+
+
+
+
+
+
+
+ {status}
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ safeArea: {flex: 1},
+ page: {flexGrow: 1, justifyContent: 'center', padding: 24, gap: 16},
+ eyebrow: {fontSize: 12, fontWeight: '700', letterSpacing: 2},
+ title: {fontSize: 32, fontWeight: '700'},
+ description: {fontSize: 16, lineHeight: 24},
+ card: {borderRadius: 16, padding: 16, gap: 12},
+ status: {fontSize: 14, lineHeight: 20},
+});
+
+export default App;
diff --git a/examples/unified/react-native-app/Gemfile b/examples/unified/react-native-app/Gemfile
new file mode 100644
index 0000000000..d66e05ef36
--- /dev/null
+++ b/examples/unified/react-native-app/Gemfile
@@ -0,0 +1,10 @@
+source 'https://rubygems.org'
+
+# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
+ruby ">= 2.6.10"
+
+# Exclude the ActiveSupport version known to break CocoaPods startup.
+gem 'cocoapods', '>= 1.16.2'
+gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
+# Ruby 3.4+ removed default gems CocoaPods still needs (kconv lives in nkf).
+gem 'nkf'
diff --git a/examples/unified/react-native-app/Gemfile.lock b/examples/unified/react-native-app/Gemfile.lock
new file mode 100644
index 0000000000..67fb7fc6ce
--- /dev/null
+++ b/examples/unified/react-native-app/Gemfile.lock
@@ -0,0 +1,167 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.8)
+ activesupport (7.2.3)
+ base64
+ benchmark (>= 0.3)
+ bigdecimal
+ concurrent-ruby (~> 1.0, >= 1.3.1)
+ connection_pool (>= 2.2.5)
+ drb
+ i18n (>= 1.6, < 2)
+ logger (>= 1.4.2)
+ minitest (>= 5.1)
+ securerandom (>= 0.3)
+ tzinfo (~> 2.0, >= 2.0.5)
+ addressable (2.9.0)
+ public_suffix (>= 2.0.2, < 8.0)
+ algoliasearch (1.27.5)
+ httpclient (~> 2.8, >= 2.8.3)
+ json (>= 1.5.1)
+ atomos (0.1.3)
+ base64 (0.3.0)
+ benchmark (0.5.0)
+ bigdecimal (4.1.2)
+ claide (1.1.0)
+ cocoapods (1.17.0)
+ addressable (~> 2.8)
+ claide (>= 1.0.2, < 2.0)
+ cocoapods-core (= 1.17.0)
+ cocoapods-deintegrate (>= 1.0.3, < 2.0)
+ cocoapods-downloader (>= 2.1, < 3.0)
+ cocoapods-plugins (>= 1.0.0, < 2.0)
+ cocoapods-search (>= 1.0.0, < 2.0)
+ cocoapods-trunk (>= 1.6.0, < 2.0)
+ cocoapods-try (>= 1.1.0, < 2.0)
+ colored2 (~> 3.1)
+ fourflusher (>= 2.3.0, < 3.0)
+ gh_inspector (~> 1.0)
+ molinillo (~> 0.8.0)
+ nap (~> 1.0)
+ ruby-macho (~> 4.1.0)
+ xcodeproj (>= 1.28.1, < 2.0)
+ cocoapods-core (1.17.0)
+ activesupport (>= 5.0, < 8)
+ addressable (~> 2.8)
+ algoliasearch (~> 1.0)
+ concurrent-ruby (~> 1.1)
+ fuzzy_match (~> 2.0.4)
+ nap (~> 1.0)
+ netrc (~> 0.11)
+ public_suffix (~> 4.0)
+ typhoeus (~> 1.0)
+ cocoapods-deintegrate (1.0.5)
+ cocoapods-downloader (2.1)
+ cocoapods-plugins (1.0.0)
+ nap
+ cocoapods-search (1.0.1)
+ cocoapods-trunk (1.6.0)
+ nap (>= 0.8, < 2.0)
+ netrc (~> 0.11)
+ cocoapods-try (1.2.0)
+ colored2 (3.1.2)
+ concurrent-ruby (1.3.8)
+ connection_pool (3.0.2)
+ drb (2.2.3)
+ ethon (0.18.0)
+ ffi (>= 1.15.0)
+ logger
+ ffi (1.17.4)
+ fourflusher (2.3.1)
+ fuzzy_match (2.0.4)
+ gh_inspector (1.1.3)
+ httpclient (2.9.0)
+ mutex_m
+ i18n (1.15.2)
+ concurrent-ruby (~> 1.0)
+ json (2.21.2)
+ logger (1.7.0)
+ minitest (6.0.6)
+ drb (~> 2.0)
+ prism (~> 1.5)
+ molinillo (0.8.0)
+ mutex_m (0.3.0)
+ nanaimo (0.4.0)
+ nap (1.1.0)
+ netrc (0.11.0)
+ nkf (0.3.0)
+ prism (1.9.0)
+ public_suffix (4.0.7)
+ rexml (3.4.4)
+ ruby-macho (4.1.0)
+ securerandom (0.4.1)
+ typhoeus (1.6.0)
+ ethon (>= 0.18.0)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ xcodeproj (1.28.1)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ base64
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.4.0)
+ nkf
+ rexml (>= 3.3.6, < 4.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ activesupport (>= 6.1.7.5, != 7.1.0)
+ cocoapods (>= 1.16.2)
+ nkf
+
+CHECKSUMS
+ CFPropertyList (3.0.8) sha256=2c99d0d980536d3d7ab252f7bd59ac8be50fbdd1ff487c98c949bb66bb114261
+ activesupport (7.2.3) sha256=5675c9770dac93e371412684249f9dc3c8cec104efd0624362a520ae685c7b10
+ addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
+ algoliasearch (1.27.5) sha256=26c1cddf3c2ec4bd60c148389e42702c98fdac862881dc6b07a4c0b89ffec853
+ atomos (0.1.3) sha256=7d43b22f2454a36bace5532d30785b06de3711399cb1c6bf932573eda536789f
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
+ benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
+ bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ claide (1.1.0) sha256=6d3c5c089dde904d96aa30e73306d0d4bd444b1accb9b3125ce14a3c0183f82e
+ cocoapods (1.17.0) sha256=dacf6f11ac3b00d60e6dd326485b616935230aacf95f385d145db27bfdf284af
+ cocoapods-core (1.17.0) sha256=a9e3d0dd36ab1b48935236d77a15cad9171217f13c6010c8e2ae3c0f455daf5b
+ cocoapods-deintegrate (1.0.5) sha256=517c2a448ef563afe99b6e7668704c27f5de9e02715a88ee9de6974dc1b3f6a2
+ cocoapods-downloader (2.1) sha256=bb6ebe1b3966dc4055de54f7a28b773485ac724fdf575d9bee2212d235e7b6d1
+ cocoapods-plugins (1.0.0) sha256=725d17ce90b52f862e73476623fd91441b4430b742d8a071000831efb440ca9a
+ cocoapods-search (1.0.1) sha256=1b133b0e6719ed439bd840e84a1828cca46425ab73a11eff5e096c3b2df05589
+ cocoapods-trunk (1.6.0) sha256=5f5bda8c172afead48fa2d43a718cf534b1313c367ba1194cebdeb9bfee9ed31
+ cocoapods-try (1.2.0) sha256=145b946c6e7747ed0301d975165157951153d27469e6b2763c83e25c84b9defe
+ colored2 (3.1.2) sha256=b13c2bd7eeae2cf7356a62501d398e72fde78780bd26aec6a979578293c28b4a
+ concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1
+ connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
+ ethon (0.18.0) sha256=b598afc9f30448cb068b850714b7d6948e941476095d04f90a4ac65b8d6efcb2
+ ffi (1.17.4) sha256=bcd1642e06f0d16fc9e09ac6d49c3a7298b9789bcb58127302f934e437d60acf
+ fourflusher (2.3.1) sha256=1b3de61c7c791b6a4e64f31e3719eb25203d151746bb519a0292bff1065ccaa9
+ fuzzy_match (2.0.4) sha256=b5de4f95816589c5b5c3ad13770c0af539b75131c158135b3f3bbba75d0cfca5
+ gh_inspector (1.1.3) sha256=04cca7171b87164e053aa43147971d3b7f500fcb58177698886b48a9fc4a1939
+ httpclient (2.9.0) sha256=4b645958e494b2f86c2f8a2f304c959baa273a310e77a2931ddb986d83e498c8
+ i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5
+ json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
+ molinillo (0.8.0) sha256=efbff2716324e2a30bccd3eba1ff3a735f4d5d53ffddbc6a2f32c0ca9433045d
+ mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
+ nanaimo (0.4.0) sha256=faf069551bab17f15169c1f74a1c73c220657e71b6e900919897a10d991d0723
+ nap (1.1.0) sha256=949691660f9d041d75be611bb2a8d2fd559c467537deac241f4097d9b5eea576
+ netrc (0.11.0) sha256=de1ce33da8c99ab1d97871726cba75151113f117146becbe45aa85cb3dabee3f
+ nkf (0.3.0) sha256=357a8dbeba38b727b75930f665146546076a394a1c243faf634ff176e3588895
+ prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ public_suffix (4.0.7) sha256=8be161e2421f8d45b0098c042c06486789731ea93dc3a896d30554ee38b573b8
+ rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
+ ruby-macho (4.1.0) sha256=23dab37f7de0fe1e14f3bfa73bebc423ae8cd1d4fdb3e5585abc45a841eca920
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
+ typhoeus (1.6.0) sha256=bacc41c23e379547e29801dc235cd1699b70b955a1ba3d32b2b877aa844c331d
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
+ xcodeproj (1.28.1) sha256=6f12670f00739d9817ca27ac89d6ef01cc86050e22a0bc08a3131487e5b5cddc
+
+RUBY VERSION
+ ruby 3.2.11
+
+BUNDLED WITH
+ 4.0.9
diff --git a/examples/unified/react-native-app/README.md b/examples/unified/react-native-app/README.md
new file mode 100644
index 0000000000..ea596d893b
--- /dev/null
+++ b/examples/unified/react-native-app/README.md
@@ -0,0 +1,107 @@
+# Unified React Native SDK example
+
+This bare React Native application demonstrates the customer-facing, one-package installation flow for `@amplitude/unified-react-native`. Its only direct Amplitude dependency is the unified SDK. Analytics, Experiment, Session Replay, Guides and Surveys, and AsyncStorage are installed transitively and do not appear as application dependencies.
+
+The application-level [`react-native.config.js`](./react-native.config.js) loads the unified SDK's autolinking preset so React Native CLI can discover those transitive native modules.
+
+## Add the unified SDK to an application
+
+From an existing bare React Native application, install one package:
+
+```sh
+npm install @amplitude/unified-react-native
+```
+
+This command adds only `@amplitude/unified-react-native` to the application's `package.json`. Do not install the Analytics, Experiment, Session Replay, Guides and Surveys, or AsyncStorage packages separately.
+
+Next, create `react-native.config.js` in the application root:
+
+```javascript
+module.exports = require('@amplitude/unified-react-native/react-native.config');
+```
+
+If the application already has a React Native configuration, merge the preset with it:
+
+```javascript
+const amplitude = require('@amplitude/unified-react-native/react-native.config');
+
+module.exports = {
+ // Existing React Native configuration
+ dependencies: {
+ ...amplitude.dependencies,
+ // Existing dependency overrides
+ },
+};
+```
+
+For iOS, run the application's normal pod installation step after installing the package:
+
+```sh
+npx pod-install
+```
+
+Then rebuild the native application. No additional JavaScript packages need to be installed. The unified SDK requires React Native 0.76 or newer.
+
+Guides and Surveys uses React Native's typed native event emitters, so enable the React Native New Architecture before rebuilding. For Android, set `newArchEnabled=true` in `android/gradle.properties`; use your React Native version's corresponding New Architecture setup for iOS. This example already enables it for Android.
+
+## How the autolinking preset works
+
+React Native CLI normally discovers native modules by inspecting the dependencies declared directly in the application's `package.json`. The blade SDKs are dependencies of the unified SDK instead, so the CLI would not discover every blade from the application's dependency list alone.
+
+The preset exported by `@amplitude/unified-react-native/react-native.config` resolves each transitive native package and returns it under React Native CLI's `dependencies` configuration. Loading that preset from the application-level `react-native.config.js` makes the packages visible to the existing native tooling:
+
+- CocoaPods links the five iOS modules during `pod install`.
+- The React Native Gradle plugin adds the five Android packages to its generated package list.
+- React Native Codegen sees the Engagement and AsyncStorage specifications.
+
+The preset only supplies package locations to React Native's standard autolinking process. It does not copy native code or initialize any SDK at runtime.
+
+This example's [`package.json`](./package.json) uses `workspace:*` for `@amplitude/unified-react-native` so it links to the package in this repository. A customer project gets a normal published version in that same single dependency entry when running `npm install`.
+
+## Run this repository example
+
+From the repository root:
+
+```sh
+pnpm install --frozen-lockfile
+pnpm --filter @amplitude/unified-react-native... build
+pnpm --filter @amplitude/unified-react-native-example check:autolinking
+```
+
+The last command prints the React Native configuration. Its `dependencies` section should include:
+
+- `@amplitude/analytics-react-native`
+- `@amplitude/experiment-react-native-client`
+- `@amplitude/plugin-engagement-react-native`
+- `@amplitude/plugin-session-replay-react-native`
+- `@react-native-async-storage/async-storage`
+
+For iOS, install pods after activating the repository's Ruby version and a UTF-8 locale:
+
+```sh
+cd examples/unified/react-native-app/ios
+bundle install
+bundle exec pod install
+```
+
+Copy the repository's [`.env.example`](../../../.env.example) to `.env` at the repository root and set `VITE_AMPLITUDE_API_KEY`:
+
+```sh
+cp .env.example .env
+```
+
+The example's [`babel.config.js`](./babel.config.js) loads the root `.env` and inlines `VITE_AMPLITUDE_API_KEY` into the JavaScript bundle. Experiment uses the same key by default, so a separate deployment key is not required when Analytics and Experiment use the same Amplitude project.
+
+Restart Metro after creating or changing `.env`. The example's `pnpm start` command resets Metro's transform cache so a previously bundled placeholder cannot be reused.
+
+Environment variables embedded in a React Native bundle are visible to anyone who can inspect the application. Use `.env` to keep local configuration out of source control, not to store a client-side secret.
+
+The app does not initialize any blade on launch. To inspect the complete initialization sequence, start the app, attach Android Studio's Network Inspector, and then press **Initialize all SDKs**. That single button calls the unified SDK's `init()` method, which initializes Analytics, starts Experiment, starts Session Replay, and boots Guides and Surveys. The example disables Session Replay remote configuration and fixes its local sample rate at `1` so the emulator is always captured; look for `track?device_id=...` requests after initialization.
+
+Then run the app from its directory:
+
+```sh
+pnpm start
+pnpm ios
+# or: pnpm android
+```
diff --git a/examples/unified/react-native-app/android/app/build.gradle b/examples/unified/react-native-app/android/app/build.gradle
new file mode 100644
index 0000000000..2c4a1d4b5e
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/build.gradle
@@ -0,0 +1,119 @@
+apply plugin: "com.android.application"
+apply plugin: "org.jetbrains.kotlin.android"
+apply plugin: "com.facebook.react"
+
+/**
+ * This is the configuration block to customize your React Native Android app.
+ * By default you don't need to apply any configuration, just uncomment the lines you need.
+ */
+react {
+ /* Folders */
+ // The root of your project, i.e. where "package.json" lives. Default is '..'
+ // root = file("../")
+ // The folder where the react-native NPM package is. Default is ../node_modules/react-native
+ // reactNativeDir = file("../node_modules/react-native")
+ // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen
+ // codegenDir = file("../node_modules/@react-native/codegen")
+ // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js
+ // cliFile = file("../node_modules/react-native/cli.js")
+
+ /* Variants */
+ // The list of variants to that are debuggable. For those we're going to
+ // skip the bundling of the JS bundle and the assets. By default is just 'debug'.
+ // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
+ // debuggableVariants = ["liteDebug", "prodDebug"]
+
+ /* Bundling */
+ // A list containing the node command and its flags. Default is just 'node'.
+ // nodeExecutableAndArgs = ["node"]
+ //
+ // The command to run when bundling. By default is 'bundle'
+ // bundleCommand = "ram-bundle"
+ //
+ // The path to the CLI configuration file. Default is empty.
+ // bundleConfig = file(../rn-cli.config.js)
+ //
+ // The name of the generated asset file containing your JS bundle
+ // bundleAssetName = "MyApplication.android.bundle"
+ //
+ // The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
+ // entryFile = file("../js/MyApplication.android.js")
+ //
+ // A list of extra flags to pass to the 'bundle' commands.
+ // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
+ // extraPackagerArgs = []
+
+ /* Hermes Commands */
+ // The hermes compiler command to run. By default it is 'hermesc'
+ // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
+ //
+ // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
+ // hermesFlags = ["-O", "-output-source-map"]
+
+ /* Autolinking */
+ autolinkLibrariesWithApp()
+}
+
+/**
+ * Set this to true to Run Proguard on Release builds to minify the Java bytecode.
+ */
+def enableProguardInReleaseBuilds = false
+
+/**
+ * The preferred build flavor of JavaScriptCore (JSC)
+ *
+ * For example, to use the international variant, you can use:
+ * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
+ *
+ * The international variant includes ICU i18n library and necessary data
+ * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
+ * give correct results when using with locales other than en-US. Note that
+ * this variant is about 6MiB larger per architecture than default.
+ */
+def jscFlavor = 'org.webkit:android-jsc:+'
+
+android {
+ ndkVersion rootProject.ext.ndkVersion
+ buildToolsVersion rootProject.ext.buildToolsVersion
+ compileSdk rootProject.ext.compileSdkVersion
+
+ namespace "com.app"
+ defaultConfig {
+ applicationId "com.app"
+ minSdkVersion rootProject.ext.minSdkVersion
+ targetSdkVersion rootProject.ext.targetSdkVersion
+ versionCode 1
+ versionName "1.0"
+ }
+ signingConfigs {
+ debug {
+ storeFile file('debug.keystore')
+ storePassword 'android'
+ keyAlias 'androiddebugkey'
+ keyPassword 'android'
+ }
+ }
+ buildTypes {
+ debug {
+ signingConfig signingConfigs.debug
+ }
+ release {
+ // Caution! In production, you need to generate your own keystore file.
+ // see https://reactnative.dev/docs/signed-apk-android.
+ signingConfig signingConfigs.debug
+ minifyEnabled enableProguardInReleaseBuilds
+ proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
+ }
+ }
+}
+
+dependencies {
+ // The version of react-native is set by the React Native Gradle Plugin
+ implementation("com.facebook.react:react-android")
+
+ if (hermesEnabled.toBoolean()) {
+ implementation("com.facebook.react:hermes-android")
+ } else {
+ implementation jscFlavor
+ }
+}
diff --git a/examples/unified/react-native-app/android/app/debug.keystore b/examples/unified/react-native-app/android/app/debug.keystore
new file mode 100644
index 0000000000..364e105ed3
Binary files /dev/null and b/examples/unified/react-native-app/android/app/debug.keystore differ
diff --git a/examples/unified/react-native-app/android/app/proguard-rules.pro b/examples/unified/react-native-app/android/app/proguard-rules.pro
new file mode 100644
index 0000000000..11b025724a
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/proguard-rules.pro
@@ -0,0 +1,10 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
diff --git a/examples/unified/react-native-app/android/app/src/debug/AndroidManifest.xml b/examples/unified/react-native-app/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000000..eb98c01afd
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/examples/unified/react-native-app/android/app/src/main/AndroidManifest.xml b/examples/unified/react-native-app/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..4122f36a59
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/unified/react-native-app/android/app/src/main/java/com/app/MainActivity.kt b/examples/unified/react-native-app/android/app/src/main/java/com/app/MainActivity.kt
new file mode 100644
index 0000000000..c3a1c57ea0
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/src/main/java/com/app/MainActivity.kt
@@ -0,0 +1,22 @@
+package com.app
+
+import com.facebook.react.ReactActivity
+import com.facebook.react.ReactActivityDelegate
+import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
+import com.facebook.react.defaults.DefaultReactActivityDelegate
+
+class MainActivity : ReactActivity() {
+
+ /**
+ * Returns the name of the main component registered from JavaScript. This is used to schedule
+ * rendering of the component.
+ */
+ override fun getMainComponentName(): String = "app"
+
+ /**
+ * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
+ * which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
+ */
+ override fun createReactActivityDelegate(): ReactActivityDelegate =
+ DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
+}
diff --git a/examples/unified/react-native-app/android/app/src/main/java/com/app/MainApplication.kt b/examples/unified/react-native-app/android/app/src/main/java/com/app/MainApplication.kt
new file mode 100644
index 0000000000..9e7449efca
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/src/main/java/com/app/MainApplication.kt
@@ -0,0 +1,44 @@
+package com.app
+
+import android.app.Application
+import com.facebook.react.PackageList
+import com.facebook.react.ReactApplication
+import com.facebook.react.ReactHost
+import com.facebook.react.ReactNativeHost
+import com.facebook.react.ReactPackage
+import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
+import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
+import com.facebook.react.defaults.DefaultReactNativeHost
+import com.facebook.react.soloader.OpenSourceMergedSoMapping
+import com.facebook.soloader.SoLoader
+
+class MainApplication : Application(), ReactApplication {
+
+ override val reactNativeHost: ReactNativeHost =
+ object : DefaultReactNativeHost(this) {
+ override fun getPackages(): List =
+ PackageList(this).packages.apply {
+ // Packages that cannot be autolinked yet can be added manually here, for example:
+ // add(MyReactNativePackage())
+ }
+
+ override fun getJSMainModuleName(): String = "index"
+
+ override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
+
+ override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
+ override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
+ }
+
+ override val reactHost: ReactHost
+ get() = getDefaultReactHost(applicationContext, reactNativeHost)
+
+ override fun onCreate() {
+ super.onCreate()
+ SoLoader.init(this, OpenSourceMergedSoMapping)
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
+ // If you opted-in for the New Architecture, we load the native entry point for this app.
+ load()
+ }
+ }
+}
diff --git a/examples/unified/react-native-app/android/app/src/main/res/drawable/rn_edit_text_material.xml b/examples/unified/react-native-app/android/app/src/main/res/drawable/rn_edit_text_material.xml
new file mode 100644
index 0000000000..5c25e728ea
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/src/main/res/drawable/rn_edit_text_material.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..a2f5908281
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..1b52399808
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ff10afd6e1
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..115a4c768a
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dcd3cd8083
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..459ca609d3
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8ca12fe024
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..8e19b410a1
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b824ebdd48
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..4c19a13c23
Binary files /dev/null and b/examples/unified/react-native-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/examples/unified/react-native-app/android/app/src/main/res/values/strings.xml b/examples/unified/react-native-app/android/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..6639125d04
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Amplitude Unified SDK
+
diff --git a/examples/unified/react-native-app/android/app/src/main/res/values/styles.xml b/examples/unified/react-native-app/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..7ba83a2ad5
--- /dev/null
+++ b/examples/unified/react-native-app/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
diff --git a/examples/unified/react-native-app/android/build.gradle b/examples/unified/react-native-app/android/build.gradle
new file mode 100644
index 0000000000..a9ea023695
--- /dev/null
+++ b/examples/unified/react-native-app/android/build.gradle
@@ -0,0 +1,21 @@
+buildscript {
+ ext {
+ buildToolsVersion = "35.0.0"
+ minSdkVersion = 24
+ compileSdkVersion = 35
+ targetSdkVersion = 34
+ ndkVersion = "26.1.10909125"
+ kotlinVersion = "1.9.24"
+ }
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath("com.android.tools.build:gradle")
+ classpath("com.facebook.react:react-native-gradle-plugin")
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
+ }
+}
+
+apply plugin: "com.facebook.react.rootproject"
diff --git a/examples/unified/react-native-app/android/gradle.properties b/examples/unified/react-native-app/android/gradle.properties
new file mode 100644
index 0000000000..fb6e725236
--- /dev/null
+++ b/examples/unified/react-native-app/android/gradle.properties
@@ -0,0 +1,41 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
+org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Disabled: jetifying hermes/react AARs OOMs in CI; all deps are already AndroidX.
+android.enableJetifier=false
+
+# Use this property to specify which architecture you want to build.
+# You can also override it from the CLI using
+# ./gradlew -PreactNativeArchitectures=x86_64
+reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
+
+# Use this property to enable support to the new architecture.
+# This will allow you to use TurboModules and the Fabric render in
+# your application. You should enable this flag either if you want
+# to write custom TurboModules/Fabric components OR use libraries that
+# are providing them.
+newArchEnabled=true
+
+# Use this property to enable or disable the Hermes JS engine.
+# If set to false, you will be using JSC instead.
+hermesEnabled=true
diff --git a/examples/unified/react-native-app/android/gradle/wrapper/gradle-wrapper.jar b/examples/unified/react-native-app/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..7f93135c49
Binary files /dev/null and b/examples/unified/react-native-app/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/examples/unified/react-native-app/android/gradle/wrapper/gradle-wrapper.properties b/examples/unified/react-native-app/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..79eb9d003f
--- /dev/null
+++ b/examples/unified/react-native-app/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/examples/unified/react-native-app/android/gradlew b/examples/unified/react-native-app/android/gradlew
new file mode 100755
index 0000000000..1aa94a4269
--- /dev/null
+++ b/examples/unified/react-native-app/android/gradlew
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/examples/unified/react-native-app/android/gradlew.bat b/examples/unified/react-native-app/android/gradlew.bat
new file mode 100644
index 0000000000..25da30dbde
--- /dev/null
+++ b/examples/unified/react-native-app/android/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/examples/unified/react-native-app/android/settings.gradle b/examples/unified/react-native-app/android/settings.gradle
new file mode 100644
index 0000000000..acd6fdaa21
--- /dev/null
+++ b/examples/unified/react-native-app/android/settings.gradle
@@ -0,0 +1,6 @@
+pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") }
+plugins { id("com.facebook.react.settings") }
+extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
+rootProject.name = 'app'
+include ':app'
+includeBuild('../node_modules/@react-native/gradle-plugin')
diff --git a/examples/unified/react-native-app/app.json b/examples/unified/react-native-app/app.json
new file mode 100644
index 0000000000..e60f7b9ce4
--- /dev/null
+++ b/examples/unified/react-native-app/app.json
@@ -0,0 +1,4 @@
+{
+ "name": "app",
+ "displayName": "Amplitude Unified SDK"
+}
diff --git a/examples/unified/react-native-app/babel.config.js b/examples/unified/react-native-app/babel.config.js
new file mode 100644
index 0000000000..c2d1189677
--- /dev/null
+++ b/examples/unified/react-native-app/babel.config.js
@@ -0,0 +1,13 @@
+const path = require('path');
+
+require('dotenv').config({path: path.resolve(__dirname, '../../../.env')});
+
+module.exports = {
+ presets: ['module:@react-native/babel-preset'],
+ plugins: [
+ [
+ 'transform-inline-environment-variables',
+ {include: ['VITE_AMPLITUDE_API_KEY']},
+ ],
+ ],
+};
diff --git a/examples/unified/react-native-app/index.js b/examples/unified/react-native-app/index.js
new file mode 100644
index 0000000000..a850d031de
--- /dev/null
+++ b/examples/unified/react-native-app/index.js
@@ -0,0 +1,9 @@
+/**
+ * @format
+ */
+
+import {AppRegistry} from 'react-native';
+import App from './App';
+import {name as appName} from './app.json';
+
+AppRegistry.registerComponent(appName, () => App);
diff --git a/examples/unified/react-native-app/ios/.xcode.env b/examples/unified/react-native-app/ios/.xcode.env
new file mode 100644
index 0000000000..3d5782c715
--- /dev/null
+++ b/examples/unified/react-native-app/ios/.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/examples/unified/react-native-app/ios/Podfile b/examples/unified/react-native-app/ios/Podfile
new file mode 100644
index 0000000000..86cdcf23a9
--- /dev/null
+++ b/examples/unified/react-native-app/ios/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(
+ "react-native/scripts/react_native_pods.rb",
+ {paths: [process.argv[1]]},
+ )', __dir__]).strip
+
+platform :ios, min_ios_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 'app' do
+ config = use_native_modules!
+
+ use_react_native!(
+ :path => config[:reactNativePath],
+ # An absolute path to your application root.
+ :app_path => "#{Pod::Config.instance.installation_root}/.."
+ )
+
+ target 'appTests' 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,
+ # :ccache_enabled => true
+ )
+ end
+end
diff --git a/examples/unified/react-native-app/ios/Podfile.lock b/examples/unified/react-native-app/ios/Podfile.lock
new file mode 100644
index 0000000000..baa4cf0aa6
--- /dev/null
+++ b/examples/unified/react-native-app/ios/Podfile.lock
@@ -0,0 +1,1936 @@
+PODS:
+ - amplitude-plugin-session-replay-react-native (0.5.1):
+ - AmplitudeSessionReplay (>= 0.11.1)
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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
+ - amplitude-react-native (1.6.9):
+ - React-Core
+ - AmplitudeCore (1.4.10)
+ - AmplitudeEngagementSwift (3.12.1):
+ - AmplitudeCore (< 2.0.0, >= 1.0.12)
+ - AmplitudeSessionReplay (0.12.6):
+ - AmplitudeCore (< 2.0.0, >= 1.4.2)
+ - boost (1.84.0)
+ - DoubleConversion (1.1.6)
+ - experiment-react-native-client (1.8.0):
+ - React-Core
+ - fast_float (6.1.4)
+ - FBLazyVector (0.76.9)
+ - fmt (11.0.2)
+ - glog (0.3.5)
+ - hermes-engine (0.76.9):
+ - hermes-engine/Pre-built (= 0.76.9)
+ - hermes-engine/Pre-built (0.76.9)
+ - PluginEngagementReactNative (3.12.1):
+ - AmplitudeEngagementSwift (= 3.12.1)
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.10.14.00):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - RCT-Folly/Default (= 2024.10.14.00)
+ - RCT-Folly/Default (2024.10.14.00):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - RCT-Folly/Fabric (2024.10.14.00):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - RCTDeprecation (0.76.9)
+ - RCTRequired (0.76.9)
+ - RCTTypeSafety (0.76.9):
+ - FBLazyVector (= 0.76.9)
+ - RCTRequired (= 0.76.9)
+ - React-Core (= 0.76.9)
+ - React (0.76.9):
+ - React-Core (= 0.76.9)
+ - React-Core/DevSupport (= 0.76.9)
+ - React-Core/RCTWebSocket (= 0.76.9)
+ - React-RCTActionSheet (= 0.76.9)
+ - React-RCTAnimation (= 0.76.9)
+ - React-RCTBlob (= 0.76.9)
+ - React-RCTImage (= 0.76.9)
+ - React-RCTLinking (= 0.76.9)
+ - React-RCTNetwork (= 0.76.9)
+ - React-RCTSettings (= 0.76.9)
+ - React-RCTText (= 0.76.9)
+ - React-RCTVibration (= 0.76.9)
+ - React-callinvoker (0.76.9)
+ - React-Core (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default (= 0.76.9)
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/CoreModulesHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/Default (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/DevSupport (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default (= 0.76.9)
+ - React-Core/RCTWebSocket (= 0.76.9)
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTActionSheetHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTAnimationHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTBlobHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTImageHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTLinkingHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTNetworkHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTSettingsHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTTextHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTVibrationHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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.1)
+ - Yoga
+ - React-Core/RCTWebSocket (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default (= 0.76.9)
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-CoreModules (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - RCT-Folly
+ - RCTTypeSafety
+ - React-Core/CoreModulesHeaders
+ - React-jsi
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTBlob
+ - React-RCTImage
+ - ReactCodegen
+ - ReactCommon
+ - SocketRocket
+ - React-cxxreact (0.76.9):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-callinvoker
+ - React-debug
+ - React-jsi
+ - React-jsinspector
+ - React-logger
+ - React-perflogger
+ - React-runtimeexecutor
+ - React-timing
+ - React-debug (0.76.9)
+ - React-defaultsnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-domnativemodule
+ - React-Fabric
+ - React-featureflags
+ - React-featureflagsnativemodule
+ - React-graphics
+ - React-idlecallbacksnativemodule
+ - React-ImageManager
+ - React-microtasksnativemodule
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-domnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-Fabric (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/animations (= 0.76.9)
+ - React-Fabric/attributedstring (= 0.76.9)
+ - React-Fabric/componentregistry (= 0.76.9)
+ - React-Fabric/componentregistrynative (= 0.76.9)
+ - React-Fabric/components (= 0.76.9)
+ - React-Fabric/core (= 0.76.9)
+ - React-Fabric/dom (= 0.76.9)
+ - React-Fabric/imagemanager (= 0.76.9)
+ - React-Fabric/leakchecker (= 0.76.9)
+ - React-Fabric/mounting (= 0.76.9)
+ - React-Fabric/observers (= 0.76.9)
+ - React-Fabric/scheduler (= 0.76.9)
+ - React-Fabric/telemetry (= 0.76.9)
+ - React-Fabric/templateprocessor (= 0.76.9)
+ - React-Fabric/uimanager (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/animations (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/attributedstring (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/componentregistry (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/componentregistrynative (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/components (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/components/legacyviewmanagerinterop (= 0.76.9)
+ - React-Fabric/components/root (= 0.76.9)
+ - React-Fabric/components/view (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/components/legacyviewmanagerinterop (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/components/root (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/components/view (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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
+ - Yoga
+ - React-Fabric/core (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/dom (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/imagemanager (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/leakchecker (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/mounting (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/observers (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/observers/events (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/observers/events (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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/scheduler (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - 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/telemetry (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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 (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.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 (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/uimanager/consistency (= 0.76.9)
+ - 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 (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-FabricComponents (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents/components (= 0.76.9)
+ - React-FabricComponents/textlayoutmanager (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents/components/inputaccessory (= 0.76.9)
+ - React-FabricComponents/components/iostextinput (= 0.76.9)
+ - React-FabricComponents/components/modal (= 0.76.9)
+ - React-FabricComponents/components/rncore (= 0.76.9)
+ - React-FabricComponents/components/safeareaview (= 0.76.9)
+ - React-FabricComponents/components/scrollview (= 0.76.9)
+ - React-FabricComponents/components/text (= 0.76.9)
+ - React-FabricComponents/components/textinput (= 0.76.9)
+ - React-FabricComponents/components/unimplementedview (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/inputaccessory (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/iostextinput (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/modal (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/rncore (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/safeareaview (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/scrollview (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/text (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/textinput (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/unimplementedview (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/textlayoutmanager (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricImage (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Fabric
+ - React-graphics
+ - React-ImageManager
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-utils
+ - ReactCommon
+ - Yoga
+ - React-featureflags (0.76.9)
+ - React-featureflagsnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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
+ - React-graphics (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - RCT-Folly/Fabric
+ - React-jsi
+ - React-jsiexecutor
+ - React-utils
+ - React-hermes (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-cxxreact
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimeexecutor
+ - React-idlecallbacksnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-ImageManager (0.76.9):
+ - glog
+ - RCT-Folly/Fabric
+ - React-Core/Default
+ - React-debug
+ - React-Fabric
+ - React-graphics
+ - React-rendererdebug
+ - React-utils
+ - React-jserrorhandler (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-cxxreact
+ - React-debug
+ - React-jsi
+ - React-jsi (0.76.9):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-jsiexecutor (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-cxxreact
+ - React-jsi
+ - React-jsinspector
+ - React-perflogger
+ - React-jsinspector (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-featureflags
+ - React-jsi
+ - React-perflogger
+ - React-runtimeexecutor
+ - React-jsitracing (0.76.9):
+ - React-jsi
+ - React-logger (0.76.9):
+ - glog
+ - React-Mapbuffer (0.76.9):
+ - glog
+ - React-debug
+ - React-microtasksnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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
+ - React-nativeconfig (0.76.9)
+ - React-NativeModulesApple (0.76.9):
+ - glog
+ - hermes-engine
+ - React-callinvoker
+ - React-Core
+ - React-cxxreact
+ - React-jsi
+ - React-jsinspector
+ - React-runtimeexecutor
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - React-perflogger (0.76.9):
+ - DoubleConversion
+ - RCT-Folly (= 2024.10.14.00)
+ - React-performancetimeline (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - React-cxxreact
+ - React-timing
+ - React-RCTActionSheet (0.76.9):
+ - React-Core/RCTActionSheetHeaders (= 0.76.9)
+ - React-RCTAnimation (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTTypeSafety
+ - React-Core/RCTAnimationHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTAppDelegate (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-CoreModules
+ - React-debug
+ - React-defaultsnativemodule
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-nativeconfig
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-RCTImage
+ - React-RCTNetwork
+ - React-rendererdebug
+ - React-RuntimeApple
+ - React-RuntimeCore
+ - React-RuntimeHermes
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTBlob (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - React-Core/RCTBlobHeaders
+ - React-Core/RCTWebSocket
+ - React-jsi
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTNetwork
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTFabric (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents
+ - React-FabricImage
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsi
+ - React-jsinspector
+ - React-nativeconfig
+ - React-performancetimeline
+ - React-RCTImage
+ - React-RCTText
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - Yoga
+ - React-RCTImage (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTTypeSafety
+ - React-Core/RCTImageHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTNetwork
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTLinking (0.76.9):
+ - React-Core/RCTLinkingHeaders (= 0.76.9)
+ - React-jsi (= 0.76.9)
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - ReactCommon/turbomodule/core (= 0.76.9)
+ - React-RCTNetwork (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTTypeSafety
+ - React-Core/RCTNetworkHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTSettings (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTTypeSafety
+ - React-Core/RCTSettingsHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTText (0.76.9):
+ - React-Core/RCTTextHeaders (= 0.76.9)
+ - Yoga
+ - React-RCTVibration (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - React-Core/RCTVibrationHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-rendererconsistency (0.76.9)
+ - React-rendererdebug (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - RCT-Folly
+ - React-debug
+ - React-rncore (0.76.9)
+ - React-RuntimeApple (0.76.9):
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-callinvoker
+ - React-Core/Default
+ - React-CoreModules
+ - React-cxxreact
+ - React-jserrorhandler
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-Mapbuffer
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-RuntimeCore
+ - React-runtimeexecutor
+ - React-RuntimeHermes
+ - React-runtimescheduler
+ - React-utils
+ - React-RuntimeCore (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-cxxreact
+ - React-featureflags
+ - React-jserrorhandler
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-performancetimeline
+ - React-runtimeexecutor
+ - React-runtimescheduler
+ - React-utils
+ - React-runtimeexecutor (0.76.9):
+ - React-jsi (= 0.76.9)
+ - React-RuntimeHermes (0.76.9):
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsinspector
+ - React-jsitracing
+ - React-nativeconfig
+ - React-RuntimeCore
+ - React-utils
+ - React-runtimescheduler (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - React-callinvoker
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-jsi
+ - React-performancetimeline
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimeexecutor
+ - React-timing
+ - React-utils
+ - React-timing (0.76.9)
+ - React-utils (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - React-debug
+ - React-jsi (= 0.76.9)
+ - ReactCodegen (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-FabricImage
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-NativeModulesApple
+ - React-rendererdebug
+ - React-utils
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - ReactCommon (0.76.9):
+ - ReactCommon/turbomodule (= 0.76.9)
+ - ReactCommon/turbomodule (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-callinvoker
+ - React-cxxreact
+ - React-jsi
+ - React-logger
+ - React-perflogger
+ - ReactCommon/turbomodule/bridging (= 0.76.9)
+ - ReactCommon/turbomodule/core (= 0.76.9)
+ - ReactCommon/turbomodule/bridging (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-callinvoker
+ - React-cxxreact
+ - React-jsi (= 0.76.9)
+ - React-logger
+ - React-perflogger
+ - ReactCommon/turbomodule/core (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-callinvoker
+ - React-cxxreact
+ - React-debug (= 0.76.9)
+ - React-featureflags (= 0.76.9)
+ - React-jsi
+ - React-logger
+ - React-perflogger
+ - React-utils (= 0.76.9)
+ - RNCAsyncStorage (2.2.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.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
+ - SocketRocket (0.7.1)
+ - Yoga (0.0.0)
+
+DEPENDENCIES:
+ - amplitude-plugin-session-replay-react-native (from `../../../../packages/plugin-session-replay-react-native`)
+ - amplitude-react-native (from `../../../../packages/analytics-react-native`)
+ - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
+ - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
+ - "experiment-react-native-client (from `../../../../node_modules/.pnpm/@amplitude+experiment-react-native-client@1.8.0_react-native@0.73.0_@babel+core@7.28.5__e242275df41d2976346dcde9fa98d475/node_modules/@amplitude/experiment-react-native-client`)"
+ - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`)
+ - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
+ - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`)
+ - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
+ - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
+ - "PluginEngagementReactNative (from `../../../../node_modules/.pnpm/@amplitude+plugin-engagement-react-native@3.12.1_@react-native-async-storage+async-stor_5f73ed6d6c6377c037f9ce1167a92f48/node_modules/@amplitude/plugin-engagement-react-native`)"
+ - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
+ - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
+ - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)
+ - RCTRequired (from `../node_modules/react-native/Libraries/Required`)
+ - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
+ - React (from `../node_modules/react-native/`)
+ - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
+ - React-Core (from `../node_modules/react-native/`)
+ - React-Core/RCTWebSocket (from `../node_modules/react-native/`)
+ - React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
+ - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
+ - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`)
+ - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`)
+ - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`)
+ - React-Fabric (from `../node_modules/react-native/ReactCommon`)
+ - React-FabricComponents (from `../node_modules/react-native/ReactCommon`)
+ - React-FabricImage (from `../node_modules/react-native/ReactCommon`)
+ - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`)
+ - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`)
+ - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`)
+ - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`)
+ - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`)
+ - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`)
+ - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`)
+ - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
+ - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
+ - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`)
+ - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`)
+ - React-logger (from `../node_modules/react-native/ReactCommon/logger`)
+ - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`)
+ - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)
+ - React-nativeconfig (from `../node_modules/react-native/ReactCommon`)
+ - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
+ - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
+ - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`)
+ - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
+ - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
+ - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`)
+ - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
+ - React-RCTFabric (from `../node_modules/react-native/React`)
+ - React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
+ - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
+ - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
+ - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
+ - React-RCTText (from `../node_modules/react-native/Libraries/Text`)
+ - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
+ - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`)
+ - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`)
+ - React-rncore (from `../node_modules/react-native/ReactCommon`)
+ - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`)
+ - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`)
+ - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
+ - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`)
+ - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
+ - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`)
+ - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`)
+ - ReactCodegen (from `build/generated/ios`)
+ - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
+ - "RNCAsyncStorage (from `../../../../node_modules/.pnpm/@react-native-async-storage+async-storage@2.2.0_react-native@0.73.0_@babel+core@7.28.5__18b8b5c01db749c8d8f06a7265e42e60/node_modules/@react-native-async-storage/async-storage`)"
+ - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
+
+SPEC REPOS:
+ trunk:
+ - AmplitudeCore
+ - AmplitudeEngagementSwift
+ - AmplitudeSessionReplay
+ - SocketRocket
+
+EXTERNAL SOURCES:
+ amplitude-plugin-session-replay-react-native:
+ :path: "../../../../packages/plugin-session-replay-react-native"
+ amplitude-react-native:
+ :path: "../../../../packages/analytics-react-native"
+ boost:
+ :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
+ DoubleConversion:
+ :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
+ experiment-react-native-client:
+ :path: "../../../../node_modules/.pnpm/@amplitude+experiment-react-native-client@1.8.0_react-native@0.73.0_@babel+core@7.28.5__e242275df41d2976346dcde9fa98d475/node_modules/@amplitude/experiment-react-native-client"
+ fast_float:
+ :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec"
+ FBLazyVector:
+ :path: "../node_modules/react-native/Libraries/FBLazyVector"
+ fmt:
+ :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec"
+ glog:
+ :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
+ hermes-engine:
+ :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec"
+ :tag: hermes-2024-11-12-RNv0.76.2-5b4aa20c719830dcf5684832b89a6edb95ac3d64
+ PluginEngagementReactNative:
+ :path: "../../../../node_modules/.pnpm/@amplitude+plugin-engagement-react-native@3.12.1_@react-native-async-storage+async-stor_5f73ed6d6c6377c037f9ce1167a92f48/node_modules/@amplitude/plugin-engagement-react-native"
+ RCT-Folly:
+ :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
+ RCTDeprecation:
+ :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation"
+ RCTRequired:
+ :path: "../node_modules/react-native/Libraries/Required"
+ RCTTypeSafety:
+ :path: "../node_modules/react-native/Libraries/TypeSafety"
+ React:
+ :path: "../node_modules/react-native/"
+ React-callinvoker:
+ :path: "../node_modules/react-native/ReactCommon/callinvoker"
+ React-Core:
+ :path: "../node_modules/react-native/"
+ React-CoreModules:
+ :path: "../node_modules/react-native/React/CoreModules"
+ React-cxxreact:
+ :path: "../node_modules/react-native/ReactCommon/cxxreact"
+ React-debug:
+ :path: "../node_modules/react-native/ReactCommon/react/debug"
+ React-defaultsnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults"
+ React-domnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom"
+ React-Fabric:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-FabricComponents:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-FabricImage:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-featureflags:
+ :path: "../node_modules/react-native/ReactCommon/react/featureflags"
+ React-featureflagsnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags"
+ React-graphics:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics"
+ React-hermes:
+ :path: "../node_modules/react-native/ReactCommon/hermes"
+ React-idlecallbacksnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks"
+ React-ImageManager:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios"
+ React-jserrorhandler:
+ :path: "../node_modules/react-native/ReactCommon/jserrorhandler"
+ React-jsi:
+ :path: "../node_modules/react-native/ReactCommon/jsi"
+ React-jsiexecutor:
+ :path: "../node_modules/react-native/ReactCommon/jsiexecutor"
+ React-jsinspector:
+ :path: "../node_modules/react-native/ReactCommon/jsinspector-modern"
+ React-jsitracing:
+ :path: "../node_modules/react-native/ReactCommon/hermes/executor/"
+ React-logger:
+ :path: "../node_modules/react-native/ReactCommon/logger"
+ React-Mapbuffer:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-microtasksnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
+ React-nativeconfig:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-NativeModulesApple:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios"
+ React-perflogger:
+ :path: "../node_modules/react-native/ReactCommon/reactperflogger"
+ React-performancetimeline:
+ :path: "../node_modules/react-native/ReactCommon/react/performance/timeline"
+ React-RCTActionSheet:
+ :path: "../node_modules/react-native/Libraries/ActionSheetIOS"
+ React-RCTAnimation:
+ :path: "../node_modules/react-native/Libraries/NativeAnimation"
+ React-RCTAppDelegate:
+ :path: "../node_modules/react-native/Libraries/AppDelegate"
+ React-RCTBlob:
+ :path: "../node_modules/react-native/Libraries/Blob"
+ React-RCTFabric:
+ :path: "../node_modules/react-native/React"
+ React-RCTImage:
+ :path: "../node_modules/react-native/Libraries/Image"
+ React-RCTLinking:
+ :path: "../node_modules/react-native/Libraries/LinkingIOS"
+ React-RCTNetwork:
+ :path: "../node_modules/react-native/Libraries/Network"
+ React-RCTSettings:
+ :path: "../node_modules/react-native/Libraries/Settings"
+ React-RCTText:
+ :path: "../node_modules/react-native/Libraries/Text"
+ React-RCTVibration:
+ :path: "../node_modules/react-native/Libraries/Vibration"
+ React-rendererconsistency:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency"
+ React-rendererdebug:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/debug"
+ React-rncore:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-RuntimeApple:
+ :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios"
+ React-RuntimeCore:
+ :path: "../node_modules/react-native/ReactCommon/react/runtime"
+ React-runtimeexecutor:
+ :path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
+ React-RuntimeHermes:
+ :path: "../node_modules/react-native/ReactCommon/react/runtime"
+ React-runtimescheduler:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler"
+ React-timing:
+ :path: "../node_modules/react-native/ReactCommon/react/timing"
+ React-utils:
+ :path: "../node_modules/react-native/ReactCommon/react/utils"
+ ReactCodegen:
+ :path: build/generated/ios
+ ReactCommon:
+ :path: "../node_modules/react-native/ReactCommon"
+ RNCAsyncStorage:
+ :path: "../../../../node_modules/.pnpm/@react-native-async-storage+async-storage@2.2.0_react-native@0.73.0_@babel+core@7.28.5__18b8b5c01db749c8d8f06a7265e42e60/node_modules/@react-native-async-storage/async-storage"
+ Yoga:
+ :path: "../node_modules/react-native/ReactCommon/yoga"
+
+SPEC CHECKSUMS:
+ amplitude-plugin-session-replay-react-native: 80e1e24f1a067f92a05d41e61b6d3e57867981df
+ amplitude-react-native: c7bccdc970d332663dd21104ecd25165d10786cc
+ AmplitudeCore: 61766a21268f619e193ac817c61c1005bc376f76
+ AmplitudeEngagementSwift: 82d2c3afd0366feff0a0205d4870481f4ddeb3d7
+ AmplitudeSessionReplay: 45d38425f83074145134824b7009bec573a2c21c
+ boost: 1dca942403ed9342f98334bf4c3621f011aa7946
+ DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385
+ experiment-react-native-client: 3c0f83b624da4a6b9b2fed212e45ba7b6d8150f8
+ fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
+ FBLazyVector: 7605ea4810e0e10ae4815292433c09bf4324ba45
+ fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6
+ glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a
+ hermes-engine: 9e868dc7be781364296d6ee2f56d0c1a9ef0bb11
+ PluginEngagementReactNative: 9a96d432da6c8228cd492be508de5418339efb6b
+ RCT-Folly: ea9d9256ba7f9322ef911169a9f696e5857b9e17
+ RCTDeprecation: ebe712bb05077934b16c6bf25228bdec34b64f83
+ RCTRequired: ca91e5dd26b64f577b528044c962baf171c6b716
+ RCTTypeSafety: e7678bd60850ca5a41df9b8dc7154638cb66871f
+ React: 4641770499c39f45d4e7cde1eba30e081f9d8a3d
+ React-callinvoker: 4bef67b5c7f3f68db5929ab6a4d44b8a002998ea
+ React-Core: a68cea3e762814e60ecc3fa521c7f14c36c99245
+ React-CoreModules: d81b1eaf8066add66299bab9d23c9f00c9484c7c
+ React-cxxreact: 984f8b1feeca37181d4e95301fcd6f5f6501c6ab
+ React-debug: 817160c07dc8d24d020fbd1eac7b3558ffc08964
+ React-defaultsnativemodule: 18a684542f82ce1897552a1c4b847be414c9566e
+ React-domnativemodule: 90bdd4ec3ab38c47cfc3461c1e9283a8507d613f
+ React-Fabric: f6dade7007533daeb785ba5925039d83f343be4b
+ React-FabricComponents: b0655cc3e1b5ae12a4a1119aa7d8308f0ad33520
+ React-FabricImage: 9b157c4c01ac2bf433f834f0e1e5fe234113a576
+ React-featureflags: f2792b067a351d86fdc7bec23db3b9a2f2c8d26c
+ React-featureflagsnativemodule: 742a8325b3c821d2a1ca13a6d2a0fc72d04555e0
+ React-graphics: 68969e4e49d73f89da7abef4116c9b5f466aa121
+ React-hermes: ac0bcba26a5d288ebc99b500e1097da2d0297ddf
+ React-idlecallbacksnativemodule: d61d9c9816131bf70d3d80cd04889fc625ee523f
+ React-ImageManager: e906eec93a9eb6102a06576b89d48d80a4683020
+ React-jserrorhandler: ac5dde01104ff444e043cad8f574ca02756e20d6
+ React-jsi: 496fa2b9d63b726aeb07d0ac800064617d71211d
+ React-jsiexecutor: dd22ab48371b80f37a0a30d0e8915b6d0f43a893
+ React-jsinspector: 4629ac376f5765e684d19064f2093e55c97fd086
+ React-jsitracing: 7a1c9cd484248870cf660733cd3b8114d54c035f
+ React-logger: c4052eb941cca9a097ef01b59543a656dc088559
+ React-Mapbuffer: 33546a3ebefbccb8770c33a1f8a5554fa96a54de
+ React-microtasksnativemodule: d80ff86c8902872d397d9622f1a97aadcc12cead
+ React-nativeconfig: 8efdb1ef1e9158c77098a93085438f7e7b463678
+ React-NativeModulesApple: cebca2e5320a3d66e123cade23bd90a167ffce5e
+ React-perflogger: 72e653eb3aba9122f9e57cf012d22d2486f33358
+ React-performancetimeline: cd6a9374a72001165995d2ab632f672df04076dc
+ React-RCTActionSheet: aacf2375084dea6e7c221f4a727e579f732ff342
+ React-RCTAnimation: 395ab53fd064dff81507c15efb781c8684d9a585
+ React-RCTAppDelegate: 345a6f1b82abc578437df0ce7e9c48740eca827c
+ React-RCTBlob: 13311e554c1a367de063c10ee7c5e6573b2dd1d6
+ React-RCTFabric: 007b1a98201cc49b5bc6e1417d7fe3f6fc6e2b78
+ React-RCTImage: 1b1f914bcc12187c49ba5d949dac38c2eb9f5cc8
+ React-RCTLinking: 4ac7c42beb65e36fba0376f3498f3cd8dd0be7fa
+ React-RCTNetwork: 938902773add4381e84426a7aa17a2414f5f94f7
+ React-RCTSettings: e848f1ba17a7a18479cf5a31d28145f567da8223
+ React-RCTText: 7e98fafdde7d29e888b80f0b35544e0cb07913cf
+ React-RCTVibration: cd7d80affd97dc7afa62f9acd491419558b64b78
+ React-rendererconsistency: b4917053ecbaa91469c67a4319701c9dc0d40be6
+ React-rendererdebug: aa181c36dd6cf5b35511d1ed875d6638fd38f0ec
+ React-rncore: 120d21715c9b4ba8f798bffe986cb769b988dd74
+ React-RuntimeApple: d033becbbd1eba6f9f6e3af6f1893030ce203edd
+ React-RuntimeCore: 38af280bb678e66ba000a3c3d42920b2a138eebb
+ React-runtimeexecutor: 877596f82f5632d073e121cba2d2084b76a76899
+ React-RuntimeHermes: 37aad735ff21ca6de2d8450a96de1afe9f86c385
+ React-runtimescheduler: 8ec34cc885281a34696ea16c4fd86892d631f38d
+ React-timing: 331cbf9f2668c67faddfd2e46bb7f41cbd9320b9
+ React-utils: ed818f19ab445000d6b5c4efa9d462449326cc9f
+ ReactCodegen: f853a20cc9125c5521c8766b4b49375fec20648b
+ ReactCommon: 300d8d9c5cb1a6cd79a67cf5d8f91e4d477195f9
+ RNCAsyncStorage: 87a74d13ba0128f853817e45e21c4051e1f2cd45
+ SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
+ Yoga: feb4910aba9742cfedc059e2b2902e22ffe9954a
+
+PODFILE CHECKSUM: 0a0c59f84db5a439364725b3317225198053afb0
+
+COCOAPODS: 1.17.0
diff --git a/examples/unified/react-native-app/ios/app.xcodeproj/project.pbxproj b/examples/unified/react-native-app/ios/app.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..15db947c61
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app.xcodeproj/project.pbxproj
@@ -0,0 +1,711 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0C80B921A6F3F58F76C31292 /* libPods-app.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-app.a */; };
+ 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
+ 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
+ 7699B88040F8A987B510C191 /* libPods-app-appTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-app-appTests.a */; };
+ 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
+ C2A1D4E90F3B4C6A9D2E5F71 /* AmplitudeConnectivityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2A1D4E80F3B4C6A9D2E5F70 /* AmplitudeConnectivityTests.swift */; };
+ CA1C30F36C1C0E52F754A635 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = F82C0122EF21DCFFD6F06133 /* PrivacyInfo.xcprivacy */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
+ remoteInfo = app;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 00E356EE1AD99517003FC87E /* appTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = appTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 13B07F961A680F5B00A75B9A /* app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = app.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = app/AppDelegate.h; sourceTree = ""; };
+ 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = app/AppDelegate.mm; sourceTree = ""; };
+ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = app/Images.xcassets; sourceTree = ""; };
+ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = app/Info.plist; sourceTree = ""; };
+ 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = app/main.m; sourceTree = ""; };
+ 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = app/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 19F6CBCC0A4E27FBF8BF4A61 /* libPods-app-appTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-app-appTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3B4392A12AC88292D35C810B /* Pods-app.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-app.debug.xcconfig"; path = "Target Support Files/Pods-app/Pods-app.debug.xcconfig"; sourceTree = ""; };
+ 5709B34CF0A7D63546082F79 /* Pods-app.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-app.release.xcconfig"; path = "Target Support Files/Pods-app/Pods-app.release.xcconfig"; sourceTree = ""; };
+ 5B7EB9410499542E8C5724F5 /* Pods-app-appTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-app-appTests.debug.xcconfig"; path = "Target Support Files/Pods-app-appTests/Pods-app-appTests.debug.xcconfig"; sourceTree = ""; };
+ 5DCACB8F33CDC322A6C60F78 /* libPods-app.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-app.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = app/LaunchScreen.storyboard; sourceTree = ""; };
+ 89C6BE57DB24E9ADA2F236DE /* Pods-app-appTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-app-appTests.release.xcconfig"; path = "Target Support Files/Pods-app-appTests/Pods-app-appTests.release.xcconfig"; sourceTree = ""; };
+ C2A1D4E80F3B4C6A9D2E5F70 /* AmplitudeConnectivityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AmplitudeConnectivityTests.swift; path = "../../../../../packages/analytics-react-native/ios/Tests/AmplitudeConnectivityTests.swift"; sourceTree = ""; };
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
+ F82C0122EF21DCFFD6F06133 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = app/PrivacyInfo.xcprivacy; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 00E356EB1AD99517003FC87E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7699B88040F8A987B510C191 /* libPods-app-appTests.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0C80B921A6F3F58F76C31292 /* libPods-app.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 00E356EF1AD99517003FC87E /* appTests */ = {
+ isa = PBXGroup;
+ children = (
+ C2A1D4E80F3B4C6A9D2E5F70 /* AmplitudeConnectivityTests.swift */,
+ 00E356F01AD99517003FC87E /* Supporting Files */,
+ );
+ path = appTests;
+ sourceTree = "";
+ };
+ 00E356F01AD99517003FC87E /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 00E356F11AD99517003FC87E /* Info.plist */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ 13B07FAE1A68108700A75B9A /* app */ = {
+ isa = PBXGroup;
+ children = (
+ 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
+ 13B07FB01A68108700A75B9A /* AppDelegate.mm */,
+ 13B07FB51A68108700A75B9A /* Images.xcassets */,
+ 13B07FB61A68108700A75B9A /* Info.plist */,
+ 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
+ 13B07FB71A68108700A75B9A /* main.m */,
+ 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
+ F82C0122EF21DCFFD6F06133 /* PrivacyInfo.xcprivacy */,
+ );
+ name = app;
+ sourceTree = "";
+ };
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
+ 5DCACB8F33CDC322A6C60F78 /* libPods-app.a */,
+ 19F6CBCC0A4E27FBF8BF4A61 /* libPods-app-appTests.a */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Libraries;
+ sourceTree = "";
+ };
+ 83CBB9F61A601CBA00E9B192 = {
+ isa = PBXGroup;
+ children = (
+ 13B07FAE1A68108700A75B9A /* app */,
+ 832341AE1AAA6A7D00B99B32 /* Libraries */,
+ 00E356EF1AD99517003FC87E /* appTests */,
+ 83CBBA001A601CBA00E9B192 /* Products */,
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */,
+ BBD78D7AC51CEA395F1C20DB /* Pods */,
+ );
+ indentWidth = 2;
+ sourceTree = "";
+ tabWidth = 2;
+ usesTabs = 0;
+ };
+ 83CBBA001A601CBA00E9B192 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 13B07F961A680F5B00A75B9A /* app.app */,
+ 00E356EE1AD99517003FC87E /* appTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ BBD78D7AC51CEA395F1C20DB /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 3B4392A12AC88292D35C810B /* Pods-app.debug.xcconfig */,
+ 5709B34CF0A7D63546082F79 /* Pods-app.release.xcconfig */,
+ 5B7EB9410499542E8C5724F5 /* Pods-app-appTests.debug.xcconfig */,
+ 89C6BE57DB24E9ADA2F236DE /* Pods-app-appTests.release.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 00E356ED1AD99517003FC87E /* appTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "appTests" */;
+ 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 = appTests;
+ productName = appTests;
+ productReference = 00E356EE1AD99517003FC87E /* appTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 13B07F861A680F5B00A75B9A /* app */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "app" */;
+ 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 = app;
+ productName = app;
+ productReference = 13B07F961A680F5B00A75B9A /* app.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 "app" */;
+ compatibilityVersion = "Xcode 12.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 83CBB9F61A601CBA00E9B192;
+ productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 13B07F861A680F5B00A75B9A /* app */,
+ 00E356ED1AD99517003FC87E /* appTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 00E356EC1AD99517003FC87E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F8E1A680F5B00A75B9A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
+ CA1C30F36C1C0E52F754A635 /* PrivacyInfo.xcprivacy 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=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/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-app/Pods-app-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-app/Pods-app-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-app/Pods-app-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-app-appTests-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-app-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-app-appTests/Pods-app-appTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-app-appTests/Pods-app-appTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-app-appTests/Pods-app-appTests-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-app/Pods-app-resources-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Copy Pods Resources";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-app/Pods-app-resources-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-app/Pods-app-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-app-appTests/Pods-app-appTests-resources-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Copy Pods Resources";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-app-appTests/Pods-app-appTests-resources-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-app-appTests/Pods-app-appTests-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 00E356EA1AD99517003FC87E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C2A1D4E90F3B4C6A9D2E5F71 /* AmplitudeConnectivityTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F871A680F5B00A75B9A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
+ 13B07FC11A68108700A75B9A /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 13B07F861A680F5B00A75B9A /* app */;
+ targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 00E356F61AD99517003FC87E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-app-appTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ INFOPLIST_FILE = appTests/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)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/app.app/app";
+ };
+ name = Debug;
+ };
+ 00E356F71AD99517003FC87E /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-app-appTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ COPY_PHASE_STRIP = NO;
+ INFOPLIST_FILE = appTests/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)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/app.app/app";
+ };
+ name = Release;
+ };
+ 13B07F941A680F5B00A75B9A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-app.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = app/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_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = org.reactjs.native.example.app.test;
+ PRODUCT_NAME = app;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 13B07F951A680F5B00A75B9A /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-app.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ INFOPLIST_FILE = app/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_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = org.reactjs.native.example.app.test;
+ PRODUCT_NAME = app;
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+ 83CBBA201A601CBA00E9B192 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CC = "";
+ 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;
+ CXX = "";
+ 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 = "";
+ LDPLUSPLUS = "";
+ 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",
+ );
+ OTHER_LDFLAGS = "$(inherited)";
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
+ USE_HERMES = true;
+ };
+ name = Debug;
+ };
+ 83CBBA211A601CBA00E9B192 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CC = "";
+ 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;
+ CXX = "";
+ 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 = "";
+ LDPLUSPLUS = "";
+ 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",
+ );
+ OTHER_LDFLAGS = "$(inherited)";
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
+ SDKROOT = iphoneos;
+ USE_HERMES = true;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "appTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 00E356F61AD99517003FC87E /* Debug */,
+ 00E356F71AD99517003FC87E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "app" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 13B07F941A680F5B00A75B9A /* Debug */,
+ 13B07F951A680F5B00A75B9A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "app" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 83CBBA201A601CBA00E9B192 /* Debug */,
+ 83CBBA211A601CBA00E9B192 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
+}
diff --git a/examples/unified/react-native-app/ios/app.xcodeproj/xcshareddata/xcschemes/app.xcscheme b/examples/unified/react-native-app/ios/app.xcodeproj/xcshareddata/xcschemes/app.xcscheme
new file mode 100644
index 0000000000..9b78d17732
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app.xcodeproj/xcshareddata/xcschemes/app.xcscheme
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/unified/react-native-app/ios/app.xcworkspace/contents.xcworkspacedata b/examples/unified/react-native-app/ios/app.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000..b83e63c384
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/examples/unified/react-native-app/ios/app.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/unified/react-native-app/ios/app.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000..18d981003d
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/examples/unified/react-native-app/ios/app/AppDelegate.h b/examples/unified/react-native-app/ios/app/AppDelegate.h
new file mode 100644
index 0000000000..5d2808256c
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app/AppDelegate.h
@@ -0,0 +1,6 @@
+#import
+#import
+
+@interface AppDelegate : RCTAppDelegate
+
+@end
diff --git a/examples/unified/react-native-app/ios/app/AppDelegate.mm b/examples/unified/react-native-app/ios/app/AppDelegate.mm
new file mode 100644
index 0000000000..2e6beb5e09
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app/AppDelegate.mm
@@ -0,0 +1,33 @@
+#import "AppDelegate.h"
+
+#import
+#import
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ self.moduleName = @"app";
+ // You can add your custom initial props in the dictionary below.
+ // They will be passed down to the ViewController used by React Native.
+ self.dependencyProvider = [[RCTAppDependencyProvider alloc] init];
+ self.initialProps = @{};
+
+ return [super application:application didFinishLaunchingWithOptions:launchOptions];
+}
+
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
+{
+ return [self bundleURL];
+}
+
+- (NSURL *)bundleURL
+{
+#if DEBUG
+ return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
+#else
+ return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
+#endif
+}
+
+@end
diff --git a/examples/unified/react-native-app/ios/app/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/unified/react-native-app/ios/app/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000..81213230de
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app/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/examples/unified/react-native-app/ios/app/Images.xcassets/Contents.json b/examples/unified/react-native-app/ios/app/Images.xcassets/Contents.json
new file mode 100644
index 0000000000..2d92bd53fd
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/examples/unified/react-native-app/ios/app/Info.plist b/examples/unified/react-native-app/ios/app/Info.plist
new file mode 100644
index 0000000000..1ae6efb282
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app/Info.plist
@@ -0,0 +1,51 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleDisplayName
+ app
+ 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
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/examples/unified/react-native-app/ios/app/LaunchScreen.storyboard b/examples/unified/react-native-app/ios/app/LaunchScreen.storyboard
new file mode 100644
index 0000000000..61f6b47aa0
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app/LaunchScreen.storyboard
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/unified/react-native-app/ios/app/PrivacyInfo.xcprivacy b/examples/unified/react-native-app/ios/app/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000000..41b8317f06
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app/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/examples/unified/react-native-app/ios/app/main.m b/examples/unified/react-native-app/ios/app/main.m
new file mode 100644
index 0000000000..d645c7246c
--- /dev/null
+++ b/examples/unified/react-native-app/ios/app/main.m
@@ -0,0 +1,10 @@
+#import
+
+#import "AppDelegate.h"
+
+int main(int argc, char *argv[])
+{
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/examples/unified/react-native-app/ios/appTests/Info.plist b/examples/unified/react-native-app/ios/appTests/Info.plist
new file mode 100644
index 0000000000..ba72822e87
--- /dev/null
+++ b/examples/unified/react-native-app/ios/appTests/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/examples/unified/react-native-app/metro.config.js b/examples/unified/react-native-app/metro.config.js
new file mode 100644
index 0000000000..a77eb86261
--- /dev/null
+++ b/examples/unified/react-native-app/metro.config.js
@@ -0,0 +1,91 @@
+const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
+const fs = require('fs');
+const path = require('path');
+
+const projectRoot = __dirname;
+const workspaceRoot = path.resolve(projectRoot, '../../..');
+// realpath into the pnpm virtual store so RN transitive deps (memoize-one, etc.)
+// resolve as siblings under .pnpm/react-native@…/node_modules/.
+const projectReactNative = fs.realpathSync(
+ path.resolve(projectRoot, 'node_modules/react-native'),
+);
+const projectReact = fs.realpathSync(
+ path.resolve(projectRoot, 'node_modules/react'),
+);
+const pnpmRnNodeModules = path.dirname(projectReactNative);
+const pnpmStore = path.resolve(workspaceRoot, 'node_modules/.pnpm');
+
+const defaultConfig = getDefaultConfig(projectRoot);
+
+// Force a single copy of react-native / react across the bundle.
+// Mirrors the expo-app dedup from PR #1803.
+const forcedSingletons = {
+ 'react-native': projectReactNative,
+ react: projectReact,
+};
+
+const resolveWithNode = (context, moduleName) => {
+ if (
+ typeof moduleName !== 'string' ||
+ moduleName.startsWith('.') ||
+ path.isAbsolute(moduleName)
+ ) {
+ return null;
+ }
+ try {
+ const filePath = fs.realpathSync(
+ require.resolve(moduleName, {
+ paths: [
+ path.dirname(context.originModulePath),
+ pnpmRnNodeModules,
+ projectReactNative,
+ projectRoot,
+ workspaceRoot,
+ ],
+ }),
+ );
+ return {type: 'sourceFile', filePath};
+ } catch {
+ return null;
+ }
+};
+
+const config = {
+ watchFolders: [
+ path.join(workspaceRoot, 'packages/unified-react-native'),
+ path.join(workspaceRoot, 'packages/analytics-react-native'),
+ path.join(workspaceRoot, 'packages/analytics-core'),
+ path.join(workspaceRoot, 'packages/plugin-experiment-react-native'),
+ path.join(workspaceRoot, 'packages/plugin-session-replay-react-native'),
+ // Pulled in via analytics-react-native autocapture.networkTracking.
+ path.join(workspaceRoot, 'packages/plugin-network-capture-browser'),
+ pnpmStore,
+ ],
+ resolver: {
+ nodeModulesPaths: [
+ path.resolve(projectRoot, 'node_modules'),
+ pnpmRnNodeModules,
+ path.resolve(workspaceRoot, 'node_modules'),
+ ],
+ extraNodeModules: forcedSingletons,
+ resolveRequest: (context, moduleName, platform) => {
+ for (const [name, dir] of Object.entries(forcedSingletons)) {
+ if (moduleName === name || moduleName.startsWith(name + '/')) {
+ const target = path.join(dir, moduleName.slice(name.length));
+ return context.resolveRequest(context, target, platform);
+ }
+ }
+ try {
+ return context.resolveRequest(context, moduleName, platform);
+ } catch (error) {
+ const resolved = resolveWithNode(context, moduleName);
+ if (resolved) {
+ return resolved;
+ }
+ throw error;
+ }
+ },
+ },
+};
+
+module.exports = mergeConfig(defaultConfig, config);
diff --git a/examples/unified/react-native-app/package.json b/examples/unified/react-native-app/package.json
new file mode 100644
index 0000000000..fa20054078
--- /dev/null
+++ b/examples/unified/react-native-app/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "@amplitude/unified-react-native-example",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "android": "react-native run-android",
+ "check:autolinking": "react-native config",
+ "ios": "react-native run-ios",
+ "lint": "eslint App.tsx index.js babel.config.js metro.config.js react-native.config.js",
+ "start": "react-native start --reset-cache"
+ },
+ "dependencies": {
+ "@amplitude/unified-react-native": "workspace:*",
+ "react": "18.3.1",
+ "react-native": "0.76.9"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.20.0",
+ "@babel/preset-env": "^7.20.0",
+ "@babel/runtime": "^7.20.0",
+ "@react-native-community/cli": "13.6.6",
+ "@react-native-community/cli-platform-android": "13.6.6",
+ "@react-native/babel-preset": "0.76.9",
+ "@react-native/codegen": "0.76.9",
+ "@react-native/eslint-config": "0.74.83",
+ "@react-native/gradle-plugin": "0.76.9",
+ "@react-native/metro-config": "0.76.9",
+ "@react-native/typescript-config": "0.74.83",
+ "@types/react": "^18.2.6",
+ "babel-plugin-transform-inline-environment-variables": "^0.4.4",
+ "dotenv": "^16.4.7",
+ "eslint": "^8.19.0",
+ "prettier": "2.8.8",
+ "typescript": "5.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+}
diff --git a/examples/unified/react-native-app/react-native.config.js b/examples/unified/react-native-app/react-native.config.js
new file mode 100644
index 0000000000..df70ef9c66
--- /dev/null
+++ b/examples/unified/react-native-app/react-native.config.js
@@ -0,0 +1 @@
+module.exports = require('@amplitude/unified-react-native/react-native.config');
diff --git a/examples/unified/react-native-app/tsconfig.json b/examples/unified/react-native-app/tsconfig.json
new file mode 100644
index 0000000000..d392636602
--- /dev/null
+++ b/examples/unified/react-native-app/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "allowJs": true,
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": false,
+ "isolatedModules": true,
+ "jsx": "react-native",
+ "lib": ["es2022"],
+ "module": "es2015",
+ "moduleResolution": "node",
+ "noEmit": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "target": "esnext",
+ "types": ["react-native"]
+ },
+ "exclude": ["**/Pods/**"]
+}
diff --git a/packages/unified-react-native/.gitignore b/packages/unified-react-native/.gitignore
new file mode 100644
index 0000000000..68c292c450
--- /dev/null
+++ b/packages/unified-react-native/.gitignore
@@ -0,0 +1,4 @@
+.DS_Store
+coverage/
+lib/
+node_modules/
diff --git a/packages/unified-react-native/CHANGELOG.md b/packages/unified-react-native/CHANGELOG.md
new file mode 100644
index 0000000000..53b9a1b57d
--- /dev/null
+++ b/packages/unified-react-native/CHANGELOG.md
@@ -0,0 +1,8 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## 1.0.0-beta.0
+
+- Initial React Native unified SDK wrapper with Analytics, Experiment, Session Replay, and Guides and Surveys.
diff --git a/packages/unified-react-native/README.md b/packages/unified-react-native/README.md
new file mode 100644
index 0000000000..5752c0c659
--- /dev/null
+++ b/packages/unified-react-native/README.md
@@ -0,0 +1,84 @@
+# @amplitude/unified-react-native
+
+Official Amplitude SDK wrapper for React Native Analytics, Experiment, Session Replay, and Guides and Surveys.
+
+## Installation
+
+```sh
+npm install @amplitude/unified-react-native
+```
+
+For a bare React Native application, load the package's autolinking preset from your application-level `react-native.config.js`:
+
+```javascript
+module.exports = require('@amplitude/unified-react-native/react-native.config');
+```
+
+If your application already has a React Native configuration, merge the preset's `dependencies` with your existing configuration:
+
+```javascript
+const amplitude = require('@amplitude/unified-react-native/react-native.config');
+
+module.exports = {
+ // Your existing configuration
+ dependencies: {
+ ...amplitude.dependencies,
+ // Your existing dependency overrides
+ },
+};
+```
+
+The preset lets React Native autolink the native blade modules installed transitively by the unified SDK. No blade package needs to be installed directly by the application.
+
+The unified SDK requires React Native 0.76 or newer. Guides and Surveys uses React Native's typed native event emitters, so enable the React Native New Architecture before rebuilding. For Android, set `newArchEnabled=true` in `android/gradle.properties`; use your React Native version's corresponding New Architecture setup for iOS.
+
+Install iOS pods after adding the package:
+
+```sh
+cd ios && pod install
+```
+
+## Usage
+
+```typescript
+import {
+ experiment,
+ init,
+ track,
+ Types,
+} from '@amplitude/unified-react-native';
+
+await init('YOUR_API_KEY', {
+ // Shared defaults for every blade SDK
+ serverZone: 'US',
+ instanceName: 'app',
+ logLevel: Types.LogLevel.Warn,
+
+ analytics: {
+ userId: 'user-id',
+ },
+ sessionReplay: {
+ sampleRate: 1,
+ },
+ experiment: {
+ deploymentKey: 'YOUR_DEPLOYMENT_KEY',
+ },
+ engagement: {
+ locale: 'en-US',
+ },
+});
+
+track('App Opened');
+const variant = experiment()?.variant('experiment-key');
+```
+
+Options in `analytics`, `experiment`, `sessionReplay`, and `engagement` override the corresponding shared defaults.
+Initialization is one-shot and idempotent: subsequent `init()` calls return the first initialization promise and do not reconfigure or retry the SDKs. Public SDK APIs do not throw initialization errors. Each error is reported through the Analytics `loggerProvider`; when Analytics is available, a blade failure does not prevent the remaining blades from initializing. After correcting the underlying configuration or native setup, restart the application before initializing again.
+
+### Multiple instances
+
+The unified React Native SDK does not support isolated multiple instances. The React Native Engagement plugin is a process-wide singleton, so every unified client created with `createInstance()` shares the same Engagement plugin and native Engagement instance. The first initialization supplies its API key and Engagement configuration; later clients cannot configure an independent Engagement instance and may update the same shared identity through subsequent boot operations.
+
+Use the package-level `init()`, `track()`, and other singleton exports for normal applications. If you create clients explicitly, treat their Engagement state as shared rather than independent.
+
+The package also exports the React Native Analytics helpers `Identify`, `Revenue`, and `Types`, plus `AmpMaskView` for Session Replay masking.
diff --git a/packages/unified-react-native/babel.config.js b/packages/unified-react-native/babel.config.js
new file mode 100644
index 0000000000..f842b77fcf
--- /dev/null
+++ b/packages/unified-react-native/babel.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ presets: ['module:metro-react-native-babel-preset'],
+};
diff --git a/packages/unified-react-native/jest.config.js b/packages/unified-react-native/jest.config.js
new file mode 100644
index 0000000000..96347be703
--- /dev/null
+++ b/packages/unified-react-native/jest.config.js
@@ -0,0 +1,15 @@
+const baseConfig = require('../../jest.config.js');
+const package = require('./package');
+
+module.exports = {
+ ...baseConfig,
+ displayName: package.name,
+ rootDir: '.',
+ preset: 'react-native',
+ testEnvironment: 'jsdom',
+ watchman: false,
+ coveragePathIgnorePatterns: ['index.ts'],
+ modulePathIgnorePatterns: ['/lib/'],
+ moduleFileExtensions: ['tsx', 'ts', 'js', 'jsx', 'json'],
+ transformIgnorePatterns: ['node_modules/(?!(.pnpm|@react-native|react-native)/)'],
+};
diff --git a/packages/unified-react-native/package.json b/packages/unified-react-native/package.json
new file mode 100644
index 0000000000..2564d3c5a2
--- /dev/null
+++ b/packages/unified-react-native/package.json
@@ -0,0 +1,90 @@
+{
+ "name": "@amplitude/unified-react-native",
+ "version": "1.0.0-beta.0",
+ "description": "Official Amplitude SDK for React Native analytics, Experiment, session replay, Guides and Surveys, and more.",
+ "keywords": [
+ "amplitude",
+ "analytics",
+ "experiment",
+ "react-native",
+ "session replay",
+ "guides and surveys"
+ ],
+ "author": "Amplitude Inc",
+ "homepage": "https://github.com/amplitude/Amplitude-TypeScript",
+ "license": "MIT",
+ "main": "lib/commonjs/index",
+ "module": "lib/module/index",
+ "types": "lib/typescript/index.d.ts",
+ "react-native": "src/index",
+ "source": "src/index",
+ "publishConfig": {
+ "access": "public",
+ "tag": "beta"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/amplitude/Amplitude-TypeScript.git"
+ },
+ "files": [
+ "src",
+ "lib",
+ "react-native.config.js",
+ "!test",
+ "!**/__tests__",
+ "!**/__fixtures__",
+ "!**/__mocks__",
+ "!**/.*"
+ ],
+ "bugs": {
+ "url": "https://github.com/amplitude/Amplitude-TypeScript/issues"
+ },
+ "scripts": {
+ "build": "bob build",
+ "clean": "rimraf node_modules lib coverage",
+ "fix": "pnpm fix:eslint & pnpm fix:prettier",
+ "fix:eslint": "eslint '{src,test}/**/*.ts' --fix",
+ "fix:prettier": "prettier --write \"{src,test}/**/*.ts\"",
+ "lint": "pnpm lint:eslint & pnpm lint:prettier",
+ "lint:eslint": "eslint '{src,test}/**/*.ts'",
+ "lint:prettier": "prettier --check \"{src,test}/**/*.ts\"",
+ "test": "jest",
+ "typecheck": "tsc --noEmit -p ./tsconfig.json",
+ "version": "pnpm version-file && pnpm build",
+ "version-file": "node -p \"'// Autogenerated by `pnpm version-file`. DO NOT EDIT\\nexport const VERSION = \\'' + require('./package.json').version + '\\';'\" > src/version.ts",
+ "typescript": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@amplitude/analytics-core": "workspace:*",
+ "@amplitude/analytics-react-native": "workspace:*",
+ "@amplitude/experiment-react-native-client": "^1.8.0",
+ "@amplitude/plugin-engagement-react-native": "^3.11.0",
+ "@amplitude/plugin-experiment-react-native": "workspace:*",
+ "@amplitude/plugin-session-replay-react-native": "workspace:*",
+ "@react-native-async-storage/async-storage": "^2.1.2",
+ "tslib": "^2.4.1"
+ },
+ "devDependencies": {
+ "react": "18.3.1",
+ "react-native": "0.76.9",
+ "react-native-builder-bob": "^0.20.3"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": ">=0.76.0"
+ },
+ "react-native-builder-bob": {
+ "source": "src",
+ "output": "lib",
+ "targets": [
+ "commonjs",
+ "module",
+ [
+ "typescript",
+ {
+ "project": "tsconfig.build.json"
+ }
+ ]
+ ]
+ }
+}
diff --git a/packages/unified-react-native/react-native.config.js b/packages/unified-react-native/react-native.config.js
new file mode 100644
index 0000000000..55d3364be4
--- /dev/null
+++ b/packages/unified-react-native/react-native.config.js
@@ -0,0 +1,20 @@
+const path = require('path');
+
+const nativePackages = [
+ '@amplitude/analytics-react-native',
+ '@amplitude/experiment-react-native-client',
+ '@amplitude/plugin-engagement-react-native',
+ '@amplitude/plugin-session-replay-react-native',
+ '@react-native-async-storage/async-storage',
+];
+
+const dependencies = Object.fromEntries(
+ nativePackages.map((packageName) => [
+ packageName,
+ {
+ root: path.dirname(require.resolve(`${packageName}/package.json`)),
+ },
+ ]),
+);
+
+module.exports = { dependencies };
diff --git a/packages/unified-react-native/src/index.ts b/packages/unified-react-native/src/index.ts
new file mode 100644
index 0000000000..01e8c04edd
--- /dev/null
+++ b/packages/unified-react-native/src/index.ts
@@ -0,0 +1,36 @@
+/* eslint-disable @typescript-eslint/unbound-method */
+import { createInstance } from './unified-client-factory';
+
+const client = createInstance();
+
+export { createInstance } from './unified-client-factory';
+export type { UnifiedClient, UnifiedOptions, UnifiedSharedOptions } from './types';
+
+export const {
+ add,
+ experiment,
+ extendSession,
+ flush,
+ getDeviceId,
+ getSessionId,
+ getUserId,
+ groupIdentify,
+ identify,
+ init,
+ logEvent,
+ remove,
+ reset,
+ revenue,
+ sessionReplay,
+ setDeviceId,
+ setGroup,
+ setOptOut,
+ setSessionId,
+ setUserId,
+ track,
+ trackScreenView,
+ trackScreenViewOnNavigationStateChange,
+} = client;
+
+export { AmpMaskView } from '@amplitude/plugin-session-replay-react-native';
+export { Identify, Revenue, Types } from '@amplitude/analytics-react-native';
diff --git a/packages/unified-react-native/src/library.ts b/packages/unified-react-native/src/library.ts
new file mode 100644
index 0000000000..1b401edbf9
--- /dev/null
+++ b/packages/unified-react-native/src/library.ts
@@ -0,0 +1,13 @@
+import type { EnrichmentPlugin, Event } from '@amplitude/analytics-core';
+import { VERSION } from './version';
+
+const LIBRARY_PREFIX = 'amplitude-ts-unified-react-native';
+
+export const libraryPlugin = (): EnrichmentPlugin => ({
+ type: 'enrichment',
+ name: '@amplitude/unified-react-native-library-plugin',
+ async execute(event: Event): Promise {
+ event.library = `${LIBRARY_PREFIX}/${VERSION}-${event.library ?? ''}`;
+ return event;
+ },
+});
diff --git a/packages/unified-react-native/src/types.ts b/packages/unified-react-native/src/types.ts
new file mode 100644
index 0000000000..e293581091
--- /dev/null
+++ b/packages/unified-react-native/src/types.ts
@@ -0,0 +1,47 @@
+import type { LogLevel, ReactNativeClient, ReactNativeOptions } from '@amplitude/analytics-core';
+import type { getPlugin } from '@amplitude/plugin-engagement-react-native';
+import type { ExperimentPluginConfig, IExperimentClient } from '@amplitude/plugin-experiment-react-native';
+import type { SessionReplayConfig, SessionReplayPlugin } from '@amplitude/plugin-session-replay-react-native';
+
+/** @internal */
+export type EngagementOptions = NonNullable[0]>;
+
+export interface UnifiedSharedOptions {
+ /** Data residency zone used by every blade SDK. */
+ serverZone?: 'US' | 'EU';
+
+ /** Named Analytics instance shared with SDKs that integrate through the Analytics connector. */
+ instanceName?: string;
+
+ /** Log verbosity translated to each blade SDK's representation. */
+ logLevel?: LogLevel;
+}
+
+export type UnifiedOptions = UnifiedSharedOptions & {
+ /** Analytics-specific options. These override shared options when both are set. */
+ analytics?: ReactNativeOptions;
+
+ /** Session Replay-specific options. These override shared options when both are set. */
+ sessionReplay?: SessionReplayConfig;
+
+ /** Experiment-specific options. These override shared options when both are set. */
+ experiment?: ExperimentPluginConfig;
+
+ /** Guides and Surveys-specific options. These override shared options when both are set. */
+ engagement?: EngagementOptions;
+};
+
+export interface UnifiedClient extends Omit {
+ /**
+ * Initialize Analytics, Experiment, Session Replay, and Guides and Surveys.
+ * Initialization errors are logged and are not thrown. Subsequent calls return the first initialization promise
+ * without reconfiguring or retrying the SDKs.
+ */
+ init(apiKey: string, unifiedOptions?: UnifiedOptions): Promise;
+
+ /** Return the Experiment client after init() has installed its plugin. */
+ experiment(): IExperimentClient | undefined;
+
+ /** Return the Session Replay plugin after init() has installed it. */
+ sessionReplay(): SessionReplayPlugin | undefined;
+}
diff --git a/packages/unified-react-native/src/unified-client-factory.ts b/packages/unified-react-native/src/unified-client-factory.ts
new file mode 100644
index 0000000000..7fabe5b544
--- /dev/null
+++ b/packages/unified-react-native/src/unified-client-factory.ts
@@ -0,0 +1,152 @@
+import { createInstance as createAnalyticsInstance } from '@amplitude/analytics-react-native';
+import { ILogger, Logger, LogLevel, ReactNativeOptions } from '@amplitude/analytics-core';
+import { boot as bootEngagement, getPlugin } from '@amplitude/plugin-engagement-react-native';
+import { experimentPlugin } from '@amplitude/plugin-experiment-react-native';
+import type { ExperimentPlugin, ExperimentPluginConfig } from '@amplitude/plugin-experiment-react-native';
+import { SessionReplayConfig, SessionReplayPlugin } from '@amplitude/plugin-session-replay-react-native';
+import { libraryPlugin } from './library';
+import type { EngagementOptions, UnifiedClient, UnifiedOptions } from './types';
+
+type EngagementLogLevel = NonNullable;
+
+const toEngagementLogLevel = (logLevel: LogLevel): EngagementLogLevel => {
+ switch (logLevel) {
+ case LogLevel.None:
+ return 'none';
+ case LogLevel.Error:
+ return 'error';
+ case LogLevel.Warn:
+ return 'warn';
+ case LogLevel.Verbose:
+ return 'verbose';
+ case LogLevel.Debug:
+ return 'debug';
+ }
+};
+
+const getSharedAnalyticsOptions = (options?: UnifiedOptions): ReactNativeOptions => ({
+ ...(options?.serverZone === undefined ? {} : { serverZone: options.serverZone }),
+ ...(options?.instanceName === undefined ? {} : { instanceName: options.instanceName }),
+ ...(options?.logLevel === undefined ? {} : { logLevel: options.logLevel }),
+});
+
+const getSharedExperimentOptions = (options?: UnifiedOptions): ExperimentPluginConfig => ({
+ ...(options?.serverZone === undefined ? {} : { serverZone: options.serverZone }),
+ ...(options?.instanceName === undefined ? {} : { instanceName: options.instanceName }),
+});
+
+const getSharedSessionReplayOptions = (options?: UnifiedOptions): SessionReplayConfig => ({
+ ...(options?.logLevel === undefined ? {} : { logLevel: options.logLevel as SessionReplayConfig['logLevel'] }),
+});
+
+const getSharedEngagementOptions = (options?: UnifiedOptions): EngagementOptions => ({
+ ...(options?.serverZone === undefined ? {} : { serverZone: options.serverZone }),
+ ...(options?.logLevel === undefined ? {} : { logLevel: toEngagementLogLevel(options.logLevel) }),
+});
+
+const logInitializationError = (loggerProvider: ILogger, blade: string, error: unknown): void => {
+ try {
+ loggerProvider.error(`Failed to initialize ${blade}.`, error);
+ } catch {
+ // A customer-provided logger must not make a public SDK API throw.
+ }
+};
+
+/**
+ * Creates a unified client.
+ *
+ * Multiple unified clients are not isolated because the React Native Engagement plugin is a process-wide singleton.
+ * All clients share the first initialized Engagement plugin and its configuration.
+ */
+export const createInstance = (): UnifiedClient => {
+ const analyticsClient = createAnalyticsInstance();
+ let experiment: ExperimentPlugin | undefined;
+ let sessionReplay: SessionReplayPlugin | undefined;
+ let initPromise: Promise | undefined;
+
+ const init = (apiKey: string, unifiedOptions?: UnifiedOptions): Promise => {
+ if (initPromise) {
+ return initPromise;
+ }
+
+ initPromise = (async () => {
+ let loggerProvider: ILogger = new Logger();
+
+ try {
+ const analyticsOptions: ReactNativeOptions = {
+ ...getSharedAnalyticsOptions(unifiedOptions),
+ ...unifiedOptions?.analytics,
+ };
+ loggerProvider = analyticsOptions.loggerProvider ?? loggerProvider;
+ if (analyticsOptions.loggerProvider === undefined) {
+ loggerProvider.enable(analyticsOptions.logLevel ?? LogLevel.Warn);
+ }
+ analyticsOptions.loggerProvider = loggerProvider;
+
+ analyticsClient.add(libraryPlugin());
+ await analyticsClient.init(apiKey, analyticsOptions.userId, analyticsOptions).promise;
+ } catch (error) {
+ logInitializationError(loggerProvider, 'Analytics', error);
+ return;
+ }
+
+ const initExperiment = async (): Promise => {
+ try {
+ const initializedExperiment = experimentPlugin({
+ ...getSharedExperimentOptions(unifiedOptions),
+ ...unifiedOptions?.experiment,
+ });
+ await analyticsClient.add(initializedExperiment).promise;
+ experiment = initializedExperiment;
+
+ const experimentClient = initializedExperiment.experiment;
+ if (experimentClient === undefined) {
+ loggerProvider.debug(`${initializedExperiment.name} plugin is not initialized.`);
+ } else {
+ await experimentClient.start();
+ }
+ } catch (error) {
+ logInitializationError(loggerProvider, 'Experiment', error);
+ }
+ };
+
+ const initSessionReplay = async (): Promise => {
+ try {
+ const initializedSessionReplay = new SessionReplayPlugin({
+ ...getSharedSessionReplayOptions(unifiedOptions),
+ ...unifiedOptions?.sessionReplay,
+ });
+ await analyticsClient.add(initializedSessionReplay).promise;
+ sessionReplay = initializedSessionReplay;
+ } catch (error) {
+ logInitializationError(loggerProvider, 'Session Replay', error);
+ }
+ };
+
+ const initEngagement = async (): Promise => {
+ try {
+ // Engagement intentionally returns a process-wide singleton. Independent unified client instances are unsupported.
+ const engagement = getPlugin({
+ ...getSharedEngagementOptions(unifiedOptions),
+ ...unifiedOptions?.engagement,
+ });
+ await analyticsClient.add(engagement).promise;
+ await bootEngagement(analyticsClient.getUserId(), analyticsClient.getDeviceId());
+ } catch (error) {
+ logInitializationError(loggerProvider, 'Guides and Surveys', error);
+ }
+ };
+
+ await Promise.all([initExperiment(), initSessionReplay(), initEngagement()]);
+ })();
+
+ return initPromise;
+ };
+
+ return {
+ ...analyticsClient,
+ init,
+ experiment: () => experiment?.experiment,
+ sessionReplay: () => sessionReplay,
+ };
+};
diff --git a/packages/unified-react-native/src/version.ts b/packages/unified-react-native/src/version.ts
new file mode 100644
index 0000000000..4c93064aea
--- /dev/null
+++ b/packages/unified-react-native/src/version.ts
@@ -0,0 +1,2 @@
+// Autogenerated by `pnpm version-file`. DO NOT EDIT
+export const VERSION = '1.0.0-beta.0';
diff --git a/packages/unified-react-native/test/library.test.ts b/packages/unified-react-native/test/library.test.ts
new file mode 100644
index 0000000000..ad8da3a61f
--- /dev/null
+++ b/packages/unified-react-native/test/library.test.ts
@@ -0,0 +1,19 @@
+import { libraryPlugin } from '../src/library';
+import { VERSION } from '../src/version';
+
+test('adds the unified React Native library to events', async () => {
+ const plugin = libraryPlugin();
+ const event = { event_type: 'test', library: 'analytics-react-native/1.0.0' };
+
+ await expect(plugin.execute?.(event)).resolves.toMatchObject({
+ library: `amplitude-ts-unified-react-native/${VERSION}-analytics-react-native/1.0.0`,
+ });
+});
+
+test('handles events without an existing library', async () => {
+ const plugin = libraryPlugin();
+
+ await expect(plugin.execute?.({ event_type: 'test' })).resolves.toMatchObject({
+ library: `amplitude-ts-unified-react-native/${VERSION}-`,
+ });
+});
diff --git a/packages/unified-react-native/test/react-native-config.test.ts b/packages/unified-react-native/test/react-native-config.test.ts
new file mode 100644
index 0000000000..64c13c8bb9
--- /dev/null
+++ b/packages/unified-react-native/test/react-native-config.test.ts
@@ -0,0 +1,22 @@
+import path from 'path';
+
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const preset = require('../react-native.config') as {
+ dependencies: Record;
+};
+
+describe('React Native autolinking preset', () => {
+ test('exposes every transitive native dependency', () => {
+ expect(Object.keys(preset.dependencies).sort()).toEqual([
+ '@amplitude/analytics-react-native',
+ '@amplitude/experiment-react-native-client',
+ '@amplitude/plugin-engagement-react-native',
+ '@amplitude/plugin-session-replay-react-native',
+ '@react-native-async-storage/async-storage',
+ ]);
+ });
+
+ test.each(Object.entries(preset.dependencies))('resolves %s to its package root', (packageName, config) => {
+ expect(config.root).toBe(path.dirname(require.resolve(`${packageName}/package.json`)));
+ });
+});
diff --git a/packages/unified-react-native/test/unified-client-factory.test.ts b/packages/unified-react-native/test/unified-client-factory.test.ts
new file mode 100644
index 0000000000..1dfbc51815
--- /dev/null
+++ b/packages/unified-react-native/test/unified-client-factory.test.ts
@@ -0,0 +1,330 @@
+import type { ReactNativeClient } from '@amplitude/analytics-core';
+import { LogLevel } from '@amplitude/analytics-core';
+import { createInstance as createAnalyticsInstance } from '@amplitude/analytics-react-native';
+import { boot, getPlugin } from '@amplitude/plugin-engagement-react-native';
+import { experimentPlugin } from '@amplitude/plugin-experiment-react-native';
+import { SessionReplayPlugin } from '@amplitude/plugin-session-replay-react-native';
+import { createInstance } from '../src/unified-client-factory';
+
+jest.mock('@amplitude/analytics-react-native', () => ({
+ createInstance: jest.fn(),
+}));
+
+jest.mock('@amplitude/plugin-session-replay-react-native', () => ({
+ SessionReplayPlugin: jest.fn().mockImplementation((config) => ({
+ name: 'session-replay',
+ config,
+ sessionReplayConfig: { autoStart: config?.autoStart ?? true },
+ start: jest.fn(() => Promise.resolve()),
+ })),
+}));
+
+jest.mock('@amplitude/plugin-engagement-react-native', () => ({
+ boot: jest.fn(() => Promise.resolve()),
+ getPlugin: jest.fn().mockImplementation((config) => ({ name: 'engagement', config })),
+}));
+
+jest.mock('@amplitude/plugin-experiment-react-native', () => ({
+ experimentPlugin: jest.fn().mockImplementation((config) => ({
+ name: 'experiment',
+ config,
+ experiment: { start: jest.fn(), variant: jest.fn() },
+ })),
+}));
+
+const mockCreateAnalyticsInstance = createAnalyticsInstance as jest.MockedFunction;
+const mockBoot = boot as jest.MockedFunction;
+const mockGetPlugin = getPlugin as jest.MockedFunction;
+const mockExperimentPlugin = experimentPlugin as jest.MockedFunction;
+const MockSessionReplayPlugin = SessionReplayPlugin as jest.MockedClass;
+
+const returnValue = (value?: T) => ({ promise: Promise.resolve(value) });
+const createLoggerProvider = () => ({
+ debug: jest.fn(),
+ disable: jest.fn(),
+ enable: jest.fn(),
+ error: jest.fn(),
+ log: jest.fn(),
+ warn: jest.fn(),
+});
+
+describe('createInstance', () => {
+ const add = jest.fn(() => returnValue());
+ const remove = jest.fn(() => returnValue());
+ const analyticsInit = jest.fn(() => returnValue());
+ const analyticsClient = {
+ add,
+ init: analyticsInit,
+ remove,
+ getUserId: jest.fn(() => 'user-id'),
+ getDeviceId: jest.fn(() => 'device-id'),
+ } as unknown as ReactNativeClient;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ mockCreateAnalyticsInstance.mockReturnValue(analyticsClient);
+ });
+
+ test('initializes analytics, Experiment, Session Replay, and Guides and Surveys', async () => {
+ const client = createInstance();
+
+ expect(client.experiment()).toBeUndefined();
+ expect(client.sessionReplay()).toBeUndefined();
+
+ await client.init('api-key', {
+ serverZone: 'EU',
+ instanceName: 'app',
+ logLevel: LogLevel.Debug,
+ analytics: { userId: 'user-id' },
+ sessionReplay: { sampleRate: 0.5 },
+ experiment: { deploymentKey: 'deployment-key' },
+ engagement: { locale: 'fr-FR' },
+ });
+
+ expect(analyticsInit).toHaveBeenCalledWith(
+ 'api-key',
+ 'user-id',
+ expect.objectContaining({
+ serverZone: 'EU',
+ instanceName: 'app',
+ logLevel: LogLevel.Debug,
+ userId: 'user-id',
+ }),
+ );
+ expect(mockExperimentPlugin).toHaveBeenCalledWith({
+ serverZone: 'EU',
+ instanceName: 'app',
+ deploymentKey: 'deployment-key',
+ });
+ expect(MockSessionReplayPlugin).toHaveBeenCalledWith({ logLevel: LogLevel.Debug, sampleRate: 0.5 });
+ const sessionReplayStart = (client.sessionReplay() as unknown as { start: jest.Mock }).start;
+ expect(sessionReplayStart).not.toHaveBeenCalled();
+ expect(mockGetPlugin).toHaveBeenCalledWith({ serverZone: 'EU', logLevel: 'debug', locale: 'fr-FR' });
+ expect(mockBoot).toHaveBeenCalledWith('user-id', 'device-id');
+ const experimentStart = (client.experiment() as unknown as { start: jest.Mock }).start;
+ expect(experimentStart).toHaveBeenCalledTimes(1);
+ expect(add).toHaveBeenCalledTimes(4);
+ expect(client.experiment()).toBeDefined();
+ expect(client.sessionReplay()).toBeDefined();
+ });
+
+ test('lets blade options override shared defaults', async () => {
+ const client = createInstance();
+
+ await client.init('api-key', {
+ serverZone: 'US',
+ instanceName: 'shared-instance',
+ logLevel: LogLevel.Debug,
+ analytics: { serverZone: 'EU', instanceName: 'analytics-instance', logLevel: LogLevel.Error },
+ sessionReplay: { logLevel: LogLevel.Warn },
+ experiment: { serverZone: 'EU', instanceName: 'experiment-instance' },
+ engagement: { serverZone: 'EU', logLevel: 'verbose' },
+ });
+
+ expect(analyticsInit).toHaveBeenCalledWith(
+ 'api-key',
+ undefined,
+ expect.objectContaining({ serverZone: 'EU', instanceName: 'analytics-instance', logLevel: LogLevel.Error }),
+ );
+ expect(mockExperimentPlugin).toHaveBeenCalledWith({ serverZone: 'EU', instanceName: 'experiment-instance' });
+ expect(MockSessionReplayPlugin).toHaveBeenCalledWith({ logLevel: LogLevel.Warn });
+ expect(mockGetPlugin).toHaveBeenCalledWith({ serverZone: 'EU', logLevel: 'verbose' });
+ });
+
+ test('logs when the Experiment plugin does not expose a client', async () => {
+ mockExperimentPlugin.mockReturnValueOnce({ name: 'experiment' } as ReturnType);
+ const loggerProvider = createLoggerProvider();
+ const client = createInstance();
+
+ await client.init('api-key', { analytics: { loggerProvider } });
+
+ expect(loggerProvider.debug).toHaveBeenCalledWith('experiment plugin is not initialized.');
+ expect(client.experiment()).toBeUndefined();
+ });
+
+ test.each([
+ [LogLevel.None, 'none'],
+ [LogLevel.Error, 'error'],
+ [LogLevel.Warn, 'warn'],
+ [LogLevel.Verbose, 'verbose'],
+ [LogLevel.Debug, 'debug'],
+ ])('translates shared log level %s for Guides and Surveys', async (logLevel, engagementLogLevel) => {
+ const client = createInstance();
+
+ await client.init('api-key', { logLevel });
+
+ expect(mockGetPlugin).toHaveBeenCalledWith({ logLevel: engagementLogLevel });
+ });
+
+ test('supports initialization without options', async () => {
+ const client = createInstance();
+
+ await client.init('api-key');
+
+ expect(analyticsInit).toHaveBeenCalledWith(
+ 'api-key',
+ undefined,
+ expect.objectContaining({ loggerProvider: expect.anything() }),
+ );
+ expect(mockExperimentPlugin).toHaveBeenCalledWith({});
+ expect(MockSessionReplayPlugin).toHaveBeenCalledWith({});
+ expect(mockGetPlugin).toHaveBeenCalledWith({});
+ });
+
+ test('does not reinitialize SDKs on sequential initialization', async () => {
+ const client = createInstance();
+
+ await client.init('first-api-key');
+ const sessionReplay = client.sessionReplay();
+ const experiment = client.experiment();
+ await client.init('second-api-key', { sessionReplay: { sampleRate: 0 } });
+
+ expect(analyticsInit).toHaveBeenCalledTimes(1);
+ expect(mockExperimentPlugin).toHaveBeenCalledTimes(1);
+ expect(MockSessionReplayPlugin).toHaveBeenCalledTimes(1);
+ expect(MockSessionReplayPlugin).toHaveBeenCalledWith({});
+ expect(mockGetPlugin).toHaveBeenCalledTimes(1);
+ expect(client.sessionReplay()).toBe(sessionReplay);
+ expect(client.experiment()).toBe(experiment);
+ });
+
+ test('initializes blade plugins concurrently after Analytics is ready', async () => {
+ let finishAnalyticsSetup: (() => void) | undefined;
+ let finishExperimentSetup: (() => void) | undefined;
+ analyticsInit.mockReturnValueOnce({
+ promise: new Promise((resolve) => {
+ finishAnalyticsSetup = resolve;
+ }),
+ });
+ add
+ .mockImplementationOnce(() => returnValue())
+ .mockImplementationOnce(() => ({
+ promise: new Promise((resolve) => {
+ finishExperimentSetup = resolve;
+ }),
+ }));
+ const client = createInstance();
+
+ const initialization = client.init('api-key');
+ await Promise.resolve();
+
+ expect(add).toHaveBeenCalledTimes(1);
+ expect(mockExperimentPlugin).not.toHaveBeenCalled();
+ expect(MockSessionReplayPlugin).not.toHaveBeenCalled();
+ expect(mockGetPlugin).not.toHaveBeenCalled();
+
+ finishAnalyticsSetup?.();
+ await Promise.resolve();
+ await Promise.resolve();
+
+ expect(add).toHaveBeenCalledTimes(4);
+ expect(MockSessionReplayPlugin).toHaveBeenCalledTimes(1);
+ expect(mockGetPlugin).toHaveBeenCalledTimes(1);
+
+ finishExperimentSetup?.();
+ await initialization;
+ });
+
+ test('logs an Experiment failure, continues the remaining blades, and does not retry', async () => {
+ const error = new Error('Experiment setup failed.');
+ add
+ .mockImplementationOnce(() => returnValue())
+ .mockImplementationOnce(() => ({
+ promise: Promise.reject(error),
+ }));
+ const loggerProvider = createLoggerProvider();
+ const client = createInstance();
+
+ const first = client.init('api-key', { analytics: { loggerProvider } });
+ await expect(first).resolves.toBeUndefined();
+ const second = client.init('another-api-key');
+
+ expect(second).toBe(first);
+ await expect(second).resolves.toBeUndefined();
+ expect(loggerProvider.error).toHaveBeenCalledWith('Failed to initialize Experiment.', error);
+ expect(analyticsInit).toHaveBeenCalledTimes(1);
+ expect(remove).not.toHaveBeenCalled();
+ expect(mockExperimentPlugin).toHaveBeenCalledTimes(1);
+ expect(MockSessionReplayPlugin).toHaveBeenCalledTimes(1);
+ expect(mockGetPlugin).toHaveBeenCalledTimes(1);
+ expect(client.experiment()).toBeUndefined();
+ expect(client.sessionReplay()).toBeDefined();
+ });
+
+ test('logs an Analytics failure without initializing dependent blades or rejecting', async () => {
+ const error = new Error('Analytics setup failed.');
+ analyticsInit.mockReturnValueOnce({ promise: Promise.reject(error) });
+ const loggerProvider = createLoggerProvider();
+ const client = createInstance();
+
+ await expect(client.init('api-key', { analytics: { loggerProvider } })).resolves.toBeUndefined();
+
+ expect(loggerProvider.error).toHaveBeenCalledWith('Failed to initialize Analytics.', error);
+ expect(mockExperimentPlugin).not.toHaveBeenCalled();
+ expect(MockSessionReplayPlugin).not.toHaveBeenCalled();
+ expect(mockGetPlugin).not.toHaveBeenCalled();
+ });
+
+ test('logs a Session Replay failure and continues Guides and Surveys without rejecting', async () => {
+ const error = new Error('Session Replay setup failed.');
+ add
+ .mockImplementationOnce(() => returnValue())
+ .mockImplementationOnce(() => returnValue())
+ .mockImplementationOnce(() => ({ promise: Promise.reject(error) }));
+ const loggerProvider = createLoggerProvider();
+ const client = createInstance();
+
+ await expect(client.init('api-key', { analytics: { loggerProvider } })).resolves.toBeUndefined();
+
+ expect(loggerProvider.error).toHaveBeenCalledWith('Failed to initialize Session Replay.', error);
+ expect(client.experiment()).toBeDefined();
+ expect(client.sessionReplay()).toBeUndefined();
+ expect(mockGetPlugin).toHaveBeenCalledTimes(1);
+ expect(mockBoot).toHaveBeenCalledTimes(1);
+ });
+
+ test('logs a Guides and Surveys failure without rejecting', async () => {
+ const error = new Error('Guides and Surveys boot failed.');
+ mockBoot.mockRejectedValueOnce(error);
+ const loggerProvider = createLoggerProvider();
+ const client = createInstance();
+
+ await expect(client.init('api-key', { analytics: { loggerProvider } })).resolves.toBeUndefined();
+
+ expect(loggerProvider.error).toHaveBeenCalledWith('Failed to initialize Guides and Surveys.', error);
+ expect(client.experiment()).toBeDefined();
+ expect(client.sessionReplay()).toBeDefined();
+ });
+
+ test('does not reject when a customer logger throws while reporting an initialization error', async () => {
+ analyticsInit.mockReturnValueOnce({ promise: Promise.reject(new Error('Analytics setup failed.')) });
+ const loggerProvider = createLoggerProvider();
+ loggerProvider.error.mockImplementationOnce(() => {
+ throw new Error('Logger failed.');
+ });
+ const client = createInstance();
+
+ await expect(client.init('api-key', { analytics: { loggerProvider } })).resolves.toBeUndefined();
+ });
+
+ test('shares one initialization with concurrent callers', async () => {
+ let finishInit: (() => void) | undefined;
+ analyticsInit.mockReturnValueOnce({
+ promise: new Promise((resolve) => {
+ finishInit = resolve;
+ }),
+ });
+ const client = createInstance();
+
+ const first = client.init('api-key');
+ const second = client.init('api-key');
+ await Promise.resolve();
+
+ expect(analyticsInit).toHaveBeenCalledTimes(1);
+ finishInit?.();
+ await Promise.all([first, second]);
+ expect(MockSessionReplayPlugin).toHaveBeenCalledTimes(1);
+ expect(mockExperimentPlugin).toHaveBeenCalledTimes(1);
+ expect(mockGetPlugin).toHaveBeenCalledTimes(1);
+ });
+});
diff --git a/packages/unified-react-native/tsconfig.build.json b/packages/unified-react-native/tsconfig.build.json
new file mode 100644
index 0000000000..0d205f3053
--- /dev/null
+++ b/packages/unified-react-native/tsconfig.build.json
@@ -0,0 +1,4 @@
+{
+ "extends": "./tsconfig",
+ "exclude": ["test", "lib"]
+}
diff --git a/packages/unified-react-native/tsconfig.json b/packages/unified-react-native/tsconfig.json
new file mode 100644
index 0000000000..60bcc389bc
--- /dev/null
+++ b/packages/unified-react-native/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "paths": {
+ "@amplitude/unified-react-native": ["./src/index"]
+ },
+ "allowUnreachableCode": false,
+ "allowUnusedLabels": false,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "jsx": "react",
+ "lib": ["esnext", "dom"],
+ "module": "esnext",
+ "moduleResolution": "node",
+ "noStrictGenericChecks": false,
+ "skipLibCheck": true,
+ "target": "es6"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 77c1a8b258..7d2e4ddc86 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -230,6 +230,70 @@ importers:
specifier: ^4.9.4
version: 4.9.5
+ examples/unified/react-native-app:
+ dependencies:
+ '@amplitude/unified-react-native':
+ specifier: workspace:*
+ version: link:../../../packages/unified-react-native
+ react:
+ specifier: 18.3.1
+ version: 18.3.1
+ react-native:
+ specifier: 0.76.9
+ version: 0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1)
+ devDependencies:
+ '@babel/core':
+ specifier: ^7.20.0
+ version: 7.28.5
+ '@babel/preset-env':
+ specifier: ^7.20.0
+ version: 7.28.5(@babel/core@7.28.5)
+ '@babel/runtime':
+ specifier: ^7.20.0
+ version: 7.28.4
+ '@react-native-community/cli':
+ specifier: 13.6.6
+ version: 13.6.6(encoding@0.1.13)
+ '@react-native-community/cli-platform-android':
+ specifier: 13.6.6
+ version: 13.6.6(encoding@0.1.13)
+ '@react-native/babel-preset':
+ specifier: 0.76.9
+ version: 0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))
+ '@react-native/codegen':
+ specifier: 0.76.9
+ version: 0.76.9(@babel/preset-env@7.28.5(@babel/core@7.28.5))
+ '@react-native/eslint-config':
+ specifier: 0.74.83
+ version: 0.74.83(eslint@8.57.1)(jest@29.7.0(@types/node@18.19.130)(ts-node@10.9.2(@types/node@18.19.130)(typescript@4.9.5)))(prettier@2.8.8)(typescript@4.9.5)
+ '@react-native/gradle-plugin':
+ specifier: 0.76.9
+ version: 0.76.9
+ '@react-native/metro-config':
+ specifier: 0.76.9
+ version: 0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))
+ '@react-native/typescript-config':
+ specifier: 0.74.83
+ version: 0.74.83
+ '@types/react':
+ specifier: ^18.2.6
+ version: 18.3.26
+ babel-plugin-transform-inline-environment-variables:
+ specifier: ^0.4.4
+ version: 0.4.4
+ dotenv:
+ specifier: ^16.4.7
+ version: 16.6.1
+ eslint:
+ specifier: ^8.19.0
+ version: 8.57.1
+ prettier:
+ specifier: 2.8.8
+ version: 2.8.8
+ typescript:
+ specifier: ^4.9.4
+ version: 4.9.5
+
packages/analytics-browser:
dependencies:
'@amplitude/analytics-core':
@@ -1159,6 +1223,43 @@ importers:
specifier: ^2.80.0
version: 2.80.0
+ packages/unified-react-native:
+ dependencies:
+ '@amplitude/analytics-core':
+ specifier: workspace:*
+ version: link:../analytics-core
+ '@amplitude/analytics-react-native':
+ specifier: workspace:*
+ version: link:../analytics-react-native
+ '@amplitude/experiment-react-native-client':
+ specifier: ^1.8.0
+ version: 1.8.0(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)
+ '@amplitude/plugin-engagement-react-native':
+ specifier: ^3.11.0
+ version: 3.12.1(@react-native-async-storage/async-storage@2.2.0(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1)))(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)
+ '@amplitude/plugin-experiment-react-native':
+ specifier: workspace:*
+ version: link:../plugin-experiment-react-native
+ '@amplitude/plugin-session-replay-react-native':
+ specifier: workspace:*
+ version: link:../plugin-session-replay-react-native
+ '@react-native-async-storage/async-storage':
+ specifier: ^2.1.2
+ version: 2.2.0(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1))
+ tslib:
+ specifier: ^2.4.1
+ version: 2.8.1
+ devDependencies:
+ react:
+ specifier: 18.3.1
+ version: 18.3.1
+ react-native:
+ specifier: 0.76.9
+ version: 0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1)
+ react-native-builder-bob:
+ specifier: ^0.20.3
+ version: 0.20.4
+
packages:
'@amplitude/analytics-browser@2.44.1':
resolution:
@@ -1214,6 +1315,13 @@ packages:
resolution:
{ integrity: sha512-T4jyad4BBfpU/x21Vf2U6JeHA9n14bil4+46CI1tK4OijZX4ZpKfPaw+T2gzG0BreX87o7kUVs1O5kM6Z6K3ZA== }
+ '@amplitude/plugin-engagement-react-native@3.12.1':
+ resolution: {integrity: sha512-RYDMDMNQfIv7zWwkFp8uDCaUp65SH782EJA8B0na9JldUISYrM4s2bZfNTN+8cllutB1aHjwl/gqjrJNnHzaYw==}
+ peerDependencies:
+ '@react-native-async-storage/async-storage': ^2.1.2
+ react: '*'
+ react-native: '*'
+
'@amplitude/plugin-event-property-attribution-browser@0.2.3':
resolution:
{ integrity: sha512-OcHZPoZNHlAZAuVSwzflvGB7k0ebVpY+TVhUjo3+a9WZRtot5KoqQuveRZPGAVK1BbRvlZntCReHjNnlYsP8+g== }
@@ -3947,6 +4055,11 @@ packages:
peerDependencies:
react-native: ^0.0.0-0 || >=0.60 <1.0
+ '@react-native-async-storage/async-storage@2.2.0':
+ resolution: {integrity: sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==}
+ peerDependencies:
+ react-native: ^0.0.0-0 || >=0.65 <1.0
+
'@react-native-community/cli-clean@12.1.1':
resolution:
{ integrity: sha512-lbEQJ9xO8DmNbES7nFcGIQC0Q15e9q1zwKfkN2ty2eM93ZTFqYzOwsddlNoRN9FO7diakMWoWgielhcfcIeIrQ== }
@@ -12795,6 +12908,15 @@ snapshots:
react-native: 0.73.0(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(encoding@0.1.13)(react@18.2.0)
unfetch: 4.2.0
+ '@amplitude/experiment-react-native-client@1.8.0(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@amplitude/analytics-connector': 1.6.4
+ '@amplitude/experiment-core': 0.11.1
+ '@react-native-async-storage/async-storage': 1.24.0(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1))
+ react: 18.3.1
+ react-native: 0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1)
+ unfetch: 4.2.0
+
'@amplitude/plugin-autocapture-browser@1.27.4':
dependencies:
'@amplitude/analytics-core': 2.50.0
@@ -12805,6 +12927,13 @@ snapshots:
'@amplitude/analytics-core': 2.50.0
tslib: 2.8.1
+ '@amplitude/plugin-engagement-react-native@3.12.1(@react-native-async-storage/async-storage@2.2.0(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1)))(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@amplitude/analytics-core': 2.50.0
+ '@react-native-async-storage/async-storage': 2.2.0(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1))
+ react: 18.3.1
+ react-native: 0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1)
+
'@amplitude/plugin-event-property-attribution-browser@0.2.3':
dependencies:
'@amplitude/analytics-core': 2.50.0
@@ -15736,6 +15865,11 @@ snapshots:
merge-options: 3.0.4
react-native: 0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1)
+ '@react-native-async-storage/async-storage@2.2.0(react-native@0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1))':
+ dependencies:
+ merge-options: 3.0.4
+ react-native: 0.76.9(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@react-native-community/cli@13.6.6(encoding@0.1.13))(@types/react@18.3.26)(encoding@0.1.13)(react@18.3.1)
+
'@react-native-community/cli-clean@12.1.1(encoding@0.1.13)':
dependencies:
'@react-native-community/cli-tools': 12.1.1(encoding@0.1.13)
@@ -15836,7 +15970,7 @@ snapshots:
semver: 7.7.3
strip-ansi: 5.2.0
wcwidth: 1.0.1
- yaml: 2.8.1
+ yaml: 2.9.0
transitivePeerDependencies:
- encoding
@@ -15858,7 +15992,7 @@ snapshots:
semver: 7.7.3
strip-ansi: 5.2.0
wcwidth: 1.0.1
- yaml: 2.8.1
+ yaml: 2.9.0
transitivePeerDependencies:
- encoding
@@ -16923,9 +17057,7 @@ snapshots:
transitivePeerDependencies:
- '@babel/core'
- '@babel/preset-env'
- - bufferutil
- supports-color
- - utf-8-validate
'@react-native/normalize-color@2.0.0': {}
@@ -18060,7 +18192,7 @@ snapshots:
acorn-globals@7.0.1:
dependencies:
- acorn: 8.15.0
+ acorn: 8.16.0
acorn-walk: 8.3.4
acorn-jsx@5.3.2(acorn@8.16.0):
@@ -18069,7 +18201,7 @@ snapshots:
acorn-walk@8.3.4:
dependencies:
- acorn: 8.15.0
+ acorn: 8.16.0
acorn@8.15.0: {}
@@ -18185,9 +18317,9 @@ snapshots:
array.prototype.findlast@1.2.5:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
es-errors: 1.3.0
es-object-atoms: 1.1.1
es-shim-unscopables: 1.1.0
@@ -18218,9 +18350,9 @@ snapshots:
array.prototype.tosorted@1.1.4:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
es-errors: 1.3.0
es-shim-unscopables: 1.1.0
@@ -19313,7 +19445,7 @@ snapshots:
has-property-descriptors: 1.0.2
has-proto: 1.2.0
has-symbols: 1.1.0
- hasown: 2.0.2
+ hasown: 2.0.4
internal-slot: 1.1.0
is-array-buffer: 3.0.5
is-callable: 1.2.7
@@ -19604,7 +19736,7 @@ snapshots:
es-iterator-helpers: 1.3.2
eslint: 8.57.1
estraverse: 5.3.0
- hasown: 2.0.2
+ hasown: 2.0.4
jsx-ast-utils: 3.3.5
minimatch: 3.1.2
object.entries: 1.1.9
@@ -20914,7 +21046,7 @@ snapshots:
strip-json-comments: 3.1.1
optionalDependencies:
'@types/node': 18.19.130
- ts-node: 10.9.2(@types/node@20.5.1)(typescript@4.9.5)
+ ts-node: 10.9.2(@types/node@18.19.130)(typescript@4.9.5)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
@@ -23091,7 +23223,7 @@ snapshots:
object.entries@1.1.9:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
es-object-atoms: 1.1.1
@@ -24593,10 +24725,10 @@ snapshots:
string.prototype.matchall@4.0.12:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
es-errors: 1.3.0
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
@@ -24610,7 +24742,7 @@ snapshots:
string.prototype.repeat@1.0.0:
dependencies:
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
string.prototype.trim@1.2.10:
dependencies:
@@ -24861,6 +24993,25 @@ snapshots:
babel-jest: 29.7.0(@babel/core@7.28.5)
jest-util: 30.4.1
+ ts-node@10.9.2(@types/node@18.19.130)(typescript@4.9.5):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.12
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 18.19.130
+ acorn: 8.16.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 4.9.5
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ optional: true
+
ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5):
dependencies:
'@cspotcode/source-map-support': 0.8.1
@@ -24869,7 +25020,7 @@ snapshots:
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
'@types/node': 20.5.1
- acorn: 8.15.0
+ acorn: 8.16.0
acorn-walk: 8.3.4
arg: 4.1.3
create-require: 1.1.1
@@ -24887,7 +25038,7 @@ snapshots:
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
'@types/node': 24.10.1
- acorn: 8.15.0
+ acorn: 8.16.0
acorn-walk: 8.3.4
arg: 4.1.3
create-require: 1.1.1
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 3e2ba83e2d..938e6ab885 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -2,6 +2,7 @@ packages:
- packages/*
- apps/*
- examples/react-native/app
+ - examples/unified/react-native-app
blockExoticSubdeps: true