mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Compare commits
206
Commits
export-D83817146
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
693e9628e8 | ||
|
|
0e3a210be1 | ||
|
|
b8f9d982f5 | ||
|
|
7d7d843666 | ||
|
|
89bcc02a07 | ||
|
|
ad0210c535 | ||
|
|
cc2101d063 | ||
|
|
e2b62bc435 | ||
|
|
025e0e47ef | ||
|
|
15589485c5 | ||
|
|
ad5ff285a9 | ||
|
|
3806edc1bd | ||
|
|
20ba98e00d | ||
|
|
a74387be66 | ||
|
|
ee9ef3bf2d | ||
|
|
6d68cdf5c3 | ||
|
|
6757e547c5 | ||
|
|
3ff4ab2290 | ||
|
|
ae4d79d279 | ||
|
|
7403e85233 | ||
|
|
600a8dc1da | ||
|
|
9693a2b855 | ||
|
|
e8fcde50e3 | ||
|
|
234b53d0f8 | ||
|
|
8217165442 | ||
|
|
9c4601abec | ||
|
|
beccee2164 | ||
|
|
71f5c744db | ||
|
|
f9754d3459 | ||
|
|
d0015e0838 | ||
|
|
26ad9492b3 | ||
|
|
b5e209181e | ||
|
|
8a3cc6411e | ||
|
|
b68329f7ca | ||
|
|
712c544be6 | ||
|
|
9d498f676d | ||
|
|
da5f15a25b | ||
|
|
b0b434469e | ||
|
|
aec3294807 | ||
|
|
242728d6c1 | ||
|
|
a7973378ba | ||
|
|
3f971d931c | ||
|
|
c0290329cd | ||
|
|
99273f4b01 | ||
|
|
28101284a9 | ||
|
|
a18f7a7c7b | ||
|
|
afb504c11e | ||
|
|
e81626e34e | ||
|
|
916e53f845 | ||
|
|
363d297260 | ||
|
|
d9019a0b27 | ||
|
|
7a73c8a8a0 | ||
|
|
b5321041a1 | ||
|
|
1198a55d50 | ||
|
|
f9e3db512b | ||
|
|
8253a34883 | ||
|
|
796d182d89 | ||
|
|
0cadb8cfc8 | ||
|
|
59affc38a6 | ||
|
|
43f464b218 | ||
|
|
642f086b8c | ||
|
|
851d59a620 | ||
|
|
91d5e99158 | ||
|
|
3d08683d0f | ||
|
|
e859293674 | ||
|
|
d8c2f1c883 | ||
|
|
d9262c60f4 | ||
|
|
c7fb31ce5d | ||
|
|
58bd51e7e2 | ||
|
|
fcb51b1392 | ||
|
|
2d980558a6 | ||
|
|
d93d32547b | ||
|
|
94995fdd9f | ||
|
|
9cadfe6607 | ||
|
|
a729160dfa | ||
|
|
b8463053d4 | ||
|
|
b823b26a37 | ||
|
|
ed75963c0d | ||
|
|
6f8432330c | ||
|
|
9f7a3bb2ff | ||
|
|
4c7351d9b1 | ||
|
|
a6fab2192a | ||
|
|
5fcbd64986 | ||
|
|
77164aaa29 | ||
|
|
e2165619dd | ||
|
|
e3287d9699 | ||
|
|
27bb34c006 | ||
|
|
406dd87290 | ||
|
|
93c17cd0c4 | ||
|
|
0c5a22003b | ||
|
|
e2c803435c | ||
|
|
1a02e8bffe | ||
|
|
e58bbbcd8e | ||
|
|
bd004e0c12 | ||
|
|
74d3472e2f | ||
|
|
f7cc2e565a | ||
|
|
708f527ec7 | ||
|
|
f4a942254a | ||
|
|
4ddf2ce64f | ||
|
|
328d07a30d | ||
|
|
793f99d949 | ||
|
|
f4acf23374 | ||
|
|
0b05253dec | ||
|
|
a63262f4bd | ||
|
|
6a37389e28 | ||
|
|
05ec7e0ad1 | ||
|
|
2f8392387b | ||
|
|
50b1bec2d5 | ||
|
|
bc906488ae | ||
|
|
a9780f9102 | ||
|
|
4c4270d6c7 | ||
|
|
df7508db58 | ||
|
|
d9ea1b2453 | ||
|
|
eafc472b7e | ||
|
|
6237882055 | ||
|
|
0a3344c31f | ||
|
|
82826f24d5 | ||
|
|
9d172c0b37 | ||
|
|
ff50b29050 | ||
|
|
c3868e5e4c | ||
|
|
535efc1403 | ||
|
|
82d2352b19 | ||
|
|
be4fcdafb1 | ||
|
|
269b0bd877 | ||
|
|
802e1a7726 | ||
|
|
9d6fa7d77e | ||
|
|
ae5728bbb4 | ||
|
|
7c543db181 | ||
|
|
40ac4478fb | ||
|
|
9ab95dd2b5 | ||
|
|
2ab23aeb40 | ||
|
|
e79920c662 | ||
|
|
094794ac92 | ||
|
|
0b68dcfac8 | ||
|
|
670a4d942f | ||
|
|
93278d548b | ||
|
|
fc74d8c579 | ||
|
|
39ede95921 | ||
|
|
d7bcaf6cb4 | ||
|
|
2c749a814a | ||
|
|
5ffff0153c | ||
|
|
6d7a93f2b1 | ||
|
|
0fd24c75a1 | ||
|
|
c629019080 | ||
|
|
69dc655005 | ||
|
|
b44d4b4292 | ||
|
|
2ea9fd6c86 | ||
|
|
7a86ee0aef | ||
|
|
d45523639d | ||
|
|
87d6043788 | ||
|
|
c827474b58 | ||
|
|
f4e93df55e | ||
|
|
6f482708b5 | ||
|
|
2fe008b902 | ||
|
|
a1575d04ce | ||
|
|
f0725f7802 | ||
|
|
53464e8483 | ||
|
|
487844e533 | ||
|
|
5f5a77c342 | ||
|
|
118a6621f5 | ||
|
|
30999b868c | ||
|
|
e926ad0428 | ||
|
|
78bdf584e2 | ||
|
|
8d245e9f61 | ||
|
|
d2eca58996 | ||
|
|
e8988e9460 | ||
|
|
7787d2fbb5 | ||
|
|
e5e8e637db | ||
|
|
e4da3437d9 | ||
|
|
1e1af623b1 | ||
|
|
5abda9c7da | ||
|
|
8cc9bbc892 | ||
|
|
e3a5af6a99 | ||
|
|
24d0d4414f | ||
|
|
5c7cbebfee | ||
|
|
81d652543b | ||
|
|
aa685408a2 | ||
|
|
a4be9b236f | ||
|
|
d932f28209 | ||
|
|
9afd6bb2f4 | ||
|
|
0e8065cfee | ||
|
|
0dcb939247 | ||
|
|
197783be1e | ||
|
|
52b2c466c5 | ||
|
|
5b9873ff35 | ||
|
|
b31a2fb4b8 | ||
|
|
e32307e054 | ||
|
|
31bff4e093 | ||
|
|
2bbea50991 | ||
|
|
aa85da33a5 | ||
|
|
aa492fadab | ||
|
|
4740f211ae | ||
|
|
9e98c72ad3 | ||
|
|
4a88282a9c | ||
|
|
38f52a5bc8 | ||
|
|
58afeeff1d | ||
|
|
44725b88be | ||
|
|
83fbb0b536 | ||
|
|
c24e67fb53 | ||
|
|
8542682754 | ||
|
|
8ed0e1eba5 | ||
|
|
064fd59602 | ||
|
|
3f7f9d8fb8 | ||
|
|
b9baddfd5d | ||
|
|
068ec39aea | ||
|
|
5027375851 |
@@ -35,6 +35,9 @@ module.exports = {
|
||||
// Flow handles these checks for us, so they aren't required
|
||||
'no-undef': 'off',
|
||||
'no-unreachable': 'off',
|
||||
// Throwing from function or rejecting promises with non-error values could result in unclear error stack traces and lead to harder debugging
|
||||
'prefer-promise-reject-errors': 'error',
|
||||
'no-throw-literal': 'error',
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -98,4 +98,4 @@ untyped-import
|
||||
untyped-type-import
|
||||
|
||||
[version]
|
||||
^0.287.0
|
||||
^0.289.0
|
||||
|
||||
@@ -1,103 +0,0 @@
|
||||
name: build-apple-slices-hermes
|
||||
description: This action builds hermesc for Apple platforms
|
||||
inputs:
|
||||
hermes-version:
|
||||
required: true
|
||||
description: The version of Hermes
|
||||
react-native-version:
|
||||
required: true
|
||||
description: The version of Hermes
|
||||
slice:
|
||||
required: true
|
||||
description: The slice of hermes you want to build. It could be iphone, iphonesimulator, macos, catalyst, appletvos, appletvsimulator, xros, or xrossimulator
|
||||
flavor:
|
||||
required: true
|
||||
description: The flavor we want to build. It can be Debug or Release
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
- name: Restore Hermes workspace
|
||||
uses: ./.github/actions/restore-hermes-workspace
|
||||
- name: Restore HermesC Artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermesc-apple
|
||||
path: ./packages/react-native/sdks/hermes/build_host_hermesc
|
||||
- name: Restore Slice From Cache
|
||||
id: restore-slice-cache
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/build_${{ inputs.slice }}_${{ inputs.flavor }}
|
||||
key: v6-hermes-apple-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ inputs.slice }}-${{ inputs.flavor }}
|
||||
- name: Build the Hermes ${{ inputs.slice }} frameworks
|
||||
shell: bash
|
||||
run: |
|
||||
cd ./packages/react-native/sdks/hermes || exit 1
|
||||
SLICE=${{ inputs.slice }}
|
||||
FLAVOR=${{ inputs.flavor }}
|
||||
FINAL_PATH=build_"$SLICE"_"$FLAVOR"
|
||||
echo "Final path for this slice is: $FINAL_PATH"
|
||||
|
||||
if [[ -d "$FINAL_PATH" ]]; then
|
||||
echo "[HERMES] Skipping! Found the requested slice at $FINAL_PATH".
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "$ARTIFACTS_EXIST" ]]; then
|
||||
echo "[HERMES] Skipping! Artifacts exists already."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
export RELEASE_VERSION=${{ inputs.react-native-version }}
|
||||
|
||||
# HermesC is used to build hermes, so it has to be executable
|
||||
chmod +x ./build_host_hermesc/bin/hermesc
|
||||
|
||||
if [[ "$SLICE" == "macosx" ]]; then
|
||||
echo "[HERMES] Building Hermes for MacOS"
|
||||
|
||||
chmod +x ./utils/build-mac-framework.sh
|
||||
BUILD_TYPE="${{ inputs.flavor }}" ./utils/build-mac-framework.sh
|
||||
else
|
||||
echo "[HERMES] Building Hermes for iOS: $SLICE"
|
||||
|
||||
chmod +x ./utils/build-ios-framework.sh
|
||||
BUILD_TYPE="${{ inputs.flavor }}" ./utils/build-ios-framework.sh "$SLICE"
|
||||
fi
|
||||
|
||||
echo "Moving from build_$SLICE to $FINAL_PATH"
|
||||
mv build_"$SLICE" "$FINAL_PATH"
|
||||
|
||||
# check whether everything is there
|
||||
if [[ -d "$FINAL_PATH/lib/hermesvm.framework" ]]; then
|
||||
echo "Successfully built hermesvm.framework for $SLICE in $FLAVOR"
|
||||
else
|
||||
echo "Failed to built hermesvm.framework for $SLICE in $FLAVOR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -d "$FINAL_PATH/lib/hermesvm.framework.dSYM" ]]; then
|
||||
echo "Successfully built hermesvm.framework.dSYM for $SLICE in $FLAVOR"
|
||||
else
|
||||
echo "Failed to built hermesvm.framework.dSYM for $SLICE in $FLAVOR"
|
||||
echo "Please try again"
|
||||
exit 1
|
||||
fi
|
||||
- name: Compress slices to preserve Symlinks
|
||||
shell: bash
|
||||
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 (${{ inputs.slice }}, ${{ inputs.flavor }}}
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: slice-${{ inputs.slice }}-${{ inputs.flavor }}
|
||||
path: ./packages/react-native/sdks/hermes/build_${{ inputs.slice }}_${{ inputs.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
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/build_${{ inputs.slice }}_${{ inputs.flavor }}
|
||||
key: v6-hermes-apple-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}-${{ hashfiles('packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}-${{ inputs.SLICE }}-${{ inputs.FLAVOR }}
|
||||
@@ -1,227 +0,0 @@
|
||||
name: build-hermes-macos
|
||||
description: This action builds hermesc for Apple platforms
|
||||
inputs:
|
||||
hermes-version:
|
||||
required: true
|
||||
description: The version of Hermes
|
||||
react-native-version:
|
||||
required: true
|
||||
description: The version of React Native
|
||||
flavor:
|
||||
required: true
|
||||
description: The flavor we want to build. It can be Debug or Release
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
- name: Restore Hermes workspace
|
||||
uses: ./.github/actions/restore-hermes-workspace
|
||||
- name: Restore Cached Artifacts
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
key: v4-hermes-artifacts-${{ inputs.flavor }}-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}-${{ hashFiles('./packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}
|
||||
path: |
|
||||
/tmp/hermes/osx-bin/${{ inputs.flavor }}
|
||||
/tmp/hermes/dSYM/${{ inputs.flavor }}
|
||||
/tmp/hermes/hermes-runtime-darwin/hermes-ios-${{ inputs.flavor }}.tar.gz
|
||||
- name: Check if the required artifacts already exist
|
||||
id: check_if_apple_artifacts_are_there
|
||||
shell: bash
|
||||
run: |
|
||||
FLAVOR="${{ inputs.flavor }}"
|
||||
echo "Flavor is $FLAVOR"
|
||||
OSX_BIN="/tmp/hermes/osx-bin/$FLAVOR"
|
||||
DSYM="/tmp/hermes/dSYM/$FLAVOR"
|
||||
HERMES="/tmp/hermes/hermes-runtime-darwin/hermes-ios-$FLAVOR.tar.gz"
|
||||
|
||||
if [[ -d "$OSX_BIN" ]] && \
|
||||
[[ -d "$DSYM" ]] && \
|
||||
[[ -f "$HERMES" ]]; then
|
||||
|
||||
echo "Artifacts are there!"
|
||||
echo "ARTIFACTS_EXIST=true" >> $GITHUB_ENV
|
||||
echo "ARTIFACTS_EXIST=true" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
- name: Setup node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Yarn- Install Dependencies
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Slice cache macosx
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/
|
||||
name: slice-macosx-${{ inputs.flavor }}
|
||||
- name: Slice cache iphoneos
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/
|
||||
name: slice-iphoneos-${{ inputs.flavor }}
|
||||
- name: Slice cache iphonesimulator
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/
|
||||
name: slice-iphonesimulator-${{ inputs.flavor }}
|
||||
- name: Slice cache appletvos
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/
|
||||
name: slice-appletvos-${{ inputs.flavor }}
|
||||
- name: Slice cache appletvsimulator
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/
|
||||
name: slice-appletvsimulator-${{ inputs.flavor }}
|
||||
- name: Slice cache catalyst
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/
|
||||
name: slice-catalyst-${{ inputs.flavor }}
|
||||
- name: Slice cache xros
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/
|
||||
name: slice-xros-${{ inputs.flavor }}
|
||||
- name: Slice cache xrsimulator
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/
|
||||
name: slice-xrsimulator-${{ inputs.flavor }}
|
||||
- name: Unzip slices
|
||||
shell: bash
|
||||
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_appletvos_${{ matrix.flavor }}.tar.gz
|
||||
tar -xzv -f build_appletvsimulator_${{ 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' }}
|
||||
shell: bash
|
||||
run: |
|
||||
ls -l ./packages/react-native/sdks/hermes
|
||||
cd ./packages/react-native/sdks/hermes || exit 1
|
||||
mv build_macosx_${{ inputs.flavor }} build_macosx
|
||||
mv build_iphoneos_${{ inputs.flavor }} build_iphoneos
|
||||
mv build_iphonesimulator_${{ inputs.flavor }} build_iphonesimulator
|
||||
mv build_appletvos_${{ inputs.flavor }} build_appletvos
|
||||
mv build_appletvsimulator_${{ inputs.flavor }} build_appletvsimulator
|
||||
mv build_catalyst_${{ inputs.flavor }} build_catalyst
|
||||
mv build_xros_${{ inputs.flavor }} build_xros
|
||||
mv build_xrsimulator_${{ inputs.flavor }} build_xrsimulator
|
||||
- name: Prepare destroot folder
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd ./packages/react-native/sdks/hermes || exit 1
|
||||
chmod +x ./utils/build-apple-framework.sh
|
||||
. ./utils/build-apple-framework.sh
|
||||
prepare_dest_root_for_ci
|
||||
- name: Create fat framework for iOS
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd ./packages/react-native/sdks/hermes || exit 1
|
||||
echo "[HERMES] Creating the universal framework"
|
||||
chmod +x ./utils/build-ios-framework.sh
|
||||
./utils/build-ios-framework.sh build_framework
|
||||
|
||||
chmod +x ./destroot/bin/hermesc
|
||||
- name: Package the Hermes Apple frameworks
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
BUILD_TYPE="${{ inputs.flavor }}"
|
||||
echo "Packaging Hermes Apple frameworks for $BUILD_TYPE build type"
|
||||
|
||||
TARBALL_OUTPUT_DIR=$(mktemp -d /tmp/hermes-tarball-output-XXXXXXXX)
|
||||
|
||||
TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "$BUILD_TYPE")
|
||||
|
||||
echo "Packaging Hermes Apple frameworks for $BUILD_TYPE build type"
|
||||
|
||||
TARBALL_OUTPUT_PATH=$(node ./packages/react-native/scripts/hermes/create-tarball.js \
|
||||
--inputDir ./packages/react-native/sdks/hermes \
|
||||
--buildType "$BUILD_TYPE" \
|
||||
--outputDir $TARBALL_OUTPUT_DIR)
|
||||
|
||||
echo "Hermes tarball saved to $TARBALL_OUTPUT_PATH"
|
||||
|
||||
mkdir -p $HERMES_TARBALL_ARTIFACTS_DIR
|
||||
cp $TARBALL_OUTPUT_PATH $HERMES_TARBALL_ARTIFACTS_DIR/.
|
||||
|
||||
mkdir -p /tmp/hermes/osx-bin/${{ inputs.flavor }}
|
||||
cp ./packages/react-native/sdks/hermes/build_macosx/bin/* /tmp/hermes/osx-bin/${{ inputs.flavor }}
|
||||
ls -lR /tmp/hermes/osx-bin/
|
||||
- name: Create dSYM archive
|
||||
if: ${{ steps.check_if_apple_artifacts_are_there.outputs.ARTIFACTS_EXIST != 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
FLAVOR=${{ inputs.flavor }}
|
||||
WORKING_DIR="/tmp/hermes_tmp/dSYM/$FLAVOR"
|
||||
|
||||
mkdir -p "$WORKING_DIR/macosx"
|
||||
mkdir -p "$WORKING_DIR/catalyst"
|
||||
mkdir -p "$WORKING_DIR/iphoneos"
|
||||
mkdir -p "$WORKING_DIR/iphonesimulator"
|
||||
mkdir -p "$WORKING_DIR/appletvos"
|
||||
mkdir -p "$WORKING_DIR/appletvsimulator"
|
||||
mkdir -p "$WORKING_DIR/xros"
|
||||
mkdir -p "$WORKING_DIR/xrsimulator"
|
||||
|
||||
cd ./packages/react-native/sdks/hermes || exit 1
|
||||
|
||||
DSYM_FILE_PATH=lib/hermesvm.framework.dSYM
|
||||
cp -r build_macosx/$DSYM_FILE_PATH "$WORKING_DIR/macosx/"
|
||||
cp -r build_catalyst/$DSYM_FILE_PATH "$WORKING_DIR/catalyst/"
|
||||
cp -r build_iphoneos/$DSYM_FILE_PATH "$WORKING_DIR/iphoneos/"
|
||||
cp -r build_iphonesimulator/$DSYM_FILE_PATH "$WORKING_DIR/iphonesimulator/"
|
||||
cp -r build_appletvos/$DSYM_FILE_PATH "$WORKING_DIR/appletvos/"
|
||||
cp -r build_appletvsimulator/$DSYM_FILE_PATH "$WORKING_DIR/appletvsimulator/"
|
||||
cp -r build_xros/$DSYM_FILE_PATH "$WORKING_DIR/xros/"
|
||||
cp -r build_xrsimulator/$DSYM_FILE_PATH "$WORKING_DIR/xrsimulator/"
|
||||
|
||||
DEST_DIR="/tmp/hermes/dSYM/$FLAVOR"
|
||||
tar -C "$WORKING_DIR" -czvf "hermesvm.framework.dSYM" .
|
||||
|
||||
mkdir -p "$DEST_DIR"
|
||||
mv "hermesvm.framework.dSYM" "$DEST_DIR"
|
||||
- name: Upload hermes dSYM artifacts
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: hermes-dSYM-${{ inputs.flavor }}
|
||||
path: /tmp/hermes/dSYM/${{ inputs.flavor }}
|
||||
- name: Upload hermes Runtime artifacts
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: hermes-darwin-bin-${{ inputs.flavor }}
|
||||
path: /tmp/hermes/hermes-runtime-darwin/hermes-ios-${{ inputs.flavor }}.tar.gz
|
||||
- name: Upload hermes osx artifacts
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: hermes-osx-bin-${{ inputs.flavor }}
|
||||
path: /tmp/hermes/osx-bin/${{ inputs.flavor }}
|
||||
- name: Upload Hermes Artifacts
|
||||
uses: actions/cache/save@v4
|
||||
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode.
|
||||
with:
|
||||
key: v4-hermes-artifacts-${{ inputs.flavor }}-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}-${{ hashFiles('./packages/react-native/sdks/hermes-engine/utils/build-apple-framework.sh') }}
|
||||
path: |
|
||||
/tmp/hermes/osx-bin/${{ inputs.flavor }}
|
||||
/tmp/hermes/dSYM/${{ inputs.flavor }}
|
||||
/tmp/hermes/hermes-runtime-darwin/hermes-ios-${{ inputs.flavor }}.tar.gz
|
||||
@@ -1,39 +0,0 @@
|
||||
name: build-hermesc-apple
|
||||
description: This action builds hermesc for Apple platforms
|
||||
inputs:
|
||||
hermes-version:
|
||||
required: true
|
||||
description: The version of Hermes
|
||||
react-native-version:
|
||||
required: true
|
||||
description: The version of React Native
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
- name: Restore Hermes workspace
|
||||
uses: ./.github/actions/restore-hermes-workspace
|
||||
- name: Hermes apple cache
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/build_host_hermesc
|
||||
key: v2-hermesc-apple-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}
|
||||
- name: Build HermesC Apple
|
||||
shell: bash
|
||||
run: |
|
||||
cd ./packages/react-native/sdks/hermes || exit 1
|
||||
. ./utils/build-apple-framework.sh
|
||||
build_host_hermesc_if_needed
|
||||
- name: Upload HermesC Artifact
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: hermesc-apple
|
||||
path: ./packages/react-native/sdks/hermes/build_host_hermesc
|
||||
- name: Cache hermesc apple
|
||||
uses: actions/cache/save@v4
|
||||
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, '-stable') }} # To avoid that the cache explode.
|
||||
with:
|
||||
path: ./packages/react-native/sdks/hermes/build_host_hermesc
|
||||
key: v2-hermesc-apple-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}
|
||||
enableCrossOsArchive: true
|
||||
@@ -1,53 +0,0 @@
|
||||
name: build-hermesc-linux
|
||||
description: This action builds hermesc for linux platforms
|
||||
inputs:
|
||||
hermes-version:
|
||||
required: True
|
||||
description: The version of Hermes
|
||||
react-native-version:
|
||||
required: True
|
||||
description: The version of React Native
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install -y git openssh-client build-essential \
|
||||
libreadline-dev libicu-dev jq zip python3
|
||||
|
||||
# Install cmake 3.28.3-1build7
|
||||
sudo apt-get install cmake=3.28.3-1build7
|
||||
sudo ln -sf /usr/bin/cmake /usr/local/bin/cmake
|
||||
- name: Restore Hermes workspace
|
||||
uses: ./.github/actions/restore-hermes-workspace
|
||||
- name: Linux cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: v1-hermes-${{ github.job }}-linux-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}
|
||||
path: |
|
||||
/tmp/hermes/linux64-bin/
|
||||
/tmp/hermes/hermes/destroot/
|
||||
- name: Set up workspace
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p /tmp/hermes/linux64-bin
|
||||
- name: Build HermesC for Linux
|
||||
shell: bash
|
||||
run: |
|
||||
if [ -f /tmp/hermes/linux64-bin/hermesc ]; then
|
||||
echo 'Skipping; Clean "/tmp/hermes/linux64-bin" to rebuild.'
|
||||
else
|
||||
cd /tmp/hermes
|
||||
cmake -S hermes -B build -DHERMES_STATIC_LINK=ON -DCMAKE_BUILD_TYPE=Release -DHERMES_ENABLE_TEST_SUITE=OFF \
|
||||
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=True -DCMAKE_CXX_FLAGS=-s -DCMAKE_C_FLAGS=-s \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="-Wl,--whole-archive -lpthread -Wl,--no-whole-archive"
|
||||
cmake --build build --target hermesc -j 4
|
||||
cp /tmp/hermes/build/bin/hermesc /tmp/hermes/linux64-bin/.
|
||||
fi
|
||||
- name: Upload linux artifacts
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: hermes-linux-bin
|
||||
path: /tmp/hermes/linux64-bin
|
||||
@@ -1,86 +0,0 @@
|
||||
name: build-hermesc-windows
|
||||
description: This action builds hermesc for Windows platforms
|
||||
inputs:
|
||||
hermes-version:
|
||||
required: True
|
||||
description: The version of Hermes
|
||||
react-native-version:
|
||||
required: True
|
||||
description: The version of React Native
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Download Previous Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-workspace
|
||||
path: 'C:\tmp\hermes'
|
||||
- name: Set up workspace
|
||||
shell: powershell
|
||||
run: |
|
||||
mkdir -p C:\tmp\hermes\osx-bin
|
||||
mkdir -p .\packages\react-native\sdks\hermes
|
||||
cp -r -Force C:\tmp\hermes\hermes\* .\packages\react-native\sdks\hermes\.
|
||||
cp -r -Force .\packages\react-native\sdks\hermes-engine\utils\* .\packages\react-native\sdks\hermes\.
|
||||
- name: Windows cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: v3-hermes-${{ github.job }}-windows-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}
|
||||
path: |
|
||||
C:\tmp\hermes\win64-bin\
|
||||
C:\tmp\hermes\hermes\icu\
|
||||
C:\tmp\hermes\hermes\deps\
|
||||
C:\tmp\hermes\hermes\build_release\
|
||||
- name: setup-msbuild
|
||||
uses: microsoft/setup-msbuild@v1.3.2
|
||||
- name: Set up workspace
|
||||
shell: powershell
|
||||
run: |
|
||||
New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\icu
|
||||
New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\deps
|
||||
New-Item -ItemType Directory -ErrorAction SilentlyContinue $Env:HERMES_WS_DIR\win64-bin
|
||||
- name: Downgrade CMake
|
||||
shell: powershell
|
||||
run: choco install cmake --version 3.31.6 --force
|
||||
- name: Build HermesC for Windows
|
||||
shell: powershell
|
||||
run: |
|
||||
if (-not(Test-Path -Path $Env:HERMES_WS_DIR\win64-bin\hermesc.exe)) {
|
||||
cd $Env:HERMES_WS_DIR\icu
|
||||
# If Invoke-WebRequest shows a progress bar, it will fail with
|
||||
# Win32 internal error "Access is denied" 0x5 occurred [...]
|
||||
$progressPreference = 'silentlyContinue'
|
||||
Invoke-WebRequest -Uri "$Env:ICU_URL" -OutFile "icu.zip"
|
||||
Expand-Archive -Path "icu.zip" -DestinationPath "."
|
||||
|
||||
cd $Env:HERMES_WS_DIR
|
||||
Copy-Item -Path "icu\bin64\icu*.dll" -Destination "deps"
|
||||
# Include MSVC++ 2015 redistributables
|
||||
Copy-Item -Path "c:\windows\system32\msvcp140.dll" -Destination "deps"
|
||||
Copy-Item -Path "c:\windows\system32\vcruntime140.dll" -Destination "deps"
|
||||
Copy-Item -Path "c:\windows\system32\vcruntime140_1.dll" -Destination "deps"
|
||||
|
||||
$Env:PATH += ";$Env:CMAKE_DIR;$Env:MSBUILD_DIR"
|
||||
$Env:ICU_ROOT = "$Env:HERMES_WS_DIR\icu"
|
||||
|
||||
cmake -S hermes -B build_release -G 'Visual Studio 17 2022' -Ax64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=True -DHERMES_ENABLE_WIN10_ICU_FALLBACK=OFF
|
||||
if (-not $?) { throw "Failed to configure Hermes" }
|
||||
echo "Running windows build..."
|
||||
cd build_release
|
||||
cmake --build . --target hermesc --config Release
|
||||
if (-not $?) { throw "Failed to build Hermes" }
|
||||
|
||||
echo "Copying hermesc.exe to win64-bin"
|
||||
cd $Env:HERMES_WS_DIR
|
||||
Copy-Item -Path "build_release\bin\Release\hermesc.exe" -Destination "win64-bin"
|
||||
# Include Windows runtime dependencies
|
||||
Copy-Item -Path "deps\*" -Destination "win64-bin"
|
||||
}
|
||||
else {
|
||||
Write-Host "Skipping; Clean c:\tmp\hermes\win64-bin to rebuild."
|
||||
}
|
||||
- name: Upload windows artifacts
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: hermes-win64-bin
|
||||
path: C:\tmp\hermes\win64-bin\
|
||||
@@ -4,9 +4,6 @@ inputs:
|
||||
release-type:
|
||||
required: true
|
||||
description: The type of release we are building. It could be nightly, release or dry-run
|
||||
hermes-ws-dir:
|
||||
required: 'true'
|
||||
description: The workspace for hermes
|
||||
gha-npm-token:
|
||||
required: false
|
||||
description: The GHA npm token, required only to publish to npm
|
||||
@@ -20,87 +17,6 @@ runs:
|
||||
- name: Setup git safe folders
|
||||
shell: bash
|
||||
run: git config --global --add safe.directory '*'
|
||||
- name: Create /tmp/hermes/osx-bin directory
|
||||
shell: bash
|
||||
run: mkdir -p /tmp/hermes/osx-bin
|
||||
- name: Download osx-bin release artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-osx-bin-Release
|
||||
path: /tmp/hermes/osx-bin/Release
|
||||
- name: Download osx-bin debug artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-osx-bin-Debug
|
||||
path: /tmp/hermes/osx-bin/Debug
|
||||
- name: Download darwin-bin release artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-darwin-bin-Release
|
||||
path: /tmp/hermes/hermes-runtime-darwin
|
||||
- name: Download darwin-bin debug artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-darwin-bin-Debug
|
||||
path: /tmp/hermes/hermes-runtime-darwin
|
||||
- name: Download hermes dSYM debug artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-dSYM-Debug
|
||||
path: /tmp/hermes/dSYM/Debug
|
||||
- name: Download hermes dSYM release vartifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-dSYM-Release
|
||||
path: /tmp/hermes/dSYM/Release
|
||||
- name: Download windows-bin artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-win64-bin
|
||||
path: /tmp/hermes/win64-bin
|
||||
- name: Download linux-bin artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-linux-bin
|
||||
path: /tmp/hermes/linux64-bin
|
||||
- name: Show /tmp/hermes directory
|
||||
shell: bash
|
||||
run: ls -lR /tmp/hermes
|
||||
- name: Copy Hermes binaries
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p ./packages/react-native/sdks/hermesc ./packages/react-native/sdks/hermesc/osx-bin ./packages/react-native/sdks/hermesc/win64-bin ./packages/react-native/sdks/hermesc/linux64-bin
|
||||
|
||||
# When build_hermes_macos runs as a matrix, it outputs
|
||||
if [[ -d ${{ inputs.hermes-ws-dir }}/osx-bin/Release ]]; then
|
||||
cp -r ${{ inputs.hermes-ws-dir }}/osx-bin/Release/* ./packages/react-native/sdks/hermesc/osx-bin/.
|
||||
elif [[ -d ${{ inputs.hermes-ws-dir }}/osx-bin/Debug ]]; then
|
||||
cp -r ${{ inputs.hermes-ws-dir }}/osx-bin/Debug/* ./packages/react-native/sdks/hermesc/osx-bin/.
|
||||
else
|
||||
ls ${{ inputs.hermes-ws-dir }}/osx-bin || echo "hermesc macOS artifacts directory missing."
|
||||
echo "Could not locate macOS hermesc binary."; exit 1;
|
||||
fi
|
||||
|
||||
# Sometimes, GHA creates artifacts with lowercase Debug/Release. Make sure that if it happen, we uppercase them.
|
||||
if [[ -f "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-debug.tar.gz" ]]; then
|
||||
mv "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-debug.tar.gz" "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-Debug.tar.gz"
|
||||
fi
|
||||
|
||||
if [[ -f "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-release.tar.gz" ]]; then
|
||||
mv "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-release.tar.gz" "${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-Release.tar.gz"
|
||||
fi
|
||||
|
||||
cp -r ${{ inputs.hermes-ws-dir }}/win64-bin/* ./packages/react-native/sdks/hermesc/win64-bin/.
|
||||
cp -r ${{ inputs.hermes-ws-dir }}/linux64-bin/* ./packages/react-native/sdks/hermesc/linux64-bin/.
|
||||
|
||||
# Make sure the hermesc files are actually executable.
|
||||
chmod -R +x packages/react-native/sdks/hermesc/*
|
||||
|
||||
mkdir -p ./packages/react-native/ReactAndroid/external-artifacts/artifacts/
|
||||
cp ${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-Debug.tar.gz ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-ios-debug.tar.gz
|
||||
cp ${{ inputs.hermes-ws-dir }}/hermes-runtime-darwin/hermes-ios-Release.tar.gz ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-ios-release.tar.gz
|
||||
cp ${{ inputs.hermes-ws-dir }}/dSYM/Debug/hermesvm.framework.dSYM ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-framework-dSYM-debug.tar.gz
|
||||
cp ${{ inputs.hermes-ws-dir }}/dSYM/Release/hermesvm.framework.dSYM ./packages/react-native/ReactAndroid/external-artifacts/artifacts/hermes-framework-dSYM-release.tar.gz
|
||||
- name: Download ReactNativeDependencies
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
name: prepare-hermes-workspace
|
||||
description: This action prepares the hermes workspace with the right hermes and react-native versions.
|
||||
inputs:
|
||||
hermes-ws-dir:
|
||||
required: true
|
||||
description: The hermes dir we need to use to setup the workspace
|
||||
hermes-version-file:
|
||||
required: true
|
||||
description: the path to the file that will contain the hermes version
|
||||
outputs:
|
||||
hermes-version:
|
||||
description: the version of Hermes tied to this run
|
||||
value: ${{ steps.hermes-version.outputs.VERSION }}
|
||||
react-native-version:
|
||||
description: the version of React Native tied to this run
|
||||
value: ${{ steps.react-native-version.outputs.VERSION }}
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Setup hermes version
|
||||
shell: bash
|
||||
id: hermes-version
|
||||
run: |
|
||||
mkdir -p "/tmp/hermes" "/tmp/hermes/download" "/tmp/hermes/hermes"
|
||||
|
||||
if [ -f "${{ inputs.hermes-version-file }}" ]; then
|
||||
echo "Hermes Version file found! Using this version for the build:"
|
||||
echo "VERSION=$(cat ${{ inputs.hermes-version-file }})" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "Hermes Version file not found!!!"
|
||||
echo "Using the last commit from main for the build:"
|
||||
HERMES_TAG_SHA=$(git ls-remote https://github.com/facebook/hermes main | cut -f 1 | tr -d '[:space:]')
|
||||
echo "VERSION=$HERMES_TAG_SHA" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
echo "Hermes commit is $HERMES_TAG_SHA"
|
||||
|
||||
- name: Get react-native version
|
||||
shell: bash
|
||||
id: react-native-version
|
||||
run: |
|
||||
VERSION=$(cat packages/react-native/package.json | jq -r '.version')
|
||||
# Save the react native version we are building in an output variable so we can use that file as part of the cache key.
|
||||
echo "VERSION=$VERSION" >> "$GITHUB_OUTPUT"
|
||||
echo "React Native Version is $VERSION"
|
||||
|
||||
- name: Cache hermes workspace
|
||||
id: restore-hermes
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: |
|
||||
/tmp/hermes/download/
|
||||
/tmp/hermes/hermes/
|
||||
key: v1-hermes-${{ steps.hermes-version.outputs.version }}
|
||||
enableCrossOsArchive: true
|
||||
|
||||
# It happened while testing that a cache was created from the right folders
|
||||
# but those folders where empty. Thus, the next check ensures that we can work with those caches.
|
||||
- name: Check if cache was meaningful
|
||||
id: meaningful-cache
|
||||
shell: bash
|
||||
run: |
|
||||
if [[ -d /tmp/hermes/hermes ]] && [[ -n "$(ls -A /tmp/hermes/hermes)" ]]; then
|
||||
echo "Found a good hermes cache"
|
||||
echo "HERMES_CACHED=true" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
- name: Setup node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Yarn- Install Dependencies
|
||||
if: ${{ steps.meaningful-cache.outputs.HERMES_CACHED != 'true' }}
|
||||
uses: ./.github/actions/yarn-install
|
||||
|
||||
- name: Download Hermes tarball
|
||||
if: ${{ steps.meaningful-cache.outputs.HERMES_CACHED != 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
node packages/react-native/scripts/hermes/prepare-hermes-for-build ${{ github.event.pull_request.html_url }}
|
||||
cp packages/react-native/sdks/download/* ${{ inputs.hermes-ws-dir }}/download/.
|
||||
cp -r packages/react-native/sdks/hermes/* ${{ inputs.hermes-ws-dir }}/hermes/.
|
||||
|
||||
echo ${{ steps.hermes-version.outputs.version }}
|
||||
|
||||
- name: Upload Hermes artifact
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: hermes-workspace
|
||||
path: |
|
||||
/tmp/hermes/download/
|
||||
/tmp/hermes/hermes/
|
||||
|
||||
- name: Cache hermes workspace
|
||||
uses: actions/cache/save@v4
|
||||
if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode.
|
||||
with:
|
||||
path: |
|
||||
/tmp/hermes/download/
|
||||
/tmp/hermes/hermes/
|
||||
key: v1-hermes-${{ steps.hermes-version.outputs.version }}
|
||||
enableCrossOsArchive: true
|
||||
@@ -1,16 +0,0 @@
|
||||
name: restore-hermes-workspace
|
||||
description: "Restore hermes workspace that has been created in Prepare Hermes Workspace"
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Download Previous Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-workspace
|
||||
path: /tmp/hermes
|
||||
- name: Set up workspace
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p $HERMES_OSXBIN_ARTIFACTS_DIR ./packages/react-native/sdks/hermes
|
||||
cp -r $HERMES_WS_DIR/hermes/* ./packages/react-native/sdks/hermes/.
|
||||
cp -r ./packages/react-native/sdks/hermes-engine/utils ./packages/react-native/sdks/hermes/.
|
||||
@@ -5,6 +5,10 @@ inputs:
|
||||
description: 'The xcode version to use'
|
||||
required: false
|
||||
default: '16.2.0'
|
||||
platform:
|
||||
description: 'The platform to use. Valid values are: ios, ios-simulator, macos, mac-catalyst, tvos, tvos-simulator, xros, xros-simulator'
|
||||
required: false
|
||||
default: 'macos'
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
@@ -12,3 +16,21 @@ runs:
|
||||
uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd
|
||||
with:
|
||||
xcode-version: ${{ inputs.xcode-version }}
|
||||
- name: Setup Platform ${{ inputs.platform }}
|
||||
if: ${{ inputs.platform != 'macos' && inputs.platform != 'mac-catalyst' }}
|
||||
shell: bash
|
||||
run: |
|
||||
# https://github.com/actions/runner-images/issues/12541
|
||||
sudo xcodebuild -runFirstLaunch
|
||||
sudo xcrun simctl list
|
||||
|
||||
# Install platform based on the platform
|
||||
if [[ "${{ inputs.platform }}" == "xros" || "${{ inputs.platform }}" == "xros-simulator" ]]; then
|
||||
sudo xcodebuild -downloadPlatform visionOS
|
||||
elif [[ "${{ inputs.platform }}" == "tvos" || "${{ inputs.platform }}" == "tvos-simulator" ]]; then
|
||||
sudo xcodebuild -downloadPlatform tvOS
|
||||
else
|
||||
sudo xcodebuild -downloadPlatform iOS
|
||||
fi
|
||||
|
||||
sudo xcodebuild -runFirstLaunch
|
||||
|
||||
@@ -10,36 +10,27 @@ inputs:
|
||||
flavor:
|
||||
description: The flavor of the build. Must be one of "Debug", "Release".
|
||||
default: Debug
|
||||
hermes-version:
|
||||
description: The version of hermes
|
||||
required: true
|
||||
react-native-version:
|
||||
description: The version of react-native
|
||||
required: true
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
platform: ios
|
||||
- name: Setup node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Run yarn install
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Create Hermes folder
|
||||
shell: bash
|
||||
run: mkdir -p "$HERMES_WS_DIR"
|
||||
- name: Download Hermes
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-darwin-bin-${{ inputs.flavor }}
|
||||
path: /tmp/hermes/hermes-runtime-darwin/
|
||||
- name: Print Downloaded hermes
|
||||
shell: bash
|
||||
run: ls -lR "$HERMES_WS_DIR"
|
||||
- name: Setup ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: ${{ inputs.ruby-version }}
|
||||
- name: Set nightly Hermes versions
|
||||
shell: bash
|
||||
run: |
|
||||
node ./scripts/releases/use-hermes-nightly.js
|
||||
- name: Run yarn install again, with the correct hermes version
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Download ReactNativeDependencies
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
@@ -66,20 +57,6 @@ runs:
|
||||
args+=(--frameworks dynamic)
|
||||
fi
|
||||
|
||||
# Tarball is restored with capital flavors suffix, but somehow the tarball name from JS at line 96 returns as lowercased.
|
||||
# Let's ensure that the tarballs have the right names
|
||||
|
||||
if [[ -f "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Debug.tar.gz" ]]; then
|
||||
mv "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Debug.tar.gz" "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-debug.tar.gz"
|
||||
fi
|
||||
|
||||
if [[ -f "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Release.tar.gz" ]]; then
|
||||
mv "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-Release.tar.gz" "$HERMES_WS_DIR/hermes-runtime-darwin/hermes-ios-release.tar.gz"
|
||||
fi
|
||||
|
||||
BUILD_TYPE="${{ inputs.flavor }}"
|
||||
TARBALL_FILENAME=$(node ../../packages/react-native/scripts/hermes/get-tarball-name.js --buildType "$BUILD_TYPE")
|
||||
export HERMES_ENGINE_TARBALL_PATH="$HERMES_WS_DIR/hermes-runtime-darwin/$TARBALL_FILENAME"
|
||||
export RCT_USE_LOCAL_RN_DEP="/tmp/third-party/ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
|
||||
|
||||
@@ -10,18 +10,9 @@ inputs:
|
||||
run-unit-tests:
|
||||
description: whether unit tests should run or not.
|
||||
default: "false"
|
||||
hermes-tarball-artifacts-dir:
|
||||
description: The directory where the hermes tarball artifacts are stored
|
||||
default: /tmp/hermes/hermes-runtime-darwin
|
||||
flavor:
|
||||
description: The flavor of the build. Must be one of "Debug", "Release".
|
||||
default: Debug
|
||||
hermes-version:
|
||||
description: The version of hermes
|
||||
required: true
|
||||
react-native-version:
|
||||
description: The version of react-native
|
||||
required: true
|
||||
run-e2e-tests:
|
||||
description: Whether we want to run E2E tests or not
|
||||
required: false
|
||||
@@ -32,60 +23,25 @@ runs:
|
||||
steps:
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
platform: ios
|
||||
- name: Setup node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Run yarn
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Download Hermes
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-darwin-bin-${{ inputs.flavor }}
|
||||
path: ${{ inputs.hermes-tarball-artifacts-dir }}
|
||||
- name: Setup ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: ${{ inputs.ruby-version }}
|
||||
- name: Set nightly Hermes versions
|
||||
shell: bash
|
||||
run: |
|
||||
node ./scripts/releases/use-hermes-nightly.js
|
||||
- name: Run yarn install again, with the correct hermes version
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Prepare IOS Tests
|
||||
if: ${{ inputs.run-unit-tests == 'true' }}
|
||||
uses: ./.github/actions/prepare-ios-tests
|
||||
- name: Set HERMES_ENGINE_TARBALL_PATH envvar if Hermes tarball is present
|
||||
shell: bash
|
||||
run: |
|
||||
HERMES_TARBALL_ARTIFACTS_DIR=${{ inputs.hermes-tarball-artifacts-dir }}
|
||||
if [ ! -d $HERMES_TARBALL_ARTIFACTS_DIR ]; then
|
||||
echo "Hermes tarball artifacts dir not present ($HERMES_TARBALL_ARTIFACTS_DIR). Build Hermes from source."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "${{ inputs.flavor }}")
|
||||
TARBALL_PATH=$HERMES_TARBALL_ARTIFACTS_DIR/$TARBALL_FILENAME
|
||||
|
||||
echo "Looking for $TARBALL_FILENAME in $HERMES_TARBALL_ARTIFACTS_DIR"
|
||||
echo "$TARBALL_PATH"
|
||||
|
||||
if [ ! -f $TARBALL_PATH ]; then
|
||||
echo "Hermes tarball not present ($TARBALL_PATH). Build Hermes from source."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Found Hermes tarball at $TARBALL_PATH"
|
||||
echo "HERMES_ENGINE_TARBALL_PATH=$TARBALL_PATH" >> $GITHUB_ENV
|
||||
- name: Print Hermes version
|
||||
shell: bash
|
||||
run: |
|
||||
HERMES_TARBALL_ARTIFACTS_DIR=${{ inputs.hermes-tarball-artifacts-dir }}
|
||||
TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "${{ inputs.flavor }}")
|
||||
TARBALL_PATH=$HERMES_TARBALL_ARTIFACTS_DIR/$TARBALL_FILENAME
|
||||
if [[ -e $TARBALL_PATH ]]; then
|
||||
tar -xf $TARBALL_PATH
|
||||
echo 'print(HermesInternal?.getRuntimeProperties?.()["OSS Release Version"])' > test.js
|
||||
chmod +x ./destroot/bin/hermes
|
||||
./destroot/bin/hermes test.js
|
||||
rm test.js
|
||||
rm -rf destroot
|
||||
else
|
||||
echo 'No Hermes tarball found.'
|
||||
fi
|
||||
- name: Download ReactNativeDependencies
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
@@ -105,7 +61,6 @@ runs:
|
||||
- name: Install CocoaPods dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
export HERMES_ENGINE_TARBALL_PATH=$HERMES_ENGINE_TARBALL_PATH
|
||||
export RCT_USE_LOCAL_RN_DEP="/tmp/third-party/ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
|
||||
@@ -116,7 +71,7 @@ runs:
|
||||
cd packages/rn-tester
|
||||
|
||||
bundle install
|
||||
bundle exec pod install
|
||||
bundle exec pod update hermes-engine --no-repo-update
|
||||
- name: Build RNTester
|
||||
shell: bash
|
||||
run: |
|
||||
|
||||
@@ -121,7 +121,7 @@ describe('Create Draft Release', () => {
|
||||
});
|
||||
|
||||
describe('#_computeBody', () => {
|
||||
it('computes body for release', async () => {
|
||||
it('computes body for release when no hermes versions are passed', async () => {
|
||||
const version = '0.77.1';
|
||||
const changelog = `## v${version}
|
||||
### Breaking Changes
|
||||
@@ -134,20 +134,83 @@ describe('Create Draft Release', () => {
|
||||
#### iOS
|
||||
- [PR #3436](https://github.com/facebook/react-native/pull/3436) - Some other change
|
||||
- [PR #3437](https://github.com/facebook/react-native/pull/3437) - Some other change`;
|
||||
const body = _computeBody(version, changelog);
|
||||
const body = _computeBody(changelog, version);
|
||||
|
||||
expect(body).toEqual(`${changelog}
|
||||
|
||||
---
|
||||
|
||||
Hermes dSYMS:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-framework-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-framework-dSYM-release.tar.gz)
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${version}/hermes-ios-${version}-hermes-framework-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${version}/hermes-ios-${version}-hermes-framework-dSYM-release.tar.gz)
|
||||
|
||||
Hermes V1 dSYMS:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${version}/hermes-ios-${version}-hermes-framework-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${version}/hermes-ios-${version}-hermes-framework-dSYM-release.tar.gz)
|
||||
|
||||
ReactNativeDependencies dSYMs:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-release.tar.gz)
|
||||
|
||||
ReactNative Core dSYMs:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-release.tar.gz)
|
||||
|
||||
---
|
||||
|
||||
You can file issues or pick requests against this release [here](https://github.com/reactwg/react-native-releases/issues/new/choose).
|
||||
|
||||
---
|
||||
|
||||
To help you upgrade to this version, you can use the [Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) ⚛️.
|
||||
|
||||
---
|
||||
|
||||
View the whole changelog in the [CHANGELOG.md file](https://github.com/facebook/react-native/blob/main/CHANGELOG.md).`);
|
||||
});
|
||||
|
||||
it('computes body for release when hermes versions are passed', async () => {
|
||||
const version = '0.77.1';
|
||||
const hermesVersion = '0.15.0';
|
||||
const hermesV1Version = '250829098.0.2';
|
||||
const changelog = `## v${version}
|
||||
### Breaking Changes
|
||||
- [PR #9012](https://github.com/facebook/react-native/pull/9012) - Some other change
|
||||
|
||||
#### Android
|
||||
- [PR #3456](https://github.com/facebook/react-native/pull/3456) - Some other change
|
||||
- [PR #3457](https://github.com/facebook/react-native/pull/3457) - Some other change
|
||||
|
||||
#### iOS
|
||||
- [PR #3436](https://github.com/facebook/react-native/pull/3436) - Some other change
|
||||
- [PR #3437](https://github.com/facebook/react-native/pull/3437) - Some other change`;
|
||||
const body = _computeBody(
|
||||
changelog,
|
||||
version,
|
||||
hermesVersion,
|
||||
hermesV1Version,
|
||||
);
|
||||
|
||||
expect(body).toEqual(`${changelog}
|
||||
|
||||
---
|
||||
|
||||
Hermes dSYMS:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesVersion}/hermes-ios-${hermesVersion}-hermes-framework-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesVersion}/hermes-ios-${hermesVersion}-hermes-framework-dSYM-release.tar.gz)
|
||||
|
||||
Hermes V1 dSYMS:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesV1Version}/hermes-ios-${hermesV1Version}-hermes-framework-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesV1Version}/hermes-ios-${hermesV1Version}-hermes-framework-dSYM-release.tar.gz)
|
||||
|
||||
ReactNativeDependencies dSYMs:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-release.tar.gz)
|
||||
|
||||
ReactNative Core dSYMs:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-release.tar.gz)
|
||||
|
||||
---
|
||||
|
||||
You can file issues or pick requests against this release [here](https://github.com/reactwg/react-native-releases/issues/new/choose).
|
||||
|
||||
@@ -40,19 +40,29 @@ function _extractChangelog(version) {
|
||||
return changelog.slice(changelogStarts, changelogEnds).join('\n').trim();
|
||||
}
|
||||
|
||||
function _computeBody(version, changelog) {
|
||||
function _computeBody(changelog, version, hermesVersion, hermesV1Version) {
|
||||
hermesVersion = hermesVersion ?? version;
|
||||
hermesV1Version = hermesV1Version ?? version;
|
||||
return `${changelog}
|
||||
|
||||
---
|
||||
|
||||
Hermes dSYMS:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-framework-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-framework-dSYM-release.tar.gz)
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesVersion}/hermes-ios-${hermesVersion}-hermes-framework-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesVersion}/hermes-ios-${hermesVersion}-hermes-framework-dSYM-release.tar.gz)
|
||||
|
||||
Hermes V1 dSYMS:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesV1Version}/hermes-ios-${hermesV1Version}-hermes-framework-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/hermes/hermes-ios/${hermesV1Version}/hermes-ios-${hermesV1Version}-hermes-framework-dSYM-release.tar.gz)
|
||||
|
||||
ReactNativeDependencies dSYMs:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-dSYM-release.tar.gz)
|
||||
|
||||
ReactNative Core dSYMs:
|
||||
- [Debug](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-debug.tar.gz)
|
||||
- [Release](https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-core-release.tar.gz)
|
||||
|
||||
---
|
||||
|
||||
You can file issues or pick requests against this release [here](https://github.com/reactwg/react-native-releases/issues/new/choose).
|
||||
@@ -113,7 +123,13 @@ function moveToChangelogBranch(version) {
|
||||
run(`git checkout -b changelog/v${version}`);
|
||||
}
|
||||
|
||||
async function createDraftRelease(version, latest, token) {
|
||||
async function createDraftRelease(
|
||||
version,
|
||||
latest,
|
||||
token,
|
||||
hermesVersion,
|
||||
hermesV1Version,
|
||||
) {
|
||||
if (version.startsWith('v')) {
|
||||
version = version.substring(1);
|
||||
}
|
||||
@@ -121,7 +137,7 @@ async function createDraftRelease(version, latest, token) {
|
||||
_verifyTagExists(version);
|
||||
moveToChangelogBranch(version);
|
||||
const changelog = _extractChangelog(version);
|
||||
const body = _computeBody(version, changelog);
|
||||
const body = _computeBody(changelog, version, hermesVersion, hermesV1Version);
|
||||
const release = await _createDraftReleaseOnGitHub(
|
||||
version,
|
||||
body,
|
||||
|
||||
@@ -162,7 +162,7 @@ async function main() {
|
||||
console.info(`WORKING_DIRECTORY: ${WORKING_DIRECTORY}`);
|
||||
console.info('==============================\n');
|
||||
|
||||
const simulatorName = 'iPhone 15 Pro';
|
||||
const simulatorName = 'iPhone 16 Pro';
|
||||
launchSimulator(simulatorName);
|
||||
installAppOnSimulator(APP_PATH);
|
||||
const udid = extractSimulatorUDID();
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
xcode-version: '16.2.0'
|
||||
platform: 'ios'
|
||||
- name: Extract branch name
|
||||
run: |
|
||||
TAG="${{ github.ref_name }}";
|
||||
|
||||
@@ -2,6 +2,15 @@ name: Create Draft Release
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
hermesVersion:
|
||||
required: false
|
||||
type: string
|
||||
description: The version of Hermes to use for this release (eg. 0.15.0). If not specified, it will use React Native Version
|
||||
hermesV1Version:
|
||||
required: false
|
||||
type: string
|
||||
description: The version of Hermes V1 to use for this release (eg. 250829098.0.2). If not specified, it will use React Native Version
|
||||
|
||||
jobs:
|
||||
create-draft-release:
|
||||
@@ -27,7 +36,7 @@ jobs:
|
||||
const {createDraftRelease} = require('./.github/workflow-scripts/createDraftRelease.js');
|
||||
const version = '${{ github.ref_name }}';
|
||||
const {isLatest} = require('./.github/workflow-scripts/publishTemplate.js');
|
||||
return (await createDraftRelease(version, isLatest(), '${{secrets.REACT_NATIVE_BOT_GITHUB_TOKEN}}')).id;
|
||||
return (await createDraftRelease(version, isLatest(), '${{secrets.REACT_NATIVE_BOT_GITHUB_TOKEN}}', ${{ inputs.hermesVersion }}, ${{ inputs.hermesV1Version }})).id;
|
||||
result-encoding: string
|
||||
- name: Upload release assets for DotSlash
|
||||
uses: actions/github-script@v6
|
||||
|
||||
@@ -21,86 +21,6 @@ jobs:
|
||||
echo "Setting release type to nightly"
|
||||
echo "RELEASE_TYPE=nightly" >> $GITHUB_OUTPUT
|
||||
|
||||
prepare_hermes_workspace:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'facebook/react-native'
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_VERSION_FILE: packages/react-native/sdks/.hermesversion
|
||||
outputs:
|
||||
react-native-version: ${{ steps.prepare-hermes-workspace.outputs.react-native-version }}
|
||||
hermes-version: ${{ steps.prepare-hermes-workspace.outputs.hermes-version }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Prepare Hermes Workspace
|
||||
id: prepare-hermes-workspace
|
||||
uses: ./.github/actions/prepare-hermes-workspace
|
||||
with:
|
||||
hermes-ws-dir: ${{ env.HERMES_WS_DIR }}
|
||||
hermes-version-file: ${{ env.HERMES_VERSION_FILE }}
|
||||
|
||||
build_hermesc_apple:
|
||||
runs-on: macos-14
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Apple
|
||||
uses: ./.github/actions/build-hermesc-apple
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_apple_slices_hermes:
|
||||
runs-on: macos-14
|
||||
needs: [build_hermesc_apple, prepare_hermes_workspace]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: /tmp/hermes/osx-bin
|
||||
IOS_DEPLOYMENT_TARGET: "15.1"
|
||||
XROS_DEPLOYMENT_TARGET: "1.0"
|
||||
MAC_DEPLOYMENT_TARGET: "10.15"
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build Slice
|
||||
uses: ./.github/actions/build-apple-slices-hermes
|
||||
with:
|
||||
flavor: ${{ matrix.flavor }}
|
||||
slice: ${{ matrix.slice }}
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_hermes_macos:
|
||||
runs-on: macos-14
|
||||
needs: [build_apple_slices_hermes, prepare_hermes_workspace]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build Hermes MacOS
|
||||
uses: ./.github/actions/build-hermes-macos
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
flavor: ${{ matrix.flavor }}
|
||||
|
||||
prebuild_apple_dependencies:
|
||||
if: github.repository == 'facebook/react-native'
|
||||
uses: ./.github/workflows/prebuild-ios-dependencies.yml
|
||||
@@ -108,42 +28,10 @@ jobs:
|
||||
|
||||
prebuild_react_native_core:
|
||||
uses: ./.github/workflows/prebuild-ios-core.yml
|
||||
with:
|
||||
use-hermes-nightly: true
|
||||
secrets: inherit
|
||||
needs: [prebuild_apple_dependencies, build_hermes_macos]
|
||||
|
||||
build_hermesc_linux:
|
||||
runs-on: ubuntu-latest
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Linux
|
||||
uses: ./.github/actions/build-hermesc-linux
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_hermesc_windows:
|
||||
runs-on: windows-2025
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: 'C:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin'
|
||||
ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip"
|
||||
MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin'
|
||||
CMAKE_DIR: 'C:\Program Files\CMake\bin'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Windows
|
||||
uses: ./.github/actions/build-hermesc-windows
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
needs: [prebuild_apple_dependencies]
|
||||
|
||||
build_android:
|
||||
runs-on: 8-core-ubuntu
|
||||
@@ -172,10 +60,6 @@ jobs:
|
||||
needs:
|
||||
[
|
||||
set_release_type,
|
||||
prepare_hermes_workspace,
|
||||
build_hermes_macos,
|
||||
build_hermesc_linux,
|
||||
build_hermesc_windows,
|
||||
build_android,
|
||||
prebuild_apple_dependencies,
|
||||
prebuild_react_native_core,
|
||||
@@ -188,7 +72,6 @@ jobs:
|
||||
# By default we only build ARM64 to save time/resources. For release/nightlies, we override this value to build all archs.
|
||||
ORG_GRADLE_PROJECT_reactNativeArchitectures: "arm64-v8a"
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
GHA_NPM_TOKEN: ${{ secrets.GHA_NPM_TOKEN }}
|
||||
ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }}
|
||||
ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY }}
|
||||
@@ -200,7 +83,6 @@ jobs:
|
||||
- name: Build and Publish NPM Package
|
||||
uses: ./.github/actions/build-npm-package
|
||||
with:
|
||||
hermes-ws-dir: ${{ env.HERMES_WS_DIR }}
|
||||
release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }}
|
||||
gha-npm-token: ${{ env.GHA_NPM_TOKEN }}
|
||||
gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
|
||||
|
||||
@@ -2,11 +2,16 @@ name: Prebuild iOS Dependencies
|
||||
|
||||
on:
|
||||
workflow_call: # this directive allow us to call this workflow from other workflows
|
||||
|
||||
inputs:
|
||||
use-hermes-nightly:
|
||||
description: 'Whether to use the hermes nightly build or read the version from the versions.properties file'
|
||||
type: boolean
|
||||
required: false
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
build-rn-slice:
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -32,39 +37,20 @@ jobs:
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
xcode-version: '16.2.0'
|
||||
platform: ${{ matrix.slice }}
|
||||
- name: Yarn Install
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Download Hermes
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-darwin-bin-${{ matrix.flavor }}
|
||||
path: /tmp/hermes/hermes-runtime-darwin
|
||||
- name: Extract Hermes
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
- name: Set Hermes version
|
||||
shell: bash
|
||||
run: |
|
||||
HERMES_TARBALL_ARTIFACTS_DIR=/tmp/hermes/hermes-runtime-darwin
|
||||
if [ ! -d $HERMES_TARBALL_ARTIFACTS_DIR ]; then
|
||||
echo "Hermes tarball artifacts dir not present ($HERMES_TARBALL_ARTIFACTS_DIR)."
|
||||
exit 0
|
||||
if [ "${{ inputs.use-hermes-nightly }}" == "true" ]; then
|
||||
HERMES_VERSION="nightly"
|
||||
else
|
||||
HERMES_VERSION=$(sed -n 's/^HERMES_VERSION_NAME=//p' packages/react-native/sdks/hermes-engine/version.properties)
|
||||
fi
|
||||
|
||||
TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "${{ matrix.flavor }}")
|
||||
TARBALL_PATH=$HERMES_TARBALL_ARTIFACTS_DIR/$TARBALL_FILENAME
|
||||
|
||||
echo "Looking for $TARBALL_FILENAME in $HERMES_TARBALL_ARTIFACTS_DIR"
|
||||
echo "$TARBALL_PATH"
|
||||
|
||||
if [ ! -f $TARBALL_PATH ]; then
|
||||
echo "Hermes tarball not present ($TARBALL_PATH). Build Hermes from source."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Found Hermes tarball at $TARBALL_PATH"
|
||||
echo "HERMES_ENGINE_TARBALL_PATH=$TARBALL_PATH" >> $GITHUB_ENV
|
||||
echo "Using Hermes version: $HERMES_VERSION"
|
||||
echo "HERMES_VERSION=$HERMES_VERSION" >> $GITHUB_ENV
|
||||
- name: Download ReactNativeDependencies
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
@@ -123,7 +109,7 @@ jobs:
|
||||
packages/react-native/.build/headers
|
||||
|
||||
compose-xcframework:
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
needs: [build-rn-slice]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
||||
@@ -7,7 +7,7 @@ on:
|
||||
jobs:
|
||||
prepare_workspace:
|
||||
name: Prepare workspace
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: packages/react-native/third-party/
|
||||
key: v2-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
key: v3-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
enableCrossOsArchive: true
|
||||
- name: Yarn Install
|
||||
if: steps.restore-ios-prebuilds.outputs.cache-hit != 'true'
|
||||
@@ -40,13 +40,13 @@ jobs:
|
||||
uses: actions/cache/save@v4
|
||||
if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode
|
||||
with:
|
||||
key: v2-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
key: v3-ios-dependencies-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
enableCrossOsArchive: true
|
||||
path: packages/react-native/third-party/
|
||||
|
||||
build-apple-slices:
|
||||
name: Build Apple Slice
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
needs: [prepare_workspace]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -65,16 +65,17 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
xcode-version: '16.1'
|
||||
- name: Restore slice folder
|
||||
id: restore-slice-folder
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: packages/react-native/third-party/.build/Build/Products
|
||||
key: v2-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
key: v3-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
- name: Setup xcode
|
||||
if: steps.restore-slice-folder.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
platform: ${{ matrix.slice }}
|
||||
- name: Yarn Install
|
||||
if: steps.restore-slice-folder.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/yarn-install
|
||||
@@ -85,15 +86,8 @@ jobs:
|
||||
name: ios-prebuilds-workspace
|
||||
path: packages/react-native/third-party/
|
||||
- name: Print third-party folder structure
|
||||
if: steps.restore-slice-folder.outputs.cache-hit != 'true'
|
||||
run: ls -lR packages/react-native/third-party
|
||||
- name: Install VisionOS
|
||||
if: ${{ steps.restore-slice-folder.outputs.cache-hit != 'true' && (matrix.slice == 'xros' || matrix.slice == 'xros-simulator') }}
|
||||
run: |
|
||||
# https://github.com/actions/runner-images/issues/10559
|
||||
sudo xcodebuild -runFirstLaunch
|
||||
sudo xcrun simctl list
|
||||
sudo xcodebuild -downloadPlatform visionOS
|
||||
sudo xcodebuild -runFirstLaunch
|
||||
- name: Build slice ${{ matrix.slice }} for ${{ matrix.flavor }}
|
||||
if: steps.restore-slice-folder.outputs.cache-hit != 'true'
|
||||
run: node scripts/releases/prepare-ios-prebuilds.js -b -p ${{ matrix.slice }} -r ${{ matrix.flavor }}
|
||||
@@ -107,14 +101,14 @@ jobs:
|
||||
uses: actions/cache/save@v4
|
||||
if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode
|
||||
with:
|
||||
key: v2-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
key: v3-ios-dependencies-slice-folder-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
enableCrossOsArchive: true
|
||||
path: |
|
||||
packages/react-native/third-party/.build/Build/Products
|
||||
|
||||
create-xcframework:
|
||||
name: Prepare XCFramework
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
needs: [build-apple-slices]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -138,7 +132,7 @@ jobs:
|
||||
with:
|
||||
path: |
|
||||
packages/react-native/third-party/
|
||||
key: v2-ios-dependencies-xcframework-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
key: v3-ios-dependencies-xcframework-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
# If cache hit, we already have our binary. We don't need to do anything.
|
||||
- name: Yarn Install
|
||||
if: steps.restore-xcframework.outputs.cache-hit != 'true'
|
||||
@@ -200,4 +194,4 @@ jobs:
|
||||
path: |
|
||||
packages/react-native/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz
|
||||
packages/react-native/third-party/ReactNativeDependencies${{ matrix.flavor }}.framework.dSYM.tar.gz
|
||||
key: v2-ios-dependencies-xcframework-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
key: v3-ios-dependencies-xcframework-${{ matrix.flavor }}-${{ hashfiles('scripts/releases/ios-prebuild/configuration.js') }}
|
||||
|
||||
@@ -19,84 +19,27 @@ jobs:
|
||||
echo "Setting release type to release"
|
||||
echo "RELEASE_TYPE=release" >> $GITHUB_OUTPUT
|
||||
|
||||
prepare_hermes_workspace:
|
||||
set_hermes_versions:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'facebook/react-native'
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_VERSION_FILE: packages/react-native/sdks/.hermesversion
|
||||
outputs:
|
||||
react-native-version: ${{ steps.prepare-hermes-workspace.outputs.react-native-version }}
|
||||
hermes-version: ${{ steps.prepare-hermes-workspace.outputs.hermes-version }}
|
||||
HERMES_VERSION: ${{ steps.set_hermes_versions.outputs.HERMES_VERSION }}
|
||||
HERMES_V1_VERSION: ${{ steps.set_hermes_versions.outputs.HERMES_V1_VERSION }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Prepare Hermes Workspace
|
||||
id: prepare-hermes-workspace
|
||||
uses: ./.github/actions/prepare-hermes-workspace
|
||||
with:
|
||||
hermes-ws-dir: ${{ env.HERMES_WS_DIR }}
|
||||
hermes-version-file: ${{ env.HERMES_VERSION_FILE }}
|
||||
- id: set_hermes_versions
|
||||
run: |
|
||||
echo "Setting hermes versions to latest"
|
||||
hermes_version=$(grep -oE 'HERMES_VERSION_NAME=([0-9]+\.[0-9]+\.[0-9]+)' packages/react-native/sdks/hermes-engine/version.properties | cut -d'=' -f2)
|
||||
hermes_v1_version=$(grep -oE 'HERMES_V1_VERSION_NAME=([0-9]+\.[0-9]+\.[0-9]+)' packages/react-native/sdks/hermes-engine/version.properties | cut -d'=' -f2)
|
||||
|
||||
build_hermesc_apple:
|
||||
runs-on: macos-14
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Apple
|
||||
uses: ./.github/actions/build-hermesc-apple
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.output.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.output.react-native-version }}
|
||||
build_apple_slices_hermes:
|
||||
runs-on: macos-14
|
||||
needs: [build_hermesc_apple, prepare_hermes_workspace]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: /tmp/hermes/osx-bin
|
||||
IOS_DEPLOYMENT_TARGET: "15.1"
|
||||
XROS_DEPLOYMENT_TARGET: "1.0"
|
||||
MAC_DEPLOYMENT_TARGET: "10.15"
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build Slice
|
||||
uses: ./.github/actions/build-apple-slices-hermes
|
||||
with:
|
||||
flavor: ${{ matrix.flavor }}
|
||||
slice: ${{ matrix.slice}}
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_hermes_macos:
|
||||
runs-on: macos-14
|
||||
needs: [build_apple_slices_hermes, prepare_hermes_workspace]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build Hermes MacOS
|
||||
uses: ./.github/actions/build-hermes-macos
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
flavor: ${{ matrix.flavor }}
|
||||
echo "HERMES_VERSION=$hermes_version" >> $GITHUB_OUTPUT
|
||||
echo "HERMES_V1_VERSION=$hermes_v1_version" >> $GITHUB_OUTPUT
|
||||
- name: Print hermes versions
|
||||
run: |
|
||||
echo "HERMES_VERSION=${{ steps.set_hermes_versions.outputs.HERMES_VERSION }}"
|
||||
echo "HERMES_V1_VERSION=${{ steps.set_hermes_versions.outputs.HERMES_V1_VERSION }}"
|
||||
|
||||
prebuild_apple_dependencies:
|
||||
if: github.repository == 'facebook/react-native'
|
||||
@@ -106,51 +49,13 @@ jobs:
|
||||
prebuild_react_native_core:
|
||||
uses: ./.github/workflows/prebuild-ios-core.yml
|
||||
secrets: inherit
|
||||
needs: [prebuild_apple_dependencies, build_hermes_macos]
|
||||
|
||||
build_hermesc_linux:
|
||||
runs-on: ubuntu-latest
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Linux
|
||||
uses: ./.github/actions/build-hermesc-linux
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_hermesc_windows:
|
||||
runs-on: windows-2025
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: 'C:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin'
|
||||
ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip"
|
||||
MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin'
|
||||
CMAKE_DIR: 'C:\Program Files\CMake\bin'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Windows
|
||||
uses: ./.github/actions/build-hermesc-windows
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
needs: [prebuild_apple_dependencies]
|
||||
|
||||
build_npm_package:
|
||||
runs-on: 8-core-ubuntu
|
||||
needs:
|
||||
[
|
||||
set_release_type,
|
||||
prepare_hermes_workspace,
|
||||
build_hermes_macos,
|
||||
build_hermesc_linux,
|
||||
build_hermesc_windows,
|
||||
prebuild_apple_dependencies,
|
||||
prebuild_react_native_core,
|
||||
]
|
||||
@@ -162,7 +67,6 @@ jobs:
|
||||
# By default we only build ARM64 to save time/resources. For release/nightlies, we override this value to build all archs.
|
||||
ORG_GRADLE_PROJECT_reactNativeArchitectures: "arm64-v8a"
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
GHA_NPM_TOKEN: ${{ secrets.GHA_NPM_TOKEN }}
|
||||
ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }}
|
||||
ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY }}
|
||||
@@ -178,7 +82,6 @@ jobs:
|
||||
- name: Build and Publish NPM Package
|
||||
uses: ./.github/actions/build-npm-package
|
||||
with:
|
||||
hermes-ws-dir: ${{ env.HERMES_WS_DIR }}
|
||||
release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }}
|
||||
gha-npm-token: ${{ env.GHA_NPM_TOKEN }}
|
||||
gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
|
||||
@@ -236,6 +139,9 @@ jobs:
|
||||
secrets: inherit
|
||||
|
||||
create_draft_release:
|
||||
needs: generate_changelog
|
||||
needs: [generate_changelog, set_hermes_versions]
|
||||
uses: ./.github/workflows/create-draft-release.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
hermesVersion: ${{ needs.set_hermes_versions.outputs.HERMES_VERSION }}
|
||||
hermesV1Version: ${{ needs.set_hermes_versions.outputs.HERMES_V1_VERSION }}
|
||||
|
||||
+24
-163
@@ -33,86 +33,6 @@ jobs:
|
||||
|
||||
echo "Should I run E2E tests? ${{ inputs.run-e2e-tests }}"
|
||||
|
||||
prepare_hermes_workspace:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'facebook/react-native'
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_VERSION_FILE: packages/react-native/sdks/.hermesversion
|
||||
outputs:
|
||||
react-native-version: ${{ steps.prepare-hermes-workspace.outputs.react-native-version }}
|
||||
hermes-version: ${{ steps.prepare-hermes-workspace.outputs.hermes-version }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Prepare Hermes Workspace
|
||||
id: prepare-hermes-workspace
|
||||
uses: ./.github/actions/prepare-hermes-workspace
|
||||
with:
|
||||
hermes-ws-dir: ${{ env.HERMES_WS_DIR }}
|
||||
hermes-version-file: ${{ env.HERMES_VERSION_FILE }}
|
||||
|
||||
build_hermesc_apple:
|
||||
runs-on: macos-14
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Apple
|
||||
uses: ./.github/actions/build-hermesc-apple
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_apple_slices_hermes:
|
||||
runs-on: macos-14
|
||||
needs: [build_hermesc_apple, prepare_hermes_workspace]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: /tmp/hermes/osx-bin
|
||||
IOS_DEPLOYMENT_TARGET: "15.1"
|
||||
XROS_DEPLOYMENT_TARGET: "1.0"
|
||||
MAC_DEPLOYMENT_TARGET: "10.15"
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
slice: [macosx, iphoneos, iphonesimulator, appletvos, appletvsimulator, catalyst, xros, xrsimulator]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build Slice
|
||||
uses: ./.github/actions/build-apple-slices-hermes
|
||||
with:
|
||||
flavor: ${{ matrix.flavor }}
|
||||
slice: ${{ matrix.slice}}
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_hermes_macos:
|
||||
runs-on: macos-14
|
||||
needs: [build_apple_slices_hermes, prepare_hermes_workspace]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build Hermes MacOS
|
||||
uses: ./.github/actions/build-hermes-macos
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
flavor: ${{ matrix.flavor }}
|
||||
|
||||
prebuild_apple_dependencies:
|
||||
if: github.repository == 'facebook/react-native'
|
||||
uses: ./.github/workflows/prebuild-ios-dependencies.yml
|
||||
@@ -120,16 +40,15 @@ jobs:
|
||||
|
||||
prebuild_react_native_core:
|
||||
uses: ./.github/workflows/prebuild-ios-core.yml
|
||||
with:
|
||||
use-hermes-nightly: ${{ !endsWith(github.ref_name, '-stable') }}
|
||||
secrets: inherit
|
||||
needs: [prebuild_apple_dependencies, build_hermes_macos]
|
||||
needs: [prebuild_apple_dependencies]
|
||||
|
||||
test_ios_rntester_ruby_3_2_0:
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
needs:
|
||||
[build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
[prebuild_apple_dependencies, prebuild_react_native_core]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -137,17 +56,12 @@ jobs:
|
||||
uses: ./.github/actions/test-ios-rntester
|
||||
with:
|
||||
ruby-version: "3.2.0"
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
flavor: Debug
|
||||
|
||||
test_ios_rntester:
|
||||
runs-on: macos-14-large
|
||||
runs-on: macos-15-large
|
||||
needs:
|
||||
[build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
[prebuild_apple_dependencies, prebuild_react_native_core]
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -161,17 +75,12 @@ jobs:
|
||||
uses: ./.github/actions/test-ios-rntester
|
||||
with:
|
||||
use-frameworks: ${{ matrix.frameworks }}
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
flavor: ${{ matrix.flavor }}
|
||||
|
||||
test_e2e_ios_rntester:
|
||||
runs-on: macos-14-large
|
||||
runs-on: macos-15-large
|
||||
needs:
|
||||
[test_ios_rntester]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -190,6 +99,8 @@ jobs:
|
||||
run: ls -lR /tmp/RNTesterBuild
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
platform: ios
|
||||
- name: Run E2E Tests
|
||||
uses: ./.github/actions/maestro-ios
|
||||
with:
|
||||
@@ -199,11 +110,8 @@ jobs:
|
||||
flavor: ${{ matrix.flavor }}
|
||||
|
||||
test_e2e_ios_templateapp:
|
||||
runs-on: macos-14-large
|
||||
runs-on: macos-15-large
|
||||
needs: [build_npm_package, prebuild_apple_dependencies]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -213,6 +121,8 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
platform: ios
|
||||
- name: Setup node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Run yarn
|
||||
@@ -221,11 +131,6 @@ jobs:
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: 2.6.10
|
||||
- name: Download Hermes
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-darwin-bin-${{matrix.flavor}}
|
||||
path: /tmp/react-native-tmp
|
||||
- name: Download React Native Package
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
@@ -259,9 +164,6 @@ jobs:
|
||||
REACT_NATIVE_PKG=$(find /tmp/react-native-tmp -type f -name "*.tgz")
|
||||
echo "React Native tgs is $REACT_NATIVE_PKG"
|
||||
|
||||
HERMES_PATH=$(find /tmp/react-native-tmp -type f -name "*.tar.gz")
|
||||
echo "Hermes path is $HERMES_PATH"
|
||||
|
||||
# For stable branches, we want to use the stable branch of the template
|
||||
# In all the other cases, we want to use "main"
|
||||
BRANCH=${{ github.ref_name }}
|
||||
@@ -278,7 +180,7 @@ jobs:
|
||||
export RCT_USE_LOCAL_RN_DEP=/tmp/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz
|
||||
# Disable prebuilds for now, as they are causing issues with E2E tests for 0.82-stable branch
|
||||
# export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ matrix.flavor }}.xcframework.tar.gz"
|
||||
HERMES_ENGINE_TARBALL_PATH=$HERMES_PATH RCT_NEW_ARCH_ENABLED=$NEW_ARCH_ENABLED bundle exec pod install
|
||||
RCT_NEW_ARCH_ENABLED=$NEW_ARCH_ENABLED bundle exec pod install
|
||||
|
||||
xcodebuild \
|
||||
-scheme "RNTestProject" \
|
||||
@@ -364,21 +266,6 @@ jobs:
|
||||
flavor: ${{ matrix.flavor }}
|
||||
working-directory: /tmp/RNTestProject
|
||||
|
||||
build_hermesc_linux:
|
||||
runs-on: ubuntu-latest
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Linux
|
||||
uses: ./.github/actions/build-hermesc-linux
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
run_fantom_tests:
|
||||
runs-on: 8-core-ubuntu
|
||||
needs: [set_release_type]
|
||||
@@ -398,25 +285,6 @@ jobs:
|
||||
release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }}
|
||||
gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
|
||||
|
||||
build_hermesc_windows:
|
||||
runs-on: windows-2025
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: 'C:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin'
|
||||
ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip"
|
||||
MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin'
|
||||
CMAKE_DIR: 'C:\Program Files\CMake\bin'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build HermesC Windows
|
||||
uses: ./.github/actions/build-hermesc-windows
|
||||
with:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_android:
|
||||
runs-on: 8-core-ubuntu
|
||||
needs: [set_release_type]
|
||||
@@ -471,10 +339,6 @@ jobs:
|
||||
needs:
|
||||
[
|
||||
set_release_type,
|
||||
prepare_hermes_workspace,
|
||||
build_hermes_macos,
|
||||
build_hermesc_linux,
|
||||
build_hermesc_windows,
|
||||
build_android,
|
||||
prebuild_apple_dependencies,
|
||||
prebuild_react_native_core,
|
||||
@@ -484,15 +348,12 @@ jobs:
|
||||
env:
|
||||
TERM: "dumb"
|
||||
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build NPM Package
|
||||
uses: ./.github/actions/build-npm-package
|
||||
with:
|
||||
hermes-ws-dir: ${{ env.HERMES_WS_DIR }}
|
||||
release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }}
|
||||
gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
|
||||
|
||||
@@ -535,6 +396,12 @@ jobs:
|
||||
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
|
||||
- name: Run yarn install
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Set nightly Hermes versions
|
||||
shell: bash
|
||||
run: |
|
||||
node ./scripts/releases/use-hermes-nightly.js
|
||||
- name: Run yarn install again, with the correct hermes version
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Prepare the Helloworld application
|
||||
shell: bash
|
||||
run: node ./scripts/e2e/init-project-e2e.js --useHelloWorld --pathToLocalReactNative "$GITHUB_WORKSPACE/build/$(cat build/react-native-package-version)"
|
||||
@@ -555,11 +422,10 @@ jobs:
|
||||
compression-level: 0
|
||||
|
||||
test_ios_helloworld_with_ruby_3_2_0:
|
||||
runs-on: macos-14
|
||||
needs: [prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core] # prepare_hermes_workspace must be there because we need its reference to retrieve a couple of outputs
|
||||
runs-on: macos-15
|
||||
needs: [prebuild_apple_dependencies, prebuild_react_native_core]
|
||||
env:
|
||||
PROJECT_NAME: iOSTemplateProject
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
YARN_ENABLE_IMMUTABLE_INSTALLS: false
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -568,12 +434,10 @@ jobs:
|
||||
with:
|
||||
ruby-version: 3.2.0
|
||||
flavor: Debug
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
test_ios_helloworld:
|
||||
runs-on: macos-14
|
||||
needs: [prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core] # prepare_hermes_workspace must be there because we need its reference to retrieve a couple of outputs
|
||||
runs-on: macos-15
|
||||
needs: [prebuild_apple_dependencies, prebuild_react_native_core]
|
||||
strategy:
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
@@ -584,7 +448,6 @@ jobs:
|
||||
use_frameworks: StaticLibraries
|
||||
env:
|
||||
PROJECT_NAME: iOSTemplateProject
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
YARN_ENABLE_IMMUTABLE_INSTALLS: false
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -593,8 +456,6 @@ jobs:
|
||||
with:
|
||||
flavor: ${{ matrix.flavor }}
|
||||
use-frameworks: ${{ matrix.use_frameworks }}
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
test_js:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# Changelog (pre 0.80)
|
||||
|
||||
## v0.79.7
|
||||
|
||||
### Fixed
|
||||
|
||||
#### Android specific
|
||||
|
||||
- **Layout:** Make missing parent view state in updateLayout a soft error ([56ad8d9bfd](https://github.com/facebook/react-native/commit/56ad8d9bfd08ea70bc6f5726a2b4a6afb6d2d7c2) by [@javache](https://github.com/javache))
|
||||
- **Layout:** Make missing parent view state in updateLayout a soft error ([f2e47d8dab](https://github.com/facebook/react-native/commit/f2e47d8dabcd61621ea81c86cd1e2488948c4229) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
|
||||
## v0.79.6
|
||||
|
||||
### Added
|
||||
|
||||
+57
-98
@@ -1,110 +1,18 @@
|
||||
# Changelog
|
||||
|
||||
## v0.82.0-rc.5
|
||||
|
||||
### Breaking
|
||||
|
||||
- **InteractionManager:** InteractionManager has been deprecated and no longer respects interaction handles. Instead, it is now recommended to avoid executing long-running JavaScript tasks by breaking them up into smaller tasks and scheduling them using `requestIdleCallback()`. ([03d9f34a82](https://github.com/facebook/react-native/commit/03d9f34a8252456d389d9f9a3bd04b99a2828c16) by [@yungsters](https://github.com/yungsters))
|
||||
|
||||
### Added
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- **New Architecture:** Crash the app if they force the legacy architecture. ([dc132a4fd4](https://github.com/facebook/react-native/commit/dc132a4fd4ca8dc28dc7dbb2406ac67dac1a0ee7) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **Fabric:** Add invalidation callback for non-recycled component instances ([dc4a6d2c7e](https://github.com/facebook/react-native/commit/dc4a6d2c7e2ed421b61929896f60b1a864a60d97) by [@kkafar](https://github.com/kkafar))
|
||||
|
||||
## v0.82.0-rc.4
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Hermes V1:** Fixed coordinates for Hermes V1 artifacts ([674fb77d93](https://github.com/facebook/react-native/commit/674fb77d93dfe67a5fe90449dc71b195b1851e13) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- **Switch:** Fix Switch layout to work with iOS26 ([91d427fe52](https://github.com/facebook/react-native/commit/91d427fe52a307f9aa8579912ef956d61808dad2) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
|
||||
## v0.82.0-rc.3
|
||||
|
||||
### Added
|
||||
|
||||
- **Hermes V1:** Added a dependency on hermes-compiler ([0caf8e70d5](https://github.com/facebook/react-native/commit/0caf8e70d53f611a73ad9b55879dfe0a5f036371) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
## v0.82.1
|
||||
|
||||
### Fixed
|
||||
|
||||
#### Android specific
|
||||
|
||||
- **Hermes V1:** Changed the coordinates of hermes artifacts when using Hermes V1 ([d0fb33822d](https://github.com/facebook/react-native/commit/d0fb33822de38183895c8b3421f46966909beaf3) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- Fixed representation of transforms when view is originally zero-sized ([a81e94a40c](https://github.com/facebook/react-native/commit/a81e94a40ca8dca9e57b562db21f8f235c5b25a0) by [@javache](https://github.com/javache))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- **Codegen:** Fix regression that skips artifacts code generation ([f6f5ea0b2e](https://github.com/facebook/react-native/commit/f6f5ea0b2eed894725d8f6e8bd045c99c3182026) by [@kitten](https://github.com/kitten))
|
||||
- Fixed issue when using gnu coreutils cp command when using precompiled binaries causing compilation error ([068ec39aea](https://github.com/facebook/react-native/commit/068ec39aea543617e5159fe22274b294bfb29026) by [@chrfalch](https://github.com/chrfalch))
|
||||
|
||||
## v0.81.4
|
||||
|
||||
### Fixed
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Fix regression that skips artifacts code generation ([f6f5ea0b2e](https://github.com/facebook/react-native/commit/f6f5ea0b2eed894725d8f6e8bd045c99c3182026) by [@kitten](https://github.com/kitten))
|
||||
- Reapplied "Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source" ([bb73315a3f](https://github.com/facebook/react-native/commit/bb73315a3fd8cd203c4ddb3ffa10bfec307c7e92) by [@kitten](https://github.com/kitten))
|
||||
|
||||
## v0.81.3
|
||||
|
||||
### Fixed
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Reverted "Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source" ([537e3ad930](https://github.com/facebook/react-native/commit/537e3ad93041c0cef959f0d20586fe97818900a6) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
||||
|
||||
## v0.81.2
|
||||
|
||||
### Added
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Create a debugOptimized buildType for Android ([5e3edafec6](https://github.com/facebook/react-native/commit/5e3edafec6c69558521061dced7a6bcd046576b0) by [@cortinico](https://github.com/cortinico))
|
||||
- Add `useNativeEqualsInNativeReadableArrayAndroid` and `useNativeTransformHelperAndroid` feature flag to the experimental channel. This should alleviate some of the perf issue users are seeing on Android + Reanimated + NewArch on 0.81([a346096da8](https://github.com/facebook/react-native/commit/a346096da81fccf5fbc82d83bfc128695e6ec3a5) by [@cortinico](https://github.com/cortinico))
|
||||
|
||||
### Fixed
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Fix Node scripts related to prebuilt tarball extraction for paths containing whitespaces ([366f2ad505](https://github.com/facebook/react-native/commit/366f2ad5057ffecc1f5b211f6aae29567ae6b7e5) by [@kitten](https://github.com/kitten))
|
||||
- Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source ([a2eb29e5e7](https://github.com/facebook/react-native/commit/a2eb29e5e7aef8bbdf4c647c8467b5292b013b20) by [@kitten](https://github.com/kitten))
|
||||
|
||||
## v0.82.0-rc.1
|
||||
|
||||
### Added
|
||||
|
||||
#### Android specific
|
||||
|
||||
- **Hermes V1:** Added opt-in to use the new Hermes ([3e9990f860](https://github.com/facebook/react-native/commit/3e9990f860eb9380837ef431ca02def32c4261ad) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- **Hermes V1:** Added opt-in to use the new Hermes ([e9cdc308b4](https://github.com/facebook/react-native/commit/e9cdc308b4c04753d85757e8877ac00c3c687b95) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
|
||||
### Changed
|
||||
|
||||
- **Hermes V1:** Changed the source of hermesc binary to be an npm package ([2e0bd13a25](https://github.com/facebook/react-native/commit/2e0bd13a2533fe7ab64125a95b9215b806018c6e) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
|
||||
### Deprecated
|
||||
|
||||
- **APIs:** Deprecate legacy javascript react native apis ([e7aeea26bd](https://github.com/facebook/react-native/commit/e7aeea26bde6e9cda0a3a0a55fc2a0421fb0c0e5) by [@RSNara](https://github.com/RSNara))
|
||||
|
||||
### Fixed
|
||||
|
||||
#### Android specific
|
||||
|
||||
- **Build From Source:** Fix build from source due to missing folder error on Gradle 9.0 ([9fbce3eff1](https://github.com/facebook/react-native/commit/9fbce3eff18060f16e796badc415ba733ede19af) by [@cortinico](https://github.com/cortinico))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- **RCTAlertController:** Simplify RCTAlertController, don't create additional UIWindow ([05c4321b19](https://github.com/facebook/react-native/commit/05c4321b194c3d0e146b6085bcaccc75acd3fd67) by [@okwasniewski](https://github.com/okwasniewski))
|
||||
- **Prebuild:** Fix Node scripts related to prebuilt tarball extraction for paths containing whitespaces ([9731e8ebc5](https://github.com/facebook/react-native/commit/9731e8ebc5ea87526a91b9903172639e062cd920) by [@kitten](https://github.com/kitten))
|
||||
- **Prebuild:** Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source ([f170db412b](https://github.com/facebook/react-native/commit/f170db412b3ab46fd0894d5d66431d9c230cd3a8) by [@kitten](https://github.com/kitten))
|
||||
|
||||
## v0.82.0-rc.0
|
||||
## v0.82.0
|
||||
|
||||
### Breaking
|
||||
|
||||
@@ -112,6 +20,7 @@
|
||||
- **`CxxSharedModuleWrapper`:** Removed CxxSharedModuleWrapper ([fafbee2402](https://github.com/facebook/react-native/commit/fafbee240235ea0e63eb01abd31ce32d6a576429) by [@javache](https://github.com/javache))
|
||||
- **DOM API:** Enable DOM APIs in host component refs ([2ad845ccb2](https://github.com/facebook/react-native/commit/2ad845ccb2fea277e05513dcf41407026a8224f0) by [@rubennorte](https://github.com/rubennorte))
|
||||
- **Error Handling:** Unhandled promises are now handled by ExceptionsManager.handleException, instead of being swallowed as Logbox Warnings. ([c4082c9ce2](https://github.com/facebook/react-native/commit/c4082c9ce208a324c2d011823ca2ba432411aafc) by [@krystofwoldrich](https://github.com/krystofwoldrich))
|
||||
- **InteractionManager:** InteractionManager has been deprecated and no longer respects interaction handles. Instead, it is now recommended to avoid executing long-running JavaScript tasks by breaking them up into smaller tasks and scheduling them using `requestIdleCallback()`. ([03d9f34a82](https://github.com/facebook/react-native/commit/03d9f34a8252456d389d9f9a3bd04b99a2828c16) by [@yungsters](https://github.com/yungsters))
|
||||
- **`shouldEmitW3CPointerEvents`:** Migrate `shouldPressibilityUseW3CPointerEventsForHover` to common private feature flags and remove `shouldEmitW3CPointerEvents` flag. ([fb4587780e](https://github.com/facebook/react-native/commit/fb4587780e8d6111139d73598a9a26ff392dee28) by [@coado](https://github.com/coado))
|
||||
- **TurboModuleUtils:** Remove unused ReactCommon/TurboModuleUtils functions #deepCopyJSIObject and #deepCopyJSIArray ([ead669ade3](https://github.com/facebook/react-native/commit/ead669ade31ee703c407f96c0ce98d8f2991bdc8) by [@christophpurrer](https://github.com/christophpurrer))
|
||||
- **TurboModules:** Delete old location of CallbackWrapper.h / LongLivedObject.h by ([cb94e71](https://github.com/facebook/react-native/commit/cb94e71845259ae7fa823eb4d21cde74fccd7435) [@christophpurrer](https://github.com/christophpurrer))
|
||||
@@ -135,6 +44,7 @@
|
||||
- **API:** Expose NativeComponentRegistry API as JavaScript root export ([f936780cd5](https://github.com/facebook/react-native/commit/f936780cd5c0c17797f9d2bbc8f5cee81c2eefce) by [@zhongwuzw](https://github.com/zhongwuzw))
|
||||
- **API:** Expose `ReactNativeVersion` API as JavaScript root export ([ec5638abd0](https://github.com/facebook/react-native/commit/ec5638abd0e872be62b6ea5d8df9bed6335c2191) by [@huntie](https://github.com/huntie))
|
||||
- **Codegen:** Added getDebugProps to codegen ([e547f466ee](https://github.com/facebook/react-native/commit/e547f466ee41415a75ec6b6f910171285ee7bfc3) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **Hermes V1:** Added a dependency on hermes-compiler ([0caf8e70d5](https://github.com/facebook/react-native/commit/0caf8e70d53f611a73ad9b55879dfe0a5f036371) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **Pressable:** Allow setting `blockNativeResponder` on Pressable ([6e4d23ded2](https://github.com/facebook/react-native/commit/6e4d23ded2da4a717bafcc032e3d7a0a5fbe3731) by [@zeyap](https://github.com/zeyap))
|
||||
- **Yoga/API:** Make yoga/Yoga.h an umbrell header ([8ed2cee80e](https://github.com/facebook/react-native/commit/8ed2cee80e0aaac2f2a6a897ba450888f274a5a4) by [@rudybear](https://github.com/rudybear))
|
||||
|
||||
@@ -144,18 +54,23 @@
|
||||
- **DevMenu:** Add long-press back as an option to open the DevMenu for devices that lack menu & fast-forward. ([32d37f03ad](https://github.com/facebook/react-native/commit/32d37f03ad05290205a4f04d756f6e1880c4ff89) by [@sbuggay](https://github.com/sbuggay))
|
||||
- **DevTools:** `DevSupportManager::openDebugger` now supports an optional `panel` param determining the starting panel ([7eb3536728](https://github.com/facebook/react-native/commit/7eb3536728c4a20f7e51245f4f7b64aa505bd799) by [@huntie](https://github.com/huntie))
|
||||
- **DevTools:** Adds a landing view parameter to opening RNDT, enabling arbitrary view focus on launch. ([635c707eec](https://github.com/facebook/react-native/commit/635c707eec18f6d2ceceac2dcee9f458f17f8aab) by [@sbuggay](https://github.com/sbuggay))
|
||||
- **Hermes V1:** Added opt-in to use the new Hermes ([3e9990f860](https://github.com/facebook/react-native/commit/3e9990f860eb9380837ef431ca02def32c4261ad) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **HWInput:** Channel up/down hardware events. ([c2a3e4420e](https://github.com/facebook/react-native/commit/c2a3e4420e07147f9a040a665da98dbe22b87a2a) by [@sbuggay](https://github.com/sbuggay))
|
||||
- **Manifest:** Add support to specify a single Manifest rather than 2 (main/debug) by using the `usesCleartextTraffic` manifest placeholder which is autoconfigured by RNGP. ([d89acc1596](https://github.com/facebook/react-native/commit/d89acc1596345534882938d2bbf40275a6cb89bd) by [@cortinico](https://github.com/cortinico))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- **API:** Add deprecation message for RCTAppdelegate APIs ([d503ea4efc](https://github.com/facebook/react-native/commit/d503ea4efc84b6511cef2a46421a16e044862e88) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **Fabric:** Add invalidation callback for non-recycled component instances ([dc4a6d2c7e](https://github.com/facebook/react-native/commit/dc4a6d2c7e2ed421b61929896f60b1a864a60d97) by [@kkafar](https://github.com/kkafar))
|
||||
- **Hermes V1:** Added opt-in to use the new Hermes ([e9cdc308b4](https://github.com/facebook/react-native/commit/e9cdc308b4c04753d85757e8877ac00c3c687b95) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **New Architecture:** Add warning if RCT_NEW_ARCH_ENABLED is set to 0 ([7d0bef2f25](https://github.com/facebook/react-native/commit/7d0bef2f25a206d917e7f5cc2b9a6c088f13a832) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **New Architecture:** Crash the app if they force the legacy architecture. ([dc132a4fd4](https://github.com/facebook/react-native/commit/dc132a4fd4ca8dc28dc7dbb2406ac67dac1a0ee7) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
|
||||
### Changed
|
||||
|
||||
- **Font:** Enabled `enableFontScaleChangesUpdatingLayout` feature flag by default ([686d14f1d1](https://github.com/facebook/react-native/commit/686d14f1d16c2f02720104ddd395f7d27c908350) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **Hermes:** Changed names of hermes binaries ([776fca1e7c](https://github.com/facebook/react-native/commit/776fca1e7c978a2d8f817d042836073e4dcb4e0e) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **Hermes V1:** Changed the source of hermesc binary to be an npm package ([2e0bd13a25](https://github.com/facebook/react-native/commit/2e0bd13a2533fe7ab64125a95b9215b806018c6e) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **Metro:** Bump Metro to ^0.83.1 ([840fd6c83f](https://github.com/facebook/react-native/commit/840fd6c83f45326a796bf2823f8c2fa942aed06c) by [@robhogan](https://github.com/robhogan))
|
||||
- **React:** Bumped React to 19.1.1 ([ec5a98b1f5](https://github.com/facebook/react-native/commit/ec5a98b1f5c2137f5f6ff5f5f6706f20384c44df) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **Runtime:** CDP backend now accepts `addBinding` and `removeBinding` methods earlier, before a Runtime exists. ([3271e57c75](https://github.com/facebook/react-native/commit/3271e57c751e7d1193c1e9f7b53e545231511b9d) by [@motiz88](https://github.com/motiz88))
|
||||
@@ -189,6 +104,7 @@
|
||||
|
||||
### Deprecated
|
||||
|
||||
- **APIs:** Deprecate legacy javascript react native apis ([e7aeea26bd](https://github.com/facebook/react-native/commit/e7aeea26bde6e9cda0a3a0a55fc2a0421fb0c0e5) by [@RSNara](https://github.com/RSNara))
|
||||
- **StyleSheet:** `StyleSheet.absoluteFillObject` is deprecated in favor of `StyleSheet.absoluteFill` (equivalent). ([83e19813ff](https://github.com/facebook/react-native/commit/83e19813ff5498ab3497d97fe38dba63a5554425) by [@huntie](https://github.com/huntie))
|
||||
- Deprecate all the c++ classes not used by interop, or the new architecture. ([9539cd2626](https://github.com/facebook/react-native/commit/9539cd26261aef646379104833c7f719e3d83d02) by [@RSNara](https://github.com/RSNara))
|
||||
|
||||
@@ -242,6 +158,7 @@
|
||||
- **Casting:** Casting rawValue to int was incorrectly truncating ([31b9f10364](https://github.com/facebook/react-native/commit/31b9f103645e67586bdfc5c2f590c28c04ca3871) by [@javache](https://github.com/javache))
|
||||
- **Codegen:** Help Codegen find library's package.json if some libraries using `exports` field in their package.json file and the `./package.json` subpath is not explicitly defined ([739dfd2141](https://github.com/facebook/react-native/commit/739dfd2141015a8126448bda64a559f5bf22672e) by [@RakaDoank](https://github.com/RakaDoank))
|
||||
- **Hermes:** Change leftover references to `hermes.framework` to `hermesvm.framework` ([7f051c5470](https://github.com/facebook/react-native/commit/7f051c54701b3585f76f63846abbf7e68e2688d2) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **Hermes V1:** Fixed coordinates for Hermes V1 artifacts ([674fb77d93](https://github.com/facebook/react-native/commit/674fb77d93dfe67a5fe90449dc71b195b1851e13) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **Performance Panel:** Fix typo in Performance.js type checking condition ([6caf2dfa38](https://github.com/facebook/react-native/commit/6caf2dfa382fd4f1184b8d21b030c36687a256e4) by [@YangJonghun](https://github.com/YangJonghun))
|
||||
- **Performance Panel:** Add default cases to switch statements in headers ([323fe3a5d4](https://github.com/facebook/react-native/commit/323fe3a5d471ae5a2f94d5c2bd13cc97feffe0a5) by [@NSProgrammer](https://github.com/NSProgrammer))
|
||||
- **ReactCommon:** Bring back ContextContainer::Shared = std::shared_ptr<const ContextContainer> alias ([daeb6e99ab](https://github.com/facebook/react-native/commit/daeb6e99abbca2b6395a9a703d2b0bb9e5091fb7) by [@christophpurrer](https://github.com/christophpurrer))
|
||||
@@ -253,11 +170,13 @@
|
||||
#### Android specific
|
||||
|
||||
- **Accessability:** Stabilize custom accessibility action IDs to prevent "incompatible action" errors in TalkBack. ([626568f9a3](https://github.com/facebook/react-native/commit/626568f9a3f956a52f6c55df1dc3bc5cd017e353) by [@leg234-png](https://github.com/leg234-png))
|
||||
- **Build From Source:** Fix build from source due to missing folder error on Gradle 9.0 ([9fbce3eff1](https://github.com/facebook/react-native/commit/9fbce3eff18060f16e796badc415ba733ede19af) by [@cortinico](https://github.com/cortinico))
|
||||
- **Determinism:** Turned off build IDs for native libraries, fixing issues with reproducibility ([4b8dbe7642](https://github.com/facebook/react-native/commit/4b8dbe7642be53d0ccfc68ca8c9b3f5e750a68c0) by [@Rexogamer](https://github.com/Rexogamer))
|
||||
- **DevTools:** Fix stack trace linkifying failing when using Android emulator and other situations where the device and debugger have different bundle urls ([794df48ad6](https://github.com/facebook/react-native/commit/794df48ad6a259022e66de1a38ff54b5ec67c3e4) by [@vzaidman](https://github.com/vzaidman))
|
||||
- **Edge to Edge:** Fix `Dimensions` `window` values on Android < 15 when edge-to-edge is enabled ([3b185e4bce](https://github.com/facebook/react-native/commit/3b185e4bcef24e0689cccd4cf250d469b114d4da) by [@zoontek](https://github.com/zoontek))
|
||||
- **Fonts:** Update font scale when recreating `RootView` ([5cda3065ce](https://github.com/facebook/react-native/commit/5cda3065ce635460a7458cbab5c10e24bea3bfe2) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **Fonts:** Fix incorrect positioning of inline view at the end of string when RTL text in LTR container ([7f224941bb](https://github.com/facebook/react-native/commit/7f224941bb807919b487d8e1634dd2124f9258b8) by [@NickGerleman](https://github.com/NickGerleman))
|
||||
- **Hermes V1:** Changed the coordinates of hermes artifacts when using Hermes V1 ([d0fb33822d](https://github.com/facebook/react-native/commit/d0fb33822de38183895c8b3421f46966909beaf3) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
- **Locale:** Use the first available locale instead of the default one to decide `isDevicePreferredLanguageRTL` ([a03780d279](https://github.com/facebook/react-native/commit/a03780d279d0944e0dcbbf5a93680775006598b0) by Kaining Zhong)
|
||||
- **New Architecture:** Correctly account for insets on first render of Modals on New Arch ([2e76fc8e8e](https://github.com/facebook/react-native/commit/2e76fc8e8ea01fbce5bd131f675364e688f49088) by [@cortinico](https://github.com/cortinico))
|
||||
- **Performance:** Fix mounting is very slow on Android by shipping native transform optimizations ([c557311ed8](https://github.com/facebook/react-native/commit/c557311ed836cded8548c5bca32f3eded0abc7ff) by [@cortinico](https://github.com/cortinico))
|
||||
@@ -270,13 +189,18 @@
|
||||
- **Build:** Non-UTF8 crashes Info.plist local frameworks ([91e69b5d4c](https://github.com/facebook/react-native/commit/91e69b5d4c768278680a8d9ae979bc267624ce98) by [@philipheinser](https://github.com/philipheinser))
|
||||
- **Build:** Fixed variable naming error in `set_fast_float_config` method in `react_native_pods.rb` ([327057fad5](https://github.com/facebook/react-native/commit/327057fad5c78a95e6c039bfe380d78672e83a43) by [@eliotfallon213](https://github.com/eliotfallon213))
|
||||
- **Build:** Fix pure cocoapods dynamic framework build ([aa4555eaf1](https://github.com/facebook/react-native/commit/aa4555eaf1b6aab83660c600e867fa6c2da4128e) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **Codegen:** Fix regression that skips artifacts code generation ([f6f5ea0b2e](https://github.com/facebook/react-native/commit/f6f5ea0b2eed894725d8f6e8bd045c99c3182026) by [@kitten](https://github.com/kitten))
|
||||
- **Native Modules:** Fix concurrent calls into resolve/reject inside native modules ([dc879950d1](https://github.com/facebook/react-native/commit/dc879950d196dfd429229f1c4c8e743ef1799d11) by [@RSNara](https://github.com/RSNara))
|
||||
- **New Architecture:** Fix overriding (xc)framework Info.plist files with RCTNewArchEnabled field ([f84514a88b](https://github.com/facebook/react-native/commit/f84514a88be00f8dcae7972f84aa89d829392a58) by [@msynowski](https://github.com/msynowski))
|
||||
- **Prebuild:** Fix Node scripts related to prebuilt tarball extraction for paths containing whitespaces ([9731e8ebc5](https://github.com/facebook/react-native/commit/9731e8ebc5ea87526a91b9903172639e062cd920) by [@kitten](https://github.com/kitten))
|
||||
- **Prebuild:** Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source ([f170db412b](https://github.com/facebook/react-native/commit/f170db412b3ab46fd0894d5d66431d9c230cd3a8) by [@kitten](https://github.com/kitten))
|
||||
- **RCTAlertController:** Simplify RCTAlertController, don't create additional UIWindow ([05c4321b19](https://github.com/facebook/react-native/commit/05c4321b194c3d0e146b6085bcaccc75acd3fd67) by [@okwasniewski](https://github.com/okwasniewski))
|
||||
- **RCTPullToRefreshViewComponentView:** Properly initialize the `RCTPullToRefreshViewComponentView` ([27217e8bd6](https://github.com/facebook/react-native/commit/27217e8bd601757b5db6efc022db428b552a2aa4) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **RCTReactNativeFactory:** Ask the delegate for `getModuleForClass` and `getModuleInstanceFromClass` ([85b47afb48](https://github.com/facebook/react-native/commit/85b47afb48e50b036d2c2c79a008f571d3bfcb43) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **ScrollView:** Correctly propagate `ScrollView` props to `RefreshControl` ([09daad27ea](https://github.com/facebook/react-native/commit/09daad27ea22b83fab65176ea3c7f5f1488ba408) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **ScrollView:** Make sure that `ScrollView` recycled refresh control have the right props setup. ([21b93d8d7d](https://github.com/facebook/react-native/commit/21b93d8d7d46a26f728df19764f85a8aebf318bb) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **Switch:** Fixed a crash when rendering the `Switch` component ([28275a0f7b](https://github.com/facebook/react-native/commit/28275a0f7b182a215010d47fb841d9c2c36bb24c) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **Switch:** Fix Switch layout to work with iOS26 ([91d427fe52](https://github.com/facebook/react-native/commit/91d427fe52a307f9aa8579912ef956d61808dad2) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- **Text:** Fix selectable prop not working correctly ([f004cd39bc](https://github.com/facebook/react-native/commit/f004cd39bc4b632006085cbcf61df52bc5d25242) by [@iamAbhi-916](https://github.com/iamAbhi-916))
|
||||
- **TextInput:** Update TextInput recycling logic to clean up the `inputAccessoryView` dependency. ([eb08f54594](https://github.com/facebook/react-native/commit/eb08f545948de9e2eca91ab3cb7569670c553b15) by [@ArturKalach](https://github.com/ArturKalach))
|
||||
- **TextInput:** Fixed TextInput behavior when `maxLength={null}` is passed ([56ad53cb14](https://github.com/facebook/react-native/commit/56ad53cb14b5c842714fcf976b6ba81f68c140f2) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
@@ -286,6 +210,39 @@
|
||||
|
||||
- **Network:** Fixed vulnerability on undici and on-headers ([dd00c9055a](https://github.com/facebook/react-native/commit/dd00c9055a8f0c9ceac1716385a8a9874f7a4c2e) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
|
||||
## v0.81.4
|
||||
|
||||
### Fixed
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Fix regression that skips artifacts code generation ([f6f5ea0b2e](https://github.com/facebook/react-native/commit/f6f5ea0b2eed894725d8f6e8bd045c99c3182026) by [@kitten](https://github.com/kitten))
|
||||
- Reapplied "Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source" ([bb73315a3f](https://github.com/facebook/react-native/commit/bb73315a3fd8cd203c4ddb3ffa10bfec307c7e92) by [@kitten](https://github.com/kitten))
|
||||
|
||||
## v0.81.3
|
||||
|
||||
### Fixed
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Reverted "Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source" ([537e3ad930](https://github.com/facebook/react-native/commit/537e3ad93041c0cef959f0d20586fe97818900a6) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
||||
|
||||
## v0.81.2
|
||||
|
||||
### Added
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Create a debugOptimized buildType for Android ([5e3edafec6](https://github.com/facebook/react-native/commit/5e3edafec6c69558521061dced7a6bcd046576b0) by [@cortinico](https://github.com/cortinico))
|
||||
- Add `useNativeEqualsInNativeReadableArrayAndroid` and `useNativeTransformHelperAndroid` feature flag to the experimental channel. This should alleviate some of the perf issue users are seeing on Android + Reanimated + NewArch on 0.81([a346096da8](https://github.com/facebook/react-native/commit/a346096da81fccf5fbc82d83bfc128695e6ec3a5) by [@cortinico](https://github.com/cortinico))
|
||||
|
||||
### Fixed
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Fix Node scripts related to prebuilt tarball extraction for paths containing whitespaces ([366f2ad505](https://github.com/facebook/react-native/commit/366f2ad5057ffecc1f5b211f6aae29567ae6b7e5) by [@kitten](https://github.com/kitten))
|
||||
- Use autolinking-generated react-native-config output in second step of cocoapods linking that generates artifacts and generated source ([a2eb29e5e7](https://github.com/facebook/react-native/commit/a2eb29e5e7aef8bbdf4c647c8467b5292b013b20) by [@kitten](https://github.com/kitten))
|
||||
|
||||
## v0.81.1
|
||||
|
||||
### Added
|
||||
@@ -300,7 +257,6 @@
|
||||
- **Infra:** Add missing Babel dependencies ([bf2c3af93b](https://github.com/facebook/react-native/commit/bf2c3af93b146943cb35866fa9badcd188e63f5b) by [@tido64](https://github.com/tido64))
|
||||
- **Accessibility:** fix `aria-label` on `TextInput` ([6965d57e75](https://github.com/facebook/react-native/commit/6965d57e75ed0cf9f265c6020d478ddb9af4bf10) by [@mdjastrzebski](https://github.com/mdjastrzebski))
|
||||
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- **TextInput:** Setting maxLength to 0 in TextInput now correctly blocks typing ([c5956da8c0](https://github.com/facebook/react-native/commit/c5956da8c0b735d47761af51019ed25b49001c00) by [@riteshshukla04](https://github.com/riteshshukla04))
|
||||
@@ -314,7 +270,6 @@
|
||||
- **Prebuild:** Fix "file exists" error in `ReactNativeDependencies.podspec` ([4c570b5d31](https://github.com/facebook/react-native/commit/4c570b5d31ef46e04e5fa26fa92d7f7090bf15e2) by [@vonovak](https://github.com/vonovak))
|
||||
- **Prebuild:** added explicit handling of ReactCodegen ([6526a98d68](https://github.com/facebook/react-native/commit/6526a98d68dbc8578ea15cbf117c0a216c6e9af0) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
|
||||
|
||||
## v0.81.0
|
||||
|
||||
### Breaking
|
||||
@@ -869,6 +824,10 @@
|
||||
- **Text:** Selection range not respected when changing text or selection when selection is forced ([d32ea66e6a](https://github.com/facebook/react-native/commit/d32ea66e6a945dd84092532401b265b12d482668) by Olivier Bouillet)
|
||||
- **TextInput:** Fix TextInput `onContentSizeChange` event being dispatched only once on iOS on the new architecture ([5fd5188172](https://github.com/facebook/react-native/commit/5fd51881727b2d86f87abf04db032940ac0ec8c4) by [@j-piasecki](https://github.com/j-piasecki))
|
||||
|
||||
## v0.79.7
|
||||
|
||||
See [CHANGELOG-0.7x](./CHANGELOG-0.7x.md#v0797)
|
||||
|
||||
## v0.79.6
|
||||
|
||||
See [CHANGELOG-0.7x](./CHANGELOG-0.7x.md#v0796)
|
||||
|
||||
+1
-6
@@ -104,10 +104,6 @@ tasks.register("build") {
|
||||
tasks.register("publishAllToMavenTempLocal") {
|
||||
description = "Publish all the artifacts to be available inside a Maven Local repository on /tmp."
|
||||
dependsOn(":packages:react-native:ReactAndroid:publishAllPublicationsToMavenTempLocalRepository")
|
||||
// We don't publish the external-artifacts to Maven Local as ci is using it via workspace.
|
||||
dependsOn(
|
||||
":packages:react-native:ReactAndroid:hermes-engine:publishAllPublicationsToMavenTempLocalRepository"
|
||||
)
|
||||
}
|
||||
|
||||
tasks.register("publishAndroidToSonatype") {
|
||||
@@ -135,8 +131,7 @@ if (project.findProperty("react.internal.useHermesNightly")?.toString()?.toBoole
|
||||
configurations.all {
|
||||
resolutionStrategy.dependencySubstitution {
|
||||
substitute(project(":packages:react-native:ReactAndroid:hermes-engine"))
|
||||
// TODO: T237406039 update coordinates
|
||||
.using(module("com.facebook.react:hermes-android:0.+"))
|
||||
.using(module("com.facebook.hermes:hermes-android:0.+"))
|
||||
.because("Users opted to use hermes from nightly")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,13 @@ org.gradle.caching=true
|
||||
|
||||
android.useAndroidX=true
|
||||
|
||||
# Those 2 properties are needed to make our project compatible with
|
||||
# AGP 9.0.0 for the time being. Ideally we should not opt-out of
|
||||
# builtInKotlin and newDsl once AGP 9.0.0 hits stable.
|
||||
# More on this: https://developer.android.com/build/releases/agp-preview#android-gradle-plugin-built-in-kotlin
|
||||
android.builtInKotlin=false
|
||||
android.newDsl=false
|
||||
|
||||
# Use this property to specify which architecture you want to build.
|
||||
# You can also override it from the CLI using
|
||||
# ./gradlew <task> -PreactNativeArchitectures=x86_64
|
||||
|
||||
+4
-5
@@ -86,7 +86,7 @@
|
||||
"eslint-plugin-relay": "^1.8.3",
|
||||
"fb-dotslash": "0.5.8",
|
||||
"flow-api-translator": "0.32.0",
|
||||
"flow-bin": "^0.287.0",
|
||||
"flow-bin": "^0.289.0",
|
||||
"glob": "^7.1.1",
|
||||
"hermes-eslint": "0.32.0",
|
||||
"hermes-transform": "0.32.0",
|
||||
@@ -108,8 +108,8 @@
|
||||
"nullthrows": "^1.1.1",
|
||||
"prettier": "3.6.2",
|
||||
"prettier-plugin-hermes-parser": "0.32.0",
|
||||
"react": "19.1.1",
|
||||
"react-test-renderer": "19.1.1",
|
||||
"react": "19.2.0",
|
||||
"react-test-renderer": "19.2.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"shelljs": "^0.8.5",
|
||||
"signedsource": "^2.0.0",
|
||||
@@ -120,8 +120,7 @@
|
||||
"ws": "^7.5.10"
|
||||
},
|
||||
"resolutions": {
|
||||
"eslint-plugin-react-hooks": "6.1.0-canary-12bc60f5-20250613",
|
||||
"react-is": "19.1.1",
|
||||
"react-is": "19.2.0",
|
||||
"on-headers": "1.1.0",
|
||||
"compression": "1.8.1"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
@generated SignedSource<<e0cc45c5c3854d0d3013f1c735e804b8>>
|
||||
Git revision: 8cce39003f66f66a8fb4c0e581a2b5046cf9c1d1
|
||||
@generated SignedSource<<4bb67766e15e25a481c4c38873260a7a>>
|
||||
Git revision: 7aa57d13e50ce9d74a91c9315c9b0ded00fbc19f
|
||||
Built with --nohooks: false
|
||||
Is local checkout: false
|
||||
Remote URL: https://github.com/facebook/react-native-devtools-frontend
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -1 +1 @@
|
||||
import*as e from"../root/root.js";const t=e.Runtime.RNExperimentName,n={didInitializeExperiments:!1,isReactNativeEntryPoint:!1};class i{name;title;unstable;docLink;feedbackLink;enabledByDefault;constructor(e){this.name=e.name,this.title=e.title,this.unstable=e.unstable,this.docLink=e.docLink,this.feedbackLink=e.feedbackLink,this.enabledByDefault=function(e,t){if(null==e)return()=>t;if("boolean"==typeof e)return()=>e;return e}(e.enabledByDefault,!1)}}const r=new class{#e=new Map;#t=new Set;register(e){if(n.didInitializeExperiments)throw new Error("Experiments must be registered before constructing MainImpl");const{name:t}=e;if(this.#e.has(t))throw new Error(`React Native Experiment ${t} is already registered`);this.#e.set(t,new i(e))}enableExperimentsByDefault(e){if(n.didInitializeExperiments)throw new Error("Experiments must be configured before constructing MainImpl");for(const n of e)if(Object.prototype.hasOwnProperty.call(t,n)){const e=this.#e.get(n);if(!e)throw new Error(`React Native Experiment ${n} is not registered`);e.enabledByDefault=()=>!0}else this.#t.add(n)}copyInto(e,t=""){for(const[i,r]of this.#e)e.register(i,t+r.title,r.unstable,r.docLink,r.feedbackLink),r.enabledByDefault({isReactNativeEntryPoint:n.isReactNativeEntryPoint})&&e.enableExperimentsByDefault([i]);for(const t of this.#t)e.enableExperimentsByDefault([t]);n.didInitializeExperiments=!0}};r.register({name:t.JS_HEAP_PROFILER_ENABLE,title:"Enable Heap Profiler (Memory Panel)",unstable:!1,enabledByDefault:({isReactNativeEntryPoint:e})=>!e}),r.register({name:t.REACT_NATIVE_SPECIFIC_UI,title:"Show React Native-specific UI",unstable:!1,enabledByDefault:({isReactNativeEntryPoint:e})=>e}),r.register({name:t.ENABLE_PERFORMANCE_PANEL,title:"Enable Performance panel",unstable:!0,enabledByDefault:({isReactNativeEntryPoint:e})=>!e}),r.register({name:t.ENABLE_NETWORK_PANEL,title:"Enable Network panel",unstable:!0,enabledByDefault:()=>!1});var a=Object.freeze({__proto__:null,Instance:r,RNExperimentName:t,setIsReactNativeEntryPoint:function(e){if(n.didInitializeExperiments)throw new Error("setIsReactNativeEntryPoint must be called before constructing MainImpl");n.isReactNativeEntryPoint=e}});export{a as RNExperimentsImpl};
|
||||
import*as e from"../root/root.js";const t=e.Runtime.RNExperimentName,i={didInitializeExperiments:!1,isReactNativeEntryPoint:!1};class n{name;title;unstable;docLink;feedbackLink;enabledByDefault;constructor(e){this.name=e.name,this.title=e.title,this.unstable=e.unstable,this.docLink=e.docLink,this.feedbackLink=e.feedbackLink,this.enabledByDefault=function(e,t){if(null==e)return()=>t;if("boolean"==typeof e)return()=>e;return e}(e.enabledByDefault,!1)}}const r=new class{#e=new Map;#t=new Set;register(e){if(i.didInitializeExperiments)throw new Error("Experiments must be registered before constructing MainImpl");const{name:t}=e;if(this.#e.has(t))throw new Error(`React Native Experiment ${t} is already registered`);this.#e.set(t,new n(e))}enableExperimentsByDefault(e){if(i.didInitializeExperiments)throw new Error("Experiments must be configured before constructing MainImpl");for(const i of e)if(Object.prototype.hasOwnProperty.call(t,i)){const e=this.#e.get(i);if(!e)throw new Error(`React Native Experiment ${i} is not registered`);e.enabledByDefault=()=>!0}else this.#t.add(i)}copyInto(e,t=""){for(const[n,r]of this.#e)e.register(n,t+r.title,r.unstable,r.docLink,r.feedbackLink),r.enabledByDefault({isReactNativeEntryPoint:i.isReactNativeEntryPoint})&&e.enableExperimentsByDefault([n]);for(const t of this.#t)e.enableExperimentsByDefault([t]);i.didInitializeExperiments=!0}};r.register({name:t.JS_HEAP_PROFILER_ENABLE,title:"Enable Heap Profiler (Memory Panel)",unstable:!1,enabledByDefault:({isReactNativeEntryPoint:e})=>!e}),r.register({name:t.REACT_NATIVE_SPECIFIC_UI,title:"Show React Native-specific UI",unstable:!1,enabledByDefault:({isReactNativeEntryPoint:e})=>e}),r.register({name:t.ENABLE_NETWORK_PANEL,title:"Enable Network panel",unstable:!0,enabledByDefault:()=>!1});var a=Object.freeze({__proto__:null,Instance:r,RNExperimentName:t,setIsReactNativeEntryPoint:function(e){if(i.didInitializeExperiments)throw new Error("setIsReactNativeEntryPoint must be called before constructing MainImpl");i.isReactNativeEntryPoint=e}});export{a as RNExperimentsImpl};
|
||||
|
||||
@@ -1 +1 @@
|
||||
import*as e from"../platform/platform.js";const t=new URLSearchParams(location.search);let n,r,s="";function a(){return window.location.pathname}function i(e){return["node_app","js_app"].some((t=>e.includes(t)))}class o{constructor(){}static instance(e={forceNew:null}){const{forceNew:t}=e;return n&&!t||(n=new o),n}static removeInstance(){n=void 0}static queryParam(e){return t.get(e)}static setQueryParamForTesting(e,n){t.set(e,n)}static isNode(){return void 0===r&&(r=i(a())),r}static setPlatform(e){s=e}static platform(){return s}static isDescriptorEnabled(e){const{experiment:t}=e;if("*"===t)return!0;if(t&&t.startsWith("!")&&h.isEnabled(t.substring(1)))return!1;if(t&&!t.startsWith("!")&&!h.isEnabled(t))return!1;const{condition:n}=e;return!n||n(_)}loadLegacyModule(e){console.log("Loading legacy module: "+e);return import(`../../${e}`).then((t=>(console.log("Loaded legacy module: "+e),t)))}}class l{#e=[];#t=new Set;#n=new Set;#r=new Set;#s=new Set;#a=new c;allConfigurableExperiments(){const e=[];for(const t of this.#e)this.#n.has(t.name)||e.push(t);return e}register(t,n,r,s,a){if(this.#t.has(t))throw new Error(`Duplicate registration of experiment '${t}'`);this.#t.add(t),this.#e.push(new m(this,t,n,Boolean(r),s??e.DevToolsPath.EmptyUrlString,a??e.DevToolsPath.EmptyUrlString))}isEnabled(e){return this.checkExperiment(e),!1!==this.#a.get(e)&&(!(!this.#n.has(e)&&!this.#r.has(e))||(!!this.#s.has(e)||Boolean(this.#a.get(e))))}setEnabled(e,t){this.checkExperiment(e),this.#a.set(e,t)}enableExperimentsTransiently(e){for(const t of e)this.checkExperiment(t),this.#n.add(t)}enableExperimentsByDefault(e){for(const t of e)this.checkExperiment(t),this.#r.add(t)}setServerEnabledExperiments(e){for(const t of e)this.checkExperiment(t),this.#s.add(t)}enableForTest(e){this.checkExperiment(e),this.#n.add(e)}disableForTest(e){this.checkExperiment(e),this.#n.delete(e)}clearForTest(){this.#e=[],this.#t.clear(),this.#n.clear(),this.#r.clear(),this.#s.clear()}cleanUpStaleExperiments(){this.#a.cleanUpStaleExperiments(this.#t)}checkExperiment(e){if(!this.#t.has(e))throw new Error(`Unknown experiment '${e}'`)}}class c{#e={};constructor(){try{const e=self.localStorage?.getItem("experiments");e&&(this.#e=JSON.parse(e))}catch{console.error("Failed to parse localStorage['experiments']")}}get(e){return this.#e[e]}set(e,t){this.#e[e]=t,this.#i()}cleanUpStaleExperiments(e){for(const[t]of Object.entries(this.#e))e.has(t)||delete this.#e[t];this.#i()}#i(){self.localStorage?.setItem("experiments",JSON.stringify(this.#e))}}class m{name;title;unstable;docLink;feedbackLink;#e;constructor(e,t,n,r,s,a){this.name=t,this.title=n,this.unstable=r,this.docLink=s,this.feedbackLink=a,this.#e=e}isEnabled(){return this.#e.isEnabled(this.name)}setEnabled(e){this.#e.setEnabled(this.name,e)}}const h=new l;var E,p,d,u;!function(e){e.REACT_NATIVE_SPECIFIC_UI="react-native-specific-ui",e.JS_HEAP_PROFILER_ENABLE="js-heap-profiler-enable",e.ENABLE_PERFORMANCE_PANEL="enable-performance-panel",e.ENABLE_NETWORK_PANEL="enable-network-panel"}(E||(E={})),function(e){e.NOT_SOURCES_HIDE_ADD_FOLDER="!sources.hide_add_folder",e.REACT_NATIVE_UNSTABLE_NETWORK_PANEL="unstable_enableNetworkPanel"}(p||(p={})),function(e){e[e.ALLOW=0]="ALLOW",e[e.ALLOW_WITHOUT_LOGGING=1]="ALLOW_WITHOUT_LOGGING",e[e.DISABLE=2]="DISABLE"}(d||(d={})),function(e){e.ALL_SCRIPTS="ALL_SCRIPTS",e.SIDE_EFFECT_FREE_SCRIPTS_ONLY="SIDE_EFFECT_FREE_SCRIPTS_ONLY",e.NO_SCRIPTS="NO_SCRIPTS"}(u||(u={}));const _=Object.create(null),f={canDock:()=>Boolean(o.queryParam("can_dock")),notSourcesHideAddFolder:()=>Boolean(o.queryParam(p.NOT_SOURCES_HIDE_ADD_FOLDER)),reactNativeUnstableNetworkPanel:()=>Boolean(o.queryParam(p.REACT_NATIVE_UNSTABLE_NETWORK_PANEL))||h.isEnabled("enable-network-panel")};var x=Object.freeze({__proto__:null,get ConditionName(){return p},Experiment:m,ExperimentsSupport:l,get GenAiEnterprisePolicyValue(){return d},get HostConfigFreestylerExecutionMode(){return u},get RNExperimentName(){return E},Runtime:o,conditions:f,experiments:h,getChromeVersion:()=>{const e=navigator.userAgent.match(/(?:^|\W)(?:Chrome|HeadlessChrome)\/(\S+)/);return e&&e.length>1?e[1]:""},getPathName:a,getRemoteBase:function(e=self.location.toString()){const t=new URL(e).searchParams.get("remoteBase");if(!t)return null;const n=/\/serve_file\/(@[0-9a-zA-Z]+)\/?$/.exec(t);return n?{base:`devtools://devtools/remote/serve_file/${n[1]}/`,version:n[1]}:null},hostConfig:_,isNodeEntry:i});export{x as Runtime};
|
||||
import*as e from"../platform/platform.js";const t=new URLSearchParams(location.search);let n,r,s="";function a(){return window.location.pathname}function i(e){return["node_app","js_app"].some((t=>e.includes(t)))}class o{constructor(){}static instance(e={forceNew:null}){const{forceNew:t}=e;return n&&!t||(n=new o),n}static removeInstance(){n=void 0}static queryParam(e){return t.get(e)}static setQueryParamForTesting(e,n){t.set(e,n)}static isNode(){return void 0===r&&(r=i(a())),r}static setPlatform(e){s=e}static platform(){return s}static isDescriptorEnabled(e){const{experiment:t}=e;if("*"===t)return!0;if(t&&t.startsWith("!")&&h.isEnabled(t.substring(1)))return!1;if(t&&!t.startsWith("!")&&!h.isEnabled(t))return!1;const{condition:n}=e;return!n||n(_)}loadLegacyModule(e){console.log("Loading legacy module: "+e);return import(`../../${e}`).then((t=>(console.log("Loaded legacy module: "+e),t)))}}class l{#e=[];#t=new Set;#n=new Set;#r=new Set;#s=new Set;#a=new c;allConfigurableExperiments(){const e=[];for(const t of this.#e)this.#n.has(t.name)||e.push(t);return e}register(t,n,r,s,a){if(this.#t.has(t))throw new Error(`Duplicate registration of experiment '${t}'`);this.#t.add(t),this.#e.push(new m(this,t,n,Boolean(r),s??e.DevToolsPath.EmptyUrlString,a??e.DevToolsPath.EmptyUrlString))}isEnabled(e){return this.checkExperiment(e),!1!==this.#a.get(e)&&(!(!this.#n.has(e)&&!this.#r.has(e))||(!!this.#s.has(e)||Boolean(this.#a.get(e))))}setEnabled(e,t){this.checkExperiment(e),this.#a.set(e,t)}enableExperimentsTransiently(e){for(const t of e)this.checkExperiment(t),this.#n.add(t)}enableExperimentsByDefault(e){for(const t of e)this.checkExperiment(t),this.#r.add(t)}setServerEnabledExperiments(e){for(const t of e)this.checkExperiment(t),this.#s.add(t)}enableForTest(e){this.checkExperiment(e),this.#n.add(e)}disableForTest(e){this.checkExperiment(e),this.#n.delete(e)}clearForTest(){this.#e=[],this.#t.clear(),this.#n.clear(),this.#r.clear(),this.#s.clear()}cleanUpStaleExperiments(){this.#a.cleanUpStaleExperiments(this.#t)}checkExperiment(e){if(!this.#t.has(e))throw new Error(`Unknown experiment '${e}'`)}}class c{#e={};constructor(){try{const e=self.localStorage?.getItem("experiments");e&&(this.#e=JSON.parse(e))}catch{console.error("Failed to parse localStorage['experiments']")}}get(e){return this.#e[e]}set(e,t){this.#e[e]=t,this.#i()}cleanUpStaleExperiments(e){for(const[t]of Object.entries(this.#e))e.has(t)||delete this.#e[t];this.#i()}#i(){self.localStorage?.setItem("experiments",JSON.stringify(this.#e))}}class m{name;title;unstable;docLink;feedbackLink;#e;constructor(e,t,n,r,s,a){this.name=t,this.title=n,this.unstable=r,this.docLink=s,this.feedbackLink=a,this.#e=e}isEnabled(){return this.#e.isEnabled(this.name)}setEnabled(e){this.#e.setEnabled(this.name,e)}}const h=new l;var E,p,d,u;!function(e){e.REACT_NATIVE_SPECIFIC_UI="react-native-specific-ui",e.JS_HEAP_PROFILER_ENABLE="js-heap-profiler-enable",e.ENABLE_NETWORK_PANEL="enable-network-panel"}(E||(E={})),function(e){e.NOT_SOURCES_HIDE_ADD_FOLDER="!sources.hide_add_folder",e.REACT_NATIVE_UNSTABLE_NETWORK_PANEL="unstable_enableNetworkPanel"}(p||(p={})),function(e){e[e.ALLOW=0]="ALLOW",e[e.ALLOW_WITHOUT_LOGGING=1]="ALLOW_WITHOUT_LOGGING",e[e.DISABLE=2]="DISABLE"}(d||(d={})),function(e){e.ALL_SCRIPTS="ALL_SCRIPTS",e.SIDE_EFFECT_FREE_SCRIPTS_ONLY="SIDE_EFFECT_FREE_SCRIPTS_ONLY",e.NO_SCRIPTS="NO_SCRIPTS"}(u||(u={}));const _=Object.create(null),f={canDock:()=>Boolean(o.queryParam("can_dock")),notSourcesHideAddFolder:()=>Boolean(o.queryParam(p.NOT_SOURCES_HIDE_ADD_FOLDER)),reactNativeUnstableNetworkPanel:()=>Boolean(o.queryParam(p.REACT_NATIVE_UNSTABLE_NETWORK_PANEL))||h.isEnabled("enable-network-panel")};var x=Object.freeze({__proto__:null,get ConditionName(){return p},Experiment:m,ExperimentsSupport:l,get GenAiEnterprisePolicyValue(){return d},get HostConfigFreestylerExecutionMode(){return u},get RNExperimentName(){return E},Runtime:o,conditions:f,experiments:h,getChromeVersion:()=>{const e=navigator.userAgent.match(/(?:^|\W)(?:Chrome|HeadlessChrome)\/(\S+)/);return e&&e.length>1?e[1]:""},getPathName:a,getRemoteBase:function(e=self.location.toString()){const t=new URL(e).searchParams.get("remoteBase");if(!t)return null;const n=/\/serve_file\/(@[0-9a-zA-Z]+)\/?$/.exec(t);return n?{base:`devtools://devtools/remote/serve_file/${n[1]}/`,version:n[1]}:null},hostConfig:_,isNodeEntry:i});export{x as Runtime};
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
@@ -30,7 +30,7 @@
|
||||
"eslint-plugin-ft-flow": "^2.0.1",
|
||||
"eslint-plugin-jest": "^29.0.1",
|
||||
"eslint-plugin-react": "^7.30.1",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-hooks": "^7.0.1",
|
||||
"eslint-plugin-react-native": "^4.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
||||
-3
@@ -14,7 +14,6 @@ import com.facebook.react.utils.KotlinStdlibCompatUtils.capitalizeCompat
|
||||
import com.facebook.react.utils.NdkConfiguratorUtils.configureJsEnginePackagingOptions
|
||||
import com.facebook.react.utils.NdkConfiguratorUtils.configureNewArchPackagingOptions
|
||||
import com.facebook.react.utils.ProjectUtils.isHermesEnabled
|
||||
import com.facebook.react.utils.ProjectUtils.isHermesV1Enabled
|
||||
import com.facebook.react.utils.ProjectUtils.useThirdPartyJSC
|
||||
import com.facebook.react.utils.detectedCliFile
|
||||
import com.facebook.react.utils.detectedEntryFile
|
||||
@@ -49,7 +48,6 @@ internal fun Project.configureReactTasks(variant: Variant, config: ReactExtensio
|
||||
} else {
|
||||
isHermesEnabledInProject
|
||||
}
|
||||
val isHermesV1Enabled = project.isHermesV1Enabled || rootProject.isHermesV1Enabled
|
||||
val isDebuggableVariant =
|
||||
config.debuggableVariants.get().any { it.equals(variant.name, ignoreCase = true) }
|
||||
val useThirdPartyJSC = project.useThirdPartyJSC
|
||||
@@ -80,7 +78,6 @@ internal fun Project.configureReactTasks(variant: Variant, config: ReactExtensio
|
||||
task.jsBundleDir.set(jsBundleDir)
|
||||
task.resourcesDir.set(resourcesDir)
|
||||
task.hermesEnabled.set(isHermesEnabledInThisVariant)
|
||||
task.hermesV1Enabled.set(isHermesV1Enabled)
|
||||
task.minifyEnabled.set(!isHermesEnabledInThisVariant)
|
||||
task.devEnabled.set(false)
|
||||
task.jsIntermediateSourceMapsDir.set(jsIntermediateSourceMapsDir)
|
||||
|
||||
+1
-4
@@ -63,8 +63,6 @@ abstract class BundleHermesCTask : DefaultTask() {
|
||||
|
||||
@get:Input abstract val hermesEnabled: Property<Boolean>
|
||||
|
||||
@get:Input abstract val hermesV1Enabled: Property<Boolean>
|
||||
|
||||
@get:Input abstract val devEnabled: Property<Boolean>
|
||||
|
||||
@get:Input abstract val extraPackagerArgs: ListProperty<String>
|
||||
@@ -96,8 +94,7 @@ abstract class BundleHermesCTask : DefaultTask() {
|
||||
runCommand(bundleCommand)
|
||||
|
||||
if (hermesEnabled.get()) {
|
||||
val detectedHermesCommand =
|
||||
detectOSAwareHermesCommand(root.get().asFile, hermesCommand.get(), hermesV1Enabled.get())
|
||||
val detectedHermesCommand = detectOSAwareHermesCommand(root.get().asFile, hermesCommand.get())
|
||||
val bytecodeFile = File("${bundleFile}.hbc")
|
||||
val outputSourceMap = resolveOutputSourceMap(bundleAssetFilename)
|
||||
val compilerSourceMap = resolveCompilerSourceMap(bundleAssetFilename)
|
||||
|
||||
+3
-6
@@ -44,12 +44,8 @@ internal object AgpConfiguratorUtils {
|
||||
maybeCreate("debugOptimized").apply {
|
||||
manifestPlaceholders["usesCleartextTraffic"] = "true"
|
||||
initWith(debug)
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments("-DCMAKE_BUILD_TYPE=Release")
|
||||
matchingFallbacks += listOf("release")
|
||||
}
|
||||
}
|
||||
matchingFallbacks += listOf("release")
|
||||
externalNativeBuild { cmake { arguments("-DCMAKE_BUILD_TYPE=Release") } }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -100,6 +96,7 @@ internal object AgpConfiguratorUtils {
|
||||
project.extensions
|
||||
.getByType(ApplicationAndroidComponentsExtension::class.java)
|
||||
.finalizeDsl { ext ->
|
||||
ext.buildFeatures.resValues = true
|
||||
ext.defaultConfig.resValue(
|
||||
"string",
|
||||
"react_native_dev_server_ip",
|
||||
|
||||
+26
-17
@@ -14,6 +14,7 @@ import com.facebook.react.utils.PropertyUtils.INCLUDE_JITPACK_REPOSITORY
|
||||
import com.facebook.react.utils.PropertyUtils.INCLUDE_JITPACK_REPOSITORY_DEFAULT
|
||||
import com.facebook.react.utils.PropertyUtils.INTERNAL_HERMES_PUBLISHING_GROUP
|
||||
import com.facebook.react.utils.PropertyUtils.INTERNAL_HERMES_V1_VERSION_NAME
|
||||
import com.facebook.react.utils.PropertyUtils.INTERNAL_HERMES_VERSION_NAME
|
||||
import com.facebook.react.utils.PropertyUtils.INTERNAL_REACT_NATIVE_MAVEN_LOCAL_REPO
|
||||
import com.facebook.react.utils.PropertyUtils.INTERNAL_REACT_PUBLISHING_GROUP
|
||||
import com.facebook.react.utils.PropertyUtils.INTERNAL_USE_HERMES_NIGHTLY
|
||||
@@ -139,11 +140,7 @@ internal object DependencyUtils {
|
||||
// Contributors only: The hermes-engine version is forced only if the user has
|
||||
// not opted into using nightlies for local development.
|
||||
configuration.resolutionStrategy.force(
|
||||
// TODO: T237406039 update coordinates
|
||||
if (hermesV1Enabled)
|
||||
"${coordinates.hermesGroupString}:hermes-android:${coordinates.hermesV1VersionString}"
|
||||
else
|
||||
"${coordinates.reactGroupString}:hermes-android:${coordinates.hermesVersionString}"
|
||||
"${coordinates.hermesGroupString}:hermes-android:${if (hermesV1Enabled) coordinates.hermesV1VersionString else coordinates.hermesVersionString}"
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -154,13 +151,10 @@ internal object DependencyUtils {
|
||||
coordinates: Coordinates,
|
||||
hermesV1Enabled: Boolean = false,
|
||||
): List<Triple<String, String, String>> {
|
||||
// TODO: T231755027 update coordinates and versioning
|
||||
val dependencySubstitution = mutableListOf<Triple<String, String, String>>()
|
||||
// TODO: T237406039 update coordinates
|
||||
val hermesVersionString =
|
||||
if (hermesV1Enabled)
|
||||
"${coordinates.hermesGroupString}:hermes-android:${coordinates.hermesV1VersionString}"
|
||||
else "${coordinates.reactGroupString}:hermes-android:${coordinates.hermesVersionString}"
|
||||
val hermesVersion =
|
||||
if (hermesV1Enabled) coordinates.hermesV1VersionString else coordinates.hermesVersionString
|
||||
val hermesVersionString = "${coordinates.hermesGroupString}:hermes-android:${hermesVersion}"
|
||||
dependencySubstitution.add(
|
||||
Triple(
|
||||
"com.facebook.react:react-native",
|
||||
@@ -175,6 +169,13 @@ internal object DependencyUtils {
|
||||
"The hermes-engine artifact was deprecated in favor of hermes-android due to https://github.com/facebook/react-native/issues/35210.",
|
||||
)
|
||||
)
|
||||
dependencySubstitution.add(
|
||||
Triple(
|
||||
"com.facebook.react:hermes-android",
|
||||
hermesVersionString,
|
||||
"The hermes-android artifact was moved to com.facebook.hermes publishing group.",
|
||||
)
|
||||
)
|
||||
if (coordinates.reactGroupString != DEFAULT_INTERNAL_REACT_PUBLISHING_GROUP) {
|
||||
dependencySubstitution.add(
|
||||
Triple(
|
||||
@@ -183,7 +184,6 @@ internal object DependencyUtils {
|
||||
"The react-android dependency was modified to use the correct Maven group.",
|
||||
)
|
||||
)
|
||||
// TODO: T237406039 update coordinates
|
||||
dependencySubstitution.add(
|
||||
Triple(
|
||||
"com.facebook.react:hermes-android",
|
||||
@@ -191,12 +191,13 @@ internal object DependencyUtils {
|
||||
"The hermes-android dependency was modified to use the correct Maven group.",
|
||||
)
|
||||
)
|
||||
} else if (hermesV1Enabled) {
|
||||
}
|
||||
if (coordinates.hermesGroupString != DEFAULT_INTERNAL_HERMES_PUBLISHING_GROUP) {
|
||||
dependencySubstitution.add(
|
||||
Triple(
|
||||
"com.facebook.react:hermes-android",
|
||||
"com.facebook.hermes:hermes-android",
|
||||
hermesVersionString,
|
||||
"The hermes-android dependency was modified to use Hermes V1.",
|
||||
"The hermes-android dependency was modified to use the correct Maven group.",
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -221,11 +222,19 @@ internal object DependencyUtils {
|
||||
val hermesGroupString =
|
||||
reactAndroidProperties[INTERNAL_HERMES_PUBLISHING_GROUP] as? String
|
||||
?: DEFAULT_INTERNAL_HERMES_PUBLISHING_GROUP
|
||||
// TODO: T237406039 read both versions from the same file
|
||||
|
||||
val hermesVersionProperties = Properties()
|
||||
hermesVersionFile.inputStream().use { hermesVersionProperties.load(it) }
|
||||
|
||||
val hermesVersion = versionString
|
||||
val hermesVersionString =
|
||||
(hermesVersionProperties[INTERNAL_HERMES_VERSION_NAME] as? String).orEmpty()
|
||||
val hermesVersion =
|
||||
if (hermesVersionString.startsWith("0.0.0") || "-commitly-" in hermesVersionString) {
|
||||
"$hermesVersionString-SNAPSHOT"
|
||||
} else {
|
||||
hermesVersionString
|
||||
}
|
||||
|
||||
val hermesV1Version =
|
||||
(hermesVersionProperties[INTERNAL_HERMES_V1_VERSION_NAME] as? String).orEmpty()
|
||||
|
||||
|
||||
+2
-8
@@ -130,7 +130,6 @@ private fun detectCliFile(reactNativeRoot: File, preconfiguredCliFile: File?): F
|
||||
internal fun detectOSAwareHermesCommand(
|
||||
projectRoot: File,
|
||||
hermesCommand: String,
|
||||
hermesV1Enabled: Boolean = false,
|
||||
): String { // 1. If the project specifies a Hermes command, don't second guess it.
|
||||
if (hermesCommand.isNotBlank()) {
|
||||
val osSpecificHermesCommand =
|
||||
@@ -151,13 +150,9 @@ internal fun detectOSAwareHermesCommand(
|
||||
return builtHermesc.cliPath(projectRoot)
|
||||
}
|
||||
|
||||
// 3. If Hermes V1 is enabled, use hermes-compiler from npm, otherwise, if the
|
||||
// react-native contains a pre-built hermesc, use it.
|
||||
// TODO: T237406039 use hermes-compiler from npm for both
|
||||
val hermesCPath = if (hermesV1Enabled) HERMES_COMPILER_NPM_DIR else HERMESC_IN_REACT_NATIVE_DIR
|
||||
// 3. Use hermes-compiler from npm
|
||||
val prebuiltHermesPath =
|
||||
hermesCPath
|
||||
.plus(getHermesCBin())
|
||||
HERMES_COMPILER_NPM_DIR.plus(getHermesCBin())
|
||||
.replace("%OS-BIN%", getHermesOSBin())
|
||||
// Execution on Windows fails with / as separator
|
||||
.replace('/', File.separatorChar)
|
||||
@@ -243,6 +238,5 @@ internal fun readPackageJsonFile(
|
||||
}
|
||||
|
||||
private const val HERMES_COMPILER_NPM_DIR = "node_modules/hermes-compiler/hermesc/%OS-BIN%/"
|
||||
private const val HERMESC_IN_REACT_NATIVE_DIR = "node_modules/react-native/sdks/hermesc/%OS-BIN%/"
|
||||
private const val HERMESC_BUILT_FROM_SOURCE_DIR =
|
||||
"node_modules/react-native/ReactAndroid/hermes-engine/build/hermes/bin/"
|
||||
|
||||
+3
-2
@@ -81,8 +81,9 @@ object PropertyUtils {
|
||||
const val INTERNAL_VERSION_NAME = "VERSION_NAME"
|
||||
|
||||
/**
|
||||
* Internal property, shared with iOS, used to control the version name of Hermes Engine. This is
|
||||
* stored in sdks/hermes-engine/version.properties
|
||||
* Internal properties, shared with iOS, used to control the version name of Hermes Engine. They
|
||||
* are stored in sdks/hermes-engine/version.properties
|
||||
*/
|
||||
const val INTERNAL_HERMES_VERSION_NAME = "HERMES_VERSION_NAME"
|
||||
const val INTERNAL_HERMES_V1_VERSION_NAME = "HERMES_V1_VERSION_NAME"
|
||||
}
|
||||
|
||||
+42
-21
@@ -289,7 +289,7 @@ class DependencyUtilsTest {
|
||||
val forcedModules = project.configurations.first().resolutionStrategy.forcedModules
|
||||
assertThat(forcedModules.any { it.toString() == "com.facebook.react:react-android:1.2.3" })
|
||||
.isTrue()
|
||||
assertThat(forcedModules.any { it.toString() == "com.facebook.react:hermes-android:4.5.6" })
|
||||
assertThat(forcedModules.any { it.toString() == "com.facebook.hermes:hermes-android:4.5.6" })
|
||||
.isTrue()
|
||||
}
|
||||
|
||||
@@ -324,11 +324,11 @@ class DependencyUtilsTest {
|
||||
val libForcedModules = libProject.configurations.first().resolutionStrategy.forcedModules
|
||||
assertThat(appForcedModules.any { it.toString() == "com.facebook.react:react-android:1.2.3" })
|
||||
.isTrue()
|
||||
assertThat(appForcedModules.any { it.toString() == "com.facebook.react:hermes-android:4.5.6" })
|
||||
assertThat(appForcedModules.any { it.toString() == "com.facebook.hermes:hermes-android:4.5.6" })
|
||||
.isTrue()
|
||||
assertThat(libForcedModules.any { it.toString() == "com.facebook.react:react-android:1.2.3" })
|
||||
.isTrue()
|
||||
assertThat(libForcedModules.any { it.toString() == "com.facebook.react:hermes-android:4.5.6" })
|
||||
assertThat(libForcedModules.any { it.toString() == "com.facebook.hermes:hermes-android:4.5.6" })
|
||||
.isTrue()
|
||||
}
|
||||
|
||||
@@ -381,11 +381,15 @@ class DependencyUtilsTest {
|
||||
val libForcedModules = libProject.configurations.first().resolutionStrategy.forcedModules
|
||||
assertThat(appForcedModules.any { it.toString() == "io.github.test:react-android:1.2.3" })
|
||||
.isTrue()
|
||||
assertThat(appForcedModules.any { it.toString() == "io.github.test:hermes-android:4.5.6" })
|
||||
assertThat(
|
||||
appForcedModules.any { it.toString() == "io.github.test.hermes:hermes-android:4.5.6" }
|
||||
)
|
||||
.isTrue()
|
||||
assertThat(libForcedModules.any { it.toString() == "io.github.test:react-android:1.2.3" })
|
||||
.isTrue()
|
||||
assertThat(libForcedModules.any { it.toString() == "io.github.test:hermes-android:4.5.6" })
|
||||
assertThat(
|
||||
libForcedModules.any { it.toString() == "io.github.test.hermes:hermes-android:4.5.6" }
|
||||
)
|
||||
.isTrue()
|
||||
}
|
||||
|
||||
@@ -438,7 +442,7 @@ class DependencyUtilsTest {
|
||||
)
|
||||
.isEqualTo(dependencySubstitutions[0].third)
|
||||
assertThat("com.facebook.react:hermes-engine").isEqualTo(dependencySubstitutions[1].first)
|
||||
assertThat("com.facebook.react:hermes-android:0.42.0")
|
||||
assertThat("com.facebook.hermes:hermes-android:0.42.0")
|
||||
.isEqualTo(dependencySubstitutions[1].second)
|
||||
assertThat(
|
||||
"The hermes-engine artifact was deprecated in favor of hermes-android due to https://github.com/facebook/react-native/issues/35210."
|
||||
@@ -490,19 +494,26 @@ class DependencyUtilsTest {
|
||||
)
|
||||
.isEqualTo(dependencySubstitutions[0].third)
|
||||
assertThat("com.facebook.react:hermes-engine").isEqualTo(dependencySubstitutions[1].first)
|
||||
assertThat("io.github.test:hermes-android:0.42.0").isEqualTo(dependencySubstitutions[1].second)
|
||||
assertThat("io.github.test.hermes:hermes-android:0.42.0")
|
||||
.isEqualTo(dependencySubstitutions[1].second)
|
||||
assertThat(
|
||||
"The hermes-engine artifact was deprecated in favor of hermes-android due to https://github.com/facebook/react-native/issues/35210."
|
||||
)
|
||||
.isEqualTo(dependencySubstitutions[1].third)
|
||||
assertThat("com.facebook.react:react-android").isEqualTo(dependencySubstitutions[2].first)
|
||||
assertThat("io.github.test:react-android:0.42.0").isEqualTo(dependencySubstitutions[2].second)
|
||||
assertThat("The react-android dependency was modified to use the correct Maven group.")
|
||||
assertThat("com.facebook.react:hermes-android").isEqualTo(dependencySubstitutions[2].first)
|
||||
assertThat("io.github.test.hermes:hermes-android:0.42.0")
|
||||
.isEqualTo(dependencySubstitutions[2].second)
|
||||
assertThat("The hermes-android artifact was moved to com.facebook.hermes publishing group.")
|
||||
.isEqualTo(dependencySubstitutions[2].third)
|
||||
assertThat("com.facebook.react:hermes-android").isEqualTo(dependencySubstitutions[3].first)
|
||||
assertThat("io.github.test:hermes-android:0.42.0").isEqualTo(dependencySubstitutions[3].second)
|
||||
assertThat("The hermes-android dependency was modified to use the correct Maven group.")
|
||||
assertThat("com.facebook.react:react-android").isEqualTo(dependencySubstitutions[3].first)
|
||||
assertThat("io.github.test:react-android:0.42.0").isEqualTo(dependencySubstitutions[3].second)
|
||||
assertThat("The react-android dependency was modified to use the correct Maven group.")
|
||||
.isEqualTo(dependencySubstitutions[3].third)
|
||||
assertThat("com.facebook.react:hermes-android").isEqualTo(dependencySubstitutions[4].first)
|
||||
assertThat("io.github.test.hermes:hermes-android:0.42.0")
|
||||
.isEqualTo(dependencySubstitutions[4].second)
|
||||
assertThat("The hermes-android dependency was modified to use the correct Maven group.")
|
||||
.isEqualTo(dependencySubstitutions[4].third)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -532,15 +543,20 @@ class DependencyUtilsTest {
|
||||
"The hermes-engine artifact was deprecated in favor of hermes-android due to https://github.com/facebook/react-native/issues/35210."
|
||||
)
|
||||
.isEqualTo(dependencySubstitutions[1].third)
|
||||
assertThat("com.facebook.react:react-android").isEqualTo(dependencySubstitutions[2].first)
|
||||
assertThat("io.github.test:react-android:0.42.0").isEqualTo(dependencySubstitutions[2].second)
|
||||
assertThat("The react-android dependency was modified to use the correct Maven group.")
|
||||
.isEqualTo(dependencySubstitutions[2].third)
|
||||
assertThat("com.facebook.react:hermes-android").isEqualTo(dependencySubstitutions[3].first)
|
||||
assertThat("com.facebook.react:hermes-android").isEqualTo(dependencySubstitutions[2].first)
|
||||
assertThat("io.github.test.hermes:hermes-android:0.43.0")
|
||||
.isEqualTo(dependencySubstitutions[3].second)
|
||||
assertThat("The hermes-android dependency was modified to use the correct Maven group.")
|
||||
.isEqualTo(dependencySubstitutions[2].second)
|
||||
assertThat("The hermes-android artifact was moved to com.facebook.hermes publishing group.")
|
||||
.isEqualTo(dependencySubstitutions[2].third)
|
||||
assertThat("com.facebook.react:react-android").isEqualTo(dependencySubstitutions[3].first)
|
||||
assertThat("io.github.test:react-android:0.42.0").isEqualTo(dependencySubstitutions[3].second)
|
||||
assertThat("The react-android dependency was modified to use the correct Maven group.")
|
||||
.isEqualTo(dependencySubstitutions[3].third)
|
||||
assertThat("com.facebook.react:hermes-android").isEqualTo(dependencySubstitutions[4].first)
|
||||
assertThat("io.github.test.hermes:hermes-android:0.43.0")
|
||||
.isEqualTo(dependencySubstitutions[4].second)
|
||||
assertThat("The hermes-android dependency was modified to use the correct Maven group.")
|
||||
.isEqualTo(dependencySubstitutions[4].third)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -560,6 +576,7 @@ class DependencyUtilsTest {
|
||||
tempFolder.newFile("version.properties").apply {
|
||||
writeText(
|
||||
"""
|
||||
HERMES_VERSION_NAME=1000.0.0
|
||||
HERMES_V1_VERSION_NAME=1000.0.0
|
||||
ANOTHER_PROPERTY=true
|
||||
"""
|
||||
@@ -596,6 +613,7 @@ class DependencyUtilsTest {
|
||||
tempFolder.newFile("version.properties").apply {
|
||||
writeText(
|
||||
"""
|
||||
HERMES_VERSION_NAME=0.14.0
|
||||
HERMES_V1_VERSION_NAME=250829098.0.0-stable
|
||||
ANOTHER_PROPERTY=true
|
||||
"""
|
||||
@@ -609,7 +627,7 @@ class DependencyUtilsTest {
|
||||
val hermesV1VersionString = strings.hermesV1VersionString
|
||||
|
||||
assertThat(versionString).isEqualTo("0.0.0-20221101-2019-cfe811ab1-SNAPSHOT")
|
||||
assertThat(hermesVersionString).isEqualTo("0.0.0-20221101-2019-cfe811ab1-SNAPSHOT")
|
||||
assertThat(hermesVersionString).isEqualTo("0.14.0")
|
||||
assertThat(hermesV1VersionString).isEqualTo("250829098.0.0-stable")
|
||||
}
|
||||
|
||||
@@ -661,6 +679,7 @@ class DependencyUtilsTest {
|
||||
tempFolder.newFile("version.properties").apply {
|
||||
writeText(
|
||||
"""
|
||||
HERMES_VERSION_NAME=
|
||||
HERMES_V1_VERSION_NAME=
|
||||
ANOTHER_PROPERTY=true
|
||||
"""
|
||||
@@ -695,6 +714,7 @@ class DependencyUtilsTest {
|
||||
tempFolder.newFile("version.properties").apply {
|
||||
writeText(
|
||||
"""
|
||||
HERMES_VERSION_NAME=
|
||||
HERMES_V1_VERSION_NAME=
|
||||
ANOTHER_PROPERTY=true
|
||||
"""
|
||||
@@ -726,6 +746,7 @@ class DependencyUtilsTest {
|
||||
tempFolder.newFile("version.properties").apply {
|
||||
writeText(
|
||||
"""
|
||||
HERMES_VERSION_NAME=
|
||||
HERMES_V1_VERSION_NAME=
|
||||
ANOTHER_PROPERTY=true
|
||||
"""
|
||||
|
||||
+2
-12
@@ -155,21 +155,11 @@ class PathUtilsTest {
|
||||
|
||||
@Test
|
||||
@WithOs(OS.MAC)
|
||||
fun detectOSAwareHermesCommand_withBundledHermescInsideRN() {
|
||||
tempFolder.newFolder("node_modules/react-native/sdks/hermesc/osx-bin/")
|
||||
val expected = tempFolder.newFile("node_modules/react-native/sdks/hermesc/osx-bin/hermesc")
|
||||
|
||||
assertThat(detectOSAwareHermesCommand(tempFolder.root, "")).isEqualTo(expected.toString())
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithOs(OS.MAC)
|
||||
fun detectOSAwareHermesCommand_withHermesV1Enabled() {
|
||||
fun detectOSAwareHermesCommand_withHermescFromNPM() {
|
||||
tempFolder.newFolder("node_modules/hermes-compiler/hermesc/osx-bin/")
|
||||
val expected = tempFolder.newFile("node_modules/hermes-compiler/hermesc/osx-bin/hermesc")
|
||||
|
||||
assertThat(detectOSAwareHermesCommand(tempFolder.root, "", hermesV1Enabled = true))
|
||||
.isEqualTo(expected.toString())
|
||||
assertThat(detectOSAwareHermesCommand(tempFolder.root, "")).isEqualTo(expected.toString())
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException::class)
|
||||
|
||||
@@ -123,7 +123,8 @@ function getHermesLabel(): React.Node {
|
||||
|
||||
return (
|
||||
<ThemedText color="secondary" style={styles.label}>
|
||||
JS Engine: Hermes
|
||||
JS Engine: Hermes (
|
||||
{global.HermesInternal.getRuntimeProperties?.()['OSS Release Version']})
|
||||
</ThemedText>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -26,7 +26,9 @@ describe('console.timeStamp()', () => {
|
||||
|
||||
it("doesn't throw when additional arguments are specified", () => {
|
||||
expect(() =>
|
||||
console.timeStamp('label', 100, 500, 'Track', 'Group', 'error'),
|
||||
console.timeStamp('label', 100, 500, 'Track', 'Group', 'error', {
|
||||
tooltipText: 'Image processing failed',
|
||||
}),
|
||||
).not.toThrow();
|
||||
});
|
||||
|
||||
|
||||
+11
-2
@@ -20,6 +20,10 @@ const EXCLUDED_FIRST_PARTY_PATHS = [
|
||||
/[/\\]private[/\\]react-native-fantom[/\\]/,
|
||||
];
|
||||
|
||||
// customTransformOptions may be strings from URL params, or booleans passed
|
||||
// programatically. For strings, handle them as Metro does when parsing URLs.
|
||||
const TRUE_VALS = new Set([true, 'true', '1']);
|
||||
|
||||
function isTypeScriptSource(fileName) {
|
||||
return !!fileName && fileName.endsWith('.ts');
|
||||
}
|
||||
@@ -55,6 +59,9 @@ const getPreset = (src, options) => {
|
||||
|
||||
const isNull = src == null;
|
||||
const hasClass = isNull || src.indexOf('class') !== -1;
|
||||
const preserveClasses = TRUE_VALS.has(
|
||||
options?.customTransformOptions?.unstable_preserveClasses,
|
||||
);
|
||||
|
||||
const extraPlugins = [];
|
||||
const firstPartyPlugins = [];
|
||||
@@ -91,7 +98,7 @@ const getPreset = (src, options) => {
|
||||
);
|
||||
}
|
||||
|
||||
if (hasClass) {
|
||||
if (hasClass && !preserveClasses) {
|
||||
extraPlugins.push([require('@babel/plugin-transform-classes')]);
|
||||
}
|
||||
|
||||
@@ -235,7 +242,9 @@ const getPreset = (src, options) => {
|
||||
],
|
||||
[require('babel-plugin-transform-flow-enums')],
|
||||
[require('@babel/plugin-transform-block-scoping')],
|
||||
[require('@babel/plugin-transform-class-properties'), {loose}],
|
||||
...(preserveClasses
|
||||
? []
|
||||
: [[require('@babel/plugin-transform-class-properties'), {loose}]]),
|
||||
[require('@babel/plugin-transform-private-methods'), {loose}],
|
||||
[
|
||||
require('@babel/plugin-transform-private-property-in-object'),
|
||||
|
||||
-51
@@ -1,51 +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.
|
||||
*
|
||||
* @flow strict-local
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {SchemaType} from '../../../../src/CodegenSchema';
|
||||
|
||||
const generator = require('../../../../src/generators/modules/GenerateModuleCpp');
|
||||
const {FlowParser} = require('../../../../src/parsers/flow/parser');
|
||||
const fs = require('fs');
|
||||
|
||||
const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/modules`;
|
||||
|
||||
const parser = new FlowParser();
|
||||
|
||||
function getModules(): SchemaType {
|
||||
const filenames: Array<string> = fs.readdirSync(FIXTURE_DIR);
|
||||
return filenames.reduce<SchemaType>(
|
||||
(accumulator, file) => {
|
||||
const schema = parser.parseFile(`${FIXTURE_DIR}/${file}`);
|
||||
return {
|
||||
modules: {
|
||||
...accumulator.modules,
|
||||
...schema.modules,
|
||||
},
|
||||
};
|
||||
},
|
||||
{modules: {}},
|
||||
);
|
||||
}
|
||||
|
||||
describe('GenerateModuleCpp', () => {
|
||||
it('can generate an implementation file NativeModule specs', () => {
|
||||
const libName = 'RNCodegenModuleFixtures';
|
||||
const output = generator.generate(libName, getModules(), undefined, false);
|
||||
expect(output.get(libName + 'JSI-generated.cpp')).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('can generate a header file NativeModule specs with assume nonnull enabled', () => {
|
||||
const libName = 'RNCodegenModuleFixtures';
|
||||
const output = generator.generate(libName, getModules(), undefined, true);
|
||||
expect(output.get(libName + 'JSI-generated.cpp')).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
-1643
File diff suppressed because it is too large
Load Diff
+1696
-2762
File diff suppressed because it is too large
Load Diff
@@ -36,7 +36,6 @@ const generateTests = require('./components/GenerateTests.js');
|
||||
const generateThirdPartyFabricComponentsProviderH = require('./components/GenerateThirdPartyFabricComponentsProviderH.js');
|
||||
const generateThirdPartyFabricComponentsProviderObjCpp = require('./components/GenerateThirdPartyFabricComponentsProviderObjCpp.js');
|
||||
const generateViewConfigJs = require('./components/GenerateViewConfigJs.js');
|
||||
const generateModuleCpp = require('./modules/GenerateModuleCpp.js');
|
||||
const generateModuleH = require('./modules/GenerateModuleH.js');
|
||||
const generateModuleJavaSpec = require('./modules/GenerateModuleJavaSpec.js');
|
||||
const generateModuleJniCpp = require('./modules/GenerateModuleJniCpp.js');
|
||||
@@ -56,7 +55,6 @@ const ALL_GENERATORS = {
|
||||
generateStateCpp: generateStateCpp.generate,
|
||||
generateStateH: generateStateH.generate,
|
||||
generateModuleH: generateModuleH.generate,
|
||||
generateModuleCpp: generateModuleCpp.generate,
|
||||
generateModuleObjCpp: generateModuleObjCpp.generate,
|
||||
generateModuleJavaSpec: generateModuleJavaSpec.generate,
|
||||
generateModuleJniCpp: generateModuleJniCpp.generate,
|
||||
@@ -179,7 +177,7 @@ const LIBRARY_GENERATORS: LibraryGeneratorsFunctions = {
|
||||
generateModuleJniH.generate,
|
||||
generateModuleJavaSpec.generate,
|
||||
],
|
||||
modulesCxx: [generateModuleCpp.generate, generateModuleH.generate],
|
||||
modulesCxx: [generateModuleH.generate],
|
||||
modulesIOS: [generateModuleObjCpp.generate],
|
||||
tests: [generateTests.generate],
|
||||
'shadow-nodes': [
|
||||
|
||||
@@ -1,296 +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.
|
||||
*
|
||||
* @flow strict
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {
|
||||
NamedShape,
|
||||
NativeModuleEnumMap,
|
||||
NativeModuleFunctionTypeAnnotation,
|
||||
NativeModuleParamTypeAnnotation,
|
||||
NativeModulePropertyShape,
|
||||
NativeModuleTypeAnnotation,
|
||||
Nullable,
|
||||
SchemaType,
|
||||
} from '../../CodegenSchema';
|
||||
import type {AliasResolver} from './Utils';
|
||||
|
||||
const {unwrapNullable} = require('../../parsers/parsers-commons');
|
||||
const {createAliasResolver, getModules} = require('./Utils');
|
||||
|
||||
type FilesOutput = Map<string, string>;
|
||||
|
||||
const HostFunctionTemplate = ({
|
||||
hasteModuleName,
|
||||
methodName,
|
||||
returnTypeAnnotation,
|
||||
args,
|
||||
}: $ReadOnly<{
|
||||
hasteModuleName: string,
|
||||
methodName: string,
|
||||
returnTypeAnnotation: Nullable<NativeModuleTypeAnnotation>,
|
||||
args: Array<string>,
|
||||
}>) => {
|
||||
const isNullable = returnTypeAnnotation.type === 'NullableTypeAnnotation';
|
||||
const isVoid = returnTypeAnnotation.type === 'VoidTypeAnnotation';
|
||||
const methodCallArgs = [' rt', ...args].join(',\n ');
|
||||
const methodCall = `static_cast<${hasteModuleName}CxxSpecJSI *>(&turboModule)->${methodName}(\n${methodCallArgs}\n )`;
|
||||
|
||||
return `static jsi::Value __hostFunction_${hasteModuleName}CxxSpecJSI_${methodName}(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {${
|
||||
isVoid
|
||||
? `\n ${methodCall};`
|
||||
: isNullable
|
||||
? `\n auto result = ${methodCall};`
|
||||
: ''
|
||||
}
|
||||
return ${
|
||||
isVoid
|
||||
? 'jsi::Value::undefined()'
|
||||
: isNullable
|
||||
? 'result ? jsi::Value(std::move(*result)) : jsi::Value::null()'
|
||||
: methodCall
|
||||
};
|
||||
}`;
|
||||
};
|
||||
|
||||
const ModuleTemplate = ({
|
||||
hasteModuleName,
|
||||
hostFunctions,
|
||||
moduleName,
|
||||
methods,
|
||||
}: $ReadOnly<{
|
||||
hasteModuleName: string,
|
||||
hostFunctions: $ReadOnlyArray<string>,
|
||||
moduleName: string,
|
||||
methods: $ReadOnlyArray<$ReadOnly<{methodName: string, paramCount: number}>>,
|
||||
}>) => {
|
||||
return `${hostFunctions.join('\n')}
|
||||
|
||||
${hasteModuleName}CxxSpecJSI::${hasteModuleName}CxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule("${moduleName}", jsInvoker) {
|
||||
${methods
|
||||
.map(({methodName, paramCount}) => {
|
||||
return ` methodMap_["${methodName}"] = MethodMetadata {${paramCount}, __hostFunction_${hasteModuleName}CxxSpecJSI_${methodName}};`;
|
||||
})
|
||||
.join('\n')}
|
||||
}`;
|
||||
};
|
||||
|
||||
const FileTemplate = ({
|
||||
libraryName,
|
||||
modules,
|
||||
}: $ReadOnly<{
|
||||
libraryName: string,
|
||||
modules: string,
|
||||
}>) => {
|
||||
return `/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* ${'@'}generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include "${libraryName}JSI.h"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
${modules}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
`;
|
||||
};
|
||||
|
||||
type Param = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;
|
||||
|
||||
function serializeArg(
|
||||
moduleName: string,
|
||||
arg: Param,
|
||||
index: number,
|
||||
resolveAlias: AliasResolver,
|
||||
enumMap: NativeModuleEnumMap,
|
||||
): string {
|
||||
const {typeAnnotation: nullableTypeAnnotation, optional} = arg;
|
||||
const [typeAnnotation, nullable] =
|
||||
unwrapNullable<NativeModuleParamTypeAnnotation>(nullableTypeAnnotation);
|
||||
|
||||
let realTypeAnnotation = typeAnnotation;
|
||||
if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
|
||||
realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
|
||||
}
|
||||
|
||||
function wrap(callback: (val: string) => string) {
|
||||
const val = `args[${index}]`;
|
||||
const expression = callback(val);
|
||||
|
||||
// param?: T
|
||||
if (optional && !nullable) {
|
||||
// throw new Error('are we hitting this case? ' + moduleName);
|
||||
return `count <= ${index} || ${val}.isUndefined() ? std::nullopt : std::make_optional(${expression})`;
|
||||
}
|
||||
|
||||
// param: ?T
|
||||
// param?: ?T
|
||||
if (nullable || optional) {
|
||||
return `count <= ${index} || ${val}.isNull() || ${val}.isUndefined() ? std::nullopt : std::make_optional(${expression})`;
|
||||
}
|
||||
|
||||
// param: T
|
||||
return `count <= ${index} ? throw jsi::JSError(rt, "Expected argument in position ${index} to be passed") : ${expression}`;
|
||||
}
|
||||
|
||||
switch (realTypeAnnotation.type) {
|
||||
case 'ReservedTypeAnnotation':
|
||||
switch (realTypeAnnotation.name) {
|
||||
case 'RootTag':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
default:
|
||||
(realTypeAnnotation.name: empty);
|
||||
throw new Error(
|
||||
`Unknown prop type for "${arg.name}, found: ${realTypeAnnotation.name}"`,
|
||||
);
|
||||
}
|
||||
case 'StringTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
case 'StringLiteralTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
case 'StringLiteralUnionTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
case 'BooleanTypeAnnotation':
|
||||
return wrap(val => `${val}.asBool()`);
|
||||
case 'EnumDeclaration':
|
||||
switch (realTypeAnnotation.memberType) {
|
||||
case 'NumberTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'StringTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
default:
|
||||
throw new Error(
|
||||
`Unknown enum type for "${arg.name}, found: ${realTypeAnnotation.type}"`,
|
||||
);
|
||||
}
|
||||
case 'NumberTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'FloatTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'DoubleTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'Int32TypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'NumberLiteralTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'ArrayTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt).asArray(rt)`);
|
||||
case 'FunctionTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt).asFunction(rt)`);
|
||||
case 'GenericObjectTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt)`);
|
||||
case 'UnionTypeAnnotation':
|
||||
switch (typeAnnotation.memberType) {
|
||||
case 'NumberTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'ObjectTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt)`);
|
||||
case 'StringTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
default:
|
||||
throw new Error(
|
||||
`Unsupported union member type for param "${arg.name}, found: ${realTypeAnnotation.memberType}"`,
|
||||
);
|
||||
}
|
||||
case 'ObjectTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt)`);
|
||||
case 'MixedTypeAnnotation':
|
||||
return wrap(val => `jsi::Value(rt, ${val})`);
|
||||
default:
|
||||
(realTypeAnnotation.type: empty);
|
||||
throw new Error(
|
||||
`Unknown prop type for "${arg.name}, found: ${realTypeAnnotation.type}"`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function serializePropertyIntoHostFunction(
|
||||
moduleName: string,
|
||||
hasteModuleName: string,
|
||||
property: NativeModulePropertyShape,
|
||||
resolveAlias: AliasResolver,
|
||||
enumMap: NativeModuleEnumMap,
|
||||
): string {
|
||||
const [propertyTypeAnnotation] =
|
||||
unwrapNullable<NativeModuleFunctionTypeAnnotation>(property.typeAnnotation);
|
||||
|
||||
return HostFunctionTemplate({
|
||||
hasteModuleName,
|
||||
methodName: property.name,
|
||||
returnTypeAnnotation: propertyTypeAnnotation.returnTypeAnnotation,
|
||||
args: propertyTypeAnnotation.params.map((p, i) =>
|
||||
serializeArg(moduleName, p, i, resolveAlias, enumMap),
|
||||
),
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
generate(
|
||||
libraryName: string,
|
||||
schema: SchemaType,
|
||||
packageName?: string,
|
||||
assumeNonnull: boolean = false,
|
||||
headerPrefix?: string,
|
||||
): FilesOutput {
|
||||
const nativeModules = getModules(schema);
|
||||
|
||||
const modules = Object.keys(nativeModules)
|
||||
.map((hasteModuleName: string) => {
|
||||
const nativeModule = nativeModules[hasteModuleName];
|
||||
const {
|
||||
aliasMap,
|
||||
enumMap,
|
||||
spec: {methods},
|
||||
moduleName,
|
||||
} = nativeModule;
|
||||
const resolveAlias = createAliasResolver(aliasMap);
|
||||
const hostFunctions = methods.map(property =>
|
||||
serializePropertyIntoHostFunction(
|
||||
moduleName,
|
||||
hasteModuleName,
|
||||
property,
|
||||
resolveAlias,
|
||||
enumMap,
|
||||
),
|
||||
);
|
||||
|
||||
return ModuleTemplate({
|
||||
hasteModuleName,
|
||||
hostFunctions,
|
||||
moduleName,
|
||||
methods: methods.map(
|
||||
({name: propertyName, typeAnnotation: nullableTypeAnnotation}) => {
|
||||
const [{params}] = unwrapNullable(nullableTypeAnnotation);
|
||||
return {
|
||||
methodName: propertyName,
|
||||
paramCount: params.length,
|
||||
};
|
||||
},
|
||||
),
|
||||
});
|
||||
})
|
||||
.join('\n');
|
||||
|
||||
const fileName = `${libraryName}JSI-generated.cpp`;
|
||||
const replacedTemplate = FileTemplate({
|
||||
modules,
|
||||
libraryName,
|
||||
});
|
||||
return new Map([[fileName, replacedTemplate]]);
|
||||
},
|
||||
};
|
||||
@@ -9,17 +9,17 @@
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {
|
||||
NamedShape,
|
||||
NativeModuleBaseTypeAnnotation,
|
||||
} from '../../CodegenSchema';
|
||||
import type {
|
||||
NativeModuleAliasMap,
|
||||
NativeModuleBaseTypeAnnotation,
|
||||
NativeModuleEnumMap,
|
||||
NativeModuleEnumMember,
|
||||
NativeModuleEnumMemberType,
|
||||
NativeModuleEventEmitterShape,
|
||||
NativeModuleFunctionTypeAnnotation,
|
||||
NativeModuleParamTypeAnnotation,
|
||||
NativeModulePropertyShape,
|
||||
NativeModuleTypeAnnotation,
|
||||
Nullable,
|
||||
@@ -30,7 +30,6 @@ import type {AliasResolver} from './Utils';
|
||||
const {unwrapNullable} = require('../../parsers/parsers-commons');
|
||||
const {wrapOptional} = require('../TypeUtils/Cxx');
|
||||
const {getEnumName, toPascalCase, toSafeCppString} = require('../Utils');
|
||||
const {indent} = require('../Utils');
|
||||
const {
|
||||
createAliasResolver,
|
||||
getModules,
|
||||
@@ -40,74 +39,151 @@ const {
|
||||
|
||||
type FilesOutput = Map<string, string>;
|
||||
|
||||
const ModuleClassDeclarationTemplate = ({
|
||||
hasteModuleName,
|
||||
moduleProperties,
|
||||
structs,
|
||||
enums,
|
||||
}: $ReadOnly<{
|
||||
hasteModuleName: string,
|
||||
moduleProperties: string[],
|
||||
structs: string,
|
||||
enums: string,
|
||||
}>) => {
|
||||
return `${enums}
|
||||
${structs}class JSI_EXPORT ${hasteModuleName}CxxSpecJSI : public TurboModule {
|
||||
protected:
|
||||
${hasteModuleName}CxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);
|
||||
type Param = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;
|
||||
|
||||
public:
|
||||
${indent(moduleProperties.join('\n'), 2)}
|
||||
function serializeArg(
|
||||
moduleName: string,
|
||||
arg: Param,
|
||||
index: number,
|
||||
resolveAlias: AliasResolver,
|
||||
enumMap: NativeModuleEnumMap,
|
||||
): string {
|
||||
const {typeAnnotation: nullableTypeAnnotation, optional} = arg;
|
||||
const [typeAnnotation, nullable] =
|
||||
unwrapNullable<NativeModuleParamTypeAnnotation>(nullableTypeAnnotation);
|
||||
|
||||
};`;
|
||||
};
|
||||
let realTypeAnnotation = typeAnnotation;
|
||||
if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
|
||||
realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
|
||||
}
|
||||
|
||||
function wrap(callback: (val: string) => string) {
|
||||
const val = `args[${index}]`;
|
||||
const expression = callback(val);
|
||||
|
||||
// param?: T
|
||||
if (optional && !nullable) {
|
||||
// throw new Error('are we hitting this case? ' + moduleName);
|
||||
return `count <= ${index} || ${val}.isUndefined() ? std::nullopt : std::make_optional(${expression})`;
|
||||
}
|
||||
|
||||
// param: ?T
|
||||
// param?: ?T
|
||||
if (nullable || optional) {
|
||||
return `count <= ${index} || ${val}.isNull() || ${val}.isUndefined() ? std::nullopt : std::make_optional(${expression})`;
|
||||
}
|
||||
|
||||
// param: T
|
||||
return `count <= ${index} ? throw jsi::JSError(rt, "Expected argument in position ${index} to be passed") : ${expression}`;
|
||||
}
|
||||
|
||||
switch (realTypeAnnotation.type) {
|
||||
case 'ReservedTypeAnnotation':
|
||||
switch (realTypeAnnotation.name) {
|
||||
case 'RootTag':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
default:
|
||||
(realTypeAnnotation.name: empty);
|
||||
throw new Error(
|
||||
`Unknown prop type for "${arg.name}, found: ${realTypeAnnotation.name}"`,
|
||||
);
|
||||
}
|
||||
case 'StringTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
case 'StringLiteralTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
case 'StringLiteralUnionTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
case 'BooleanTypeAnnotation':
|
||||
return wrap(val => `${val}.asBool()`);
|
||||
case 'EnumDeclaration':
|
||||
switch (realTypeAnnotation.memberType) {
|
||||
case 'NumberTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'StringTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
default:
|
||||
throw new Error(
|
||||
`Unknown enum type for "${arg.name}, found: ${realTypeAnnotation.type}"`,
|
||||
);
|
||||
}
|
||||
case 'NumberTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'FloatTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'DoubleTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'Int32TypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'NumberLiteralTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'ArrayTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt).asArray(rt)`);
|
||||
case 'FunctionTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt).asFunction(rt)`);
|
||||
case 'GenericObjectTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt)`);
|
||||
case 'UnionTypeAnnotation':
|
||||
switch (typeAnnotation.memberType) {
|
||||
case 'NumberTypeAnnotation':
|
||||
return wrap(val => `${val}.asNumber()`);
|
||||
case 'ObjectTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt)`);
|
||||
case 'StringTypeAnnotation':
|
||||
return wrap(val => `${val}.asString(rt)`);
|
||||
default:
|
||||
throw new Error(
|
||||
`Unsupported union member type for param "${arg.name}, found: ${realTypeAnnotation.memberType}"`,
|
||||
);
|
||||
}
|
||||
case 'ObjectTypeAnnotation':
|
||||
return wrap(val => `${val}.asObject(rt)`);
|
||||
case 'MixedTypeAnnotation':
|
||||
return wrap(val => `jsi::Value(rt, ${val})`);
|
||||
default:
|
||||
(realTypeAnnotation.type: empty);
|
||||
throw new Error(
|
||||
`Unknown prop type for "${arg.name}, found: ${realTypeAnnotation.type}"`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const ModuleSpecClassDeclarationTemplate = ({
|
||||
hasteModuleName,
|
||||
moduleName,
|
||||
structs,
|
||||
enums,
|
||||
moduleEventEmitters,
|
||||
moduleProperties,
|
||||
moduleFunctions,
|
||||
methods,
|
||||
}: $ReadOnly<{
|
||||
hasteModuleName: string,
|
||||
moduleName: string,
|
||||
structs: string,
|
||||
enums: string,
|
||||
moduleEventEmitters: EventEmitterCpp[],
|
||||
moduleProperties: string[],
|
||||
moduleFunctions: string[],
|
||||
methods: $ReadOnlyArray<$ReadOnly<{methodName: string, paramCount: number}>>,
|
||||
}>) => {
|
||||
return `template <typename T>
|
||||
return `${enums}${structs}
|
||||
template <typename T>
|
||||
class JSI_EXPORT ${hasteModuleName}CxxSpec : public TurboModule {
|
||||
public:
|
||||
jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
|
||||
return delegate_.create(rt, propName);
|
||||
}
|
||||
|
||||
std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime& runtime) override {
|
||||
return delegate_.getPropertyNames(runtime);
|
||||
}
|
||||
|
||||
static constexpr std::string_view kModuleName = "${moduleName}";
|
||||
|
||||
protected:
|
||||
${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker),
|
||||
delegate_(reinterpret_cast<T*>(this), jsInvoker) {}
|
||||
${moduleEventEmitters.map(e => e.emitFunction).join('\n')}
|
||||
|
||||
${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker) : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker) {
|
||||
${methods
|
||||
.map(({methodName, paramCount}) => {
|
||||
return ` methodMap_["${methodName}"] = MethodMetadata {.argCount = ${paramCount}, .invoker = __${methodName}};`;
|
||||
})
|
||||
.join(
|
||||
'\n',
|
||||
)}${moduleEventEmitters.length > 0 ? '\n' : ''}${moduleEventEmitters.map(e => e.registerEventEmitter).join('\n')}
|
||||
}
|
||||
${moduleEventEmitters.map(e => e.emitFunction).join('\n')}
|
||||
private:
|
||||
class Delegate : public ${hasteModuleName}CxxSpecJSI {
|
||||
public:
|
||||
Delegate(T *instance, std::shared_ptr<CallInvoker> jsInvoker) :
|
||||
${hasteModuleName}CxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
|
||||
${moduleEventEmitters.map(e => e.registerEventEmitter).join('\n')}
|
||||
}
|
||||
|
||||
${indent(moduleProperties.join('\n'), 4)}
|
||||
|
||||
private:
|
||||
friend class ${hasteModuleName}CxxSpec;
|
||||
T *instance_;
|
||||
};
|
||||
|
||||
Delegate delegate_;
|
||||
${moduleFunctions.join('\n\n')}
|
||||
};`;
|
||||
};
|
||||
|
||||
@@ -292,7 +368,7 @@ function createStructsString(
|
||||
return bridging::toJs(rt, value);
|
||||
}`,
|
||||
)
|
||||
.join('\n\n');
|
||||
.join('\n');
|
||||
return `
|
||||
#pragma mark - ${structName}
|
||||
|
||||
@@ -476,19 +552,19 @@ function createEnums(
|
||||
.join('\n');
|
||||
}
|
||||
|
||||
function translatePropertyToCpp(
|
||||
function translateFunctionToCpp(
|
||||
hasteModuleName: string,
|
||||
prop: NativeModulePropertyShape,
|
||||
resolveAlias: AliasResolver,
|
||||
enumMap: NativeModuleEnumMap,
|
||||
abstract: boolean = false,
|
||||
args: Array<string>,
|
||||
returnTypeAnnotation: Nullable<NativeModuleTypeAnnotation>,
|
||||
): string {
|
||||
const [propTypeAnnotation] =
|
||||
unwrapNullable<NativeModuleFunctionTypeAnnotation>(prop.typeAnnotation);
|
||||
|
||||
const params = propTypeAnnotation.params.map(
|
||||
param => `std::move(${param.name})`,
|
||||
);
|
||||
const isNullable = returnTypeAnnotation.type === 'NullableTypeAnnotation';
|
||||
const isVoid = returnTypeAnnotation.type === 'VoidTypeAnnotation';
|
||||
|
||||
const paramTypes = propTypeAnnotation.params.map(param => {
|
||||
const translatedParam = translatePrimitiveJSTypeToCpp(
|
||||
@@ -503,6 +579,7 @@ function translatePropertyToCpp(
|
||||
);
|
||||
return `${translatedParam} ${param.name}`;
|
||||
});
|
||||
paramTypes.unshift('jsi::Runtime &rt');
|
||||
|
||||
const returnType = translatePrimitiveJSTypeToCpp(
|
||||
hasteModuleName,
|
||||
@@ -514,23 +591,16 @@ function translatePropertyToCpp(
|
||||
enumMap,
|
||||
);
|
||||
|
||||
// The first param will always be the runtime reference.
|
||||
paramTypes.unshift('jsi::Runtime &rt');
|
||||
|
||||
const method = `${returnType} ${prop.name}(${paramTypes.join(', ')})`;
|
||||
|
||||
if (abstract) {
|
||||
return `virtual ${method} = 0;`;
|
||||
let methodCallArgs = [...args].join(',\n ');
|
||||
if (methodCallArgs.length > 0) {
|
||||
methodCallArgs = `,\n ${methodCallArgs}`;
|
||||
}
|
||||
|
||||
return `${method} override {
|
||||
static_assert(
|
||||
return ` static jsi::Value __${prop.name}(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* ${args.length > 0 ? 'args' : '/*args*/'}, size_t ${args.length > 0 ? 'count' : '/*count*/'}) {
|
||||
static_assert(
|
||||
bridging::getParameterCount(&T::${prop.name}) == ${paramTypes.length},
|
||||
"Expected ${prop.name}(...) to have ${paramTypes.length} parameters");
|
||||
|
||||
return bridging::callFromJs<${returnType}>(
|
||||
rt, &T::${prop.name}, jsInvoker_, ${['instance_', ...params].join(', ')});
|
||||
}`;
|
||||
${!isVoid ? (!isNullable ? 'return ' : 'auto result = ') : ''}bridging::callFromJs<${returnType}>(rt, &T::${prop.name}, static_cast<${hasteModuleName}CxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule)${methodCallArgs});${!isVoid ? (!isNullable ? '' : 'return result ? jsi::Value(std::move(*result)) : jsi::Value::null();') : 'return jsi::Value::undefined();'}\n }`;
|
||||
}
|
||||
|
||||
type EventEmitterCpp = {
|
||||
@@ -563,7 +633,7 @@ function translateEventEmitterToCpp(
|
||||
return {
|
||||
isVoidTypeAnnotation: isVoidTypeAnnotation,
|
||||
templateName: isVoidTypeAnnotation ? `/*${templateName}*/` : templateName,
|
||||
registerEventEmitter: ` eventEmitterMap_["${
|
||||
registerEventEmitter: ` eventEmitterMap_["${
|
||||
eventEmitter.name
|
||||
}"] = std::make_shared<AsyncEventEmitter<${
|
||||
isVoidTypeAnnotation ? '' : 'jsi::Value'
|
||||
@@ -585,7 +655,7 @@ function translateEventEmitterToCpp(
|
||||
}
|
||||
static_cast<AsyncEventEmitter<${
|
||||
isVoidTypeAnnotation ? '' : 'jsi::Value'
|
||||
}>&>(*delegate_.eventEmitterMap_["${eventEmitter.name}"]).emit(${
|
||||
}>&>(*eventEmitterMap_["${eventEmitter.name}"]).emit(${
|
||||
isVoidTypeAnnotation
|
||||
? ''
|
||||
: `[jsInvoker = jsInvoker_, eventValue = value](jsi::Runtime& rt) -> jsi::Value {
|
||||
@@ -607,8 +677,14 @@ module.exports = {
|
||||
const nativeModules = getModules(schema);
|
||||
|
||||
const modules = Object.keys(nativeModules).flatMap(hasteModuleName => {
|
||||
const {aliasMap, enumMap, spec, moduleName} =
|
||||
nativeModules[hasteModuleName];
|
||||
const nativeModule = nativeModules[hasteModuleName];
|
||||
const {
|
||||
aliasMap,
|
||||
enumMap,
|
||||
spec: {methods},
|
||||
spec,
|
||||
moduleName,
|
||||
} = nativeModule;
|
||||
const resolveAlias = createAliasResolver(aliasMap);
|
||||
const structs = createStructsString(
|
||||
hasteModuleName,
|
||||
@@ -617,25 +693,12 @@ module.exports = {
|
||||
enumMap,
|
||||
);
|
||||
const enums = createEnums(hasteModuleName, enumMap, resolveAlias);
|
||||
|
||||
return [
|
||||
ModuleClassDeclarationTemplate({
|
||||
hasteModuleName,
|
||||
moduleProperties: spec.methods.map(prop =>
|
||||
translatePropertyToCpp(
|
||||
hasteModuleName,
|
||||
prop,
|
||||
resolveAlias,
|
||||
enumMap,
|
||||
true,
|
||||
),
|
||||
),
|
||||
structs,
|
||||
enums,
|
||||
}),
|
||||
ModuleSpecClassDeclarationTemplate({
|
||||
hasteModuleName,
|
||||
moduleName,
|
||||
structs,
|
||||
enums,
|
||||
moduleEventEmitters: spec.eventEmitters.map(eventEmitter =>
|
||||
translateEventEmitterToCpp(
|
||||
moduleName,
|
||||
@@ -644,13 +707,30 @@ module.exports = {
|
||||
enumMap,
|
||||
),
|
||||
),
|
||||
moduleProperties: spec.methods.map(prop =>
|
||||
translatePropertyToCpp(
|
||||
moduleFunctions: spec.methods.map(property => {
|
||||
const [propertyTypeAnnotation] =
|
||||
unwrapNullable<NativeModuleFunctionTypeAnnotation>(
|
||||
property.typeAnnotation,
|
||||
);
|
||||
return translateFunctionToCpp(
|
||||
hasteModuleName,
|
||||
prop,
|
||||
property,
|
||||
resolveAlias,
|
||||
enumMap,
|
||||
),
|
||||
propertyTypeAnnotation.params.map((p, i) =>
|
||||
serializeArg(moduleName, p, i, resolveAlias, enumMap),
|
||||
),
|
||||
propertyTypeAnnotation.returnTypeAnnotation,
|
||||
);
|
||||
}),
|
||||
methods: methods.map(
|
||||
({name: propertyName, typeAnnotation: nullableTypeAnnotation}) => {
|
||||
const [{params}] = unwrapNullable(nullableTypeAnnotation);
|
||||
return {
|
||||
methodName: propertyName,
|
||||
paramCount: params.length,
|
||||
};
|
||||
},
|
||||
),
|
||||
}),
|
||||
];
|
||||
|
||||
-32
@@ -1,32 +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.
|
||||
*
|
||||
* @flow strict-local
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const fixtures = require('../__test_fixtures__/fixtures.js');
|
||||
const generator = require('../GenerateModuleCpp.js');
|
||||
|
||||
describe('GenerateModuleCpp', () => {
|
||||
Object.keys(fixtures)
|
||||
.sort()
|
||||
.forEach(fixtureName => {
|
||||
const fixture = fixtures[fixtureName];
|
||||
|
||||
it(`can generate fixture ${fixtureName}`, () => {
|
||||
expect(
|
||||
generator.generate(
|
||||
fixtureName,
|
||||
fixture,
|
||||
'com.facebook.fbreact.specs',
|
||||
),
|
||||
).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
});
|
||||
-782
@@ -1,782 +0,0 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture SampleWithUppercaseName 1`] = `
|
||||
Map {
|
||||
"SampleWithUppercaseNameJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"SampleWithUppercaseNameJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule\\", jsInvoker) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture complex_objects 1`] = `
|
||||
Map {
|
||||
"complex_objectsJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"complex_objectsJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_difficult(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->difficult(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_optionals(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->optionals(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_optionalMethod(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->optionalMethod(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asObject(rt).asFunction(rt),
|
||||
count <= 2 || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asObject(rt).asArray(rt))
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getArrays(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getArrays(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNullableObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
auto result = static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getNullableObject(
|
||||
rt
|
||||
);
|
||||
return result ? jsi::Value(std::move(*result)) : jsi::Value::null();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNullableGenericObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
auto result = static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getNullableGenericObject(
|
||||
rt
|
||||
);
|
||||
return result ? jsi::Value(std::move(*result)) : jsi::Value::null();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNullableArray(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
auto result = static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getNullableArray(
|
||||
rt
|
||||
);
|
||||
return result ? jsi::Value(std::move(*result)) : jsi::Value::null();
|
||||
}
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule\\", jsInvoker) {
|
||||
methodMap_[\\"difficult\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_difficult};
|
||||
methodMap_[\\"optionals\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_optionals};
|
||||
methodMap_[\\"optionalMethod\\"] = MethodMetadata {3, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_optionalMethod};
|
||||
methodMap_[\\"getArrays\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getArrays};
|
||||
methodMap_[\\"getNullableObject\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNullableObject};
|
||||
methodMap_[\\"getNullableGenericObject\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNullableGenericObject};
|
||||
methodMap_[\\"getNullableArray\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNullableArray};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture cxx_only_native_modules 1`] = `
|
||||
Map {
|
||||
"cxx_only_native_modulesJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"cxx_only_native_modulesJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getArray(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getArray(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt).asArray(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBool(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getBool(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asBool()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getConstants(
|
||||
rt
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getCustomEnum(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getCustomEnum(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getCustomHostObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getCustomHostObject(
|
||||
rt
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_consumeCustomHostObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->consumeCustomHostObject(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBinaryTreeNode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getBinaryTreeNode(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getGraphNode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getGraphNode(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumEnum(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getNumEnum(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getStrEnum(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getStrEnum(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getMap(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getMap(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getNumber(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getObject(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getSet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getSet(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt).asArray(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getString(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getString(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getUnion(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getUnion(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber(),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asString(rt),
|
||||
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asString(rt),
|
||||
count <= 3 ? throw jsi::JSError(rt, \\"Expected argument in position 3 to be passed\\") : args[3].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValue(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getValue(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber(),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asString(rt),
|
||||
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithCallback(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getValueWithCallback(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt).asFunction(rt)
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getValueWithPromise(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asBool()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getWithWithOptionalArgs(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
auto result = static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getWithWithOptionalArgs(
|
||||
rt,
|
||||
count <= 0 || args[0].isUndefined() ? std::nullopt : std::make_optional(args[0].asBool())
|
||||
);
|
||||
return result ? jsi::Value(std::move(*result)) : jsi::Value::null();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->voidFunc(
|
||||
rt
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_setMenu(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->setMenu(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_emitCustomDeviceEvent(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->emitCustomDeviceEvent(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt)
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFuncThrows(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->voidFuncThrows(
|
||||
rt
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObjectThrows(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getObjectThrows(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFuncAssert(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->voidFuncAssert(
|
||||
rt
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObjectAssert(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getObjectAssert(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModuleCxx\\", jsInvoker) {
|
||||
methodMap_[\\"getArray\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getArray};
|
||||
methodMap_[\\"getBool\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBool};
|
||||
methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getConstants};
|
||||
methodMap_[\\"getCustomEnum\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getCustomEnum};
|
||||
methodMap_[\\"getCustomHostObject\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getCustomHostObject};
|
||||
methodMap_[\\"consumeCustomHostObject\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_consumeCustomHostObject};
|
||||
methodMap_[\\"getBinaryTreeNode\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBinaryTreeNode};
|
||||
methodMap_[\\"getGraphNode\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getGraphNode};
|
||||
methodMap_[\\"getNumEnum\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumEnum};
|
||||
methodMap_[\\"getStrEnum\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getStrEnum};
|
||||
methodMap_[\\"getMap\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getMap};
|
||||
methodMap_[\\"getNumber\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumber};
|
||||
methodMap_[\\"getObject\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObject};
|
||||
methodMap_[\\"getSet\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getSet};
|
||||
methodMap_[\\"getString\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getString};
|
||||
methodMap_[\\"getUnion\\"] = MethodMetadata {4, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getUnion};
|
||||
methodMap_[\\"getValue\\"] = MethodMetadata {3, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValue};
|
||||
methodMap_[\\"getValueWithCallback\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithCallback};
|
||||
methodMap_[\\"getValueWithPromise\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithPromise};
|
||||
methodMap_[\\"getWithWithOptionalArgs\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getWithWithOptionalArgs};
|
||||
methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc};
|
||||
methodMap_[\\"setMenu\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_setMenu};
|
||||
methodMap_[\\"emitCustomDeviceEvent\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_emitCustomDeviceEvent};
|
||||
methodMap_[\\"voidFuncThrows\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFuncThrows};
|
||||
methodMap_[\\"getObjectThrows\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObjectThrows};
|
||||
methodMap_[\\"voidFuncAssert\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFuncAssert};
|
||||
methodMap_[\\"getObjectAssert\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObjectAssert};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture empty_native_modules 1`] = `
|
||||
Map {
|
||||
"empty_native_modulesJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"empty_native_modulesJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule\\", jsInvoker) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture event_emitter_module 1`] = `
|
||||
Map {
|
||||
"event_emitter_moduleJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"event_emitter_moduleJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->voidFunc(
|
||||
rt
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule\\", jsInvoker) {
|
||||
methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture native_modules_with_type_aliases 1`] = `
|
||||
Map {
|
||||
"native_modules_with_type_aliasesJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"native_modules_with_type_aliasesJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_AliasTurboModuleCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<AliasTurboModuleCxxSpecJSI *>(&turboModule)->getConstants(
|
||||
rt
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_AliasTurboModuleCxxSpecJSI_cropImage(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<AliasTurboModuleCxxSpecJSI *>(&turboModule)->cropImage(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
|
||||
AliasTurboModuleCxxSpecJSI::AliasTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"AliasTurboModule\\", jsInvoker) {
|
||||
methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_AliasTurboModuleCxxSpecJSI_getConstants};
|
||||
methodMap_[\\"cropImage\\"] = MethodMetadata {1, __hostFunction_AliasTurboModuleCxxSpecJSI_cropImage};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture real_module_example 1`] = `
|
||||
Map {
|
||||
"real_module_exampleJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"real_module_exampleJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_NativeCameraRollManagerCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeCameraRollManagerCxxSpecJSI *>(&turboModule)->getConstants(
|
||||
rt
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeCameraRollManagerCxxSpecJSI_getPhotos(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeCameraRollManagerCxxSpecJSI *>(&turboModule)->getPhotos(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeCameraRollManagerCxxSpecJSI_saveToCameraRoll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeCameraRollManagerCxxSpecJSI *>(&turboModule)->saveToCameraRoll(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asString(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeCameraRollManagerCxxSpecJSI_deletePhotos(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeCameraRollManagerCxxSpecJSI *>(&turboModule)->deletePhotos(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt).asArray(rt)
|
||||
);
|
||||
}
|
||||
|
||||
NativeCameraRollManagerCxxSpecJSI::NativeCameraRollManagerCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"CameraRollManager\\", jsInvoker) {
|
||||
methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeCameraRollManagerCxxSpecJSI_getConstants};
|
||||
methodMap_[\\"getPhotos\\"] = MethodMetadata {1, __hostFunction_NativeCameraRollManagerCxxSpecJSI_getPhotos};
|
||||
methodMap_[\\"saveToCameraRoll\\"] = MethodMetadata {2, __hostFunction_NativeCameraRollManagerCxxSpecJSI_saveToCameraRoll};
|
||||
methodMap_[\\"deletePhotos\\"] = MethodMetadata {1, __hostFunction_NativeCameraRollManagerCxxSpecJSI_deletePhotos};
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeExceptionsManagerCxxSpecJSI_reportFatalException(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeExceptionsManagerCxxSpecJSI *>(&turboModule)->reportFatalException(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asObject(rt).asArray(rt),
|
||||
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asNumber()
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeExceptionsManagerCxxSpecJSI_reportSoftException(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeExceptionsManagerCxxSpecJSI *>(&turboModule)->reportSoftException(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asObject(rt).asArray(rt),
|
||||
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asNumber()
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeExceptionsManagerCxxSpecJSI_reportException(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeExceptionsManagerCxxSpecJSI *>(&turboModule)->reportException(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeExceptionsManagerCxxSpecJSI_updateExceptionMessage(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeExceptionsManagerCxxSpecJSI *>(&turboModule)->updateExceptionMessage(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asObject(rt).asArray(rt),
|
||||
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asNumber()
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeExceptionsManagerCxxSpecJSI_dismissRedbox(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeExceptionsManagerCxxSpecJSI *>(&turboModule)->dismissRedbox(
|
||||
rt
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
|
||||
NativeExceptionsManagerCxxSpecJSI::NativeExceptionsManagerCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"ExceptionsManager\\", jsInvoker) {
|
||||
methodMap_[\\"reportFatalException\\"] = MethodMetadata {3, __hostFunction_NativeExceptionsManagerCxxSpecJSI_reportFatalException};
|
||||
methodMap_[\\"reportSoftException\\"] = MethodMetadata {3, __hostFunction_NativeExceptionsManagerCxxSpecJSI_reportSoftException};
|
||||
methodMap_[\\"reportException\\"] = MethodMetadata {1, __hostFunction_NativeExceptionsManagerCxxSpecJSI_reportException};
|
||||
methodMap_[\\"updateExceptionMessage\\"] = MethodMetadata {3, __hostFunction_NativeExceptionsManagerCxxSpecJSI_updateExceptionMessage};
|
||||
methodMap_[\\"dismissRedbox\\"] = MethodMetadata {0, __hostFunction_NativeExceptionsManagerCxxSpecJSI_dismissRedbox};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture simple_native_modules 1`] = `
|
||||
Map {
|
||||
"simple_native_modulesJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"simple_native_modulesJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getConstants(
|
||||
rt
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->voidFunc(
|
||||
rt
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBool(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getBool(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asBool()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getNumber(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getString(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getString(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getArray(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getArray(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt).asArray(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getObject(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getRootTag(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getRootTag(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValue(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getValue(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber(),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asString(rt),
|
||||
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asObject(rt)
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getEnumReturn(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getEnumReturn(
|
||||
rt
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithCallback(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getValueWithCallback(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt).asFunction(rt)
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getValueWithPromise(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asBool()
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithOptionalArg(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getValueWithOptionalArg(
|
||||
rt,
|
||||
count <= 0 || args[0].isUndefined() ? std::nullopt : std::make_optional(args[0].asObject(rt))
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getEnums(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getEnums(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber(),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asNumber(),
|
||||
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asString(rt)
|
||||
);
|
||||
}
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule\\", jsInvoker) {
|
||||
methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getConstants};
|
||||
methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc};
|
||||
methodMap_[\\"getBool\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getBool};
|
||||
methodMap_[\\"getNumber\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getNumber};
|
||||
methodMap_[\\"getString\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getString};
|
||||
methodMap_[\\"getArray\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getArray};
|
||||
methodMap_[\\"getObject\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getObject};
|
||||
methodMap_[\\"getRootTag\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getRootTag};
|
||||
methodMap_[\\"getValue\\"] = MethodMetadata {3, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValue};
|
||||
methodMap_[\\"getEnumReturn\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getEnumReturn};
|
||||
methodMap_[\\"getValueWithCallback\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithCallback};
|
||||
methodMap_[\\"getValueWithPromise\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithPromise};
|
||||
methodMap_[\\"getValueWithOptionalArg\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getValueWithOptionalArg};
|
||||
methodMap_[\\"getEnums\\"] = MethodMetadata {3, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getEnums};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture string_literals 1`] = `
|
||||
Map {
|
||||
"string_literalsJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"string_literalsJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getStringLiteral(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getStringLiteral(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt)
|
||||
);
|
||||
}
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule\\", jsInvoker) {
|
||||
methodMap_[\\"getStringLiteral\\"] = MethodMetadata {1, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getStringLiteral};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture two_modules_different_files 1`] = `
|
||||
Map {
|
||||
"two_modules_different_filesJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"two_modules_different_filesJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->voidFunc(
|
||||
rt
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule\\", jsInvoker) {
|
||||
methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_voidFunc};
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModule2CxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModule2CxxSpecJSI *>(&turboModule)->getConstants(
|
||||
rt
|
||||
);
|
||||
}
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModule2CxxSpecJSI_voidFunc(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
static_cast<NativeSampleTurboModule2CxxSpecJSI *>(&turboModule)->voidFunc(
|
||||
rt
|
||||
);
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
|
||||
NativeSampleTurboModule2CxxSpecJSI::NativeSampleTurboModule2CxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule2\\", jsInvoker) {
|
||||
methodMap_[\\"getConstants\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModule2CxxSpecJSI_getConstants};
|
||||
methodMap_[\\"voidFunc\\"] = MethodMetadata {0, __hostFunction_NativeSampleTurboModule2CxxSpecJSI_voidFunc};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`GenerateModuleCpp can generate fixture union_module 1`] = `
|
||||
Map {
|
||||
"union_moduleJSI-generated.cpp" => "/**
|
||||
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
||||
*
|
||||
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
||||
* once the code is regenerated.
|
||||
*
|
||||
* @generated by codegen project: GenerateModuleCpp.js
|
||||
*/
|
||||
|
||||
#include \\"union_moduleJSI.h\\"
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
static jsi::Value __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getUnion(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
||||
return static_cast<NativeSampleTurboModuleCxxSpecJSI *>(&turboModule)->getUnion(
|
||||
rt,
|
||||
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asNumber(),
|
||||
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asNumber(),
|
||||
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asObject(rt),
|
||||
count <= 3 ? throw jsi::JSError(rt, \\"Expected argument in position 3 to be passed\\") : args[3].asString(rt),
|
||||
count <= 4 ? throw jsi::JSError(rt, \\"Expected argument in position 4 to be passed\\") : args[4].asString(rt)
|
||||
);
|
||||
}
|
||||
|
||||
NativeSampleTurboModuleCxxSpecJSI::NativeSampleTurboModuleCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
||||
: TurboModule(\\"SampleTurboModule\\", jsInvoker) {
|
||||
methodMap_[\\"getUnion\\"] = MethodMetadata {5, __hostFunction_NativeSampleTurboModuleCxxSpecJSI_getUnion};
|
||||
}
|
||||
|
||||
|
||||
} // namespace facebook::react
|
||||
",
|
||||
}
|
||||
`;
|
||||
+577
-1039
File diff suppressed because it is too large
Load Diff
+26
-10
@@ -110,6 +110,27 @@ function isRgbaAnimatedValue(value: any): boolean {
|
||||
);
|
||||
}
|
||||
|
||||
export function getRgbaValueAndNativeColor(
|
||||
value: RgbaValue | ColorValue,
|
||||
): $ReadOnly<{
|
||||
rgbaValue: RgbaValue,
|
||||
nativeColor?: NativeColorValue,
|
||||
}> {
|
||||
const processedColor: RgbaValue | NativeColorValue =
|
||||
// $FlowFixMe[incompatible-type] - Type is verified above
|
||||
processColor((value: ColorValue | RgbaValue)) ?? defaultColor;
|
||||
if (isRgbaValue(processedColor)) {
|
||||
// $FlowFixMe[incompatible-type] - Type is verified above
|
||||
return {rgbaValue: (processedColor: RgbaValue)};
|
||||
} else {
|
||||
return {
|
||||
// $FlowFixMe[incompatible-type] - Type is verified above
|
||||
nativeColor: (processedColor: NativeColorValue),
|
||||
rgbaValue: defaultColor,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export default class AnimatedColor extends AnimatedWithChildren {
|
||||
r: AnimatedValue;
|
||||
g: AnimatedValue;
|
||||
@@ -132,18 +153,13 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
this.b = rgbaAnimatedValue.b;
|
||||
this.a = rgbaAnimatedValue.a;
|
||||
} else {
|
||||
const processedColor: RgbaValue | NativeColorValue =
|
||||
const {rgbaValue: initColor, nativeColor} = getRgbaValueAndNativeColor(
|
||||
// $FlowFixMe[incompatible-type] - Type is verified above
|
||||
processColor((value: ColorValue | RgbaValue)) ?? defaultColor;
|
||||
let initColor: RgbaValue = defaultColor;
|
||||
if (isRgbaValue(processedColor)) {
|
||||
// $FlowFixMe[incompatible-type] - Type is verified above
|
||||
initColor = (processedColor: RgbaValue);
|
||||
} else {
|
||||
// $FlowFixMe[incompatible-type] - Type is verified above
|
||||
this.nativeColor = (processedColor: NativeColorValue);
|
||||
(value: ColorValue | RgbaValue),
|
||||
);
|
||||
if (nativeColor) {
|
||||
this.nativeColor = nativeColor;
|
||||
}
|
||||
|
||||
this.r = new AnimatedValue(initColor.r);
|
||||
this.g = new AnimatedValue(initColor.g);
|
||||
this.b = new AnimatedValue(initColor.b);
|
||||
|
||||
@@ -120,6 +120,7 @@ std::unique_ptr<facebook::react::JSExecutorFactory> RCTAppSetupDefaultJsExecutor
|
||||
RCTTurboModuleManager *turboModuleManager,
|
||||
const std::shared_ptr<facebook::react::RuntimeScheduler> &runtimeScheduler)
|
||||
{
|
||||
#ifndef RCT_REMOVE_LEGACY_ARCH
|
||||
// Necessary to allow NativeModules to lookup TurboModules
|
||||
[bridge setRCTTurboModuleRegistry:turboModuleManager];
|
||||
|
||||
@@ -146,12 +147,18 @@ std::unique_ptr<facebook::react::JSExecutorFactory> RCTAppSetupDefaultJsExecutor
|
||||
return std::make_unique<facebook::react::HermesExecutorFactory>(
|
||||
facebook::react::RCTJSIExecutorRuntimeInstaller(runtimeInstallerLambda));
|
||||
#endif
|
||||
#else
|
||||
// This method should not be invoked in the New Arch. So when Legacy Arch is removed, we can
|
||||
// safly return a nullptr.
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
std::unique_ptr<facebook::react::JSExecutorFactory> RCTAppSetupJsExecutorFactoryForOldArch(
|
||||
RCTBridge *bridge,
|
||||
const std::shared_ptr<facebook::react::RuntimeScheduler> &runtimeScheduler)
|
||||
{
|
||||
#ifndef RCT_REMOVE_LEGACY_ARCH
|
||||
auto runtimeInstallerLambda = [bridge, runtimeScheduler](facebook::jsi::Runtime &runtime) {
|
||||
if (!bridge) {
|
||||
return;
|
||||
@@ -164,4 +171,9 @@ std::unique_ptr<facebook::react::JSExecutorFactory> RCTAppSetupJsExecutorFactory
|
||||
return std::make_unique<facebook::react::HermesExecutorFactory>(
|
||||
facebook::react::RCTJSIExecutorRuntimeInstaller(runtimeInstallerLambda));
|
||||
#endif
|
||||
#else
|
||||
// This method should not be invoked in the New Arch. So when Legacy Arch is removed, we can
|
||||
// safly return a nullptr.
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -261,7 +261,12 @@ using namespace facebook::react;
|
||||
|
||||
configuration.sourceURLForBridge = ^NSURL *_Nullable(RCTBridge *_Nonnull bridge)
|
||||
{
|
||||
#ifndef RCT_REMOVE_LEGACY_ARCH
|
||||
return [weakSelf.delegate sourceURLForBridge:bridge];
|
||||
#else
|
||||
// When the Legacy Arch is removed, the Delegate does not have a sourceURLForBridge method
|
||||
return [weakSelf.delegate bundleURL];
|
||||
#endif
|
||||
};
|
||||
|
||||
if ([self.delegate respondsToSelector:@selector(extraModulesForBridge:)]) {
|
||||
@@ -275,13 +280,24 @@ using namespace facebook::react;
|
||||
configuration.extraLazyModuleClassesForBridge =
|
||||
^NSDictionary<NSString *, Class> *_Nonnull(RCTBridge *_Nonnull bridge)
|
||||
{
|
||||
#ifndef RCT_REMOVE_LEGACY_ARCH
|
||||
return [weakSelf.delegate extraLazyModuleClassesForBridge:bridge];
|
||||
#else
|
||||
// When the Legacy Arch is removed, the Delegate does not have a extraLazyModuleClassesForBridge method
|
||||
return @{};
|
||||
#endif
|
||||
};
|
||||
}
|
||||
|
||||
if ([self.delegate respondsToSelector:@selector(bridge:didNotFindModule:)]) {
|
||||
configuration.bridgeDidNotFindModule = ^BOOL(RCTBridge *_Nonnull bridge, NSString *_Nonnull moduleName) {
|
||||
#ifndef RCT_REMOVE_LEGACY_ARCH
|
||||
return [weakSelf.delegate bridge:bridge didNotFindModule:moduleName];
|
||||
#else
|
||||
// When the Legacy Arch is removed, the Delegate does not have a bridge:didNotFindModule method
|
||||
// We return NO, because if we have invoked this method is unlikely that the module will be actually registered
|
||||
return NO;
|
||||
#endif
|
||||
};
|
||||
}
|
||||
|
||||
@@ -290,13 +306,30 @@ using namespace facebook::react;
|
||||
^(RCTBridge *_Nonnull bridge,
|
||||
RCTSourceLoadProgressBlock _Nonnull onProgress,
|
||||
RCTSourceLoadBlock _Nonnull loadCallback) {
|
||||
#ifndef RCT_REMOVE_LEGACY_ARCH
|
||||
[weakSelf.delegate loadSourceForBridge:bridge onProgress:onProgress onComplete:loadCallback];
|
||||
#else
|
||||
// When the Legacy Arch is removed, the Delegate does not have a
|
||||
// loadSourceForBridge:onProgress:onComplete: method
|
||||
// We then call the loadBundleAtURL:onProgress:onComplete: instead
|
||||
[weakSelf.delegate loadBundleAtURL:self.bundleURL onProgress:onProgress onComplete:loadCallback];
|
||||
#endif
|
||||
};
|
||||
}
|
||||
|
||||
if ([self.delegate respondsToSelector:@selector(loadSourceForBridge:withBlock:)]) {
|
||||
configuration.loadSourceForBridge = ^(RCTBridge *_Nonnull bridge, RCTSourceLoadBlock _Nonnull loadCallback) {
|
||||
#ifndef RCT_REMOVE_LEGACY_ARCH
|
||||
[weakSelf.delegate loadSourceForBridge:bridge withBlock:loadCallback];
|
||||
#else
|
||||
// When the Legacy Arch is removed, the Delegate does not have a
|
||||
// loadSourceForBridge:withBlock: method
|
||||
// We then call the loadBundleAtURL:onProgress:onComplete: instead
|
||||
[weakSelf.delegate loadBundleAtURL:self.bundleURL
|
||||
onProgress:^(RCTLoadingProgress *progressData) {
|
||||
}
|
||||
onComplete:loadCallback];
|
||||
#endif
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -24,11 +24,9 @@ RCT_EXPORT_MODULE(FileReaderModule)
|
||||
|
||||
@synthesize moduleRegistry = _moduleRegistry;
|
||||
|
||||
RCT_EXPORT_METHOD(readAsText
|
||||
: (NSDictionary<NSString *, id> *)blob encoding
|
||||
: (NSString *)encoding resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
readAsText : (NSDictionary<NSString *, id> *)blob encoding : (NSString *)encoding resolve : (RCTPromiseResolveBlock)
|
||||
resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
RCTBlobManager *blobManager = [_moduleRegistry moduleForName:"BlobModule"];
|
||||
dispatch_async(blobManager.methodQueue, ^{
|
||||
@@ -56,10 +54,9 @@ RCT_EXPORT_METHOD(readAsText
|
||||
});
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(readAsDataURL
|
||||
: (NSDictionary<NSString *, id> *)blob resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
readAsDataURL : (NSDictionary<NSString *, id> *)blob resolve : (RCTPromiseResolveBlock)
|
||||
resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
RCTBlobManager *blobManager = [_moduleRegistry moduleForName:"BlobModule"];
|
||||
dispatch_async(blobManager.methodQueue, ^{
|
||||
|
||||
+43
-15
@@ -99,7 +99,7 @@ const AccessibilityInfo = {
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(new Error('NativeAccessibilityManagerIOS is not available'));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -119,7 +119,11 @@ const AccessibilityInfo = {
|
||||
if (NativeAccessibilityInfoAndroid?.isGrayscaleEnabled != null) {
|
||||
NativeAccessibilityInfoAndroid.isGrayscaleEnabled(resolve);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(
|
||||
new Error(
|
||||
'NativeAccessibilityInfoAndroid.isGrayscaleEnabled is not available',
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -130,7 +134,7 @@ const AccessibilityInfo = {
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(new Error('AccessibilityInfo native module is not available'));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -150,7 +154,11 @@ const AccessibilityInfo = {
|
||||
if (NativeAccessibilityInfoAndroid?.isInvertColorsEnabled != null) {
|
||||
NativeAccessibilityInfoAndroid.isInvertColorsEnabled(resolve);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(
|
||||
new Error(
|
||||
'NativeAccessibilityInfoAndroid.isInvertColorsEnabled is not available',
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -161,7 +169,7 @@ const AccessibilityInfo = {
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(new Error('AccessibilityInfo native module is not available'));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -181,7 +189,7 @@ const AccessibilityInfo = {
|
||||
if (NativeAccessibilityInfoAndroid != null) {
|
||||
NativeAccessibilityInfoAndroid.isReduceMotionEnabled(resolve);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(new Error('AccessibilityInfo native module is not available'));
|
||||
}
|
||||
} else {
|
||||
if (NativeAccessibilityManagerIOS != null) {
|
||||
@@ -190,7 +198,7 @@ const AccessibilityInfo = {
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(new Error('NativeAccessibilityManagerIOS is not available'));
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -208,7 +216,11 @@ const AccessibilityInfo = {
|
||||
if (NativeAccessibilityInfoAndroid?.isHighTextContrastEnabled != null) {
|
||||
NativeAccessibilityInfoAndroid.isHighTextContrastEnabled(resolve);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(
|
||||
new Error(
|
||||
'NativeAccessibilityInfoAndroid.isHighTextContrastEnabled is not available',
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
return Promise.resolve(false);
|
||||
@@ -236,7 +248,11 @@ const AccessibilityInfo = {
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(
|
||||
new Error(
|
||||
'NativeAccessibilityManagerIOS.getCurrentDarkerSystemColorsState is not available',
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -264,7 +280,11 @@ const AccessibilityInfo = {
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(
|
||||
new Error(
|
||||
'NativeAccessibilityManagerIOS.getCurrentPrefersCrossFadeTransitionsState is not available',
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -289,7 +309,7 @@ const AccessibilityInfo = {
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(new Error('NativeAccessibilityManagerIOS is not available'));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -309,7 +329,7 @@ const AccessibilityInfo = {
|
||||
if (NativeAccessibilityInfoAndroid != null) {
|
||||
NativeAccessibilityInfoAndroid.isTouchExplorationEnabled(resolve);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(new Error('NativeAccessibilityInfoAndroid is not available'));
|
||||
}
|
||||
} else {
|
||||
if (NativeAccessibilityManagerIOS != null) {
|
||||
@@ -318,7 +338,7 @@ const AccessibilityInfo = {
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(new Error('NativeAccessibilityManagerIOS is not available'));
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -343,10 +363,18 @@ const AccessibilityInfo = {
|
||||
) {
|
||||
NativeAccessibilityInfoAndroid.isAccessibilityServiceEnabled(resolve);
|
||||
} else {
|
||||
reject(null);
|
||||
reject(
|
||||
new Error(
|
||||
'NativeAccessibilityInfoAndroid.isAccessibilityServiceEnabled is not available',
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
reject(null);
|
||||
reject(
|
||||
new Error(
|
||||
'isAccessibilityServiceEnabled is only available on Android',
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
+2
-2
@@ -9,7 +9,7 @@
|
||||
|
||||
import type * as React from 'react';
|
||||
import {Constructor} from '../../../types/private/Utilities';
|
||||
import {NativeMethods} from '../../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../../types/public/ReactNativeTypes';
|
||||
import {ColorValue, StyleProp} from '../../StyleSheet/StyleSheet';
|
||||
import {ViewStyle} from '../../StyleSheet/StyleSheetTypes';
|
||||
import {LayoutChangeEvent} from '../../Types/CoreEventTypes';
|
||||
@@ -46,7 +46,7 @@ export interface ActivityIndicatorProps extends ViewProps {
|
||||
}
|
||||
|
||||
declare class ActivityIndicatorComponent extends React.Component<ActivityIndicatorProps> {}
|
||||
declare const ActivityIndicatorBase: Constructor<NativeMethods> &
|
||||
declare const ActivityIndicatorBase: Constructor<HostInstance> &
|
||||
typeof ActivityIndicatorComponent;
|
||||
export class ActivityIndicator extends ActivityIndicatorBase {}
|
||||
|
||||
|
||||
+2
-2
@@ -9,7 +9,7 @@
|
||||
|
||||
import type * as React from 'react';
|
||||
import {Constructor} from '../../../types/private/Utilities';
|
||||
import {NativeMethods} from '../../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../../types/public/ReactNativeTypes';
|
||||
import {ColorValue} from '../../StyleSheet/StyleSheet';
|
||||
import {
|
||||
NativeSyntheticEvent,
|
||||
@@ -121,7 +121,7 @@ interface DrawerPosition {
|
||||
}
|
||||
|
||||
declare class DrawerLayoutAndroidComponent extends React.Component<DrawerLayoutAndroidProps> {}
|
||||
declare const DrawerLayoutAndroidBase: Constructor<NativeMethods> &
|
||||
declare const DrawerLayoutAndroidBase: Constructor<HostInstance> &
|
||||
typeof DrawerLayoutAndroidComponent;
|
||||
export class DrawerLayoutAndroid extends DrawerLayoutAndroidBase {
|
||||
/**
|
||||
|
||||
+2
-2
@@ -9,7 +9,7 @@
|
||||
|
||||
import type * as React from 'react';
|
||||
import {Constructor} from '../../../types/private/Utilities';
|
||||
import {NativeMethods} from '../../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../../types/public/ReactNativeTypes';
|
||||
import {ColorValue} from '../../StyleSheet/StyleSheet';
|
||||
import {ViewProps} from '../View/ViewPropTypes';
|
||||
|
||||
@@ -72,7 +72,7 @@ export interface ProgressBarAndroidProps extends ViewProps {
|
||||
* that the app is loading or there is some activity in the app.
|
||||
*/
|
||||
declare class ProgressBarAndroidComponent extends React.Component<ProgressBarAndroidProps> {}
|
||||
declare const ProgressBarAndroidBase: Constructor<NativeMethods> &
|
||||
declare const ProgressBarAndroidBase: Constructor<HostInstance> &
|
||||
typeof ProgressBarAndroidComponent;
|
||||
/**
|
||||
* ProgressBarAndroid has been extracted from react-native core and will be removed in a future release.
|
||||
|
||||
+2
-2
@@ -9,7 +9,7 @@
|
||||
|
||||
import type * as React from 'react';
|
||||
import {Constructor} from '../../../types/private/Utilities';
|
||||
import {NativeMethods} from '../../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../../types/public/ReactNativeTypes';
|
||||
import {ColorValue} from '../../StyleSheet/StyleSheet';
|
||||
import {ViewProps} from '../View/ViewPropTypes';
|
||||
|
||||
@@ -80,7 +80,7 @@ export interface RefreshControlProps
|
||||
* in the `onRefresh` function otherwise the refresh indicator will stop immediately.
|
||||
*/
|
||||
declare class RefreshControlComponent extends React.Component<RefreshControlProps> {}
|
||||
declare const RefreshControlBase: Constructor<NativeMethods> &
|
||||
declare const RefreshControlBase: Constructor<HostInstance> &
|
||||
typeof RefreshControlComponent;
|
||||
export class RefreshControl extends RefreshControlBase {
|
||||
static SIZE: Object; // Undocumented
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
import type * as React from 'react';
|
||||
import {Constructor} from '../../../types/private/Utilities';
|
||||
import {NativeMethods} from '../../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../../types/public/ReactNativeTypes';
|
||||
import {ViewProps} from '../View/ViewPropTypes';
|
||||
|
||||
/**
|
||||
@@ -23,7 +23,7 @@ import {ViewProps} from '../View/ViewPropTypes';
|
||||
*/
|
||||
declare class SafeAreaViewComponent extends React.Component<ViewProps> {}
|
||||
|
||||
declare const SafeAreaViewBase: Constructor<NativeMethods> &
|
||||
declare const SafeAreaViewBase: Constructor<HostInstance> &
|
||||
typeof SafeAreaViewComponent;
|
||||
|
||||
/**
|
||||
|
||||
+3
-9
@@ -12,12 +12,10 @@ import '@react-native/fantom/src/setUpDefaultReactNativeEnvironment';
|
||||
|
||||
import type {HostInstance} from 'react-native';
|
||||
|
||||
import ensureInstance from '../../../../src/private/__tests__/utilities/ensureInstance';
|
||||
import * as Fantom from '@react-native/fantom';
|
||||
import * as React from 'react';
|
||||
import {createRef} from 'react';
|
||||
import {ScrollView} from 'react-native';
|
||||
import ReactNativeElement from 'react-native/src/private/webapis/dom/nodes/ReactNativeElement';
|
||||
|
||||
describe('onScroll', () => {
|
||||
it('delivers onScroll event', () => {
|
||||
@@ -36,11 +34,9 @@ describe('onScroll', () => {
|
||||
);
|
||||
});
|
||||
|
||||
const element = ensureInstance(scrollViewRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueNativeEvent(
|
||||
element,
|
||||
scrollViewRef,
|
||||
'scroll',
|
||||
{
|
||||
contentOffset: {
|
||||
@@ -80,11 +76,9 @@ describe('onScroll', () => {
|
||||
);
|
||||
});
|
||||
|
||||
const element = ensureInstance(scrollViewRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueNativeEvent(
|
||||
element,
|
||||
scrollViewRef,
|
||||
'scroll',
|
||||
{
|
||||
contentOffset: {
|
||||
@@ -97,7 +91,7 @@ describe('onScroll', () => {
|
||||
},
|
||||
);
|
||||
Fantom.enqueueNativeEvent(
|
||||
element,
|
||||
scrollViewRef,
|
||||
'scroll',
|
||||
{
|
||||
contentOffset: {
|
||||
|
||||
Vendored
+28
-67
@@ -13,13 +13,11 @@ import '@react-native/fantom/src/setUpDefaultReactNativeEnvironment';
|
||||
|
||||
import type {HostInstance} from 'react-native';
|
||||
|
||||
import ensureInstance from '../../../../src/private/__tests__/utilities/ensureInstance';
|
||||
import * as Fantom from '@react-native/fantom';
|
||||
import nullthrows from 'nullthrows';
|
||||
import * as React from 'react';
|
||||
import {createRef, useState} from 'react';
|
||||
import {FlatList, Modal, ScrollView, View} from 'react-native';
|
||||
import ReactNativeElement from 'react-native/src/private/webapis/dom/nodes/ReactNativeElement';
|
||||
|
||||
test('basic culling', () => {
|
||||
const root = Fantom.createRoot({viewportWidth: 100, viewportHeight: 100});
|
||||
@@ -46,9 +44,7 @@ test('basic culling', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 60,
|
||||
});
|
||||
@@ -61,7 +57,7 @@ test('basic culling', () => {
|
||||
'Update {type: "ScrollView", nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 0,
|
||||
});
|
||||
@@ -118,10 +114,8 @@ test('recursive culling', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
// === Scroll down to the edge of child AA ===
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 30,
|
||||
});
|
||||
@@ -132,7 +126,7 @@ test('recursive culling', () => {
|
||||
|
||||
// === Scroll down past child AA ===
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 36,
|
||||
});
|
||||
@@ -144,7 +138,7 @@ test('recursive culling', () => {
|
||||
]);
|
||||
|
||||
// === Scroll down past child AB ===
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 51,
|
||||
});
|
||||
@@ -156,7 +150,7 @@ test('recursive culling', () => {
|
||||
]);
|
||||
|
||||
// === Scroll down past element A ===
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 56,
|
||||
});
|
||||
@@ -168,7 +162,7 @@ test('recursive culling', () => {
|
||||
]);
|
||||
|
||||
// Scroll element B into viewport. Just child BA should be created.
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 155,
|
||||
});
|
||||
@@ -182,7 +176,7 @@ test('recursive culling', () => {
|
||||
]);
|
||||
|
||||
// Scroll child BA into viewport.
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 165,
|
||||
});
|
||||
@@ -194,7 +188,7 @@ test('recursive culling', () => {
|
||||
]);
|
||||
|
||||
// Scroll back to start
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 0,
|
||||
});
|
||||
@@ -216,7 +210,7 @@ test('recursive culling', () => {
|
||||
]);
|
||||
|
||||
// Scroll past element A
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 85,
|
||||
});
|
||||
@@ -265,9 +259,7 @@ test('recursive culling when initial offset is negative', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 0,
|
||||
});
|
||||
@@ -328,9 +320,7 @@ test('deep nesting', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 40,
|
||||
});
|
||||
@@ -345,7 +335,7 @@ test('deep nesting', () => {
|
||||
'Insert {type: "View", parentNativeID: (N/A), index: 1, nativeID: "element B"}',
|
||||
]);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 150,
|
||||
});
|
||||
@@ -489,9 +479,7 @@ test('initial render', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 100,
|
||||
});
|
||||
@@ -561,9 +549,7 @@ test('basic culling smaller ScrollView', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 11,
|
||||
});
|
||||
@@ -624,9 +610,7 @@ test('culling with transform move', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 1,
|
||||
});
|
||||
@@ -669,9 +653,7 @@ test('culling with recursive transform move', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 1,
|
||||
});
|
||||
@@ -713,9 +695,7 @@ test('culling with transform scale', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 121,
|
||||
});
|
||||
@@ -774,10 +754,8 @@ test('culling inside of Modal', () => {
|
||||
);
|
||||
});
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueModalSizeUpdate(element, {
|
||||
Fantom.enqueueModalSizeUpdate(nodeRef, {
|
||||
width: 100,
|
||||
height: 100,
|
||||
});
|
||||
@@ -900,9 +878,7 @@ describe('reparenting', () => {
|
||||
'Insert {type: "ScrollView", parentNativeID: (root), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 60,
|
||||
});
|
||||
@@ -1578,10 +1554,8 @@ describe('reparenting', () => {
|
||||
'Insert {type: "View", parentNativeID: (N/A), index: 0, nativeID: "child"}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
// Scroll down to see the grandchild.
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 115,
|
||||
});
|
||||
@@ -1669,10 +1643,8 @@ describe('reparenting', () => {
|
||||
'Insert {type: "View", parentNativeID: (N/A), index: 0, nativeID: "child"}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
// Scroll down to see the grandchild.
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 118,
|
||||
});
|
||||
@@ -1911,10 +1883,8 @@ describe('reparenting', () => {
|
||||
'Insert {type: "View", parentNativeID: (N/A), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
// Scroll to reveal grandchild.
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 70,
|
||||
});
|
||||
@@ -2001,10 +1971,8 @@ describe('reparenting', () => {
|
||||
'Insert {type: "View", parentNativeID: (N/A), index: 0, nativeID: (N/A)}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
// Scroll to reveal grandchild.
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 70,
|
||||
});
|
||||
@@ -2214,9 +2182,7 @@ describe('reparenting', () => {
|
||||
'Insert {type: "View", parentNativeID: "unflattened", index: 0, nativeID: "child"}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 50,
|
||||
});
|
||||
@@ -2312,9 +2278,7 @@ describe('reparenting', () => {
|
||||
'Insert {type: "View", parentNativeID: "unflattened", index: 0, nativeID: "child"}',
|
||||
]);
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.scrollTo(element, {
|
||||
Fantom.scrollTo(nodeRef, {
|
||||
x: 0,
|
||||
y: 50,
|
||||
});
|
||||
@@ -2463,10 +2427,9 @@ describe('opt out mechanism - Unstable_uncullableView & Unstable_uncullableTrace
|
||||
</ScrollView>,
|
||||
);
|
||||
});
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueModalSizeUpdate(element, {
|
||||
Fantom.enqueueModalSizeUpdate(nodeRef, {
|
||||
width: 100,
|
||||
height: 100,
|
||||
});
|
||||
@@ -2517,10 +2480,8 @@ describe('opt out mechanism - Unstable_uncullableView & Unstable_uncullableTrace
|
||||
);
|
||||
});
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueModalSizeUpdate(element, {
|
||||
Fantom.enqueueModalSizeUpdate(nodeRef, {
|
||||
width: 100,
|
||||
height: 100,
|
||||
});
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
import type * as React from 'react';
|
||||
import {Constructor} from '../../../types/private/Utilities';
|
||||
import {NativeMethods} from '../../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../../types/public/ReactNativeTypes';
|
||||
import {ColorValue, StyleProp} from '../../StyleSheet/StyleSheet';
|
||||
import {ViewStyle} from '../../StyleSheet/StyleSheetTypes';
|
||||
import {ViewProps} from '../View/ViewPropTypes';
|
||||
@@ -114,5 +114,5 @@ export interface SwitchProps extends SwitchPropsIOS {
|
||||
* the supplied `value` prop instead of the expected result of any user actions.
|
||||
*/
|
||||
declare class SwitchComponent extends React.Component<SwitchProps> {}
|
||||
declare const SwitchBase: Constructor<NativeMethods> & typeof SwitchComponent;
|
||||
declare const SwitchBase: Constructor<HostInstance> & typeof SwitchComponent;
|
||||
export class Switch extends SwitchBase {}
|
||||
|
||||
@@ -10,10 +10,7 @@
|
||||
import type * as React from 'react';
|
||||
import {Constructor} from '../../../types/private/Utilities';
|
||||
import {TimerMixin} from '../../../types/private/TimerMixin';
|
||||
import {
|
||||
HostInstance,
|
||||
NativeMethods,
|
||||
} from '../../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../../types/public/ReactNativeTypes';
|
||||
import {ColorValue, StyleProp} from '../../StyleSheet/StyleSheet';
|
||||
import {TextStyle} from '../../StyleSheet/StyleSheetTypes';
|
||||
import {
|
||||
@@ -1029,7 +1026,7 @@ interface TextInputState {
|
||||
* @see https://reactnative.dev/docs/textinput#methods
|
||||
*/
|
||||
declare class TextInputComponent extends React.Component<TextInputProps> {}
|
||||
declare const TextInputBase: Constructor<NativeMethods> &
|
||||
declare const TextInputBase: Constructor<HostInstance> &
|
||||
Constructor<TimerMixin> &
|
||||
typeof TextInputComponent;
|
||||
export class TextInput extends TextInputBase {
|
||||
|
||||
@@ -449,6 +449,12 @@ function InternalTextInput(props: TextInputProps): React.Node {
|
||||
before we can get to the long term breaking change.
|
||||
*/
|
||||
if (instance != null) {
|
||||
// Register the input immediately when the ref is set so that focus()
|
||||
// can be called from ref callbacks
|
||||
// Double registering during useLayoutEffect is fine, because the underlying
|
||||
// state is a Set.
|
||||
TextInputState.registerInput(instance);
|
||||
|
||||
// $FlowFixMe[prop-missing] - See the explanation above.
|
||||
// $FlowFixMe[unsafe-object-assign]
|
||||
Object.assign(instance, {
|
||||
|
||||
+4
-13
@@ -12,7 +12,6 @@ import '@react-native/fantom/src/setUpDefaultReactNativeEnvironment';
|
||||
|
||||
import type {TextInputInstance} from '../TextInput.flow';
|
||||
|
||||
import ensureInstance from '../../../../src/private/__tests__/utilities/ensureInstance';
|
||||
import * as Fantom from '@react-native/fantom';
|
||||
import nullthrows from 'nullthrows';
|
||||
import * as React from 'react';
|
||||
@@ -60,10 +59,8 @@ describe('<TextInput>', () => {
|
||||
);
|
||||
});
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueNativeEvent(element, 'change', {
|
||||
Fantom.enqueueNativeEvent(nodeRef, 'change', {
|
||||
text: 'Hello World',
|
||||
});
|
||||
});
|
||||
@@ -86,10 +83,8 @@ describe('<TextInput>', () => {
|
||||
root.render(<TextInput onChangeText={onChangeText} ref={nodeRef} />);
|
||||
});
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueNativeEvent(element, 'change', {
|
||||
Fantom.enqueueNativeEvent(nodeRef, 'change', {
|
||||
text: 'Hello World',
|
||||
});
|
||||
});
|
||||
@@ -113,12 +108,10 @@ describe('<TextInput>', () => {
|
||||
root.render(<TextInput onFocus={focusEvent} ref={nodeRef} />);
|
||||
});
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
expect(focusEvent).toHaveBeenCalledTimes(0);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueNativeEvent(element, 'focus');
|
||||
Fantom.enqueueNativeEvent(nodeRef, 'focus');
|
||||
});
|
||||
|
||||
// The tasks have not run.
|
||||
@@ -141,12 +134,10 @@ describe('<TextInput>', () => {
|
||||
root.render(<TextInput onBlur={blurEvent} ref={nodeRef} />);
|
||||
});
|
||||
|
||||
const element = ensureInstance(nodeRef.current, ReactNativeElement);
|
||||
|
||||
expect(blurEvent).toHaveBeenCalledTimes(0);
|
||||
|
||||
Fantom.runOnUIThread(() => {
|
||||
Fantom.enqueueNativeEvent(element, 'blur');
|
||||
Fantom.enqueueNativeEvent(nodeRef, 'blur');
|
||||
});
|
||||
|
||||
// The tasks have not run.
|
||||
|
||||
+19
-1
@@ -13,6 +13,9 @@ import type {AnyAttributeType} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import * as ReactNativeFeatureFlags from '../../../src/private/featureflags/ReactNativeFeatureFlags';
|
||||
import processAspectRatio from '../../StyleSheet/processAspectRatio';
|
||||
import processBackgroundImage from '../../StyleSheet/processBackgroundImage';
|
||||
import processBackgroundPosition from '../../StyleSheet/processBackgroundPosition';
|
||||
import processBackgroundRepeat from '../../StyleSheet/processBackgroundRepeat';
|
||||
import processBackgroundSize from '../../StyleSheet/processBackgroundSize';
|
||||
import processBoxShadow from '../../StyleSheet/processBoxShadow';
|
||||
import processColor from '../../StyleSheet/processColor';
|
||||
import processFilter from '../../StyleSheet/processFilter';
|
||||
@@ -144,10 +147,25 @@ const ReactNativeStyleAttributes: {[string]: AnyAttributeType, ...} = {
|
||||
: {process: processBoxShadow},
|
||||
|
||||
/**
|
||||
* Linear Gradient
|
||||
* BackgroundImage
|
||||
*/
|
||||
experimental_backgroundImage: {process: processBackgroundImage},
|
||||
|
||||
/**
|
||||
* BackgroundSize
|
||||
*/
|
||||
experimental_backgroundSize: {process: processBackgroundSize},
|
||||
|
||||
/**
|
||||
* BackgroundPosition
|
||||
*/
|
||||
experimental_backgroundPosition: {process: processBackgroundPosition},
|
||||
|
||||
/**
|
||||
* BackgroundRepeat
|
||||
*/
|
||||
experimental_backgroundRepeat: {process: processBackgroundRepeat},
|
||||
|
||||
/**
|
||||
* View
|
||||
*/
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
import type * as React from 'react';
|
||||
import {Constructor} from '../../../types/private/Utilities';
|
||||
import {ViewProps} from './ViewPropTypes';
|
||||
import {NativeMethods} from '../../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../../types/public/ReactNativeTypes';
|
||||
|
||||
/**
|
||||
* The most fundamental component for building UI, View is a container that supports layout with flexbox, style, some touch handling,
|
||||
@@ -19,7 +19,7 @@ import {NativeMethods} from '../../../types/public/ReactNativeTypes';
|
||||
* whether that is a UIView, <div>, android.view, etc.
|
||||
*/
|
||||
declare class ViewComponent extends React.Component<ViewProps> {}
|
||||
declare const ViewBase: Constructor<NativeMethods> & typeof ViewComponent;
|
||||
declare const ViewBase: Constructor<HostInstance> & typeof ViewComponent;
|
||||
export class View extends ViewBase {
|
||||
/**
|
||||
* Is 3D Touch / Force Touch available (i.e. will touch events include `force`)
|
||||
|
||||
@@ -21,8 +21,8 @@ const ViewNativeComponent: HostComponent<Props> =
|
||||
}));
|
||||
|
||||
interface NativeCommands {
|
||||
+focus: () => void;
|
||||
+blur: () => void;
|
||||
+focus: (viewRef: HostInstance) => void;
|
||||
+blur: (viewRef: HostInstance) => void;
|
||||
+hotspotUpdate: (viewRef: HostInstance, x: number, y: number) => void;
|
||||
+setPressed: (viewRef: HostInstance, pressed: boolean) => void;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow strict-local
|
||||
* @fantom_flags enableNativeCSSParsing:*
|
||||
* @format
|
||||
*/
|
||||
|
||||
@@ -229,6 +230,56 @@ describe('<View>', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('background-image', () => {
|
||||
it('it parses CSS and object syntax', () => {
|
||||
const root = Fantom.createRoot();
|
||||
|
||||
Fantom.runTask(() => {
|
||||
root.render(
|
||||
<>
|
||||
<View
|
||||
style={{
|
||||
experimental_backgroundImage:
|
||||
'radial-gradient(#e66465, #9198e5)',
|
||||
}}
|
||||
/>
|
||||
<View
|
||||
style={{
|
||||
experimental_backgroundImage: [
|
||||
{
|
||||
type: 'radial-gradient',
|
||||
shape: 'ellipse',
|
||||
position: {top: '50%', right: '50%'},
|
||||
size: 'farthest-corner',
|
||||
colorStops: [{color: '#e66465'}, {color: '#9198e5'}],
|
||||
},
|
||||
],
|
||||
}}
|
||||
/>
|
||||
</>,
|
||||
);
|
||||
});
|
||||
|
||||
const expectedProps = {
|
||||
backgroundImage:
|
||||
'[radial-gradient(ellipse farthest-corner at 50% 50% , rgba(230, 100, 101, 1), rgba(145, 152, 229, 1))]',
|
||||
};
|
||||
|
||||
expect(root.getRenderedOutput().toJSON()).toEqual([
|
||||
{
|
||||
children: [],
|
||||
props: expectedProps,
|
||||
type: 'View',
|
||||
},
|
||||
{
|
||||
children: [],
|
||||
props: expectedProps,
|
||||
type: 'View',
|
||||
},
|
||||
]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('pointerEvents', () => {
|
||||
|
||||
@@ -20,7 +20,9 @@ if (NativePerformance) {
|
||||
// $FlowExpectedError[cannot-write]
|
||||
global.performance = {
|
||||
mark: () => {},
|
||||
clearMarks: () => {},
|
||||
measure: () => {},
|
||||
clearMeasures: () => {},
|
||||
now: () => {
|
||||
const performanceNow = global.nativePerformanceNow || Date.now;
|
||||
return performanceNow();
|
||||
|
||||
@@ -332,7 +332,9 @@ class DebuggingOverlayRegistry {
|
||||
instance.measure((x, y, width, height, left, top) => {
|
||||
// measure can execute callback without any values provided to signal error.
|
||||
if (left == null || top == null || width == null || height == null) {
|
||||
reject('Unexpectedly failed to call measure on an instance.');
|
||||
reject(
|
||||
new Error('Unexpectedly failed to call measure on an instance.'),
|
||||
);
|
||||
}
|
||||
|
||||
resolve({
|
||||
@@ -480,7 +482,11 @@ class DebuggingOverlayRegistry {
|
||||
width == null ||
|
||||
height == null
|
||||
) {
|
||||
reject('Unexpectedly failed to call measure on an instance.');
|
||||
reject(
|
||||
new Error(
|
||||
'Unexpectedly failed to call measure on an instance.',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
resolve({x: left, y: top, width, height});
|
||||
|
||||
@@ -30,8 +30,11 @@ class RCTDeviceEventEmitterImpl extends EventEmitter<RCTDeviceEventDefinitions>
|
||||
...args: RCTDeviceEventDefinitions[TEvent]
|
||||
): void {
|
||||
beginEvent(() => `RCTDeviceEventEmitter.emit#${eventType}`);
|
||||
super.emit(eventType, ...args);
|
||||
endEvent();
|
||||
try {
|
||||
super.emit(eventType, ...args);
|
||||
} finally {
|
||||
endEvent();
|
||||
}
|
||||
}
|
||||
}
|
||||
const RCTDeviceEventEmitter: IEventEmitter<RCTDeviceEventDefinitions> =
|
||||
|
||||
@@ -26,68 +26,81 @@ class LazyIterator {
|
||||
public:
|
||||
LazyIterator() = default;
|
||||
|
||||
LazyIterator(U vector, convert_type convert, size_type i)
|
||||
: _v(vector), _i(i), _convert(std::move(convert)) {}
|
||||
LazyIterator(U vector, convert_type convert, size_type i) : _v(vector), _i(i), _convert(std::move(convert)) {}
|
||||
|
||||
bool operator==(const LazyIterator& other) const {
|
||||
bool operator==(const LazyIterator &other) const
|
||||
{
|
||||
return _i == other._i && _v == other._v;
|
||||
}
|
||||
|
||||
bool operator<(const LazyIterator& b) const {
|
||||
bool operator<(const LazyIterator &b) const
|
||||
{
|
||||
return _i < b._i;
|
||||
}
|
||||
|
||||
value_type operator*() const {
|
||||
value_type operator*() const
|
||||
{
|
||||
return _convert(_v[_i]);
|
||||
}
|
||||
|
||||
std::unique_ptr<value_type> operator->() const {
|
||||
std::unique_ptr<value_type> operator->() const
|
||||
{
|
||||
return std::make_unique<value_type>(*this);
|
||||
}
|
||||
|
||||
LazyIterator operator+(difference_type n) const {
|
||||
LazyIterator operator+(difference_type n) const
|
||||
{
|
||||
return LazyIterator(_v, _convert, _i + n);
|
||||
}
|
||||
|
||||
LazyIterator& operator+=(difference_type n) {
|
||||
LazyIterator &operator+=(difference_type n)
|
||||
{
|
||||
_i += n;
|
||||
return *this;
|
||||
}
|
||||
|
||||
LazyIterator& operator-=(difference_type n) {
|
||||
LazyIterator &operator-=(difference_type n)
|
||||
{
|
||||
_i -= n;
|
||||
return *this;
|
||||
}
|
||||
|
||||
LazyIterator operator-(difference_type n) const {
|
||||
LazyIterator operator-(difference_type n) const
|
||||
{
|
||||
return LazyIterator(_v, _i - n);
|
||||
}
|
||||
|
||||
difference_type operator-(const LazyIterator& a) const {
|
||||
difference_type operator-(const LazyIterator &a) const
|
||||
{
|
||||
return _i - a._i;
|
||||
}
|
||||
|
||||
LazyIterator& operator++() {
|
||||
LazyIterator &operator++()
|
||||
{
|
||||
return *this += 1;
|
||||
}
|
||||
|
||||
LazyIterator operator++(int) {
|
||||
LazyIterator operator++(int)
|
||||
{
|
||||
auto tmp = *this;
|
||||
++*this;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
LazyIterator& operator--() {
|
||||
LazyIterator &operator--()
|
||||
{
|
||||
return *this -= 1;
|
||||
}
|
||||
|
||||
LazyIterator operator--(int) {
|
||||
LazyIterator operator--(int)
|
||||
{
|
||||
auto tmp = *this;
|
||||
--*this;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
value_type operator[](difference_type n) const {
|
||||
value_type operator[](difference_type n) const
|
||||
{
|
||||
return _convert(_v[_i + n]);
|
||||
}
|
||||
|
||||
@@ -98,29 +111,32 @@ class LazyIterator {
|
||||
};
|
||||
|
||||
template <typename T, typename U>
|
||||
LazyIterator<T, U> operator+(
|
||||
typename LazyIterator<T, U>::difference_type n,
|
||||
const LazyIterator<T, U>& i) {
|
||||
LazyIterator<T, U> operator+(typename LazyIterator<T, U>::difference_type n, const LazyIterator<T, U> &i)
|
||||
{
|
||||
return i + n;
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
bool operator!=(const LazyIterator<T, U>& a, const LazyIterator<T, U>& b) {
|
||||
bool operator!=(const LazyIterator<T, U> &a, const LazyIterator<T, U> &b)
|
||||
{
|
||||
return !(a == b);
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
bool operator<=(const LazyIterator<T, U>& a, const LazyIterator<T, U>& b) {
|
||||
bool operator<=(const LazyIterator<T, U> &a, const LazyIterator<T, U> &b)
|
||||
{
|
||||
return a < b || a == b;
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
bool operator>(const LazyIterator<T, U>& a, const LazyIterator<T, U>& b) {
|
||||
bool operator>(const LazyIterator<T, U> &a, const LazyIterator<T, U> &b)
|
||||
{
|
||||
return b < a;
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
bool operator>=(const LazyIterator<T, U>& a, const LazyIterator<T, U>& b) {
|
||||
bool operator>=(const LazyIterator<T, U> &a, const LazyIterator<T, U> &b)
|
||||
{
|
||||
return a > b || a == b;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,24 +31,28 @@ class LazyVector {
|
||||
using size_type = std::int32_t;
|
||||
using convert_type = std::function<T(U)>;
|
||||
|
||||
static LazyVector<T, U>
|
||||
fromUnsafeRawValue(U v, size_type size, convert_type convert) {
|
||||
static LazyVector<T, U> fromUnsafeRawValue(U v, size_type size, convert_type convert)
|
||||
{
|
||||
return {v, size, convert};
|
||||
}
|
||||
|
||||
U unsafeRawValue() const {
|
||||
U unsafeRawValue() const
|
||||
{
|
||||
return _v;
|
||||
}
|
||||
|
||||
bool empty() const {
|
||||
bool empty() const
|
||||
{
|
||||
return _size == 0;
|
||||
}
|
||||
|
||||
size_type size() const {
|
||||
size_type size() const
|
||||
{
|
||||
return _size;
|
||||
}
|
||||
|
||||
const_reference at(size_type pos) const {
|
||||
const_reference at(size_type pos) const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (!(pos < _size)) {
|
||||
throw std::out_of_range("out of range");
|
||||
@@ -59,41 +63,47 @@ class LazyVector {
|
||||
return _convert(_v[pos]);
|
||||
}
|
||||
|
||||
const_reference operator[](size_type pos) const {
|
||||
const_reference operator[](size_type pos) const
|
||||
{
|
||||
assert(pos < _size);
|
||||
return _convert(_v[pos]);
|
||||
}
|
||||
|
||||
const_reference front() const {
|
||||
const_reference front() const
|
||||
{
|
||||
assert(_size);
|
||||
return (*this)[0];
|
||||
}
|
||||
|
||||
const_reference back() const {
|
||||
const_reference back() const
|
||||
{
|
||||
assert(_size);
|
||||
return (*this)[_size - 1];
|
||||
}
|
||||
|
||||
const_iterator begin() const {
|
||||
const_iterator begin() const
|
||||
{
|
||||
return const_iterator(_v, _convert, 0);
|
||||
}
|
||||
|
||||
const_iterator cbegin() const {
|
||||
const_iterator cbegin() const
|
||||
{
|
||||
return begin();
|
||||
}
|
||||
|
||||
const_iterator end() const {
|
||||
const_iterator end() const
|
||||
{
|
||||
return const_iterator(_v, _convert, _size);
|
||||
}
|
||||
|
||||
const_iterator cend() const {
|
||||
const_iterator cend() const
|
||||
{
|
||||
return end();
|
||||
}
|
||||
|
||||
private:
|
||||
/** Wrapped vector */
|
||||
LazyVector(U vector, size_type size, convert_type convert)
|
||||
: _v(vector), _size(size), _convert(convert) {}
|
||||
LazyVector(U vector, size_type size, convert_type convert) : _v(vector), _size(size), _convert(convert) {}
|
||||
|
||||
U _v;
|
||||
size_type _size;
|
||||
|
||||
+3
-3
@@ -11,7 +11,7 @@ import * as React from 'react';
|
||||
import {Constructor} from '../../types/private/Utilities';
|
||||
import {AccessibilityProps} from '../Components/View/ViewAccessibility';
|
||||
import {Insets} from '../../types/public/Insets';
|
||||
import {NativeMethods} from '../../types/public/ReactNativeTypes';
|
||||
import {HostInstance} from '../../types/public/ReactNativeTypes';
|
||||
import {ColorValue, StyleProp} from '../StyleSheet/StyleSheet';
|
||||
import {ImageStyle, ViewStyle} from '../StyleSheet/StyleSheetTypes';
|
||||
import {LayoutChangeEvent, NativeSyntheticEvent} from '../Types/CoreEventTypes';
|
||||
@@ -338,7 +338,7 @@ export interface ImageSize {
|
||||
}
|
||||
|
||||
declare class ImageComponent extends React.Component<ImageProps> {}
|
||||
declare const ImageBase: Constructor<NativeMethods> & typeof ImageComponent;
|
||||
declare const ImageBase: Constructor<HostInstance> & typeof ImageComponent;
|
||||
export class Image extends ImageBase {
|
||||
static getSize(uri: string): Promise<ImageSize>;
|
||||
static getSize(
|
||||
@@ -384,6 +384,6 @@ export interface ImageBackgroundProps extends ImagePropsBase {
|
||||
}
|
||||
|
||||
declare class ImageBackgroundComponent extends React.Component<ImageBackgroundProps> {}
|
||||
declare const ImageBackgroundBase: Constructor<NativeMethods> &
|
||||
declare const ImageBackgroundBase: Constructor<HostInstance> &
|
||||
typeof ImageBackgroundComponent;
|
||||
export class ImageBackground extends ImageBackgroundBase {}
|
||||
|
||||
@@ -38,11 +38,9 @@ RCT_EXPORT_MODULE()
|
||||
* be scaled down to `displaySize` rather than `size`.
|
||||
* All units are in px (not points).
|
||||
*/
|
||||
RCT_EXPORT_METHOD(cropImage
|
||||
: (NSURLRequest *)imageRequest cropData
|
||||
: (JS::NativeImageEditor::Options &)cropData successCallback
|
||||
: (RCTResponseSenderBlock)successCallback errorCallback
|
||||
: (RCTResponseSenderBlock)errorCallback)
|
||||
RCT_EXPORT_METHOD(
|
||||
cropImage : (NSURLRequest *)imageRequest cropData : (JS::NativeImageEditor::Options &)cropData successCallback : (
|
||||
RCTResponseSenderBlock)successCallback errorCallback : (RCTResponseSenderBlock)errorCallback)
|
||||
{
|
||||
CGRect rect = {
|
||||
[RCTConvert CGPoint:@{
|
||||
|
||||
@@ -331,9 +331,9 @@ static RCTImageLoaderCancellationBlock RCTLoadImageURLFromLoader(
|
||||
RCTImageLoaderPartialLoadBlock partialLoadHandler,
|
||||
RCTImageLoaderCompletionBlockWithMetadata completionHandler)
|
||||
{
|
||||
if ([loadHandler respondsToSelector:@selector(loadImageForURL:
|
||||
size:scale:resizeMode:progressHandler:partialLoadHandler
|
||||
:completionHandlerWithMetadata:)]) {
|
||||
if ([loadHandler
|
||||
respondsToSelector:@selector
|
||||
(loadImageForURL:size:scale:resizeMode:progressHandler:partialLoadHandler:completionHandlerWithMetadata:)]) {
|
||||
return [loadHandler loadImageForURL:imageURL
|
||||
size:size
|
||||
scale:scale
|
||||
@@ -410,17 +410,17 @@ static RCTImageLoaderCancellationBlock RCTLoadImageURLFromLoader(
|
||||
completionBlock:(RCTImageLoaderCompletionBlock)completionBlock
|
||||
{
|
||||
RCTImageURLLoaderRequest *request = [self loadImageWithURLRequest:imageURLRequest
|
||||
size:size
|
||||
scale:scale
|
||||
clipped:clipped
|
||||
resizeMode:resizeMode
|
||||
priority:priority
|
||||
attribution:{}
|
||||
progressBlock:progressBlock
|
||||
partialLoadBlock:partialLoadBlock
|
||||
completionBlock:^(NSError *error, UIImage *image, id metadata) {
|
||||
completionBlock(error, image);
|
||||
}];
|
||||
size:size
|
||||
scale:scale
|
||||
clipped:clipped
|
||||
resizeMode:resizeMode
|
||||
priority:priority
|
||||
attribution:{}
|
||||
progressBlock:progressBlock
|
||||
partialLoadBlock:partialLoadBlock
|
||||
completionBlock:^(NSError *error, UIImage *image, id metadata) {
|
||||
completionBlock(error, image);
|
||||
}];
|
||||
return ^{
|
||||
[request cancel];
|
||||
};
|
||||
@@ -1229,10 +1229,8 @@ static RCTImageLoaderCancellationBlock RCTLoadImageURLFromLoader(
|
||||
return std::make_shared<facebook::react::NativeImageLoaderIOSSpecJSI>(params);
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(getSize
|
||||
: (NSString *)uri resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
getSize : (NSString *)uri resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
NSURLRequest *request = [RCTConvert NSURLRequest:uri];
|
||||
[self getImageSizeForURLRequest:request
|
||||
@@ -1248,11 +1246,9 @@ RCT_EXPORT_METHOD(getSize
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(getSizeWithHeaders
|
||||
: (NSString *)uri headers
|
||||
: (NSDictionary *)headers resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
getSizeWithHeaders : (NSString *)uri headers : (NSDictionary *)headers resolve : (RCTPromiseResolveBlock)
|
||||
resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
NSURL *URL = [RCTConvert NSURL:uri];
|
||||
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
|
||||
@@ -1269,20 +1265,15 @@ RCT_EXPORT_METHOD(getSizeWithHeaders
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(prefetchImage
|
||||
: (NSString *)uri resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
prefetchImage : (NSString *)uri resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
[self prefetchImageWithMetadata:uri queryRootName:nil rootTag:0 resolve:resolve reject:reject];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(prefetchImageWithMetadata
|
||||
: (NSString *)uri queryRootName
|
||||
: (NSString *)queryRootName rootTag
|
||||
: (double)rootTag resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
prefetchImageWithMetadata : (NSString *)uri queryRootName : (NSString *)queryRootName rootTag : (double)
|
||||
rootTag resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
NSURLRequest *request = [RCTConvert NSURLRequest:uri];
|
||||
[self loadImageWithURLRequest:request
|
||||
@@ -1306,10 +1297,8 @@ RCT_EXPORT_METHOD(prefetchImageWithMetadata
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(queryCache
|
||||
: (NSArray *)uris resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
queryCache : (NSArray *)uris resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
resolve([self getImageCacheStatus:uris]);
|
||||
}
|
||||
|
||||
@@ -106,10 +106,9 @@ RCT_EXPORT_METHOD(hasImageForTag : (NSString *)imageTag callback : (RCTResponseS
|
||||
}
|
||||
|
||||
// TODO (#5906496): Name could be more explicit - something like getBase64EncodedDataForTag:?
|
||||
RCT_EXPORT_METHOD(getBase64ForTag
|
||||
: (NSString *)imageTag successCallback
|
||||
: (RCTResponseSenderBlock)successCallback errorCallback
|
||||
: (RCTResponseSenderBlock)errorCallback)
|
||||
RCT_EXPORT_METHOD(
|
||||
getBase64ForTag : (NSString *)imageTag successCallback : (RCTResponseSenderBlock)
|
||||
successCallback errorCallback : (RCTResponseSenderBlock)errorCallback)
|
||||
{
|
||||
NSData *imageData = _store[imageTag];
|
||||
if (imageData == nullptr) {
|
||||
@@ -123,10 +122,9 @@ RCT_EXPORT_METHOD(getBase64ForTag
|
||||
});
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(addImageFromBase64
|
||||
: (NSString *)base64String successCallback
|
||||
: (RCTResponseSenderBlock)successCallback errorCallback
|
||||
: (RCTResponseSenderBlock)errorCallback)
|
||||
RCT_EXPORT_METHOD(
|
||||
addImageFromBase64 : (NSString *)base64String successCallback : (RCTResponseSenderBlock)
|
||||
successCallback errorCallback : (RCTResponseSenderBlock)errorCallback)
|
||||
|
||||
{
|
||||
// Dispatching to a background thread to perform base64 decoding
|
||||
|
||||
@@ -101,12 +101,11 @@ CGRect RCTTargetRect(CGSize sourceSize, CGSize destSize, CGFloat destScale, RCTR
|
||||
sourceSize.height = destSize.height;
|
||||
sourceSize.width = sourceSize.height * aspect;
|
||||
}
|
||||
return (CGRect){
|
||||
{
|
||||
RCTFloorValue((destSize.width - sourceSize.width) / 2, destScale),
|
||||
RCTFloorValue((destSize.height - sourceSize.height) / 2, destScale),
|
||||
},
|
||||
RCTCeilSize(sourceSize, destScale)};
|
||||
return (CGRect){{
|
||||
RCTFloorValue((destSize.width - sourceSize.width) / 2, destScale),
|
||||
RCTFloorValue((destSize.height - sourceSize.height) / 2, destScale),
|
||||
},
|
||||
RCTCeilSize(sourceSize, destScale)};
|
||||
|
||||
case RCTResizeModeCover:
|
||||
|
||||
@@ -115,17 +114,16 @@ CGRect RCTTargetRect(CGSize sourceSize, CGSize destSize, CGFloat destScale, RCTR
|
||||
sourceSize.height = destSize.height;
|
||||
sourceSize.width = sourceSize.height * aspect;
|
||||
destSize.width = destSize.height * targetAspect;
|
||||
return (CGRect){
|
||||
{RCTFloorValue((destSize.width - sourceSize.width) / 2, destScale), 0}, RCTCeilSize(sourceSize, destScale)};
|
||||
return (CGRect){{RCTFloorValue((destSize.width - sourceSize.width) / 2, destScale), 0},
|
||||
RCTCeilSize(sourceSize, destScale)};
|
||||
|
||||
} else { // target is wider than content
|
||||
|
||||
sourceSize.width = destSize.width;
|
||||
sourceSize.height = sourceSize.width / aspect;
|
||||
destSize.height = destSize.width / targetAspect;
|
||||
return (CGRect){
|
||||
{0, RCTFloorValue((destSize.height - sourceSize.height) / 2, destScale)},
|
||||
RCTCeilSize(sourceSize, destScale)};
|
||||
return (CGRect){{0, RCTFloorValue((destSize.height - sourceSize.height) / 2, destScale)},
|
||||
RCTCeilSize(sourceSize, destScale)};
|
||||
}
|
||||
|
||||
case RCTResizeModeCenter:
|
||||
@@ -140,12 +138,11 @@ CGRect RCTTargetRect(CGSize sourceSize, CGSize destSize, CGFloat destScale, RCTR
|
||||
sourceSize.width = sourceSize.height * aspect;
|
||||
}
|
||||
|
||||
return (CGRect){
|
||||
{
|
||||
RCTFloorValue((destSize.width - sourceSize.width) / 2, destScale),
|
||||
RCTFloorValue((destSize.height - sourceSize.height) / 2, destScale),
|
||||
},
|
||||
RCTCeilSize(sourceSize, destScale)};
|
||||
return (CGRect){{
|
||||
RCTFloorValue((destSize.width - sourceSize.width) / 2, destScale),
|
||||
RCTFloorValue((destSize.height - sourceSize.height) / 2, destScale),
|
||||
},
|
||||
RCTCeilSize(sourceSize, destScale)};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -293,18 +290,31 @@ UIImage *__nullable RCTDecodeImageWithData(NSData *data, CGSize destSize, CGFloa
|
||||
// Calculate target size
|
||||
CGSize targetSize = RCTTargetSize(sourceSize, 1, destSize, destScale, resizeMode, NO);
|
||||
CGSize targetPixelSize = RCTSizeInPixels(targetSize, destScale);
|
||||
CGFloat maxPixelSize =
|
||||
fmax(fmin(sourceSize.width, targetPixelSize.width), fmin(sourceSize.height, targetPixelSize.height));
|
||||
CGImageRef imageRef;
|
||||
BOOL createThumbnail = targetPixelSize.width != 0 && targetPixelSize.height != 0 &&
|
||||
(sourceSize.width > targetPixelSize.width || sourceSize.height > targetPixelSize.height);
|
||||
|
||||
NSDictionary<NSString *, NSNumber *> *options = @{
|
||||
(id)kCGImageSourceShouldAllowFloat : @YES,
|
||||
(id)kCGImageSourceCreateThumbnailWithTransform : @YES,
|
||||
(id)kCGImageSourceCreateThumbnailFromImageAlways : @YES,
|
||||
(id)kCGImageSourceThumbnailMaxPixelSize : @(maxPixelSize),
|
||||
};
|
||||
if (createThumbnail) {
|
||||
CGFloat maxPixelSize = fmax(targetPixelSize.width, targetPixelSize.height);
|
||||
|
||||
// Get a thumbnail of the source image. This is usually slower than creating a full-sized image,
|
||||
// but takes up less memory once it's done.
|
||||
imageRef = CGImageSourceCreateThumbnailAtIndex(
|
||||
sourceRef, 0, (__bridge CFDictionaryRef) @{
|
||||
(id)kCGImageSourceShouldAllowFloat : @YES,
|
||||
(id)kCGImageSourceCreateThumbnailWithTransform : @YES,
|
||||
(id)kCGImageSourceCreateThumbnailFromImageAlways : @YES,
|
||||
(id)kCGImageSourceThumbnailMaxPixelSize : @(maxPixelSize),
|
||||
});
|
||||
} else {
|
||||
// Get an image in full size. This is faster than `CGImageSourceCreateThumbnailAtIndex`
|
||||
// and consumes less memory if only the target size doesn't require downscaling.
|
||||
imageRef = CGImageSourceCreateImageAtIndex(
|
||||
sourceRef, 0, (__bridge CFDictionaryRef) @{
|
||||
(id)kCGImageSourceShouldAllowFloat : @YES,
|
||||
});
|
||||
}
|
||||
|
||||
// Get thumbnail
|
||||
CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(sourceRef, 0, (__bridge CFDictionaryRef)options);
|
||||
CFRelease(sourceRef);
|
||||
if (!imageRef) {
|
||||
return nil;
|
||||
|
||||
@@ -53,10 +53,9 @@ RCT_CUSTOM_VIEW_PROPERTY(tintColor, UIColor, RCTImageView)
|
||||
view.renderingMode = json ? UIImageRenderingModeAlwaysTemplate : defaultView.renderingMode;
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(getSize
|
||||
: (NSURLRequest *)request successBlock
|
||||
: (RCTResponseSenderBlock)successBlock errorBlock
|
||||
: (RCTResponseErrorBlock)errorBlock)
|
||||
RCT_EXPORT_METHOD(
|
||||
getSize : (NSURLRequest *)request successBlock : (RCTResponseSenderBlock)
|
||||
successBlock errorBlock : (RCTResponseErrorBlock)errorBlock)
|
||||
{
|
||||
[[self.bridge moduleForName:@"ImageLoader"
|
||||
lazilyLoadIfNecessary:YES] getImageSizeForURLRequest:request
|
||||
@@ -69,10 +68,9 @@ RCT_EXPORT_METHOD(getSize
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(getSizeWithHeaders
|
||||
: (RCTImageSource *)source resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
getSizeWithHeaders : (RCTImageSource *)source resolve : (RCTPromiseResolveBlock)
|
||||
resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
[[self.bridge moduleForName:@"ImageLoader" lazilyLoadIfNecessary:YES]
|
||||
getImageSizeForURLRequest:source.request
|
||||
@@ -85,10 +83,9 @@ RCT_EXPORT_METHOD(getSizeWithHeaders
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(prefetchImage
|
||||
: (NSURLRequest *)request resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
prefetchImage : (NSURLRequest *)request resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
|
||||
reject)
|
||||
{
|
||||
if (!request) {
|
||||
reject(@"E_INVALID_URI", @"Cannot prefetch an image for an empty URI", nil);
|
||||
@@ -107,10 +104,8 @@ RCT_EXPORT_METHOD(prefetchImage
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(queryCache
|
||||
: (NSArray *)requests resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
queryCache : (NSArray *)requests resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
resolve([[self.bridge moduleForName:@"ImageLoader"] getImageCacheStatus:requests]);
|
||||
}
|
||||
|
||||
@@ -87,10 +87,8 @@ RCT_EXPORT_MODULE()
|
||||
[self sendEventWithName:@"url" body:notification.userInfo];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(openURL
|
||||
: (NSURL *)URL resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
openURL : (NSURL *)URL resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
[RCTSharedApplication() openURL:URL
|
||||
options:@{}
|
||||
@@ -114,10 +112,8 @@ RCT_EXPORT_METHOD(openURL
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(canOpenURL
|
||||
: (NSURL *)URL resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (__unused RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
canOpenURL : (NSURL *)URL resolve : (RCTPromiseResolveBlock)resolve reject : (__unused RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
if (RCTRunningInAppExtension()) {
|
||||
// Technically Today widgets can open urls, but supporting that would require
|
||||
@@ -181,11 +177,9 @@ RCT_EXPORT_METHOD(openSettings : (RCTPromiseResolveBlock)resolve reject : (__unu
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(sendIntent
|
||||
: (NSString *)action extras
|
||||
: (NSArray *_Nullable)extras resolve
|
||||
: (RCTPromiseResolveBlock)resolve reject
|
||||
: (RCTPromiseRejectBlock)reject)
|
||||
RCT_EXPORT_METHOD(
|
||||
sendIntent : (NSString *)action extras : (NSArray *_Nullable)extras resolve : (RCTPromiseResolveBlock)
|
||||
resolve reject : (RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd));
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ export default function Ansi({
|
||||
<View style={styles.container}>
|
||||
{parsedLines.map((items, i) => (
|
||||
<View style={styles.line} key={i}>
|
||||
<Text>
|
||||
<Text style={styles.text}>
|
||||
{items.map((bundle, key) => {
|
||||
const textStyle =
|
||||
bundle.fg && COLORS[bundle.fg]
|
||||
@@ -122,4 +122,7 @@ const styles = StyleSheet.create({
|
||||
line: {
|
||||
flexDirection: 'row',
|
||||
},
|
||||
text: {
|
||||
flexGrow: 1,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -118,11 +118,9 @@ RCT_EXPORT_METHOD(disconnectAnimatedNodes : (double)parentTag childTag : (double
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(startAnimatingNode
|
||||
: (double)animationId nodeTag
|
||||
: (double)nodeTag config
|
||||
: (NSDictionary<NSString *, id> *)config endCallback
|
||||
: (RCTResponseSenderBlock)callBack)
|
||||
RCT_EXPORT_METHOD(
|
||||
startAnimatingNode : (double)animationId nodeTag : (double)nodeTag config : (NSDictionary<NSString *, id> *)
|
||||
config endCallback : (RCTResponseSenderBlock)callBack)
|
||||
{
|
||||
[self addOperationBlock:^(RCTNativeAnimatedNodesManager *nodesManager) {
|
||||
[nodesManager startAnimatingNode:[NSNumber numberWithDouble:animationId]
|
||||
@@ -228,10 +226,9 @@ RCT_EXPORT_METHOD(stopListeningToAnimatedNodeValue : (double)tag)
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(addAnimatedEventToView
|
||||
: (double)viewTag eventName
|
||||
: (nonnull NSString *)eventName eventMapping
|
||||
: (JS::NativeAnimatedModule::EventMapping &)eventMapping)
|
||||
RCT_EXPORT_METHOD(
|
||||
addAnimatedEventToView : (double)viewTag eventName : (nonnull NSString *)
|
||||
eventName eventMapping : (JS::NativeAnimatedModule::EventMapping &)eventMapping)
|
||||
{
|
||||
NSMutableDictionary *eventMappingDict = [NSMutableDictionary new];
|
||||
eventMappingDict[@"nativeEventPath"] = RCTConvertVecToArray(eventMapping.nativeEventPath());
|
||||
@@ -247,10 +244,9 @@ RCT_EXPORT_METHOD(addAnimatedEventToView
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(removeAnimatedEventFromView
|
||||
: (double)viewTag eventName
|
||||
: (nonnull NSString *)eventName animatedNodeTag
|
||||
: (double)animatedNodeTag)
|
||||
RCT_EXPORT_METHOD(
|
||||
removeAnimatedEventFromView : (double)viewTag eventName : (nonnull NSString *)eventName animatedNodeTag : (double)
|
||||
animatedNodeTag)
|
||||
{
|
||||
[self addOperationBlock:^(RCTNativeAnimatedNodesManager *nodesManager) {
|
||||
[nodesManager removeAnimatedEventFromView:[NSNumber numberWithDouble:viewTag]
|
||||
|
||||
@@ -108,11 +108,9 @@ RCT_EXPORT_METHOD(disconnectAnimatedNodes : (double)parentTag childTag : (double
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(startAnimatingNode
|
||||
: (double)animationId nodeTag
|
||||
: (double)nodeTag config
|
||||
: (NSDictionary<NSString *, id> *)config endCallback
|
||||
: (RCTResponseSenderBlock)callBack)
|
||||
RCT_EXPORT_METHOD(
|
||||
startAnimatingNode : (double)animationId nodeTag : (double)nodeTag config : (NSDictionary<NSString *, id> *)
|
||||
config endCallback : (RCTResponseSenderBlock)callBack)
|
||||
{
|
||||
[self queueFlushedOperationBlock:^(RCTNativeAnimatedNodesManager *nodesManager) {
|
||||
[nodesManager startAnimatingNode:[NSNumber numberWithDouble:animationId]
|
||||
@@ -204,10 +202,9 @@ RCT_EXPORT_METHOD(stopListeningToAnimatedNodeValue : (double)tag)
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(addAnimatedEventToView
|
||||
: (double)viewTag eventName
|
||||
: (nonnull NSString *)eventName eventMapping
|
||||
: (JS::NativeAnimatedModule::EventMapping &)eventMapping)
|
||||
RCT_EXPORT_METHOD(
|
||||
addAnimatedEventToView : (double)viewTag eventName : (nonnull NSString *)
|
||||
eventName eventMapping : (JS::NativeAnimatedModule::EventMapping &)eventMapping)
|
||||
{
|
||||
NSMutableDictionary *eventMappingDict = [NSMutableDictionary new];
|
||||
eventMappingDict[@"nativeEventPath"] = RCTConvertVecToArray(eventMapping.nativeEventPath());
|
||||
@@ -223,10 +220,9 @@ RCT_EXPORT_METHOD(addAnimatedEventToView
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(removeAnimatedEventFromView
|
||||
: (double)viewTag eventName
|
||||
: (nonnull NSString *)eventName animatedNodeTag
|
||||
: (double)animatedNodeTag)
|
||||
RCT_EXPORT_METHOD(
|
||||
removeAnimatedEventFromView : (double)viewTag eventName : (nonnull NSString *)eventName animatedNodeTag : (double)
|
||||
animatedNodeTag)
|
||||
{
|
||||
[self queueOperationBlock:^(RCTNativeAnimatedNodesManager *nodesManager) {
|
||||
[nodesManager removeAnimatedEventFromView:[NSNumber numberWithDouble:viewTag]
|
||||
|
||||
@@ -179,8 +179,17 @@ const validAttributesForNonEventProps = {
|
||||
backgroundColor: {process: require('../StyleSheet/processColor').default},
|
||||
transform: true,
|
||||
transformOrigin: true,
|
||||
experimental_backgroundImage: {
|
||||
process: require('../StyleSheet/processBackgroundImage').default,
|
||||
experimental_backgroundImage: ReactNativeFeatureFlags.enableNativeCSSParsing()
|
||||
? (true as const)
|
||||
: {process: require('../StyleSheet/processBackgroundImage').default},
|
||||
experimental_backgroundSize: {
|
||||
process: require('../StyleSheet/processBackgroundSize').default,
|
||||
},
|
||||
experimental_backgroundPosition: {
|
||||
process: require('../StyleSheet/processBackgroundPosition').default,
|
||||
},
|
||||
experimental_backgroundRepeat: {
|
||||
process: require('../StyleSheet/processBackgroundRepeat').default,
|
||||
},
|
||||
boxShadow: ReactNativeFeatureFlags.enableNativeCSSParsing()
|
||||
? (true as const)
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
import type {HostComponent} from '../../types/public/ReactNativeTypes';
|
||||
import * as React from 'react';
|
||||
|
||||
/**
|
||||
* Configures a function that is called to determine whether a given component
|
||||
* should be registered using reflection of the native component at runtime.
|
||||
*
|
||||
* The provider should return null if the native component is unavailable in
|
||||
* the current environment.
|
||||
*/
|
||||
export function setRuntimeConfigProvider(
|
||||
runtimeConfigProvider: (name: string) => {
|
||||
native: boolean;
|
||||
verify: boolean;
|
||||
} | null,
|
||||
): void;
|
||||
|
||||
/**
|
||||
* Gets a `NativeComponent` that can be rendered by React Native.
|
||||
*
|
||||
* The supplied `viewConfigProvider` may or may not be invoked and utilized,
|
||||
* depending on how `setRuntimeConfigProvider` is configured.
|
||||
*/
|
||||
export function get<Config extends object>(
|
||||
name: string,
|
||||
viewConfigProvider: () => PartialViewConfig,
|
||||
): HostComponent<Config>;
|
||||
|
||||
/**
|
||||
* Same as `NativeComponentRegistry.get(...)`, except this will check either
|
||||
* the `setRuntimeConfigProvider` configuration or use native reflection (slow)
|
||||
* to determine whether this native component is available.
|
||||
*
|
||||
* If the native component is not available, a stub component is returned. Note
|
||||
* that the return value of this is not `HostComponent` because the returned
|
||||
* component instance is not guaranteed to have native methods.
|
||||
*/
|
||||
export function getWithFallback_DEPRECATED<Config extends object>(
|
||||
name: string,
|
||||
viewConfigProvider: () => PartialViewConfig,
|
||||
): React.ComponentType<Config>;
|
||||
|
||||
/**
|
||||
* Unstable API. Do not use!
|
||||
*
|
||||
* This method returns if there is a StaticViewConfig registered for the
|
||||
* component name received as a parameter.
|
||||
*/
|
||||
export function unstable_hasStaticViewConfig(name: string): boolean;
|
||||
|
||||
type AttributeType<T, V> =
|
||||
| true
|
||||
| {
|
||||
readonly diff?: ((arg1: T, arg2: T) => boolean) | undefined;
|
||||
readonly process?: ((arg1: V) => T) | undefined;
|
||||
};
|
||||
type AnyAttributeType = AttributeType<any, any>;
|
||||
type AttributeConfiguration = {
|
||||
readonly [propName: string]: AnyAttributeType | void;
|
||||
readonly style?:
|
||||
| {
|
||||
readonly [propName: string]: AnyAttributeType;
|
||||
}
|
||||
| undefined;
|
||||
};
|
||||
|
||||
type PartialViewConfig = Readonly<{
|
||||
bubblingEventTypes?:
|
||||
| {
|
||||
readonly [eventName: string]: {
|
||||
readonly phasedRegistrationNames: {
|
||||
readonly bubbled: string;
|
||||
readonly captured: string;
|
||||
readonly skipBubbling?: boolean | undefined;
|
||||
};
|
||||
};
|
||||
}
|
||||
| undefined;
|
||||
directEventTypes?:
|
||||
| {
|
||||
readonly [eventName: string]: {
|
||||
readonly registrationName: string;
|
||||
};
|
||||
}
|
||||
| undefined;
|
||||
supportsRawText?: boolean | undefined;
|
||||
uiViewClassName: string;
|
||||
validAttributes?: AttributeConfiguration | undefined;
|
||||
}>;
|
||||
+3
-1
@@ -23,7 +23,9 @@ export function unstable_hasComponent(name: string): boolean {
|
||||
hasNativeComponent = global.__nativeComponentRegistry__hasComponent(name);
|
||||
componentNameToExists.set(name, hasNativeComponent);
|
||||
} else {
|
||||
throw `unstable_hasComponent('${name}'): Global function is not registered`;
|
||||
throw new Error(
|
||||
`unstable_hasComponent('${name}'): Global function is not registered`,
|
||||
);
|
||||
}
|
||||
}
|
||||
return hasNativeComponent;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user