From 9e3931e058fef52d37b1e662ee97303cd2a08e9f Mon Sep 17 00:00:00 2001 From: Joel Arvidsson Date: Wed, 5 Oct 2022 17:47:39 +0200 Subject: [PATCH 1/2] Upgrade Example app to react-native 0.70 --- Example/.bundle/config | 2 + Example/.flowconfig | 20 +- Example/.gitattributes | 1 - Example/.gitignore | 13 +- Example/.node-version | 1 + Example/.ruby-version | 1 + Example/Gemfile | 6 + Example/Gemfile.lock | 100 +++ Example/android/app/build.gradle | 134 +++- .../android/app/src/debug/AndroidManifest.xml | 7 +- .../java/com/example/ReactNativeFlipper.java | 5 +- .../android/app/src/main/AndroidManifest.xml | 7 +- .../main/java/com/example/MainActivity.java | 33 + .../java/com/example/MainApplication.java | 13 +- .../MainApplicationReactNativeHost.java | 116 +++ .../components/MainComponentsRegistry.java | 36 + ...ApplicationTurboModuleManagerDelegate.java | 48 ++ .../android/app/src/main/jni/CMakeLists.txt | 7 + .../jni/MainApplicationModuleProvider.cpp | 32 + .../main/jni/MainApplicationModuleProvider.h | 16 + ...nApplicationTurboModuleManagerDelegate.cpp | 45 ++ ...ainApplicationTurboModuleManagerDelegate.h | 38 + .../src/main/jni/MainComponentsRegistry.cpp | 65 ++ .../app/src/main/jni/MainComponentsRegistry.h | 32 + Example/android/app/src/main/jni/OnLoad.cpp | 11 + .../res/drawable/rn_edit_text_material.xml | 36 + .../app/src/main/res/values/styles.xml | 4 +- Example/android/build.gradle | 33 +- Example/android/gradle.properties | 18 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 55616 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- Example/android/gradlew | 260 ++++--- Example/android/gradlew.bat | 25 +- Example/android/settings.gradle | 8 + Example/ios/.xcode.env | 11 + Example/ios/Example-tvOS/Info.plist | 53 -- Example/ios/Example-tvOSTests/Info.plist | 24 - Example/ios/Example.xcodeproj/project.pbxproj | 490 ++++--------- .../xcschemes/Example-tvOS.xcscheme | 88 --- .../xcshareddata/xcschemes/Example.xcscheme | 2 +- Example/ios/Example/AppDelegate.m | 58 -- Example/ios/Example/AppDelegate.mm | 133 ++++ .../ios/Example/Base.lproj/LaunchScreen.xib | 42 -- .../AppIcon.appiconset/Contents.json | 45 +- Example/ios/Example/Info.plist | 2 - Example/ios/Example/LaunchScreen.storyboard | 47 ++ Example/ios/Example/main.m | 3 +- Example/ios/ExampleTests/ExampleTests.m | 27 +- Example/ios/Podfile | 98 +-- Example/ios/Podfile.lock | 684 +++++++++++------- Example/metro.config.js | 2 +- Example/package.json | 23 +- package.json | 4 +- react-native-shimmer.podspec | 2 +- 54 files changed, 1800 insertions(+), 1213 deletions(-) create mode 100644 Example/.bundle/config delete mode 100644 Example/.gitattributes create mode 100644 Example/.node-version create mode 100644 Example/.ruby-version create mode 100644 Example/Gemfile create mode 100644 Example/Gemfile.lock create mode 100644 Example/android/app/src/main/java/com/example/newarchitecture/MainApplicationReactNativeHost.java create mode 100644 Example/android/app/src/main/java/com/example/newarchitecture/components/MainComponentsRegistry.java create mode 100644 Example/android/app/src/main/java/com/example/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java create mode 100644 Example/android/app/src/main/jni/CMakeLists.txt create mode 100644 Example/android/app/src/main/jni/MainApplicationModuleProvider.cpp create mode 100644 Example/android/app/src/main/jni/MainApplicationModuleProvider.h create mode 100644 Example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp create mode 100644 Example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h create mode 100644 Example/android/app/src/main/jni/MainComponentsRegistry.cpp create mode 100644 Example/android/app/src/main/jni/MainComponentsRegistry.h create mode 100644 Example/android/app/src/main/jni/OnLoad.cpp create mode 100644 Example/android/app/src/main/res/drawable/rn_edit_text_material.xml create mode 100644 Example/ios/.xcode.env delete mode 100644 Example/ios/Example-tvOS/Info.plist delete mode 100644 Example/ios/Example-tvOSTests/Info.plist delete mode 100644 Example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example-tvOS.xcscheme delete mode 100644 Example/ios/Example/AppDelegate.m create mode 100644 Example/ios/Example/AppDelegate.mm delete mode 100644 Example/ios/Example/Base.lproj/LaunchScreen.xib create mode 100644 Example/ios/Example/LaunchScreen.storyboard diff --git a/Example/.bundle/config b/Example/.bundle/config new file mode 100644 index 0000000..848943b --- /dev/null +++ b/Example/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/Example/.flowconfig b/Example/.flowconfig index 786366c..3782e44 100644 --- a/Example/.flowconfig +++ b/Example/.flowconfig @@ -8,13 +8,11 @@ ; Ignore polyfills node_modules/react-native/Libraries/polyfills/.* -; These should not be required directly -; require from fbjs/lib instead: require('fbjs/lib/warning') -node_modules/warning/.* - ; Flow doesn't support platforms .*/Libraries/Utilities/LoadingView.js +.*/node_modules/resolve/test/resolver/malformed_package_json/package\.json$ + [untyped] .*/node_modules/@react-native-community/cli/.*/.* @@ -27,8 +25,9 @@ node_modules/react-native/flow/ [options] emoji=true -esproposal.optional_chaining=enable -esproposal.nullish_coalescing=enable +exact_by_default=true + +format.bracket_spacing=false module.file_ext=.js module.file_ext=.json @@ -44,10 +43,6 @@ suppress_type=$FlowFixMe suppress_type=$FlowFixMeProps suppress_type=$FlowFixMeState -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+ -suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError - [lints] sketchy-null-number=warn sketchy-null-mixed=warn @@ -56,10 +51,7 @@ untyped-type-import=warn nonstrict-import=warn deprecated-type=warn unsafe-getters-setters=warn -inexact-spread=warn unnecessary-invariant=warn -signature-verification-failure=warn -deprecated-utility=error [strict] deprecated-type @@ -71,4 +63,4 @@ untyped-import untyped-type-import [version] -^0.113.0 +^0.182.0 diff --git a/Example/.gitattributes b/Example/.gitattributes deleted file mode 100644 index d42ff18..0000000 --- a/Example/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.pbxproj -text diff --git a/Example/.gitignore b/Example/.gitignore index ad572e6..2423126 100644 --- a/Example/.gitignore +++ b/Example/.gitignore @@ -20,6 +20,7 @@ DerivedData *.hmap *.ipa *.xcuserstate +ios/.xcode.env.local # Android/IntelliJ # @@ -28,6 +29,8 @@ build/ .gradle local.properties *.iml +*.hprof +.cxx/ # node.js # @@ -48,12 +51,14 @@ buck-out/ # 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/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output # Bundle artifact *.jsbundle -# CocoaPods +# Ruby / CocoaPods /ios/Pods/ +/vendor/bundle/ diff --git a/Example/.node-version b/Example/.node-version new file mode 100644 index 0000000..b6a7d89 --- /dev/null +++ b/Example/.node-version @@ -0,0 +1 @@ +16 diff --git a/Example/.ruby-version b/Example/.ruby-version new file mode 100644 index 0000000..a603bb5 --- /dev/null +++ b/Example/.ruby-version @@ -0,0 +1 @@ +2.7.5 diff --git a/Example/Gemfile b/Example/Gemfile new file mode 100644 index 0000000..5efda89 --- /dev/null +++ b/Example/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby '2.7.5' + +gem 'cocoapods', '~> 1.11', '>= 1.11.2' diff --git a/Example/Gemfile.lock b/Example/Gemfile.lock new file mode 100644 index 0000000..795c801 --- /dev/null +++ b/Example/Gemfile.lock @@ -0,0 +1,100 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.5) + rexml + activesupport (6.1.7) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + claide (1.1.0) + cocoapods (1.11.3) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.11.3) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 1.4.0, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.4.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 1.0, < 3.0) + xcodeproj (>= 1.21.0, < 2.0) + cocoapods-core (1.11.3) + activesupport (>= 5.0, < 7) + 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 (1.6.3) + 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.1.10) + escape (0.0.4) + ethon (0.15.0) + ffi (>= 1.15.0) + ffi (1.15.5) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.8.3) + i18n (1.12.0) + concurrent-ruby (~> 1.0) + json (2.6.2) + minitest (5.16.3) + molinillo (0.8.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + public_suffix (4.0.7) + rexml (3.2.5) + ruby-macho (2.5.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.5) + concurrent-ruby (~> 1.0) + xcodeproj (1.22.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + zeitwerk (2.6.1) + +PLATFORMS + arm64-darwin-21 + +DEPENDENCIES + cocoapods (~> 1.11, >= 1.11.2) + +RUBY VERSION + ruby 2.7.5p203 + +BUNDLED WITH + 2.2.27 diff --git a/Example/android/app/build.gradle b/Example/android/app/build.gradle index 0b41e92..374e427 100644 --- a/Example/android/app/build.gradle +++ b/Example/android/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: "com.android.application" import com.android.build.OutputFile +import org.apache.tools.ant.taskdefs.condition.Os /** * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets @@ -20,7 +21,7 @@ import com.android.build.OutputFile * // default. Can be overridden with ENTRY_FILE environment variable. * entryFile: "index.android.js", * - * // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format + * // https://reactnative.dev/docs/performance#enable-the-ram-format * bundleCommand: "ram-bundle", * * // whether to bundle JS and assets in debug mode @@ -78,7 +79,7 @@ import com.android.build.OutputFile */ project.ext.react = [ - enableHermes: false, // clean and rebuild if changing + enableHermes: true, // clean and rebuild if changing ] apply from: "../../node_modules/react-native/react.gradle" @@ -114,19 +115,24 @@ def jscFlavor = 'org.webkit:android-jsc:+' /** * Whether to enable the Hermes VM. * - * This should be set on project.ext.react and mirrored here. If it is not set + * This should be set on project.ext.react and that value will be read here. If it is not set * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode * and the benefits of using Hermes will therefore be sharply reduced. */ def enableHermes = project.ext.react.get("enableHermes", false); +/** + * Architectures to build native code for. + */ +def reactNativeArchitectures() { + def value = project.getProperties().get("reactNativeArchitectures") + return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] +} + android { - compileSdkVersion rootProject.ext.compileSdkVersion + ndkVersion rootProject.ext.ndkVersion - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } + compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { applicationId "com.example" @@ -134,13 +140,74 @@ android { targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" + buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() + + if (isNewArchitectureEnabled()) { + // We configure the CMake build only if you decide to opt-in for the New Architecture. + externalNativeBuild { + cmake { + arguments "-DPROJECT_BUILD_DIR=$buildDir", + "-DREACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid", + "-DREACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build", + "-DNODE_MODULES_DIR=$rootDir/../node_modules", + "-DANDROID_STL=c++_shared" + } + } + if (!enableSeparateBuildPerCPUArchitecture) { + ndk { + abiFilters (*reactNativeArchitectures()) + } + } + } } + + if (isNewArchitectureEnabled()) { + // We configure the NDK build only if you decide to opt-in for the New Architecture. + externalNativeBuild { + cmake { + path "$projectDir/src/main/jni/CMakeLists.txt" + } + } + def reactAndroidProjectDir = project(':ReactAndroid').projectDir + def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) { + dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck") + from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") + into("$buildDir/react-ndk/exported") + } + def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) { + dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck") + from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") + into("$buildDir/react-ndk/exported") + } + afterEvaluate { + // If you wish to add a custom TurboModule or component locally, + // you should uncomment this line. + // preBuild.dependsOn("generateCodegenArtifactsFromSchema") + preDebugBuild.dependsOn(packageReactNdkDebugLibs) + preReleaseBuild.dependsOn(packageReactNdkReleaseLibs) + + // Due to a bug inside AGP, we have to explicitly set a dependency + // between configureCMakeDebug* tasks and the preBuild tasks. + // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732 + configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild) + configureCMakeDebug.dependsOn(preDebugBuild) + reactNativeArchitectures().each { architecture -> + tasks.findByName("configureCMakeDebug[${architecture}]")?.configure { + dependsOn("preDebugBuild") + } + tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure { + dependsOn("preReleaseBuild") + } + } + } + } + splits { abi { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false // If true, also generate a universal APK - include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" + include (*reactNativeArchitectures()) } } signingConfigs { @@ -157,30 +224,24 @@ android { } release { // Caution! In production, you need to generate your own keystore file. - // see https://facebook.github.io/react-native/docs/signed-apk-android. + // see https://reactnative.dev/docs/signed-apk-android. signingConfig signingConfigs.debug minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } - packagingOptions { - pickFirst "lib/armeabi-v7a/libc++_shared.so" - pickFirst "lib/arm64-v8a/libc++_shared.so" - pickFirst "lib/x86/libc++_shared.so" - pickFirst "lib/x86_64/libc++_shared.so" - } - // applicationVariants are e.g. debug, release applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // https://developer.android.com/studio/build/configure-apk-splits.html + // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + defaultConfig.versionCode * 1000 + versionCodes.get(abi) } } @@ -189,17 +250,19 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) + //noinspection GradleDynamicVersion implementation "com.facebook.react:react-native:+" // From node_modules implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { - exclude group:'com.facebook.fbjni' + exclude group:'com.facebook.fbjni' } debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { exclude group:'com.facebook.flipper' + exclude group:'com.squareup.okhttp3', module:'okhttp' } debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { @@ -207,19 +270,44 @@ dependencies { } if (enableHermes) { - def hermesPath = "../../node_modules/hermes-engine/android/"; - debugImplementation files(hermesPath + "hermes-debug.aar") - releaseImplementation files(hermesPath + "hermes-release.aar") + //noinspection GradleDynamicVersion + implementation("com.facebook.react:hermes-engine:+") { // From node_modules + exclude group:'com.facebook.fbjni' + } } else { implementation jscFlavor } } +if (isNewArchitectureEnabled()) { + // If new architecture is enabled, we let you build RN from source + // Otherwise we fallback to a prebuilt .aar bundled in the NPM package. + // This will be applied to all the imported transtitive dependency. + configurations.all { + resolutionStrategy.dependencySubstitution { + substitute(module("com.facebook.react:react-native")) + .using(project(":ReactAndroid")) + .because("On New Architecture we're building React Native from source") + substitute(module("com.facebook.react:hermes-engine")) + .using(project(":ReactAndroid:hermes-engine")) + .because("On New Architecture we're building Hermes from source") + } + } +} + // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { - from configurations.compile + from configurations.implementation into 'libs' } apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) + +def isNewArchitectureEnabled() { + // To opt-in for the New Architecture, you can either: + // - Set `newArchEnabled` to true inside the `gradle.properties` file + // - Invoke gradle with `-newArchEnabled=true` + // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true` + return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true" +} diff --git a/Example/android/app/src/debug/AndroidManifest.xml b/Example/android/app/src/debug/AndroidManifest.xml index fa26aa5..4b185bc 100644 --- a/Example/android/app/src/debug/AndroidManifest.xml +++ b/Example/android/app/src/debug/AndroidManifest.xml @@ -4,5 +4,10 @@ - + + + diff --git a/Example/android/app/src/debug/java/com/example/ReactNativeFlipper.java b/Example/android/app/src/debug/java/com/example/ReactNativeFlipper.java index a1b70b8..9ffdd88 100644 --- a/Example/android/app/src/debug/java/com/example/ReactNativeFlipper.java +++ b/Example/android/app/src/debug/java/com/example/ReactNativeFlipper.java @@ -1,5 +1,5 @@ /** - * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) Meta Platforms, Inc. and affiliates. * *

This source code is licensed under the MIT license found in the LICENSE file in the root * directory of this source tree. @@ -19,6 +19,7 @@ import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; import com.facebook.flipper.plugins.react.ReactFlipperPlugin; import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; +import com.facebook.react.ReactInstanceEventListener; import com.facebook.react.ReactInstanceManager; import com.facebook.react.bridge.ReactContext; import com.facebook.react.modules.network.NetworkingModule; @@ -51,7 +52,7 @@ public void apply(OkHttpClient.Builder builder) { ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); if (reactContext == null) { reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceManager.ReactInstanceEventListener() { + new ReactInstanceEventListener() { @Override public void onReactContextInitialized(ReactContext reactContext) { reactInstanceManager.removeReactInstanceEventListener(this); diff --git a/Example/android/app/src/main/AndroidManifest.xml b/Example/android/app/src/main/AndroidManifest.xml index 6e27a2a..ef3c312 100644 --- a/Example/android/app/src/main/AndroidManifest.xml +++ b/Example/android/app/src/main/AndroidManifest.xml @@ -13,15 +13,14 @@ + android:windowSoftInputMode="adjustResize" + android:exported="true"> - - diff --git a/Example/android/app/src/main/java/com/example/MainActivity.java b/Example/android/app/src/main/java/com/example/MainActivity.java index 557797a..bc5238f 100644 --- a/Example/android/app/src/main/java/com/example/MainActivity.java +++ b/Example/android/app/src/main/java/com/example/MainActivity.java @@ -1,6 +1,8 @@ package com.example; import com.facebook.react.ReactActivity; +import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.ReactRootView; public class MainActivity extends ReactActivity { @@ -12,4 +14,35 @@ public class MainActivity extends ReactActivity { protected String getMainComponentName() { return "Example"; } + + /** + * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and + * you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer + * (Paper). + */ + @Override + protected ReactActivityDelegate createReactActivityDelegate() { + return new MainActivityDelegate(this, getMainComponentName()); + } + + public static class MainActivityDelegate extends ReactActivityDelegate { + public MainActivityDelegate(ReactActivity activity, String mainComponentName) { + super(activity, mainComponentName); + } + + @Override + protected ReactRootView createRootView() { + ReactRootView reactRootView = new ReactRootView(getContext()); + // If you opted-in for the New Architecture, we enable the Fabric Renderer. + reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED); + return reactRootView; + } + + @Override + protected boolean isConcurrentRootEnabled() { + // If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18). + // More on this on https://reactjs.org/blog/2022/03/29/react-v18.html + return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + } + } } diff --git a/Example/android/app/src/main/java/com/example/MainApplication.java b/Example/android/app/src/main/java/com/example/MainApplication.java index fd8ec88..61f1d42 100644 --- a/Example/android/app/src/main/java/com/example/MainApplication.java +++ b/Example/android/app/src/main/java/com/example/MainApplication.java @@ -7,7 +7,9 @@ import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.soloader.SoLoader; +import com.example.newarchitecture.MainApplicationReactNativeHost; import java.lang.reflect.InvocationTargetException; import java.util.List; @@ -35,14 +37,23 @@ protected String getJSMainModuleName() { } }; + private final ReactNativeHost mNewArchitectureNativeHost = + new MainApplicationReactNativeHost(this); + @Override public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + return mNewArchitectureNativeHost; + } else { + return mReactNativeHost; + } } @Override public void onCreate() { super.onCreate(); + // If you opted-in for the New Architecture, we enable the TurboModule system + ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; SoLoader.init(this, /* native exopackage */ false); initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); } diff --git a/Example/android/app/src/main/java/com/example/newarchitecture/MainApplicationReactNativeHost.java b/Example/android/app/src/main/java/com/example/newarchitecture/MainApplicationReactNativeHost.java new file mode 100644 index 0000000..68aea28 --- /dev/null +++ b/Example/android/app/src/main/java/com/example/newarchitecture/MainApplicationReactNativeHost.java @@ -0,0 +1,116 @@ +package com.example.newarchitecture; + +import android.app.Application; +import androidx.annotation.NonNull; +import com.facebook.react.PackageList; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.ReactPackageTurboModuleManagerDelegate; +import com.facebook.react.bridge.JSIModulePackage; +import com.facebook.react.bridge.JSIModuleProvider; +import com.facebook.react.bridge.JSIModuleSpec; +import com.facebook.react.bridge.JSIModuleType; +import com.facebook.react.bridge.JavaScriptContextHolder; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.UIManager; +import com.facebook.react.fabric.ComponentFactory; +import com.facebook.react.fabric.CoreComponentsRegistry; +import com.facebook.react.fabric.FabricJSIModuleProvider; +import com.facebook.react.fabric.ReactNativeConfig; +import com.facebook.react.uimanager.ViewManagerRegistry; +import com.example.BuildConfig; +import com.example.newarchitecture.components.MainComponentsRegistry; +import com.example.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate; +import java.util.ArrayList; +import java.util.List; + +/** + * A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both + * TurboModule delegates and the Fabric Renderer. + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +public class MainApplicationReactNativeHost extends ReactNativeHost { + public MainApplicationReactNativeHost(Application application) { + super(application); + } + + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + List packages = new PackageList(this).getPackages(); + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + // TurboModules must also be loaded here providing a valid TurboReactPackage implementation: + // packages.add(new TurboReactPackage() { ... }); + // If you have custom Fabric Components, their ViewManagers should also be loaded here + // inside a ReactPackage. + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + + @NonNull + @Override + protected ReactPackageTurboModuleManagerDelegate.Builder + getReactPackageTurboModuleManagerDelegateBuilder() { + // Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary + // for the new architecture and to use TurboModules correctly. + return new MainApplicationTurboModuleManagerDelegate.Builder(); + } + + @Override + protected JSIModulePackage getJSIModulePackage() { + return new JSIModulePackage() { + @Override + public List getJSIModules( + final ReactApplicationContext reactApplicationContext, + final JavaScriptContextHolder jsContext) { + final List specs = new ArrayList<>(); + + // Here we provide a new JSIModuleSpec that will be responsible of providing the + // custom Fabric Components. + specs.add( + new JSIModuleSpec() { + @Override + public JSIModuleType getJSIModuleType() { + return JSIModuleType.UIManager; + } + + @Override + public JSIModuleProvider getJSIModuleProvider() { + final ComponentFactory componentFactory = new ComponentFactory(); + CoreComponentsRegistry.register(componentFactory); + + // Here we register a Components Registry. + // The one that is generated with the template contains no components + // and just provides you the one from React Native core. + MainComponentsRegistry.register(componentFactory); + + final ReactInstanceManager reactInstanceManager = getReactInstanceManager(); + + ViewManagerRegistry viewManagerRegistry = + new ViewManagerRegistry( + reactInstanceManager.getOrCreateViewManagers(reactApplicationContext)); + + return new FabricJSIModuleProvider( + reactApplicationContext, + componentFactory, + ReactNativeConfig.DEFAULT_CONFIG, + viewManagerRegistry); + } + }); + return specs; + } + }; + } +} diff --git a/Example/android/app/src/main/java/com/example/newarchitecture/components/MainComponentsRegistry.java b/Example/android/app/src/main/java/com/example/newarchitecture/components/MainComponentsRegistry.java new file mode 100644 index 0000000..98ff973 --- /dev/null +++ b/Example/android/app/src/main/java/com/example/newarchitecture/components/MainComponentsRegistry.java @@ -0,0 +1,36 @@ +package com.example.newarchitecture.components; + +import com.facebook.jni.HybridData; +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.fabric.ComponentFactory; +import com.facebook.soloader.SoLoader; + +/** + * Class responsible to load the custom Fabric Components. This class has native methods and needs a + * corresponding C++ implementation/header file to work correctly (already placed inside the jni/ + * folder for you). + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +@DoNotStrip +public class MainComponentsRegistry { + static { + SoLoader.loadLibrary("fabricjni"); + } + + @DoNotStrip private final HybridData mHybridData; + + @DoNotStrip + private native HybridData initHybrid(ComponentFactory componentFactory); + + @DoNotStrip + private MainComponentsRegistry(ComponentFactory componentFactory) { + mHybridData = initHybrid(componentFactory); + } + + @DoNotStrip + public static MainComponentsRegistry register(ComponentFactory componentFactory) { + return new MainComponentsRegistry(componentFactory); + } +} diff --git a/Example/android/app/src/main/java/com/example/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java b/Example/android/app/src/main/java/com/example/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java new file mode 100644 index 0000000..b30c50e --- /dev/null +++ b/Example/android/app/src/main/java/com/example/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java @@ -0,0 +1,48 @@ +package com.example.newarchitecture.modules; + +import com.facebook.jni.HybridData; +import com.facebook.react.ReactPackage; +import com.facebook.react.ReactPackageTurboModuleManagerDelegate; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.soloader.SoLoader; +import java.util.List; + +/** + * Class responsible to load the TurboModules. This class has native methods and needs a + * corresponding C++ implementation/header file to work correctly (already placed inside the jni/ + * folder for you). + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +public class MainApplicationTurboModuleManagerDelegate + extends ReactPackageTurboModuleManagerDelegate { + + private static volatile boolean sIsSoLibraryLoaded; + + protected MainApplicationTurboModuleManagerDelegate( + ReactApplicationContext reactApplicationContext, List packages) { + super(reactApplicationContext, packages); + } + + protected native HybridData initHybrid(); + + native boolean canCreateTurboModule(String moduleName); + + public static class Builder extends ReactPackageTurboModuleManagerDelegate.Builder { + protected MainApplicationTurboModuleManagerDelegate build( + ReactApplicationContext context, List packages) { + return new MainApplicationTurboModuleManagerDelegate(context, packages); + } + } + + @Override + protected synchronized void maybeLoadOtherSoLibraries() { + if (!sIsSoLibraryLoaded) { + // If you change the name of your application .so file in the Android.mk file, + // make sure you update the name here as well. + SoLoader.loadLibrary("example_appmodules"); + sIsSoLibraryLoaded = true; + } + } +} diff --git a/Example/android/app/src/main/jni/CMakeLists.txt b/Example/android/app/src/main/jni/CMakeLists.txt new file mode 100644 index 0000000..9abdd49 --- /dev/null +++ b/Example/android/app/src/main/jni/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.13) + +# Define the library name here. +project(example_appmodules) + +# This file includes all the necessary to let you build your application with the New Architecture. +include(${REACT_ANDROID_DIR}/cmake-utils/ReactNative-application.cmake) diff --git a/Example/android/app/src/main/jni/MainApplicationModuleProvider.cpp b/Example/android/app/src/main/jni/MainApplicationModuleProvider.cpp new file mode 100644 index 0000000..26162dd --- /dev/null +++ b/Example/android/app/src/main/jni/MainApplicationModuleProvider.cpp @@ -0,0 +1,32 @@ +#include "MainApplicationModuleProvider.h" + +#include +#include + +namespace facebook { +namespace react { + +std::shared_ptr MainApplicationModuleProvider( + const std::string &moduleName, + const JavaTurboModule::InitParams ¶ms) { + // Here you can provide your own module provider for TurboModules coming from + // either your application or from external libraries. The approach to follow + // is similar to the following (for a library called `samplelibrary`: + // + // auto module = samplelibrary_ModuleProvider(moduleName, params); + // if (module != nullptr) { + // return module; + // } + // return rncore_ModuleProvider(moduleName, params); + + // Module providers autolinked by RN CLI + auto rncli_module = rncli_ModuleProvider(moduleName, params); + if (rncli_module != nullptr) { + return rncli_module; + } + + return rncore_ModuleProvider(moduleName, params); +} + +} // namespace react +} // namespace facebook diff --git a/Example/android/app/src/main/jni/MainApplicationModuleProvider.h b/Example/android/app/src/main/jni/MainApplicationModuleProvider.h new file mode 100644 index 0000000..b38ccf5 --- /dev/null +++ b/Example/android/app/src/main/jni/MainApplicationModuleProvider.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +#include + +namespace facebook { +namespace react { + +std::shared_ptr MainApplicationModuleProvider( + const std::string &moduleName, + const JavaTurboModule::InitParams ¶ms); + +} // namespace react +} // namespace facebook diff --git a/Example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp b/Example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp new file mode 100644 index 0000000..5fd688c --- /dev/null +++ b/Example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp @@ -0,0 +1,45 @@ +#include "MainApplicationTurboModuleManagerDelegate.h" +#include "MainApplicationModuleProvider.h" + +namespace facebook { +namespace react { + +jni::local_ref +MainApplicationTurboModuleManagerDelegate::initHybrid( + jni::alias_ref) { + return makeCxxInstance(); +} + +void MainApplicationTurboModuleManagerDelegate::registerNatives() { + registerHybrid({ + makeNativeMethod( + "initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid), + makeNativeMethod( + "canCreateTurboModule", + MainApplicationTurboModuleManagerDelegate::canCreateTurboModule), + }); +} + +std::shared_ptr +MainApplicationTurboModuleManagerDelegate::getTurboModule( + const std::string &name, + const std::shared_ptr &jsInvoker) { + // Not implemented yet: provide pure-C++ NativeModules here. + return nullptr; +} + +std::shared_ptr +MainApplicationTurboModuleManagerDelegate::getTurboModule( + const std::string &name, + const JavaTurboModule::InitParams ¶ms) { + return MainApplicationModuleProvider(name, params); +} + +bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule( + const std::string &name) { + return getTurboModule(name, nullptr) != nullptr || + getTurboModule(name, {.moduleName = name}) != nullptr; +} + +} // namespace react +} // namespace facebook diff --git a/Example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h b/Example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h new file mode 100644 index 0000000..0ef746b --- /dev/null +++ b/Example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h @@ -0,0 +1,38 @@ +#include +#include + +#include +#include + +namespace facebook { +namespace react { + +class MainApplicationTurboModuleManagerDelegate + : public jni::HybridClass< + MainApplicationTurboModuleManagerDelegate, + TurboModuleManagerDelegate> { + public: + // Adapt it to the package you used for your Java class. + static constexpr auto kJavaDescriptor = + "Lcom/example/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;"; + + static jni::local_ref initHybrid(jni::alias_ref); + + static void registerNatives(); + + std::shared_ptr getTurboModule( + const std::string &name, + const std::shared_ptr &jsInvoker) override; + std::shared_ptr getTurboModule( + const std::string &name, + const JavaTurboModule::InitParams ¶ms) override; + + /** + * Test-only method. Allows user to verify whether a TurboModule can be + * created by instances of this class. + */ + bool canCreateTurboModule(const std::string &name); +}; + +} // namespace react +} // namespace facebook diff --git a/Example/android/app/src/main/jni/MainComponentsRegistry.cpp b/Example/android/app/src/main/jni/MainComponentsRegistry.cpp new file mode 100644 index 0000000..54f598a --- /dev/null +++ b/Example/android/app/src/main/jni/MainComponentsRegistry.cpp @@ -0,0 +1,65 @@ +#include "MainComponentsRegistry.h" + +#include +#include +#include +#include +#include + +namespace facebook { +namespace react { + +MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {} + +std::shared_ptr +MainComponentsRegistry::sharedProviderRegistry() { + auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry(); + + // Autolinked providers registered by RN CLI + rncli_registerProviders(providerRegistry); + + // Custom Fabric Components go here. You can register custom + // components coming from your App or from 3rd party libraries here. + // + // providerRegistry->add(concreteComponentDescriptorProvider< + // AocViewerComponentDescriptor>()); + return providerRegistry; +} + +jni::local_ref +MainComponentsRegistry::initHybrid( + jni::alias_ref, + ComponentFactory *delegate) { + auto instance = makeCxxInstance(delegate); + + auto buildRegistryFunction = + [](EventDispatcher::Weak const &eventDispatcher, + ContextContainer::Shared const &contextContainer) + -> ComponentDescriptorRegistry::Shared { + auto registry = MainComponentsRegistry::sharedProviderRegistry() + ->createComponentDescriptorRegistry( + {eventDispatcher, contextContainer}); + + auto mutableRegistry = + std::const_pointer_cast(registry); + + mutableRegistry->setFallbackComponentDescriptor( + std::make_shared( + ComponentDescriptorParameters{ + eventDispatcher, contextContainer, nullptr})); + + return registry; + }; + + delegate->buildRegistryFunction = buildRegistryFunction; + return instance; +} + +void MainComponentsRegistry::registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid), + }); +} + +} // namespace react +} // namespace facebook diff --git a/Example/android/app/src/main/jni/MainComponentsRegistry.h b/Example/android/app/src/main/jni/MainComponentsRegistry.h new file mode 100644 index 0000000..23a9cac --- /dev/null +++ b/Example/android/app/src/main/jni/MainComponentsRegistry.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +class MainComponentsRegistry + : public facebook::jni::HybridClass { + public: + // Adapt it to the package you used for your Java class. + constexpr static auto kJavaDescriptor = + "Lcom/example/newarchitecture/components/MainComponentsRegistry;"; + + static void registerNatives(); + + MainComponentsRegistry(ComponentFactory *delegate); + + private: + static std::shared_ptr + sharedProviderRegistry(); + + static jni::local_ref initHybrid( + jni::alias_ref, + ComponentFactory *delegate); +}; + +} // namespace react +} // namespace facebook diff --git a/Example/android/app/src/main/jni/OnLoad.cpp b/Example/android/app/src/main/jni/OnLoad.cpp new file mode 100644 index 0000000..c569b6e --- /dev/null +++ b/Example/android/app/src/main/jni/OnLoad.cpp @@ -0,0 +1,11 @@ +#include +#include "MainApplicationTurboModuleManagerDelegate.h" +#include "MainComponentsRegistry.h" + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { + return facebook::jni::initialize(vm, [] { + facebook::react::MainApplicationTurboModuleManagerDelegate:: + registerNatives(); + facebook::react::MainComponentsRegistry::registerNatives(); + }); +} diff --git a/Example/android/app/src/main/res/drawable/rn_edit_text_material.xml b/Example/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 0000000..f35d996 --- /dev/null +++ b/Example/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/Example/android/app/src/main/res/values/styles.xml b/Example/android/app/src/main/res/values/styles.xml index 62fe59f..7ba83a2 100644 --- a/Example/android/app/src/main/res/values/styles.xml +++ b/Example/android/app/src/main/res/values/styles.xml @@ -1,9 +1,9 @@ - diff --git a/Example/android/build.gradle b/Example/android/build.gradle index 5d5d188..8569fee 100644 --- a/Example/android/build.gradle +++ b/Example/android/build.gradle @@ -2,18 +2,27 @@ buildscript { ext { - buildToolsVersion = "28.0.3" - minSdkVersion = 16 - compileSdkVersion = 28 - targetSdkVersion = 28 + buildToolsVersion = "31.0.0" + minSdkVersion = 21 + compileSdkVersion = 31 + targetSdkVersion = 31 + + if (System.properties['os.arch'] == "aarch64") { + // For M1 Users we need to use the NDK 24 which added support for aarch64 + ndkVersion = "24.0.8215888" + } else { + // Otherwise we default to the side-by-side NDK version from AGP. + ndkVersion = "21.4.7075529" + } } repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:3.5.2") - + classpath("com.android.tools.build:gradle:7.2.1") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("de.undercouch:gradle-download-task:5.0.1") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -21,7 +30,6 @@ buildscript { allprojects { repositories { - mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url("$rootDir/../node_modules/react-native/android") @@ -30,9 +38,14 @@ allprojects { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } - + mavenCentral { + // We don't want to fetch react-native from Maven Central as there are + // older versions over there. + content { + excludeGroup "com.facebook.react" + } + } google() - jcenter() maven { url 'https://www.jitpack.io' } } } diff --git a/Example/android/gradle.properties b/Example/android/gradle.properties index 1bbc8cc..fa4feae 100644 --- a/Example/android/gradle.properties +++ b/Example/android/gradle.properties @@ -9,8 +9,8 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit @@ -25,4 +25,16 @@ android.useAndroidX=true android.enableJetifier=true # Version of flipper SDK to use with React Native -FLIPPER_VERSION=0.33.1 +FLIPPER_VERSION=0.125.0 + +# 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=false diff --git a/Example/android/gradle/wrapper/gradle-wrapper.jar b/Example/android/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch delta 26784 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

_` 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 diff --git a/Example/android/gradle/wrapper/gradle-wrapper.properties b/Example/android/gradle/wrapper/gradle-wrapper.properties index 1ba7206..8fad3f5 100644 --- a/Example/android/gradle/wrapper/gradle-wrapper.properties +++ b/Example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/Example/android/gradlew b/Example/android/gradlew index 83f2acf..1b6c787 100755 --- a/Example/android/gradlew +++ b/Example/android/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# 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. @@ -17,78 +17,113 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# 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/master/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 -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +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 -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # 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"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +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 - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || 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 @@ -105,84 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -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" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +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 - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + 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 - i=$((i+1)) + # 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 - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -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/Example/android/gradlew.bat b/Example/android/gradlew.bat index 24467a1..ac1b06f 100644 --- a/Example/android/gradlew.bat +++ b/Example/android/gradlew.bat @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. 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" @@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :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 %CMD_LINE_ARGS% +"%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 diff --git a/Example/android/settings.gradle b/Example/android/settings.gradle index 47725a0..db5781a 100644 --- a/Example/android/settings.gradle +++ b/Example/android/settings.gradle @@ -1,3 +1,11 @@ rootProject.name = 'Example' apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' +includeBuild('../node_modules/react-native-gradle-plugin') + +if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") { + include(":ReactAndroid") + project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid') + include(":ReactAndroid:hermes-engine") + project(":ReactAndroid:hermes-engine").projectDir = file('../node_modules/react-native/ReactAndroid/hermes-engine') +} diff --git a/Example/ios/.xcode.env b/Example/ios/.xcode.env new file mode 100644 index 0000000..3d5782c --- /dev/null +++ b/Example/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/Example/ios/Example-tvOS/Info.plist b/Example/ios/Example-tvOS/Info.plist deleted file mode 100644 index ecbd496..0000000 --- a/Example/ios/Example-tvOS/Info.plist +++ /dev/null @@ -1,53 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - NSLocationWhenInUseUsageDescription - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/Example/ios/Example-tvOSTests/Info.plist b/Example/ios/Example-tvOSTests/Info.plist deleted file mode 100644 index 886825c..0000000 --- a/Example/ios/Example-tvOSTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Example/ios/Example.xcodeproj/project.pbxproj b/Example/ios/Example.xcodeproj/project.pbxproj index 9f0d03c..b8100ef 100644 --- a/Example/ios/Example.xcodeproj/project.pbxproj +++ b/Example/ios/Example.xcodeproj/project.pbxproj @@ -3,23 +3,17 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 00E356F31AD99517003FC87E /* ExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ExampleTests.m */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; + 0C80B921A6F3F58F76C31292 /* libPods-Example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-Example.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 */; }; - 19305E25DE2271225586643D /* libPods-Example-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E7BE12CCDB2237E2AB729348 /* libPods-Example-tvOSTests.a */; }; - 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 2DCD954D1E0B4F2C00145EB5 /* ExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ExampleTests.m */; }; - 37953C6AB0FC83F8E1A613BE /* libPods-Example-ExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2E8338A3545DBED755DB064 /* libPods-Example-ExampleTests.a */; }; - 6E794DC0B92690A78B55715E /* libPods-Example-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AA04185551DF20F29BBFAB28 /* libPods-Example-tvOS.a */; }; - CED62E9FFC86876417C13D89 /* libPods-Example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 65523CF4A0EBE77C1AB62FAA /* libPods-Example.a */; }; + 7699B88040F8A987B510C191 /* libPods-Example-ExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Example-ExampleTests.a */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -30,43 +24,26 @@ remoteGlobalIDString = 13B07F861A680F5B00A75B9A; remoteInfo = Example; }; - 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; - remoteInfo = "Example-tvOS"; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 00E356EE1AD99517003FC87E /* ExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* ExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExampleTests.m; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Example/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Example/AppDelegate.m; sourceTree = ""; }; - 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Example/AppDelegate.mm; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Example/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Example/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Example/main.m; sourceTree = ""; }; - 2D02E47B1E0B4A5D006451C7 /* Example-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D02E4901E0B4A5D006451C7 /* Example-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Example-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2EAC8496A1F10DB5DBABD6FD /* Pods-Example-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-tvOS.debug.xcconfig"; path = "Target Support Files/Pods-Example-tvOS/Pods-Example-tvOS.debug.xcconfig"; sourceTree = ""; }; - 425A778373340C3CE5150F73 /* Pods-Example-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-tvOS.release.xcconfig"; path = "Target Support Files/Pods-Example-tvOS/Pods-Example-tvOS.release.xcconfig"; sourceTree = ""; }; - 49CBE772FF23962CA85E1B08 /* Pods-Example-ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ExampleTests.release.xcconfig"; path = "Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests.release.xcconfig"; sourceTree = ""; }; - 4EF79DECA56CED596DFEC8AB /* Pods-Example-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-tvOSTests.release.xcconfig"; path = "Target Support Files/Pods-Example-tvOSTests/Pods-Example-tvOSTests.release.xcconfig"; sourceTree = ""; }; - 65523CF4A0EBE77C1AB62FAA /* libPods-Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - A88E643276ABBC9D67ED9B8C /* Pods-Example-ExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests.debug.xcconfig"; sourceTree = ""; }; - AA04185551DF20F29BBFAB28 /* libPods-Example-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - BA5E24D6732AC560698E8EAB /* Pods-Example-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-tvOSTests.debug.xcconfig"; path = "Target Support Files/Pods-Example-tvOSTests/Pods-Example-tvOSTests.debug.xcconfig"; sourceTree = ""; }; - D2E8338A3545DBED755DB064 /* libPods-Example-ExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example-ExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - E3C7759A50BF576CFB397E84 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = ""; }; - E7BE12CCDB2237E2AB729348 /* libPods-Example-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Example-ExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example-ExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B4392A12AC88292D35C810B /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = ""; }; + 5709B34CF0A7D63546082F79 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = ""; }; + 5B7EB9410499542E8C5724F5 /* Pods-Example-ExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests.debug.xcconfig"; sourceTree = ""; }; + 5DCACB8F33CDC322A6C60F78 /* libPods-Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = Example/LaunchScreen.storyboard; sourceTree = ""; }; + 89C6BE57DB24E9ADA2F236DE /* Pods-Example-ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ExampleTests.release.xcconfig"; path = "Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests.release.xcconfig"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; - F8D31CB80E04F1621479C16A /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -74,7 +51,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 37953C6AB0FC83F8E1A613BE /* libPods-Example-ExampleTests.a in Frameworks */, + 7699B88040F8A987B510C191 /* libPods-Example-ExampleTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -82,23 +59,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CED62E9FFC86876417C13D89 /* libPods-Example.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6E794DC0B92690A78B55715E /* libPods-Example-tvOS.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 19305E25DE2271225586643D /* libPods-Example-tvOSTests.a in Frameworks */, + 0C80B921A6F3F58F76C31292 /* libPods-Example.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -125,12 +86,11 @@ 13B07FAE1A68108700A75B9A /* Example */ = { isa = PBXGroup; children = ( - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, 13B07FB51A68108700A75B9A /* Images.xcassets */, 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, 13B07FB71A68108700A75B9A /* main.m */, ); name = Example; @@ -140,11 +100,8 @@ isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - ED2971642150620600B7C4FE /* JavaScriptCore.framework */, - 65523CF4A0EBE77C1AB62FAA /* libPods-Example.a */, - D2E8338A3545DBED755DB064 /* libPods-Example-ExampleTests.a */, - AA04185551DF20F29BBFAB28 /* libPods-Example-tvOS.a */, - E7BE12CCDB2237E2AB729348 /* libPods-Example-tvOSTests.a */, + 5DCACB8F33CDC322A6C60F78 /* libPods-Example.a */, + 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Example-ExampleTests.a */, ); name = Frameworks; sourceTree = ""; @@ -164,7 +121,7 @@ 00E356EF1AD99517003FC87E /* ExampleTests */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, - D838CEEA3DE2EDFB80B04AC9 /* Pods */, + BBD78D7AC51CEA395F1C20DB /* Pods */, ); indentWidth = 2; sourceTree = ""; @@ -176,25 +133,18 @@ children = ( 13B07F961A680F5B00A75B9A /* Example.app */, 00E356EE1AD99517003FC87E /* ExampleTests.xctest */, - 2D02E47B1E0B4A5D006451C7 /* Example-tvOS.app */, - 2D02E4901E0B4A5D006451C7 /* Example-tvOSTests.xctest */, ); name = Products; sourceTree = ""; }; - D838CEEA3DE2EDFB80B04AC9 /* Pods */ = { + BBD78D7AC51CEA395F1C20DB /* Pods */ = { isa = PBXGroup; children = ( - E3C7759A50BF576CFB397E84 /* Pods-Example.debug.xcconfig */, - F8D31CB80E04F1621479C16A /* Pods-Example.release.xcconfig */, - A88E643276ABBC9D67ED9B8C /* Pods-Example-ExampleTests.debug.xcconfig */, - 49CBE772FF23962CA85E1B08 /* Pods-Example-ExampleTests.release.xcconfig */, - 2EAC8496A1F10DB5DBABD6FD /* Pods-Example-tvOS.debug.xcconfig */, - 425A778373340C3CE5150F73 /* Pods-Example-tvOS.release.xcconfig */, - BA5E24D6732AC560698E8EAB /* Pods-Example-tvOSTests.debug.xcconfig */, - 4EF79DECA56CED596DFEC8AB /* Pods-Example-tvOSTests.release.xcconfig */, - ); - name = Pods; + 3B4392A12AC88292D35C810B /* Pods-Example.debug.xcconfig */, + 5709B34CF0A7D63546082F79 /* Pods-Example.release.xcconfig */, + 5B7EB9410499542E8C5724F5 /* Pods-Example-ExampleTests.debug.xcconfig */, + 89C6BE57DB24E9ADA2F236DE /* Pods-Example-ExampleTests.release.xcconfig */, + ); path = Pods; sourceTree = ""; }; @@ -205,10 +155,12 @@ isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ExampleTests" */; buildPhases = ( - D1BBA2CC07CF0A86ECDE4403 /* [CP] Check Pods Manifest.lock */, + A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, + C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, + F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -224,12 +176,14 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Example" */; buildPhases = ( - E8547D9D82CE821D6449FA31 /* [CP] Check Pods Manifest.lock */, + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -240,52 +194,13 @@ productReference = 13B07F961A680F5B00A75B9A /* Example.app */; productType = "com.apple.product-type.application"; }; - 2D02E47A1E0B4A5D006451C7 /* Example-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "Example-tvOS" */; - buildPhases = ( - C677D6C88064E0DB3F7B5B54 /* [CP] Check Pods Manifest.lock */, - FD10A7F122414F3F0027D42C /* Start Packager */, - 2D02E4771E0B4A5D006451C7 /* Sources */, - 2D02E4781E0B4A5D006451C7 /* Frameworks */, - 2D02E4791E0B4A5D006451C7 /* Resources */, - 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Example-tvOS"; - productName = "Example-tvOS"; - productReference = 2D02E47B1E0B4A5D006451C7 /* Example-tvOS.app */; - productType = "com.apple.product-type.application"; - }; - 2D02E48F1E0B4A5D006451C7 /* Example-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "Example-tvOSTests" */; - buildPhases = ( - A17E7C3F4D79820B85701C89 /* [CP] Check Pods Manifest.lock */, - 2D02E48C1E0B4A5D006451C7 /* Sources */, - 2D02E48D1E0B4A5D006451C7 /* Frameworks */, - 2D02E48E1E0B4A5D006451C7 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, - ); - name = "Example-tvOSTests"; - productName = "Example-tvOSTests"; - productReference = 2D02E4901E0B4A5D006451C7 /* Example-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1130; + LastUpgradeCheck = 1210; TargetAttributes = { 00E356ED1AD99517003FC87E = { CreatedOnToolsVersion = 6.2; @@ -294,19 +209,10 @@ 13B07F861A680F5B00A75B9A = { LastSwiftMigration = 1120; }; - 2D02E47A1E0B4A5D006451C7 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; - 2D02E48F1E0B4A5D006451C7 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - TestTargetID = 2D02E47A1E0B4A5D006451C7; - }; }; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Example" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 12.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -320,8 +226,6 @@ targets = ( 13B07F861A680F5B00A75B9A /* Example */, 00E356ED1AD99517003FC87E /* ExampleTests */, - 2D02E47A1E0B4A5D006451C7 /* Example-tvOS */, - 2D02E48F1E0B4A5D006451C7 /* Example-tvOSTests */, ); }; /* End PBXProject section */ @@ -338,23 +242,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4791E0B4A5D006451C7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48E1E0B4A5D006451C7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( ); runOnlyForDeploymentPostprocessing = 0; }; @@ -367,29 +256,34 @@ files = ( ); inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", ); name = "Bundle React Native code and images"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Bundle React Native Code And Images"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - A17E7C3F4D79820B85701C89 /* [CP] Check Pods Manifest.lock */ = { + A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -404,14 +298,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Example-tvOSTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Example-ExampleTests-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; }; - C677D6C88064E0DB3F7B5B54 /* [CP] Check Pods Manifest.lock */ = { + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -426,77 +320,65 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Example-tvOS-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Example-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; }; - D1BBA2CC07CF0A86ECDE4403 /* [CP] Check Pods Manifest.lock */ = { + C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Example-ExampleTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - E8547D9D82CE821D6449FA31 /* [CP] Check Pods Manifest.lock */ = { + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-resources-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-resources.sh\"\n"; showEnvVarsInLog = 0; }; - FD10A7F022414F080027D42C /* Start Packager */ = { + F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); - name = "Start Packager"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - FD10A7F122414F3F0027D42C /* Start Packager */ = { + FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -530,28 +412,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2D02E4771E0B4A5D006451C7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, - 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48C1E0B4A5D006451C7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2DCD954D1E0B4F2C00145EB5 /* ExampleTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -560,29 +425,12 @@ target = 13B07F861A680F5B00A75B9A /* Example */; targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; }; - 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 2D02E47A1E0B4A5D006451C7 /* Example-tvOS */; - targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ -/* Begin PBXVariantGroup section */ - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 13B07FB21A68108700A75B9A /* Base */, - ); - name = LaunchScreen.xib; - path = Example; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A88E643276ABBC9D67ED9B8C /* Pods-Example-ExampleTests.debug.xcconfig */; + baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-Example-ExampleTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -590,8 +438,12 @@ "$(inherited)", ); INFOPLIST_FILE = ExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", @@ -605,13 +457,17 @@ }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 49CBE772FF23962CA85E1B08 /* Pods-Example-ExampleTests.release.xcconfig */; + baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-Example-ExampleTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = ExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", @@ -625,18 +481,17 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E3C7759A50BF576CFB397E84 /* Pods-Example.debug.xcconfig */; + baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-Example.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; ENABLE_BITCODE = NO; - GCC_PREPROCESSOR_DEFINITIONS = ( + INFOPLIST_FILE = Example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", - "FB_SONARKIT_ENABLED=1", + "@executable_path/Frameworks", ); - INFOPLIST_FILE = Example/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -652,13 +507,16 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F8D31CB80E04F1621479C16A /* Pods-Example.release.xcconfig */; + baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-Example.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; INFOPLIST_FILE = Example/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -671,122 +529,12 @@ }; name = Release; }; - 2D02E4971E0B4A5E006451C7 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2EAC8496A1F10DB5DBABD6FD /* Pods-Example-tvOS.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Example-tvOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Example-tvOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; - }; - name = Debug; - }; - 2D02E4981E0B4A5E006451C7 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 425A778373340C3CE5150F73 /* Pods-Example-tvOS.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Example-tvOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Example-tvOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; - }; - name = Release; - }; - 2D02E4991E0B4A5E006451C7 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = BA5E24D6732AC560698E8EAB /* Pods-Example-tvOSTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Example-tvOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Example-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example-tvOS.app/Example-tvOS"; - TVOS_DEPLOYMENT_TARGET = 10.1; - }; - name = Debug; - }; - 2D02E49A1E0B4A5E006451C7 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4EF79DECA56CED596DFEC8AB /* Pods-Example-tvOSTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Example-tvOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Example-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example-tvOS.app/Example-tvOS"; - TVOS_DEPLOYMENT_TARGET = 10.1; - }; - name = Release; - }; 83CBBA201A601CBA00E9B192 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -804,6 +552,7 @@ 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; @@ -813,6 +562,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -828,15 +578,25 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(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", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; }; name = Debug; @@ -846,7 +606,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -864,6 +624,7 @@ 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; @@ -873,6 +634,7 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -881,14 +643,24 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -915,24 +687,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "Example-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D02E4971E0B4A5E006451C7 /* Debug */, - 2D02E4981E0B4A5E006451C7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "Example-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D02E4991E0B4A5E006451C7 /* Debug */, - 2D02E49A1E0B4A5E006451C7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Example" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example-tvOS.xcscheme b/Example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example-tvOS.xcscheme deleted file mode 100644 index 9e5f979..0000000 --- a/Example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example-tvOS.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme b/Example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme index b28b842..2dbf021 100644 --- a/Example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme +++ b/Example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme @@ -1,6 +1,6 @@ -#import -#import - -#if DEBUG -#import -#import -#import -#import -#import -#import - -static void InitializeFlipper(UIApplication *application) { - FlipperClient *client = [FlipperClient sharedClient]; - SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults]; - [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]]; - [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]]; - [client addPlugin:[FlipperKitReactPlugin new]]; - [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]]; - [client start]; -} -#endif - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ -#if DEBUG - InitializeFlipper(application); -#endif - - RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; - RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge - moduleName:@"Example" - initialProperties:nil]; - - rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - UIViewController *rootViewController = [UIViewController new]; - rootViewController.view = rootView; - self.window.rootViewController = rootViewController; - [self.window makeKeyAndVisible]; - return YES; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -@end diff --git a/Example/ios/Example/AppDelegate.mm b/Example/ios/Example/AppDelegate.mm new file mode 100644 index 0000000..6459858 --- /dev/null +++ b/Example/ios/Example/AppDelegate.mm @@ -0,0 +1,133 @@ +#import "AppDelegate.h" + +#import +#import +#import + +#import + +#if RCT_NEW_ARCH_ENABLED +#import +#import +#import +#import +#import +#import + +#import + +static NSString *const kRNConcurrentRoot = @"concurrentRoot"; + +@interface AppDelegate () { + RCTTurboModuleManager *_turboModuleManager; + RCTSurfacePresenterBridgeAdapter *_bridgeAdapter; + std::shared_ptr _reactNativeConfig; + facebook::react::ContextContainer::Shared _contextContainer; +} +@end +#endif + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + RCTAppSetupPrepareApp(application); + + RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; + +#if RCT_NEW_ARCH_ENABLED + _contextContainer = std::make_shared(); + _reactNativeConfig = std::make_shared(); + _contextContainer->insert("ReactNativeConfig", _reactNativeConfig); + _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer]; + bridge.surfacePresenter = _bridgeAdapter.surfacePresenter; +#endif + + NSDictionary *initProps = [self prepareInitialProps]; + UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"Example", initProps); + + if (@available(iOS 13.0, *)) { + rootView.backgroundColor = [UIColor systemBackgroundColor]; + } else { + rootView.backgroundColor = [UIColor whiteColor]; + } + + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [UIViewController new]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + return YES; +} + +/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. +/// +/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html +/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). +/// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`. +- (BOOL)concurrentRootEnabled +{ + // Switch this bool to turn on and off the concurrent root + return true; +} + +- (NSDictionary *)prepareInitialProps +{ + NSMutableDictionary *initProps = [NSMutableDictionary new]; + +#ifdef RCT_NEW_ARCH_ENABLED + initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]); +#endif + + return initProps; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +#if RCT_NEW_ARCH_ENABLED + +#pragma mark - RCTCxxBridgeDelegate + +- (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge +{ + _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge + delegate:self + jsInvoker:bridge.jsCallInvoker]; + return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); +} + +#pragma mark RCTTurboModuleManagerDelegate + +- (Class)getModuleClassFromName:(const char *)name +{ + return RCTCoreModulesClassProvider(name); +} + +- (std::shared_ptr)getTurboModule:(const std::string &)name + jsInvoker:(std::shared_ptr)jsInvoker +{ + return nullptr; +} + +- (std::shared_ptr)getTurboModule:(const std::string &)name + initParams: + (const facebook::react::ObjCTurboModule::InitParams &)params +{ + return nullptr; +} + +- (id)getModuleInstanceFromClass:(Class)moduleClass +{ + return RCTAppSetupDefaultModuleFromClass(moduleClass); +} + +#endif + +@end diff --git a/Example/ios/Example/Base.lproj/LaunchScreen.xib b/Example/ios/Example/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 8c70b04..0000000 --- a/Example/ios/Example/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/ios/Example/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/ios/Example/Images.xcassets/AppIcon.appiconset/Contents.json index 118c98f..8121323 100644 --- a/Example/ios/Example/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/ios/Example/Images.xcassets/AppIcon.appiconset/Contents.json @@ -2,37 +2,52 @@ "images" : [ { "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" + "scale" : "3x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" + "scale" : "3x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Example/ios/Example/Info.plist b/Example/ios/Example/Info.plist index 73888d9..4545344 100644 --- a/Example/ios/Example/Info.plist +++ b/Example/ios/Example/Info.plist @@ -26,8 +26,6 @@ NSAppTransportSecurity - NSAllowsArbitraryLoads - NSExceptionDomains localhost diff --git a/Example/ios/Example/LaunchScreen.storyboard b/Example/ios/Example/LaunchScreen.storyboard new file mode 100644 index 0000000..1103311 --- /dev/null +++ b/Example/ios/Example/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/ios/Example/main.m b/Example/ios/Example/main.m index b1df44b..d645c72 100644 --- a/Example/ios/Example/main.m +++ b/Example/ios/Example/main.m @@ -2,7 +2,8 @@ #import "AppDelegate.h" -int main(int argc, char * argv[]) { +int main(int argc, char *argv[]) +{ @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } diff --git a/Example/ios/ExampleTests/ExampleTests.m b/Example/ios/ExampleTests/ExampleTests.m index 75eb311..8750e0c 100644 --- a/Example/ios/ExampleTests/ExampleTests.m +++ b/Example/ios/ExampleTests/ExampleTests.m @@ -13,7 +13,7 @@ @interface ExampleTests : XCTestCase @implementation ExampleTests -- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test { if (test(view)) { return YES; @@ -34,23 +34,25 @@ - (void)testRendersWelcomeScreen __block NSString *redboxError = nil; #ifdef DEBUG - RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { - if (level >= RCTLogLevelError) { - redboxError = message; - } - }); + RCTSetLogFunction( + ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); #endif while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { - if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { - return YES; - } - return NO; - }]; + foundElement = [self findSubviewInView:vc.view + matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; } #ifdef DEBUG @@ -61,5 +63,4 @@ - (void)testRendersWelcomeScreen XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); } - @end diff --git a/Example/ios/Podfile b/Example/ios/Podfile index e9c20e8..a141af5 100644 --- a/Example/ios/Podfile +++ b/Example/ios/Podfile @@ -1,81 +1,43 @@ -platform :ios, '9.0' +require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' -def add_flipper_pods! - version = '~> 0.33.1' - pod 'FlipperKit', version, :configuration => 'Debug' - pod 'FlipperKit/FlipperKitLayoutPlugin', version, :configuration => 'Debug' - pod 'FlipperKit/SKIOSNetworkPlugin', version, :configuration => 'Debug' - pod 'FlipperKit/FlipperKitUserDefaultsPlugin', version, :configuration => 'Debug' - pod 'FlipperKit/FlipperKitReactPlugin', version, :configuration => 'Debug' -end - -# Post Install processing for Flipper -def flipper_post_install(installer) - installer.pods_project.targets.each do |target| - if target.name == 'YogaKit' - target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '4.1' - end - end - end -end +platform :ios, '12.4' +install! 'cocoapods', :deterministic_uuids => false target 'Example' do - # Pods for Example - pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector" - pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec" - pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired" - pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety" - pod 'React', :path => '../node_modules/react-native/' - pod 'React-Core', :path => '../node_modules/react-native/' - pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules' - pod 'React-Core/DevSupport', :path => '../node_modules/react-native/' - pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS' - pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation' - pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob' - pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image' - pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS' - pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network' - pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings' - pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text' - pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' - pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/' - - pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' - pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' - pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor' - pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector' - pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon" - pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon" - pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true - - pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' - pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' - pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' + config = use_native_modules! + + # Flags change depending on the env values. + flags = get_default_flags() + + use_react_native!( + :path => config[:reactNativePath], + # Hermes is now enabled by default. Disable by setting this flag to false. + # Upcoming versions of React Native may rely on get_default_flags(), but + # we make it explicit here to aid in the React Native upgrade process. + :hermes_enabled => true, + :fabric_enabled => flags[:fabric_enabled], + # Enables Flipper. + # + # Note that if you have use_frameworks! enabled, Flipper will not work and + # you should disable the next line. + :flipper_configuration => FlipperConfiguration.enabled, + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) target 'ExampleTests' do inherit! :complete # Pods for testing end - use_native_modules! - - # Enables Flipper. - # - # Note that if you have use_frameworks! enabled, Flipper will not work and - # you should disable these next few lines. - add_flipper_pods! post_install do |installer| - flipper_post_install(installer) - end -end - -target 'Example-tvOS' do - # Pods for Example-tvOS - - target 'Example-tvOSTests' do - inherit! :search_paths - # Pods for testing + react_native_post_install( + installer, + # Set `mac_catalyst_enabled` to `true` in order to apply patches + # necessary for Mac Catalyst builds + :mac_catalyst_enabled => false + ) + __apply_Xcode_12_5_M1_post_install_workaround(installer) end end diff --git a/Example/ios/Podfile.lock b/Example/ios/Podfile.lock index afa88e8..62cbe0e 100644 --- a/Example/ios/Podfile.lock +++ b/Example/ios/Podfile.lock @@ -1,328 +1,431 @@ PODS: - - boost-for-react-native (1.63.0) - - CocoaAsyncSocket (7.6.4) - - CocoaLibEvent (1.0.0) + - boost (1.76.0) + - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - - FBLazyVector (0.62.0) - - FBReactNativeSpec (0.62.0): - - Folly (= 2018.10.22.00) - - RCTRequired (= 0.62.0) - - RCTTypeSafety (= 0.62.0) - - React-Core (= 0.62.0) - - React-jsi (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - Flipper (0.33.1): - - Flipper-Folly (~> 2.1) - - Flipper-RSocket (~> 1.0) - - Flipper-DoubleConversion (1.1.7) - - Flipper-Folly (2.1.1): - - boost-for-react-native - - CocoaLibEvent (~> 1.0) + - FBLazyVector (0.70.2) + - FBReactNativeSpec (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - RCTRequired (= 0.70.2) + - RCTTypeSafety (= 0.70.2) + - React-Core (= 0.70.2) + - React-jsi (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - Flipper (0.125.0): + - Flipper-Folly (~> 2.6) + - Flipper-RSocket (~> 1.4) + - Flipper-Boost-iOSX (1.76.0.1.11) + - Flipper-DoubleConversion (3.2.0.1) + - Flipper-Fmt (7.1.7) + - Flipper-Folly (2.6.10): + - Flipper-Boost-iOSX - Flipper-DoubleConversion + - Flipper-Fmt (= 7.1.7) - Flipper-Glog - - OpenSSL-Universal (= 1.0.2.19) - - Flipper-Glog (0.3.6) + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - Flipper-Glog (0.5.0.5) - Flipper-PeerTalk (0.0.4) - - Flipper-RSocket (1.0.0): - - Flipper-Folly (~> 2.0) - - FlipperKit (0.33.1): - - FlipperKit/Core (= 0.33.1) - - FlipperKit/Core (0.33.1): - - Flipper (~> 0.33.1) + - Flipper-RSocket (1.4.3): + - Flipper-Folly (~> 2.6) + - FlipperKit (0.125.0): + - FlipperKit/Core (= 0.125.0) + - FlipperKit/Core (0.125.0): + - Flipper (~> 0.125.0) - FlipperKit/CppBridge - FlipperKit/FBCxxFollyDynamicConvert - FlipperKit/FBDefines - FlipperKit/FKPortForwarding - - FlipperKit/CppBridge (0.33.1): - - Flipper (~> 0.33.1) - - FlipperKit/FBCxxFollyDynamicConvert (0.33.1): - - Flipper-Folly (~> 2.1) - - FlipperKit/FBDefines (0.33.1) - - FlipperKit/FKPortForwarding (0.33.1): + - SocketRocket (~> 0.6.0) + - FlipperKit/CppBridge (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (0.125.0): + - Flipper-Folly (~> 2.6) + - FlipperKit/FBDefines (0.125.0) + - FlipperKit/FKPortForwarding (0.125.0): - CocoaAsyncSocket (~> 7.6) - Flipper-PeerTalk (~> 0.0.4) - - FlipperKit/FlipperKitHighlightOverlay (0.33.1) - - FlipperKit/FlipperKitLayoutPlugin (0.33.1): + - FlipperKit/FlipperKitHighlightOverlay (0.125.0) + - FlipperKit/FlipperKitLayoutHelpers (0.125.0): - FlipperKit/Core - FlipperKit/FlipperKitHighlightOverlay - FlipperKit/FlipperKitLayoutTextSearchable + - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutTextSearchable (0.33.1) - - FlipperKit/FlipperKitNetworkPlugin (0.33.1): + - FlipperKit/FlipperKitLayoutPlugin (0.125.0): - FlipperKit/Core - - FlipperKit/FlipperKitReactPlugin (0.33.1): + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - FlipperKit/FlipperKitLayoutIOSDescriptors + - FlipperKit/FlipperKitLayoutTextSearchable + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitReactPlugin (0.125.0): - FlipperKit/Core - - FlipperKit/FlipperKitUserDefaultsPlugin (0.33.1): + - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0): - FlipperKit/Core - - FlipperKit/SKIOSNetworkPlugin (0.33.1): + - FlipperKit/SKIOSNetworkPlugin (0.125.0): - FlipperKit/Core - FlipperKit/FlipperKitNetworkPlugin - - Folly (2018.10.22.00): - - boost-for-react-native + - fmt (6.2.1) + - glog (0.3.5) + - hermes-engine (0.70.2) + - libevent (2.1.12) + - OpenSSL-Universal (1.1.1100) + - RCT-Folly (2021.07.22.00): + - boost - DoubleConversion - - Folly/Default (= 2018.10.22.00) + - fmt (~> 6.2.1) - glog - - Folly/Default (2018.10.22.00): - - boost-for-react-native + - RCT-Folly/Default (= 2021.07.22.00) + - RCT-Folly/Default (2021.07.22.00): + - boost - DoubleConversion + - fmt (~> 6.2.1) - glog - - glog (0.3.5) - - OpenSSL-Universal (1.0.2.19): - - OpenSSL-Universal/Static (= 1.0.2.19) - - OpenSSL-Universal/Static (1.0.2.19) - - RCTRequired (0.62.0) - - RCTTypeSafety (0.62.0): - - FBLazyVector (= 0.62.0) - - Folly (= 2018.10.22.00) - - RCTRequired (= 0.62.0) - - React-Core (= 0.62.0) - - React (0.62.0): - - React-Core (= 0.62.0) - - React-Core/DevSupport (= 0.62.0) - - React-Core/RCTWebSocket (= 0.62.0) - - React-RCTActionSheet (= 0.62.0) - - React-RCTAnimation (= 0.62.0) - - React-RCTBlob (= 0.62.0) - - React-RCTImage (= 0.62.0) - - React-RCTLinking (= 0.62.0) - - React-RCTNetwork (= 0.62.0) - - React-RCTSettings (= 0.62.0) - - React-RCTText (= 0.62.0) - - React-RCTVibration (= 0.62.0) - - React-Core (0.62.0): - - Folly (= 2018.10.22.00) + - RCT-Folly/Futures (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) - glog - - React-Core/Default (= 0.62.0) - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - libevent + - RCTRequired (0.70.2) + - RCTTypeSafety (0.70.2): + - FBLazyVector (= 0.70.2) + - RCTRequired (= 0.70.2) + - React-Core (= 0.70.2) + - React (0.70.2): + - React-Core (= 0.70.2) + - React-Core/DevSupport (= 0.70.2) + - React-Core/RCTWebSocket (= 0.70.2) + - React-RCTActionSheet (= 0.70.2) + - React-RCTAnimation (= 0.70.2) + - React-RCTBlob (= 0.70.2) + - React-RCTImage (= 0.70.2) + - React-RCTLinking (= 0.70.2) + - React-RCTNetwork (= 0.70.2) + - React-RCTSettings (= 0.70.2) + - React-RCTText (= 0.70.2) + - React-RCTVibration (= 0.70.2) + - React-bridging (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - React-jsi (= 0.70.2) + - React-callinvoker (0.70.2) + - React-Codegen (0.70.2): + - FBReactNativeSpec (= 0.70.2) + - RCT-Folly (= 2021.07.22.00) + - RCTRequired (= 0.70.2) + - RCTTypeSafety (= 0.70.2) + - React-Core (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-Core (0.70.2): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.70.2) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/CoreModulesHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/CoreModulesHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/Default (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/Default (0.70.2): - glog - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - RCT-Folly (= 2021.07.22.00) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/DevSupport (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/DevSupport (0.70.2): - glog - - React-Core/Default (= 0.62.0) - - React-Core/RCTWebSocket (= 0.62.0) - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) - - React-jsinspector (= 0.62.0) + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.70.2) + - React-Core/RCTWebSocket (= 0.70.2) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-jsinspector (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTActionSheetHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTActionSheetHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTAnimationHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTAnimationHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTBlobHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTBlobHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTImageHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTImageHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTLinkingHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTLinkingHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTNetworkHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTNetworkHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTSettingsHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTSettingsHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTTextHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTTextHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTVibrationHeaders (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTVibrationHeaders (0.70.2): - glog + - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-Core/RCTWebSocket (0.62.0): - - Folly (= 2018.10.22.00) + - React-Core/RCTWebSocket (0.70.2): - glog - - React-Core/Default (= 0.62.0) - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsiexecutor (= 0.62.0) + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.70.2) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-perflogger (= 0.70.2) - Yoga - - React-CoreModules (0.62.0): - - FBReactNativeSpec (= 0.62.0) - - Folly (= 2018.10.22.00) - - RCTTypeSafety (= 0.62.0) - - React-Core/CoreModulesHeaders (= 0.62.0) - - React-RCTImage (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - React-cxxreact (0.62.0): - - boost-for-react-native (= 1.63.0) + - React-CoreModules (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.70.2) + - React-Codegen (= 0.70.2) + - React-Core/CoreModulesHeaders (= 0.70.2) + - React-jsi (= 0.70.2) + - React-RCTImage (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-cxxreact (0.70.2): + - boost (= 1.76.0) - DoubleConversion - - Folly (= 2018.10.22.00) - glog - - React-jsinspector (= 0.62.0) - - React-jsi (0.62.0): - - boost-for-react-native (= 1.63.0) + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsinspector (= 0.70.2) + - React-logger (= 0.70.2) + - React-perflogger (= 0.70.2) + - React-runtimeexecutor (= 0.70.2) + - React-hermes (0.70.2): - DoubleConversion - - Folly (= 2018.10.22.00) - glog - - React-jsi/Default (= 0.62.0) - - React-jsi/Default (0.62.0): - - boost-for-react-native (= 1.63.0) + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - RCT-Folly/Futures (= 2021.07.22.00) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-jsiexecutor (= 0.70.2) + - React-jsinspector (= 0.70.2) + - React-perflogger (= 0.70.2) + - React-jsi (0.70.2): + - boost (= 1.76.0) - DoubleConversion - - Folly (= 2018.10.22.00) - glog - - React-jsiexecutor (0.62.0): + - RCT-Folly (= 2021.07.22.00) + - React-jsi/Default (= 0.70.2) + - React-jsi/Default (0.70.2): + - boost (= 1.76.0) - DoubleConversion - - Folly (= 2018.10.22.00) - glog - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - React-jsinspector (0.62.0) - - react-native-shimmer (0.5.0): - - React (>= 0.45.1) - - Shimmer (~> 1) - - React-RCTActionSheet (0.62.0): - - React-Core/RCTActionSheetHeaders (= 0.62.0) - - React-RCTAnimation (0.62.0): - - FBReactNativeSpec (= 0.62.0) - - Folly (= 2018.10.22.00) - - RCTTypeSafety (= 0.62.0) - - React-Core/RCTAnimationHeaders (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - React-RCTBlob (0.62.0): - - FBReactNativeSpec (= 0.62.0) - - Folly (= 2018.10.22.00) - - React-Core/RCTBlobHeaders (= 0.62.0) - - React-Core/RCTWebSocket (= 0.62.0) - - React-jsi (= 0.62.0) - - React-RCTNetwork (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - React-RCTImage (0.62.0): - - FBReactNativeSpec (= 0.62.0) - - Folly (= 2018.10.22.00) - - RCTTypeSafety (= 0.62.0) - - React-Core/RCTImageHeaders (= 0.62.0) - - React-RCTNetwork (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - React-RCTLinking (0.62.0): - - FBReactNativeSpec (= 0.62.0) - - React-Core/RCTLinkingHeaders (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - React-RCTNetwork (0.62.0): - - FBReactNativeSpec (= 0.62.0) - - Folly (= 2018.10.22.00) - - RCTTypeSafety (= 0.62.0) - - React-Core/RCTNetworkHeaders (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - React-RCTSettings (0.62.0): - - FBReactNativeSpec (= 0.62.0) - - Folly (= 2018.10.22.00) - - RCTTypeSafety (= 0.62.0) - - React-Core/RCTSettingsHeaders (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - React-RCTText (0.62.0): - - React-Core/RCTTextHeaders (= 0.62.0) - - React-RCTVibration (0.62.0): - - FBReactNativeSpec (= 0.62.0) - - Folly (= 2018.10.22.00) - - React-Core/RCTVibrationHeaders (= 0.62.0) - - ReactCommon/turbomodule/core (= 0.62.0) - - ReactCommon/callinvoker (0.62.0): + - RCT-Folly (= 2021.07.22.00) + - React-jsiexecutor (0.70.2): - DoubleConversion - - Folly (= 2018.10.22.00) - glog - - React-cxxreact (= 0.62.0) - - ReactCommon/turbomodule/core (0.62.0): + - RCT-Folly (= 2021.07.22.00) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-perflogger (= 0.70.2) + - React-jsinspector (0.70.2) + - React-logger (0.70.2): + - glog + - react-native-shimmer (0.6.0): + - React-Core + - Shimmer (~> 1) + - React-perflogger (0.70.2) + - React-RCTActionSheet (0.70.2): + - React-Core/RCTActionSheetHeaders (= 0.70.2) + - React-RCTAnimation (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.70.2) + - React-Codegen (= 0.70.2) + - React-Core/RCTAnimationHeaders (= 0.70.2) + - React-jsi (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-RCTBlob (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.70.2) + - React-Core/RCTBlobHeaders (= 0.70.2) + - React-Core/RCTWebSocket (= 0.70.2) + - React-jsi (= 0.70.2) + - React-RCTNetwork (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-RCTImage (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.70.2) + - React-Codegen (= 0.70.2) + - React-Core/RCTImageHeaders (= 0.70.2) + - React-jsi (= 0.70.2) + - React-RCTNetwork (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-RCTLinking (0.70.2): + - React-Codegen (= 0.70.2) + - React-Core/RCTLinkingHeaders (= 0.70.2) + - React-jsi (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-RCTNetwork (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.70.2) + - React-Codegen (= 0.70.2) + - React-Core/RCTNetworkHeaders (= 0.70.2) + - React-jsi (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-RCTSettings (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.70.2) + - React-Codegen (= 0.70.2) + - React-Core/RCTSettingsHeaders (= 0.70.2) + - React-jsi (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-RCTText (0.70.2): + - React-Core/RCTTextHeaders (= 0.70.2) + - React-RCTVibration (0.70.2): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.70.2) + - React-Core/RCTVibrationHeaders (= 0.70.2) + - React-jsi (= 0.70.2) + - ReactCommon/turbomodule/core (= 0.70.2) + - React-runtimeexecutor (0.70.2): + - React-jsi (= 0.70.2) + - ReactCommon/turbomodule/core (0.70.2): - DoubleConversion - - Folly (= 2018.10.22.00) - glog - - React-Core (= 0.62.0) - - React-cxxreact (= 0.62.0) - - React-jsi (= 0.62.0) - - ReactCommon/callinvoker (= 0.62.0) + - RCT-Folly (= 2021.07.22.00) + - React-bridging (= 0.70.2) + - React-callinvoker (= 0.70.2) + - React-Core (= 0.70.2) + - React-cxxreact (= 0.70.2) + - React-jsi (= 0.70.2) + - React-logger (= 0.70.2) + - React-perflogger (= 0.70.2) - Shimmer (1.0.2) + - SocketRocket (0.6.0) - Yoga (1.14.0) - YogaKit (1.18.1): - Yoga (~> 1.14) DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`) - - FlipperKit (~> 0.33.1) - - FlipperKit/FlipperKitLayoutPlugin (~> 0.33.1) - - FlipperKit/FlipperKitReactPlugin (~> 0.33.1) - - FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.33.1) - - FlipperKit/SKIOSNetworkPlugin (~> 0.33.1) - - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - Flipper (= 0.125.0) + - Flipper-Boost-iOSX (= 1.76.0.1.11) + - Flipper-DoubleConversion (= 3.2.0.1) + - Flipper-Fmt (= 7.1.7) + - Flipper-Folly (= 2.6.10) + - Flipper-Glog (= 0.5.0.5) + - Flipper-PeerTalk (= 0.0.4) + - Flipper-RSocket (= 1.4.3) + - FlipperKit (= 0.125.0) + - FlipperKit/Core (= 0.125.0) + - FlipperKit/CppBridge (= 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0) + - FlipperKit/FBDefines (= 0.125.0) + - FlipperKit/FKPortForwarding (= 0.125.0) + - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0) + - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0) + - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0) + - FlipperKit/FlipperKitReactPlugin (= 0.125.0) + - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0) + - FlipperKit/SKIOSNetworkPlugin (= 0.125.0) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes/hermes-engine.podspec`) + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - React (from `../node_modules/react-native/`) + - React-bridging (from `../node_modules/react-native/ReactCommon`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Codegen (from `build/generated/ios`) - React-Core (from `../node_modules/react-native/`) - React-Core/DevSupport (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-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - 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`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - react-native-shimmer (from `../node_modules/react-native-shimmer`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) @@ -332,57 +435,76 @@ DEPENDENCIES: - 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`) - - ReactCommon/callinvoker (from `../node_modules/react-native/ReactCommon`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: - - boost-for-react-native - CocoaAsyncSocket - - CocoaLibEvent - Flipper + - Flipper-Boost-iOSX - Flipper-DoubleConversion + - Flipper-Fmt - Flipper-Folly - Flipper-Glog - Flipper-PeerTalk - Flipper-RSocket - FlipperKit + - fmt + - libevent - OpenSSL-Universal - Shimmer + - SocketRocket - YogaKit EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" FBReactNativeSpec: - :path: "../node_modules/react-native/Libraries/FBReactNativeSpec" - Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec" + :path: "../node_modules/react-native/React/FBReactNativeSpec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes/hermes-engine.podspec" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: :path: "../node_modules/react-native/Libraries/RCTRequired" RCTTypeSafety: :path: "../node_modules/react-native/Libraries/TypeSafety" React: :path: "../node_modules/react-native/" + React-bridging: + :path: "../node_modules/react-native/ReactCommon" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Codegen: + :path: build/generated/ios 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-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" 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" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" react-native-shimmer: :path: "../node_modules/react-native-shimmer" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -401,52 +523,66 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: :path: "../node_modules/react-native/Libraries/Vibration" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" ReactCommon: :path: "../node_modules/react-native/ReactCommon" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c - CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845 - CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f - DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2 - FBLazyVector: 545eccf4f6ef2de8fd450fd8a1edb3f913c7371a - FBReactNativeSpec: 85c7f8347f4a6e911742228e89e245187afa298e - Flipper: 6c1f484f9a88d30ab3e272800d53688439e50f69 - Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41 - Flipper-Folly: 2de3d03e0acc7064d5e4ed9f730e2f217486f162 - Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6 + boost: a7c83b31436843459a1961bfd74b96033dc77234 + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + FBLazyVector: 0507edc21c06f1650c591f0981c846445469373b + FBReactNativeSpec: 698ef8604615cfa7ae2119e9ca4ed7687a6ae62e + Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0 + Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c + Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 + Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b + Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3 + Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446 Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 - Flipper-RSocket: 1260a31c05c238eabfa9bb8a64e3983049048371 - FlipperKit: 6dc9b8f4ef60d9e5ded7f0264db299c91f18832e - Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51 - glog: 1f3da668190260b06b429bb211bfbee5cd790c28 - OpenSSL-Universal: 8b48cc0d10c1b2923617dfe5c178aa9ed2689355 - RCTRequired: 0873f5bdb1762d2b9b1ae16a01c4f91d6ee3b6dd - RCTTypeSafety: a605e0cc0e4220f6e65896bd9e675073c2978f35 - React: 8abf6bdd2b05538e9445f7bbda800df744068bfe - React-Core: d6daa0d60a4180915e889a5e81f28522cb30359a - React-CoreModules: 9d5343b095a52e830954a1dd7ae1cb9321ceeddc - React-cxxreact: c108ca236585b9c802f1eeab11fed1a023faac3a - React-jsi: bc8166d6833cdcb0848c80710b26ce63fad2c099 - React-jsiexecutor: 8bf0b2707f05865113415088c398a7f98c0cf546 - React-jsinspector: 8e5913c4c6c54f0d3f9c9fc630c465a89cded65d - react-native-shimmer: d9e6f436e8b0318da2b6f391e04725363b01c2d9 - React-RCTActionSheet: 674afbc8b9c76e0a83520e0a51da29a70802c03f - React-RCTAnimation: f5f24330d09ee677fb49e0782f8321868f4df431 - React-RCTBlob: b773ce6138ab0d172ebd8a455fd4efd200a92549 - React-RCTImage: 8dbaa77916f9d21ff8faa0f3f5f06d4069c28e93 - React-RCTLinking: 312a2b3511e2829e68c300c2cdcae4282fefc7ef - React-RCTNetwork: 4b87acf29c38b8819bea67dad3edeca7b9a20718 - React-RCTSettings: be798c8b33392a90d9d551644610ffa349a89255 - React-RCTText: 91a0d0ae5434aa28fe0c89c03eb9d660ff53bd9b - React-RCTVibration: 0630aeb11e22f87c180ca9c0c3a0a0aba780cc62 - ReactCommon: d22162ab8f1358c53dfcd0f9c4d82d38facdbc48 + Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 + FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + hermes-engine: f9312a2ea8036d03b63568ebf392314f4fa8b474 + libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c + RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda + RCTRequired: d4033a367d0bfd1f23f67b501f8cdabf9afe617e + RCTTypeSafety: b112b2ccc59309a65284280c0a53baf1ce4b5860 + React: 04474547a4729eef1fb378ca42f302f4b3219eb8 + React-bridging: 1c8695b292b4a9baaca3960f6166d9766e20492d + React-callinvoker: 4d91e2db7773ee3fcea2d3a5c6beb52a5bfd4d71 + React-Codegen: 33356335c6f3b0869cb4434055fdec219139f635 + React-Core: 634b8aa20e1dad445425ee9581f4719bcfd1b19b + React-CoreModules: 746825283de4b54dcb4fd88703ff516297a5f60d + React-cxxreact: f8d2686d98b5ffed1b1de3aa62e1f81db4903153 + React-hermes: 4e9f5f9cfff42a23e7d6d8083e6c8a3f6f4926ee + React-jsi: 198b9b3e0a85e68cb6898265400fd8bf34cacda4 + React-jsiexecutor: 53bd208e5c27939c6e6365528393445a596a9a2b + React-jsinspector: 26c42646ab0bb69e29e837e23754fe7121eeaf94 + React-logger: 1bfd109a0ffa4c0989bbfac0c2d8c4abe4637faa + react-native-shimmer: 1c06d2f0bc09e415e0a9691301d4515a4d2b8f3f + React-perflogger: 6009895616a455781293950bbd63d53cfc7ffbc5 + React-RCTActionSheet: 5e90aa5712af18bfc86c2c6d97d4dbe0e5451c1d + React-RCTAnimation: 50c44d6501f8bfb2fe885e544501f8798b4ff3d6 + React-RCTBlob: 3cc08e7112dd7b77faf3fa481ba22ca2bba5f20a + React-RCTImage: ca8335860b5f64c383ad27f52a28d85089d49b7a + React-RCTLinking: 297cd91bdbf427efc861fc7943e6d683e61860fa + React-RCTNetwork: 8a197bff6f1dc5353484507a4cdcd47e9356316f + React-RCTSettings: d3db1f1e61a5ad8deb50f44f5cb6c7c3ef32b3ac + React-RCTText: c2c05ab3dbfb1cf5855b14802f392148970e48da + React-RCTVibration: 89e2cbea456ac5ec623943661d00e4dc45fe74b9 + React-runtimeexecutor: 80065f60af4f4b05603661070c8622bb3740bf16 + ReactCommon: 1209130f460e4aa9d255ddc75fa0a827ebf93dfb Shimmer: c5374be1c2b0c9e292fb05b339a513cf291cac86 - Yoga: 9db9ff2025ad21d1ac0a8b3c85d5ac4e7c29d525 + SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 + Yoga: 043f8eb97345d0171f27fead4d1849cacf0472a5 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 08584089fa8dca39531d18c61b78f160733a0e1f +PODFILE CHECKSUM: cceedf60c4793e5bccd88c162b1395e76e7ea8f8 -COCOAPODS: 1.8.4 +COCOAPODS: 1.11.3 diff --git a/Example/metro.config.js b/Example/metro.config.js index 13a9642..e91aba9 100644 --- a/Example/metro.config.js +++ b/Example/metro.config.js @@ -10,7 +10,7 @@ module.exports = { getTransformOptions: async () => ({ transform: { experimentalImportSupport: false, - inlineRequires: false, + inlineRequires: true, }, }), }, diff --git a/Example/package.json b/Example/package.json index 4bdd3b1..aa564e8 100644 --- a/Example/package.json +++ b/Example/package.json @@ -1,5 +1,5 @@ { - "name": "Example", + "name": "example", "version": "0.0.1", "private": true, "scripts": { @@ -7,22 +7,23 @@ "ios": "react-native run-ios", "start": "react-native start", "test": "jest", + "postinstall": "DESTINATION='node_modules/react-native-shimmer' LIB_FILE=`cd .. && echo \\`pwd\\`/\\`npm pack\\`` && (rm -rf $DESTINATION || true) && mkdir $DESTINATION && tar -xvzf $LIB_FILE -C $DESTINATION --strip-components 1 && rm $LIB_FILE", "lint": "eslint ." }, "dependencies": { - "react": "16.11.0", - "react-native": "0.62.0", + "react": "18.1.0", + "react-native": "0.70.2", "react-native-shimmer": "*" }, "devDependencies": { - "@babel/core": "^7.9.0", - "@babel/runtime": "^7.9.2", - "@react-native-community/eslint-config": "^1.0.0", - "babel-jest": "^25.2.4", - "eslint": "^6.8.0", - "jest": "^25.2.4", - "metro-react-native-babel-preset": "^0.59.0", - "react-test-renderer": "16.11.0" + "@babel/core": "^7.12.9", + "@babel/runtime": "^7.12.5", + "@react-native-community/eslint-config": "^2.0.0", + "babel-jest": "^26.6.3", + "eslint": "^7.32.0", + "jest": "^26.6.3", + "metro-react-native-babel-preset": "0.72.3", + "react-test-renderer": "18.1.0" }, "jest": { "preset": "react-native" diff --git a/package.json b/package.json index 0a9ee58..4dbfd94 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "prettier": "^1.16.1" }, "peerDependencies": { - "react": ">=16.0.0", - "react-native": ">=0.45.1 <1.0.0" + "react": "*", + "react-native": "*" }, "dependencies": { "prop-types": "^15.6.0" diff --git a/react-native-shimmer.podspec b/react-native-shimmer.podspec index 4e7db41..b057635 100644 --- a/react-native-shimmer.podspec +++ b/react-native-shimmer.podspec @@ -16,6 +16,6 @@ Pod::Spec.new do |s| s.requires_arc = true s.platform = :ios, "9.0" - s.dependency 'React', '>= 0.45.1' + s.dependency 'React-Core' s.dependency 'Shimmer', '~> 1' end From e49d66954466e2c369d1b3a6f9542782085b0f38 Mon Sep 17 00:00:00 2001 From: Joel Arvidsson Date: Wed, 5 Oct 2022 17:48:49 +0200 Subject: [PATCH 2/2] Add switch to toggle animation in example app --- Example/app.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Example/app.js b/Example/app.js index 01e152e..89c7f99 100644 --- a/Example/app.js +++ b/Example/app.js @@ -1,5 +1,5 @@ import React from 'react'; -import { Image, StyleSheet, Text, View } from 'react-native'; +import { Image, StyleSheet, Text, View, Switch } from 'react-native'; import Shimmer from 'react-native-shimmer'; import logoSource from './react-logo.png'; @@ -16,12 +16,21 @@ const styles = StyleSheet.create({ fontWeight: '300', marginBottom: 20, }, + switch: { + marginBottom: 10, + flexDirection: 'row', + alignItems: 'center', + }, + switchLabel: { + fontSize: 16, + marginLeft: 10, + }, loading: { marginVertical: 10, }, loadingText: { textAlign: 'center', - fontSize: 16, + fontSize: 18, fontWeight: '500', }, reactLogo: { @@ -31,14 +40,20 @@ const styles = StyleSheet.create({ }); export default function Example(props) { + const [animating, setAnimating] = React.useState(true); + return ( Shimmer Example - - + + + Animating + + + Loading... - +