Compare commits

...
50 Commits
Author SHA1 Message Date
React Native Bot 4968798538 Release 0.75.3
#publish-packages-to-npm&latest
2024-09-11 16:12:13 +00:00
Riccardo Cipolleschi 16575babf8 [LOCAL] Revert commander to 9.4.1 to fix build issues 2024-09-11 12:20:51 +01:00
Riccardo Cipolleschi cf7b9b9486 [LOCAL] remove resolution and add commander as devDependency for the monorepo 2024-09-11 11:54:35 +01:00
Blake Friedman 8734cff95e [LOCAL] Add resolution in HelloWorld package to fix the build in CI 2024-09-11 11:17:53 +01:00
Riccardo Cipolleschi 33d12c1737 [LOCAL] Unify upload artifact action to 4.3.1 2024-09-11 10:47:38 +01:00
Riccardo Cipolleschi 6a08c38263 [LOCAL] Bump CLI to 14.1.0 2024-09-11 10:20:44 +01:00
Riccardo Cipolleschi 8c732ddf1b [RN][CI] Zip slices to preserve symlinks (#46301) 2024-09-11 10:15:58 +01:00
Riccardo Cipolleschi 4fb43c343f [LOCAL][CI] Fetch Github tags in the publish-release job (#46127) 2024-09-11 10:15:39 +01:00
Oskar Kwaśniewski 61fdd51c50 (cherry-pick) fix: Hermes build for visionOS simulator (Release) (#45911) (#46169)
Summary:
Building for the visionOS simulator in the Release scheme requires an x86_64 slice to be included.

![CleanShot 2024-08-06 at 15 18 29@2x](https://github.com/user-attachments/assets/6fd962eb-ab71-4937-affe-964d8fa39f53)

## Changelog:

[IOS] [FIXED] - Include x86_64 slice when building for visionOS simulator

Pull Request resolved: https://github.com/facebook/react-native/pull/45911

Test Plan: CI Green

Reviewed By: GijsWeterings

Differential Revision: D60828872

Pulled By: cipolleschi

fbshipit-source-id: 74444ac0b6661baf427837d242ba0ca295da0d16
2024-09-11 10:15:21 +01:00
Nicola Corti 1067798a7e [0.75] RGNP - Remove unnecessary dependency on gradle-tooling-api-builders - serviceOf failure (#46367) 2024-09-11 10:15:06 +01:00
Blake Friedman 39222b41cb autolinked package scripts use absolute path (#46186)
Summary:
A previous attempt at fixing this issue used a relative path (https://github.com/facebook/react-native/issues/45208), this doesn't work if the user runs bundle install outside of the `ios/`
folder, using the `--project-directory=ios` argument.

## Changelog:
[iOS][Fixed] support bundle install from outside the ios folder using --project-directory

Pull Request resolved: https://github.com/facebook/react-native/pull/46186

Test Plan:
Ran the command in a project with `react-native-firebase/app` using the
`--project-directory`, confirmed that it's fixed when using the absolute
path.

closes: reactwg/react-native-releases#341

Reviewed By: cipolleschi

Differential Revision: D61719821

Pulled By: blakef

fbshipit-source-id: d83429dd29c9e8cc066ab9843ad95fdfc0af8dea
2024-09-11 10:14:24 +01:00
Hampus Sjöberg 2a567cb546 fix: RNGP autolink not properly filter out pure C++ TurboModules (#46381)
Summary:
Hey.

The react-native gradle plugin didn't properly filter out [Pure](https://github.com/react-native-community/cli/pull/2387) C++ TurboModules for autolinking, which caused build failures as a non-existing gradle dependency would be emitted.

This makes Pure C++ TurboModules work again for Android.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[ANDROID][FIXED] Fix autolinking issues for Pure C++ TurboModules

Pull Request resolved: https://github.com/facebook/react-native/pull/46381

Test Plan:
https://github.com/hsjoberg/rn75autolinkregression

Try running this repro project to observe the error:

```
1: Task failed with an exception.
-----------
* Where:
Build file '/Users/coco/Projects/Blixt/rn75autolinkregression/example/android/app/build.gradle' line: 54

* What went wrong:
A problem occurred evaluating project ':app'.
> Project with path ':react-native-cxx-turbomodule' could not be found in project ':app'.
```

Simply add the 1-line code from this PR to make the build succeed.

Cheers.

Reviewed By: cipolleschi

Differential Revision: D62377757

Pulled By: cortinico

fbshipit-source-id: 9e3fa3777b4e6e4d3f2eb0f996ac0ac7676eedbe
2024-09-11 10:13:46 +01:00
Tomasz Żelawski bfb7e16aa3 fix(TypeScript): Allow readonly arrays in transform (#46310)
Summary:
Currently readonly arrays aren't allowed in components' style, but readonly objects are accepted. This becomes evident in such case:

```ts
import { View } from 'react-native';

interface AppProps {
  transform: readonly ({ translateX: number } | { translateY: number })[];
  shadowOffset: Readonly<{ width: number; height: number }>;
}

export default function App({ transform, shadowOffset }: AppProps) {
  return (
    <>
      {/* TypeScript error with transform */}
      <View style={{ transform }} />
      {/* No errors with shadowOffset */}
      <View style={{ shadowOffset }} />
    </>
  );
}
```

## Changelog:

[GENERAL] [FIXED] - Allow readonly array type for transform property

Pull Request resolved: https://github.com/facebook/react-native/pull/46310

Test Plan:
`yarn test-typescript`

I added relevant tests cases.

Reviewed By: robhogan

Differential Revision: D62140462

Pulled By: NickGerleman

fbshipit-source-id: 87374b0901ebc40cab48d442b61fe7a65711bc89
2024-09-11 10:13:35 +01:00
Blake Friedman d4bb5820bd Add missing commander dependency (#46242)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/46242

This is transitively included, but should be explicitly included.

Changelog:
[Internal] commander is a dependency when bundling from Xcode

Reviewed By: cipolleschi

Differential Revision: D61916607

fbshipit-source-id: 1466d38d959970e5bd56576f8a7a22697d2eec4e
2024-09-11 10:13:26 +01:00
Andrew Knapp af5002b2e1 Fix GH-41226 by suppressing path adjustment when not actually drawing a border (#46239)
Summary:
When not drawing a border, the mGapBetweenPaths adjustment can create noticable pixelation when drawing curves through a low number of pixels.  This is noticable mostly on buttons and such on low-dpi devices.  This fix only applies the fix if clipping for the border radius is done.

When drawing small radius rounded backgrounds (e.g. to draw a circle or button) we see visible pixelation (see [GH-41226](https://github.com/facebook/react-native/issues/41226)) This is particularly noticable on low DPI devices.

## Changelog:

[ANDROID] [FIXED] - Don't use mGapBetweenPaths if not drawing a border

Pull Request resolved: https://github.com/facebook/react-native/pull/46239

Test Plan:
Built an android app that directly uses CSSBackgroundDrawable to draw a background and verified repro of this issue.
![pre-fix](https://github.com/user-attachments/assets/e56a41b1-60f6-4953-9e91-b95a3380f2d7)
Then modified the code according to this PR and verified that anti-aliasing is appropriately applied
![fix](https://github.com/user-attachments/assets/b6b1aecf-a713-4e0a-9759-82c2dd862991)

Reviewed By: NickGerleman

Differential Revision: D61925281

Pulled By: jorge-cab

fbshipit-source-id: 93014629d031bd0d716cd3bb11e2c294dedad639
2024-09-11 10:13:16 +01:00
Blake Friedman 6eb2836f61 rebuild autolinking cache if empty or invalid (#46241)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/46241

Our test for rebuilding the `autolinking.json` file currently rebuilds everytime if the cached json file ISN'T empty.  This means users who have an empty entry get stuck there.

I've also added more validation that the contents of the cached config have at a minimum the `.project.android.packageName` entry in it, otherwise it rebuilds.

Changelog: [Internal]

Closes 46134

Reviewed By: cortinico

Differential Revision: D61911114

fbshipit-source-id: 188c7f975ce05802c8ea06eaa48345c2bc96f2b2
2024-09-11 10:13:00 +01:00
Dmitry Rykun 38d7549788 Start looking for codegen-enabled dependencies from the project root (#46229)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/46229

When running codegen from `pod install`, something affects `require.resolve`, and it starts looking for codegen-enabled dependencies from the workspace root, not the current RN project root.
This is bad if we have different versions of same dependency across multiple workspaces. One of them will be hoisted to the workspace root, and will be used for all the workspaces.

This issue is described in details here https://github.com/facebook/react-native/issues/46196

This diff is supposed to fix this by adding the project root path to the `require.resolve` call.

Changelog: [iOS][Fixed] - Codegen will start looking for codegen-enabled dependencies from the project root.

Reviewed By: cipolleschi

Differential Revision: D61850219

fbshipit-source-id: d60a0e72e9c60e862c0d64e227ea3652d1be5a90
2024-09-11 10:10:57 +01:00
shubhamguptadream11 3c811d8465 fix(android): make getUri and isResource available for override (#46152)
Summary:
Fixes following issues:
- https://github.com/facebook/react-native/issues/46150
- https://github.com/facebook/react-native/issues/46155

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[ANDROID] [FIXED] - Make getUri and isResource open

Pull Request resolved: https://github.com/facebook/react-native/pull/46152

Reviewed By: NickGerleman, rshest, blakef

Differential Revision: D61845164

Pulled By: cortinico

fbshipit-source-id: 88ccdad92423b5add9b2fad4c98f296b6cbfb27d
2024-09-11 10:10:46 +01:00
Alex Hunt 58008464c1 Replace usage of Java OptionalInt (#45862)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45862

Fixes compatibility with Android API < 24, and removes our `JOptionalInt` wrapper implementation for now.

Changelog: [Internal]

Reviewed By: robhogan, motiz88

Differential Revision: D60581676

fbshipit-source-id: 7e79fc59a4199a967e62ac3aeafc5d5681c60077
2024-09-11 10:10:37 +01:00
szymonrybczak 31a99388de fix(cli): replace querystring with URLSearchParam (#45125)
Summary:
[`querystring`](https://www.npmjs.com/package/querystring) package is deprecated. In this Pull Request I've replaced usage of `querystring` with `URLSearchParam` what is recommended by Node.js.

It's also causing a warning when installing dependencies inside a React Native app:
```
warning react-native > react-native/community-cli-plugin > querystring@0.2.1: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
```

## Changelog:

[INTERNAL] [FIXED] - Replace `querystring` package with `URLSearchParam`

Pull Request resolved: https://github.com/facebook/react-native/pull/45125

Test Plan:
Params should be parsed in the same way and warning shouldn't be presented.

js1 jest xplat/js/tools/metro/packages/metro/src/cli/__tests__/parseKeyValueParamArray-test.js

Reviewed By: cipolleschi

Differential Revision: D58948498

Pulled By: GijsWeterings

fbshipit-source-id: 79b1f7b3feae230d2d3641205c513b98b3fda511
2024-09-11 10:10:25 +01:00
Riccardo Cipolleschi 44158de822 Revert "[RN][CI] Zip slices folders to preserve symlinks"
This reverts commit aa7296c008.
2024-09-02 14:55:12 +01:00
Riccardo Cipolleschi aa7296c008 [RN][CI] Zip slices folders to preserve symlinks 2024-09-02 14:54:15 +01:00
Blake Friedman a276df4d2a Update Podfile.lock
Changelog: [Internal]
2024-08-20 14:51:43 +01:00
React Native Bot 2e994fdddb Release 0.75.2
#publish-packages-to-npm&latest
2024-08-20 09:25:17 +00:00
shubhamguptadream11 1cea8e8027 feat(android): height issue fixed with keyboard avoiding component in new architecture (#45928)
Summary:
Fixes this issue: https://github.com/facebook/react-native/issues/45880

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID] [CHANGED] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[ANDROID] [CHANGED] - Replaced `mLastHeight` with `mVisibleViewArea.height()` since mLastHeight value is not getting updated. For `width` we are already using `mVisibleViewArea.width()`

Pull Request resolved: https://github.com/facebook/react-native/pull/45928

Test Plan: - Tested the fix in new and old architecture both

Reviewed By: christophpurrer

Differential Revision: D61023998

Pulled By: cortinico

fbshipit-source-id: df67616330effb7b9e6724d94b3be92c0dbd6190
2024-08-19 17:51:23 +01:00
Elene Botchoradze 196399bb93 fix(ios): removed default value (#46020)
Summary:
Removed UIReturnKeyDefault as it caused bug when there wasn't any type.

## Changelog:

[IOS] [REMOVED]: UIReturnKeyDefault

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests

Pull Request resolved: https://github.com/facebook/react-native/pull/46020

Reviewed By: christophpurrer

Differential Revision: D61277058

Pulled By: cipolleschi

fbshipit-source-id: 18349c49b05d492a2c2ed5713af3ceb6d3728e70
2024-08-19 14:22:29 +01:00
Riccardo Cipolleschi 35daa07c39 Make sure we can create a .xcode.env.local (#46060)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/46060

Closures in ruby don't need the `return` statement. They exit from the calling function!

## Changelog
[Internal] - fix .xcode.env.local.generation

Reviewed By: cortinico

Differential Revision: D61343918

fbshipit-source-id: 39073ead7ad596f48403a5c2d4c066d410355698
2024-08-19 14:21:52 +01:00
Blake Friedman c22803ac5f Fix publish template url for GHA action (#46040)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/46040

The URL to dispatch the workflow was not correct, see [0].

## Changelog: [Internal]

[0] https://docs.github.com/en/rest/actions/workflows?apiVersion=2022-11-28#create-a-workflow-dispatch-event

## Internal:

For S441191, see the job launched:
- https://github.com/react-native-community/template/actions/runs/10404141179/job/28811993693

 {F1806960111}

Reviewed By: cipolleschi

Differential Revision: D61333084

fbshipit-source-id: 62b20d792b9c667b3ee80d6d446423a6d24a67c2
2024-08-19 14:21:29 +01:00
Tommy Nguyen 0979921850 fix(react-native-codegen): scripts require yargs (#45995) 2024-08-19 14:21:18 +01:00
Nicola Corti 02d9979c32 [0.75] Make Imagesource open for inheritance (#46093)
Fixes https://github.com/facebook/react-native/issues/46077
2024-08-19 14:19:49 +01:00
Nicola Corti 45cd81706d [0.75] Add support for handling com.facebook.react.bridge.Dynamic as parameter for TurboModules (#46066) 2024-08-19 14:18:40 +01:00
React Native Bot b5b57731d3 Release 0.75.1
#publish-packages-to-npm&latest
2024-08-15 10:54:32 +00:00
Riccardo Cipolleschi c1cee11932 [LOCAL] Use fetch-depth to 0 to create a release 2024-08-15 11:52:12 +01:00
Riccardo Cipolleschi 077815358d [LOCAL][RN][CI] Make sure to fetch all tags 2024-08-15 11:47:48 +01:00
Riccardo Cipolleschi 8ab64afd3a [LOCAL][RN][CI] Use the right param to set the 'latest' tag (#46033) 2024-08-15 11:37:41 +01:00
Nicola Corti d94d447777 [LOCAL] Manual cherry-pick of 28597168aa 2024-08-15 10:31:39 +01:00
Nicola Corti 41b188b7e6 [LOCAL] Fix further compilation error introduced by cherry-pick conflicts 2024-08-15 10:29:13 +01:00
Nicola Corti a3187bb5d9 [LOCAL] Fix compilation error introduced by cherry-pick conflicts 2024-08-15 08:53:45 +01:00
Nicola Corti f202e80177 [LOCAL] Bump Hermes version 2024-08-15 08:20:44 +01:00
Nick Gerleman 8c4f240c9b Gate off % border radii on Android Paper (#45945)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45945

This code is forked on iOS, where we have been, as a policy, avoiding Paper-specific changes. This code is shared between renderers on Android, but it is confusing developer experience to have it work on Android Paper, to then fail on iOS unless it is on new arch.

This change disables support on Android Paper for consistency.

Changelog:
[Android][Removed] - Gate off % border radii on Android Paper

Reviewed By: cortinico

Differential Revision: D60967347

fbshipit-source-id: 1d26bc71aee677aa9a0dc9bb38f781a99c7762a8
2024-08-15 08:16:04 +01:00
Nick Gerleman b64f5498f6 Gate off % translate on Android Paper (#45946)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45946

This code is forked on iOS, where we have been, as a policy, avoiding Paper-specific changes. This code is shared between renderers on Android, but it is confusing developer experience to have it work on Android Paper, to then fail on iOS unless it is on new arch.

This change disables support on Android Paper for consistency.

Changelog:
[Android][Removed] - Gate off % translate on Android Paper

Reviewed By: joevilches

Differential Revision: D60970266

fbshipit-source-id: 5df73b948464f5093941528b0af2e694827a9460
2024-08-15 08:11:45 +01:00
Nicola Corti efe8a5e85a [LOCAL] Update Podfile.lock
Changelog: [Internal]
2024-08-15 08:09:22 +01:00
React Native Bot 89cdc14c8b Release 0.75.0
#publish-packages-to-npm&latest
2024-08-14 14:54:23 +00:00
Blake Friedman 9120cd30f2 Move init deprecation notice 30 Sept → 31 Dec (#45590)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45590

This gives us more wiggle room with the release of 0.76.

Changelog: [General][Changed] Move init deprecation notice 30 Sept → 31 Dec

Reviewed By: cortinico

Differential Revision: D60105868

fbshipit-source-id: d03fcf5d4a97db9b21792eff6f993e2671b276ef
2024-08-14 14:30:23 +01:00
Gabriel Donadel 34c91036e1 Add shared-testutil folder to NPM files to be published (#45936)
Summary:
React-native 0.75 RC7 gradle sync is currently broken due to the fact that the `shared-testutil` folder is missing from the `react-native/gradle-plugin` npm package

## Changelog:

[INTERNAL] [ADDED] - Add shared-testutil folder to NPM files to be published

Pull Request resolved: https://github.com/facebook/react-native/pull/45936

Test Plan: N/A

Reviewed By: cipolleschi

Differential Revision: D60969631

Pulled By: cortinico

fbshipit-source-id: 850edfe0cf6b0e8174a1df9ea962d207d2ce0112
2024-08-14 14:29:29 +01:00
Nicola Corti 82ddf5d532 [LOCAL] Bump Node on CircleCI to 18.18 to fix red signal (#45894) 2024-08-07 14:16:38 +01:00
React Native Bot 7244893b12 Release 0.75.0-rc.7
#publish-packages-to-npm&next
2024-08-06 11:16:54 +00:00
Nicola Corti b0662b3c33 [LOCAL] All librrc_textinput.so to NdkConfiguratorUtils.configureNewArchPackagingOptions 2024-08-06 11:44:06 +01:00
Riccardo Cipolleschi 6250409a62 [LOCAL] Bump Podfile.lock 2024-08-06 10:18:46 +01:00
szymonrybczak b62bfcd561 feat: update CLI to 14.0.0 (#45540)
Summary:
Update to stable version of `react-native-community/cli`.

[GENERAL] [CHANGED] - Upgrade `react-native-community/cli` to `13.6.9`

Pull Request resolved: https://github.com/facebook/react-native/pull/45540

Test Plan: n/a

Reviewed By: blakef

Differential Revision: D59960021

Pulled By: cortinico

fbshipit-source-id: 9d470699cdd2d20e08e844c92c7982056aec082c
2024-08-05 13:25:56 +01:00
86 changed files with 4761 additions and 4237 deletions
+1 -1
View File
@@ -61,7 +61,7 @@ references:
dependency_versions:
xcode_version: &xcode_version "15.2"
nodelts_image: &nodelts_image "cimg/node:20.2.0"
nodeprevlts_image: &nodeprevlts_image "cimg/node:18.12.1"
nodeprevlts_image: &nodeprevlts_image "cimg/node:18.18.2"
nodelts_browser_image: &nodelts_browser_image "cimg/node:20.2.0-browsers"
# -------------------------
+1 -1
View File
@@ -32,7 +32,7 @@ runs:
GIT_PAGER=cat git show HEAD
- name: Update "latest" tag if needed
shell: bash
if: ${{ inputs.tag == 'latest' }}
if: ${{ inputs.is_latest_on_npm == 'true' }}
run: |
git tag -d "latest"
git push origin :latest
@@ -86,7 +86,7 @@ runs:
echo ${{ steps.hermes-version.outputs.version }}
- name: Upload Hermes artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v4.3.1
with:
name: hermes-workspace
path: |
+2 -2
View File
@@ -134,7 +134,7 @@ runs:
XCRESULT_PATH=$(find . -name '*.xcresult')
tar -zcvf xcresults.tar.gz $XCRESULT_PATH
- name: Upload artifact
uses: actions/upload-artifact@v2.2.4
uses: actions/upload-artifact@v4.3.1
if: ${{ inputs.run-unit-tests == true }}
with:
name: xcresults
@@ -146,7 +146,7 @@ runs:
platform: ios
- name: Store test results
if: ${{ inputs.run-unit-tests == true }}
uses: actions/upload-artifact@v2.2.4
uses: actions/upload-artifact@v4.3.1
with:
name: test-results
path: ./reports/junit
+2
View File
@@ -25,6 +25,8 @@ jobs:
uses: actions/checkout@v4.1.1
with:
token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }}
fetch-tags: 'true'
fetch-depth: 0
- name: Check if on stable branch
id: check_stable_branch
run: |
+30 -15
View File
@@ -109,7 +109,7 @@ jobs:
uses: actions/cache/restore@v4.0.0
with:
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
key: v5-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
- name: Build the Hermes ${{ matrix.slice }} frameworks
run: |
cd ./packages/react-native/sdks/hermes || exit 1
@@ -163,17 +163,21 @@ jobs:
echo "Please try again"
exit 1
fi
- name: Compress slices to preserve Symlinks
run: |
cd ./packages/react-native/sdks/hermes
tar -czv -f build_${{ matrix.slice }}_${{ matrix.flavor }}.tar.gz build_${{ matrix.slice }}_${{ matrix.flavor }}
- name: Upload Artifact for Slice (${{ matrix.slice }}, ${{ matrix.flavor }}}
uses: actions/upload-artifact@v4.3.1
with:
name: slice-${{ matrix.slice }}-${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}.tar.gz
- name: Save slice cache
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode.
uses: actions/cache/save@v4.0.0
with:
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
key: v5-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
build_hermes_macos:
runs-on: macos-13
@@ -198,7 +202,7 @@ jobs:
- name: Restore Cached Artifacts
uses: actions/cache/restore@v4.0.0
with:
key: v2-hermes-osx-bin-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
key: v3-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
path: |
/tmp/hermes/osx-bin/${{ matrix.flavor }}
/tmp/hermes/dSYM/${{ matrix.flavor }}
@@ -227,38 +231,49 @@ jobs:
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_macosx_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-macosx-${{ matrix.flavor }}
- name: Slice cache iphoneos
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_iphoneos_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-iphoneos-${{ matrix.flavor }}
- name: Slice cache iphonesimulator
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_iphonesimulator_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-iphonesimulator-${{ matrix.flavor }}
- name: Slice cache catalyst
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_catalyst_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-catalyst-${{ matrix.flavor }}
- name: Slice cache xros
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_xros_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-xros-${{ matrix.flavor }}
- name: Slice cache xrsimulator
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_xrsimulator_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-xrsimulator-${{ matrix.flavor }}
- name: Unzip slices
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
run: |
cd ./packages/react-native/sdks/hermes
ls -l .
tar -xzv -f build_catalyst_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_iphoneos_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_iphonesimulator_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_macosx_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_xros_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_xrsimulator_${{ matrix.flavor }}.tar.gz
- name: Move back build folders
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
run: |
@@ -358,7 +373,7 @@ jobs:
uses: actions/cache/save@v4.0.0
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode.
with:
key: v2-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
key: v3-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
path: |
/tmp/hermes/osx-bin/${{ matrix.flavor }}
/tmp/hermes/dSYM/${{ matrix.flavor }}
@@ -403,7 +418,7 @@ jobs:
cp /tmp/hermes/build/bin/hermesc /tmp/hermes/linux64-bin/.
fi
- name: Upload linux artifacts
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: hermes-linux-bin
path: /tmp/hermes/linux64-bin
@@ -491,7 +506,7 @@ jobs:
Write-Host "Skipping; Clean c:\tmp\hermes\win64-bin to rebuild."
}
- name: Upload windows artifacts
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: hermes-win64-bin
path: D:\tmp\hermes\win64-bin\
@@ -527,7 +542,7 @@ jobs:
shell: bash
- name: Upload test results
if: ${{ always() }}
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: build-android-results
compression-level: 1
@@ -537,7 +552,7 @@ jobs:
packages/react-native/ReactAndroid/build/reports
- name: Upload RNTester APK
if: ${{ always() }}
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: rntester-apk
path: packages/rn-tester/android/app/build/outputs/apk/
+38 -18
View File
@@ -106,7 +106,7 @@ jobs:
uses: actions/cache/restore@v4.0.0
with:
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
key: v5-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
- name: Build the Hermes ${{ matrix.slice }} frameworks
run: |
cd ./packages/react-native/sdks/hermes || exit 1
@@ -160,17 +160,21 @@ jobs:
echo "Please try again"
exit 1
fi
- name: Compress slices to preserve Symlinks
run: |
cd ./packages/react-native/sdks/hermes
tar -czv -f build_${{ matrix.slice }}_${{ matrix.flavor }}.tar.gz build_${{ matrix.slice }}_${{ matrix.flavor }}
- name: Upload Artifact for Slice (${{ matrix.slice }}, ${{ matrix.flavor }}}
uses: actions/upload-artifact@v4.3.1
with:
name: slice-${{ matrix.slice }}-${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}.tar.gz
- name: Save slice cache
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode.
uses: actions/cache/save@v4.0.0
with:
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
key: v5-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
build_hermes_macos:
runs-on: macos-13
@@ -195,7 +199,7 @@ jobs:
- name: Restore Cached Artifacts
uses: actions/cache/restore@v4.0.0
with:
key: v2-hermes-osx-bin-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
key: v3-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
path: |
/tmp/hermes/osx-bin/${{ matrix.flavor }}
/tmp/hermes/dSYM/${{ matrix.flavor }}
@@ -224,38 +228,49 @@ jobs:
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_macosx_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-macosx-${{ matrix.flavor }}
- name: Slice cache iphoneos
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_iphoneos_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-iphoneos-${{ matrix.flavor }}
- name: Slice cache iphonesimulator
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_iphonesimulator_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-iphonesimulator-${{ matrix.flavor }}
- name: Slice cache catalyst
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_catalyst_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-catalyst-${{ matrix.flavor }}
- name: Slice cache xros
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_xros_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-xros-${{ matrix.flavor }}
- name: Slice cache xrsimulator
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_xrsimulator_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-xrsimulator-${{ matrix.flavor }}
- name: Unzip slices
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
run: |
cd ./packages/react-native/sdks/hermes
ls -l .
tar -xzv -f build_catalyst_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_iphoneos_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_iphonesimulator_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_macosx_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_xros_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_xrsimulator_${{ matrix.flavor }}.tar.gz
- name: Move back build folders
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
run: |
@@ -355,7 +370,7 @@ jobs:
uses: actions/cache/save@v4.0.0
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode.
with:
key: v2-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
key: v3-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
path: |
/tmp/hermes/osx-bin/${{ matrix.flavor }}
/tmp/hermes/dSYM/${{ matrix.flavor }}
@@ -400,7 +415,7 @@ jobs:
cp /tmp/hermes/build/bin/hermesc /tmp/hermes/linux64-bin/.
fi
- name: Upload linux artifacts
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: hermes-linux-bin
path: /tmp/hermes/linux64-bin
@@ -488,7 +503,7 @@ jobs:
Write-Host "Skipping; Clean c:\tmp\hermes\win64-bin to rebuild."
}
- name: Upload windows artifacts
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: hermes-win64-bin
path: D:\tmp\hermes\win64-bin\
@@ -526,7 +541,7 @@ jobs:
shell: bash
- name: Upload test results
if: ${{ always() }}
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: build-android-results
compression-level: 1
@@ -536,7 +551,7 @@ jobs:
packages/react-native/ReactAndroid/build/reports
- name: Upload RNTester APK
if: ${{ always() }}
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: rntester-apk
path: packages/rn-tester/android/app/build/outputs/apk/
@@ -566,6 +581,9 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4.1.1
with:
fetch-depth: 0
fetch-tags: true
- name: Create /tmp/hermes/osx-bin directory
run: mkdir -p /tmp/hermes/osx-bin
- name: Download osx-bin release artifacts
@@ -696,6 +714,7 @@ jobs:
path: build
- name: Publish @react-native-community/template
if: needs.set_release_type.outputs.RELEASE_TYPE == 'release'
shell: bash
id: publish-to-npm
run: |
COMMIT_MSG=$(git log -n1 --pretty=%B);
@@ -706,16 +725,17 @@ jobs:
IS_LATEST=false
fi
# Go from v0.75.0-rc.4 -> 0.75-stable, which is the template's branching scheme
VERSION=$(grep -oE '\d+\.\d+' <<< "${{ github.ref_name }}" | { read version; echo "$version-stable" })
VERSION=$(grep -oE '\d+\.\d+' <<< "${{ github.ref_name }}" | { read version; echo "$version-stable"; })
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
curl -L -X POST https://api.github.com/repos/react-native-community/template/release.yaml/dispatches \
curl -L https://api.github.com/repos/react-native-community/template/actions/workflows/release.yaml/dispatches
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: Bearer $REACT_NATIVE_BOT_GITHUB_TOKEN" \
-d "{\"ref\":\"$VERSION\",\"inputs\":{\"version\":\"${{ github.ref_name }}\",\"is_latest_on_npm\":\"$IS_LATEST\"}}\n"
-d "{\"ref\":\"$VERSION\",\"inputs\":{\"version\":\"${{ github.ref_name }}\",\"is_latest_on_npm\":\"$IS_LATEST\"}}"
- name: Wait for template to be published
if: needs.set_release_type.outputs.RELEASE_TYPE == 'release'
timeout-minutes: 3
shell: bash
env:
VERSION: ${{ steps.publish-to-npm.outputs.VERSION }}
TAG: ${{ steps.publish-to-npm.outputs.TAG }}
+31 -15
View File
@@ -117,7 +117,7 @@ jobs:
uses: actions/cache/restore@v4.0.0
with:
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
key: v5-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
- name: Build the Hermes ${{ matrix.slice }} frameworks
run: |
cd ./packages/react-native/sdks/hermes || exit 1
@@ -171,17 +171,21 @@ jobs:
echo "Please try again"
exit 1
fi
- name: Compress slices to preserve Symlinks
run: |
cd ./packages/react-native/sdks/hermes
tar -czv -f build_${{ matrix.slice }}_${{ matrix.flavor }}.tar.gz build_${{ matrix.slice }}_${{ matrix.flavor }}
- name: Upload Artifact for Slice (${{ matrix.slice }}, ${{ matrix.flavor }}}
uses: actions/upload-artifact@v4.3.1
with:
name: slice-${{ matrix.slice }}-${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}.tar.gz
- name: Save slice cache
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode.
uses: actions/cache/save@v4.0.0
with:
path: ./packages/react-native/sdks/hermes/build_${{ matrix.slice }}_${{ matrix.flavor }}
key: v4-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
key: v5-hermes-apple-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ matrix.slice }}-${{ matrix.flavor }}
build_hermes_macos:
runs-on: macos-13
@@ -206,7 +210,7 @@ jobs:
- name: Restore Cached Artifacts
uses: actions/cache/restore@v4.0.0
with:
key: v3-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
key: v4-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
path: |
/tmp/hermes/osx-bin/${{ matrix.flavor }}
/tmp/hermes/dSYM/${{ matrix.flavor }}
@@ -235,38 +239,50 @@ jobs:
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_macosx_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-macosx-${{ matrix.flavor }}
- name: Slice cache iphoneos
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_iphoneos_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-iphoneos-${{ matrix.flavor }}
- name: Slice cache iphonesimulator
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_iphonesimulator_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-iphonesimulator-${{ matrix.flavor }}
- name: Slice cache catalyst
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_catalyst_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-catalyst-${{ matrix.flavor }}
- name: Slice cache xros
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_xros_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-xros-${{ matrix.flavor }}
- name: Slice cache xrsimulator
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
uses: actions/download-artifact@v4.1.3
with:
path: ./packages/react-native/sdks/hermes/build_xrsimulator_${{ matrix.flavor }}
path: ./packages/react-native/sdks/hermes/
name: slice-xrsimulator-${{ matrix.flavor }}
- name: Unzip slices
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
run: |
cd ./packages/react-native/sdks/hermes
ls -l .
tar -xzv -f build_catalyst_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_iphoneos_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_iphonesimulator_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_macosx_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_xros_${{ matrix.flavor }}.tar.gz
tar -xzv -f build_xrsimulator_${{ matrix.flavor }}.tar.gz
- name: Move back build folders
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
run: |
@@ -366,7 +382,7 @@ jobs:
uses: actions/cache/save@v4.0.0
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode.
with:
key: v3-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
key: v4-hermes-artifacts-${{ matrix.flavor }}-${{ needs.prepare_hermes_workspace.outputs.hermes-version }}-${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
path: |
/tmp/hermes/osx-bin/${{ matrix.flavor }}
/tmp/hermes/dSYM/${{ matrix.flavor }}
@@ -476,7 +492,7 @@ jobs:
cp /tmp/hermes/build/bin/hermesc /tmp/hermes/linux64-bin/.
fi
- name: Upload linux artifacts
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: hermes-linux-bin
path: /tmp/hermes/linux64-bin
@@ -564,7 +580,7 @@ jobs:
Write-Host "Skipping; Clean c:\tmp\hermes\win64-bin to rebuild."
}
- name: Upload windows artifacts
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: hermes-win64-bin
path: D:\tmp\hermes\win64-bin\
@@ -600,7 +616,7 @@ jobs:
shell: bash
- name: Upload test results
if: ${{ always() }}
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: build-android-results
compression-level: 1
@@ -610,7 +626,7 @@ jobs:
packages/react-native/ReactAndroid/build/reports
- name: Upload RNTester APK
if: ${{ always() }}
uses: actions/upload-artifact@v4.3.0
uses: actions/upload-artifact@v4.3.1
with:
name: rntester-apk
path: packages/rn-tester/android/app/build/outputs/apk/
+3 -2
View File
@@ -48,8 +48,8 @@
"@definitelytyped/dtslint": "^0.0.127",
"@jest/create-cache-key-function": "^29.6.3",
"@pkgjs/parseargs": "^0.11.0",
"@react-native/metro-babel-transformer": "0.75.0-rc.6",
"@react-native/metro-config": "0.75.0-rc.6",
"@react-native/metro-babel-transformer": "0.75.3",
"@react-native/metro-config": "0.75.3",
"@tsconfig/node18": "1.0.1",
"@types/react": "^18.2.6",
"@typescript-eslint/parser": "^7.1.1",
@@ -60,6 +60,7 @@
"babel-preset-fbjs": "^3.4.0",
"chalk": "^4.0.0",
"clang-format": "^1.8.0",
"commander": "^9.4.1",
"connect": "^3.6.5",
"eslint": "^8.57.0",
"eslint-config-prettier": "^8.5.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/assets-registry",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Asset support code for React Native.",
"license": "MIT",
"repository": {
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/babel-plugin-codegen",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Babel plugin to generate native module and view manager code for React Native.",
"license": "MIT",
"repository": {
@@ -25,7 +25,7 @@
"index.js"
],
"dependencies": {
"@react-native/codegen": "0.75.0-rc.6"
"@react-native/codegen": "0.75.3"
},
"devDependencies": {
"@babel/core": "^7.20.0"
+5 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/community-cli-plugin",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Core CLI commands for React Native",
"keywords": [
"react-native",
@@ -22,17 +22,16 @@
"dist"
],
"dependencies": {
"@react-native-community/cli-server-api": "14.0.0-alpha.11",
"@react-native-community/cli-tools": "14.0.0-alpha.11",
"@react-native/dev-middleware": "0.75.0-rc.6",
"@react-native/metro-babel-transformer": "0.75.0-rc.6",
"@react-native-community/cli-server-api": "14.1.0",
"@react-native-community/cli-tools": "14.1.0",
"@react-native/dev-middleware": "0.75.3",
"@react-native/metro-babel-transformer": "0.75.3",
"chalk": "^4.0.0",
"execa": "^5.1.1",
"metro": "^0.80.3",
"metro-config": "^0.80.3",
"metro-core": "^0.80.3",
"node-fetch": "^2.2.0",
"querystring": "^0.2.1",
"readline": "^1.3.0"
},
"devDependencies": {
@@ -9,8 +9,6 @@
* @oncall react_native
*/
import querystring from 'querystring';
export default function parseKeyValueParamArray(
keyValueArray: $ReadOnlyArray<string>,
): Record<string, string> {
@@ -23,8 +21,11 @@ export default function parseKeyValueParamArray(
if (item.indexOf('&') !== -1) {
throw new Error('Parameter cannot include "&" but found: ' + item);
}
Object.assign(result, querystring.parse(item));
const params = new URLSearchParams(item);
params.forEach((value, key) => {
// $FlowExpectedError[prop-missing]
result[key] = value;
});
}
return result;
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/core-cli-utils",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "React Native CLI library for Frameworks to build on",
"license": "MIT",
"main": "./src/index.flow.js",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/debugger-frontend",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Debugger frontend for React Native based on Chrome DevTools",
"keywords": [
"react-native",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/dev-middleware",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Dev server middleware for React Native",
"keywords": [
"react-native",
@@ -23,7 +23,7 @@
],
"dependencies": {
"@isaacs/ttlcache": "^1.4.1",
"@react-native/debugger-frontend": "0.75.0-rc.6",
"@react-native/debugger-frontend": "0.75.3",
"chrome-launcher": "^0.15.2",
"chromium-edge-launcher": "^0.2.0",
"connect": "^3.6.5",
@@ -1,6 +1,6 @@
{
"name": "@react-native/eslint-config",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "ESLint config for React Native",
"license": "MIT",
"repository": {
@@ -22,7 +22,7 @@
"dependencies": {
"@babel/core": "^7.20.0",
"@babel/eslint-parser": "^7.20.0",
"@react-native/eslint-plugin": "0.75.0-rc.6",
"@react-native/eslint-plugin": "0.75.3",
"@typescript-eslint/eslint-plugin": "^7.1.1",
"@typescript-eslint/parser": "^7.1.1",
"eslint-config-prettier": "^8.5.0",
@@ -1,6 +1,6 @@
{
"name": "@react-native/eslint-plugin",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "ESLint rules for @react-native/eslint-config",
"license": "MIT",
"repository": {
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/eslint-plugin-specs",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "ESLint rules to validate NativeModule and Component Specs",
"license": "MIT",
"repository": {
@@ -31,7 +31,7 @@
"@babel/eslint-parser": "^7.20.0",
"@babel/plugin-transform-flow-strip-types": "^7.20.0",
"@babel/preset-flow": "^7.20.0",
"@react-native/codegen": "0.75.0-rc.6",
"@react-native/codegen": "0.75.3",
"make-dir": "^2.1.0",
"pirates": "^4.0.1",
"source-map-support": "0.5.0"
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "helloworld",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"private": true,
"scripts": {
"bootstrap": "node ./cli.js bootstrap",
@@ -13,19 +13,19 @@
},
"dependencies": {
"react": "18.3.1",
"react-native": "0.75.0-rc.6"
"react-native": "0.75.3"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/preset-env": "^7.20.0",
"@babel/runtime": "^7.20.0",
"@react-native/babel-preset": "0.75.0-rc.6",
"@react-native/core-cli-utils": "0.75.0-rc.6",
"@react-native/eslint-config": "0.75.0-rc.6",
"@react-native/metro-config": "0.75.0-rc.6",
"@react-native/babel-preset": "0.75.3",
"@react-native/core-cli-utils": "0.75.3",
"@react-native/eslint-config": "0.75.3",
"@react-native/metro-config": "0.75.3",
"babel-jest": "^29.6.3",
"chalk": "^4.1.2",
"commander": "^12.0.0",
"commander": "^9.4.1",
"eslint": "^8.19.0",
"jest": "^29.6.3",
"listr2": "^8.2.1",
@@ -1,6 +1,6 @@
{
"name": "@react-native/hermes-inspector-msggen",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"private": true,
"description": "Hermes Inspector Message Generator for React Native",
"license": "MIT",
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/metro-config",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Metro configuration for React Native.",
"license": "MIT",
"repository": {
@@ -26,8 +26,8 @@
"dist"
],
"dependencies": {
"@react-native/js-polyfills": "0.75.0-rc.6",
"@react-native/metro-babel-transformer": "0.75.0-rc.6",
"@react-native/js-polyfills": "0.75.3",
"@react-native/metro-babel-transformer": "0.75.3",
"metro-config": "^0.80.3",
"metro-runtime": "^0.80.3"
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/normalize-colors",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Color normalization for React Native.",
"license": "MIT",
"repository": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/js-polyfills",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Polyfills for React Native.",
"license": "MIT",
"repository": {
@@ -1,6 +1,6 @@
{
"name": "@react-native/babel-preset",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Babel preset for React Native applications",
"main": "src/index.js",
"repository": {
@@ -56,7 +56,7 @@
"@babel/plugin-transform-typescript": "^7.5.0",
"@babel/plugin-transform-unicode-regex": "^7.0.0",
"@babel/template": "^7.0.0",
"@react-native/babel-plugin-codegen": "0.75.0-rc.6",
"@react-native/babel-plugin-codegen": "0.75.3",
"babel-plugin-transform-flow-enums": "^0.0.2",
"react-refresh": "^0.14.0"
},
@@ -1,6 +1,6 @@
{
"name": "@react-native/metro-babel-transformer",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Babel transformer for React Native applications.",
"main": "src/index.js",
"repository": {
@@ -16,7 +16,7 @@
"license": "MIT",
"dependencies": {
"@babel/core": "^7.20.0",
"@react-native/babel-preset": "0.75.0-rc.6",
"@react-native/babel-preset": "0.75.3",
"hermes-parser": "0.22.0",
"nullthrows": "^1.1.1"
},
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@react-native/bots",
"description": "React Native Bots",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"private": true,
"license": "MIT",
"repository": {
@@ -1,6 +1,6 @@
{
"name": "@react-native/codegen-typescript-test",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"private": true,
"description": "TypeScript related unit test for @react-native/codegen",
"license": "MIT",
@@ -19,7 +19,7 @@
"prepare": "yarn run build"
},
"dependencies": {
"@react-native/codegen": "0.75.0-rc.6"
"@react-native/codegen": "0.75.3"
},
"devDependencies": {
"@babel/core": "^7.20.0",
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/codegen",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Code generation tools for React Native",
"license": "MIT",
"repository": {
@@ -35,7 +35,8 @@
"invariant": "^2.2.4",
"jscodeshift": "^0.14.0",
"mkdirp": "^0.5.1",
"nullthrows": "^1.1.1"
"nullthrows": "^1.1.1",
"yargs": "^17.6.2"
},
"devDependencies": {
"@babel/core": "^7.20.0",
@@ -52,8 +53,7 @@
"hermes-estree": "0.22.0",
"micromatch": "^4.0.4",
"prettier": "2.8.8",
"rimraf": "^3.0.2",
"yargs": "^17.6.2"
"rimraf": "^3.0.2"
},
"peerDependencies": {
"@babel/preset-env": "^7.1.6"
@@ -1,6 +1,6 @@
{
"name": "@react-native/gradle-plugin",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Gradle Plugin for React Native",
"license": "MIT",
"repository": {
@@ -32,6 +32,7 @@
"README.md",
"react-native-gradle-plugin",
"settings-plugin",
"shared"
"shared",
"shared-testutil"
]
}
@@ -7,7 +7,6 @@
import org.gradle.api.internal.classpath.ModuleRegistry
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.configurationcache.extensions.serviceOf
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
@@ -52,14 +51,6 @@ dependencies {
testImplementation(libs.junit)
testImplementation(libs.assertj)
testImplementation(project(":shared-testutil"))
testRuntimeOnly(
files(
serviceOf<ModuleRegistry>()
.getModule("gradle-tooling-api-builders")
.classpath
.asFiles
.first()))
}
// We intentionally don't build for Java 17 as users will see a cryptic bytecode version
@@ -188,6 +188,7 @@ abstract class ReactExtension @Inject constructor(val project: Project) {
?.dependencies
?.values
?.filter { it.platforms?.android !== null }
?.filterNot { it.platforms?.android?.isPureCxxDependency == true }
?.forEach { deps ->
val nameCleansed = deps.nameCleansed
val dependencyConfiguration = deps.platforms?.android?.dependencyConfiguration
@@ -113,6 +113,7 @@ internal object NdkConfiguratorUtils {
"**/libreact_utils.so",
"**/librrc_image.so",
"**/librrc_legacyviewmanagerinterop.so",
"**/librrc_textinput.so",
"**/librrc_view.so",
"**/libruntimeexecutor.so",
"**/libturbomodulejsijni.so",
@@ -189,6 +189,44 @@ class ReactExtensionTest {
assertThat(deps).isEmpty()
}
@Test
fun getGradleDependenciesToApply_withIsPureCxxDeps_filtersCorrectly() {
val validJsonFile =
createJsonFile(
"""
{
"reactNativeVersion": "1000.0.0",
"dependencies": {
"@react-native/oss-library-example": {
"root": "./node_modules/@react-native/android-example",
"name": "@react-native/android-example",
"platforms": {
"android": {
"sourceDir": "src/main/java",
"packageImportPath": "com.facebook.react"
}
}
},
"@react-native/another-library-for-testing": {
"root": "./node_modules/@react-native/cxx-testing",
"name": "@react-native/cxx-testing",
"platforms": {
"android": {
"sourceDir": "src/main/java",
"packageImportPath": "com.facebook.react",
"isPureCxxDependency": true
}
}
}
}
}
"""
.trimIndent())
val deps = getGradleDependenciesToApply(validJsonFile)
assertThat(deps).containsExactly("implementation" to ":react-native_android-example")
}
private fun createJsonFile(@Language("JSON") input: String) =
tempFolder.newFile().apply { writeText(input) }
}
@@ -7,7 +7,6 @@
import org.gradle.api.internal.classpath.ModuleRegistry
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.configurationcache.extensions.serviceOf
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
@@ -41,14 +40,6 @@ dependencies {
testImplementation(libs.junit)
testImplementation(project(":shared-testutil"))
testRuntimeOnly(
files(
serviceOf<ModuleRegistry>()
.getModule("gradle-tooling-api-builders")
.classpath
.asFiles
.first()))
}
// We intentionally don't build for Java 17 as users will see a cryptic bytecode version
@@ -7,6 +7,7 @@
package com.facebook.react
import com.facebook.react.model.ModelAutolinkingConfigJson
import com.facebook.react.utils.JsonUtils
import com.facebook.react.utils.windowsAwareCommandLine
import java.io.File
@@ -53,30 +54,22 @@ abstract class ReactSettingsExtension @Inject constructor(val settings: Settings
.files("yarn.lock", "package-lock.json", "package.json", "react-native.config.js")
) {
outputFile.parentFile.mkdirs()
val lockFilesChanged = checkAndUpdateLockfiles(lockFiles, outputFolder)
if (lockFilesChanged || outputFile.exists().not() || outputFile.length() != 0L) {
val process =
ProcessBuilder(command)
.directory(workingDirectory)
.redirectOutput(ProcessBuilder.Redirect.to(outputFile))
.redirectError(ProcessBuilder.Redirect.INHERIT)
.start()
val finished = process.waitFor(5, TimeUnit.MINUTES)
if (!finished || (process.exitValue() != 0)) {
val prefixCommand =
"ERROR: autolinkLibrariesFromCommand: process ${command.joinToString(" ")}"
val message =
if (!finished) "${prefixCommand} timed out"
else "${prefixCommand} exited with error code: ${process.exitValue()}"
val logger = Logging.getLogger("ReactSettingsExtension")
logger.error(message)
if (outputFile.length() != 0L) {
logger.error(outputFile.readText().substring(0, 1024))
val updateConfig =
object : GenerateConfig {
private val pb =
ProcessBuilder(command)
.directory(workingDirectory)
.redirectOutput(ProcessBuilder.Redirect.to(outputFile))
.redirectError(ProcessBuilder.Redirect.INHERIT)
override fun command(): List<String> = pb.command()
override fun start(): Process = pb.start()
}
outputFile.delete()
throw GradleException(message)
}
}
checkAndUpdateCache(updateConfig, outputFile, outputFolder, lockFiles)
linkLibraries(getLibrariesToAutolink(outputFile))
}
@@ -107,9 +100,73 @@ abstract class ReactSettingsExtension @Inject constructor(val settings: Settings
}
}
internal interface GenerateConfig {
fun command(): List<String>
fun start(): Process
}
companion object {
private val md = MessageDigest.getInstance("SHA-256")
/**
* Determine if our cache is out-of-date
*
* @param cacheJsonConfig Our current cached autolinking.json config, which may exist
* @param cacheFolder The folder we store our cached SHAs and config
* @param lockFiles The [FileCollection] of the lockfiles to check.
* @return `true` if the cache needs to be rebuilt, `false` otherwise
*/
internal fun isCacheDirty(
cacheJsonConfig: File,
cacheFolder: File,
lockFiles: FileCollection,
): Boolean {
if (cacheJsonConfig.exists().not() || cacheJsonConfig.length() == 0L) {
return true
}
val lockFilesChanged = checkAndUpdateLockfiles(lockFiles, cacheFolder)
if (lockFilesChanged) {
return true
}
return isConfigModelInvalid(JsonUtils.fromAutolinkingConfigJson(cacheJsonConfig))
}
/**
* Utility function to update the settings cache only if it's entries are dirty
*
* @param updateJsonConfig A [GenerateConfig] to update the project's autolinking config
* @param cacheJsonConfig Our current cached autolinking.json config, which may exist
* @param cacheFolder The folder we store our cached SHAs and config
* @param lockFiles The [FileCollection] of the lockfiles to check.
*/
internal fun checkAndUpdateCache(
updateJsonConfig: GenerateConfig,
cacheJsonConfig: File,
cacheFolder: File,
lockFiles: FileCollection,
) {
if (isCacheDirty(cacheJsonConfig, cacheFolder, lockFiles)) {
val process = updateJsonConfig.start()
val finished = process.waitFor(5, TimeUnit.MINUTES)
if (!finished || (process.exitValue() != 0)) {
val command = updateJsonConfig.command().joinToString(" ")
val prefixCommand = "ERROR: autolinkLibrariesFromCommand: process $command"
val message =
if (!finished) "$prefixCommand timed out"
else "$prefixCommand exited with error code: ${process.exitValue()}"
val logger = Logging.getLogger("ReactSettingsExtension")
logger.error(message)
if (cacheJsonConfig.length() != 0L) {
logger.error(cacheJsonConfig.readText().substring(0, 1024))
}
cacheJsonConfig.delete()
throw GradleException(message)
}
}
}
/**
* Utility function to check if the provided lockfiles have been updated or not. This function
* will both check and update the lockfiles hashes if necessary.
@@ -150,5 +207,8 @@ abstract class ReactSettingsExtension @Inject constructor(val settings: Settings
internal fun computeSha256(lockFile: File) =
String.format("%032x", BigInteger(1, md.digest(lockFile.readBytes())))
internal fun isConfigModelInvalid(model: ModelAutolinkingConfigJson?) =
model?.project?.android?.packageName == null
}
}
@@ -7,10 +7,12 @@
package com.facebook.react
import com.facebook.react.ReactSettingsExtension.Companion.checkAndUpdateCache
import com.facebook.react.ReactSettingsExtension.Companion.checkAndUpdateLockfiles
import com.facebook.react.ReactSettingsExtension.Companion.computeSha256
import com.facebook.react.ReactSettingsExtension.Companion.getLibrariesToAutolink
import groovy.test.GroovyTestCase.assertEquals
import com.facebook.react.ReactSettingsExtension.GenerateConfig
import java.io.File
import org.gradle.testfixtures.ProjectBuilder
import org.intellij.lang.annotations.Language
@@ -236,6 +238,241 @@ class ReactSettingsExtensionTest {
File(buildFolder, "package-lock.json.sha").readText())
}
@Test
fun skipUpdateIfConfigInCacheIsValid() {
val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build()
val buildFolder = tempFolder.newFolder("build")
val generatedFolder = tempFolder.newFolder("build", "generated")
val outputFile =
File(generatedFolder, "autolinking.json").apply {
writeText(
"""
{
"root": "/",
"reactNativePath": "/node_modules/react-native",
"reactNativeVersion": "0.75",
"dependencies": {},
"healthChecks": [],
"platforms": {
"ios": {},
"android": {}
},
"assets": [],
"project": {
"ios": {},
"android": {
"sourceDir": "/",
"appName": "app",
"packageName": "com.TestApp",
"applicationId": "com.TestApp",
"mainActivity": ".MainActivity",
"assets": []
}
}
}
"""
.trimIndent())
}
tempFolder.newFile("yarn.lock").apply { writeText("I'm a lockfile") }
val lockfileCollection = project.files("yarn.lock")
// Prebuild the shas with the invalid empty autolinking.json
checkAndUpdateLockfiles(lockfileCollection, buildFolder)
val monitoredUpdateConfig = createMonitoredUpdateConfig()
checkAndUpdateCache(monitoredUpdateConfig, outputFile, buildFolder, lockfileCollection)
// The autolinking.json file is valid, SHA's are untouched therefore config should NOT be
// refreshed
assertThat(monitoredUpdateConfig.run).isFalse()
}
@Test
fun checkAndUpdateConfigIfEmpty() {
val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build()
val buildFolder = tempFolder.newFolder("build")
val generatedFolder = tempFolder.newFolder("build", "generated")
val outputFile = File(generatedFolder, "autolinking.json").apply { writeText("") }
tempFolder.newFile("yarn.lock").apply { writeText("I'm a lockfile") }
val lockfileCollection = project.files("yarn.lock")
// Prebuild the shas with the invalid empty autolinking.json
checkAndUpdateLockfiles(lockfileCollection, buildFolder)
val monitoredUpdateConfig = createMonitoredUpdateConfig()
checkAndUpdateCache(monitoredUpdateConfig, outputFile, buildFolder, lockfileCollection)
// The autolinking.json file is invalid and should be refreshed
assertThat(monitoredUpdateConfig.run).isTrue()
}
@Test
fun checkAndUpdateConfigIfCachedConfigInvalid() {
val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build()
val buildFolder = tempFolder.newFolder("build")
val generatedFolder = tempFolder.newFolder("build", "generated")
val outputFile =
File(generatedFolder, "autolinking.json").apply {
writeText(
"""
{
"project": {
"ios": {},
"android": {}
}
}
"""
.trimIndent())
}
tempFolder.newFile("yarn.lock").apply { writeText("I'm a lockfile") }
val lockfileCollection = project.files("yarn.lock")
// Prebuild the shas with the invalid empty autolinking.json
checkAndUpdateLockfiles(lockfileCollection, buildFolder)
val monitoredUpdateConfig = createMonitoredUpdateConfig()
checkAndUpdateCache(monitoredUpdateConfig, outputFile, buildFolder, lockfileCollection)
// The autolinking.json file is invalid and should be refreshed
assertThat(monitoredUpdateConfig.run).isTrue()
}
@Test
fun isCacheDirty_withMissingAutolinkingFile_returnsTrue() {
val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build()
val buildFolder =
tempFolder.newFolder("build").apply {
File(this, "yarn.lock.sha")
.writeText("76046b72442ee7eb130627e56c3db7c9907eef4913b17ad130335edc0eb702a8")
}
tempFolder.newFile("yarn.lock").apply { writeText("I'm a lockfile") }
val lockfiles = project.files("yarn.lock")
val emptyConfigFile = File(tempFolder.newFolder("build", "autolinking"), "autolinking.json")
assertThat(ReactSettingsExtension.isCacheDirty(emptyConfigFile, buildFolder, lockfiles))
.isTrue()
}
@Test
fun isCacheDirty_withInvalidAutolinkingFile_returnsTrue() {
val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build()
val buildFolder =
tempFolder.newFolder("build").apply {
File(this, "yarn.lock.sha")
.writeText("76046b72442ee7eb130627e56c3db7c9907eef4913b17ad130335edc0eb702a8")
}
tempFolder.newFile("yarn.lock").apply { writeText("I'm a lockfile") }
val lockfiles = project.files("yarn.lock")
val invalidConfigFile =
createJsonFile(
"""
{}
"""
.trimIndent())
assertThat(ReactSettingsExtension.isCacheDirty(invalidConfigFile, buildFolder, lockfiles))
.isTrue()
}
@Test
fun isCacheDirty_withMissingDependenciesInJson_returnsFalse() {
val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build()
val buildFolder =
tempFolder.newFolder("build").apply {
File(this, "yarn.lock.sha")
.writeText("76046b72442ee7eb130627e56c3db7c9907eef4913b17ad130335edc0eb702a8")
}
tempFolder.newFile("yarn.lock").apply { writeText("I'm a lockfile") }
val lockfiles = project.files("yarn.lock")
val invalidConfigFile =
createJsonFile(
"""
{
"reactNativeVersion": "1000.0.0"
}
"""
.trimIndent())
assertThat(ReactSettingsExtension.isCacheDirty(invalidConfigFile, buildFolder, lockfiles))
.isTrue()
}
@Test
fun isCacheDirty_withExistingEmptyDependenciesInJson_returnsTrue() {
val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build()
val buildFolder =
tempFolder.newFolder("build").apply {
File(this, "yarn.lock.sha")
.writeText("76046b72442ee7eb130627e56c3db7c9907eef4913b17ad130335edc0eb702a8")
}
tempFolder.newFile("yarn.lock").apply { writeText("I'm a lockfile") }
val lockfiles = project.files("yarn.lock")
val invalidConfigFile =
createJsonFile(
"""
{
"reactNativeVersion": "1000.0.0",
"dependencies": {}
}
"""
.trimIndent())
assertThat(ReactSettingsExtension.isCacheDirty(invalidConfigFile, buildFolder, lockfiles))
.isTrue()
}
@Test
fun isCacheDirty_withExistingDependenciesInJson_returnsTrue() {
val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build()
val buildFolder =
tempFolder.newFolder("build").apply {
File(this, "yarn.lock.sha")
.writeText("76046b72442ee7eb130627e56c3db7c9907eef4913b17ad130335edc0eb702a8")
}
tempFolder.newFile("yarn.lock").apply { writeText("I'm a lockfile") }
val lockfiles = project.files("yarn.lock")
val invalidConfigFile =
createJsonFile(
"""
{
"reactNativeVersion": "1000.0.0",
"dependencies": {
"@react-native/oss-library-example": {
"root": "./node_modules/@react-native/oss-library-example",
"name": "@react-native/oss-library-example",
"platforms": {
"ios": {
"podspecPath": "./node_modules/@react-native/oss-library-example/OSSLibraryExample.podspec",
"version": "0.0.1",
"configurations": [],
"scriptPhases": []
}
}
}
}
}
"""
.trimIndent())
assertThat(ReactSettingsExtension.isCacheDirty(invalidConfigFile, buildFolder, lockfiles))
.isTrue()
}
private fun createJsonFile(@Language("JSON") input: String) =
tempFolder.newFile().apply { writeText(input) }
private fun createMonitoredUpdateConfig() =
object : GenerateConfig {
var run = false
override fun start(): Process {
run = true
return ProcessBuilder("true").start()
}
override fun command(): List<String> = listOf("true")
}
}
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "react-native-info",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"main": "build/index.js",
"license": "MIT",
"private": true,
@@ -17,11 +17,11 @@
"directory": "packages/react-native-info"
},
"dependencies": {
"@react-native-community/cli-config": "14.0.0",
"@react-native-community/cli-platform-apple": "14.0.0",
"@react-native-community/cli-tools": "14.0.0",
"@react-native-community/cli-types": "14.0.0",
"commander": "^12.0.0",
"@react-native-community/cli-config": "14.1.0",
"@react-native-community/cli-platform-apple": "14.1.0",
"@react-native-community/cli-tools": "14.1.0",
"@react-native-community/cli-types": "14.1.0",
"commander": "^9.4.1",
"fs-extra": "^11.2.0",
"yaml": "^2.4.1"
},
@@ -1,6 +1,6 @@
{
"name": "@react-native/popup-menu-android",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "PopupMenu for the Android platform",
"main": "index.js",
"files": [
@@ -17,7 +17,7 @@
],
"license": "MIT",
"devDependencies": {
"@react-native/codegen": "0.75.0-rc.6"
"@react-native/codegen": "0.75.3"
},
"peerDependencies": {
"@types/react": "^18.2.6",
@@ -1,6 +1,6 @@
{
"name": "@react-native/oss-library-example",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"private": true,
"description": "Package that includes native module exapmle, native component example, targets both the old and the new architecture. It should serve as an example of a real-world OSS library.",
"license": "MIT",
@@ -26,8 +26,8 @@
],
"devDependencies": {
"@babel/core": "^7.20.0",
"@react-native/babel-preset": "0.75.0-rc.6",
"react-native": "0.75.0-rc.6"
"@react-native/babel-preset": "0.75.3",
"react-native": "0.75.3"
},
"peerDependencies": {
"react": "*",
@@ -1,7 +1,7 @@
{
"name": "@react-native/test-renderer",
"private": true,
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "A Test rendering library for React Native",
"license": "MIT",
"devDependencies": {
+2 -2
View File
@@ -16,8 +16,8 @@ const version: $ReadOnly<{
}> = {
major: 0,
minor: 75,
patch: 0,
prerelease: 'rc.6',
patch: 3,
prerelease: null,
};
module.exports = {version};
@@ -182,21 +182,23 @@ type MaximumOneOf<T, K extends keyof T = keyof T> = K extends keyof T
export interface TransformsStyle {
transform?:
| MaximumOneOf<
PerspectiveTransform &
RotateTransform &
RotateXTransform &
RotateYTransform &
RotateZTransform &
ScaleTransform &
ScaleXTransform &
ScaleYTransform &
TranslateXTransform &
TranslateYTransform &
SkewXTransform &
SkewYTransform &
MatrixTransform
>[]
| Readonly<
MaximumOneOf<
PerspectiveTransform &
RotateTransform &
RotateXTransform &
RotateYTransform &
RotateZTransform &
ScaleTransform &
ScaleXTransform &
ScaleYTransform &
TranslateXTransform &
TranslateYTransform &
SkewXTransform &
SkewYTransform &
MatrixTransform
>[]
>
| string
| undefined;
transformOrigin?: Array<string | number> | string | undefined;
@@ -651,8 +651,6 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame)
- (NSString *)returnKeyTypeToString:(UIReturnKeyType)returnKeyType
{
switch (returnKeyType) {
case UIReturnKeyDefault:
return @"Default";
case UIReturnKeyGo:
return @"Go";
case UIReturnKeyNext:
@@ -680,7 +678,6 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame)
{
returnKeyTypesSet = [NSSet setWithObjects:@(UIReturnKeyDone),
@(UIReturnKeyGo),
@(UIReturnKeyDefault),
@(UIReturnKeyNext),
@(UIReturnKeySearch),
@(UIReturnKeySend),
@@ -23,8 +23,8 @@ NSDictionary* RCTGetReactNativeVersion(void)
__rnVersion = @{
RCTVersionMajor: @(0),
RCTVersionMinor: @(75),
RCTVersionPatch: @(0),
RCTVersionPrerelease: @"rc.6",
RCTVersionPatch: @(3),
RCTVersionPrerelease: [NSNull null],
};
});
return __rnVersion;
@@ -471,8 +471,6 @@ static NSSet<NSNumber *> *returnKeyTypesSet;
- (NSString *)returnKeyTypeToString:(UIReturnKeyType)returnKeyType
{
switch (returnKeyType) {
case UIReturnKeyDefault:
return @"Default";
case UIReturnKeyGo:
return @"Go";
case UIReturnKeyNext:
@@ -500,7 +498,6 @@ static NSSet<NSNumber *> *returnKeyTypesSet;
{
returnKeyTypesSet = [NSSet setWithObjects:@(UIReturnKeyDone),
@(UIReturnKeyGo),
@(UIReturnKeyDefault),
@(UIReturnKeyNext),
@(UIReturnKeySearch),
@(UIReturnKeySend),
@@ -4219,6 +4219,7 @@ public final class com/facebook/react/uimanager/LengthPercentage {
public static final field Companion Lcom/facebook/react/uimanager/LengthPercentage$Companion;
public fun <init> ()V
public fun <init> (FLcom/facebook/react/uimanager/LengthPercentageType;)V
public final fun getUnit ()Lcom/facebook/react/uimanager/LengthPercentageType;
public final fun resolve (FF)F
public static final fun setFromDynamic (Lcom/facebook/react/bridge/Dynamic;)Lcom/facebook/react/uimanager/LengthPercentage;
}
@@ -5022,6 +5023,7 @@ public class com/facebook/react/uimanager/TransformHelper {
public fun <init> ()V
public static fun processTransform (Lcom/facebook/react/bridge/ReadableArray;[D)V
public static fun processTransform (Lcom/facebook/react/bridge/ReadableArray;[DFFLcom/facebook/react/bridge/ReadableArray;)V
public static fun processTransform (Lcom/facebook/react/bridge/ReadableArray;[DFFLcom/facebook/react/bridge/ReadableArray;Z)V
}
public abstract interface class com/facebook/react/uimanager/UIBlock {
@@ -6447,7 +6449,7 @@ public class com/facebook/react/views/image/ReactImageView : com/facebook/drawee
public fun updateCallerContext (Ljava/lang/Object;)V
}
public final class com/facebook/react/views/imagehelper/ImageSource {
public class com/facebook/react/views/imagehelper/ImageSource {
public static final field Companion Lcom/facebook/react/views/imagehelper/ImageSource$Companion;
public fun <init> (Landroid/content/Context;Ljava/lang/String;)V
public fun <init> (Landroid/content/Context;Ljava/lang/String;D)V
@@ -6457,9 +6459,9 @@ public final class com/facebook/react/views/imagehelper/ImageSource {
public final fun getSize ()D
public final fun getSource ()Ljava/lang/String;
public static final fun getTransparentBitmapImageSource (Landroid/content/Context;)Lcom/facebook/react/views/imagehelper/ImageSource;
public final fun getUri ()Landroid/net/Uri;
public fun getUri ()Landroid/net/Uri;
public fun hashCode ()I
public final fun isResource ()Z
public fun isResource ()Z
}
public final class com/facebook/react/views/imagehelper/ImageSource$Companion {
@@ -1,4 +1,4 @@
VERSION_NAME=0.75.0-rc.6
VERSION_NAME=0.75.3
react.internal.publishingGroup=com.facebook.react
android.useAndroidX=true
@@ -891,7 +891,7 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot {
sendEvent(
"keyboardDidHide",
createKeyboardEventPayload(
PixelUtil.toDIPFromPixel(mLastHeight),
PixelUtil.toDIPFromPixel(mVisibleViewArea.height()),
0,
PixelUtil.toDIPFromPixel(mVisibleViewArea.width()),
0));
@@ -940,7 +940,7 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot {
sendEvent(
"keyboardDidHide",
createKeyboardEventPayload(
PixelUtil.toDIPFromPixel(mLastHeight),
PixelUtil.toDIPFromPixel(mVisibleViewArea.height()),
0,
PixelUtil.toDIPFromPixel(mVisibleViewArea.width()),
0));
@@ -0,0 +1,51 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.bridge
import com.facebook.jni.HybridData
import com.facebook.proguard.annotations.DoNotStrip
import com.facebook.proguard.annotations.DoNotStripAny
/**
* An implementation of [Dynamic] that has a C++ implementation.
*
* This is used to support Legacy Native Modules that have not been migrated to the new architecture
* and are using [Dynamic] as a parameter type.
*/
@DoNotStripAny
private class DynamicNative(
@Suppress("NoHungarianNotation") @field:DoNotStrip private val mHybridData: HybridData?
) : Dynamic {
override val type: ReadableType
get() = getTypeNative()
override val isNull: Boolean
get() = isNullNative()
private external fun getTypeNative(): ReadableType
private external fun isNullNative(): Boolean
external override fun asBoolean(): Boolean
// The native representation is holding the value as Double. We do the Int conversion here.
override fun asInt(): Int = asDouble().toInt()
external override fun asDouble(): Double
external override fun asString(): String
external override fun asArray(): ReadableArray
external override fun asMap(): ReadableMap
override fun recycle() {
// Noop - nothing to recycle since there is no pooling
}
}
@@ -13,7 +13,6 @@ import androidx.annotation.Nullable;
import com.facebook.jni.HybridData;
import com.facebook.proguard.annotations.DoNotStrip;
import java.io.Closeable;
import java.util.OptionalInt;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.Request;
@@ -47,7 +46,7 @@ import okhttp3.WebSocketListener;
private static class WebSocketDelegate implements Closeable {
private final HybridData mHybridData;
public native void didFailWithError(OptionalInt posixCode, String error);
public native void didFailWithError(@Nullable Integer posixCode, String error);
public native void didReceiveMessage(String message);
@@ -103,8 +102,7 @@ import okhttp3.WebSocketListener;
@Override
public void onFailure(WebSocket _unused, Throwable t, @Nullable Response response) {
@Nullable String message = t.getMessage();
delegate.didFailWithError(
OptionalInt.empty(), message != null ? message : "<Unknown error>");
delegate.didFailWithError(null, message != null ? message : "<Unknown error>");
// "No further calls to this listener will be made." -OkHttp docs for
// WebSocketListener.onFailure
delegate.close();
@@ -161,14 +161,11 @@ class TurboModuleInteropUtils {
|| paramClass == Callback.class
|| paramClass == Promise.class
|| paramClass == ReadableMap.class
|| paramClass == ReadableArray.class) {
|| paramClass == ReadableArray.class
|| paramClass == Dynamic.class) {
return convertClassToJniType(paramClass);
}
if (paramClass == Dynamic.class) {
// TODO(T145105887): Output warnings that TurboModules doesn't yet support Dynamic arguments
}
throw new ParsingException(
moduleName,
methodName,
@@ -17,6 +17,6 @@ public class ReactNativeVersion {
public static final Map<String, Object> VERSION = MapBuilder.<String, Object>of(
"major", 0,
"minor", 75,
"patch", 0,
"prerelease", "rc.6");
"patch", 3,
"prerelease", null);
}
@@ -29,6 +29,8 @@ import com.facebook.react.common.MapBuilder;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.ReactAccessibilityDelegate.AccessibilityRole;
import com.facebook.react.uimanager.ReactAccessibilityDelegate.Role;
import com.facebook.react.uimanager.common.UIManagerType;
import com.facebook.react.uimanager.common.ViewUtil;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.events.PointerEventHelper;
import com.facebook.react.uimanager.util.ReactFindViewUtil;
@@ -535,13 +537,16 @@ public abstract class BaseViewManager<T extends View, C extends LayoutShadowNode
return;
}
boolean allowPercentageResolution = ViewUtil.getUIManagerType(view) == UIManagerType.FABRIC;
sMatrixDecompositionContext.reset();
TransformHelper.processTransform(
transforms,
sTransformDecompositionArray,
PixelUtil.toDIPFromPixel(view.getWidth()),
PixelUtil.toDIPFromPixel(view.getHeight()),
transformOrigin);
transformOrigin,
allowPercentageResolution);
MatrixMathHelper.decomposeMatrix(sTransformDecompositionArray, sMatrixDecompositionContext);
view.setTranslationX(
PixelUtil.toPixelFromDIP(
@@ -20,7 +20,7 @@ public enum class LengthPercentageType {
public class LengthPercentage(
private val value: Float,
private val unit: LengthPercentageType,
public val unit: LengthPercentageType,
) {
public companion object {
@JvmStatic
@@ -45,8 +45,27 @@ public class TransformHelper {
return inRadians ? value : MatrixMathHelper.degreesToRadians(value);
}
/**
* @deprecated Use {@link #processTransform(ReadableArray, double[], float, float, ReadableArray,
* boolean)} instead.
*/
@Deprecated(forRemoval = true, since = "0.75")
public static void processTransform(ReadableArray transforms, double[] result) {
processTransform(transforms, result, 0, 0, null);
processTransform(transforms, result, 0, 0, null, false);
}
/**
* @deprecated Use {@link #processTransform(ReadableArray, double[], float, float, ReadableArray,
* boolean)} instead.
*/
@Deprecated(forRemoval = true, since = "0.75")
public static void processTransform(
ReadableArray transforms,
double[] result,
float viewWidth,
float viewHeight,
ReadableArray transformOrigin) {
processTransform(transforms, result, viewWidth, viewHeight, transformOrigin, false);
}
public static void processTransform(
@@ -54,10 +73,13 @@ public class TransformHelper {
double[] result,
float viewWidth,
float viewHeight,
ReadableArray transformOrigin) {
ReadableArray transformOrigin,
boolean allowPercentageResolution) {
double[] helperMatrix = sHelperMatrix.get();
MatrixMathHelper.resetIdentityMatrix(result);
float[] offsets = getTranslateForTransformOrigin(viewWidth, viewHeight, transformOrigin);
float[] offsets =
getTranslateForTransformOrigin(
viewWidth, viewHeight, transformOrigin, allowPercentageResolution);
if (offsets != null) {
MatrixMathHelper.resetIdentityMatrix(helperMatrix);
@@ -104,13 +126,13 @@ public class TransformHelper {
} else if ("translate".equals(transformType)) {
ReadableArray value = transform.getArray(transformType);
double x = 0;
if (value.getType(0) == ReadableType.String) {
if (value.getType(0) == ReadableType.String && allowPercentageResolution) {
x = parseTranslateValue(value.getString(0), viewWidth);
} else {
x = value.getDouble(0);
}
double y = 0;
if (value.getType(1) == ReadableType.String) {
if (value.getType(1) == ReadableType.String && allowPercentageResolution) {
y = parseTranslateValue(value.getString(1), viewHeight);
} else {
y = value.getDouble(1);
@@ -119,7 +141,8 @@ public class TransformHelper {
MatrixMathHelper.applyTranslate3D(helperMatrix, x, y, z);
} else if ("translateX".equals(transformType)) {
double translateValue = 0;
if (transform.getType(transformType) == ReadableType.String) {
if (transform.getType(transformType) == ReadableType.String
&& allowPercentageResolution) {
translateValue = parseTranslateValue(transform.getString(transformType), viewWidth);
} else {
translateValue = transform.getDouble(transformType);
@@ -127,7 +150,8 @@ public class TransformHelper {
MatrixMathHelper.applyTranslate2D(helperMatrix, translateValue, 0d);
} else if ("translateY".equals(transformType)) {
double translateValue = 0;
if (transform.getType(transformType) == ReadableType.String) {
if (transform.getType(transformType) == ReadableType.String
&& allowPercentageResolution) {
translateValue = parseTranslateValue(transform.getString(transformType), viewHeight);
} else {
translateValue = transform.getDouble(transformType);
@@ -167,7 +191,10 @@ public class TransformHelper {
}
private static float[] getTranslateForTransformOrigin(
float viewWidth, float viewHeight, ReadableArray transformOrigin) {
float viewWidth,
float viewHeight,
ReadableArray transformOrigin,
boolean allowPercentageResolution) {
if (transformOrigin == null || (viewHeight == 0 && viewWidth == 0)) {
return null;
}
@@ -183,10 +210,12 @@ public class TransformHelper {
break;
case String:
{
String part = transformOrigin.getString(i);
if (part.endsWith("%")) {
float val = Float.parseFloat(part.substring(0, part.length() - 1));
origin[i] = (i == 0 ? viewWidth : viewHeight) * val / 100.0f;
if (allowPercentageResolution) {
String part = transformOrigin.getString(i);
if (part.endsWith("%")) {
float val = Float.parseFloat(part.substring(0, part.length() - 1));
origin[i] = (i == 0 ? viewWidth : viewHeight) * val / 100.0f;
}
}
break;
}
@@ -7,6 +7,8 @@
package com.facebook.react.uimanager.common
import android.view.View
public object ViewUtil {
public const val NO_SURFACE_ID: Int = -1
@@ -26,6 +28,12 @@ public object ViewUtil {
UIManagerType.DEFAULT
}
/**
* Overload for {@link #getUIManagerType(int)} that uses the view's id to determine if it
* originated from Fabric
*/
@JvmStatic @UIManagerType public fun getUIManagerType(view: View): Int = getUIManagerType(view.id)
/**
* Version of getUIManagerType that uses both surfaceId and viewTag heuristics
*
@@ -605,6 +605,7 @@ public class CSSBackgroundDrawable extends Drawable {
}
// Clip border ONLY if its color is non transparent
float pathAdjustment = 0f;
if (Color.alpha(colorLeft) != 0
&& Color.alpha(colorTop) != 0
&& Color.alpha(colorRight) != 0
@@ -615,6 +616,10 @@ public class CSSBackgroundDrawable extends Drawable {
mInnerClipTempRectForBorderRadius.bottom -= borderWidth.bottom;
mInnerClipTempRectForBorderRadius.left += borderWidth.left;
mInnerClipTempRectForBorderRadius.right -= borderWidth.right;
// only close gap between border and main path if we draw the border, otherwise
// we wind up pixelating small pixel-radius curves
pathAdjustment = mGapBetweenPaths;
}
mTempRectForCenterDrawPath.top += borderWidth.top * 0.5f;
@@ -661,10 +666,10 @@ public class CSSBackgroundDrawable extends Drawable {
// (mInnerClipTempRectForBorderRadius), ensuring the border can be
// drawn on top without the gap.
mBackgroundColorRenderPath.addRoundRect(
mInnerClipTempRectForBorderRadius.left - mGapBetweenPaths,
mInnerClipTempRectForBorderRadius.top - mGapBetweenPaths,
mInnerClipTempRectForBorderRadius.right + mGapBetweenPaths,
mInnerClipTempRectForBorderRadius.bottom + mGapBetweenPaths,
mInnerClipTempRectForBorderRadius.left - pathAdjustment,
mInnerClipTempRectForBorderRadius.top - pathAdjustment,
mInnerClipTempRectForBorderRadius.right + pathAdjustment,
mInnerClipTempRectForBorderRadius.bottom + pathAdjustment,
new float[] {
innerTopLeftRadiusX,
innerTopLeftRadiusY,
@@ -12,7 +12,7 @@ import android.net.Uri
import java.util.Objects
/** Class describing an image source (network URI or resource) and size. */
public class ImageSource
public open class ImageSource
@JvmOverloads
constructor(
context: Context,
@@ -23,12 +23,14 @@ constructor(
) {
/** Get the URI for this image - can be either a parsed network URI or a resource URI. */
public val uri: Uri = computeUri(context)
public open val uri: Uri = computeUri(context)
/** Get the area of this image. */
public val size: Double = width * height
/** Get whether this image source represents an Android resource or a network URI. */
public var isResource: Boolean = false
private set
public open val isResource: Boolean
get() = _isResource
private var _isResource: Boolean = false
override fun equals(other: Any?): Boolean {
if (this === other) {
@@ -58,7 +60,7 @@ constructor(
}
private fun computeLocalUri(context: Context): Uri {
isResource = true
_isResource = true
return ResourceDrawableIdHelper.instance.getResourceDrawableUri(context, source)
}
@@ -23,6 +23,7 @@ import com.facebook.react.common.ReactConstants;
import com.facebook.react.common.annotations.VisibleForTesting;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.LengthPercentage;
import com.facebook.react.uimanager.LengthPercentageType;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.PointerEvents;
import com.facebook.react.uimanager.Spacing;
@@ -31,6 +32,8 @@ import com.facebook.react.uimanager.UIManagerHelper;
import com.facebook.react.uimanager.ViewProps;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.annotations.ReactPropGroup;
import com.facebook.react.uimanager.common.UIManagerType;
import com.facebook.react.uimanager.common.ViewUtil;
import com.facebook.react.uimanager.events.EventDispatcher;
import com.facebook.react.uimanager.style.BorderRadiusProp;
import com.facebook.yoga.YogaConstants;
@@ -131,9 +134,16 @@ public class ReactViewManager extends ReactClippingViewManager<ReactViewGroup> {
ViewProps.BORDER_START_START_RADIUS,
})
public void setBorderRadius(ReactViewGroup view, int index, Dynamic rawBorderRadius) {
@Nullable LengthPercentage borderRadius = LengthPercentage.setFromDynamic(rawBorderRadius);
// We do not support percentage border radii on Paper in order to be consistent with iOS (to
// avoid developer surprise if it works on one platform but not another).
if (ViewUtil.getUIManagerType(view) != UIManagerType.FABRIC
&& borderRadius != null
&& borderRadius.getUnit() == LengthPercentageType.PERCENT) {
borderRadius = null;
}
view.setBorderRadius(BorderRadiusProp.values()[index], borderRadius);
}
@@ -7,6 +7,8 @@
#include "JCxxInspectorPackagerConnectionWebSocketDelegate.h"
#include <optional>
using namespace facebook::jni;
namespace facebook::react::jsinspector_modern {
@@ -17,10 +19,17 @@ JCxxInspectorPackagerConnectionWebSocketDelegate::
: cxxDelegate_(cxxDelegate) {}
void JCxxInspectorPackagerConnectionWebSocketDelegate::didFailWithError(
alias_ref<JOptionalInt::javaobject> posixCode,
alias_ref<jni::JInteger> posixCode,
const std::string& error) {
std::optional<int> posixCodeVal;
// Handle @Nullable JInteger param
if (posixCode.get() != nullptr) {
posixCodeVal = posixCode->intValue();
}
if (auto delegate = cxxDelegate_.lock()) {
delegate->didFailWithError(*posixCode, error);
delegate->didFailWithError(posixCodeVal, error);
}
}
@@ -7,8 +7,6 @@
#pragma once
#include "JOptional.h"
#include <fbjni/fbjni.h>
#include <jsinspector-modern/InspectorPackagerConnection.h>
@@ -29,7 +27,7 @@ class JCxxInspectorPackagerConnectionWebSocketDelegate
"Lcom/facebook/react/devsupport/CxxInspectorPackagerConnection$WebSocketDelegate;";
void didFailWithError(
jni::alias_ref<JOptionalInt::javaobject> posixCode,
jni::alias_ref<jni::JInteger> posixCode,
const std::string& error);
void didReceiveMessage(const std::string& message);
@@ -1,29 +0,0 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "JOptional.h"
namespace facebook::react {
int JOptionalInt::getAsInt() const {
static auto method = javaClassStatic()->getMethod<jint()>("getAsInt");
return method(self());
}
bool JOptionalInt::isPresent() const {
static auto method = javaClassStatic()->getMethod<jboolean()>("isPresent");
return method(self());
}
JOptionalInt::operator std::optional<int>() const {
if (!isPresent()) {
return {};
}
return getAsInt();
}
} // namespace facebook::react
@@ -1,27 +0,0 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <fbjni/fbjni.h>
#include <optional>
// TODO(moti): Consider moving this into fbjni
namespace facebook::react {
class JOptionalInt : public facebook::jni::JavaClass<JOptionalInt> {
public:
static auto constexpr kJavaDescriptor = "Ljava/util/OptionalInt;";
int getAsInt() const;
bool isPresent() const;
operator std::optional<int>() const;
};
} // namespace facebook::react
@@ -0,0 +1,46 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "JDynamicNative.h"
#include "ReadableNativeArray.h"
#include "ReadableNativeMap.h"
using namespace facebook::jni;
namespace facebook::react {
jboolean JDynamicNative::isNullNative() {
return payload_.isNull();
}
jni::local_ref<ReadableType> JDynamicNative::getTypeNative() {
return ReadableType::getType(payload_.type());
}
jni::local_ref<jstring> JDynamicNative::asString() {
return jni::make_jstring(payload_.asString());
}
jboolean JDynamicNative::asBoolean() {
return payload_.asBool();
}
jdouble JDynamicNative::asDouble() {
return payload_.asDouble();
}
jni::local_ref<ReadableArray> JDynamicNative::asArray() {
return jni::adopt_local(reinterpret_cast<ReadableArray::javaobject>(
ReadableNativeArray::newObjectCxxArgs(payload_).release()));
}
jni::local_ref<ReadableMap> JDynamicNative::asMap() {
return jni::adopt_local(reinterpret_cast<ReadableMap::javaobject>(
ReadableNativeMap::createWithContents(std::move(payload_)).release()));
}
} // namespace facebook::react
@@ -0,0 +1,56 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include "NativeCommon.h"
#include "ReadableNativeArray.h"
#include "ReadableNativeMap.h"
#include <fbjni/fbjni.h>
#include <folly/dynamic.h>
#include <folly/json.h>
namespace facebook::react {
struct JDynamic : public jni::JavaClass<JDynamic> {
constexpr static auto kJavaDescriptor = "Lcom/facebook/react/bridge/Dynamic;";
};
class JDynamicNative : public jni::HybridClass<JDynamicNative, JDynamic> {
public:
constexpr static auto kJavaDescriptor =
"Lcom/facebook/react/bridge/DynamicNative;";
JDynamicNative(folly::dynamic payload) : payload_(std::move(payload)) {}
static void registerNatives() {
javaClassStatic()->registerNatives(
{makeNativeMethod("isNullNative", JDynamicNative::isNullNative),
makeNativeMethod("getTypeNative", JDynamicNative::getTypeNative),
makeNativeMethod("asDouble", JDynamicNative::asDouble),
makeNativeMethod("asBoolean", JDynamicNative::asBoolean),
makeNativeMethod("asString", JDynamicNative::asString),
makeNativeMethod("asArray", JDynamicNative::asArray),
makeNativeMethod("asMap", JDynamicNative::asMap)});
}
private:
friend HybridBase;
jni::local_ref<ReadableType> getTypeNative();
jni::local_ref<jstring> asString();
jboolean asBoolean();
jdouble asDouble();
jboolean isNullNative();
jni::local_ref<ReadableArray> asArray();
jni::local_ref<ReadableMap> asMap();
folly::dynamic payload_;
};
} // namespace facebook::react
@@ -15,6 +15,7 @@
#include "CatalystInstanceImpl.h"
#include "CxxModuleWrapperBase.h"
#include "JCallback.h"
#include "JDynamicNative.h"
#include "JInspector.h"
#include "JReactMarker.h"
#include "JavaScriptExecutorHolder.h"
@@ -89,6 +90,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
NativeMap::registerNatives();
ReadableNativeMap::registerNatives();
WritableNativeMap::registerNatives();
JDynamicNative::registerNatives();
JReactMarker::registerNatives();
JInspector::registerNatives();
ReactInstanceManagerInspectorTarget::registerNatives();
@@ -17,8 +17,8 @@ namespace facebook::react {
constexpr struct {
int32_t Major = 0;
int32_t Minor = 75;
int32_t Patch = 0;
std::string_view Prerelease = "rc.6";
int32_t Patch = 3;
std::string_view Prerelease = "";
} ReactNativeVersion;
} // namespace facebook::react
@@ -19,6 +19,7 @@
#include <jsi/JSIDynamic.h>
#include <react/bridging/Bridging.h>
#include <react/debug/react_native_assert.h>
#include <react/jni/JDynamicNative.h>
#include <react/jni/NativeMap.h>
#include <react/jni/ReadableNativeMap.h>
#include <react/jni/WritableNativeMap.h>
@@ -373,7 +374,9 @@ JNIArgs convertJSIArgsToJNIArgs(
continue;
}
if (arg->isNull() || arg->isUndefined()) {
// Dynamic encapsulates the Null type so we don't want to return null here.
if ((arg->isNull() && type != "Lcom/facebook/react/bridge/Dynamic;") ||
arg->isUndefined()) {
jarg->l = nullptr;
} else if (type == "Ljava/lang/Double;") {
if (!arg->isNumber()) {
@@ -436,6 +439,10 @@ JNIArgs convertJSIArgsToJNIArgs(
auto jParams =
ReadableNativeMap::createWithContents(std::move(dynamicFromValue));
jarg->l = makeGlobalIfNecessary(jParams.release());
} else if (type == "Lcom/facebook/react/bridge/Dynamic;") {
auto dynamicFromValue = jsi::dynamicFromValue(rt, *arg);
auto jParams = JDynamicNative::newObjectCxxArgs(dynamicFromValue);
jarg->l = makeGlobalIfNecessary(jParams.release());
} else {
throw JavaTurboModuleInvalidArgumentTypeException(
type, argIndex, methodName);
@@ -13,12 +13,14 @@ import android.widget.Toast;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeArray;
@@ -155,6 +157,44 @@ public class SampleLegacyModule extends ReactContextBaseJavaModule {
return map;
}
@SuppressWarnings("unused")
@ReactMethod(isBlockingSynchronousMethod = true)
public WritableMap getDynamic(Dynamic dynamic) {
WritableNativeMap resultMap = new WritableNativeMap();
ReadableType type = dynamic.getType();
if (type == ReadableType.Null) {
log("getDynamic as Null", dynamic, dynamic);
resultMap.putString("type", "Null");
resultMap.putNull("value");
} else if (type == ReadableType.Boolean) {
boolean result = dynamic.asBoolean();
log("getDynamic as Boolean", dynamic, result);
resultMap.putString("type", "Boolean");
resultMap.putBoolean("value", result);
} else if (type == ReadableType.Number) {
int result = dynamic.asInt();
log("getDynamic as Number", dynamic, result);
resultMap.putString("type", "Number");
resultMap.putInt("value", result);
} else if (type == ReadableType.String) {
String result = dynamic.asString();
log("getDynamic as String", dynamic, result);
resultMap.putString("type", "String");
resultMap.putString("value", result);
} else if (type == ReadableType.Array) {
ReadableArray result = dynamic.asArray();
log("getDynamic as Array", dynamic, result);
resultMap.putString("type", "Array");
resultMap.putArray("value", result);
} else if (type == ReadableType.Map) {
ReadableMap result = dynamic.asMap();
log("getDynamic as Map", dynamic, result);
resultMap.putString("type", "Map");
resultMap.putMap("value", result);
}
return resultMap;
}
@DoNotStrip
@SuppressWarnings("unused")
@ReactMethod(isBlockingSynchronousMethod = true)
+3 -3
View File
@@ -42,10 +42,10 @@ const DEFAULT_REGISTRY_HOST =
const HEAD = '1000.0.0';
// We're going to deprecate the `init` command proxying requests to @react-native-community/cli transparently
// on September 30th, 2024 or 0.76 (whichever arrives first). This is part of work to decouple of community CLI from React Native core.
// on December 31th, 2024 or 0.76 (whichever arrives first). This is part of work to decouple of community CLI from React Native core.
//
// See https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md
const CLI_DEPRECATION_DATE = new Date('2024-09-30');
const CLI_DEPRECATION_DATE = new Date('2024-12-31');
async function getLatestVersion(registryHost = DEFAULT_REGISTRY_HOST) {
return new Promise((res, rej) => {
@@ -119,7 +119,7 @@ function warnWithDeprecated() {
}
console.warn(`
${chalk.yellow('🚨')} The \`init\` command is deprecated.
🚨 The \`init\` command is deprecated.
- Switch to ${chalk.dim('npx @react-native-community/cli init')} for the identical behavior.
- Refer to the documentation for information about alternative tools: ${chalk.dim('https://reactnative.dev/docs/getting-started')}`);
+12 -11
View File
@@ -1,6 +1,6 @@
{
"name": "react-native",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "A framework for building native apps using React",
"license": "MIT",
"repository": {
@@ -109,21 +109,22 @@
},
"dependencies": {
"@jest/create-cache-key-function": "^29.6.3",
"@react-native-community/cli": "14.0.0",
"@react-native-community/cli-platform-android": "14.0.0",
"@react-native-community/cli-platform-ios": "14.0.0",
"@react-native/assets-registry": "0.75.0-rc.6",
"@react-native/codegen": "0.75.0-rc.6",
"@react-native/community-cli-plugin": "0.75.0-rc.6",
"@react-native/gradle-plugin": "0.75.0-rc.6",
"@react-native/js-polyfills": "0.75.0-rc.6",
"@react-native/normalize-colors": "0.75.0-rc.6",
"@react-native/virtualized-lists": "0.75.0-rc.6",
"@react-native-community/cli": "14.1.0",
"@react-native-community/cli-platform-android": "14.1.0",
"@react-native-community/cli-platform-ios": "14.1.0",
"@react-native/assets-registry": "0.75.3",
"@react-native/codegen": "0.75.3",
"@react-native/community-cli-plugin": "0.75.3",
"@react-native/gradle-plugin": "0.75.3",
"@react-native/js-polyfills": "0.75.3",
"@react-native/normalize-colors": "0.75.3",
"@react-native/virtualized-lists": "0.75.3",
"abort-controller": "^3.0.0",
"anser": "^1.4.9",
"ansi-regex": "^5.0.0",
"base64-js": "^1.5.1",
"chalk": "^4.0.0",
"commander": "^9.4.1",
"event-target-shim": "^5.0.1",
"flow-enums-runtime": "^0.0.6",
"glob": "^7.1.1",
+2
View File
@@ -31,6 +31,8 @@ program
'npx react-native config',
)
.option('--load-config <string>', 'JSON project config')
.option('--verbose', 'Additional logs', () => true, false)
.allowUnknownOption()
.action(async function handleAction() {
let config = null;
let options = program.opts();
@@ -73,6 +73,7 @@ def list_native_modules!(config_command)
found_pods.push({
"configurations": configurations,
"name": name,
"root": package["root"],
"path": relative_path.to_path,
"podspec_path": podspec_path,
"script_phases": script_phases
@@ -168,7 +169,7 @@ def link_native_modules!(config)
# Support passing in a path relative to the root of the package
if phase["path"]
phase["script"] = File.read(File.expand_path(phase["path"], package[:path]))
phase["script"] = File.read(File.expand_path(phase["path"], package[:root]))
phase.delete("path")
end
@@ -241,7 +241,7 @@ class ReactNativePodsUtils
node_binary = `type -a node`.split("\n").map { |path|
path.gsub!("node is ", "")
}.select { |b|
return !b.start_with?("/var")
!b.start_with?("/var")
}
node_binary = node_binary[0]
@@ -225,7 +225,7 @@ function extractSupportedApplePlatforms(dependency, dependencyPath) {
return supportedPlatformsMap;
}
function findExternalLibraries(pkgJson) {
function findExternalLibraries(pkgJson, projectRoot) {
const dependencies = {
...pkgJson.dependencies,
...pkgJson.devDependencies,
@@ -240,6 +240,7 @@ function findExternalLibraries(pkgJson) {
try {
const configFilePath = require.resolve(
path.join(dependency, 'package.json'),
{paths: [projectRoot]},
);
const configFile = JSON.parse(fs.readFileSync(configFilePath));
const codegenConfigFileDir = path.dirname(configFilePath);
@@ -533,7 +534,7 @@ function findCodegenEnabledLibraries(pkgJson, projectRoot) {
} else {
return [
...projectLibraries,
...findExternalLibraries(pkgJson),
...findExternalLibraries(pkgJson, projectRoot),
...findLibrariesFromReactNativeConfig(projectRoot),
];
}
+1 -1
View File
@@ -1 +1 @@
hermes-2024-07-01-RNv0.75.0-1edbe36ce92fef2c4d427f5c4e104f2758f4b692
hermes-2024-08-15-RNv0.75.1-4b3bf912cc0f705b51b71ce1a5b8bd79b93a451b
@@ -12,9 +12,9 @@ set -e
# Given a specific target, retrieve the right architecture for it
# $1 the target you want to build. Allowed values: iphoneos, iphonesimulator, catalyst, xros, xrsimulator
function get_architecture {
if [[ $1 == "iphoneos" || $1 == "xros" || $1 == "xrsimulator" ]]; then
if [[ $1 == "iphoneos" || $1 == "xros" ]]; then
echo "arm64"
elif [[ $1 == "iphonesimulator" ]]; then
elif [[ $1 == "iphonesimulator" || $1 == "xrsimulator" ]]; then
echo "x86_64;arm64"
elif [[ $1 == "catalyst" ]]; then
echo "x86_64;arm64"
@@ -8,7 +8,7 @@
*/
import * as React from 'react';
import {View, StyleSheet} from 'react-native';
import {View, StyleSheet, type ShadowStyleIOS} from 'react-native';
export function App() {
return <View style={styles.container} />;
@@ -40,3 +40,15 @@ const styles2 = StyleSheet.create({
magrinRight: 1,
},
});
const shadowOffsetConst: Readonly<ShadowStyleIOS['shadowOffset']> = {
width: 1,
height: 2,
};
const styles3 = StyleSheet.create({
transforms: {
transform: [{translateX: 40}] as const,
shadowOffset: shadowOffsetConst,
},
});
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@react-native/tester-e2e",
"private": true,
"version": "0.75.0-rc.6",
"version": "0.75.3",
"license": "MIT",
"description": "React Native E2E tester app.",
"homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/rn-tester-e2e",
File diff suppressed because it is too large Load Diff
@@ -142,6 +142,17 @@ class SampleLegacyModuleExample extends React.Component<{||}, State> {
getSampleLegacyModule()?.getObject({a: 1, b: 'foo', c: null}),
getValue: () =>
getSampleLegacyModule()?.getValue(5, 'test', {a: 1, b: 'foo'}),
getDynamicWithNull: () => getSampleLegacyModule()?.getDynamic(null),
getDynamicWithBoolean: () =>
getSampleLegacyModule()?.getDynamic(true),
getDynamicWithNumber: () =>
getSampleLegacyModule()?.getDynamic(42.24),
getDynamicWithString: () =>
getSampleLegacyModule()?.getDynamic('The answer is 42'),
getDynamicWithArray: () =>
getSampleLegacyModule()?.getDynamic(['the', 'answer', 'is', '42']),
getDynamicWithMap: () =>
getSampleLegacyModule()?.getDynamic({answer: '42'}),
callback: () =>
getSampleLegacyModule()?.getValueWithCallback(callbackValue =>
this._setResult('callback', callbackValue),
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/tester",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"private": true,
"description": "React Native tester app.",
"license": "MIT",
@@ -26,8 +26,8 @@
"flow-enums-runtime": "^0.0.6",
"invariant": "^2.2.4",
"nullthrows": "^1.1.1",
"@react-native/oss-library-example": "0.75.0-rc.6",
"@react-native/popup-menu-android": "0.75.0-rc.6"
"@react-native/oss-library-example": "0.75.3",
"@react-native/popup-menu-android": "0.75.3"
},
"peerDependencies": {
"react": "18.3.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/typescript-config",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Default TypeScript configuration for React Native apps",
"license": "MIT",
"repository": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@react-native/virtualized-lists",
"version": "0.75.0-rc.6",
"version": "0.75.3",
"description": "Virtualized lists for React Native.",
"license": "MIT",
"repository": {
+3560 -3643
View File
File diff suppressed because it is too large Load Diff