From 53ab08daddd3044d8cd3ee70f14ed3cac58f9ea2 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Mon, 15 May 2023 11:26:47 +0200 Subject: [PATCH] fix: declare support for `react-native` 0.72 (#1388) --- .github/workflows/build.yml | 1 + .yarn/plugins/link-project.js | 8 ++++- Gemfile.lock | 4 +-- android/app/build.gradle | 2 ++ android/app/src/main/jni/CMakeLists.txt | 7 +++- android/dependencies.gradle | 2 ++ android/test-app-util.gradle | 27 ++++++++++++++ example/android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- example/package.json | 4 +-- package.json | 4 +-- scripts/android-nightly.patch | 36 ------------------- scripts/disable-safe-area-context.patch | 36 +++++++++++++++++++ scripts/test-matrix.sh | 3 +- scripts/update-ksp-versions.mjs | 14 +++++++- yarn.lock | 8 ++--- 16 files changed, 108 insertions(+), 52 deletions(-) create mode 100644 scripts/disable-safe-area-context.patch diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fc41a2f98..9f27553e6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -235,6 +235,7 @@ jobs: - name: Set up react-native@nightly if: ${{ github.event_name == 'schedule' }} run: | + git apply scripts/disable-safe-area-context.patch git apply scripts/android-nightly.patch npm run set-react-version -- nightly shell: bash diff --git a/.yarn/plugins/link-project.js b/.yarn/plugins/link-project.js index 70b177228..672a3d902 100644 --- a/.yarn/plugins/link-project.js +++ b/.yarn/plugins/link-project.js @@ -16,6 +16,7 @@ module.exports = { } const fs = require("node:fs"); + const os = require("node:os"); const path = require("node:path"); function normalize(p) { @@ -37,7 +38,12 @@ module.exports = { const linkPath = path.join(nodeModulesPath, name); fs.rmSync(linkPath, { force: true, maxRetries: 3, recursive: true }); - fs.symlinkSync(path.relative(nodeModulesPath, projectPath), linkPath); + if (os.platform() === "win32") { + fs.symlinkSync(projectPath, linkPath, "junction"); + } else { + const target = path.relative(nodeModulesPath, projectPath); + fs.symlinkSync(target, linkPath); + } } }, }, diff --git a/Gemfile.lock b/Gemfile.lock index dbdb3bc31..ae8fb8709 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.5) + CFPropertyList (3.0.6) rexml ast (2.4.2) atomos (0.1.3) @@ -50,4 +50,4 @@ DEPENDENCIES xcodeproj BUNDLED WITH - 2.3.11 + 2.4.10 diff --git a/android/app/build.gradle b/android/app/build.gradle index 465dc03df..924dbc2f8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -10,6 +10,8 @@ plugins { id("org.jetbrains.kotlin.android") } +checkEnvironment() + def reactNativePath = file(findNodeModulesPath("react-native", rootDir)) if (autodetectReactNativeVersion || enableNewArchitecture) { diff --git a/android/app/src/main/jni/CMakeLists.txt b/android/app/src/main/jni/CMakeLists.txt index 4d2caf9aa..0212e7205 100644 --- a/android/app/src/main/jni/CMakeLists.txt +++ b/android/app/src/main/jni/CMakeLists.txt @@ -13,7 +13,12 @@ set(REACTTESTAPP_SOURCE_FILES ) # Suppress 'Manually-specified variables were not used by the project' warning -set(UNUSED_VARIABLES ${REACT_COMMON_DIR} ${REACT_JNILIBS_DIR}) +set(UNUSED_VARIABLES + ${NODE_MODULES_DIR} # No longer used in 0.72 + ${REACT_ANDROID_BUILD_DIR} # No longer used in 0.72 + ${REACT_COMMON_DIR} + ${REACT_JNILIBS_DIR} +) if(DEFINED REACT_ANDROID_DIR) # New architecture diff --git a/android/dependencies.gradle b/android/dependencies.gradle index 7bb797f51..a6249d372 100644 --- a/android/dependencies.gradle +++ b/android/dependencies.gradle @@ -5,6 +5,8 @@ static String getKspVersion(String kotlinVersion) { return [ // Run `scripts/update-ksp-versions.mjs` to update this list // update-ksp-versions start + "1.8.21-1.0.11", + "1.8.20-1.0.11", "1.8.10-1.0.9", "1.8.0-1.0.9", "1.7.22-1.0.8", diff --git a/android/test-app-util.gradle b/android/test-app-util.gradle index ab7c81cbc..337e3de15 100644 --- a/android/test-app-util.gradle +++ b/android/test-app-util.gradle @@ -6,6 +6,33 @@ import java.security.MessageDigest ext.manifest = null +ext.checkEnvironment = { + def (major, minor, patch) = gradle.gradleVersion.findAll(/\d+/) + def gradleVersion = (major as int) * 10000 + (minor as int) * 100 + (patch as int) + if (reactNativeVersion > 0 && reactNativeVersion < 7200) { + if (gradleVersion < 70501 || gradleVersion >= 80000) { + logger.warn([ + "Latest Gradle 7.x is required for current React Native version. ", + "Run the following command in the 'android' folder to install a supported version: ", + "./gradlew wrapper --gradle-version=7.6.1", + ].join("")) + } + } else { + // Gradle 7.5+ seems to be working with 0.72 so we will only recommend a + // newer version if it's older. + if (gradleVersion < 70501) { + logger.warn([ + "Latest Gradle 8.0.x is recommended for React Native 0.72 and higher. ", + "Run the following command in the 'android' folder to install a supported version: ", + "./gradlew wrapper --gradle-version=8.0.2", + "\n\n", + "If you still need to work with older versions of React Native, ", + "Gradle 7.5.1+ should still work." + ].join("")) + } + } +} + ext.findFile = { fileName -> def currentDirPath = rootDir == null ? null : rootDir.toString() diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 4dcd11227..a951019e8 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -29,7 +29,7 @@ android.enableJetifier=true # Version of Flipper to use with React Native. Default value is whatever React # Native defaults to. To disable Flipper, set it to `false`. -#FLIPPER_VERSION=0.125.0 +#FLIPPER_VERSION=0.182.0 # Enable Fabric at runtime. #USE_FABRIC=1 diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index ae04661ee..774fae876 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-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/example/package.json b/example/package.json index 785a94377..e2e6f42c5 100644 --- a/example/package.json +++ b/example/package.json @@ -18,9 +18,9 @@ }, "peerDependencies": { "react": "~17.0.1 || ~18.0.0 || ~18.1.0 || ~18.2.0", - "react-native": "^0.0.0-0 || 0.64 - 0.71 || 1000.0.0", + "react-native": "^0.0.0-0 || 0.64 - 0.72 || 1000.0.0", "react-native-macos": "^0.0.0-0 || 0.64 || 0.66 || 0.68 || 0.71", - "react-native-windows": "^0.0.0-0 || 0.64 - 0.71" + "react-native-windows": "^0.0.0-0 || 0.64 - 0.72" }, "devDependencies": { "@babel/core": "^7.1.6", diff --git a/package.json b/package.json index e21e14a51..848d8c605 100644 --- a/package.json +++ b/package.json @@ -95,9 +95,9 @@ "@react-native-community/cli-platform-ios": ">=5.0", "mustache": "^4.0.0", "react": "~17.0.1 || ~18.0.0 || ~18.1.0 || ~18.2.0", - "react-native": "^0.0.0-0 || 0.64 - 0.71 || 1000.0.0", + "react-native": "^0.0.0-0 || 0.64 - 0.72 || 1000.0.0", "react-native-macos": "^0.0.0-0 || 0.64 || 0.66 || 0.68 || 0.71", - "react-native-windows": "^0.0.0-0 || 0.64 - 0.71" + "react-native-windows": "^0.0.0-0 || 0.64 - 0.72" }, "peerDependenciesMeta": { "@expo/config-plugins": { diff --git a/scripts/android-nightly.patch b/scripts/android-nightly.patch index 1159cadc3..b29709c12 100644 --- a/scripts/android-nightly.patch +++ b/scripts/android-nightly.patch @@ -1,39 +1,3 @@ -diff --git a/example/App.js b/example/App.js -index c9cd14d..f63758d 100644 ---- a/example/App.js -+++ b/example/App.js -@@ -2,6 +2,7 @@ - import React, { useCallback, useMemo, useState } from "react"; - import { - NativeModules, -+ SafeAreaView, - ScrollView, - StatusBar, - StyleSheet, -@@ -10,7 +11,6 @@ import { - useColorScheme, - View, - } from "react-native"; --import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; - // @ts-expect-error - import { version as coreVersion } from "react-native/Libraries/Core/ReactNativeVersion"; - import { Colors, Header } from "react-native/Libraries/NewAppScreen"; -@@ -169,7 +169,6 @@ const App = ({ concurrentRoot }) => { - ); - - return ( -- - - - { - - - -- - ); - }; - diff --git a/example/package.json b/example/package.json index 9c2e1aa..94fb85e 100644 --- a/example/package.json diff --git a/scripts/disable-safe-area-context.patch b/scripts/disable-safe-area-context.patch new file mode 100644 index 000000000..2403be5ce --- /dev/null +++ b/scripts/disable-safe-area-context.patch @@ -0,0 +1,36 @@ +diff --git a/example/App.js b/example/App.js +index c9cd14d..f63758d 100644 +--- a/example/App.js ++++ b/example/App.js +@@ -2,6 +2,7 @@ + import React, { useCallback, useMemo, useState } from "react"; + import { + NativeModules, ++ SafeAreaView, + ScrollView, + StatusBar, + StyleSheet, +@@ -10,7 +11,6 @@ import { + useColorScheme, + View, + } from "react-native"; +-import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; + // @ts-expect-error + import { version as coreVersion } from "react-native/Libraries/Core/ReactNativeVersion"; + import { Colors, Header } from "react-native/Libraries/NewAppScreen"; +@@ -169,7 +169,6 @@ const App = ({ concurrentRoot }) => { + ); + + return ( +- + + + { + + + +- + ); + }; + diff --git a/scripts/test-matrix.sh b/scripts/test-matrix.sh index 4cbbc625b..4b69df1b6 100755 --- a/scripts/test-matrix.sh +++ b/scripts/test-matrix.sh @@ -93,6 +93,7 @@ echo popd 1> /dev/null prepare # `react-native-safe-area-context` doesn't support latest New Arch changes +git apply ../scripts/disable-safe-area-context.patch sed -i '' 's/"react-native-safe-area-context": ".[.0-9]*",//' package.json echo @@ -137,4 +138,4 @@ echo "│ Initialize new app │" echo "└─────────────────────┘" echo -yarn react-native init-test-app --destination template-example --name TemplateExample --platform android,ios +GIT_IGNORE_FILE=".gitignore" yarn react-native init-test-app --destination template-example --name TemplateExample --platform android,ios diff --git a/scripts/update-ksp-versions.mjs b/scripts/update-ksp-versions.mjs index 89f748fc7..a4294bf5a 100755 --- a/scripts/update-ksp-versions.mjs +++ b/scripts/update-ksp-versions.mjs @@ -10,6 +10,10 @@ const artifactId = "com.google.devtools.ksp.gradle.plugin"; const rows = 50; const searchUrl = `https://search.maven.org/solrsearch/select?q=g:%22${groupId}%22+AND+a:%22${artifactId}%22&core=gav&rows=${rows}&wt=json`; +/** + * @param {{ docs?: { id: string; g: string; a: string; v: string; }[]; }} response + * @returns {string[]} + */ function extractVersions(response) { if (!Array.isArray(response.docs)) { return []; @@ -25,6 +29,10 @@ function extractVersions(response) { return Object.values(versionMap); } +/** + * @param {string} output + * @param {string[]} versions + */ function update(output, versions) { const startMarker = "// update-ksp-versions start"; const endMarker = "// update-ksp-versions end"; @@ -35,7 +43,11 @@ function update(output, versions) { new RegExp(`${startMarker}.*${endMarker}`, "s"), [startMarker, ...versions.map((v) => `"${v}",`), endMarker].join(separator) ); - fs.writeFileSync(output, updated); + + if (updated !== src) { + fs.writeFileSync(output, updated); + console.log(`Updated '${dependenciesGradle}'`); + } } function main() { diff --git a/yarn.lock b/yarn.lock index bae260efa..ece571c3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5470,9 +5470,9 @@ __metadata: react-native-windows: ^0.71.4 peerDependencies: react: ~17.0.1 || ~18.0.0 || ~18.1.0 || ~18.2.0 - react-native: ^0.0.0-0 || 0.64 - 0.71 || 1000.0.0 + react-native: ^0.0.0-0 || 0.64 - 0.72 || 1000.0.0 react-native-macos: ^0.0.0-0 || 0.64 || 0.66 || 0.68 || 0.71 - react-native-windows: ^0.0.0-0 || 0.64 - 0.71 + react-native-windows: ^0.0.0-0 || 0.64 - 0.72 languageName: unknown linkType: soft @@ -9915,9 +9915,9 @@ fsevents@^2.3.2: "@react-native-community/cli-platform-ios": ">=5.0" mustache: ^4.0.0 react: ~17.0.1 || ~18.0.0 || ~18.1.0 || ~18.2.0 - react-native: ^0.0.0-0 || 0.64 - 0.71 || 1000.0.0 + react-native: ^0.0.0-0 || 0.64 - 0.72 || 1000.0.0 react-native-macos: ^0.0.0-0 || 0.64 || 0.66 || 0.68 || 0.71 - react-native-windows: ^0.0.0-0 || 0.64 - 0.71 + react-native-windows: ^0.0.0-0 || 0.64 - 0.72 peerDependenciesMeta: "@expo/config-plugins": optional: true