diff --git a/.github/workflows/monorepo-app-reanimated-build-check-action.yml b/.github/workflows/monorepo-app-reanimated-build-check-action.yml deleted file mode 100644 index 729ef3503f7..00000000000 --- a/.github/workflows/monorepo-app-reanimated-build-check-action.yml +++ /dev/null @@ -1,92 +0,0 @@ -name: Monorepo app Reanimated build check [Action] -env: - YARN_ENABLE_IMMUTABLE_INSTALLS: 0 -on: - workflow_call: - inputs: - platform: - required: true - type: string - concurrency_group: - required: true - type: string - is_hoisted: - required: true - type: boolean - -jobs: - build: - if: github.repository == 'software-mansion/react-native-reanimated' - runs-on: ${{ inputs.platform == 'iOS' && 'macos-14' || 'ubuntu-latest' }} - concurrency: - group: ${{ inputs.concurrency_group }} - cancel-in-progress: true - steps: - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'zulu' - java-version: '17' - - name: Create directories - run: mkdir -p monorepo/packages - - - name: Setup monorepo - working-directory: monorepo - # TODO: Put Monorepo template into a separate repo/package - run: echo '{"name":"rnos-monorepo-tester","version":"1.0.0","license":"MIT","private":true,"workspaces":{"packages":["RootApp","packages/PackageApp", "AppA", "AppB"],"nohoist":["**/react","**/react-dom","**/react-native","**/react-native/**","**/react-native-codegen","**/react-native-dev-menu"]}}' > package.json - - name: Install dependencies - working-directory: monorepo - run: yarn install - - name: Install React Native CLI - working-directory: monorepo - run: yarn add -W @react-native-community/cli - - name: Create RootApp - working-directory: monorepo - run: yarn rnc-cli init RootApp --skip-install --pm yarn --install-pods false --skip-git-init - - name: Create PackageApp - working-directory: monorepo/packages - run: yarn rnc-cli init PackageApp --skip-install --pm yarn --install-pods false --skip-git-init - - - name: Install dependencies for RootApp - working-directory: monorepo/RootApp - run: yarn install - - name: Install Reanimated for RootApp - working-directory: monorepo/RootApp - run: yarn add github:software-mansion/react-native-reanimated#${{ github.ref }} - - - name: Install dependencies for PackageApp - working-directory: monorepo/packages/PackageApp - run: yarn install - - name: Install Reanimated for PackageApp - working-directory: monorepo/packages/PackageApp - run: yarn add github:software-mansion/react-native-reanimated#${{ github.ref }} - - - name: Setup hoisted Reanimated - if: ${{ inputs.is_hoisted }} - working-directory: monorepo - run: yarn add github:software-mansion/react-native-reanimated#${{ github.ref }} -W - - - name: Install Pods for RootApp - if: ${{ inputs.platform == 'iOS' }} - working-directory: monorepo/RootApp/ios - run: bundle install && bundle exec pod install - - name: Install Pods for PackageApp - if: ${{ inputs.platform == 'iOS' }} - working-directory: monorepo/packages/PackageApp/ios - run: bundle install && bundle exec pod install - - name: Build iOS app RootApp - if: ${{ inputs.platform == 'iOS' }} - working-directory: monorepo/RootApp - run: yarn react-native run-ios --simulator='iPhone 14' --no-packager - - name: Build iOS app PackageApp - if: ${{ inputs.platform == 'iOS' }} - working-directory: monorepo/packages/PackageApp - run: yarn react-native run-ios --simulator='iPhone 14' --no-packager - - name: Build Android RootApp - if: ${{ inputs.platform == 'Android' }} - working-directory: monorepo/RootApp/android - run: ./gradlew assembleDebug --console=plain - - name: Build Android PackageApp - if: ${{ inputs.platform == 'Android' }} - working-directory: monorepo/packages/PackageApp/android - run: ./gradlew assembleDebug --console=plain diff --git a/.github/workflows/monorepo-app-reanimated-build-check-nightly.yml b/.github/workflows/monorepo-app-reanimated-build-check-nightly.yml deleted file mode 100644 index 0181d46b266..00000000000 --- a/.github/workflows/monorepo-app-reanimated-build-check-nightly.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: Monorepo app Reanimated build check [Nightly] -on: - pull_request: - paths: - - .github/workflows/monorepo-app-reanimated-build-check-nightly.yml - - .github/workflows/monorepo-app-reanimated-build-check-action.yml - - RNReanimated.podspec - - packages/react-native-reanimated/scripts/reanimated_utils.rb - - packages/react-native-reanimated/android/build.gradle - merge_group: - branches: - - main - push: - branches: - - main - paths: - - .github/workflows/monorepo-app-reanimated-build-check-nightly.yml - - .github/workflows/monorepo-app-reanimated-build-check-action.yml - - packages/react-native-reanimated/RNReanimated.podspec - - packages/react-native-reanimated/scripts/reanimated_utils.rb - - packages/react-native-reanimated/android/build.gradle - schedule: - - cron: '37 19 * * *' # at 21:37 every day - workflow_call: - workflow_dispatch: - -jobs: - build_android_reanimated_non_hoisted: - if: github.repository == 'software-mansion/react-native-reanimated' - name: Android (non-hoisted Reanimated) - uses: ./.github/workflows/monorepo-app-reanimated-build-check-action.yml - with: - platform: Android - concurrency_group: build_monorepo_android_in_app_reanimated-${{ github.ref }} - is_hoisted: false - - build_ios_reanimated_non_hoisted: - if: github.repository == 'software-mansion/react-native-reanimated' - name: iOS (non-hoisted Reanimated) - uses: ./.github/workflows/monorepo-app-reanimated-build-check-action.yml - with: - platform: iOS - concurrency_group: build_monorepo_ios_in_app_reanimated-${{ github.ref }} - is_hoisted: false - - build_android_reanimated_hoisted: - if: github.repository == 'software-mansion/react-native-reanimated' - name: Android (hoisted Reanimated) - uses: ./.github/workflows/monorepo-app-reanimated-build-check-action.yml - with: - platform: Android - concurrency_group: build_monorepo_android_reanimated_hoisted-${{ github.ref }} - is_hoisted: true - - build_ios_reanimated_hoisted: - if: github.repository == 'software-mansion/react-native-reanimated' - name: iOS (hoisted Reanimated) - uses: ./.github/workflows/monorepo-app-reanimated-build-check-action.yml - with: - platform: iOS - concurrency_group: build_monorepo_ios_reanimated_hoisted-${{ github.ref }} - is_hoisted: true diff --git a/.github/workflows/reanimated-android-validation.yml b/.github/workflows/reanimated-android-validation.yml index c35131609ef..ca1e55c4b50 100644 --- a/.github/workflows/reanimated-android-validation.yml +++ b/.github/workflows/reanimated-android-validation.yml @@ -55,6 +55,8 @@ jobs: run: | python -m pip install --upgrade pip pip install cpplint==1.6.1 + pip install cmakelang==0.6.13 + - name: Clear annotations run: .github/workflows/helper/clear-annotations.sh diff --git a/.github/workflows/reanimated-release-checks.yml b/.github/workflows/reanimated-release-checks.yml index 90c3c6c5acc..aee5c02f5cf 100644 --- a/.github/workflows/reanimated-release-checks.yml +++ b/.github/workflows/reanimated-release-checks.yml @@ -2,10 +2,10 @@ name: Reanimated release checks on: pull_request: branches: - - "[0-9]+.[0-9]+-stable" + - '[0-9]+.[0-9]+-stable' push: branches: - - "[0-9]+.[0-9]+-stable" + - '[0-9]+.[0-9]+-stable' workflow_call: workflow_dispatch: @@ -50,11 +50,6 @@ jobs: name: Example Typescript check and lint uses: ./.github/workflows/example-typescript-check-and-lint.yml - monorepo_app_reanimated_build_check_nightly: - if: github.repository == 'software-mansion/react-native-reanimated' - name: Monorepo app Reanimated build check [Nightly] - uses: ./.github/workflows/monorepo-app-reanimated-build-check-nightly.yml - reanimated_android_validation: if: github.repository == 'software-mansion/react-native-reanimated' name: Reanimated Android validation @@ -104,4 +99,3 @@ jobs: if: github.repository == 'software-mansion/react-native-reanimated' name: Yarn validation uses: ./.github/workflows/yarn-validation.yml - diff --git a/README.md b/README.md index d7d5b17a312..a795540afbb 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ gesture-based interactions. [![NPM Reanimated publish nightly](https://github.com/software-mansion/react-native-reanimated/actions/workflows/npm-reanimated-publish-nightly.yml/badge.svg)](https://github.com/software-mansion/react-native-reanimated/actions/workflows/npm-reanimated-publish-nightly.yml) [![Reanimated compatibility check](https://github.com/software-mansion/react-native-reanimated/actions/workflows/reanimated-compatibility-check-nightly.yml/badge.svg)](https://github.com/software-mansion/react-native-reanimated/actions/workflows/reanimated-compatibility-check-nightly.yml) -[![Monorepo app Reanimated build check](https://github.com/software-mansion/react-native-reanimated/actions/workflows/monorepo-app-reanimated-build-check-nightly.yml/badge.svg)](https://github.com/software-mansion/react-native-reanimated/actions/workflows/monorepo-app-reanimated-build-check-nightly.yml) [![Static framework Reanimated build check](https://github.com/software-mansion/react-native-reanimated/actions/workflows/static-framework-reanimated-build-check-nightly.yml/badge.svg)](https://github.com/software-mansion/react-native-reanimated/actions/workflows/static-framework-reanimated-build-check-nightly.yml) [![React Native nightly Reanimated build check](https://github.com/software-mansion/react-native-reanimated/actions/workflows/react-native-nightly-reanimated-build-check-nightly.yml/badge.svg)](https://github.com/software-mansion/react-native-reanimated/actions/workflows/react-native-nightly-reanimated-build-check-nightly.yml) [![Expo DevClient build check](https://github.com/software-mansion/react-native-reanimated/actions/workflows/expo-devclient-build-check-nightly.yml/badge.svg)](https://github.com/software-mansion/react-native-reanimated/actions/workflows/expo-devclient-build-check-nightly.yml) diff --git a/apps/common-app/package.json b/apps/common-app/package.json index 8fdaa5fd79e..181f36d9fc7 100644 --- a/apps/common-app/package.json +++ b/apps/common-app/package.json @@ -11,13 +11,11 @@ "@react-native-async-storage/async-storage": "*", "@react-native-community/slider": "*", "@react-native-masked-view/masked-view": "*", - "@react-native-picker/picker": "*", "@react-navigation/bottom-tabs": "*", "@react-navigation/native": "*", "@react-navigation/native-stack": "*", "@react-navigation/stack": "*", "@shopify/flash-list": "*", - "@stylexjs/babel-plugin": "*", "d3-shape": "*", "react": "*", "react-dom": "*", @@ -35,13 +33,11 @@ "@react-native-async-storage/async-storage": "^1.24.0", "@react-native-community/slider": "^4.5.5", "@react-native-masked-view/masked-view": "^0.3.1", - "@react-native-picker/picker": "^2.9.0", "@react-navigation/bottom-tabs": "^7.0.0", "@react-navigation/native": "^7.0.0", "@react-navigation/native-stack": "^7.0.0", "@react-navigation/stack": "^7.0.0", "@shopify/flash-list": "^1.7.1", - "@stylexjs/babel-plugin": "^0.7.5", "@tsconfig/react-native": "^3.0.0", "@types/d3-shape": "^3.1.1", "d3-shape": "^3.2.0", diff --git a/apps/macos-example/macos/Podfile.lock b/apps/macos-example/macos/Podfile.lock index a95e1ca7ad2..327fd917538 100644 --- a/apps/macos-example/macos/Podfile.lock +++ b/apps/macos-example/macos/Podfile.lock @@ -1,7 +1,7 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.75.13) + - FBLazyVector (0.75.16) - fmt (9.1.0) - glog (0.3.5) - RCT-Folly (2024.01.01.00): @@ -20,31 +20,31 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog - - RCTDeprecation (0.75.13) - - RCTRequired (0.75.13) - - RCTTypeSafety (0.75.13): - - FBLazyVector (= 0.75.13) - - RCTRequired (= 0.75.13) - - React-Core (= 0.75.13) - - React (0.75.13): - - React-Core (= 0.75.13) - - React-Core/DevSupport (= 0.75.13) - - React-Core/RCTWebSocket (= 0.75.13) - - React-RCTActionSheet (= 0.75.13) - - React-RCTAnimation (= 0.75.13) - - React-RCTBlob (= 0.75.13) - - React-RCTImage (= 0.75.13) - - React-RCTLinking (= 0.75.13) - - React-RCTNetwork (= 0.75.13) - - React-RCTSettings (= 0.75.13) - - React-RCTText (= 0.75.13) - - React-RCTVibration (= 0.75.13) - - React-callinvoker (0.75.13) - - React-Core (0.75.13): + - RCTDeprecation (0.75.16) + - RCTRequired (0.75.16) + - RCTTypeSafety (0.75.16): + - FBLazyVector (= 0.75.16) + - RCTRequired (= 0.75.16) + - React-Core (= 0.75.16) + - React (0.75.16): + - React-Core (= 0.75.16) + - React-Core/DevSupport (= 0.75.16) + - React-Core/RCTWebSocket (= 0.75.16) + - React-RCTActionSheet (= 0.75.16) + - React-RCTAnimation (= 0.75.16) + - React-RCTBlob (= 0.75.16) + - React-RCTImage (= 0.75.16) + - React-RCTLinking (= 0.75.16) + - React-RCTNetwork (= 0.75.16) + - React-RCTSettings (= 0.75.16) + - React-RCTText (= 0.75.16) + - React-RCTVibration (= 0.75.16) + - React-callinvoker (0.75.16) + - React-Core (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - - React-Core/Default (= 0.75.13) + - React-Core/Default (= 0.75.16) - React-cxxreact - React-featureflags - React-jsc @@ -56,7 +56,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/CoreModulesHeaders (0.75.13): + - React-Core/CoreModulesHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -72,7 +72,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/Default (0.75.13): + - React-Core/Default (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -87,12 +87,12 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/DevSupport (0.75.13): + - React-Core/DevSupport (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - - React-Core/Default (= 0.75.13) - - React-Core/RCTWebSocket (= 0.75.13) + - React-Core/Default (= 0.75.16) + - React-Core/RCTWebSocket (= 0.75.16) - React-cxxreact - React-featureflags - React-jsc @@ -104,7 +104,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTActionSheetHeaders (0.75.13): + - React-Core/RCTActionSheetHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -120,7 +120,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTAnimationHeaders (0.75.13): + - React-Core/RCTAnimationHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -136,7 +136,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTBlobHeaders (0.75.13): + - React-Core/RCTBlobHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -152,7 +152,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTImageHeaders (0.75.13): + - React-Core/RCTImageHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -168,7 +168,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTLinkingHeaders (0.75.13): + - React-Core/RCTLinkingHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -184,7 +184,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTNetworkHeaders (0.75.13): + - React-Core/RCTNetworkHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -200,7 +200,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTSettingsHeaders (0.75.13): + - React-Core/RCTSettingsHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -216,7 +216,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTTextHeaders (0.75.13): + - React-Core/RCTTextHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -232,7 +232,7 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTVibrationHeaders (0.75.13): + - React-Core/RCTVibrationHeaders (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation @@ -248,11 +248,11 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTWebSocket (0.75.13): + - React-Core/RCTWebSocket (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - - React-Core/Default (= 0.75.13) + - React-Core/Default (= 0.75.16) - React-cxxreact - React-featureflags - React-jsc @@ -264,35 +264,35 @@ PODS: - React-utils - SocketRocket (= 0.7.0) - Yoga - - React-CoreModules (0.75.13): + - React-CoreModules (0.75.16): - DoubleConversion - fmt (= 9.1.0) - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety (= 0.75.13) - - React-Core/CoreModulesHeaders (= 0.75.13) - - React-jsi (= 0.75.13) + - RCTTypeSafety (= 0.75.16) + - React-Core/CoreModulesHeaders (= 0.75.16) + - React-jsi (= 0.75.16) - React-jsinspector - React-NativeModulesApple - React-RCTBlob - - React-RCTImage (= 0.75.13) + - React-RCTImage (= 0.75.16) - ReactCodegen - ReactCommon - SocketRocket (= 0.7.0) - - React-cxxreact (0.75.13): + - React-cxxreact (0.75.16): - boost - DoubleConversion - fmt (= 9.1.0) - glog - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.75.13) - - React-debug (= 0.75.13) - - React-jsi (= 0.75.13) + - React-callinvoker (= 0.75.16) + - React-debug (= 0.75.16) + - React-jsi (= 0.75.16) - React-jsinspector - - React-logger (= 0.75.13) - - React-perflogger (= 0.75.13) - - React-runtimeexecutor (= 0.75.13) - - React-debug (0.75.13) - - React-defaultsnativemodule (0.75.13): + - React-logger (= 0.75.16) + - React-perflogger (= 0.75.16) + - React-runtimeexecutor (= 0.75.16) + - React-debug (0.75.16) + - React-defaultsnativemodule (0.75.16): - DoubleConversion - glog - RCT-Folly (= 2024.01.01.00) @@ -317,7 +317,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-domnativemodule (0.75.13): + - React-domnativemodule (0.75.16): - DoubleConversion - glog - RCT-Folly (= 2024.01.01.00) @@ -339,7 +339,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-Fabric (0.75.13): + - React-Fabric (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -349,21 +349,21 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/animations (= 0.75.13) - - React-Fabric/attributedstring (= 0.75.13) - - React-Fabric/componentregistry (= 0.75.13) - - React-Fabric/componentregistrynative (= 0.75.13) - - React-Fabric/components (= 0.75.13) - - React-Fabric/core (= 0.75.13) - - React-Fabric/dom (= 0.75.13) - - React-Fabric/imagemanager (= 0.75.13) - - React-Fabric/leakchecker (= 0.75.13) - - React-Fabric/mounting (= 0.75.13) - - React-Fabric/observers (= 0.75.13) - - React-Fabric/scheduler (= 0.75.13) - - React-Fabric/telemetry (= 0.75.13) - - React-Fabric/templateprocessor (= 0.75.13) - - React-Fabric/uimanager (= 0.75.13) + - React-Fabric/animations (= 0.75.16) + - React-Fabric/attributedstring (= 0.75.16) + - React-Fabric/componentregistry (= 0.75.16) + - React-Fabric/componentregistrynative (= 0.75.16) + - React-Fabric/components (= 0.75.16) + - React-Fabric/core (= 0.75.16) + - React-Fabric/dom (= 0.75.16) + - React-Fabric/imagemanager (= 0.75.16) + - React-Fabric/leakchecker (= 0.75.16) + - React-Fabric/mounting (= 0.75.16) + - React-Fabric/observers (= 0.75.16) + - React-Fabric/scheduler (= 0.75.16) + - React-Fabric/telemetry (= 0.75.16) + - React-Fabric/templateprocessor (= 0.75.16) + - React-Fabric/uimanager (= 0.75.16) - React-featureflags - React-graphics - React-jsc @@ -374,7 +374,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/animations (0.75.13): + - React-Fabric/animations (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -394,7 +394,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.75.13): + - React-Fabric/attributedstring (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -414,7 +414,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.75.13): + - React-Fabric/componentregistry (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -434,7 +434,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.75.13): + - React-Fabric/componentregistrynative (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -454,7 +454,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components (0.75.13): + - React-Fabric/components (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -464,9 +464,9 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.75.13) - - React-Fabric/components/root (= 0.75.13) - - React-Fabric/components/view (= 0.75.13) + - React-Fabric/components/legacyviewmanagerinterop (= 0.75.16) + - React-Fabric/components/root (= 0.75.16) + - React-Fabric/components/view (= 0.75.16) - React-featureflags - React-graphics - React-jsc @@ -477,7 +477,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.75.13): + - React-Fabric/components/legacyviewmanagerinterop (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -497,7 +497,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.75.13): + - React-Fabric/components/root (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -517,7 +517,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.75.13): + - React-Fabric/components/view (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -538,7 +538,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-Fabric/core (0.75.13): + - React-Fabric/core (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -558,7 +558,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/dom (0.75.13): + - React-Fabric/dom (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -578,7 +578,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.75.13): + - React-Fabric/imagemanager (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -598,7 +598,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.75.13): + - React-Fabric/leakchecker (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -618,7 +618,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.75.13): + - React-Fabric/mounting (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -638,7 +638,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers (0.75.13): + - React-Fabric/observers (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -648,7 +648,7 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.75.13) + - React-Fabric/observers/events (= 0.75.16) - React-featureflags - React-graphics - React-jsc @@ -659,7 +659,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.75.13): + - React-Fabric/observers/events (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -679,7 +679,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.75.13): + - React-Fabric/scheduler (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -701,7 +701,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.75.13): + - React-Fabric/telemetry (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -721,7 +721,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.75.13): + - React-Fabric/templateprocessor (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -741,7 +741,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.75.13): + - React-Fabric/uimanager (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -751,7 +751,7 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.75.13) + - React-Fabric/uimanager/consistency (= 0.75.16) - React-featureflags - React-graphics - React-jsc @@ -763,7 +763,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.75.13): + - React-Fabric/uimanager/consistency (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -784,7 +784,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-FabricComponents (0.75.13): + - React-FabricComponents (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -795,8 +795,8 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.75.13) - - React-FabricComponents/textlayoutmanager (= 0.75.13) + - React-FabricComponents/components (= 0.75.16) + - React-FabricComponents/textlayoutmanager (= 0.75.16) - React-featureflags - React-graphics - React-jsc @@ -809,7 +809,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components (0.75.13): + - React-FabricComponents/components (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -820,15 +820,15 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.75.13) - - React-FabricComponents/components/iostextinput (= 0.75.13) - - React-FabricComponents/components/modal (= 0.75.13) - - React-FabricComponents/components/rncore (= 0.75.13) - - React-FabricComponents/components/safeareaview (= 0.75.13) - - React-FabricComponents/components/scrollview (= 0.75.13) - - React-FabricComponents/components/text (= 0.75.13) - - React-FabricComponents/components/textinput (= 0.75.13) - - React-FabricComponents/components/unimplementedview (= 0.75.13) + - React-FabricComponents/components/inputaccessory (= 0.75.16) + - React-FabricComponents/components/iostextinput (= 0.75.16) + - React-FabricComponents/components/modal (= 0.75.16) + - React-FabricComponents/components/rncore (= 0.75.16) + - React-FabricComponents/components/safeareaview (= 0.75.16) + - React-FabricComponents/components/scrollview (= 0.75.16) + - React-FabricComponents/components/text (= 0.75.16) + - React-FabricComponents/components/textinput (= 0.75.16) + - React-FabricComponents/components/unimplementedview (= 0.75.16) - React-featureflags - React-graphics - React-jsc @@ -841,7 +841,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/inputaccessory (0.75.13): + - React-FabricComponents/components/inputaccessory (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -864,7 +864,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/iostextinput (0.75.13): + - React-FabricComponents/components/iostextinput (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -887,7 +887,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/modal (0.75.13): + - React-FabricComponents/components/modal (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -910,7 +910,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/rncore (0.75.13): + - React-FabricComponents/components/rncore (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -933,7 +933,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/safeareaview (0.75.13): + - React-FabricComponents/components/safeareaview (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -956,7 +956,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/scrollview (0.75.13): + - React-FabricComponents/components/scrollview (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -979,7 +979,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/text (0.75.13): + - React-FabricComponents/components/text (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1002,7 +1002,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/textinput (0.75.13): + - React-FabricComponents/components/textinput (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1025,7 +1025,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/unimplementedview (0.75.13): + - React-FabricComponents/components/unimplementedview (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1048,7 +1048,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/textlayoutmanager (0.75.13): + - React-FabricComponents/textlayoutmanager (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1071,26 +1071,26 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/core - Yoga - - React-FabricImage (0.75.13): + - React-FabricImage (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired (= 0.75.13) - - RCTTypeSafety (= 0.75.13) + - RCTRequired (= 0.75.16) + - RCTTypeSafety (= 0.75.16) - React-Fabric - React-graphics - React-ImageManager - React-jsc - React-jsi - - React-jsiexecutor (= 0.75.13) + - React-jsiexecutor (= 0.75.16) - React-logger - React-rendererdebug - React-utils - ReactCommon - Yoga - - React-featureflags (0.75.13) - - React-featureflagsnativemodule (0.75.13): + - React-featureflags (0.75.16) + - React-featureflagsnativemodule (0.75.16): - DoubleConversion - glog - RCT-Folly (= 2024.01.01.00) @@ -1111,7 +1111,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-graphics (0.75.13): + - React-graphics (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog @@ -1120,7 +1120,7 @@ PODS: - React-jsi - React-jsiexecutor - React-utils - - React-idlecallbacksnativemodule (0.75.13): + - React-idlecallbacksnativemodule (0.75.16): - DoubleConversion - glog - RCT-Folly (= 2024.01.01.00) @@ -1142,7 +1142,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - React-ImageManager (0.75.13): + - React-ImageManager (0.75.16): - glog - RCT-Folly/Fabric - React-Core/Default @@ -1151,45 +1151,45 @@ PODS: - React-graphics - React-rendererdebug - React-utils - - React-jsc (0.75.13): - - React-jsc/Fabric (= 0.75.13) - - React-jsi (= 0.75.13) - - React-jsc/Fabric (0.75.13): - - React-jsi (= 0.75.13) - - React-jserrorhandler (0.75.13): + - React-jsc (0.75.16): + - React-jsc/Fabric (= 0.75.16) + - React-jsi (= 0.75.16) + - React-jsc/Fabric (0.75.16): + - React-jsi (= 0.75.16) + - React-jserrorhandler (0.75.16): - RCT-Folly/Fabric (= 2024.01.01.00) - React-debug - React-jsi - - React-jsi (0.75.13): + - React-jsi (0.75.16): - boost - DoubleConversion - fmt (= 9.1.0) - glog - RCT-Folly (= 2024.01.01.00) - - React-jsiexecutor (0.75.13): + - React-jsiexecutor (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog - RCT-Folly (= 2024.01.01.00) - - React-cxxreact (= 0.75.13) - - React-jsi (= 0.75.13) + - React-cxxreact (= 0.75.16) + - React-jsi (= 0.75.16) - React-jsinspector - - React-perflogger (= 0.75.13) - - React-jsinspector (0.75.13): + - React-perflogger (= 0.75.16) + - React-jsinspector (0.75.16): - DoubleConversion - glog - RCT-Folly (= 2024.01.01.00) - React-featureflags - React-jsi - - React-runtimeexecutor (= 0.75.13) - - React-jsitracing (0.75.13): + - React-runtimeexecutor (= 0.75.16) + - React-jsitracing (0.75.16): - React-jsi - - React-logger (0.75.13): + - React-logger (0.75.16): - glog - - React-Mapbuffer (0.75.13): + - React-Mapbuffer (0.75.16): - glog - React-debug - - React-microtasksnativemodule (0.75.13): + - React-microtasksnativemodule (0.75.16): - DoubleConversion - glog - RCT-Folly (= 2024.01.01.00) @@ -1212,8 +1212,8 @@ PODS: - Yoga - react-native-safe-area-context (4.13.1): - React-Core - - React-nativeconfig (0.75.13) - - React-NativeModulesApple (0.75.13): + - React-nativeconfig (0.75.16) + - React-NativeModulesApple (0.75.16): - glog - React-callinvoker - React-Core @@ -1224,13 +1224,13 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-perflogger (0.75.13) - - React-performancetimeline (0.75.13): + - React-perflogger (0.75.16) + - React-performancetimeline (0.75.16): - RCT-Folly (= 2024.01.01.00) - React-cxxreact - - React-RCTActionSheet (0.75.13): - - React-Core/RCTActionSheetHeaders (= 0.75.13) - - React-RCTAnimation (0.75.13): + - React-RCTActionSheet (0.75.16): + - React-Core/RCTActionSheetHeaders (= 0.75.16) + - React-RCTAnimation (0.75.16): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety - React-Core/RCTAnimationHeaders @@ -1238,7 +1238,7 @@ PODS: - React-NativeModulesApple - ReactCodegen - ReactCommon - - React-RCTAppDelegate (0.75.13): + - React-RCTAppDelegate (0.75.16): - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1262,7 +1262,7 @@ PODS: - React-utils - ReactCodegen - ReactCommon - - React-RCTBlob (0.75.13): + - React-RCTBlob (0.75.16): - DoubleConversion - fmt (= 9.1.0) - RCT-Folly (= 2024.01.01.00) @@ -1274,7 +1274,7 @@ PODS: - React-RCTNetwork - ReactCodegen - ReactCommon - - React-RCTFabric (0.75.13): + - React-RCTFabric (0.75.16): - glog - RCT-Folly/Fabric (= 2024.01.01.00) - React-Core @@ -1297,7 +1297,7 @@ PODS: - React-runtimescheduler - React-utils - Yoga - - React-RCTImage (0.75.13): + - React-RCTImage (0.75.16): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety - React-Core/RCTImageHeaders @@ -1306,14 +1306,14 @@ PODS: - React-RCTNetwork - ReactCodegen - ReactCommon - - React-RCTLinking (0.75.13): - - React-Core/RCTLinkingHeaders (= 0.75.13) - - React-jsi (= 0.75.13) + - React-RCTLinking (0.75.16): + - React-Core/RCTLinkingHeaders (= 0.75.16) + - React-jsi (= 0.75.16) - React-NativeModulesApple - ReactCodegen - ReactCommon - - ReactCommon/turbomodule/core (= 0.75.13) - - React-RCTNetwork (0.75.13): + - ReactCommon/turbomodule/core (= 0.75.16) + - React-RCTNetwork (0.75.16): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety - React-Core/RCTNetworkHeaders @@ -1321,7 +1321,7 @@ PODS: - React-NativeModulesApple - ReactCodegen - ReactCommon - - React-RCTSettings (0.75.13): + - React-RCTSettings (0.75.16): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety - React-Core/RCTSettingsHeaders @@ -1329,24 +1329,24 @@ PODS: - React-NativeModulesApple - ReactCodegen - ReactCommon - - React-RCTText (0.75.13): - - React-Core/RCTTextHeaders (= 0.75.13) + - React-RCTText (0.75.16): + - React-Core/RCTTextHeaders (= 0.75.16) - Yoga - - React-RCTVibration (0.75.13): + - React-RCTVibration (0.75.16): - RCT-Folly (= 2024.01.01.00) - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple - ReactCodegen - ReactCommon - - React-rendererconsistency (0.75.13) - - React-rendererdebug (0.75.13): + - React-rendererconsistency (0.75.16) + - React-rendererdebug (0.75.16): - DoubleConversion - fmt (= 9.1.0) - RCT-Folly (= 2024.01.01.00) - React-debug - - React-rncore (0.75.13) - - React-RuntimeApple (0.75.13): + - React-rncore (0.75.16) + - React-RuntimeApple (0.75.16): - RCT-Folly/Fabric (= 2024.01.01.00) - React-callinvoker - React-Core/Default @@ -1364,7 +1364,7 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - React-RuntimeCore (0.75.13): + - React-RuntimeCore (0.75.16): - glog - RCT-Folly/Fabric (= 2024.01.01.00) - React-cxxreact @@ -1377,9 +1377,9 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - React-runtimeexecutor (0.75.13): - - React-jsi (= 0.75.13) - - React-runtimescheduler (0.75.13): + - React-runtimeexecutor (0.75.16): + - React-jsi (= 0.75.16) + - React-runtimescheduler (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - React-callinvoker @@ -1392,13 +1392,13 @@ PODS: - React-rendererdebug - React-runtimeexecutor - React-utils - - React-utils (0.75.13): + - React-utils (0.75.16): - glog - RCT-Folly (= 2024.01.01.00) - React-debug - React-jsc - - React-jsi (= 0.75.13) - - ReactCodegen (0.75.13): + - React-jsi (= 0.75.16) + - ReactCodegen (0.75.16): - DoubleConversion - glog - RCT-Folly @@ -1418,46 +1418,46 @@ PODS: - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactCommon (0.75.13): - - ReactCommon/turbomodule (= 0.75.13) - - ReactCommon/turbomodule (0.75.13): + - ReactCommon (0.75.16): + - ReactCommon/turbomodule (= 0.75.16) + - ReactCommon/turbomodule (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.75.13) - - React-cxxreact (= 0.75.13) - - React-jsi (= 0.75.13) - - React-logger (= 0.75.13) - - React-perflogger (= 0.75.13) - - ReactCommon/turbomodule/bridging (= 0.75.13) - - ReactCommon/turbomodule/core (= 0.75.13) - - ReactCommon/turbomodule/bridging (0.75.13): + - React-callinvoker (= 0.75.16) + - React-cxxreact (= 0.75.16) + - React-jsi (= 0.75.16) + - React-logger (= 0.75.16) + - React-perflogger (= 0.75.16) + - ReactCommon/turbomodule/bridging (= 0.75.16) + - ReactCommon/turbomodule/core (= 0.75.16) + - ReactCommon/turbomodule/bridging (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.75.13) - - React-cxxreact (= 0.75.13) - - React-jsi (= 0.75.13) - - React-logger (= 0.75.13) - - React-perflogger (= 0.75.13) - - ReactCommon/turbomodule/core (0.75.13): + - React-callinvoker (= 0.75.16) + - React-cxxreact (= 0.75.16) + - React-jsi (= 0.75.16) + - React-logger (= 0.75.16) + - React-perflogger (= 0.75.16) + - ReactCommon/turbomodule/core (0.75.16): - DoubleConversion - fmt (= 9.1.0) - glog - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.75.13) - - React-cxxreact (= 0.75.13) - - React-debug (= 0.75.13) - - React-featureflags (= 0.75.13) - - React-jsi (= 0.75.13) - - React-logger (= 0.75.13) - - React-perflogger (= 0.75.13) - - React-utils (= 0.75.13) + - React-callinvoker (= 0.75.16) + - React-cxxreact (= 0.75.16) + - React-debug (= 0.75.16) + - React-featureflags (= 0.75.16) + - React-jsi (= 0.75.16) + - React-logger (= 0.75.16) + - React-perflogger (= 0.75.16) + - React-utils (= 0.75.16) - RNCAsyncStorage (1.24.0): - React-Core - - RNCPicker (2.9.0): + - RNCPicker (2.10.2): - React-Core - RNGestureHandler (2.20.2): - DoubleConversion @@ -1804,71 +1804,71 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 78c06792d4bc8e05ba232b20737af9883a947a51 DoubleConversion: e9fd6969c78f190642ac8adbd3a5ac37995620dc - FBLazyVector: 674045444aef553388dd1165ef6984ca413f2fbf + FBLazyVector: ebbb0088dce747c92a3832ff6cc4f2428d2b39a6 fmt: c32f09ca7679bf28db6ba79e474dab38daa634a1 glog: f12b70f4104265bf944bf5800b4f85034eba0ea7 RCT-Folly: 693a1865d476549c2b4a788ec924ce59dd7cb8cb - RCTDeprecation: ff2cabe2e15e2e96194401db4c0d5254ad3857cd - RCTRequired: 8beb10b2371b492b08e403fa8465c614c661f7d9 - RCTTypeSafety: f9ebb687a6b1bc6253d6f95737b85769e0879cb6 - React: 52e8062836161af2fc11f4377776270ac986d515 - React-callinvoker: 26ff2b2589a0f00e8bba5394a75427bc69a00abe - React-Core: 548508be610d647f080c8b94cbbb608fa6434705 - React-CoreModules: 7be04dd0cfe91716601e526b9d0696fe58ea0e42 - React-cxxreact: f26bebcc3dd65f3879e5bfd603cd77201d62020a - React-debug: 8bbb9e4b4107a9f40b5a7c466873d7a9b4740839 - React-defaultsnativemodule: 6d4300b98ff5cfd0dc558d4d67a7ad211577a756 - React-domnativemodule: 28a1f5a059eba6b853eb2d1884f6f944bd09e18e - React-Fabric: 0f48daed285240e2b619d23902330580f8e30319 - React-FabricComponents: 5a9165a43376bcb44ebb719a9a42689c0cea8c87 - React-FabricImage: e6acce5ce12b9ade03f8eeb355bf3efd781ca666 - React-featureflags: 3623689e625d18899994cb12a377d30982f50159 - React-featureflagsnativemodule: d1acbf0e9ee0e6cb6907f23987d360d89dbf7f39 - React-graphics: 645c2c735837df0a3aec34c85127aa0c517ac1e3 - React-idlecallbacksnativemodule: 100c772b06b53c4ef0786caa8ab1cce34168768f - React-ImageManager: a4d9e88bd648e67113bf58ac576aeeea28226351 - React-jsc: 13b2a70c777931a42d28aa203c99088a65d3e6d1 - React-jserrorhandler: 0ec77f36d87009fa5bfb05bcc1a759565289deef - React-jsi: 375a917fcae52f17d61ad27a0d8a30071394cc75 - React-jsiexecutor: b3ad40efc425fdeffcfa1d491da0e63c3da678b8 - React-jsinspector: b0f390b1267022f9105fe52ab6e05c7e8b13931f - React-jsitracing: cdae491de33aaf4edd0fe6f2aef4077b4bd9063f - React-logger: 833be969bc3fa6cdec4e8d4d17da0a4adb56a7d9 - React-Mapbuffer: d473bad154e9e075a55f817d5ef33b87937a46c0 - React-microtasksnativemodule: 20510f9fca779fba67abd8ca164b5ea44ca03304 + RCTDeprecation: 1a64a4f0bf3c0f62fa3d4f6ce1c2e03f8c8546fb + RCTRequired: 280394d12d478c94be017e680c795f4ef9c84f37 + RCTTypeSafety: 35e178804ed3ce588d444b0c23f231f2a20a1678 + React: c9c8b39d07c9bc845a7bd1957524f90714fa4db7 + React-callinvoker: 9bb70ff84d1b2c1a193dd7b881a34544690583a2 + React-Core: 1bb1ae89cef9b032218c8cf72a226fd410b0b629 + React-CoreModules: 965b8c39fed3972aa5ca7b2dcb4a7f3d6399f925 + React-cxxreact: 5fa1e8e194931b81fdee535c27603018bddcc3c4 + React-debug: 71277c41e3ea00d88faea0e7fdc70bc5441becaf + React-defaultsnativemodule: eb7d59b6f4c018d6a9dedabb51be50f4e1a12e94 + React-domnativemodule: fe48fb8416a86b95706e0bd923f1a1ebb2f51dc1 + React-Fabric: 883efc0d08dca6620114155ef65d52cdd1fa850f + React-FabricComponents: ece1fd6e0d3324c3aa6a6a1c1430c6b9f0699dcb + React-FabricImage: cf25f33029ce7a594b3fb7544b1f30b45afc0e5c + React-featureflags: 9dfc9a470b198f2af08dda9ca51091599c18375d + React-featureflagsnativemodule: a228133ebaac7309556361b64b75ee6c9fb23861 + React-graphics: 0bf22b1537743c16547926b5f9100d2101f26e5a + React-idlecallbacksnativemodule: 228e4fcf2f4011a62941d2d0bd615117160bf6bc + React-ImageManager: 06474c1e70255003bc9cac91d42f65b40d83af9c + React-jsc: 0658d2a6fb31513b0860b0e371b12541838bdc33 + React-jserrorhandler: 8b5e329bf96e449d3c4243dc4f00f77d951446e4 + React-jsi: 9091c2b7590146ff89eb9c028637ccf12881cba4 + React-jsiexecutor: a7c55a36df7569cbb76cb455233aa988336bfdc7 + React-jsinspector: 60b57fb1cce720928505e0e0c663af65b3568cc6 + React-jsitracing: 9345056779a4ff94c7a62967e7ffacd705321b26 + React-logger: 7e30032239af894a3de5320d132b7afe49ee4f10 + React-Mapbuffer: 5c2e4284948e47d5a46243f218dbe39393e3e37f + React-microtasksnativemodule: 03881a25bb7a2db99a79e3a8e575bbadb24391ce react-native-safe-area-context: 004fe00b8c5aae5d57de1c27ff728cf6d3918b03 - React-nativeconfig: 5c2aaf96afeb7d45c925329feb609785add2a1a4 - React-NativeModulesApple: e97929d0bb6db0312a15cbbfc1c1c466b8f3936b - React-perflogger: 177ffbe623576b6f3b889bc805a883d8e452a24b - React-performancetimeline: 8003981a23b143ca25f541dd509bf401d9c04c4a - React-RCTActionSheet: 4cac8492b6519dcd7c6ae0335d80fc5abcdd0f49 - React-RCTAnimation: 89dcef51998f7b3f3eb5abb4955318c2f8873b19 - React-RCTAppDelegate: 52f723abb0076d63de8c8ccc6b38b1a77e167cfc - React-RCTBlob: da84e37ee3eb62e4955d52fa5cb8d2171bb704da - React-RCTFabric: 3886a6b6739a621967f1bca5e225ce790629ce5e - React-RCTImage: 7b4e79da0eb50373bc689029d662d4fe213d44e0 - React-RCTLinking: be9e9407563e3fc0d179000925903c0dc1c4d628 - React-RCTNetwork: d64e7b41052f62c85e13474fa7f71b477e1ec807 - React-RCTSettings: a7e14cd3d3c4b46e42b7e2049d53ce705ca77347 - React-RCTText: 4fdd0309e675becaea87897242ee6349a9b03676 - React-RCTVibration: 724c5f6938ac069a9c23a368b2df1a9b936416c6 - React-rendererconsistency: 420895d9e2d9e19710c6112a344ef4f49d1e4e0d - React-rendererdebug: 210da78fdae294ca06cde02463c3019ebf2b5b34 - React-rncore: 0a4b50833ea9b64af003b2b06a873cafb7ee6bb1 - React-RuntimeApple: f0cd2ed5596aecd95b1cf868a8c8c88b22ad418d - React-RuntimeCore: 43e9870b7692fb262e29b032db6cf14a7cf8a6dd - React-runtimeexecutor: 02c09792a6641ddcf229b2e1881ab95d3a56b06f - React-runtimescheduler: f046544a4c32769cf5f6f401d983696c342d0f5a - React-utils: e36f15c92ca305e254d1091a7af595c428bf44ce - ReactCodegen: 2987e13bcf036a2a2bdb324f8707d22761ad20f9 - ReactCommon: 1f073a117cae46d35c6bbc0f1dcf8d25b4e79d7e + React-nativeconfig: 33b8222107c5eb4b73b9cd6d28397ab123904d5c + React-NativeModulesApple: 7ac40d907aa6e653e4063072c474ff8416cabad7 + React-perflogger: 4ef0d0f93248f8331d7de7824e4b7b34d9740147 + React-performancetimeline: 6b41c3a8d4fd1bc9b5df5f6f269779560e38d3cf + React-RCTActionSheet: 9de394e5786c8a129bcb1677736eed4cb80b6f1d + React-RCTAnimation: f7d388e5367dd1611761dbf2a1d96c4f1932de2a + React-RCTAppDelegate: dc04e6aae2b6808ae8f4b272ea328b651a19a3dc + React-RCTBlob: 41e79b0dd56e64e3c5d2b03f1790b0337d4d7374 + React-RCTFabric: b4173524029bb2f18d29a0169f862c6cc92be5ca + React-RCTImage: 0eda203ee739ace6ac409226e267c87182d78b39 + React-RCTLinking: a15757e88e7fc3c70cf2b49b9ad678789a41cbd8 + React-RCTNetwork: 06a35d8cea3b93c6fdcf45099a63dc2a6e5554a6 + React-RCTSettings: b48b8765b3384798a91eb271a81d89a2fd559351 + React-RCTText: 93e7bcccb0056412275d11bf4ec3074189688464 + React-RCTVibration: 062d47b765b17882a2d577dd550b8e2720105422 + React-rendererconsistency: 017d7843a61140b7e382340421e4dfa0bbf51138 + React-rendererdebug: 266e7c47a06c02a0a67b5ef77b560a53d3c72e38 + React-rncore: e2688b8a3daa9913bb921dd0c717b5f3de595bb4 + React-RuntimeApple: ca103387e77c0da9025b271a9570f15c07addf4a + React-RuntimeCore: 771fae5d5becec41a61777d901cf60e0d82973b2 + React-runtimeexecutor: 655bc58c8341e2f1806c13b395ef2d8dadb768fc + React-runtimescheduler: 203909e404c1aff1536898ec61233ca1ad3a69c5 + React-utils: 1cf02e8d4880550ff7550c162a454adae239f82c + ReactCodegen: 023efeb9a9e9d4df117128652aa688e25c518fba + ReactCommon: e10fb4f939b3abe445dc8095997470a538627ec6 RNCAsyncStorage: ec53e44dc3e75b44aa2a9f37618a49c3bc080a7a - RNCPicker: f963e01f78e546a93b98aa201501713dbda14e94 + RNCPicker: d162737e03e48797110dbb60e5ddc03012e87e0b RNGestureHandler: 82f59e40580e0c2f8262552c149716511131b412 RNReanimated: ed490424d3b8b9f2acd104577c73b374fc79310b RNSVG: 8b1a777d54096b8c2a0fd38fc9d5a454332bbb4d SocketRocket: 9ee265c4b5ae2382d18e4ee1d2dd2d7af0ff1ab5 - Yoga: 4e91dcb096f425c6b02dd173c73288cec61b7268 + Yoga: 209f62622a01344dbb9fa8d348610eaeb7df2cca PODFILE CHECKSUM: 8d50cc2acc9f6a6b1a12bd9106b86385ad72266f diff --git a/apps/web-example/package.json b/apps/web-example/package.json index 58042944c30..d747b792d1f 100644 --- a/apps/web-example/package.json +++ b/apps/web-example/package.json @@ -19,7 +19,7 @@ "expo": "^52.0.4", "react": "18.3.1", "react-dom": "18.3.1", - "react-native": "0.76.0", + "react-native": "0.76.5", "react-native-reanimated": "workspace:*", "react-native-web": "0.19.11" }, diff --git a/package.json b/package.json index b207048a35d..9df784781ff 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "packages/react-native-reanimated", "packages/eslint-plugin-reanimated", "packages/react-native-reanimated/plugin", + "packages/react-native-worklets", "apps/common-app", "apps/paper-example", "apps/fabric-example", diff --git a/packages/docs-reanimated/blog/flip-card.md b/packages/docs-reanimated/blog/flip-card.md index d71c1308dbc..930962f98b7 100644 --- a/packages/docs-reanimated/blog/flip-card.md +++ b/packages/docs-reanimated/blog/flip-card.md @@ -12,11 +12,11 @@ import FlipCardSrc from '!!raw-loader!@site/static/examples/FlipCard'; For storing information about whether the card is flipped or not we use [shared value](/docs/fundamentals/glossary#shared-value) with the `useSharedValue` hook. Using shared values helps to prevent unnecessary re-renders. - + This allows us to [interpolate](/docs/utilities/interpolate) values between 0-180 and 180-360 degrees, depending on whether the card is flipped or not. In addition, we use [withTiming](/docs/animations/withTiming) util which makes our animation smooth. - + Flip Card - + diff --git a/packages/docs-reanimated/docs/fundamentals/handling-gestures.mdx b/packages/docs-reanimated/docs/fundamentals/handling-gestures.mdx index fb3602fb4c5..6058cb64bcc 100644 --- a/packages/docs-reanimated/docs/fundamentals/handling-gestures.mdx +++ b/packages/docs-reanimated/docs/fundamentals/handling-gestures.mdx @@ -118,6 +118,6 @@ In this section, we went through the basics of handling gestures with Reanimated ## What's next? -In this article, we've barely scratched the surface of what's possible with gestures in Reanimated. Besides [Tap](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/tap-gesture) and [Pan](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/pan-gesture) gestures Gesture Handler comes with many more e.g. [Pinch](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/pinch-gesture) or [Fling](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/fling-gesture). We welcome you to dive into the [Quick start](https://docs.swmansion.com/react-native-gesture-handler/docs/fundamentals/quickstart) section of the React Native Gesture Handler documentation and explore all the possibilities that this library comes with. +In this article, we've barely scratched the surface of what's possible with gestures in Reanimated. Besides [Tap](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/tap-gesture) and [Pan](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/pan-gesture) gestures Gesture Handler comes with many more e.g. [Pinch](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/pinch-gesture) or [Fling](https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/fling-gesture). We welcome you to dive into the [Quick start](https://docs.swmansion.com/react-native-gesture-handler/docs/guides/quickstart) section of the React Native Gesture Handler documentation and explore all the possibilities that this library comes with. In [the next section](/docs/fundamentals/glossary), Let's explore a glossary of terms together! diff --git a/packages/docs-reanimated/docusaurus.config.js b/packages/docs-reanimated/docusaurus.config.js index f9b5fa05a0d..fc036c96388 100644 --- a/packages/docs-reanimated/docusaurus.config.js +++ b/packages/docs-reanimated/docusaurus.config.js @@ -114,10 +114,12 @@ const config = { }, ], }, + // State of React Native survey banner announcementBar: { + id: 'state-of-react-native-2024', content: ' ', - backgroundColor: '#03c', - textColor: '#fff', + backgroundColor: '#b1dfd0', + textColor: '#001a72', }, footer: { style: 'light', diff --git a/packages/docs-reanimated/src/theme/AnnouncementBar/Content/index.js b/packages/docs-reanimated/src/theme/AnnouncementBar/Content/index.js index f559bb0b084..3b14b3e423f 100644 --- a/packages/docs-reanimated/src/theme/AnnouncementBar/Content/index.js +++ b/packages/docs-reanimated/src/theme/AnnouncementBar/Content/index.js @@ -2,27 +2,35 @@ import React from 'react'; import clsx from 'clsx'; import ArrowButton from './ArrowButton'; import styles from './styles.module.css'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import AnnouncementBarCloseButton from '@theme/AnnouncementBar/CloseButton'; export default function AnnouncementBarContent(props) { + const { isCloseable, close } = props; return ( - - App.js Conf 2024 - - An Expo & React Native conference in Europe is back, May 22-24 in - Kraków, Poland! - - + + State of React Native 2024 + + Have a few minutes and want to shape the future of React Native? + - Learn More + Fill out the survey now! + {isCloseable && ( + + )} ); } diff --git a/packages/docs-reanimated/src/theme/AnnouncementBar/Content/styles.module.css b/packages/docs-reanimated/src/theme/AnnouncementBar/Content/styles.module.css index 1c2b5a3b717..9ba76a3d6f4 100644 --- a/packages/docs-reanimated/src/theme/AnnouncementBar/Content/styles.module.css +++ b/packages/docs-reanimated/src/theme/AnnouncementBar/Content/styles.module.css @@ -1,32 +1,37 @@ .content { - display: flex; + display: grid; + grid-template-columns: auto auto auto 1fr auto; + grid-template-areas: 'logo headline subText link close'; align-items: center; - justify-content: space-between; + gap: 8px; margin: 0 auto; + width: 100%; max-width: 1440px; - padding: 1rem 1.5rem; + padding: 8px 16px; } -.content a { - color: inherit; +.logo { + height: 36px; + width: 36px; + grid-area: logo; } -.wrapper { - display: flex; - flex-direction: row; - gap: 1rem; - align-items: center; - justify-content: center; +.content a { + color: inherit; } .headline { font-size: 16px; + text-wrap: nowrap; + grid-area: headline; } p.subText { font-size: 14px; + text-wrap: balance; margin: 0; + grid-area: subText; } a.link { @@ -37,30 +42,41 @@ a.link { display: flex; flex-direction: row; align-items: center; + justify-content: center; gap: 6px; - font-size: 12px; + font-size: 14px; padding: 4px 12px; - border: 1px solid var(--swm-off-white); - border-radius: 6px; - background-color: var(--swm-off-white); - transition: 0.2s ease-in-out; + border: 1px solid var(--swm-navy-light-100); + background-color: var(--swm-navy-light-100); + transition: border 0.2s ease-in-out, background-color 0.2s ease-in-out; + grid-area: link; + margin-left: auto; + margin-right: 64px; } .linkTitle { - color: #03c; + color: var(--swm-white); font-weight: 500; + text-wrap: nowrap; + transition: all 0.2s ease-in-out; } .link:hover { - background-color: var(--swm-navy-light-20); - border-color: var(--swm-navy-light-20); + background-color: var(--swm-white); + border-color: var(--swm-navy-light-100); text-decoration: none; } +.link:hover .linkTitle, +.link:hover .linkArrow { + color: var(--swm-navy-light-100); +} + .linkArrow { width: 16px; height: 16px; - color: #03c; + color: var(--swm-white); + transition: all 0.2s ease-in-out; } .linkArrowContainer { @@ -68,20 +84,44 @@ a.link { align-items: center; } -@media screen and (max-width: 996px) { +.close { + opacity: 1; + grid-area: close; +} + +.close svg g { + stroke: var(--swm-navy-light-100); + stroke-width: 2; +} + +@media screen and (max-width: 1200px) { .content { - gap: 12px; + grid-template-columns: auto 1fr 1fr auto; + grid-template-areas: + 'logo headline link close' + 'logo subText link close'; } - .wrapper { - flex-direction: column; - align-items: flex-start; + .link { + margin: auto; } } -@media screen and (max-width: 768px) { +@media screen and (max-width: 600px) { .content { - flex-direction: column; - align-items: flex-start; - padding: 1rem 1.5rem; + grid-template-columns: auto 1fr auto; + grid-template-areas: + 'logo headline close' + 'logo subText close' + 'link link link'; + } + .link { + margin: 0; + } + .logo { + margin-bottom: auto; + } + .close { + padding: 8px !important; + margin-bottom: auto; } } diff --git a/packages/docs-reanimated/src/theme/AnnouncementBar/index.js b/packages/docs-reanimated/src/theme/AnnouncementBar/index.js index 246e14bb74f..2a98102b0df 100644 --- a/packages/docs-reanimated/src/theme/AnnouncementBar/index.js +++ b/packages/docs-reanimated/src/theme/AnnouncementBar/index.js @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useThemeConfig } from '@docusaurus/theme-common'; import { useAnnouncementBar } from '@docusaurus/theme-common/internal'; -import AnnouncementBarCloseButton from '@theme/AnnouncementBar/CloseButton'; import AnnouncementBarContent from '@theme/AnnouncementBar/Content'; import BrowserOnly from '@docusaurus/BrowserOnly'; import styles from './styles.module.css'; @@ -33,10 +32,10 @@ function AnnouncementBar() { return null; } - // hide announcement bar after app.js + // hide announcement bar at the end of the State of React Native survey const today = new Date(); - const endOfAppJS = new Date('2024-05-25T00:00:00.000Z'); - if (today > endOfAppJS) { + const endOfStateOfReactNative = new Date('2025-01-08T00:00:00.000Z'); + if (today > endOfStateOfReactNative) { return null; } @@ -48,16 +47,11 @@ function AnnouncementBar() { className={styles.announcementBar} style={{ backgroundColor, color: textColor }} role="banner"> - {isCloseable && } - - {isCloseable && ( - - - - )} + )} diff --git a/packages/docs-reanimated/src/theme/AnnouncementBar/styles.module.css b/packages/docs-reanimated/src/theme/AnnouncementBar/styles.module.css index 076a941e4a3..81089d1fbb1 100644 --- a/packages/docs-reanimated/src/theme/AnnouncementBar/styles.module.css +++ b/packages/docs-reanimated/src/theme/AnnouncementBar/styles.module.css @@ -5,7 +5,6 @@ .announcementBar { display: flex; font-size: var(--docusaurus-announcement-bar-font-size); - background-image: url(/static/img/appjs.svg), linear-gradient(#03c, #03c); background-position: 0; background-size: cover; color: var(--swm-off-white); @@ -14,60 +13,8 @@ z-index: 10; } -.announcementBarAdornment { - height: 500px; - width: 500px; - position: absolute; - opacity: 0.3; - pointer-events: none; -} - -.announcementBarPlaceholder { - flex: 0 0 30px; - margin: 0 25px; -} - -.announcementBarClose { - flex: 0 0 30px; - margin: 0 25px; - align-self: stretch; - opacity: 1; -} - -.announcementBarContent { - flex: 1 1 auto; -} - -.buttonContainer { - display: flex; - justify-content: center; - padding-right: 1rem; -} - @media print { .announcementBar { display: none; } } - -@media screen and (max-width: 996px) { - .announcementBarClose { - margin: 0; - } - .announcementBarPlaceholder { - display: none; - } -} -@media screen and (max-width: 768px) { - .buttonContainer { - display: flex; - flex-direction: column; - justify-content: flex-start; - padding-top: 1rem; - } -} -@media screen and (max-width: 600px) { - .announcementBarRightAdornment { - display: none; - } -} diff --git a/packages/docs-reanimated/static/examples/FlipCard.js b/packages/docs-reanimated/static/examples/FlipCard.js index 5cc919b8a4a..b8f5b40275a 100644 --- a/packages/docs-reanimated/static/examples/FlipCard.js +++ b/packages/docs-reanimated/static/examples/FlipCard.js @@ -109,7 +109,6 @@ const flipCardStyles = StyleSheet.create({ zIndex: 1, }, flippedCard: { - backfaceVisibility: 'hidden', zIndex: 2, }, }); @@ -162,5 +161,6 @@ const styles = StyleSheet.create({ flipCard: { width: 170, height: 200, + backfaceVisibility: 'hidden', }, }); diff --git a/packages/docs-reanimated/static/img/appjs.svg b/packages/docs-reanimated/static/img/appjs.svg deleted file mode 100644 index 7cc9145d30f..00000000000 --- a/packages/docs-reanimated/static/img/appjs.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/docs-reanimated/static/img/state-of-react-native-logo.svg b/packages/docs-reanimated/static/img/state-of-react-native-logo.svg new file mode 100644 index 00000000000..03ed03ba977 --- /dev/null +++ b/packages/docs-reanimated/static/img/state-of-react-native-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/docs-reanimated/yarn.lock b/packages/docs-reanimated/yarn.lock index f801c4267a7..8c23d87cdf9 100644 --- a/packages/docs-reanimated/yarn.lock +++ b/packages/docs-reanimated/yarn.lock @@ -10679,9 +10679,9 @@ multicast-dns@^7.2.5: thunky "^1.0.2" nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== nanomatch@^1.2.9: version "1.2.13" diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.cpp b/packages/react-native-reanimated/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.cpp index 3faba2b4dcb..4ad84635f20 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.cpp +++ b/packages/react-native-reanimated/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.cpp @@ -27,23 +27,31 @@ ReanimatedCommitHook::~ReanimatedCommitHook() noexcept { uiManager_->unregisterCommitHook(*this); } +void ReanimatedCommitHook::maybeInitializeLayoutAnimations( + SurfaceId surfaceId) { + auto lock = std::unique_lock(mutex_); + if (surfaceId > currentMaxSurfaceId_) { + // when a new surfaceId is observed we call setMountingOverrideDelegate + // for all yet unseen surfaces + uiManager_->getShadowTreeRegistry().enumerate( + [this](const ShadowTree &shadowTree, bool &stop) { + if (shadowTree.getSurfaceId() <= currentMaxSurfaceId_) { + // the set function actually adds our delegate to a list, so we + // shouldn't invoke it twice for the same surface + return; + } + shadowTree.getMountingCoordinator()->setMountingOverrideDelegate( + layoutAnimationsProxy_); + }); + currentMaxSurfaceId_ = surfaceId; + } +} + RootShadowNode::Unshared ReanimatedCommitHook::shadowTreeWillCommit( ShadowTree const &, RootShadowNode::Shared const &, RootShadowNode::Unshared const &newRootShadowNode) noexcept { - auto surfaceId = newRootShadowNode->getSurfaceId(); - - { - auto lock = std::unique_lock(mutex_); - if (surfaceId > currentMaxSurfaceId_) { - uiManager_->getShadowTreeRegistry().enumerate( - [this](const ShadowTree &shadowTree, bool &stop) { - shadowTree.getMountingCoordinator()->setMountingOverrideDelegate( - layoutAnimationsProxy_); - }); - currentMaxSurfaceId_ = surfaceId; - } - } + maybeInitializeLayoutAnimations(newRootShadowNode->getSurfaceId()); auto reaShadowNode = std::reinterpret_pointer_cast( diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.h b/packages/react-native-reanimated/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.h index c6c70fe943a..d150a26baf5 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.h +++ b/packages/react-native-reanimated/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.h @@ -25,6 +25,8 @@ class ReanimatedCommitHook : public UIManagerCommitHook { void commitHookWasUnregistered(UIManager const &) noexcept override {} + void maybeInitializeLayoutAnimations(SurfaceId surfaceId); + RootShadowNode::Unshared shadowTreeWillCommit( ShadowTree const &shadowTree, RootShadowNode::Shared const &oldRootShadowNode, diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp index 0960f956688..37b1dd2fb88 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp +++ b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp @@ -61,13 +61,6 @@ ReanimatedModuleProxy::ReanimatedModuleProxy( isReducedMotion_(isReducedMotion), workletsModuleProxy_(workletsModuleProxy), valueUnpackerCode_(workletsModuleProxy->getValueUnpackerCode()), - uiWorkletRuntime_(std::make_shared( - rnRuntime, - workletsModuleProxy->getJSQueue(), - workletsModuleProxy->getJSScheduler(), - "Reanimated UI runtime", - true /* supportsLocking */, - valueUnpackerCode_)), eventHandlerRegistry_(std::make_unique()), requestRender_(platformDepMethodsHolder.requestRender), onRenderCallback_([this](const double timestampMs) { @@ -159,7 +152,8 @@ void ReanimatedModuleProxy::commonInit( }; #endif - jsi::Runtime &uiRuntime = uiWorkletRuntime_->getJSIRuntime(); + jsi::Runtime &uiRuntime = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); UIRuntimeDecorator::decorate( uiRuntime, #ifdef RCT_NEW_ARCH_ENABLED @@ -196,56 +190,6 @@ ReanimatedModuleProxy::~ReanimatedModuleProxy() { #ifdef RCT_NEW_ARCH_ENABLED operationsInBatch_.clear(); #endif // RCT_NEW_ARCH_ENABLED - uiWorkletRuntime_.reset(); -} - -void ReanimatedModuleProxy::scheduleOnUI( - jsi::Runtime &rt, - const jsi::Value &worklet) { - auto shareableWorklet = extractShareableOrThrow( - rt, worklet, "[Reanimated] Only worklets can be scheduled to run on UI."); - workletsModuleProxy_->getUIScheduler()->scheduleOnUI(COPY_CAPTURE_WITH_THIS { -#if JS_RUNTIME_HERMES - // JSI's scope defined here allows for JSI-objects to be cleared up - // after each runtime loop. Within these loops we typically create some - // temporary JSI objects and hence it allows for such objects to be - // garbage collected much sooner. Apparently the scope API is only - // supported on Hermes at the moment. - const auto scope = jsi::Scope(uiWorkletRuntime_->getJSIRuntime()); -#endif - uiWorkletRuntime_->runGuarded(shareableWorklet); - }); -} - -jsi::Value ReanimatedModuleProxy::executeOnUIRuntimeSync( - jsi::Runtime &rt, - const jsi::Value &worklet) { - return uiWorkletRuntime_->executeSync(rt, worklet); -} - -jsi::Value ReanimatedModuleProxy::createWorkletRuntime( - jsi::Runtime &rt, - const jsi::Value &name, - const jsi::Value &initializer) { - auto workletRuntime = std::make_shared( - rt, - workletsModuleProxy_->getJSQueue(), - workletsModuleProxy_->getJSScheduler(), - name.asString(rt).utf8(rt), - false /* supportsLocking */, - valueUnpackerCode_); - auto initializerShareable = extractShareableOrThrow( - rt, initializer, "[Reanimated] Initializer must be a worklet."); - workletRuntime->runGuarded(initializerShareable); - return jsi::Object::createFromHostObject(rt, workletRuntime); -} - -jsi::Value ReanimatedModuleProxy::scheduleOnRuntime( - jsi::Runtime &rt, - const jsi::Value &workletRuntimeValue, - const jsi::Value &shareableWorkletValue) { - reanimated::scheduleOnRuntime(rt, workletRuntimeValue, shareableWorkletValue); - return jsi::Value::undefined(); } jsi::Value ReanimatedModuleProxy::registerEventHandler( @@ -347,7 +291,8 @@ jsi::Value ReanimatedModuleProxy::getViewProp( callback.getObject(rnRuntime).asFunction(rnRuntime)); const auto shadowNode = shadowNodeFromValue(rnRuntime, shadowNodeWrapper); workletsModuleProxy_->getUIScheduler()->scheduleOnUI(COPY_CAPTURE_WITH_THIS { - jsi::Runtime &uiRuntime = uiWorkletRuntime_->getJSIRuntime(); + jsi::Runtime &uiRuntime = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); const auto resultStr = obtainPropFromShadowNode(uiRuntime, propNameStr, shadowNode); @@ -378,7 +323,8 @@ jsi::Value ReanimatedModuleProxy::getViewProp( COPY_CAPTURE_WITH_THIS () { - jsi::Runtime &uiRuntime = uiWorkletRuntime_->getJSIRuntime(); + jsi::Runtime &uiRuntime = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); const jsi::Value propNameValue = jsi::String::createFromUtf8(uiRuntime, propNameStr); const auto resultValue = @@ -487,7 +433,8 @@ void ReanimatedModuleProxy::requestAnimationFrame( void ReanimatedModuleProxy::maybeRequestRender() { if (!renderRequested_) { renderRequested_ = true; - jsi::Runtime &uiRuntime = uiWorkletRuntime_->getJSIRuntime(); + jsi::Runtime &uiRuntime = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); requestRender_(onRenderCallback_, uiRuntime); } } @@ -495,7 +442,8 @@ void ReanimatedModuleProxy::maybeRequestRender() { void ReanimatedModuleProxy::onRender(double timestampMs) { auto callbacks = std::move(frameCallbacks_); frameCallbacks_.clear(); - jsi::Runtime &uiRuntime = uiWorkletRuntime_->getJSIRuntime(); + jsi::Runtime &uiRuntime = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); jsi::Value timestamp{timestampMs}; for (const auto &callback : callbacks) { runOnRuntimeGuarded(uiRuntime, *callback, timestamp); @@ -510,7 +458,7 @@ jsi::Value ReanimatedModuleProxy::registerSensor( const jsi::Value &sensorDataHandler) { return animatedSensorModule_.registerSensor( rt, - uiWorkletRuntime_, + workletsModuleProxy_->getUIWorkletRuntime(), sensorType, interval, iosReferenceFrame, @@ -574,7 +522,11 @@ bool ReanimatedModuleProxy::handleEvent( const jsi::Value &payload, double currentTime) { eventHandlerRegistry_->processEvent( - uiWorkletRuntime_, currentTime, eventName, emitterReactTag, payload); + workletsModuleProxy_->getUIWorkletRuntime(), + currentTime, + eventName, + emitterReactTag, + payload); // TODO: return true if Reanimated successfully handled the event // to avoid sending it to JavaScript @@ -600,7 +552,8 @@ bool ReanimatedModuleProxy::handleRawEvent( if (eventType.rfind("top", 0) == 0) { eventType = "on" + eventType.substr(3); } - jsi::Runtime &rt = uiWorkletRuntime_->getJSIRuntime(); + jsi::Runtime &rt = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); const auto &eventPayload = rawEvent.eventPayload; jsi::Value payload = eventPayload->asJSIValue(rt); @@ -637,7 +590,8 @@ void ReanimatedModuleProxy::performOperations() { auto copiedOperationsQueue = std::move(operationsInBatch_); operationsInBatch_.clear(); - jsi::Runtime &rt = uiWorkletRuntime_->getJSIRuntime(); + jsi::Runtime &rt = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); { auto lock = propsRegistry_->createLock(); @@ -774,7 +728,8 @@ jsi::String ReanimatedModuleProxy::obtainProp( jsi::Runtime &rt, const jsi::Value &shadowNodeWrapper, const jsi::Value &propName) { - jsi::Runtime &uiRuntime = uiWorkletRuntime_->getJSIRuntime(); + jsi::Runtime &uiRuntime = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); const auto propNameStr = propName.asString(rt).utf8(rt); const auto shadowNode = shadowNodeFromValue(rt, shadowNodeWrapper); const auto resultStr = @@ -852,7 +807,7 @@ void ReanimatedModuleProxy::initializeLayoutAnimationsProxy() { layoutAnimationsManager_, componentDescriptorRegistry, scheduler->getContextContainer(), - uiWorkletRuntime_->getJSIRuntime(), + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(), workletsModuleProxy_->getUIScheduler()); } } @@ -872,7 +827,7 @@ jsi::Value ReanimatedModuleProxy::subscribeForKeyboardEvents( COPY_CAPTURE_WITH_THIS (int keyboardState, int height) { - uiWorkletRuntime_->runGuarded( + workletsModuleProxy_->getUIWorkletRuntime()->runGuarded( shareableHandler, jsi::Value(keyboardState), jsi::Value(height)); }, isStatusBarTranslucent.getBool(), diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h index 6e71a2e5654..dd3b6661999 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h +++ b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h @@ -42,19 +42,6 @@ class ReanimatedModuleProxy : public ReanimatedModuleProxySpec { ~ReanimatedModuleProxy(); - void scheduleOnUI(jsi::Runtime &rt, const jsi::Value &worklet) override; - jsi::Value executeOnUIRuntimeSync(jsi::Runtime &rt, const jsi::Value &worklet) - override; - - jsi::Value createWorkletRuntime( - jsi::Runtime &rt, - const jsi::Value &name, - const jsi::Value &initializer) override; - jsi::Value scheduleOnRuntime( - jsi::Runtime &rt, - const jsi::Value &workletRuntimeValue, - const jsi::Value &shareableWorkletValue) override; - jsi::Value registerEventHandler( jsi::Runtime &rt, const jsi::Value &worklet, @@ -161,10 +148,6 @@ class ReanimatedModuleProxy : public ReanimatedModuleProxySpec { return *layoutAnimationsManager_; } - [[nodiscard]] inline jsi::Runtime &getUIRuntime() const { - return uiWorkletRuntime_->getJSIRuntime(); - } - [[nodiscard]] inline bool isBridgeless() const { return isBridgeless_; } @@ -194,7 +177,6 @@ class ReanimatedModuleProxy : public ReanimatedModuleProxySpec { const bool isReducedMotion_; const std::shared_ptr workletsModuleProxy_; const std::string valueUnpackerCode_; - std::shared_ptr uiWorkletRuntime_; std::unique_ptr eventHandlerRegistry_; const RequestRenderFunction requestRender_; diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.cpp b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.cpp index d797483bcf1..47ad998e6e4 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.cpp +++ b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.cpp @@ -7,45 +7,6 @@ namespace reanimated { -// scheduler - -static jsi::Value REANIMATED_SPEC_PREFIX(scheduleOnUI)( - jsi::Runtime &rt, - TurboModule &turboModule, - const jsi::Value *args, - size_t) { - static_cast(&turboModule) - ->scheduleOnUI(rt, std::move(args[0])); - return jsi::Value::undefined(); -} - -static jsi::Value REANIMATED_SPEC_PREFIX(executeOnUIRuntimeSync)( - jsi::Runtime &rt, - TurboModule &turboModule, - const jsi::Value *args, - size_t) { - return static_cast(&turboModule) - ->executeOnUIRuntimeSync(rt, std::move(args[0])); -} - -static jsi::Value REANIMATED_SPEC_PREFIX(createWorkletRuntime)( - jsi::Runtime &rt, - TurboModule &turboModule, - const jsi::Value *args, - size_t) { - return static_cast(&turboModule) - ->createWorkletRuntime(rt, std::move(args[0]), std::move(args[1])); -} - -static jsi::Value REANIMATED_SPEC_PREFIX(scheduleOnRuntime)( - jsi::Runtime &rt, - TurboModule &turboModule, - const jsi::Value *args, - size_t) { - return static_cast(&turboModule) - ->scheduleOnRuntime(rt, std::move(args[0]), std::move(args[1])); -} - static jsi::Value REANIMATED_SPEC_PREFIX(registerEventHandler)( jsi::Runtime &rt, TurboModule &turboModule, @@ -163,15 +124,6 @@ static jsi::Value REANIMATED_SPEC_PREFIX(setShouldAnimateExiting)( ReanimatedModuleProxySpec::ReanimatedModuleProxySpec( const std::shared_ptr &jsInvoker) : TurboModule("NativeReanimated", jsInvoker) { - methodMap_["scheduleOnUI"] = - MethodMetadata{1, REANIMATED_SPEC_PREFIX(scheduleOnUI)}; - methodMap_["executeOnUIRuntimeSync"] = - MethodMetadata{1, REANIMATED_SPEC_PREFIX(executeOnUIRuntimeSync)}; - methodMap_["createWorkletRuntime"] = - MethodMetadata{2, REANIMATED_SPEC_PREFIX(createWorkletRuntime)}; - methodMap_["scheduleOnRuntime"] = - MethodMetadata{2, REANIMATED_SPEC_PREFIX(scheduleOnRuntime)}; - methodMap_["registerEventHandler"] = MethodMetadata{3, REANIMATED_SPEC_PREFIX(registerEventHandler)}; methodMap_["unregisterEventHandler"] = diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.h b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.h index 3f82813abff..3321e93d889 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.h +++ b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.h @@ -18,22 +18,6 @@ class JSI_EXPORT ReanimatedModuleProxySpec : public TurboModule { const std::shared_ptr &jsInvoker); public: - // Scheduling - virtual void scheduleOnUI(jsi::Runtime &rt, const jsi::Value &worklet) = 0; - virtual jsi::Value executeOnUIRuntimeSync( - jsi::Runtime &rt, - const jsi::Value &worklet) = 0; - - // Worklet runtime - virtual jsi::Value createWorkletRuntime( - jsi::Runtime &rt, - const jsi::Value &name, - const jsi::Value &initializer) = 0; - virtual jsi::Value scheduleOnRuntime( - jsi::Runtime &rt, - const jsi::Value &workletRuntimeValue, - const jsi::Value &shareableWorkletValue) = 0; - // events virtual jsi::Value registerEventHandler( jsi::Runtime &rt, diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp b/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp index 5bf60c154a8..59ff85f6505 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp +++ b/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp @@ -5,10 +5,8 @@ namespace reanimated { void RNRuntimeDecorator::decorate( jsi::Runtime &rnRuntime, + jsi::Runtime &uiRuntime, const std::shared_ptr &reanimatedModuleProxy) { - rnRuntime.global().setProperty(rnRuntime, "_WORKLET", false); - - jsi::Runtime &uiRuntime = reanimatedModuleProxy->getUIRuntime(); auto workletRuntimeValue = rnRuntime.global() .getPropertyAsObject(rnRuntime, "ArrayBuffer") @@ -21,13 +19,6 @@ void RNRuntimeDecorator::decorate( rnRuntime.global().setProperty( rnRuntime, "_WORKLET_RUNTIME", workletRuntimeValue); -#ifdef RCT_NEW_ARCH_ENABLED - constexpr auto isFabric = true; -#else - constexpr auto isFabric = false; -#endif // RCT_NEW_ARCH_ENABLED - rnRuntime.global().setProperty(rnRuntime, "_IS_FABRIC", isFabric); - rnRuntime.global().setProperty( rnRuntime, "_IS_BRIDGELESS", reanimatedModuleProxy->isBridgeless()); diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.h b/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.h index ac568a678b2..e36d4217822 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.h +++ b/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.h @@ -14,6 +14,7 @@ class RNRuntimeDecorator { public: static void decorate( jsi::Runtime &rnRuntime, + jsi::Runtime &uiRuntime, const std::shared_ptr &reanimatedModuleProxy); }; diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp index e71837b1199..3c32a1fdb21 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp +++ b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp @@ -7,6 +7,7 @@ #include #include +#include #ifdef __ANDROID__ #include @@ -14,11 +15,24 @@ #include +// Standard `__cplusplus` macro reference: +// https://en.cppreference.com/w/cpp/preprocessor/replace#Predefined_macros +#if REACT_NATIVE_MINOR_VERSION >= 75 || __cplusplus >= 202002L +// Implicit copy capture of `this` is deprecated in NDK27, which uses C++20. +#define COPY_CAPTURE_WITH_THIS [ =, this ] // NOLINT (whitespace/braces) +#else +// React Native 0.75 is the last one which allows NDK23. NDK23 uses C++17 and +// explicitly disallows C++20 features, including the syntax above. Therefore we +// fallback to the deprecated syntax here. +#define COPY_CAPTURE_WITH_THIS [=] // NOLINT (whitespace/braces) +#endif // REACT_NATIVE_MINOR_VERSION >= 75 || __cplusplus >= 202002L + using namespace facebook; namespace worklets { WorkletsModuleProxy::WorkletsModuleProxy( + jsi::Runtime &rnRuntime, const std::string &valueUnpackerCode, const std::shared_ptr &jsQueue, const std::shared_ptr &jsCallInvoker, @@ -28,9 +42,18 @@ WorkletsModuleProxy::WorkletsModuleProxy( valueUnpackerCode_(valueUnpackerCode), jsQueue_(jsQueue), jsScheduler_(jsScheduler), - uiScheduler_(uiScheduler) {} + uiScheduler_(uiScheduler), + uiWorkletRuntime_(std::make_shared( + rnRuntime, + jsQueue, + jsScheduler, + "Reanimated UI runtime", + true /* supportsLocking */, + valueUnpackerCode_)) {} -WorkletsModuleProxy::~WorkletsModuleProxy() {} +WorkletsModuleProxy::~WorkletsModuleProxy() { + uiWorkletRuntime_.reset(); +} jsi::Value WorkletsModuleProxy::makeShareableClone( jsi::Runtime &rt, @@ -43,4 +66,53 @@ jsi::Value WorkletsModuleProxy::makeShareableClone( rt, value, shouldRetainRemote, nativeStateSource); } +void WorkletsModuleProxy::scheduleOnUI( + jsi::Runtime &rt, + const jsi::Value &worklet) { + auto shareableWorklet = extractShareableOrThrow( + rt, worklet, "[Worklets] Only worklets can be scheduled to run on UI."); + uiScheduler_->scheduleOnUI(COPY_CAPTURE_WITH_THIS { +#if JS_RUNTIME_HERMES + // JSI's scope defined here allows for JSI-objects to be cleared up + // after each runtime loop. Within these loops we typically create some + // temporary JSI objects and hence it allows for such objects to be + // garbage collected much sooner. Apparently the scope API is only + // supported on Hermes at the moment. + const auto scope = jsi::Scope(uiWorkletRuntime_->getJSIRuntime()); +#endif + uiWorkletRuntime_->runGuarded(shareableWorklet); + }); +} + +jsi::Value WorkletsModuleProxy::executeOnUIRuntimeSync( + jsi::Runtime &rt, + const jsi::Value &worklet) { + return uiWorkletRuntime_->executeSync(rt, worklet); +} + +jsi::Value WorkletsModuleProxy::createWorkletRuntime( + jsi::Runtime &rt, + const jsi::Value &name, + const jsi::Value &initializer) { + auto workletRuntime = std::make_shared( + rt, + jsQueue_, + jsScheduler_, + name.asString(rt).utf8(rt), + false /* supportsLocking */, + valueUnpackerCode_); + auto initializerShareable = extractShareableOrThrow( + rt, initializer, "[Reanimated] Initializer must be a worklet."); + workletRuntime->runGuarded(initializerShareable); + return jsi::Object::createFromHostObject(rt, workletRuntime); +} + +jsi::Value WorkletsModuleProxy::scheduleOnRuntime( + jsi::Runtime &rt, + const jsi::Value &workletRuntimeValue, + const jsi::Value &shareableWorkletValue) { + worklets::scheduleOnRuntime(rt, workletRuntimeValue, shareableWorkletValue); + return jsi::Value::undefined(); +} + } // namespace worklets diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h index dc7cee4cf27..b2f4203a954 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h +++ b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h @@ -14,6 +14,7 @@ namespace worklets { class WorkletsModuleProxy : public WorkletsModuleProxySpec { public: explicit WorkletsModuleProxy( + jsi::Runtime &rnRuntime, const std::string &valueUnpackerCode, const std::shared_ptr &jsQueue, const std::shared_ptr &jsCallInvoker, @@ -28,6 +29,21 @@ class WorkletsModuleProxy : public WorkletsModuleProxySpec { const jsi::Value &shouldRetainRemote, const jsi::Value &nativeStateSource) override; + void scheduleOnUI(jsi::Runtime &rt, const jsi::Value &worklet) override; + + jsi::Value executeOnUIRuntimeSync(jsi::Runtime &rt, const jsi::Value &worklet) + override; + + jsi::Value createWorkletRuntime( + jsi::Runtime &rt, + const jsi::Value &name, + const jsi::Value &initializer) override; + + jsi::Value scheduleOnRuntime( + jsi::Runtime &rt, + const jsi::Value &workletRuntimeValue, + const jsi::Value &shareableWorkletValue) override; + [[nodiscard]] inline std::string getValueUnpackerCode() const { return valueUnpackerCode_; } @@ -44,11 +60,17 @@ class WorkletsModuleProxy : public WorkletsModuleProxySpec { return uiScheduler_; } + [[nodiscard]] inline std::shared_ptr getUIWorkletRuntime() + const { + return uiWorkletRuntime_; + } + private: const std::string valueUnpackerCode_; const std::shared_ptr jsQueue_; const std::shared_ptr jsScheduler_; const std::shared_ptr uiScheduler_; + std::shared_ptr uiWorkletRuntime_; #ifndef NDEBUG SingleInstanceChecker singleInstanceChecker_; #endif // NDEBUG diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp index 624c42ee224..973dcf333af 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp +++ b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp @@ -17,11 +17,56 @@ static jsi::Value WORKLETS_SPEC_PREFIX(makeShareableClone)( rt, std::move(args[0]), std::move(args[1]), std::move(args[2])); } +static jsi::Value WORKLETS_SPEC_PREFIX(scheduleOnUI)( + jsi::Runtime &rt, + TurboModule &turboModule, + const jsi::Value *args, + size_t) { + static_cast(&turboModule) + ->scheduleOnUI(rt, std::move(args[0])); + return jsi::Value::undefined(); +} + +static jsi::Value WORKLETS_SPEC_PREFIX(executeOnUIRuntimeSync)( + jsi::Runtime &rt, + TurboModule &turboModule, + const jsi::Value *args, + size_t) { + return static_cast(&turboModule) + ->executeOnUIRuntimeSync(rt, std::move(args[0])); +} + +static jsi::Value WORKLETS_SPEC_PREFIX(createWorkletRuntime)( + jsi::Runtime &rt, + TurboModule &turboModule, + const jsi::Value *args, + size_t) { + return static_cast(&turboModule) + ->createWorkletRuntime(rt, std::move(args[0]), std::move(args[1])); +} + +static jsi::Value WORKLETS_SPEC_PREFIX(scheduleOnRuntime)( + jsi::Runtime &rt, + TurboModule &turboModule, + const jsi::Value *args, + size_t) { + return static_cast(&turboModule) + ->scheduleOnRuntime(rt, std::move(args[0]), std::move(args[1])); +} + WorkletsModuleProxySpec::WorkletsModuleProxySpec( const std::shared_ptr jsInvoker) : TurboModule("NativeWorklets", jsInvoker) { methodMap_["makeShareableClone"] = MethodMetadata{2, WORKLETS_SPEC_PREFIX(makeShareableClone)}; + methodMap_["scheduleOnUI"] = + MethodMetadata{1, WORKLETS_SPEC_PREFIX(scheduleOnUI)}; + methodMap_["executeOnUIRuntimeSync"] = + MethodMetadata{1, WORKLETS_SPEC_PREFIX(executeOnUIRuntimeSync)}; + methodMap_["createWorkletRuntime"] = + MethodMetadata{2, WORKLETS_SPEC_PREFIX(createWorkletRuntime)}; + methodMap_["scheduleOnRuntime"] = + MethodMetadata{2, WORKLETS_SPEC_PREFIX(scheduleOnRuntime)}; } } // namespace worklets diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h index c79a86b908f..5d3573c969a 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h +++ b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h @@ -15,11 +15,30 @@ class JSI_EXPORT WorkletsModuleProxySpec : public TurboModule { const std::shared_ptr jsInvoker); public: + // Shareables virtual jsi::Value makeShareableClone( jsi::Runtime &rt, const jsi::Value &value, const jsi::Value &shouldRetainRemote, const jsi::Value &nativeStateSource) = 0; + + // Scheduling + virtual void scheduleOnUI(jsi::Runtime &rt, const jsi::Value &worklet) = 0; + + virtual jsi::Value executeOnUIRuntimeSync( + jsi::Runtime &rt, + const jsi::Value &worklet) = 0; + + // Worklet runtime + virtual jsi::Value createWorkletRuntime( + jsi::Runtime &rt, + const jsi::Value &name, + const jsi::Value &initializer) = 0; + + virtual jsi::Value scheduleOnRuntime( + jsi::Runtime &rt, + const jsi::Value &workletRuntimeValue, + const jsi::Value &shareableWorkletValue) = 0; }; } // namespace worklets diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/Defs.h b/packages/react-native-reanimated/Common/cpp/worklets/Tools/Defs.h new file mode 100644 index 00000000000..fccf8f6f7ac --- /dev/null +++ b/packages/react-native-reanimated/Common/cpp/worklets/Tools/Defs.h @@ -0,0 +1,10 @@ +#pragma once + +/* +On Android JS_RUNTIME_HERMES is set in CMakeList.txt, +but on iOS there is no simple way to defect if Hermes exists +so we have to check if headers are available. +*/ +#if __APPLE__ && __has_include() +#define JS_RUNTIME_HERMES 1 +#endif diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp index 8575570f72b..e21555de871 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp +++ b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp @@ -5,6 +5,15 @@ namespace worklets { void RNRuntimeWorkletDecorator::decorate( jsi::Runtime &rnRuntime, const std::shared_ptr &workletsModuleProxy) { + rnRuntime.global().setProperty(rnRuntime, "_WORKLET", false); + +#ifdef RCT_NEW_ARCH_ENABLED + constexpr auto isFabric = true; +#else + constexpr auto isFabric = false; +#endif // RCT_NEW_ARCH_ENABLED + rnRuntime.global().setProperty(rnRuntime, "_IS_FABRIC", isFabric); + rnRuntime.global().setProperty( rnRuntime, "__workletsModuleProxy", diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp index 89341a9b0f1..29f068c9e4c 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp +++ b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp @@ -12,12 +12,6 @@ #include #include -#if __has_include() -#include -#else // __has_include() || ANDROID -#include -#endif - namespace worklets { using namespace facebook; diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h index beb1859a6f0..5bd2350f68f 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h +++ b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h @@ -1,18 +1,13 @@ #pragma once -// JS_RUNTIME_HERMES is only set on Android so we have to check __has_include -// on iOS. -#if __APPLE__ && \ - (__has_include( \ - ) || __has_include()) -#define JS_RUNTIME_HERMES 1 -#endif +#include // Only include this file in Hermes-enabled builds as some platforms (like tvOS) // don't support hermes and it causes the compilation to fail. #if JS_RUNTIME_HERMES #include +#include #include #include @@ -21,12 +16,6 @@ #include #include -#if __has_include() -#include -#else // __has_include() || ANDROID -#include -#endif - #if HERMES_ENABLE_DEBUGGER #include #endif // HERMES_ENABLE_DEBUGGER diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp index 25e32fe2c4e..fff5f6f37e7 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp +++ b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp @@ -1,3 +1,4 @@ +#include #include #include diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h index 77a8b515408..670008fb5e1 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h +++ b/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h @@ -1,13 +1,5 @@ #pragma once -// JS_RUNTIME_HERMES is only set on Android so we have to check __has_include -// on iOS. -#if __APPLE__ && \ - (__has_include( \ - ) || __has_include()) -#define JS_RUNTIME_HERMES 1 -#endif - #include #include diff --git a/packages/react-native-reanimated/android/CMakeLists.txt b/packages/react-native-reanimated/android/CMakeLists.txt index 2fcb8790d61..967272c9d7d 100644 --- a/packages/react-native-reanimated/android/CMakeLists.txt +++ b/packages/react-native-reanimated/android/CMakeLists.txt @@ -2,44 +2,52 @@ project(Reanimated) cmake_minimum_required(VERSION 3.8) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "") set(CMAKE_CXX_STANDARD 20) -# default CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-protector-all" +# default CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections +# -funwind-tables -fstack-protector-strong -no-canonical-prefixes +# -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-protector-all" include("${REACT_NATIVE_DIR}/ReactAndroid/cmake-utils/folly-flags.cmake") add_compile_options(${folly_FLAGS}) -string(APPEND CMAKE_CXX_FLAGS " -DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION} -DREANIMATED_VERSION=${REANIMATED_VERSION} -DHERMES_ENABLE_DEBUGGER=${HERMES_ENABLE_DEBUGGER}") +string( + APPEND + CMAKE_CXX_FLAGS + " -DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}\ + -DREANIMATED_VERSION=${REANIMATED_VERSION}\ + -DHERMES_ENABLE_DEBUGGER=${HERMES_ENABLE_DEBUGGER}") -string(APPEND CMAKE_CXX_FLAGS " -fexceptions -fno-omit-frame-pointer -frtti -fstack-protector-all -std=c++${CMAKE_CXX_STANDARD} -Wall -Werror") +string(APPEND CMAKE_CXX_FLAGS + " -fexceptions -fno-omit-frame-pointer -frtti -fstack-protector-all\ + -std=c++${CMAKE_CXX_STANDARD} -Wall -Werror") if(${IS_NEW_ARCHITECTURE_ENABLED}) - string(APPEND CMAKE_CXX_FLAGS " -DRCT_NEW_ARCH_ENABLED") + string(APPEND CMAKE_CXX_FLAGS " -DRCT_NEW_ARCH_ENABLED") endif() if(${IS_REANIMATED_EXAMPLE_APP}) - string(APPEND CMAKE_CXX_FLAGS " -DIS_REANIMATED_EXAMPLE_APP -Wpedantic") + string(APPEND CMAKE_CXX_FLAGS " -DIS_REANIMATED_EXAMPLE_APP -Wpedantic") endif() if(NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug") - string(APPEND CMAKE_CXX_FLAGS " -DNDEBUG") + string(APPEND CMAKE_CXX_FLAGS " -DNDEBUG") endif() if(${JS_RUNTIME} STREQUAL "hermes") - string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_HERMES=1") + string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_HERMES=1") elseif(${JS_RUNTIME} STREQUAL "jsc") - string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_JSC=1") + string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_JSC=1") elseif(${JS_RUNTIME} STREQUAL "v8") - string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_V8=1") + string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_V8=1") else() - message(FATAL_ERROR "Unknown JS runtime ${JS_RUNTIME}.") + message(FATAL_ERROR "Unknown JS runtime ${JS_RUNTIME}.") endif() # Resolves "CMake Warning: Manually-specified variables were not used by the # project" when any of the following variables is not used in some build # configuration. -set(ignoreMe "${JS_RUNTIME_DIR}") +set(IGNORE_ME "${JS_RUNTIME_DIR}") set(BUILD_DIR "${CMAKE_SOURCE_DIR}/build") set(ANDROID_CPP_DIR "${CMAKE_SOURCE_DIR}/src/main/cpp") diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/CMakeLists.txt b/packages/react-native-reanimated/android/src/main/cpp/reanimated/CMakeLists.txt index e8267febb7d..72e77d555b8 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/CMakeLists.txt +++ b/packages/react-native-reanimated/android/src/main/cpp/reanimated/CMakeLists.txt @@ -1,57 +1,38 @@ cmake_minimum_required(VERSION 3.8) -file(GLOB_RECURSE REANIMATED_COMMON_CPP_SOURCES CONFIGURE_DEPENDS "${COMMON_CPP_DIR}/reanimated/*.cpp") -file(GLOB_RECURSE REANIMATED_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS "${ANDROID_CPP_DIR}/reanimated/*.cpp") +file(GLOB_RECURSE REANIMATED_COMMON_CPP_SOURCES CONFIGURE_DEPENDS + "${COMMON_CPP_DIR}/reanimated/*.cpp") +file(GLOB_RECURSE REANIMATED_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS + "${ANDROID_CPP_DIR}/reanimated/*.cpp") find_package(ReactAndroid REQUIRED CONFIG) -add_library( - reanimated - SHARED - ${REANIMATED_COMMON_CPP_SOURCES} - ${REANIMATED_ANDROID_CPP_SOURCES} -) +add_library(reanimated SHARED ${REANIMATED_COMMON_CPP_SOURCES} + ${REANIMATED_ANDROID_CPP_SOURCES}) target_include_directories( - reanimated - PRIVATE - "${COMMON_CPP_DIR}" - "${ANDROID_CPP_DIR}" - "${REACT_NATIVE_DIR}/ReactCommon" - "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule" - "${REACT_NATIVE_DIR}/ReactCommon/callinvoker" - "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor" -) + reanimated + PRIVATE "${COMMON_CPP_DIR}" + "${ANDROID_CPP_DIR}" + "${REACT_NATIVE_DIR}/ReactCommon" + "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule" + "${REACT_NATIVE_DIR}/ReactCommon/callinvoker" + "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor") if(${IS_NEW_ARCHITECTURE_ENABLED}) - target_include_directories( - reanimated - PRIVATE - "${REACT_NATIVE_DIR}/ReactCommon/yoga" - "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx" - ) + target_include_directories( + reanimated + PRIVATE + "${REACT_NATIVE_DIR}/ReactCommon/yoga" + "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx") endif() -set_target_properties( - reanimated - PROPERTIES - LINKER_LANGUAGE - CXX -) +set_target_properties(reanimated PROPERTIES LINKER_LANGUAGE CXX) -target_link_libraries( - reanimated - worklets -) +target_link_libraries(reanimated worklets) if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) - target_link_libraries( - reanimated - ReactAndroid::reactnative - ) + target_link_libraries(reanimated ReactAndroid::reactnative) else() - target_link_libraries( - reanimated - ReactAndroid::react_nativemodule_core - ) + target_link_libraries(reanimated ReactAndroid::react_nativemodule_core) endif() diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp index 8b9c4753320..e8deed16428 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp +++ b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp @@ -41,6 +41,7 @@ NativeProxy::NativeProxy( ) : javaPart_(jni::make_global(jThis)), rnRuntime_(rnRuntime), + workletsModuleProxy_(workletsModuleProxy), reanimatedModuleProxy_(std::make_shared( workletsModuleProxy, *rnRuntime, @@ -155,7 +156,10 @@ void NativeProxy::injectCppVersion() { void NativeProxy::installJSIBindings() { jsi::Runtime &rnRuntime = *rnRuntime_; WorkletRuntimeCollector::install(rnRuntime); - RNRuntimeDecorator::decorate(rnRuntime, reanimatedModuleProxy_); + RNRuntimeDecorator::decorate( + rnRuntime, + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(), + reanimatedModuleProxy_); #ifndef NDEBUG checkJavaVersion(rnRuntime); injectCppVersion(); @@ -407,7 +411,8 @@ void NativeProxy::handleEvent( return; } - jsi::Runtime &rt = reanimatedModuleProxy_->getUIRuntime(); + jsi::Runtime &rt = + workletsModuleProxy_->getUIWorkletRuntime()->getJSIRuntime(); jsi::Value payload; try { payload = jsi::Value::createFromJsonUtf8( @@ -505,34 +510,43 @@ PlatformDepMethodsHolder NativeProxy::getPlatformDependentMethods() { void NativeProxy::setupLayoutAnimations() { auto weakReanimatedModuleProxy = std::weak_ptr(reanimatedModuleProxy_); + auto weakWorkletsModuleProxy = + std::weak_ptr(workletsModuleProxy_); layoutAnimations_->cthis()->setAnimationStartingBlock( - [weakReanimatedModuleProxy]( + [weakReanimatedModuleProxy, weakWorkletsModuleProxy]( int tag, int type, alias_ref> values) { if (auto reanimatedModuleProxy = weakReanimatedModuleProxy.lock()) { - jsi::Runtime &rt = reanimatedModuleProxy->getUIRuntime(); - jsi::Object yogaValues(rt); - for (const auto &entry : *values) { - try { - std::string keyString = entry.first->toStdString(); - std::string valueString = entry.second->toStdString(); - auto key = jsi::String::createFromAscii(rt, keyString); - if (keyString == "currentTransformMatrix" || - keyString == "targetTransformMatrix") { - jsi::Array matrix = - jsi_utils::convertStringToArray(rt, valueString, 9); - yogaValues.setProperty(rt, key, matrix); - } else { - auto value = stod(valueString); - yogaValues.setProperty(rt, key, value); + if (auto workletsModuleProxy = weakWorkletsModuleProxy.lock()) { + jsi::Runtime &rt = + workletsModuleProxy->getUIWorkletRuntime()->getJSIRuntime(); + jsi::Object yogaValues(rt); + for (const auto &entry : *values) { + try { + std::string keyString = entry.first->toStdString(); + std::string valueString = entry.second->toStdString(); + auto key = jsi::String::createFromAscii(rt, keyString); + if (keyString == "currentTransformMatrix" || + keyString == "targetTransformMatrix") { + jsi::Array matrix = + jsi_utils::convertStringToArray(rt, valueString, 9); + yogaValues.setProperty(rt, key, matrix); + } else { + auto value = stod(valueString); + yogaValues.setProperty(rt, key, value); + } + } catch (std::invalid_argument e) { + throw std::runtime_error( + "[Reanimated] Failed to convert value to number."); } - } catch (std::invalid_argument e) { - throw std::runtime_error( - "[Reanimated] Failed to convert value to number."); } + reanimatedModuleProxy->layoutAnimationsManager() + .startLayoutAnimation( + rt, + tag, + static_cast(type), + yogaValues); } - reanimatedModuleProxy->layoutAnimationsManager().startLayoutAnimation( - rt, tag, static_cast(type), yogaValues); } }); @@ -573,11 +587,14 @@ void NativeProxy::setupLayoutAnimations() { }); layoutAnimations_->cthis()->setCancelAnimationForTag( - [weakReanimatedModuleProxy](int tag) { + [weakReanimatedModuleProxy, weakWorkletsModuleProxy](int tag) { if (auto reanimatedModuleProxy = weakReanimatedModuleProxy.lock()) { - jsi::Runtime &rt = reanimatedModuleProxy->getUIRuntime(); - reanimatedModuleProxy->layoutAnimationsManager() - .cancelLayoutAnimation(rt, tag); + if (auto workletsModuleProxy = weakWorkletsModuleProxy.lock()) { + jsi::Runtime &rt = + workletsModuleProxy->getUIWorkletRuntime()->getJSIRuntime(); + reanimatedModuleProxy->layoutAnimationsManager() + .cancelLayoutAnimation(rt, tag); + } } }); diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.h b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.h index 318e3acf7a7..09a8e37e926 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.h +++ b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.h @@ -168,6 +168,7 @@ class NativeProxy : public jni::HybridClass { friend HybridBase; jni::global_ref javaPart_; jsi::Runtime *rnRuntime_; + std::shared_ptr workletsModuleProxy_; std::shared_ptr reanimatedModuleProxy_; jni::global_ref layoutAnimations_; #ifndef NDEBUG diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt b/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt index 9959ddefc6e..ce128cf1894 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt +++ b/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt @@ -1,139 +1,85 @@ cmake_minimum_required(VERSION 3.8) -file(GLOB_RECURSE WORKLETS_COMMON_CPP_SOURCES CONFIGURE_DEPENDS "${COMMON_CPP_DIR}/worklets/*.cpp") -file(GLOB_RECURSE WORKLETS_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS "${ANDROID_CPP_DIR}/worklets/*.cpp") +file(GLOB_RECURSE WORKLETS_COMMON_CPP_SOURCES CONFIGURE_DEPENDS + "${COMMON_CPP_DIR}/worklets/*.cpp") +file(GLOB_RECURSE WORKLETS_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS + "${ANDROID_CPP_DIR}/worklets/*.cpp") # Consume shared libraries and headers from prefabs find_package(fbjni REQUIRED CONFIG) find_package(ReactAndroid REQUIRED CONFIG) if(${JS_RUNTIME} STREQUAL "hermes") - find_package(hermes-engine REQUIRED CONFIG) + find_package(hermes-engine REQUIRED CONFIG) endif() -add_library( - worklets - SHARED - ${WORKLETS_COMMON_CPP_SOURCES} - ${WORKLETS_ANDROID_CPP_SOURCES} -) +add_library(worklets SHARED ${WORKLETS_COMMON_CPP_SOURCES} + ${WORKLETS_ANDROID_CPP_SOURCES}) # includes -target_include_directories( - worklets - PUBLIC - "${COMMON_CPP_DIR}" - "${ANDROID_CPP_DIR}" -) +target_include_directories(worklets PUBLIC "${COMMON_CPP_DIR}" + "${ANDROID_CPP_DIR}") target_include_directories( - worklets - PRIVATE - "${REACT_NATIVE_DIR}/ReactCommon" - "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule" - "${REACT_NATIVE_DIR}/ReactCommon/react/nativemodule/core/ReactCommon" - "${REACT_NATIVE_DIR}/ReactCommon/callinvoker" - "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor" -) + worklets + PRIVATE "${REACT_NATIVE_DIR}/ReactCommon" + "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule" + "${REACT_NATIVE_DIR}/ReactCommon/react/nativemodule/core/ReactCommon" + "${REACT_NATIVE_DIR}/ReactCommon/callinvoker" + "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor") if(${IS_NEW_ARCHITECTURE_ENABLED}) - target_include_directories( - worklets - PRIVATE - "${REACT_NATIVE_DIR}/ReactCommon/yoga" - "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx" - ) + target_include_directories( + worklets + PRIVATE + "${REACT_NATIVE_DIR}/ReactCommon/yoga" + "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx") - if(ReactAndroid_VERSION_MINOR LESS 76) - target_link_libraries( - worklets - ReactAndroid::fabricjni - ReactAndroid::react_debug - ReactAndroid::react_render_core - ReactAndroid::react_render_componentregistry - ReactAndroid::rrc_view - ) - endif() + if(ReactAndroid_VERSION_MINOR LESS 76) + target_link_libraries( + worklets ReactAndroid::fabricjni ReactAndroid::react_debug + ReactAndroid::react_render_core + ReactAndroid::react_render_componentregistry ReactAndroid::rrc_view) + endif() endif() # build shared lib -set_target_properties( - worklets - PROPERTIES - LINKER_LANGUAGE - CXX -) +set_target_properties(worklets PROPERTIES LINKER_LANGUAGE CXX) -target_link_libraries( - worklets - log - ReactAndroid::jsi - fbjni::fbjni -) +target_link_libraries(worklets log ReactAndroid::jsi fbjni::fbjni) if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) - target_link_libraries( - worklets - ReactAndroid::reactnative - ) + target_link_libraries(worklets ReactAndroid::reactnative) else() - target_link_libraries( - worklets - ReactAndroid::react_nativemodule_core - ReactAndroid::folly_runtime - ReactAndroid::glog - ReactAndroid::reactnativejni - ) + target_link_libraries( + worklets ReactAndroid::react_nativemodule_core ReactAndroid::folly_runtime + ReactAndroid::glog ReactAndroid::reactnativejni) endif() if(${JS_RUNTIME} STREQUAL "hermes") - target_link_libraries( - worklets - hermes-engine::libhermes - ) + target_link_libraries(worklets hermes-engine::libhermes) - if(${HERMES_ENABLE_DEBUGGER}) - if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) - target_link_libraries( - worklets - ReactAndroid::hermestooling - ) - else() - target_link_libraries( - worklets - ReactAndroid::hermes_executor - ) - endif() - endif() -elseif(${JS_RUNTIME} STREQUAL "jsc") + if(${HERMES_ENABLE_DEBUGGER}) if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) - target_link_libraries( - worklets - ReactAndroid::jsctooling - ) + target_link_libraries(worklets ReactAndroid::hermestooling) else() - target_link_libraries( - worklets - ReactAndroid::jscexecutor - ) + target_link_libraries(worklets ReactAndroid::hermes_executor) endif() + endif() +elseif(${JS_RUNTIME} STREQUAL "jsc") + if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) + target_link_libraries(worklets ReactAndroid::jsctooling) + else() + target_link_libraries(worklets ReactAndroid::jscexecutor) + endif() elseif(${JS_RUNTIME} STREQUAL "v8") - # TODO: Refactor this when adding support for newest V8 - target_include_directories( - worklets - PRIVATE - "${JS_RUNTIME_DIR}/src" - ) - file(GLOB V8_SO_DIR "${JS_RUNTIME_DIR}/android/build/intermediates/library_jni/**/jni/${ANDROID_ABI}") - find_library( - V8EXECUTOR_LIB - v8executor - PATHS ${V8_SO_DIR} - NO_DEFAULT_PATH - NO_CMAKE_FIND_ROOT_PATH - ) - target_link_libraries( - worklets - ${V8EXECUTOR_LIB} - ) + # TODO: Refactor this when adding support for newest V8 + target_include_directories(worklets PRIVATE "${JS_RUNTIME_DIR}/src") + file(GLOB V8_SO_DIR "${JS_RUNTIME_DIR}/android/build/intermediates/\ + library_jni/**/jni/${ANDROID_ABI}") + find_library( + V8EXECUTOR_LIB v8executor + PATHS ${V8_SO_DIR} + NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + target_link_libraries(worklets ${V8EXECUTOR_LIB}) endif() diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp index ac8b1c34519..bd1b3ecd897 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp +++ b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp @@ -28,6 +28,7 @@ WorkletsModule::WorkletsModule( : javaPart_(jni::make_global(jThis)), rnRuntime_(rnRuntime), workletsModuleProxy_(std::make_shared( + *rnRuntime, valueUnpackerCode, std::make_shared(messageQueueThread), jsCallInvoker, diff --git a/packages/react-native-reanimated/apple/reanimated/apple/REAModule.mm b/packages/react-native-reanimated/apple/reanimated/apple/REAModule.mm index 79b99de0eb7..52a24b808ce 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/REAModule.mm +++ b/packages/react-native-reanimated/apple/reanimated/apple/REAModule.mm @@ -300,8 +300,10 @@ - (void)sendEventWithName:(NSString *)eventName body:(id)body auto reanimatedModuleProxy = reanimated::createReanimatedModule(self, self.bridge, jsCallInvoker, workletsModule, isBridgeless); + auto &uiRuntime = [workletsModule getWorkletsModuleProxy]->getUIWorkletRuntime() -> getJSIRuntime(); + jsi::Runtime &rnRuntime = *jsiRuntime; - [self commonInit:reanimatedModuleProxy withRnRuntime:rnRuntime]; + [self commonInit:reanimatedModuleProxy withRnRuntime:rnRuntime withUIRuntime:uiRuntime]; return @YES; } @@ -314,10 +316,12 @@ - (void)sendEventWithName:(NSString *)eventName body:(id)body } #endif // RCT_NEW_ARCH_ENABLED -- (void)commonInit:(std::shared_ptr)reanimatedModuleProxy withRnRuntime:(jsi::Runtime &)rnRuntime +- (void)commonInit:(std::shared_ptr)reanimatedModuleProxy + withRnRuntime:(jsi::Runtime &)rnRuntime + withUIRuntime:(jsi::Runtime &)uiRuntime { WorkletRuntimeCollector::install(rnRuntime); - RNRuntimeDecorator::decorate(rnRuntime, reanimatedModuleProxy); + RNRuntimeDecorator::decorate(rnRuntime, uiRuntime, reanimatedModuleProxy); #ifdef RCT_NEW_ARCH_ENABLED [self attachReactEventListener]; weakReanimatedModuleProxy_ = reanimatedModuleProxy; diff --git a/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.h b/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.h index 41fad911f95..ff281d05230 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.h +++ b/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.h @@ -23,6 +23,7 @@ std::shared_ptr createReanimatedModule( void commonInit( REAModule *reaModule, + jsi::Runtime &uiRuntime, std::shared_ptr reanimatedModuleProxy); #ifdef RCT_NEW_ARCH_ENABLED @@ -30,6 +31,7 @@ void commonInit( #else // RCT_NEW_ARCH_ENABLED void setupLayoutAnimationCallbacks( std::shared_ptr reanimatedModuleProxy, + std::shared_ptr workletsModuleProxy, REAAnimationsManager *animationsManager); #endif // RCT_NEW_ARCH_ENABLED diff --git a/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.mm b/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.mm index 3e66116c319..1766a892b8d 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.mm +++ b/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.mm @@ -73,27 +73,29 @@ static inline bool getIsReducedMotion() auto reanimatedModuleProxy = std::make_shared( workletsModuleProxy, rnRuntime, jsInvoker, platformDepMethodsHolder, isBridgeless, getIsReducedMotion()); - commonInit(reaModule, reanimatedModuleProxy); + commonInit(reaModule, workletsModuleProxy->getUIWorkletRuntime()->getJSIRuntime(), reanimatedModuleProxy); // Layout Animation callbacks setup #ifdef RCT_NEW_ARCH_ENABLED // nothing #else REAAnimationsManager *animationsManager = reaModule.animationsManager; - setupLayoutAnimationCallbacks(reanimatedModuleProxy, animationsManager); + setupLayoutAnimationCallbacks(reanimatedModuleProxy, workletsModuleProxy, animationsManager); #endif // RCT_NEW_ARCH_ENABLED return reanimatedModuleProxy; } -void commonInit(REAModule *reaModule, std::shared_ptr reanimatedModuleProxy) +void commonInit( + REAModule *reaModule, + jsi::Runtime &uiRuntime, + std::shared_ptr reanimatedModuleProxy) { [reaModule.nodesManager registerEventHandler:^(id event) { // handles RCTEvents from RNGestureHandler std::string eventName = [event.eventName UTF8String]; int emitterReactTag = [event.viewTag intValue]; id eventData = [event arguments][2]; - jsi::Runtime &uiRuntime = reanimatedModuleProxy->getUIRuntime(); jsi::Value payload = convertObjCObjectToJSIValue(uiRuntime, eventData); double currentTime = CACurrentMediaTime() * 1000; reanimatedModuleProxy->handleEvent(eventName, emitterReactTag, payload, currentTime); @@ -114,28 +116,32 @@ void commonInit(REAModule *reaModule, std::shared_ptr rea #else // RCT_NEW_ARCH_ENABLED void setupLayoutAnimationCallbacks( std::shared_ptr reanimatedModuleProxy, + std::shared_ptr workletsModuleProxy, REAAnimationsManager *animationsManager) { std::weak_ptr weakReanimatedModuleProxy = reanimatedModuleProxy; // to avoid retain cycle + std::weak_ptr weakWorkletsModuleProxy = workletsModuleProxy; // to avoid retain cycle [animationsManager setAnimationStartingBlock:^(NSNumber *_Nonnull tag, LayoutAnimationType type, NSDictionary *_Nonnull values) { if (auto reanimatedModuleProxy = weakReanimatedModuleProxy.lock()) { - jsi::Runtime &rt = reanimatedModuleProxy->getUIRuntime(); - jsi::Object yogaValues(rt); - for (NSString *key in values.allKeys) { - NSObject *value = values[key]; - if ([values[key] isKindOfClass:[NSArray class]]) { - NSArray *transformArray = (NSArray *)value; - jsi::Array matrix(rt, 9); - for (int i = 0; i < 9; i++) { - matrix.setValueAtIndex(rt, i, [(NSNumber *)transformArray[i] doubleValue]); + if (auto workletsModuleProxy = weakWorkletsModuleProxy.lock()) { + jsi::Runtime &rt = workletsModuleProxy->getUIWorkletRuntime()->getJSIRuntime(); + jsi::Object yogaValues(rt); + for (NSString *key in values.allKeys) { + NSObject *value = values[key]; + if ([values[key] isKindOfClass:[NSArray class]]) { + NSArray *transformArray = (NSArray *)value; + jsi::Array matrix(rt, 9); + for (int i = 0; i < 9; i++) { + matrix.setValueAtIndex(rt, i, [(NSNumber *)transformArray[i] doubleValue]); + } + yogaValues.setProperty(rt, [key UTF8String], matrix); + } else { + yogaValues.setProperty(rt, [key UTF8String], [(NSNumber *)value doubleValue]); } - yogaValues.setProperty(rt, [key UTF8String], matrix); - } else { - yogaValues.setProperty(rt, [key UTF8String], [(NSNumber *)value doubleValue]); } + reanimatedModuleProxy->layoutAnimationsManager().startLayoutAnimation(rt, [tag intValue], type, yogaValues); } - reanimatedModuleProxy->layoutAnimationsManager().startLayoutAnimation(rt, [tag intValue], type, yogaValues); } }]; @@ -171,8 +177,10 @@ void setupLayoutAnimationCallbacks( [animationsManager setCancelAnimationBlock:^(NSNumber *_Nonnull tag) { if (auto reanimatedModuleProxy = weakReanimatedModuleProxy.lock()) { - jsi::Runtime &rt = reanimatedModuleProxy->getUIRuntime(); - reanimatedModuleProxy->layoutAnimationsManager().cancelLayoutAnimation(rt, [tag intValue]); + if (auto workletsModuleProxy = weakWorkletsModuleProxy.lock()) { + jsi::Runtime &rt = workletsModuleProxy->getUIWorkletRuntime()->getJSIRuntime(); + reanimatedModuleProxy->layoutAnimationsManager().cancelLayoutAnimation(rt, [tag intValue]); + } } }]; diff --git a/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm b/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm index 15c03eaf398..eed668545c4 100644 --- a/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm +++ b/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm @@ -45,8 +45,8 @@ @implementation WorkletsModule { auto jsCallInvoker = bridge.jsCallInvoker; auto jsScheduler = std::make_shared(rnRuntime, jsCallInvoker); auto uiScheduler = std::make_shared(); - workletsModuleProxy_ = - std::make_shared(valueUnpackerCodeStr, jsQueue, jsCallInvoker, jsScheduler, uiScheduler); + workletsModuleProxy_ = std::make_shared( + rnRuntime, valueUnpackerCodeStr, jsQueue, jsCallInvoker, jsScheduler, uiScheduler); RNRuntimeWorkletDecorator::decorate(rnRuntime, workletsModuleProxy_); return @YES; diff --git a/packages/react-native-reanimated/package.json b/packages/react-native-reanimated/package.json index e383d092133..84ee51b1c38 100644 --- a/packages/react-native-reanimated/package.json +++ b/packages/react-native-reanimated/package.json @@ -7,15 +7,17 @@ "lint": "yarn lint:js && yarn lint:plugin && yarn lint:common && yarn lint:android && yarn lint:apple", "lint:js": "eslint --ext '.js,.ts,.tsx' src __tests__ __typetests__ && yarn prettier --check src __tests__ __typetests__", "lint:plugin": "cd plugin && yarn lint", - "lint:android": "./scripts/validate-android.sh && ./android/gradlew -p android spotlessCheck -q && ./scripts/cpplint.sh android/src && yarn format:android:cpp --dry-run -Werror", + "lint:android": "./scripts/validate-android.sh && ./android/gradlew -p android spotlessCheck -q && ./scripts/cpplint.sh android/src && yarn format:android:cpp --dry-run -Werror && yarn lint:cmake", "lint:common": "./scripts/validate-common.sh && ./scripts/cpplint.sh Common && yarn format:common --dry-run -Werror", "lint:apple": "./scripts/validate-apple.sh && yarn format:apple --dry-run -Werror", - "format": "yarn format:js && yarn format:plugin && yarn format:apple && yarn format:android:java && yarn format:android:cpp && yarn format:common", + "lint:cmake": "find ./android -type d \\( -name build -o -name .cxx \\) -prune -o -type f -name 'CMakeLists.txt' -print | xargs ./scripts/lint-cmake.sh", + "format": "yarn format:js && yarn format:plugin && yarn format:apple && yarn format:android:java && yarn format:android:cpp && yarn format:android:cmake && yarn format:common", "format:js": "prettier --write --list-different src __tests__ __typetests__", "format:plugin": "cd plugin && yarn format", "format:apple": "find apple -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.mm\" -o -iname \"*.cpp\" | xargs clang-format -i", "format:android:java": "node ./scripts/format-java.js", "format:android:cpp": "find android/src -iname \"*.h\" -o -iname \"*.cpp\" | xargs clang-format -i", + "format:android:cmake": "find ./android -type d \\( -name build -o -name .cxx \\) -prune -o -type f -name 'CMakeLists.txt' -print | xargs ./scripts/format-cmake.sh", "format:common": "find Common -iname \"*.h\" -o -iname \"*.cpp\" | xargs clang-format -i", "find-unused-code:js": "yarn ts-prune --ignore \"index|.web.\" --error", "type:check": "yarn type:check:src && yarn type:check:plugin && ./scripts/test-ts.sh ../../apps/common-app/src/App.tsx __typetests__/common", @@ -177,6 +179,5 @@ "./lib/module/core.js", "./lib/module/initializers.js", "./lib/module/index.js" - ], - "packageManager": "yarn@4.1.1" + ] } diff --git a/packages/react-native-reanimated/scripts/format-cmake.sh b/packages/react-native-reanimated/scripts/format-cmake.sh new file mode 100755 index 00000000000..a2d8c208364 --- /dev/null +++ b/packages/react-native-reanimated/scripts/format-cmake.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +if ! which cmake-format >/dev/null; then + echo "error: cmake-format is not installed" + exit 1 +fi + +cmake-format -i "$@" diff --git a/packages/react-native-reanimated/scripts/lint-cmake.sh b/packages/react-native-reanimated/scripts/lint-cmake.sh new file mode 100755 index 00000000000..7f0066fb2a9 --- /dev/null +++ b/packages/react-native-reanimated/scripts/lint-cmake.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +if ! which cmake-lint >/dev/null; then + echo "error: cmake-lint is not installed" + exit 1 +fi + +cmake-lint "$@" diff --git a/packages/react-native-reanimated/src/ReanimatedModule/NativeReanimated.ts b/packages/react-native-reanimated/src/ReanimatedModule/NativeReanimated.ts index 3ff0ef98727..40fb1b7f33b 100644 --- a/packages/react-native-reanimated/src/ReanimatedModule/NativeReanimated.ts +++ b/packages/react-native-reanimated/src/ReanimatedModule/NativeReanimated.ts @@ -10,7 +10,6 @@ import type { } from '../commonTypes'; import { checkCppVersion } from '../platform-specific/checkCppVersion'; import { jsVersion } from '../platform-specific/jsVersion'; -import type { WorkletRuntime } from '../runtimes'; import { isFabric } from '../PlatformChecker'; import type React from 'react'; import { getShadowNodeWrapperFromRef } from '../fabricUtils'; @@ -65,28 +64,6 @@ See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooti this.#reanimatedModuleProxy = global.__reanimatedModuleProxy; } - scheduleOnUI(shareable: ShareableRef) { - return this.#reanimatedModuleProxy.scheduleOnUI(shareable); - } - - executeOnUIRuntimeSync(shareable: ShareableRef): R { - return this.#reanimatedModuleProxy.executeOnUIRuntimeSync(shareable); - } - - createWorkletRuntime(name: string, initializer: ShareableRef<() => void>) { - return this.#reanimatedModuleProxy.createWorkletRuntime(name, initializer); - } - - scheduleOnRuntime( - workletRuntime: WorkletRuntime, - shareableWorklet: ShareableRef - ) { - return this.#reanimatedModuleProxy.scheduleOnRuntime( - workletRuntime, - shareableWorklet - ); - } - registerSensor( sensorType: number, interval: number, diff --git a/packages/react-native-reanimated/src/ReanimatedModule/js-reanimated/JSReanimated.ts b/packages/react-native-reanimated/src/ReanimatedModule/js-reanimated/JSReanimated.ts index e4fa3b8a008..8b071cb4d95 100644 --- a/packages/react-native-reanimated/src/ReanimatedModule/js-reanimated/JSReanimated.ts +++ b/packages/react-native-reanimated/src/ReanimatedModule/js-reanimated/JSReanimated.ts @@ -15,8 +15,6 @@ import type { WorkletFunction, } from '../../commonTypes'; import type { WebSensor } from './WebSensor'; -import { mockedRequestAnimationFrame } from '../../mockedRequestAnimationFrame'; -import type { WorkletRuntime } from '../../runtimes'; import { logger } from '../../logger'; import { ReanimatedError } from '../../errors'; import { WorkletsModule } from '../../worklets'; @@ -25,14 +23,6 @@ export function createJSReanimatedModule(): IReanimatedModule { return new JSReanimated(); } -// In Node.js environments (like when static rendering with Expo Router) -// requestAnimationFrame is unavailable, so we use our mock. -// It also has to be mocked for Jest purposes (see `initializeUIRuntime`). -const requestAnimationFrameImpl = - isJest() || !globalThis.requestAnimationFrame - ? mockedRequestAnimationFrame - : globalThis.requestAnimationFrame; - class JSReanimated implements IReanimatedModule { /** * We keep the instance of `WorkletsModule` here to keep correct coupling of @@ -43,26 +33,6 @@ class JSReanimated implements IReanimatedModule { sensors = new Map(); platform?: Platform = undefined; - scheduleOnUI(worklet: ShareableRef) { - // @ts-ignore web implementation has still not been updated after the rewrite, this will be addressed once the web implementation updates are ready - requestAnimationFrameImpl(worklet); - } - - createWorkletRuntime( - _name: string, - _initializer: ShareableRef<() => void> - ): WorkletRuntime { - throw new ReanimatedError( - 'createWorkletRuntime is not available in JSReanimated.' - ); - } - - scheduleOnRuntime() { - throw new ReanimatedError( - 'scheduleOnRuntime is not available in JSReanimated.' - ); - } - registerEventHandler( _eventHandler: ShareableRef, _eventName: string, @@ -293,12 +263,6 @@ class JSReanimated implements IReanimatedModule { 'configureProps is not available in JSReanimated.' ); } - - executeOnUIRuntimeSync(_shareable: ShareableRef): R { - throw new ReanimatedError( - '`executeOnUIRuntimeSync` is not available in JSReanimated.' - ); - } } // Lack of this export breaks TypeScript generation since diff --git a/packages/react-native-reanimated/src/ReanimatedModule/reanimatedModuleProxy.ts b/packages/react-native-reanimated/src/ReanimatedModule/reanimatedModuleProxy.ts index 5d334fb9897..a2380bfee86 100644 --- a/packages/react-native-reanimated/src/ReanimatedModule/reanimatedModuleProxy.ts +++ b/packages/react-native-reanimated/src/ReanimatedModule/reanimatedModuleProxy.ts @@ -8,24 +8,9 @@ import type { LayoutAnimationBatchItem, WorkletFunction, } from '../commonTypes'; -import type { WorkletRuntime } from '../runtimes'; /** Type of `__reanimatedModuleProxy` injected with JSI. */ export interface ReanimatedModuleProxy { - scheduleOnUI(shareable: ShareableRef): void; - - executeOnUIRuntimeSync(shareable: ShareableRef): R; - - createWorkletRuntime( - name: string, - initializer: ShareableRef<() => void> - ): WorkletRuntime; - - scheduleOnRuntime( - workletRuntime: WorkletRuntime, - worklet: ShareableRef - ): void; - registerEventHandler( eventHandler: ShareableRef, eventName: string, diff --git a/packages/react-native-reanimated/src/commonTypes.ts b/packages/react-native-reanimated/src/commonTypes.ts index 725436df1d8..68bdc7888c5 100644 --- a/packages/react-native-reanimated/src/commonTypes.ts +++ b/packages/react-native-reanimated/src/commonTypes.ts @@ -8,10 +8,14 @@ import type { import type { WorkletsModuleProxy } from './worklets'; import type { ReanimatedModuleProxy } from './ReanimatedModule'; -export interface IWorkletsModule extends WorkletsModuleProxy {} +type DisallowKeysOf = { + [TKey in keyof TInterface]?: never; +}; +export interface IWorkletsModule extends WorkletsModuleProxy {} export interface IReanimatedModule - extends Omit { + extends Omit, + DisallowKeysOf { getViewProp( viewTag: number, propName: string, diff --git a/packages/react-native-reanimated/src/core.ts b/packages/react-native-reanimated/src/core.ts index c913d948c45..2a66389018a 100644 --- a/packages/react-native-reanimated/src/core.ts +++ b/packages/react-native-reanimated/src/core.ts @@ -155,7 +155,7 @@ export function unregisterSensor(sensorId: number): void { } if (!isWeb()) { - initializeUIRuntime(); + initializeUIRuntime(ReanimatedModule); } type FeaturesConfig = { diff --git a/packages/react-native-reanimated/src/initializers.ts b/packages/react-native-reanimated/src/initializers.ts index b2dcbe79738..f3327642cda 100644 --- a/packages/react-native-reanimated/src/initializers.ts +++ b/packages/react-native-reanimated/src/initializers.ts @@ -15,6 +15,7 @@ import { registerLoggerConfig, replaceLoggerImplementation, } from './logger'; +import type { IReanimatedModule } from './commonTypes'; const IS_JEST = isJest(); const SHOULD_BE_USE_WEB = shouldBeUseWeb(); @@ -178,7 +179,13 @@ function setupRequestAnimationFrame() { }; } -export function initializeUIRuntime() { +export function initializeUIRuntime(ReanimatedModule: IReanimatedModule) { + if (!ReanimatedModule) { + // eslint-disable-next-line reanimated/use-reanimated-error + throw new Error( + '[Reanimated] Reanimated is trying to initialize the UI runtime without a valid ReanimatedModule' + ); + } if (IS_JEST) { // requestAnimationFrame react-native jest's setup is incorrect as it polyfills // the method directly using setTimeout, therefore the callback doesn't get the diff --git a/packages/react-native-reanimated/src/mock.ts b/packages/react-native-reanimated/src/mock.ts index 3d8e3f8a67c..576df2d34b4 100644 --- a/packages/react-native-reanimated/src/mock.ts +++ b/packages/react-native-reanimated/src/mock.ts @@ -87,7 +87,11 @@ const hook = { useAnimatedReaction: NOOP, useAnimatedRef: () => ({ current: null }), useAnimatedScrollHandler: NOOP_FACTORY, - useDerivedValue: (processor: () => Value) => ({ value: processor() }), + useDerivedValue: (processor: () => Value) => { + const result = processor(); + + return { value: result, get: () => result }; + }, useAnimatedSensor: () => ({ sensor: { value: { diff --git a/packages/react-native-reanimated/src/runtimes.ts b/packages/react-native-reanimated/src/runtimes.ts index 448d0d2a70b..3237acc0e67 100644 --- a/packages/react-native-reanimated/src/runtimes.ts +++ b/packages/react-native-reanimated/src/runtimes.ts @@ -4,12 +4,12 @@ import type { WorkletFunction } from './commonTypes'; import { ReanimatedError, registerReanimatedError } from './errors'; import { setupCallGuard, setupConsole } from './initializers'; import { registerLoggerConfig } from './logger'; -import { ReanimatedModule } from './ReanimatedModule'; import { shouldBeUseWeb } from './PlatformChecker'; import { makeShareableCloneOnUIRecursive, makeShareableCloneRecursive, } from './shareables'; +import { WorkletsModule } from './worklets'; const SHOULD_BE_USE_WEB = shouldBeUseWeb(); @@ -43,7 +43,7 @@ export function createWorkletRuntime( // Assign to a different variable as __reanimatedLoggerConfig is not a captured // identifier in the Worklet runtime. const config = __reanimatedLoggerConfig; - return ReanimatedModule.createWorkletRuntime( + return WorkletsModule.createWorkletRuntime( name, makeShareableCloneRecursive(() => { 'worklet'; @@ -86,7 +86,7 @@ export function runOnRuntime( ); } return (...args) => - ReanimatedModule.scheduleOnRuntime( + WorkletsModule.scheduleOnRuntime( workletRuntime, makeShareableCloneRecursive(() => { 'worklet'; diff --git a/packages/react-native-reanimated/src/threads.ts b/packages/react-native-reanimated/src/threads.ts index 02b46d687c2..291798b82de 100644 --- a/packages/react-native-reanimated/src/threads.ts +++ b/packages/react-native-reanimated/src/threads.ts @@ -7,7 +7,7 @@ import { } from './shareables'; import { isWorkletFunction } from './commonTypes'; import { ReanimatedError } from './errors'; -import { ReanimatedModule } from './ReanimatedModule'; +import { WorkletsModule } from './worklets'; const IS_JEST = isJest(); const SHOULD_BE_USE_WEB = shouldBeUseWeb(); @@ -101,7 +101,7 @@ export function runOnUI( // that's not possible, and hence in Jest environment instead of using scheduling // mechanism we just schedule the work ommiting the queue. This is ok for the // uses that we currently have but may not be ok for future tests that we write. - ReanimatedModule.scheduleOnUI( + WorkletsModule.scheduleOnUI( makeShareableCloneRecursive(() => { 'worklet'; worklet(...args); @@ -123,7 +123,7 @@ export function runOnUI( queueMicrotask(() => { const queue = _runOnUIQueue; _runOnUIQueue = []; - ReanimatedModule.scheduleOnUI( + WorkletsModule.scheduleOnUI( makeShareableCloneRecursive(() => { 'worklet'; // eslint-disable-next-line @typescript-eslint/no-shadow @@ -147,7 +147,7 @@ export function executeOnUIRuntimeSync( worklet: WorkletFunction ): (...args: Args) => ReturnValue { return (...args) => { - return ReanimatedModule.executeOnUIRuntimeSync( + return WorkletsModule.executeOnUIRuntimeSync( makeShareableCloneRecursive(() => { 'worklet'; const result = worklet(...args); @@ -177,7 +177,7 @@ export function runOnUIImmediately( ); } return (...args) => { - ReanimatedModule.scheduleOnUI( + WorkletsModule.scheduleOnUI( makeShareableCloneRecursive(() => { 'worklet'; worklet(...args); diff --git a/packages/react-native-reanimated/src/worklets/WorkletsModule/JSWorklets.ts b/packages/react-native-reanimated/src/worklets/WorkletsModule/JSWorklets.ts index 2cc7cfa714c..3b535f81286 100644 --- a/packages/react-native-reanimated/src/worklets/WorkletsModule/JSWorklets.ts +++ b/packages/react-native-reanimated/src/worklets/WorkletsModule/JSWorklets.ts @@ -2,15 +2,53 @@ import type { IWorkletsModule, ShareableRef } from '../../commonTypes'; import { ReanimatedError } from '../../errors'; +import { mockedRequestAnimationFrame } from '../../mockedRequestAnimationFrame'; +import { isJest } from '../../PlatformChecker'; +import type { WorkletRuntime } from '../../runtimes'; export function createJSWorkletsModule(): IWorkletsModule { return new JSWorklets(); } +// In Node.js environments (like when static rendering with Expo Router) +// requestAnimationFrame is unavailable, so we use our mock. +// It also has to be mocked for Jest purposes (see `initializeUIRuntime`). +const requestAnimationFrameImpl = + isJest() || !globalThis.requestAnimationFrame + ? mockedRequestAnimationFrame + : globalThis.requestAnimationFrame; + class JSWorklets implements IWorkletsModule { - makeShareableClone(): ShareableRef { + makeShareableClone(): ShareableRef { throw new ReanimatedError( 'makeShareableClone should never be called in JSWorklets.' ); } + + scheduleOnUI(worklet: ShareableRef) { + // @ts-ignore web implementation has still not been updated after the rewrite, + // this will be addressed once the web implementation updates are ready + requestAnimationFrameImpl(worklet); + } + + executeOnUIRuntimeSync(_shareable: ShareableRef): R { + throw new ReanimatedError( + '`executeOnUIRuntimeSync` is not available in JSReanimated.' + ); + } + + createWorkletRuntime( + _name: string, + _initializer: ShareableRef<() => void> + ): WorkletRuntime { + throw new ReanimatedError( + 'createWorkletRuntime is not available in JSReanimated.' + ); + } + + scheduleOnRuntime() { + throw new ReanimatedError( + 'scheduleOnRuntime is not available in JSReanimated.' + ); + } } diff --git a/packages/react-native-reanimated/src/worklets/WorkletsModule/NativeWorklets.ts b/packages/react-native-reanimated/src/worklets/WorkletsModule/NativeWorklets.ts index e305d6f164d..16243cefe2e 100644 --- a/packages/react-native-reanimated/src/worklets/WorkletsModule/NativeWorklets.ts +++ b/packages/react-native-reanimated/src/worklets/WorkletsModule/NativeWorklets.ts @@ -2,8 +2,9 @@ import { getValueUnpackerCode } from '../valueUnpacker'; import { WorkletsTurboModule } from '../../specs'; import { ReanimatedError } from '../../errors'; -import type { IWorkletsModule } from '../../commonTypes'; +import type { IWorkletsModule, ShareableRef } from '../../commonTypes'; import type { WorkletsModuleProxy } from './workletsModuleProxy'; +import type { WorkletRuntime } from '../../runtimes'; export function createNativeWorkletsModule(): IWorkletsModule { return new NativeWorklets(); @@ -26,8 +27,8 @@ See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooti this.#workletsModuleProxy = global.__workletsModuleProxy; } - makeShareableClone( - value: T, + makeShareableClone( + value: TValue, shouldPersistRemote: boolean, nativeStateSource?: object ) { @@ -37,4 +38,28 @@ See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooti nativeStateSource ); } + + scheduleOnUI(shareable: ShareableRef) { + return this.#workletsModuleProxy.scheduleOnUI(shareable); + } + + executeOnUIRuntimeSync( + shareable: ShareableRef + ): TReturn { + return this.#workletsModuleProxy.executeOnUIRuntimeSync(shareable); + } + + createWorkletRuntime(name: string, initializer: ShareableRef<() => void>) { + return this.#workletsModuleProxy.createWorkletRuntime(name, initializer); + } + + scheduleOnRuntime( + workletRuntime: WorkletRuntime, + shareableWorklet: ShareableRef + ) { + return this.#workletsModuleProxy.scheduleOnRuntime( + workletRuntime, + shareableWorklet + ); + } } diff --git a/packages/react-native-reanimated/src/worklets/WorkletsModule/workletsModuleProxy.ts b/packages/react-native-reanimated/src/worklets/WorkletsModule/workletsModuleProxy.ts index 537e5556502..df96918633a 100644 --- a/packages/react-native-reanimated/src/worklets/WorkletsModule/workletsModuleProxy.ts +++ b/packages/react-native-reanimated/src/worklets/WorkletsModule/workletsModuleProxy.ts @@ -1,6 +1,7 @@ 'use strict'; import type { ShareableRef } from '../../commonTypes'; +import type { WorkletRuntime } from '../../runtimes'; /** Type of `__workletsModuleProxy` injected with JSI. */ export interface WorkletsModuleProxy { @@ -9,4 +10,20 @@ export interface WorkletsModuleProxy { shouldPersistRemote: boolean, nativeStateSource?: object ): ShareableRef; + + scheduleOnUI(shareable: ShareableRef): void; + + executeOnUIRuntimeSync( + shareable: ShareableRef + ): TReturn; + + createWorkletRuntime( + name: string, + initializer: ShareableRef<() => void> + ): WorkletRuntime; + + scheduleOnRuntime( + workletRuntime: WorkletRuntime, + worklet: ShareableRef + ): void; } diff --git a/packages/react-native-worklets/.eslintrc.js b/packages/react-native-worklets/.eslintrc.js new file mode 100644 index 00000000000..17799e75920 --- /dev/null +++ b/packages/react-native-worklets/.eslintrc.js @@ -0,0 +1,4 @@ +/** @type {import('eslint').ESLint.ConfigData} */ +module.exports = { + extends: ['../../.eslintrc.js'], +}; diff --git a/packages/react-native-worklets/.gitattributes b/packages/react-native-worklets/.gitattributes new file mode 100644 index 00000000000..e27f70fa490 --- /dev/null +++ b/packages/react-native-worklets/.gitattributes @@ -0,0 +1,3 @@ +*.pbxproj -text +# specific for windows script files +*.bat text eol=crlf diff --git a/packages/react-native-worklets/.gitignore b/packages/react-native-worklets/.gitignore new file mode 100644 index 00000000000..9a3d039c59d --- /dev/null +++ b/packages/react-native-worklets/.gitignore @@ -0,0 +1,62 @@ +# OSX +.DS_Store + +# VSCode +.vscode/ +jsconfig.json + +# Xcode +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IJ +.classpath +.cxx +.gradle +.idea +.project +.settings +local.properties +android.iml + +# node.js +node_modules/ +npm-debug.log +yarn-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +android/app/libs +android/keystores/debug.keystore + +# Yarn +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# generated by bob +lib/ + +# React Native Codegen +apple/generated +android/generated diff --git a/packages/react-native-worklets/.watchmanconfig b/packages/react-native-worklets/.watchmanconfig new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/packages/react-native-worklets/.watchmanconfig @@ -0,0 +1 @@ +{} diff --git a/packages/react-native-worklets/LICENSE b/packages/react-native-worklets/LICENSE new file mode 100644 index 00000000000..6882e4794af --- /dev/null +++ b/packages/react-native-worklets/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2024 nobody +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/react-native-worklets/RNWorklets.podspec b/packages/react-native-worklets/RNWorklets.podspec new file mode 100644 index 00000000000..9dcdc62ff15 --- /dev/null +++ b/packages/react-native-worklets/RNWorklets.podspec @@ -0,0 +1,64 @@ +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "package.json"))) +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' + +Pod::Spec.new do |s| + s.name = "RNWorklets" + s.version = package["version"] + s.summary = package["description"] + s.homepage = "https://github.com/software-mansion/react-native-reanimated" + s.license = package["license"] + s.authors = { "author" => "author@domain.com" } + s.platforms = { :ios => min_ios_version_supported } + s.source = { :git => "https://github.com/software-mansion/react-native-reanimated.git", :tag => "#{s.version}" } + + s.source_files = "apple/*.{h,m,mm,cpp}" + + s.subspec "worklets" do |ss| + ss.source_files = "Common/cpp/worklets/**/*.{cpp,h}" + ss.header_dir = "worklets" + ss.header_mappings_dir = "Common/cpp/worklets" + + ss.subspec "apple" do |sss| + # Please be careful with the snakes. + # 🐍🐍🐍 + # Thank you for your understanding. + sss.source_files = "apple/worklets/**/*.{mm,h,m}" + sss.header_dir = "worklets" + sss.header_mappings_dir = "apple/worklets" + end + end + + # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0. + # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79. + if respond_to?(:install_modules_dependencies, true) + install_modules_dependencies(s) + else + s.dependency "React-Core" + + # Don't install the dependencies when we run `pod install` in the old architecture. + if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then + s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1" + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"", + "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" + } + s.dependency "React-Codegen" + s.dependency "RCT-Folly" + s.dependency "RCTRequired" + s.dependency "RCTTypeSafety" + s.dependency "ReactCommon/turbomodule/core" + end + end + + s.pod_target_xcconfig = { + "USE_HEADERMAP" => "YES", + "DEFINES_MODULE" => "YES", + "HEADER_SEARCH_PATHS" => '"$(PODS_TARGET_SRCROOT)/ReactCommon" "$(PODS_TARGET_SRCROOT)" "$(PODS_ROOT)/RCT-Folly" "$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/DoubleConversion" "$(PODS_ROOT)/Headers/Private/React-Core" "$(PODS_ROOT)/Headers/Private/Yoga"', + "FRAMEWORK_SEARCH_PATHS" => '"${PODS_CONFIGURATION_BUILD_DIR}/React-hermes"', + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + } + +end diff --git a/packages/react-native-worklets/android/CMakeLists.txt b/packages/react-native-worklets/android/CMakeLists.txt new file mode 100644 index 00000000000..905f2c5030b --- /dev/null +++ b/packages/react-native-worklets/android/CMakeLists.txt @@ -0,0 +1,56 @@ +project(Worklets) +cmake_minimum_required(VERSION 3.8) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +set(CMAKE_CXX_STANDARD 20) + +# default CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections +# -funwind-tables -fstack-protector-strong -no-canonical-prefixes +# -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-protector-all" +include("${REACT_NATIVE_DIR}/ReactAndroid/cmake-utils/folly-flags.cmake") +add_compile_options(${folly_FLAGS}) + +string( + APPEND + CMAKE_CXX_FLAGS + " -DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION} \ + -DREANIMATED_VERSION=${REANIMATED_VERSION} \ + -DHERMES_ENABLE_DEBUGGER=${HERMES_ENABLE_DEBUGGER}") + +string(APPEND CMAKE_CXX_FLAGS + " -fexceptions -fno-omit-frame-pointer -frtti -fstack-protector-all \ + -std=c++${CMAKE_CXX_STANDARD} -Wall -Werror") + +if(${IS_NEW_ARCHITECTURE_ENABLED}) + string(APPEND CMAKE_CXX_FLAGS " -DRCT_NEW_ARCH_ENABLED") +endif() + +if(${IS_REANIMATED_EXAMPLE_APP}) + string(APPEND CMAKE_CXX_FLAGS " -DIS_REANIMATED_EXAMPLE_APP -Wpedantic") +endif() + +if(NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug") + string(APPEND CMAKE_CXX_FLAGS " -DNDEBUG") +endif() + +if(${JS_RUNTIME} STREQUAL "hermes") + string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_HERMES=1") +elseif(${JS_RUNTIME} STREQUAL "jsc") + string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_JSC=1") +elseif(${JS_RUNTIME} STREQUAL "v8") + string(APPEND CMAKE_CXX_FLAGS " -DJS_RUNTIME_V8=1") +else() + message(FATAL_ERROR "Unknown JS runtime ${JS_RUNTIME}.") +endif() + +# Resolves "CMake Warning: Manually-specified variables were not used by the +# project" when any of the following variables is not used in some build +# configuration. +set(IGNORE_ME "${JS_RUNTIME_DIR}") + +set(BUILD_DIR "${CMAKE_SOURCE_DIR}/build") +set(ANDROID_CPP_DIR "${CMAKE_SOURCE_DIR}/src/main/cpp") +set(COMMON_CPP_DIR "${CMAKE_SOURCE_DIR}/../Common/cpp") + +add_subdirectory("${ANDROID_CPP_DIR}/worklets") diff --git a/packages/react-native-worklets/android/build.gradle b/packages/react-native-worklets/android/build.gradle new file mode 100644 index 00000000000..4c532e21201 --- /dev/null +++ b/packages/react-native-worklets/android/build.gradle @@ -0,0 +1,438 @@ +import com.android.Version +import org.apache.tools.ant.filters.ReplaceTokens +import org.apache.tools.ant.taskdefs.condition.Os +import groovy.json.JsonSlurper +import com.android.build.gradle.tasks.ExternalNativeBuildJsonTask + +import javax.inject.Inject +import java.nio.file.Files +import java.nio.file.Paths + +/** + * Finds the path of the installed npm package with the given name using Node's + * module resolution algorithm, which searches "node_modules" directories up to + * the file system root. This handles various cases, including: + * + * - Working in the open-source RN repo: + * Gradle: /path/to/react-native/ReactAndroid + * Node module: /path/to/react-native/node_modules/[package] + * + * - Installing RN as a dependency of an app and searching for hoisted + * dependencies: + * Gradle: /path/to/app/node_modules/react-native/ReactAndroid + * Node module: /path/to/app/node_modules/[package] + * + * - Working in a larger repo (e.g., Facebook) that contains RN: + * Gradle: /path/to/repo/path/to/react-native/ReactAndroid + * Node module: /path/to/repo/node_modules/[package] + * + * The search begins at the given base directory (a File object). The returned + * path is a string. + */ +static def findNodeModulePath(baseDir, packageName) { + def basePath = baseDir.toPath().normalize() + // Node's module resolution algorithm searches up to the root directory, + // after which the base path will be null + while (basePath) { + def candidatePath = Paths.get(basePath.toString(), "node_modules", packageName) + if (candidatePath.toFile().exists()) { + return candidatePath.toString() + } + basePath = basePath.getParent() + } + return null +} + +def safeExtGet(prop, fallback) { + rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback +} + +def safeAppExtGet(prop, fallback) { + def appProject = rootProject.allprojects.find { it.plugins.hasPlugin('com.android.application') } + appProject?.ext?.has(prop) ? appProject.ext.get(prop) : fallback +} + +def resolveBuildType() { + Gradle gradle = getGradle() + String tskReqStr = gradle.getStartParameter().getTaskRequests()['args'].toString() + return tskReqStr.contains('Release') ? 'release' : 'debug' +} + +def isReanimatedExampleApp() { + return safeAppExtGet("isReanimatedExampleApp", false) +} + +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" +} + +def resolveReactNativeDirectory() { + def reactNativeLocation = safeAppExtGet("REACT_NATIVE_NODE_MODULES_DIR", null) + if (reactNativeLocation != null) { + return file(reactNativeLocation) + } + + // Fallback to node resolver for custom directory structures like monorepos. + def reactNativePackage = file(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()) + if(reactNativePackage.exists()) { + return reactNativePackage.parentFile + } + + throw new GradleException( + "[Reanimated] Unable to resolve react-native location in node_modules. You should project extension property (in `app/build.gradle`) `REACT_NATIVE_NODE_MODULES_DIR` with path to react-native." + ) +} + +def getPlaygroundAppName() { // only for the development + String playgroundAppName = "" + try { + rootProject.getSubprojects().forEach({project -> + if (project.plugins.hasPlugin("com.android.application")) { + var projectCatalogAbsolutePath = project.projectDir.toString().replace("/android/app", "") + var slashPosition = projectCatalogAbsolutePath.lastIndexOf("/") + playgroundAppName = projectCatalogAbsolutePath.substring(slashPosition + 1) + } + }) + } catch (_) { + throw new GradleException("[Reanimated] Couldn't determine playground app name.") + } + return playgroundAppName +} + +def toPlatformFileString(String path) { + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + path = path.replace(File.separatorChar, '/' as char) + } + return path +} + +if (isNewArchitectureEnabled()) { + apply plugin: "com.facebook.react" +} + +def reactNativeRootDir = resolveReactNativeDirectory() + +def reactProperties = new Properties() +file("$reactNativeRootDir/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) } + +def REACT_NATIVE_VERSION = reactProperties.getProperty("VERSION_NAME") +def REACT_NATIVE_MINOR_VERSION = REACT_NATIVE_VERSION.startsWith("0.0.0-") ? 1000 : REACT_NATIVE_VERSION.split("\\.")[1].toInteger() +def IS_NEW_ARCHITECTURE_ENABLED = isNewArchitectureEnabled() + +// We download various C++ open-source dependencies into downloads. +// We then copy both the downloaded code and our custom makefiles and headers into third-party-ndk. +// After that we build native code from src/main/jni with module path pointing at third-party-ndk. + +def customDownloadsDir = System.getenv("REACT_NATIVE_DOWNLOADS_DIR") +def downloadsDir = customDownloadsDir ? new File(customDownloadsDir) : new File("$buildDir/downloads") +def thirdPartyNdkDir = new File("$buildDir/third-party-ndk") + +def reactNativeThirdParty = new File("$reactNativeRootDir/ReactAndroid/src/main/jni/third-party") +def reactNativeAndroidDownloadDir = new File("$reactNativeRootDir/ReactAndroid/build/downloads") + +def workletsPrefabHeadersDir = project.file("$buildDir/prefab-headers/worklets") + +def JS_RUNTIME = { + // Override JS runtime with environment variable + if (System.getenv("JS_RUNTIME")) { + return System.getenv("JS_RUNTIME") + } + + // Enable V8 runtime if react-native-v8 is installed + def v8Project = rootProject.getSubprojects().find { project -> project.name == "react-native-v8" } + if (v8Project != null) { + return "v8" + } + + // Check if Hermes is enabled in app setup + def appProject = rootProject.allprojects.find { it.plugins.hasPlugin('com.android.application') } + if (appProject?.hermesEnabled?.toBoolean() || appProject?.ext?.react?.enableHermes?.toBoolean()) { + return "hermes" + } + + // Use JavaScriptCore (JSC) by default + return "jsc" +}.call() + +def jsRuntimeDir = { + if (JS_RUNTIME == "hermes") { + return Paths.get(reactNativeRootDir.path, "sdks", "hermes") + } else if (JS_RUNTIME == "v8") { + return findProject(":react-native-v8").getProjectDir().getParent() + } else { + return Paths.get(reactNativeRootDir.path, "ReactCommon", "jsi") + } +}.call() + +def reactNativeArchitectures() { + def value = project.getProperties().get("reactNativeArchitectures") + return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] +} + +buildscript { + // Buildscript is evaluated before everything else so we can't use getExtOrDefault + def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["Worklets_kotlinVersion"] + + // repositories { + // google() + // mavenCentral() + // } + + repositories { + google() + mavenCentral() + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + classpath "com.android.tools.build:gradle:8.2.1" + classpath "de.undercouch:gradle-download-task:5.6.0" + classpath "com.diffplug.spotless:spotless-plugin-gradle:6.25.0" + // noinspection DifferentKotlinGradleVersion + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +if (project == rootProject) { + apply from: "spotless.gradle" +} + +apply plugin: "com.android.library" +apply plugin: "maven-publish" +apply plugin: "de.undercouch.download" + + +android { + compileSdkVersion safeExtGet("compileSdkVersion", 34) + + def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION + if (agpVersion.tokenize('.')[0].toInteger() >= 7) { + namespace "com.swmansion.worklets" + } + + if (rootProject.hasProperty("ndkPath")) { + ndkPath rootProject.ext.ndkPath + } + if (rootProject.hasProperty("ndkVersion")) { + ndkVersion rootProject.ext.ndkVersion + } + + buildFeatures { + prefab true + prefabPublishing true + buildConfig true + } + + prefab { + worklets { + headers workletsPrefabHeadersDir.absolutePath + } + } + + defaultConfig { + minSdkVersion safeExtGet("minSdkVersion", 23) + targetSdkVersion safeExtGet("targetSdkVersion", 34) + versionCode 1 + versionName "1.0" + buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", IS_NEW_ARCHITECTURE_ENABLED.toString()) + externalNativeBuild { + cmake { + arguments "-DANDROID_STL=c++_shared", + "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}", + "-DANDROID_TOOLCHAIN=clang", + "-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}", + "-DJS_RUNTIME=${JS_RUNTIME}", + "-DJS_RUNTIME_DIR=${jsRuntimeDir}", + "-DIS_NEW_ARCHITECTURE_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}", + "-DIS_REANIMATED_EXAMPLE_APP=${isReanimatedExampleApp()}" + abiFilters (*reactNativeArchitectures()) + } + } + + buildConfigField("boolean", "IS_INTERNAL_BUILD", "false") + buildConfigField("int", "EXOPACKAGE_FLAGS", "0") + buildConfigField("int", "REACT_NATIVE_MINOR_VERSION", REACT_NATIVE_MINOR_VERSION.toString()) + + consumerProguardFiles 'proguard-rules.pro' + } + externalNativeBuild { + cmake { + version = System.getenv("CMAKE_VERSION") ?: "3.22.1" + path "CMakeLists.txt" + } + } + buildTypes { + debug { + externalNativeBuild { + cmake { + if (JS_RUNTIME == "hermes") { + arguments "-DHERMES_ENABLE_DEBUGGER=1" + } else { + arguments "-DHERMES_ENABLE_DEBUGGER=0" + } + } + } + } + release { + externalNativeBuild { + cmake { + arguments "-DHERMES_ENABLE_DEBUGGER=0" + } + } + } + } + lintOptions { + abortOnError false + } + packagingOptions { + doNotStrip resolveBuildType() == 'debug' ? "**/**/*.so" : '' + // For some reason gradle only complains about the duplicated version of librrc_root and libreact_render libraries + // while there are more libraries copied in intermediates folder of the lib build directory, we exclude + // only the ones that make the build fail (ideally we should only include libreanimated but we + // are only allowed to specify exclude patterns) + excludes = [ + "META-INF", + "META-INF/**", + "**/libc++_shared.so", + "**/libfbjni.so", + "**/libjsi.so", + "**/libfolly_json.so", + "**/libfolly_runtime.so", + "**/libglog.so", + "**/libhermes.so", + "**/libhermes-executor-debug.so", + "**/libhermes_executor.so", + "**/libhermestooling.so", + "**/libreactnativejni.so", + "**/libturbomodulejsijni.so", + "**/libreactnative.so", + "**/libreact_nativemodule_core.so", + "**/libreact_render*.so", + "**/librrc_root.so", + "**/libjscexecutor.so", + "**/libv8executor.so", + ] + } + tasks.withType(JavaCompile) { + compileTask -> + compileTask.dependsOn(packageNdkLibs) + } + configurations { + extractHeaders + extractSO + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +def assertMinimalReactNativeVersion = task assertMinimalReactNativeVersionTask { + // If you change the minimal React Native version remember to update Compatibility Table in docs + def minimalReactNativeVersion = 74 + onlyIf { REACT_NATIVE_MINOR_VERSION < minimalReactNativeVersion } + doFirst { + throw new GradleException("[Reanimated] Unsupported React Native version. Please use $minimalReactNativeVersion. or newer.") + } +} + +task prepareWorkletsHeadersForPrefabs(type: Copy) { + from("$projectDir/src/main/cpp") + from("$projectDir/../Common/cpp") + include("worklets/**/*.h") + into(workletsPrefabHeadersDir) +} + +tasks.preBuild { + dependsOn assertMinimalReactNativeVersion +} + +task cleanCmakeCache() { + tasks.getByName("clean").dependsOn(cleanCmakeCache) + doFirst { + delete "${projectDir}/.cxx" + } +} + +task printVersions { + println "Android gradle plugin: ${Version.ANDROID_GRADLE_PLUGIN_VERSION}" + println "Gradle: ${project.gradle.gradleVersion}" +} + +task createNativeDepsDirectories() { + downloadsDir.mkdirs() + thirdPartyNdkDir.mkdirs() + workletsPrefabHeadersDir.mkdirs() +} + +task packageNdkLibs(type: Copy) { + from("$buildDir/worklets-ndk/all") + include("**/libworklets.so") + into("$projectDir/src/main/jniLibs") +} + +repositories { + mavenCentral() + mavenLocal() + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url "$reactNativeRootDir/android" + } + maven { + // Android JSC is installed from npm + url "$reactNativeRootDir/../jsc-android/dist" + } + google() +} + +dependencies { + implementation "com.facebook.yoga:proguard-annotations:1.19.0" + implementation "androidx.transition:transition:1.1.0" + implementation "androidx.core:core:1.6.0" + + implementation "com.facebook.react:react-android" // version substituted by RNGP + if (JS_RUNTIME == "hermes") { + implementation "com.facebook.react:hermes-android" // version substituted by RNGP + } +} + +def nativeBuildDependsOn(dependsOnTask) { + def buildTasks = tasks.findAll({ task -> ( + !task.name.contains("Clean") + && (task.name.contains("externalNative") + || task.name.contains("CMake") + || task.name.contains("generateJsonModel") + ) + ) }) + buildTasks.forEach { task -> task.dependsOn(dependsOnTask) } +} + +afterEvaluate { + preBuild.dependsOn(prepareWorkletsHeadersForPrefabs) + + tasks.forEach({ task -> + if (task.name.contains("JniLibFolders")) { + task.dependsOn(packageNdkLibs) + } + }) + + if (JS_RUNTIME == "hermes") { + // Do nothing + } else if (JS_RUNTIME == "v8") { + def buildTasks = tasks.findAll({ task -> + !task.name.contains("Clean") && (task.name.contains("externalNative") || task.name.contains("CMake") || task.name.startsWith("generateJsonModel")) }) + buildTasks.forEach { task -> + def buildType = task.name.endsWith('Debug') ? 'Debug' : 'Release' + task.dependsOn(":react-native-v8:copy${buildType}JniLibsProjectOnly") + } + } else if (JS_RUNTIME == "jsc") { + // Do nothing + } else { + throw GradleScriptException("[Reanimated] Unknown JS runtime ${JS_RUNTIME}.") + } +} diff --git a/packages/react-native-worklets/android/gradle.properties b/packages/react-native-worklets/android/gradle.properties new file mode 100644 index 00000000000..2cf6e18a6f8 --- /dev/null +++ b/packages/react-native-worklets/android/gradle.properties @@ -0,0 +1,5 @@ +Worklets_kotlinVersion=1.7.0 +Worklets_minSdkVersion=21 +Worklets_targetSdkVersion=31 +Worklets_compileSdkVersion=31 +Worklets_ndkversion=21.4.7075529 diff --git a/packages/react-native-worklets/android/src/main/AndroidManifest.xml b/packages/react-native-worklets/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..a2f47b6057d --- /dev/null +++ b/packages/react-native-worklets/android/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/CMakeLists.txt b/packages/react-native-worklets/android/src/main/cpp/worklets/CMakeLists.txt new file mode 100644 index 00000000000..d441c5ff11c --- /dev/null +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/CMakeLists.txt @@ -0,0 +1,85 @@ +cmake_minimum_required(VERSION 3.8) + +file(GLOB_RECURSE WORKLETS_COMMON_CPP_SOURCES CONFIGURE_DEPENDS + "${COMMON_CPP_DIR}/worklets/*.cpp") +file(GLOB_RECURSE WORKLETS_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS + "${ANDROID_CPP_DIR}/worklets/*.cpp") + +# Consume shared libraries and headers from prefabs +find_package(fbjni REQUIRED CONFIG) +find_package(ReactAndroid REQUIRED CONFIG) + +if(${JS_RUNTIME} STREQUAL "hermes") + find_package(hermes-engine REQUIRED CONFIG) +endif() + +add_library(worklets SHARED ${WORKLETS_COMMON_CPP_SOURCES} + ${WORKLETS_ANDROID_CPP_SOURCES}) + +# includes +target_include_directories(worklets PUBLIC "${COMMON_CPP_DIR}" + "${ANDROID_CPP_DIR}") + +target_include_directories( + worklets + PRIVATE "${REACT_NATIVE_DIR}/ReactCommon" + "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule" + "${REACT_NATIVE_DIR}/ReactCommon/react/nativemodule/core/ReactCommon" + "${REACT_NATIVE_DIR}/ReactCommon/callinvoker" + "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor") + +if(${IS_NEW_ARCHITECTURE_ENABLED}) + target_include_directories( + worklets + PRIVATE + "${REACT_NATIVE_DIR}/ReactCommon/yoga" + "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx") + + if(ReactAndroid_VERSION_MINOR LESS 76) + target_link_libraries( + worklets ReactAndroid::fabricjni ReactAndroid::react_debug + ReactAndroid::react_render_core + ReactAndroid::react_render_componentregistry ReactAndroid::rrc_view) + endif() +endif() + +# build shared lib +set_target_properties(worklets PROPERTIES LINKER_LANGUAGE CXX) + +target_link_libraries(worklets log ReactAndroid::jsi fbjni::fbjni) + +if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) + target_link_libraries(worklets ReactAndroid::reactnative) +else() + target_link_libraries( + worklets ReactAndroid::react_nativemodule_core ReactAndroid::folly_runtime + ReactAndroid::glog ReactAndroid::reactnativejni) +endif() + +if(${JS_RUNTIME} STREQUAL "hermes") + target_link_libraries(worklets hermes-engine::libhermes) + + if(${HERMES_ENABLE_DEBUGGER}) + if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) + target_link_libraries(worklets ReactAndroid::hermestooling) + else() + target_link_libraries(worklets ReactAndroid::hermes_executor) + endif() + endif() +elseif(${JS_RUNTIME} STREQUAL "jsc") + if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) + target_link_libraries(worklets ReactAndroid::jsctooling) + else() + target_link_libraries(worklets ReactAndroid::jscexecutor) + endif() +elseif(${JS_RUNTIME} STREQUAL "v8") + # TODO: Refactor this when adding support for newest V8 + target_include_directories(worklets PRIVATE "${JS_RUNTIME_DIR}/src") + file(GLOB V8_SO_DIR "${JS_RUNTIME_DIR}/android/build/intermediates/\ + library_jni/*/jni/${ANDROID_ABI}") + find_library( + V8EXECUTOR_LIB v8executor + PATHS ${V8_SO_DIR} + NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + target_link_libraries(worklets ${V8EXECUTOR_LIB}) +endif() diff --git a/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/DummyWorkletsModule.java b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/DummyWorkletsModule.java new file mode 100644 index 00000000000..c5cfd25e155 --- /dev/null +++ b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/DummyWorkletsModule.java @@ -0,0 +1,18 @@ +package com.swmansion.worklets; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.module.annotations.ReactModule; + +@ReactModule(name = DummyWorkletsModule.NAME) +public class DummyWorkletsModule extends + NativeSulphateWorkletsSpec { + + public DummyWorkletsModule(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public boolean installTurboModule() { + return true; + } +} diff --git a/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java new file mode 100644 index 00000000000..23066283cbe --- /dev/null +++ b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java @@ -0,0 +1,56 @@ +package com.swmansion.worklets; + +import androidx.annotation.NonNull; + +import com.facebook.react.BaseReactPackage; +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.module.annotations.ReactModule; +import com.facebook.react.module.annotations.ReactModuleList; +import com.facebook.react.module.model.ReactModuleInfo; +import com.facebook.react.module.model.ReactModuleInfoProvider; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +@ReactModuleList( + nativeModules = { + DummyWorkletsModule.class + }) +public class WorkletsPackage extends BaseReactPackage implements ReactPackage { + @Override + public NativeModule getModule( + @NonNull String name, @NonNull ReactApplicationContext reactContext) { + return switch (name) { + case DummyWorkletsModule.NAME -> new DummyWorkletsModule(reactContext); + default -> null; + }; + } + + @Override + public ReactModuleInfoProvider getReactModuleInfoProvider() { + Class extends NativeModule>[] moduleList = + new Class[] { + DummyWorkletsModule.class + }; + + final Map reactModuleInfoMap = new HashMap<>(); + for (Class extends NativeModule> moduleClass : moduleList) { + ReactModule reactModule = + Objects.requireNonNull(moduleClass.getAnnotation(ReactModule.class)); + + reactModuleInfoMap.put( + reactModule.name(), + new ReactModuleInfo( + reactModule.name(), + moduleClass.getName(), + true, + reactModule.needsEagerInit(), + reactModule.isCxxModule(), + BuildConfig.IS_NEW_ARCHITECTURE_ENABLED)); + } + + return () -> reactModuleInfoMap; + } +} diff --git a/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.h b/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.h new file mode 100644 index 00000000000..c2a6b079ec7 --- /dev/null +++ b/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.h @@ -0,0 +1,5 @@ +#import + +@interface DummyWorkletsModule : NSObject + +@end diff --git a/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.mm b/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.mm new file mode 100644 index 00000000000..2ba55e07e77 --- /dev/null +++ b/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.mm @@ -0,0 +1,19 @@ +#import + +@implementation DummyWorkletsModule{ + std::string valueUnpackerCode_; +} +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule : + (const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(installTurboModule) +{ + return @YES; +} + +@end diff --git a/packages/react-native-worklets/babel.config.js b/packages/react-native-worklets/babel.config.js new file mode 100644 index 00000000000..5d51f258afc --- /dev/null +++ b/packages/react-native-worklets/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:react-native-builder-bob/babel-preset'], +}; diff --git a/packages/react-native-worklets/package.json b/packages/react-native-worklets/package.json new file mode 100644 index 00000000000..c68932285e0 --- /dev/null +++ b/packages/react-native-worklets/package.json @@ -0,0 +1,82 @@ +{ + "name": "react-native-worklets", + "version": "0.0.1", + "description": "🚀", + "scripts": { + "build": "bob build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/software-mansion/react-native-reanimated.git", + "directory": "packages/react-native-worklets" + }, + "license": "MIT", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/software-mansion/react-native-reanimated/issues" + }, + "homepage": "https://docs.swmansion.com/react-native-reanimated", + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*" + }, + "devDependencies": { + "@react-native-community/cli": "15.0.1", + "@react-native/eslint-config": "0.76.5", + "@types/jest": "^29.5.5", + "@types/react": "^18.2.44", + "eslint": "^8.57.0", + "prettier": "^3.3.3", + "react": "18.3.1", + "react-native": "0.76.5", + "react-native-builder-bob": "0.33.1", + "typescript": "~5.3.0" + }, + "main": "./lib/module/index", + "module": "./lib/module/index", + "react-native": "./src/index", + "source": "./src/index", + "types": "lib/typescript/index.d.ts", + "files": [ + "src", + "lib", + "android", + "apple", + "Common", + "*.podspec", + "react-native.config.js", + "!apple/build", + "!android/build", + "!android/gradle", + "!android/gradlew", + "!android/gradlew.bat", + "!android/local.properties", + "!**/__tests__", + "!**/__fixtures__", + "!**/__mocks__", + "!**/.*" + ], + "react-native-builder-bob": { + "source": "src", + "output": "lib", + "targets": [ + [ + "module", + { + "esm": true, + "jsxRuntime": "classic" + } + ], + "typescript" + ] + }, + "codegenConfig": { + "name": "rnworklets", + "type": "modules", + "jsSrcsDir": "src/specs", + "android": { + "javaPackageName": "com.swmansion.worklets" + } + } +} diff --git a/packages/react-native-worklets/src/index.ts b/packages/react-native-worklets/src/index.ts new file mode 100644 index 00000000000..ba2a736031d --- /dev/null +++ b/packages/react-native-worklets/src/index.ts @@ -0,0 +1,3 @@ +'use strict'; + +export { DummyWorkletsTurboModule } from './specs'; diff --git a/packages/react-native-worklets/src/specs/NativeDummyWorklets.ts b/packages/react-native-worklets/src/specs/NativeDummyWorklets.ts new file mode 100644 index 00000000000..f59202c88c0 --- /dev/null +++ b/packages/react-native-worklets/src/specs/NativeDummyWorklets.ts @@ -0,0 +1,9 @@ +'use strict'; +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +interface Spec extends TurboModule { + installTurboModule: () => boolean; +} + +export default TurboModuleRegistry.get('DummyWorklets'); diff --git a/packages/react-native-worklets/src/specs/index.ts b/packages/react-native-worklets/src/specs/index.ts new file mode 100644 index 00000000000..5b294afa510 --- /dev/null +++ b/packages/react-native-worklets/src/specs/index.ts @@ -0,0 +1,5 @@ +'use strict'; + +import DummyWorkletsTurboModule from './NativeDummyWorklets'; + +export { DummyWorkletsTurboModule }; diff --git a/packages/react-native-worklets/tsconfig.json b/packages/react-native-worklets/tsconfig.json new file mode 100644 index 00000000000..fd4ac617a0c --- /dev/null +++ b/packages/react-native-worklets/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "paths": { + "react-native-worklets": ["./src"] + } + }, + "include": ["src"] +} diff --git a/yarn.lock b/yarn.lock index ebd7b07fa48..7279854049c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -85,18 +85,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.25.9": - version: 7.26.0 - resolution: "@babel/code-frame@npm:7.26.0" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/41deb0a9ac72d81e46aeab7e587a75e46c7af6a717e10b150a150b332e843807eacb7c856832c84bee2c5015fe31de23e04c18e052c83a1254027c71c0840791 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.26.0": +"@babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -115,13 +104,13 @@ __metadata: linkType: hard "@babel/compat-data@npm:^7.25.9": - version: 7.26.0 - resolution: "@babel/compat-data@npm:7.26.0" - checksum: 10/e847d58222eb567da4bcc2c8e4e44b508d1a34626922858fe12edeb73b5f3c486e7e77a351725b4347525d623dc5046b8a6355df76f368560ca6cbac10fef2c5 + version: 7.26.3 + resolution: "@babel/compat-data@npm:7.26.3" + checksum: 10/0bf4e491680722aa0eac26f770f2fae059f92e2ac083900b241c90a2c10f0fc80e448b1feccc2b332687fab4c3e33e9f83dee9ef56badca1fb9f3f71266d9ebf languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.12.9, @babel/core@npm:^7.13.16, @babel/core@npm:^7.20.0, @babel/core@npm:^7.23.6, @babel/core@npm:^7.23.9, @babel/core@npm:^7.25.2": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.12.9, @babel/core@npm:^7.13.16, @babel/core@npm:^7.20.0, @babel/core@npm:^7.23.9, @babel/core@npm:^7.25.2": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" dependencies: @@ -167,7 +156,21 @@ __metadata: languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.20.0, @babel/eslint-parser@npm:^7.25.1": +"@babel/eslint-parser@npm:^7.20.0": + version: 7.25.9 + resolution: "@babel/eslint-parser@npm:7.25.9" + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals": "npm:5.1.1-v1" + eslint-visitor-keys: "npm:^2.1.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + checksum: 10/ebb68d80b1fa2b964ad1147cc610e0c69b224e620419a885ba5abc996740523bee636a0d447fc29a0d495dbce5fa0246737b25e9e679cca6c5797fdac5176378 + languageName: node + linkType: hard + +"@babel/eslint-parser@npm:^7.25.1": version: 7.25.1 resolution: "@babel/eslint-parser@npm:7.25.1" dependencies: @@ -193,29 +196,29 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.25.9": - version: 7.26.0 - resolution: "@babel/generator@npm:7.26.0" +"@babel/generator@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" dependencies: - "@babel/parser": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.2" "@babel/types": "npm:^7.26.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10/3528b0b5da7003617771ddfc564bcb4037dde59e8142e3808ae8eb5d45c5dfda74df5eb9e6162ab2c2bc66329c609a44d9fd0ce6d4bc14b89b3deb92c3343c56 + checksum: 10/71ace82b5b07a554846a003624bfab93275ccf73cdb9f1a37a4c1094bf9dc94bb677c67e8b8c939dbd6c5f0eda2e8f268aa2b0d9c3b9511072565660e717e045 languageName: node linkType: hard -"@babel/generator@npm:^7.26.0": - version: 7.26.2 - resolution: "@babel/generator@npm:7.26.2" +"@babel/generator@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/generator@npm:7.26.3" dependencies: - "@babel/parser": "npm:^7.26.2" - "@babel/types": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.3" + "@babel/types": "npm:^7.26.3" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10/71ace82b5b07a554846a003624bfab93275ccf73cdb9f1a37a4c1094bf9dc94bb677c67e8b8c939dbd6c5f0eda2e8f268aa2b0d9c3b9511072565660e717e045 + checksum: 10/c1d8710cc1c52af9d8d67f7d8ea775578aa500887b327d2a81e27494764a6ef99e438dd7e14cf7cd3153656492ee27a8362980dc438087c0ca39d4e75532c638 languageName: node linkType: hard @@ -364,7 +367,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.7": +"@babel/helper-module-imports@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-module-imports@npm:7.24.7" dependencies: @@ -632,25 +635,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.24.7, @babel/parser@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/parser@npm:7.26.2" +"@babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2, @babel/parser@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/parser@npm:7.26.3" dependencies: - "@babel/types": "npm:^7.26.0" + "@babel/types": "npm:^7.26.3" bin: parser: ./bin/babel-parser.js - checksum: 10/8baee43752a3678ad9f9e360ec845065eeee806f1fdc8e0f348a8a0e13eef0959dabed4a197c978896c493ea205c804d0a1187cc52e4a1ba017c7935bab4983d - languageName: node - linkType: hard - -"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0": - version: 7.26.1 - resolution: "@babel/parser@npm:7.26.1" - dependencies: - "@babel/types": "npm:^7.26.0" - bin: - parser: ./bin/babel-parser.js - checksum: 10/87d6248c6a1f962621b4505e24ee89c9869d40640beb231d6befb2d56112a84a654b15980941300617aa3211ca9632cc1644c6d3f72ea3427f220133d11d9c0c + checksum: 10/e7e3814b2dc9ee3ed605d38223471fa7d3a84cbe9474d2b5fa7ac57dc1ddf75577b1fd3a93bf7db8f41f28869bda795cddd80223f980be23623b6434bf4c88a8 languageName: node linkType: hard @@ -924,6 +916,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-flow@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/plugin-syntax-flow@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/fdc0d0a7b512e00d933e12cf93c785ea4645a193f4b539230b7601cfaa8c704410199318ce9ea14e5fca7d13e9027822f7d81a7871d3e854df26b6af04cc3c6c + languageName: node + linkType: hard + "@babel/plugin-syntax-import-assertions@npm:^7.24.7": version: 7.25.6 resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" @@ -1128,7 +1131,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.0.0, @babel/plugin-transform-async-to-generator@npm:^7.20.0, @babel/plugin-transform-async-to-generator@npm:^7.24.7": +"@babel/plugin-transform-async-to-generator@npm:^7.0.0, @babel/plugin-transform-async-to-generator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" dependencies: @@ -1141,6 +1144,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.20.0": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/b3ad50fb93c171644d501864620ed23952a46648c4df10dc9c62cc9ad08031b66bd272cfdd708faeee07c23b6251b16f29ce0350473e4c79f0c32178d38ce3a6 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" @@ -1228,7 +1244,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.20.0, @babel/plugin-transform-destructuring@npm:^7.24.8": +"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.24.8": version: 7.24.8 resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" dependencies: @@ -1239,6 +1255,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.20.0": + version: 7.25.9 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/51b24fbead910ad0547463b2d214dd08076b22a66234b9f878b8bac117603dd23e05090ff86e9ffc373214de23d3e5bf1b095fe54cce2ca16b010264d90cf4f5 + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" @@ -1310,7 +1337,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.0.0, @babel/plugin-transform-flow-strip-types@npm:^7.20.0, @babel/plugin-transform-flow-strip-types@npm:^7.24.7, @babel/plugin-transform-flow-strip-types@npm:^7.25.2": +"@babel/plugin-transform-flow-strip-types@npm:^7.0.0, @babel/plugin-transform-flow-strip-types@npm:^7.24.7, @babel/plugin-transform-flow-strip-types@npm:^7.25.2": version: 7.25.2 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.25.2" dependencies: @@ -1322,6 +1349,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-flow-strip-types@npm:^7.20.0": + version: 7.25.9 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-syntax-flow": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a3ffc76bbc922720debe973bccb501ccbda0d6d32d80c9efd599ab1b683fd72cae3198975d8609b37070fc32f921a9eb7d2db17b7b719395468773be41011822 + languageName: node + linkType: hard + "@babel/plugin-transform-for-of@npm:^7.0.0": version: 7.25.9 resolution: "@babel/plugin-transform-for-of@npm:7.25.9" @@ -1645,7 +1684,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.24.7, @babel/plugin-transform-private-methods@npm:^7.25.4": +"@babel/plugin-transform-private-methods@npm:^7.22.5": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/6e3671b352c267847c53a170a1937210fa8151764d70d25005e711ef9b21969aaf422acc14f9f7fb86bc0e4ec43e7aefcc0ad9196ae02d262ec10f509f126a58 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-methods@npm:^7.24.7, @babel/plugin-transform-private-methods@npm:^7.25.4": version: 7.25.4 resolution: "@babel/plugin-transform-private-methods@npm:7.25.4" dependencies: @@ -1657,7 +1708,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.22.11, @babel/plugin-transform-private-property-in-object@npm:^7.24.7": +"@babel/plugin-transform-private-property-in-object@npm:^7.22.11": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/aa45bb5669b610afa763d774a4b5583bb60ce7d38e4fd2dedfd0703e73e25aa560e6c6124e155aa90b101601743b127d9e5d3eb00989a7e4b4ab9c2eb88475ba + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" dependencies: @@ -2151,7 +2215,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.23.6, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4, @babel/traverse@npm:^7.7.0": +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4, @babel/traverse@npm:^7.7.0": version: 7.25.6 resolution: "@babel/traverse@npm:7.25.6" dependencies: @@ -2167,21 +2231,21 @@ __metadata: linkType: hard "@babel/traverse@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/traverse@npm:7.25.9" + version: 7.26.4 + resolution: "@babel/traverse@npm:7.26.4" dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/generator": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.3" + "@babel/parser": "npm:^7.26.3" "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" + "@babel/types": "npm:^7.26.3" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/7431614d76d4a053e429208db82f2846a415833f3d9eb2e11ef72eeb3c64dfd71f4a4d983de1a4a047b36165a1f5a64de8ca2a417534cc472005c740ffcb9c6a + checksum: 10/30c81a80d66fc39842814bc2e847f4705d30f3859156f130d90a0334fe1d53aa81eed877320141a528ecbc36448acc0f14f544a7d410fa319d1c3ab63b50b58f languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.7.0": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.7.0": version: 7.25.6 resolution: "@babel/types@npm:7.25.6" dependencies: @@ -2192,13 +2256,13 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/types@npm:7.26.0" +"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/types@npm:7.26.3" dependencies: "@babel/helper-string-parser": "npm:^7.25.9" "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10/40780741ecec886ed9edae234b5eb4976968cc70d72b4e5a40d55f83ff2cc457de20f9b0f4fe9d858350e43dab0ea496e7ef62e2b2f08df699481a76df02cd6e + checksum: 10/c31d0549630a89abfa11410bf82a318b0c87aa846fbf5f9905e47ba5e2aa44f41cc746442f105d622c519e4dc532d35a8d8080460ff4692f9fc7485fbf3a00eb languageName: node linkType: hard @@ -2771,6 +2835,15 @@ __metadata: languageName: node linkType: hard +"@emnapi/runtime@npm:^1.2.0": + version: 1.3.1 + resolution: "@emnapi/runtime@npm:1.3.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/619915ee44682356f77f60455025e667b0b04ad3c95ced36c03782aea9ebc066fa73e86c4a59d221177eba5e5533d40b3a6dbff4e58ee5d81db4270185c21e22 + languageName: node + linkType: hard + "@es-joy/jsdoccomment@npm:~0.48.0": version: 0.48.0 resolution: "@es-joy/jsdoccomment@npm:0.48.0" @@ -3934,6 +4007,181 @@ __metadata: languageName: node linkType: hard +"@img/sharp-darwin-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-darwin-arm64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-darwin-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-darwin-x64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-darwin-x64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm@npm:1.0.5": + version: 1.0.5 + resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linux-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-arm64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linux-arm64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-arm@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-arm@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linux-arm": "npm:1.0.5" + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-s390x@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-x64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linux-x64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-wasm32@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-wasm32@npm:0.33.5" + dependencies: + "@emnapi/runtime": "npm:^1.2.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-win32-ia32@npm:0.33.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@img/sharp-win32-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-win32-x64@npm:0.33.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -4307,72 +4555,65 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:14.2.13": - version: 14.2.13 - resolution: "@next/env@npm:14.2.13" - checksum: 10/b61ae9e50d04c84a8e10860b61d5c6b74478447a5f952e378b2f809360696942e76227e0f72866ddfde3356fb5be378a1be796f7be52c76cf423f1137bb2d975 +"@next/env@npm:15.1.3": + version: 15.1.3 + resolution: "@next/env@npm:15.1.3" + checksum: 10/27d64cc0ceec63652f6579389483822b4b694efe6c69fb842385aff6da99618720bf76a1a20b173f98216d5dbac9a08395ad49a136d87941ba99ccd0f19faac2 languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-darwin-arm64@npm:14.2.13" +"@next/swc-darwin-arm64@npm:15.1.3": + version: 15.1.3 + resolution: "@next/swc-darwin-arm64@npm:15.1.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-darwin-x64@npm:14.2.13" +"@next/swc-darwin-x64@npm:15.1.3": + version: 15.1.3 + resolution: "@next/swc-darwin-x64@npm:15.1.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-linux-arm64-gnu@npm:14.2.13" +"@next/swc-linux-arm64-gnu@npm:15.1.3": + version: 15.1.3 + resolution: "@next/swc-linux-arm64-gnu@npm:15.1.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-linux-arm64-musl@npm:14.2.13" +"@next/swc-linux-arm64-musl@npm:15.1.3": + version: 15.1.3 + resolution: "@next/swc-linux-arm64-musl@npm:15.1.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-linux-x64-gnu@npm:14.2.13" +"@next/swc-linux-x64-gnu@npm:15.1.3": + version: 15.1.3 + resolution: "@next/swc-linux-x64-gnu@npm:15.1.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-linux-x64-musl@npm:14.2.13" +"@next/swc-linux-x64-musl@npm:15.1.3": + version: 15.1.3 + resolution: "@next/swc-linux-x64-musl@npm:15.1.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-win32-arm64-msvc@npm:14.2.13" +"@next/swc-win32-arm64-msvc@npm:15.1.3": + version: 15.1.3 + resolution: "@next/swc-win32-arm64-msvc@npm:15.1.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-win32-ia32-msvc@npm:14.2.13" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@next/swc-win32-x64-msvc@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-win32-x64-msvc@npm:14.2.13" +"@next/swc-win32-x64-msvc@npm:15.1.3": + version: 15.1.3 + resolution: "@next/swc-win32-x64-msvc@npm:15.1.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4494,18 +4735,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-clean@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-clean@npm:14.0.0" - dependencies: - "@react-native-community/cli-tools": "npm:14.0.0" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - fast-glob: "npm:^3.3.2" - checksum: 10/b92fc7dea5921f9874a726bab6f4ce3ab5623b083900991bf63097b38891d253cb440919e88e854cb550992b048aaaf4d50812a6d066d61af87f6a0b27a28b74 - languageName: node - linkType: hard - "@react-native-community/cli-clean@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-clean@npm:14.1.0" @@ -4542,20 +4771,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-config@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-config@npm:14.0.0" - dependencies: - "@react-native-community/cli-tools": "npm:14.0.0" - chalk: "npm:^4.1.2" - cosmiconfig: "npm:^9.0.0" - deepmerge: "npm:^4.3.0" - fast-glob: "npm:^3.3.2" - joi: "npm:^17.2.1" - checksum: 10/2dfc24b8b771ebff9b622eb320908ed6f568eb21dee268bf8f9da97f45a74001543783a9db5083195162443118ff7418033b60bc6593956b6a78643c5bb5f8f4 - languageName: node - linkType: hard - "@react-native-community/cli-config@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-config@npm:14.1.0" @@ -4584,24 +4799,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-debugger-ui@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-debugger-ui@npm:14.0.0" - dependencies: - serve-static: "npm:^1.13.1" - checksum: 10/485b2de5e615e27e58ef8f84acf60b18259b3326d7688449392147ec876d970166f20f91ce7dd8718c9e002739b42694589f3271a2117bee98992cfded568754 - languageName: node - linkType: hard - -"@react-native-community/cli-debugger-ui@npm:14.0.0-alpha.11": - version: 14.0.0-alpha.11 - resolution: "@react-native-community/cli-debugger-ui@npm:14.0.0-alpha.11" - dependencies: - serve-static: "npm:^1.13.1" - checksum: 10/5b837674aa9993a89bde1ee23e406c11cd0d8b19916ae7621b1ef0880bb3222ecfa222f272c9046c210276af06a6dfdf8b0b9abd2ca5e6bc4223ca4f79b9c2fe - languageName: node - linkType: hard - "@react-native-community/cli-debugger-ui@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-debugger-ui@npm:14.1.0" @@ -4620,30 +4817,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-doctor@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-doctor@npm:14.0.0" - dependencies: - "@react-native-community/cli-config": "npm:14.0.0" - "@react-native-community/cli-platform-android": "npm:14.0.0" - "@react-native-community/cli-platform-apple": "npm:14.0.0" - "@react-native-community/cli-platform-ios": "npm:14.0.0" - "@react-native-community/cli-tools": "npm:14.0.0" - chalk: "npm:^4.1.2" - command-exists: "npm:^1.2.8" - deepmerge: "npm:^4.3.0" - envinfo: "npm:^7.13.0" - execa: "npm:^5.0.0" - node-stream-zip: "npm:^1.9.1" - ora: "npm:^5.4.1" - semver: "npm:^7.5.2" - strip-ansi: "npm:^5.2.0" - wcwidth: "npm:^1.0.1" - yaml: "npm:^2.2.1" - checksum: 10/cdad0e5da75e93b08b0fc3109c603fb00f3aa187406f57fa336ac74ad55aba8bc3479f375c0e417d4787cc406db94fde9c3cf8d0602745925cb6e1df31223aa0 - languageName: node - linkType: hard - "@react-native-community/cli-doctor@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-doctor@npm:14.1.0" @@ -4692,20 +4865,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-platform-android@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-platform-android@npm:14.0.0" - dependencies: - "@react-native-community/cli-tools": "npm:14.0.0" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - fast-glob: "npm:^3.3.2" - fast-xml-parser: "npm:^4.2.4" - logkitty: "npm:^0.7.1" - checksum: 10/f8ec2e4a02689a1e151f4ce9f7ccbca4b9f9fd564159efa91ee72678668aeccebf636d39c7a10a5232553a96f00e48a796e50bd1cccaedc7ff08e9a1201e05e9 - languageName: node - linkType: hard - "@react-native-community/cli-platform-android@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-platform-android@npm:14.1.0" @@ -4734,20 +4893,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-platform-apple@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-platform-apple@npm:14.0.0" - dependencies: - "@react-native-community/cli-tools": "npm:14.0.0" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - fast-glob: "npm:^3.3.2" - fast-xml-parser: "npm:^4.2.4" - ora: "npm:^5.4.1" - checksum: 10/b90d8a84ad03a36c26adb7f28a4e0fab4315eec76c0d66ef9685f044e09082070370922efcc881a8a2d12c0b0640204446745aefb00928b44ef5ba68ab742c01 - languageName: node - linkType: hard - "@react-native-community/cli-platform-apple@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-platform-apple@npm:14.1.0" @@ -4775,15 +4920,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-platform-ios@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-platform-ios@npm:14.0.0" - dependencies: - "@react-native-community/cli-platform-apple": "npm:14.0.0" - checksum: 10/e85dc3600c7d6a443502e47e8af2eed98756dcca2aaf418a312bf3b7ec69fb49db7aa8e63318cdf5920219e5fff47cbc819ffa5d9bdc32726bed6b2d280cfe80 - languageName: node - linkType: hard - "@react-native-community/cli-platform-ios@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-platform-ios@npm:14.1.0" @@ -4802,40 +4938,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-server-api@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-server-api@npm:14.0.0" - dependencies: - "@react-native-community/cli-debugger-ui": "npm:14.0.0" - "@react-native-community/cli-tools": "npm:14.0.0" - compression: "npm:^1.7.1" - connect: "npm:^3.6.5" - errorhandler: "npm:^1.5.1" - nocache: "npm:^3.0.1" - pretty-format: "npm:^26.6.2" - serve-static: "npm:^1.13.1" - ws: "npm:^6.2.3" - checksum: 10/1f769abb4bba47a4fa8598add1ba75345d5d8664a0d6877543046924abbfa5c2df9c01378ae7a2d65fdc7db3e6d9718db9f93f39a0a9291610467350e5a42359 - languageName: node - linkType: hard - -"@react-native-community/cli-server-api@npm:14.0.0-alpha.11": - version: 14.0.0-alpha.11 - resolution: "@react-native-community/cli-server-api@npm:14.0.0-alpha.11" - dependencies: - "@react-native-community/cli-debugger-ui": "npm:14.0.0-alpha.11" - "@react-native-community/cli-tools": "npm:14.0.0-alpha.11" - compression: "npm:^1.7.1" - connect: "npm:^3.6.5" - errorhandler: "npm:^1.5.1" - nocache: "npm:^3.0.1" - pretty-format: "npm:^26.6.2" - serve-static: "npm:^1.13.1" - ws: "npm:^6.2.3" - checksum: 10/a689e88022d48e255cb196197cf0976b39bf4422821943e4f918cd2bfcc8952324b54b1983c8fcf42da03ba6b1be810ffa90b0d0e76a34be4f47237a9ae9420e - languageName: node - linkType: hard - "@react-native-community/cli-server-api@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-server-api@npm:14.1.0" @@ -4870,42 +4972,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-tools@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-tools@npm:14.0.0" - dependencies: - appdirsjs: "npm:^1.2.4" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - find-up: "npm:^5.0.0" - mime: "npm:^2.4.1" - open: "npm:^6.2.0" - ora: "npm:^5.4.1" - semver: "npm:^7.5.2" - shell-quote: "npm:^1.7.3" - sudo-prompt: "npm:^9.0.0" - checksum: 10/84219934553287072b284ff524a10c554ccd5e31a0e8237f59999d1e3eb07441baf1083f6be71bd206c76a5c061b936eb1ff8dc2fd32cbda23aa0776358a6000 - languageName: node - linkType: hard - -"@react-native-community/cli-tools@npm:14.0.0-alpha.11": - version: 14.0.0-alpha.11 - resolution: "@react-native-community/cli-tools@npm:14.0.0-alpha.11" - dependencies: - appdirsjs: "npm:^1.2.4" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - find-up: "npm:^5.0.0" - mime: "npm:^2.4.1" - open: "npm:^6.2.0" - ora: "npm:^5.4.1" - semver: "npm:^7.5.2" - shell-quote: "npm:^1.7.3" - sudo-prompt: "npm:^9.0.0" - checksum: 10/2cbdeda1b189fbd4a61621b9e2c8c47801d8e764d1475305abbb09e27d1d493326e8a216a8d41ab0091ab9615bf01189d4e3c970d864f468f9d41a9195c3a5c0 - languageName: node - linkType: hard - "@react-native-community/cli-tools@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-tools@npm:14.1.0" @@ -4943,15 +5009,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-types@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-types@npm:14.0.0" - dependencies: - joi: "npm:^17.2.1" - checksum: 10/a0e4b26da8cc600d133b60f7a74fc1375144f974bf7d453b197091e65af0e69ac0bad42eb957da6c27364c82f1126d4a6bc6b0352ea838366679fac940df9729 - languageName: node - linkType: hard - "@react-native-community/cli-types@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli-types@npm:14.1.0" @@ -4970,32 +5027,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli@npm:14.0.0" - dependencies: - "@react-native-community/cli-clean": "npm:14.0.0" - "@react-native-community/cli-config": "npm:14.0.0" - "@react-native-community/cli-debugger-ui": "npm:14.0.0" - "@react-native-community/cli-doctor": "npm:14.0.0" - "@react-native-community/cli-server-api": "npm:14.0.0" - "@react-native-community/cli-tools": "npm:14.0.0" - "@react-native-community/cli-types": "npm:14.0.0" - chalk: "npm:^4.1.2" - commander: "npm:^9.4.1" - deepmerge: "npm:^4.3.0" - execa: "npm:^5.0.0" - find-up: "npm:^5.0.0" - fs-extra: "npm:^8.1.0" - graceful-fs: "npm:^4.1.3" - prompts: "npm:^2.4.2" - semver: "npm:^7.5.2" - bin: - rnc-cli: build/bin.js - checksum: 10/ae6ec29f015704aaf2ddaa60be822d277644787e4d788a13fb9de0c80e3b39e313d8ac05fac2512761b04c3d89d86b58ffb97f90067764932921288c084f5c22 - languageName: node - linkType: hard - "@react-native-community/cli@npm:14.1.0": version: 14.1.0 resolution: "@react-native-community/cli@npm:14.1.0" @@ -5083,12 +5114,12 @@ __metadata: linkType: hard "@react-native-picker/picker@npm:^2.9.0": - version: 2.9.0 - resolution: "@react-native-picker/picker@npm:2.9.0" + version: 2.10.2 + resolution: "@react-native-picker/picker@npm:2.10.2" peerDependencies: react: "*" react-native: "*" - checksum: 10/a2442d55b9fc239eb9109cfcfc9d6b749619bc0e79c0f43d2ced618e27f485b26bde84ba6965f1e172242bf479566c17ae39e5de7b3f2e782bde81c9e61e2fd9 + checksum: 10/c6cbbc335ab5e7371866c3fb032a946ffc428440129b28c9dd23f6914cdff37c8e9d224ffd1aa77a99c18beaf21fd154cd60a9940ebcbc958fc6ee5fce4d864c languageName: node linkType: hard @@ -5109,13 +5140,6 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/assets-registry@npm:0.75.2" - checksum: 10/e72861cd04122634d57998a14ae51f539e93b2a5788e3fa7980c1b4163ae05f59120e192c454a6639333eaf72703299c22a9a08180d1495bf08369ba53d0a0f2 - languageName: node - linkType: hard - "@react-native/assets-registry@npm:0.75.4": version: 0.75.4 resolution: "@react-native/assets-registry@npm:0.75.4" @@ -5130,6 +5154,13 @@ __metadata: languageName: node linkType: hard +"@react-native/assets-registry@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/assets-registry@npm:0.76.5" + checksum: 10/d144e1030343582e8112284ee8cdc84f68bb4314894769dad98445e64e6a3a954a74844332658f1ae2b32a3a33c8b62b861205c66e9267744c2cc2227784ac60 + languageName: node + linkType: hard + "@react-native/assets-registry@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/assets-registry@npm:0.77.0-rc.6" @@ -5137,15 +5168,6 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/babel-plugin-codegen@npm:0.75.2" - dependencies: - "@react-native/codegen": "npm:0.75.2" - checksum: 10/1ca1fa22053ee1dcfe051dd64dce990d0ef7369465902feb5523a116ea72abb0683b5a665c578a8b9c8cd6ef449a267788fa2488f2777eec3c48faf0d76271aa - languageName: node - linkType: hard - "@react-native/babel-plugin-codegen@npm:0.75.4": version: 0.75.4 resolution: "@react-native/babel-plugin-codegen@npm:0.75.4" @@ -5173,6 +5195,15 @@ __metadata: languageName: node linkType: hard +"@react-native/babel-plugin-codegen@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/babel-plugin-codegen@npm:0.76.5" + dependencies: + "@react-native/codegen": "npm:0.76.5" + checksum: 10/256bfe392590545ca979f53d257c93adef972be1b740c14f8320942ccbbe8ac466999f0f9693626f8c4ddd5e31ab882e396a4e5d4e80d8dbf2c629c04fff013d + languageName: node + linkType: hard + "@react-native/babel-plugin-codegen@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/babel-plugin-codegen@npm:0.77.0-rc.6" @@ -5183,61 +5214,6 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/babel-preset@npm:0.75.2" - dependencies: - "@babel/core": "npm:^7.20.0" - "@babel/plugin-proposal-export-default-from": "npm:^7.0.0" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.0" - "@babel/plugin-syntax-export-default-from": "npm:^7.0.0" - "@babel/plugin-syntax-flow": "npm:^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.0.0" - "@babel/plugin-syntax-optional-chaining": "npm:^7.0.0" - "@babel/plugin-transform-arrow-functions": "npm:^7.0.0" - "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3" - "@babel/plugin-transform-async-to-generator": "npm:^7.20.0" - "@babel/plugin-transform-block-scoping": "npm:^7.0.0" - "@babel/plugin-transform-class-properties": "npm:^7.24.1" - "@babel/plugin-transform-classes": "npm:^7.0.0" - "@babel/plugin-transform-computed-properties": "npm:^7.0.0" - "@babel/plugin-transform-destructuring": "npm:^7.20.0" - "@babel/plugin-transform-flow-strip-types": "npm:^7.20.0" - "@babel/plugin-transform-for-of": "npm:^7.0.0" - "@babel/plugin-transform-function-name": "npm:^7.0.0" - "@babel/plugin-transform-literals": "npm:^7.0.0" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.0.0" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.5" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.5" - "@babel/plugin-transform-parameters": "npm:^7.0.0" - "@babel/plugin-transform-private-methods": "npm:^7.22.5" - "@babel/plugin-transform-private-property-in-object": "npm:^7.22.11" - "@babel/plugin-transform-react-display-name": "npm:^7.0.0" - "@babel/plugin-transform-react-jsx": "npm:^7.0.0" - "@babel/plugin-transform-react-jsx-self": "npm:^7.0.0" - "@babel/plugin-transform-react-jsx-source": "npm:^7.0.0" - "@babel/plugin-transform-regenerator": "npm:^7.20.0" - "@babel/plugin-transform-runtime": "npm:^7.0.0" - "@babel/plugin-transform-shorthand-properties": "npm:^7.0.0" - "@babel/plugin-transform-spread": "npm:^7.0.0" - "@babel/plugin-transform-sticky-regex": "npm:^7.0.0" - "@babel/plugin-transform-typescript": "npm:^7.5.0" - "@babel/plugin-transform-unicode-regex": "npm:^7.0.0" - "@babel/template": "npm:^7.0.0" - "@react-native/babel-plugin-codegen": "npm:0.75.2" - babel-plugin-transform-flow-enums: "npm:^0.0.2" - react-refresh: "npm:^0.14.0" - peerDependencies: - "@babel/core": "*" - checksum: 10/46de9a9cbd8e7c31c1e725fb9efa2be1f06dd8dd06c3c4595784607da684e5a4ca137833cc7169cc2da7d1703dac2449a3802514fe7ab7346959322fa09757f0 - languageName: node - linkType: hard - "@react-native/babel-preset@npm:0.75.4": version: 0.75.4 resolution: "@react-native/babel-preset@npm:0.75.4" @@ -5344,13 +5320,68 @@ __metadata: react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/4bf7c63f799bd7a9f457163bb3bd781f1d5da60f277d41c8cbdaa96e9833a814fcd9ed49cd23a01b9d5710aa1dbd5e0de636423012d13b476d067c4741654a3e + checksum: 10/4bf7c63f799bd7a9f457163bb3bd781f1d5da60f277d41c8cbdaa96e9833a814fcd9ed49cd23a01b9d5710aa1dbd5e0de636423012d13b476d067c4741654a3e + languageName: node + linkType: hard + +"@react-native/babel-preset@npm:0.76.1": + version: 0.76.1 + resolution: "@react-native/babel-preset@npm:0.76.1" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.0" + "@babel/plugin-transform-class-properties": "npm:^7.25.4" + "@babel/plugin-transform-classes": "npm:^7.25.4" + "@babel/plugin-transform-computed-properties": "npm:^7.24.7" + "@babel/plugin-transform-destructuring": "npm:^7.24.8" + "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" + "@babel/plugin-transform-for-of": "npm:^7.24.7" + "@babel/plugin-transform-function-name": "npm:^7.25.1" + "@babel/plugin-transform-literals": "npm:^7.25.2" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.24.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" + "@babel/plugin-transform-react-display-name": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx": "npm:^7.25.2" + "@babel/plugin-transform-react-jsx-self": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx-source": "npm:^7.24.7" + "@babel/plugin-transform-regenerator": "npm:^7.24.7" + "@babel/plugin-transform-runtime": "npm:^7.24.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" + "@babel/plugin-transform-spread": "npm:^7.24.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" + "@babel/plugin-transform-typescript": "npm:^7.25.2" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" + "@babel/template": "npm:^7.25.0" + "@react-native/babel-plugin-codegen": "npm:0.76.1" + babel-plugin-syntax-hermes-parser: "npm:^0.23.1" + babel-plugin-transform-flow-enums: "npm:^0.0.2" + react-refresh: "npm:^0.14.0" + peerDependencies: + "@babel/core": "*" + checksum: 10/45935580c722ebec0aea75f760f5f5ee3b93d1f824d91f3811d028416e2844aea7787d87b6986b019ae2bda46f9a1b7ee4493d705b4c6578f4ce3904493429e2 languageName: node linkType: hard -"@react-native/babel-preset@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/babel-preset@npm:0.76.1" +"@react-native/babel-preset@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/babel-preset@npm:0.76.5" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -5393,13 +5424,13 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.76.1" - babel-plugin-syntax-hermes-parser: "npm:^0.23.1" + "@react-native/babel-plugin-codegen": "npm:0.76.5" + babel-plugin-syntax-hermes-parser: "npm:^0.25.1" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/45935580c722ebec0aea75f760f5f5ee3b93d1f824d91f3811d028416e2844aea7787d87b6986b019ae2bda46f9a1b7ee4493d705b4c6578f4ce3904493429e2 + checksum: 10/18576665105505f25e60935502612a47ff29c803b090466c8563e49b98cd533c3dd60734a3cce1a10397f31be4993b40c665c75ff0f3d3127aff8e747ff8b5de languageName: node linkType: hard @@ -5458,24 +5489,6 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/codegen@npm:0.75.2" - dependencies: - "@babel/parser": "npm:^7.20.0" - glob: "npm:^7.1.1" - hermes-parser: "npm:0.22.0" - invariant: "npm:^2.2.4" - jscodeshift: "npm:^0.14.0" - mkdirp: "npm:^0.5.1" - nullthrows: "npm:^1.1.1" - yargs: "npm:^17.6.2" - peerDependencies: - "@babel/preset-env": ^7.1.6 - checksum: 10/9970ef151f40160f71cd6d0f1a09e37a4cbb9c892f03a9c1e88ad247772943dc6e4e03ebfe8a10ee6fa7c10aa9f751d104fb08b4c6d166c9cc1fe4753b1ebdab - languageName: node - linkType: hard - "@react-native/codegen@npm:0.75.4": version: 0.75.4 resolution: "@react-native/codegen@npm:0.75.4" @@ -5530,6 +5543,24 @@ __metadata: languageName: node linkType: hard +"@react-native/codegen@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/codegen@npm:0.76.5" + dependencies: + "@babel/parser": "npm:^7.25.3" + glob: "npm:^7.1.1" + hermes-parser: "npm:0.23.1" + invariant: "npm:^2.2.4" + jscodeshift: "npm:^0.14.0" + mkdirp: "npm:^0.5.1" + nullthrows: "npm:^1.1.1" + yargs: "npm:^17.6.2" + peerDependencies: + "@babel/preset-env": ^7.1.6 + checksum: 10/ad7512313cfe073be738d16a44426aabc9b2562d8fddc840dade197532c95cd59a441c43cfa214c30ef7f6585ead0307c13738edea2df53686c9c7ea50620f11 + languageName: node + linkType: hard + "@react-native/codegen@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/codegen@npm:0.77.0-rc.6" @@ -5547,26 +5578,6 @@ __metadata: languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/community-cli-plugin@npm:0.75.2" - dependencies: - "@react-native-community/cli-server-api": "npm:14.0.0-alpha.11" - "@react-native-community/cli-tools": "npm:14.0.0-alpha.11" - "@react-native/dev-middleware": "npm:0.75.2" - "@react-native/metro-babel-transformer": "npm:0.75.2" - chalk: "npm:^4.0.0" - execa: "npm:^5.1.1" - metro: "npm:^0.80.3" - metro-config: "npm:^0.80.3" - metro-core: "npm:^0.80.3" - node-fetch: "npm:^2.2.0" - querystring: "npm:^0.2.1" - readline: "npm:^1.3.0" - checksum: 10/13ceea24365350b5ee528cd2654cfe764900296c186e8704bc86f4a8bda649fb154f752a32f3c29a5d9b425c44b692e8f754013d1b6db843f686038f80f8799a - languageName: node - linkType: hard - "@react-native/community-cli-plugin@npm:0.75.4": version: 0.75.4 resolution: "@react-native/community-cli-plugin@npm:0.75.4" @@ -5609,6 +5620,29 @@ __metadata: languageName: node linkType: hard +"@react-native/community-cli-plugin@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/community-cli-plugin@npm:0.76.5" + dependencies: + "@react-native/dev-middleware": "npm:0.76.5" + "@react-native/metro-babel-transformer": "npm:0.76.5" + chalk: "npm:^4.0.0" + debug: "npm:^2.2.0" + invariant: "npm:^2.2.4" + metro: "npm:^0.81.0" + metro-config: "npm:^0.81.0" + metro-core: "npm:^0.81.0" + readline: "npm:^1.3.0" + semver: "npm:^7.1.3" + peerDependencies: + "@react-native-community/cli-server-api": "*" + peerDependenciesMeta: + "@react-native-community/cli-server-api": + optional: true + checksum: 10/7c039c012a157d2d7b685d829cd3ee29fc035cdd5466da2d6b6346bf2c239493ae29dbd682bbea58a862efebb62179e78c8f937e262eb3b5fe992af05d2cfaed + languageName: node + linkType: hard + "@react-native/community-cli-plugin@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/community-cli-plugin@npm:0.77.0-rc.6" @@ -5632,13 +5666,6 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/debugger-frontend@npm:0.75.2" - checksum: 10/2026c679fec3fe61f41d2c27cbc7ffb33a60e11578f773252c132e41f4872ab4c271390667f79e646fe6af4b0073ab1fe26528bab6709ddc74f7836654882ab5 - languageName: node - linkType: hard - "@react-native/debugger-frontend@npm:0.75.4": version: 0.75.4 resolution: "@react-native/debugger-frontend@npm:0.75.4" @@ -5660,6 +5687,13 @@ __metadata: languageName: node linkType: hard +"@react-native/debugger-frontend@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/debugger-frontend@npm:0.76.5" + checksum: 10/2dc56743401760ce181b0e1ee4fd2cef565b2de9b2a1ec7ab232714cf348e27ccf1f36fa3652eb070e65538185c713d81c08b75dc0dcd2e430f4402943edc8c9 + languageName: node + linkType: hard + "@react-native/debugger-frontend@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/debugger-frontend@npm:0.77.0-rc.6" @@ -5667,26 +5701,6 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/dev-middleware@npm:0.75.2" - dependencies: - "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.75.2" - chrome-launcher: "npm:^0.15.2" - chromium-edge-launcher: "npm:^0.2.0" - connect: "npm:^3.6.5" - debug: "npm:^2.2.0" - node-fetch: "npm:^2.2.0" - nullthrows: "npm:^1.1.1" - open: "npm:^7.0.3" - selfsigned: "npm:^2.4.1" - serve-static: "npm:^1.13.1" - ws: "npm:^6.2.2" - checksum: 10/326ce1ba04ad99a1e9bcc5d7b2fde23d0162ebe0ecae5bc4bca5f9431e80963ae54949bd868b52d0b8b146b17b79134530602dcbda048895121c683f696c0c6a - languageName: node - linkType: hard - "@react-native/dev-middleware@npm:0.75.4": version: 0.75.4 resolution: "@react-native/dev-middleware@npm:0.75.4" @@ -5745,6 +5759,25 @@ __metadata: languageName: node linkType: hard +"@react-native/dev-middleware@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/dev-middleware@npm:0.76.5" + dependencies: + "@isaacs/ttlcache": "npm:^1.4.1" + "@react-native/debugger-frontend": "npm:0.76.5" + chrome-launcher: "npm:^0.15.2" + chromium-edge-launcher: "npm:^0.2.0" + connect: "npm:^3.6.5" + debug: "npm:^2.2.0" + nullthrows: "npm:^1.1.1" + open: "npm:^7.0.3" + selfsigned: "npm:^2.4.1" + serve-static: "npm:^1.13.1" + ws: "npm:^6.2.3" + checksum: 10/6729761eb1e93e8322475ae6b7cb64aca7a72473826e0a16c699432ddaf8b31f57c9765b7c5e527166a47550098b11a48dcacb70d6de1d8ea6cbc6f511ac453c + languageName: node + linkType: hard + "@react-native/dev-middleware@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/dev-middleware@npm:0.77.0-rc.6" @@ -5811,6 +5844,29 @@ __metadata: languageName: node linkType: hard +"@react-native/eslint-config@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/eslint-config@npm:0.76.5" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/eslint-parser": "npm:^7.25.1" + "@react-native/eslint-plugin": "npm:0.76.5" + "@typescript-eslint/eslint-plugin": "npm:^7.1.1" + "@typescript-eslint/parser": "npm:^7.1.1" + eslint-config-prettier: "npm:^8.5.0" + eslint-plugin-eslint-comments: "npm:^3.2.0" + eslint-plugin-ft-flow: "npm:^2.0.1" + eslint-plugin-jest: "npm:^27.9.0" + eslint-plugin-react: "npm:^7.30.1" + eslint-plugin-react-hooks: "npm:^4.6.0" + eslint-plugin-react-native: "npm:^4.0.0" + peerDependencies: + eslint: ">=8" + prettier: ">=2" + checksum: 10/28fff6184fa3e015df9ae86a10a6cd3d563b2440112b1cd0b6ea201a42a9f88407b7b7c61b3ee08b2eb633dcdf8cf43ef58b7472782e84771be9070f176d9082 + languageName: node + linkType: hard + "@react-native/eslint-config@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/eslint-config@npm:0.77.0-rc.6" @@ -5848,6 +5904,13 @@ __metadata: languageName: node linkType: hard +"@react-native/eslint-plugin@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/eslint-plugin@npm:0.76.5" + checksum: 10/0418f5d5b02db80b1a2a193dafd0f01f9c8176488325b6e1d23318df8b374992142417724e52ac802a60a8bc92622d982a407dcb71d3f85922576c234194414f + languageName: node + linkType: hard + "@react-native/eslint-plugin@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/eslint-plugin@npm:0.77.0-rc.6" @@ -5855,13 +5918,6 @@ __metadata: languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/gradle-plugin@npm:0.75.2" - checksum: 10/0b9ab824959db4da7ac29de9a285402cf3540e1ba1ef38c34f23389119393975d7a5463b65443d6c1e4f6618e3829b600e51ed0f05603b7f4649ce24f0f0b89e - languageName: node - linkType: hard - "@react-native/gradle-plugin@npm:0.75.4": version: 0.75.4 resolution: "@react-native/gradle-plugin@npm:0.75.4" @@ -5876,6 +5932,13 @@ __metadata: languageName: node linkType: hard +"@react-native/gradle-plugin@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/gradle-plugin@npm:0.76.5" + checksum: 10/337a2a1dcca76e58463340e3de8c6d1e207a00f1b7441067f2828f67a03aba2d00d9abf3340d74d653a1eeaf60827ecd0e67bac9128dad6dceded444ea70e2ff + languageName: node + linkType: hard + "@react-native/gradle-plugin@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/gradle-plugin@npm:0.77.0-rc.6" @@ -5883,13 +5946,6 @@ __metadata: languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/js-polyfills@npm:0.75.2" - checksum: 10/de7f2e0e2a52d142d5068a99fb2fd29eb6a6aced3336295ef967e374681e0e36183ef859fbdb5bfa3cba724f1c2f83f42702b1824c27f6876fb999028fe0c919 - languageName: node - linkType: hard - "@react-native/js-polyfills@npm:0.75.4": version: 0.75.4 resolution: "@react-native/js-polyfills@npm:0.75.4" @@ -5911,6 +5967,13 @@ __metadata: languageName: node linkType: hard +"@react-native/js-polyfills@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/js-polyfills@npm:0.76.5" + checksum: 10/cab948838bbbf2ce507e1130135c819c05831327cb03432c7d9f95367f74474fd7863cf6641f37f42217a34e788b82987d0ba10cf5d65ed63d265e8508b78141 + languageName: node + linkType: hard + "@react-native/js-polyfills@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/js-polyfills@npm:0.77.0-rc.6" @@ -5918,20 +5981,6 @@ __metadata: languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/metro-babel-transformer@npm:0.75.2" - dependencies: - "@babel/core": "npm:^7.20.0" - "@react-native/babel-preset": "npm:0.75.2" - hermes-parser: "npm:0.22.0" - nullthrows: "npm:^1.1.1" - peerDependencies: - "@babel/core": "*" - checksum: 10/4f5be3a0bd871c1f147afaa06febeb55f6c8e7cb229b2eeb569a9790fe06a335ead99543ff0b72a09cdaa46932729871f78f67d072cecd362158a69fe091285e - languageName: node - linkType: hard - "@react-native/metro-babel-transformer@npm:0.75.4": version: 0.75.4 resolution: "@react-native/metro-babel-transformer@npm:0.75.4" @@ -5974,6 +6023,20 @@ __metadata: languageName: node linkType: hard +"@react-native/metro-babel-transformer@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/metro-babel-transformer@npm:0.76.5" + dependencies: + "@babel/core": "npm:^7.25.2" + "@react-native/babel-preset": "npm:0.76.5" + hermes-parser: "npm:0.23.1" + nullthrows: "npm:^1.1.1" + peerDependencies: + "@babel/core": "*" + checksum: 10/52f445b9e99515750ffbbdc182ed2aff07ef69a380606c960a122179afeb55014c5743451a2b941939d4044a4a575fd3d316fa434c827dea57625a4c6f110c18 + languageName: node + linkType: hard + "@react-native/metro-babel-transformer@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/metro-babel-transformer@npm:0.77.0-rc.6" @@ -6031,13 +6094,6 @@ __metadata: languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/normalize-colors@npm:0.75.2" - checksum: 10/bbf7038e191785eacfb90765c92ebd6007f9fb55b8efb5a67e3438627238f83181b09b293deb1978cca615041f74b2c034a5ad335ac025c4ce663d7d72619ca1 - languageName: node - linkType: hard - "@react-native/normalize-colors@npm:0.75.4": version: 0.75.4 resolution: "@react-native/normalize-colors@npm:0.75.4" @@ -6059,6 +6115,13 @@ __metadata: languageName: node linkType: hard +"@react-native/normalize-colors@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/normalize-colors@npm:0.76.5" + checksum: 10/ebe4df00677e779443c54a36acf034d51f582eebdb5745c7c185ad49d4f5ed9302c1b7560c59f0c5a278b02768057c2b97ab431e7af2d8f2a97c6b848f377210 + languageName: node + linkType: hard + "@react-native/normalize-colors@npm:0.77.0-rc.6": version: 0.77.0-rc.6 resolution: "@react-native/normalize-colors@npm:0.77.0-rc.6" @@ -6111,9 +6174,9 @@ __metadata: languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.76.0": - version: 0.76.0 - resolution: "@react-native/virtualized-lists@npm:0.76.0" +"@react-native/virtualized-lists@npm:0.76.5": + version: 0.76.5 + resolution: "@react-native/virtualized-lists@npm:0.76.5" dependencies: invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" @@ -6124,7 +6187,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/25fd09e30b2583165dbfcd42f5498baedbf485937beac53cd5be0bc237597d49370ee891f4daa932837f74e9ad45bf389f46d98f720f7578c07669fb4e7e21d5 + checksum: 10/c5c0a5c74f7b28b90f9043bac4f7c582732e6aa72808f80d977b04f165a57995ac81151821ed875bac31560c947af0197163ead2d2633e51891a7c7ec7dc2803 languageName: node linkType: hard @@ -6333,30 +6396,7 @@ __metadata: languageName: node linkType: hard -"@stylexjs/babel-plugin@npm:^0.7.5": - version: 0.7.5 - resolution: "@stylexjs/babel-plugin@npm:0.7.5" - dependencies: - "@babel/core": "npm:^7.23.6" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.6" - "@babel/types": "npm:^7.23.6" - "@stylexjs/shared": "npm:0.7.5" - "@stylexjs/stylex": "npm:0.7.5" - checksum: 10/80e59ce2ef5aa51c5c80cef5045756cd302f20d0dc058295fbc138b1558f94abbfb5517a1c07ce8eb15da75dbc6842042e2efa9c6543001e7c76fc9959604f36 - languageName: node - linkType: hard - -"@stylexjs/shared@npm:0.7.5": - version: 0.7.5 - resolution: "@stylexjs/shared@npm:0.7.5" - dependencies: - postcss-value-parser: "npm:^4.1.0" - checksum: 10/93707115e05ce9b59a6b005b3c4595da65f01b5840a319daa36ab22250ae4e29d25872b9481430fbb6cde143f56a75ae9c7866cf30a82460c105103da72d8361 - languageName: node - linkType: hard - -"@stylexjs/stylex@npm:0.7.5, @stylexjs/stylex@npm:^0.7.5": +"@stylexjs/stylex@npm:^0.7.5": version: 0.7.5 resolution: "@stylexjs/stylex@npm:0.7.5" dependencies: @@ -6367,20 +6407,19 @@ __metadata: languageName: node linkType: hard -"@swc/counter@npm:^0.1.3": +"@swc/counter@npm:0.1.3": version: 0.1.3 resolution: "@swc/counter@npm:0.1.3" checksum: 10/df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 languageName: node linkType: hard -"@swc/helpers@npm:0.5.5": - version: 0.5.5 - resolution: "@swc/helpers@npm:0.5.5" +"@swc/helpers@npm:0.5.15": + version: 0.5.15 + resolution: "@swc/helpers@npm:0.5.15" dependencies: - "@swc/counter": "npm:^0.1.3" - tslib: "npm:^2.4.0" - checksum: 10/1c5ef04f642542212df28c669438f3e0f459dcde7b448a5b1fcafb2e9e4f13e76d8428535a270e91ed123dd2a21189dbed34086b88a8cf68baf84984d6d0e39b + tslib: "npm:^2.8.0" + checksum: 10/e3f32c6deeecfb0fa3f22edff03a7b358e7ce16d27b0f1c8b5cdc3042c5c4ce4da6eac0b781ab7cc4f54696ece657467d56734fb26883439fb00017385364c4c languageName: node linkType: hard @@ -6599,7 +6638,7 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^29.5.13": +"@types/jest@npm:^29.5.13, @types/jest@npm:^29.5.5": version: 29.5.14 resolution: "@types/jest@npm:29.5.14" dependencies: @@ -6728,6 +6767,16 @@ __metadata: languageName: node linkType: hard +"@types/react@npm:^18.2.44": + version: 18.3.13 + resolution: "@types/react@npm:18.3.13" + dependencies: + "@types/prop-types": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10/4f2b851cabdb68430b50998ad18f206edaea5b3c651d92e3573d86b7ac740224a91b7ca63176fa70e1defc78459faf518e5d2f58e1ba2839b1f12365dab70de2 + languageName: node + linkType: hard + "@types/scheduler@npm:^0.16": version: 0.16.8 resolution: "@types/scheduler@npm:0.16.8" @@ -7959,7 +8008,7 @@ __metadata: languageName: unknown linkType: soft -"babel-plugin-syntax-hermes-parser@npm:0.25.1": +"babel-plugin-syntax-hermes-parser@npm:0.25.1, babel-plugin-syntax-hermes-parser@npm:^0.25.1": version: 0.25.1 resolution: "babel-plugin-syntax-hermes-parser@npm:0.25.1" dependencies: @@ -8513,9 +8562,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001669": - version: 1.0.30001675 - resolution: "caniuse-lite@npm:1.0.30001675" - checksum: 10/06be4a34aca5f54cbe7daae3e8a4a4aaf135cdae6154ac73c2dc63a207714353c3ddd76331336179fdabac4a565d7970255105b854198ba5b15ec038698930b3 + version: 1.0.30001688 + resolution: "caniuse-lite@npm:1.0.30001688" + checksum: 10/2125e900af866ee211c66beca01220c98e72c8a91d25c87b8ab456d3916f56fb1be5feef72556bca746da7aa852fc0118a04669f5ec2e6511eb77c960479e1c0 languageName: node linkType: hard @@ -9032,13 +9081,11 @@ __metadata: "@react-native-async-storage/async-storage": "npm:^1.24.0" "@react-native-community/slider": "npm:^4.5.5" "@react-native-masked-view/masked-view": "npm:^0.3.1" - "@react-native-picker/picker": "npm:^2.9.0" "@react-navigation/bottom-tabs": "npm:^7.0.0" "@react-navigation/native": "npm:^7.0.0" "@react-navigation/native-stack": "npm:^7.0.0" "@react-navigation/stack": "npm:^7.0.0" "@shopify/flash-list": "npm:^1.7.1" - "@stylexjs/babel-plugin": "npm:^0.7.5" "@tsconfig/react-native": "npm:^3.0.0" "@types/d3-shape": "npm:^3.1.1" d3-shape: "npm:^3.2.0" @@ -9060,13 +9107,11 @@ __metadata: "@react-native-async-storage/async-storage": "*" "@react-native-community/slider": "*" "@react-native-masked-view/masked-view": "*" - "@react-native-picker/picker": "*" "@react-navigation/bottom-tabs": "*" "@react-navigation/native": "*" "@react-navigation/native-stack": "*" "@react-navigation/stack": "*" "@shopify/flash-list": "*" - "@stylexjs/babel-plugin": "*" d3-shape: "*" react: "*" react-dom: "*" @@ -9860,6 +9905,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.3": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10/b4ea018d623e077bd395f168a9e81db77370dde36a5b01d067f2ad7989924a81d31cb547ff764acb2aa25d50bb7fdde0b0a93bec02212b0cb430621623246d39 + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -10120,9 +10172,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.41": - version: 1.5.49 - resolution: "electron-to-chromium@npm:1.5.49" - checksum: 10/4c368eca149587619bbc961490883cca510c8ab1986abee6cbbb7ed245a06d68607245c25078a9460c0d18ea4179411abed94b755d7b7a82a3f4e696494c4360 + version: 1.5.73 + resolution: "electron-to-chromium@npm:1.5.73" + checksum: 10/07d0885656c49ea4deb98340db23c68b43615c0325566e0ae6df751328460d4cdfb86ca0fcaaa745cf7b44c6141440fe2eb2f5d9518d1c110ba3872c73ed817d languageName: node linkType: hard @@ -11666,7 +11718,7 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:^4.2.4, fast-xml-parser@npm:^4.4.1": +"fast-xml-parser@npm:^4.4.1": version: 4.5.0 resolution: "fast-xml-parser@npm:4.5.0" dependencies: @@ -12499,7 +12551,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -14364,11 +14416,11 @@ __metadata: linkType: hard "jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 languageName: node linkType: hard @@ -16415,30 +16467,31 @@ __metadata: linkType: soft "next@npm:latest": - version: 14.2.13 - resolution: "next@npm:14.2.13" - dependencies: - "@next/env": "npm:14.2.13" - "@next/swc-darwin-arm64": "npm:14.2.13" - "@next/swc-darwin-x64": "npm:14.2.13" - "@next/swc-linux-arm64-gnu": "npm:14.2.13" - "@next/swc-linux-arm64-musl": "npm:14.2.13" - "@next/swc-linux-x64-gnu": "npm:14.2.13" - "@next/swc-linux-x64-musl": "npm:14.2.13" - "@next/swc-win32-arm64-msvc": "npm:14.2.13" - "@next/swc-win32-ia32-msvc": "npm:14.2.13" - "@next/swc-win32-x64-msvc": "npm:14.2.13" - "@swc/helpers": "npm:0.5.5" + version: 15.1.3 + resolution: "next@npm:15.1.3" + dependencies: + "@next/env": "npm:15.1.3" + "@next/swc-darwin-arm64": "npm:15.1.3" + "@next/swc-darwin-x64": "npm:15.1.3" + "@next/swc-linux-arm64-gnu": "npm:15.1.3" + "@next/swc-linux-arm64-musl": "npm:15.1.3" + "@next/swc-linux-x64-gnu": "npm:15.1.3" + "@next/swc-linux-x64-musl": "npm:15.1.3" + "@next/swc-win32-arm64-msvc": "npm:15.1.3" + "@next/swc-win32-x64-msvc": "npm:15.1.3" + "@swc/counter": "npm:0.1.3" + "@swc/helpers": "npm:0.5.15" busboy: "npm:1.6.0" caniuse-lite: "npm:^1.0.30001579" - graceful-fs: "npm:^4.2.11" postcss: "npm:8.4.31" - styled-jsx: "npm:5.1.1" + sharp: "npm:^0.33.5" + styled-jsx: "npm:5.1.6" peerDependencies: "@opentelemetry/api": ^1.1.0 "@playwright/test": ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 + babel-plugin-react-compiler: "*" + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 dependenciesMeta: "@next/swc-darwin-arm64": @@ -16455,20 +16508,22 @@ __metadata: optional: true "@next/swc-win32-arm64-msvc": optional: true - "@next/swc-win32-ia32-msvc": - optional: true "@next/swc-win32-x64-msvc": optional: true + sharp: + optional: true peerDependenciesMeta: "@opentelemetry/api": optional: true "@playwright/test": optional: true + babel-plugin-react-compiler: + optional: true sass: optional: true bin: next: dist/bin/next - checksum: 10/152928801dc403172e6b4a3d64ae250ad59a4d57fff862d9560687380d4b6ca95a07439da9a9b702bda86ff01093aa04e46a0003d0422295bdbd7d8ce449c4d6 + checksum: 10/d9f63a6f5a92d80aa3b57dda700d655303dc7217c6a2598385b055ffa65c82988f60bce6aabdb9861a01c71437e65551ff2f399a5b5e098f470d04ee516838f6 languageName: node linkType: hard @@ -17699,13 +17754,6 @@ __metadata: languageName: node linkType: hard -"querystring@npm:^0.2.1": - version: 0.2.1 - resolution: "querystring@npm:0.2.1" - checksum: 10/5ae2eeb8c6d70263a3d13ffaf234ce9593ae0e95ad8ea04aa540e14ff66679347420817aeb4fe6fdfa2aaa7fac86e311b6f1d3da2187f433082ad9125c808c14 - languageName: node - linkType: hard - "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -17897,26 +17945,27 @@ __metadata: linkType: hard "react-native-macos@npm:^0.75.13": - version: 0.75.13 - resolution: "react-native-macos@npm:0.75.13" + version: 0.75.16 + resolution: "react-native-macos@npm:0.75.16" dependencies: "@jest/create-cache-key-function": "npm:^29.6.3" - "@react-native-community/cli": "npm:14.0.0" - "@react-native-community/cli-platform-android": "npm:14.0.0" - "@react-native-community/cli-platform-apple": "npm:14.0.0" - "@react-native-community/cli-platform-ios": "npm:14.0.0" + "@react-native-community/cli": "npm:14.1.0" + "@react-native-community/cli-platform-android": "npm:14.1.0" + "@react-native-community/cli-platform-apple": "npm:14.1.0" + "@react-native-community/cli-platform-ios": "npm:14.1.0" "@react-native-mac/virtualized-lists": "npm:0.75.0" - "@react-native/assets-registry": "npm:0.75.2" - "@react-native/codegen": "npm:0.75.2" - "@react-native/community-cli-plugin": "npm:0.75.2" - "@react-native/gradle-plugin": "npm:0.75.2" - "@react-native/js-polyfills": "npm:0.75.2" - "@react-native/normalize-colors": "npm:0.75.2" + "@react-native/assets-registry": "npm:0.75.4" + "@react-native/codegen": "npm:0.75.4" + "@react-native/community-cli-plugin": "npm:0.75.4" + "@react-native/gradle-plugin": "npm:0.75.4" + "@react-native/js-polyfills": "npm:0.75.4" + "@react-native/normalize-colors": "npm:0.75.4" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" base64-js: "npm:^1.5.1" chalk: "npm:^4.0.0" + commander: "npm:^9.4.1" event-target-shim: "npm:^5.0.1" flow-enums-runtime: "npm:^0.0.6" glob: "npm:^7.1.1" @@ -17947,7 +17996,7 @@ __metadata: optional: true bin: react-native: cli.js - checksum: 10/b4ec9dec5faf8c9ac11a5519a544f1376293bfb47c6e6bd67db22553c095b22214054b2fc9b13047fab7841310fc6171de39ba8fd39636fbd220a6f8ab3f21fa + checksum: 10/a13ea5e8319fe16e61a6dd3531c9b388f8563e35a57af42125d2765502d92dece85ee611d0e304072d44b030e52f832d18e0c96419bb67d28d17d1c46b301306 languageName: node linkType: hard @@ -18107,6 +18156,27 @@ __metadata: languageName: node linkType: hard +"react-native-worklets@workspace:packages/react-native-worklets": + version: 0.0.0-use.local + resolution: "react-native-worklets@workspace:packages/react-native-worklets" + dependencies: + "@react-native-community/cli": "npm:15.0.1" + "@react-native/eslint-config": "npm:0.76.5" + "@types/jest": "npm:^29.5.5" + "@types/react": "npm:^18.2.44" + eslint: "npm:^8.57.0" + prettier: "npm:^3.3.3" + react: "npm:18.3.1" + react-native: "npm:0.76.5" + react-native-builder-bob: "npm:0.33.1" + typescript: "npm:~5.3.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + react: "*" + react-native: "*" + languageName: unknown + linkType: soft + "react-native@npm:0.75.4": version: 0.75.4 resolution: "react-native@npm:0.75.4" @@ -18162,18 +18232,18 @@ __metadata: languageName: node linkType: hard -"react-native@npm:0.76.0": - version: 0.76.0 - resolution: "react-native@npm:0.76.0" +"react-native@npm:0.76.5": + version: 0.76.5 + resolution: "react-native@npm:0.76.5" dependencies: "@jest/create-cache-key-function": "npm:^29.6.3" - "@react-native/assets-registry": "npm:0.76.0" - "@react-native/codegen": "npm:0.76.0" - "@react-native/community-cli-plugin": "npm:0.76.0" - "@react-native/gradle-plugin": "npm:0.76.0" - "@react-native/js-polyfills": "npm:0.76.0" - "@react-native/normalize-colors": "npm:0.76.0" - "@react-native/virtualized-lists": "npm:0.76.0" + "@react-native/assets-registry": "npm:0.76.5" + "@react-native/codegen": "npm:0.76.5" + "@react-native/community-cli-plugin": "npm:0.76.5" + "@react-native/gradle-plugin": "npm:0.76.5" + "@react-native/js-polyfills": "npm:0.76.5" + "@react-native/normalize-colors": "npm:0.76.5" + "@react-native/virtualized-lists": "npm:0.76.5" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" @@ -18212,7 +18282,7 @@ __metadata: optional: true bin: react-native: cli.js - checksum: 10/d979319a3cb7a32fca73d9fea48f4893c1321dbc0290177337ecdaba8887176f911ff32fe46a70b1450878ef204889c363041ace05a930bd83ba3778319a1812 + checksum: 10/124e81360348bae8ff7e277e2d963174f015a29ee50a2fd439f4f2d64ab5b88335b6104358ebeb00ca69afeb73df074c52b4f56842528ca0a53ce33d0bba83fa languageName: node linkType: hard @@ -19255,6 +19325,75 @@ __metadata: languageName: node linkType: hard +"sharp@npm:^0.33.5": + version: 0.33.5 + resolution: "sharp@npm:0.33.5" + dependencies: + "@img/sharp-darwin-arm64": "npm:0.33.5" + "@img/sharp-darwin-x64": "npm:0.33.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" + "@img/sharp-libvips-darwin-x64": "npm:1.0.4" + "@img/sharp-libvips-linux-arm": "npm:1.0.5" + "@img/sharp-libvips-linux-arm64": "npm:1.0.4" + "@img/sharp-libvips-linux-s390x": "npm:1.0.4" + "@img/sharp-libvips-linux-x64": "npm:1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" + "@img/sharp-linux-arm": "npm:0.33.5" + "@img/sharp-linux-arm64": "npm:0.33.5" + "@img/sharp-linux-s390x": "npm:0.33.5" + "@img/sharp-linux-x64": "npm:0.33.5" + "@img/sharp-linuxmusl-arm64": "npm:0.33.5" + "@img/sharp-linuxmusl-x64": "npm:0.33.5" + "@img/sharp-wasm32": "npm:0.33.5" + "@img/sharp-win32-ia32": "npm:0.33.5" + "@img/sharp-win32-x64": "npm:0.33.5" + color: "npm:^4.2.3" + detect-libc: "npm:^2.0.3" + semver: "npm:^7.6.3" + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-wasm32": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + checksum: 10/9f153578cb02735359cbcc874f52b56b8074ed997498c35255c7099d4f4f506f6ddf83a437a55242c7ad4f979336660504b6c78e29d6933f4981dedbdae5ce09 + languageName: node + linkType: hard + "shebang-command@npm:^1.2.0": version: 1.2.0 resolution: "shebang-command@npm:1.2.0" @@ -19961,19 +20100,19 @@ __metadata: languageName: node linkType: hard -"styled-jsx@npm:5.1.1": - version: 5.1.1 - resolution: "styled-jsx@npm:5.1.1" +"styled-jsx@npm:5.1.6": + version: 5.1.6 + resolution: "styled-jsx@npm:5.1.6" dependencies: client-only: "npm:0.0.1" peerDependencies: - react: ">= 16.8.0 || 17.x.x || ^18.0.0-0" + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" peerDependenciesMeta: "@babel/core": optional: true babel-plugin-macros: optional: true - checksum: 10/4f6a5d0010770fdeea1183d919d528fd46c484e23c0535ef3e1dd49488116f639c594f3bd4440e3bc8a8686c9f8d53c5761599870ff039ede11a5c3bfe08a4be + checksum: 10/ba01200e8227fe1441a719c2e7da96c8aa7ef61d14211d1500e1abce12efa118479bcb6e7e12beecb9e1db76432caad2f4e01bbc0c9be21c134b088a4ca5ffe0 languageName: node linkType: hard @@ -20487,6 +20626,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.8.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -21191,7 +21337,7 @@ __metadata: prettier: "npm:^3.3.3" react: "npm:18.3.1" react-dom: "npm:18.3.1" - react-native: "npm:0.76.0" + react-native: "npm:0.76.5" react-native-reanimated: "workspace:*" react-native-web: "npm:0.19.11" serve: "npm:^14.2.3"
- An Expo & React Native conference in Europe is back, May 22-24 in - Kraków, Poland! -
+ Have a few minutes and want to shape the future of React Native? +