diff --git a/.circleci/Dockerfiles/Dockerfile.android b/.circleci/Dockerfiles/Dockerfile.android index c6f706fc6758af..000822cd337393 100644 --- a/.circleci/Dockerfiles/Dockerfile.android +++ b/.circleci/Dockerfiles/Dockerfile.android @@ -14,7 +14,7 @@ # and build a Android application that can be used to run the # tests specified in the scripts/ directory. # -FROM reactnativecommunity/react-native-android:8.0 +FROM reactnativecommunity/react-native-android:9.0 LABEL Description="React Native Android Test Image" LABEL maintainer="Meta Open Source " diff --git a/.circleci/config.yml b/.circleci/config.yml index 13b480ad30ab85..ac8d9532a77541 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -113,7 +113,7 @@ executors: reactnativeandroid: <<: *defaults docker: - - image: reactnativecommunity/react-native-android:8.0 + - image: reactnativecommunity/react-native-android:9.0 resource_class: "xlarge" environment: - TERM: "dumb" @@ -814,7 +814,7 @@ jobs: ./gradlew assemble<< parameters.flavor >> -PREACT_NATIVE_MAVEN_LOCAL_REPO=/root/react-native/maven-local - store_artifacts: - path: /tmp/$PROJECT_NAME/android/app/build/outputs/apk/ + path: /tmp/AndroidTemplateProject/android/app/build/outputs/apk/ destination: template-apk # ------------------------- @@ -904,8 +904,9 @@ jobs: export USE_FRAMEWORKS=dynamic fi + cd .. bundle install - bundle exec pod install + bundle exec pod install --project-directory=ios - run: name: Build template project command: | @@ -1067,9 +1068,15 @@ jobs: name: Enable Yarn with corepack command: corepack enable + # it looks like that, last week, envinfo released version 7.9.0 which does not works + # with Windows. I have opened an issue here: https://github.com/tabrindle/envinfo/issues/238 + # TODO: T156811874 - Revert this to npx envinfo@latest when the issue is addressed - run: name: Display Environment info - command: npx envinfo@latest + command: | + npm install -g envinfo + envinfo -v + envinfo - restore_cache: keys: @@ -1139,7 +1146,7 @@ jobs: command: | apt update apt install -y wget git curl - curl -sL https://deb.nodesource.com/setup_16.x | bash - + curl -sL https://deb.nodesource.com/setup_18.x | bash - apt install -y nodejs npm install --global yarn - checkout diff --git a/.flowconfig b/.flowconfig index f9ab44caa8f632..58386d6a6f22ff 100644 --- a/.flowconfig +++ b/.flowconfig @@ -30,8 +30,8 @@ packages/react-native/interface.js packages/react-native/flow/ [options] +experimental.global_find_ref=true enums=true -conditional_type=true emoji=true @@ -76,4 +76,4 @@ untyped-import untyped-type-import [version] -^0.209.0 +^0.213.1 diff --git a/.flowconfig.android b/.flowconfig.android index 155704621ef37f..05ba551b980f23 100644 --- a/.flowconfig.android +++ b/.flowconfig.android @@ -30,8 +30,8 @@ packages/react-native/interface.js packages/react-native/flow/ [options] +experimental.global_find_ref=true enums=true -conditional_type=true emoji=true @@ -76,4 +76,4 @@ untyped-import untyped-type-import [version] -^0.209.0 +^0.213.1 diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 37f64f0dcbf9cf..d923854d7b2a73 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -38,9 +38,9 @@ body: - type: textarea id: extra attributes: - label: Snack, code example, screenshot, or link to a repository + label: Snack, screenshot, or link to a repository description: | - Please provide a Snack (https://snack.expo.dev/), a link to a repository on GitHub, or provide a minimal code example that reproduces the problem. + Please provide a Snack (https://snack.expo.dev/), a link to a repository on GitHub that reproduces the problem. You may provide a screenshot of the application if you think it is relevant to your bug report. Here are some tips for providing a minimal example: https://stackoverflow.com/help/mcve Please note that a reproducer is **mandatory**. Issues without reproducer are more likely to stall and will be closed. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 9b140cf8107ee4..7eef039fb2f910 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,9 @@ blank_issues_enabled: false contact_links: + - name: 📦 Metro Issue + url: https://github.com/facebook/metro/issues/new + about: | + If you've encountered a module resolution problem, e.g. "Error: Unable to resolve module ...", or something else that might be related to Metro, please open an issue in the Metro repo instead. - name: 📃 Documentation Issue url: https://github.com/facebook/react-native-website/issues about: Please report documentation issues in the React Native website repository. diff --git a/.github/workflow-scripts/actOnLabel.js b/.github/workflow-scripts/actOnLabel.js index 78571fd0ac0511..7556e122bee631 100644 --- a/.github/workflow-scripts/actOnLabel.js +++ b/.github/workflow-scripts/actOnLabel.js @@ -121,7 +121,7 @@ module.exports = async (github, context, labelWithContext) => { await addComment( `| :warning: | Missing Reproducible Example |\n` + `| --- | --- |\n` + - `| :information_source: | It looks like your issue is missing a reproducible example. Please provide either:
|`, + `| :information_source: | We could not detect a reproducible example in your issue report. Please provide either:
|`, ); await requestAuthorFeedback(); return; @@ -133,5 +133,16 @@ module.exports = async (github, context, labelWithContext) => { ); await requestAuthorFeedback(); return; + case 'Type: Too Old Version': + await addComment( + `| :warning: | Too Old Version of React Native |\n` + + `| --- | --- |\n` + + `| :information_source: | It looks like your issue or the example you provided uses a [**Too Old Version of React Native**](https://github.com/reactwg/react-native-releases/blob/main/README.md#releases-support-policy).\nDue to the number of issues we receive, we're currently only accepting new issues against one of the supported versions. Please [upgrade](https://reactnative.dev/docs/upgrading) to latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If you cannot upgrade, please open your issue on [StackOverflow](https://stackoverflow.com/questions/tagged/react-native) to get further community support. |`, + ); + await closeIssue(); + return; + default: + // No action needed + return; } }; diff --git a/.github/workflow-scripts/checkForReproducer.js b/.github/workflow-scripts/checkForReproducer.js new file mode 100644 index 00000000000000..1b8973b3c01407 --- /dev/null +++ b/.github/workflow-scripts/checkForReproducer.js @@ -0,0 +1,110 @@ +/** + * 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 + */ + +const NEEDS_REPRO_LABEL = 'Needs: Repro'; +const NEEDS_REPRO_HEADER = 'Missing Reproducible Example'; +const NEEDS_REPRO_MESSAGE = + `| :warning: | Missing Reproducible Example |\n` + + `| --- | --- |\n` + + `| :information_source: | We could not detect a reproducible example in your issue report. Please provide either:
|`; + +module.exports = async (github, context) => { + const issueData = { + issue_number: context.payload.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + }; + + const issue = await github.rest.issues.get(issueData); + const comments = await github.rest.issues.listComments(issueData); + + const author = issue.data.user.login; + + const maintainerChangedLabel = await hasMaintainerChangedLabel( + github, + issueData, + author, + ); + + if (maintainerChangedLabel) { + return; + } + + const botComment = comments.data.find(comment => + comment.body.includes(NEEDS_REPRO_HEADER), + ); + + const entities = [issue.data, ...comments.data]; + + // Look for Snack or a GH repo associated with the user that added an issue or comment + const hasValidReproducer = entities.some(entity => { + const hasExpoSnackLink = containsPattern( + entity.body, + `https?:\\/\\/snack\\.expo\\.dev\\/[^\\s)\\]]+`, + ); + + const hasGithubRepoLink = containsPattern( + entity.body, + `https?:\\/\\/github\\.com\\/(${entity.user.login})\\/[^/]+\\/?\\s?`, + ); + return hasExpoSnackLink || hasGithubRepoLink; + }); + + if (hasValidReproducer) { + try { + await github.rest.issues.removeLabel({ + ...issueData, + name: NEEDS_REPRO_LABEL, + }); + } catch (error) { + if (!/Label does not exist/.test(error.message)) { + throw error; + } + } + + if (!botComment) return; + + await github.rest.issues.deleteComment({ + ...issueData, + comment_id: botComment.id, + }); + } else { + await github.rest.issues.addLabels({ + ...issueData, + labels: [NEEDS_REPRO_LABEL], + }); + + if (botComment) return; + + await github.rest.issues.createComment({ + ...issueData, + body: NEEDS_REPRO_MESSAGE, + }); + } +}; + +function containsPattern(body, pattern) { + const regexp = new RegExp(pattern, 'gm'); + return body.search(regexp) !== -1; +} + +// Prevents the bot from responding when maintainer has changed Needs: Repro the label +async function hasMaintainerChangedLabel(github, issueData, author) { + const timeline = await github.rest.issues.listEventsForTimeline(issueData); + + const labeledEvents = timeline.data.filter( + event => event.event === 'labeled' || event.event === 'unlabeled', + ); + const userEvents = labeledEvents.filter(event => event.actor.type !== 'Bot'); + + return userEvents.some( + event => + event.actor.login !== author && event.label.name === NEEDS_REPRO_LABEL, + ); +} diff --git a/.github/workflow-scripts/verifyVersion.js b/.github/workflow-scripts/verifyVersion.js index 744f148c90ec33..c28c6b0dd11fdb 100644 --- a/.github/workflow-scripts/verifyVersion.js +++ b/.github/workflow-scripts/verifyVersion.js @@ -42,6 +42,11 @@ module.exports = async (github, context) => { ).data; const latestVersion = parseVersionFromString(latestRelease.name); + // We want to "insta-close" an issue if RN version provided is too old. And encourage users to upgrade. + if (isVersionTooOld(issueVersion, latestVersion)) { + return {label: 'Type: Too Old Version'}; + } + if (!isVersionSupported(issueVersion, latestVersion)) { return {label: 'Type: Unsupported Version'}; } @@ -59,7 +64,11 @@ module.exports = async (github, context) => { } }; -// We support N-2 minor versions, and the latest major. +/** + * Check if the RN version provided in an issue is supported. + * + * "We support `N-2` minor versions, and the `latest` major". + */ function isVersionSupported(actualVersion, latestVersion) { return ( actualVersion.major >= latestVersion.major && @@ -67,6 +76,22 @@ function isVersionSupported(actualVersion, latestVersion) { ); } +/** + * Check if the RN version provided in an issue is too old. + * "We support `N-2` minor versions, and the `latest` major". + * + * A RN version is *too old* if it's: + * - `1` or more *major* behind the *latest major*. + * - `5` or more *minor* behind the *latest minor* in the *same major*. Less aggressive. + * (e.g. If `0.72.0` is the current latest then `0.67.0` and lower is too old for `0.72.0`) + */ +function isVersionTooOld(actualVersion, latestVersion) { + return ( + latestVersion.major - actualVersion.major >= 1 || + latestVersion.minor - actualVersion.minor >= 5 + ); +} + // Assumes that releases are sorted in the order of recency (i.e. most recent releases are earlier in the list) // This enables us to stop looking as soon as we find the first release with a matching major/minor version, since // we know it's the most recent release, therefore the highest patch available. diff --git a/.github/workflows/check-for-reproducer.yml b/.github/workflows/check-for-reproducer.yml new file mode 100644 index 00000000000000..8ef450fc1aea74 --- /dev/null +++ b/.github/workflows/check-for-reproducer.yml @@ -0,0 +1,21 @@ +name: Check for reproducer +# This workflow is triggered when issue is created or edited. +# Also, when a comment is added, edited or deleted. +on: + issues: + types: [opened, edited] + issue_comment: + types: [created, edited, deleted] + +jobs: + check-for-reproducer: + runs-on: ubuntu-latest + if: github.repository == 'facebook/react-native' && github.event.issue.pull_request == null && github.event.issue.state == 'open' + steps: + - uses: actions/checkout@v3 + - uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const checkForReproducer = require('./.github/workflow-scripts/checkForReproducer.js') + await checkForReproducer(github, context) diff --git a/.gitignore b/.gitignore index 5f30b988d17c85..c4668468efcbc0 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ project.xcworkspace /packages/react-native/ReactAndroid/gradlew.bat /packages/react-native/ReactAndroid/external-artifacts/build/ /packages/react-native/ReactAndroid/external-artifacts/artifacts/ +/packages/react-native/ReactAndroid/flipper-integration/build/ /packages/react-native/ReactAndroid/hermes-engine/build/ /packages/react-native/ReactAndroid/hermes-engine/.cxx/ /packages/react-native/template/android/app/build/ @@ -51,6 +52,7 @@ buck-out /.lsp-buck-out /packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/ /packages/react-native/ReactAndroid/src/main/gen +/.cpplsp.buckd # Android Studio .project diff --git a/CHANGELOG-pre-060.md b/CHANGELOG-pre-060.md new file mode 100644 index 00000000000000..1a652307415582 --- /dev/null +++ b/CHANGELOG-pre-060.md @@ -0,0 +1,2316 @@ +# Changelog (pre 0.60) + +This file contains all changelogs for releases in the pre-0.60 range. Please check out the other `CHANGELOG-*.md` files for newer versions. + +## v0.59.10 + +This is likely the last patch release for version 59 of React Native for the foreseeable future: it contains an important Android side update for the JavaScript Core, to prevent a great number of crashes mostly related to Samsung devices - thanks to [@Kudo](https://github.com/Kudo) for his work on fixing this via [557989a86f](https://github.com/facebook/react-native/commit/557989a86f8730113393ed229927d607a478e524)! + +Thanks everyone who participated in the [discussion](https://github.com/react-native-community/releases/issues/127). + +## v0.59.9 + +This is a patch fix release addressing a couple ScrollView regressions, and "future-proof" RN 59 from crashes caused by upgrading Gradle (now can support up to 5.4.1 & 3.4.0 for the plugin) and Xcode 11 Beta 1. You can upgrade to this version without upgrading your tooling. + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/124) for cherry-picking commits. You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/127). + +### Changed + +- If `isInteraction` is not specified in the config, it would always default to `true` which would block interactions like VirtualizedList updates. This is generally not what you want with useNativeDriver since the animation won't be interrupted by JS. If something does end up interfering with an animation and causes frame drops, `isInteraction` can be set manually. ([8f186b84ae](https://github.com/facebook/react-native/commit/8f186b84aeeb2613bf6ae08f20a8547d40179007) by [@sahrens](https://github.com/sahrens)) + +- Update detox to match master ([c6a5c09e2b](https://github.com/facebook/react-native/commit/c6a5c09e2b330891242af5c0b3ed7875f32c189e) by [@kelset](https://github.com/kelset)) + +#### Android specific + +- Bump Gradle to 5.4.1 & Android Gradle plugin to 3.4.0 ([b4017a9923](https://github.com/facebook/react-native/commit/b4017a9923b09fed4b693a8e4cfadd30ce34c88d), [d9f5a9dc16](https://github.com/facebook/react-native/commit/d9f5a9dc16f68cecc995bf8ba64fb726e397fadf), [30348f7899](https://github.com/facebook/react-native/commit/30348f789946dc99f5ccd02c85c8decbdb9ac29b), [6976a93126](https://github.com/facebook/react-native/commit/6976a931266126f249458a099bfaf509f9d81a05) by [@dulmandakh](https://github.com/dulmandakh)) + +### Fixed + +- Fixes wrong time unit of scroll event throttle ([1148c03f6f](https://github.com/facebook/react-native/commit/1148c03f6f51329710e23fba99a6916fff3ba42c) by [@zhongwuzw](https://github.com/zhongwuzw)) + +#### Android specific + +- Fix indexed RAM bundle ([d8fa1206c3](https://github.com/facebook/react-native/commit/d8fa1206c3fecd494b0f6abb63c66488e6ced5e0) by [@dratwas](https://github.com/dratwas)) + +#### iOS specific + +- Fix Xcode 11 Beta 1 builds ([46c7ada535](https://github.com/facebook/react-native/commit/46c7ada535f8d87f325ccbd96c24993dd522165d) by [@ericlewis](https://github.com/ericlewis)) + +## v0.59.8 + +This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points (in particular, check the `KeyboardAvoidingView` change). Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/118) for cherry-picking commits. + +### Fixed + +- Fix regexp on `hasteImpl` ([bcd1e2](https://github.com/facebook/react-native/commit/28e0de070d2dae9a486ab5915b6fd76723bd84ef) by [@CaptainNic](https://github.com/CaptainNic)) +- Fix sparse array handling in `EventEmitter#listeners()` ([f68dc8](https://github.com/facebook/react-native/commit/f68dc8) by [@ide](https://github.com/ide)) +- Fix **VirtualizedList** to call `_updateViewableItems` immediately ([08141e](https://github.com/facebook/react-native/commit/efe6a0f0b56191907e8f13be2aee28fe1dcdf555) by [@sahrens](https://github.com/sahrens)) +- Fix prop overrides of **TouchableWithoutFeedback** ([0c4206](https://github.com/facebook/react-native/commit/68825f9ca5a6c8c70390e8499d9663c5be475639) by [@aleclarson](https://github.com/aleclarson)) +- Fix resolve relative size rendering error in inspector ([4884ab](https://github.com/facebook/react-native/commit/972ee2edbd4e1c4201da1606bf5a4c5add9f0083) by [@gandreadis](https://github.com/gandreadis)) +- Fix **VirtualizedSectionList** by making sure to check array bounds ([54f91d](https://github.com/facebook/react-native/commit/929908f28728c217ab4a16c8596e0957295f4d67) by [@vonovak](https://github.com/vonovak)) +- Update `_scrollAnimatedValue` offset of **ScrollView** ([e0d1b3](https://github.com/facebook/react-native/commit/58c956768af75047b2acdca429a28945a6a8b8c0) by [@miyabi](https://github.com/miyabi)) +- Fix infinite `setState` in **VirtualizedList** ([c40a93](https://github.com/facebook/react-native/commit/88787b5e7a7f6dd9c3b258b9dfb60b93ca5a5cea) by [@sahrens](https://github.com/sahrens)) + +#### iOS specific + +- Fix incorrect opacity behavior for **Text** component ([f71357](https://github.com/facebook/react-native/commit/d99e657e3909ff14cd623d1df7d3d13056fdd851) by [@shergin](https://github.com/shergin)) +- Fix **Text** shadow displays when `text Offset` is `{0,0}` ([17a81b](https://github.com/facebook/react-native/commit/9b63b50ad562c8567336898c7511a9a5198a4d6b) by [@Woodpav](https://github.com/Woodpav)) +- Add convert compatible of **NSString** for bridge message data ([c37e9c](https://github.com/facebook/react-native/commit/ffa3b0d4d601fe6788319a7cfd4185b8e4bf462f) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix nullability warnings in **RCTExceptionsManager** ([2b7d79](https://github.com/facebook/react-native/commit/31850df116fdd1595dddcd7b37a21568e679ffa7) by [@jtreanor](https://github.com/jtreanor)) +- Fix app to reconnect with metro after the bundler is closed and reopened ([c28676](https://github.com/facebook/react-native/commit/62bac80f90cf5a4ab216488b4ede441f0e3f86ba) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Fix throttle below 16ms on **ScrollView** ([39776a](https://github.com/facebook/react-native/commit/c87de765f6a9ebf656c188fa2115a1ba01b7939c) by [@sahrens](https://github.com/sahrens)) + +#### Android specific + +- Fix JS errors during bundle load were reported as `UnknownCppException` ([84e263](https://github.com/facebook/react-native/commit/6f6696fa63dc5f7029cb121c7e0ee98f8d271602)) +- Add logic to catch `MissingWebViewPackageException` ([379874](https://github.com/facebook/react-native/commit/954f715b25d3c47c35b5a23ae23770a93bc58cee) by [@thorbenprimke](https://github.com/thorbenprimke)) +- Revert "[improve RTL](https://github.com/facebook/react-native/commit/b3c74967ca6b20d7bda84c690ae3a99dfe255843)" ([f3801d](https://github.com/facebook/react-native/commit/8d3e16831a93079fc5a855a7b0f8b4be508c6942) by [@thorbenprimke](https://github.com/thorbenprimke)) + +### Added + +- Add listener for non-value animated node ([4a82dc](https://github.com/facebook/react-native/commit/68a5ceef312c7e3ac74d616b960c1cfde46a109d) by [@osdnk](https://github.com/osdnk)) +- Set **ScrollView** throttle by default ([74d740](https://github.com/facebook/react-native/commit/b8c8562ffb424831cc34a18aeb25e5fec0954dd0) by [@sahrens](https://github.com/sahrens)) + +### Changed + +- Make **KeyboardAvoidingView** with `behavior="height"` resize on keyboard close ([7140a7](https://github.com/facebook/react-native/commit/3711ea69375ea420800bac97914aa0d24fc9b1a6) by [@WaldoJeffers](https://github.com/WaldoJeffers)) +- Update network inspector to have smarter scroll stickiness ([57dc37](https://github.com/facebook/react-native/commit/c06473ab464e07edbb4715f58cd13674273bb29b) by [@AlanFoster](https://github.com/AlanFoster)) + +## v0.59.7 + +This patch release was unpublished. + +## v0.59.6 + +This patch release was unpublished. + +## v0.59.5 + +This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/113) for cherry-picking commits. + +### Fixed + +- Remove wrapper around **ListEmptyComponent** ([54af5b](https://github.com/facebook/react-native/commit/46276444508581bac7b9f27edd56ec0c8ec450bc) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) + +#### Android specific + +- Enforced thread safety on UIImplementation methods that mutate the shadowNodeRegistry ([f5a318](https://github.com/facebook/react-native/commit/f5a31801a03b61df3d7bc2fc86df7bad272082e2) by [@SudoPlz](https://github.com/sunnylqm)) +- Fixed a `NoSuchKeyException` when parsing JS stack frames without line numbers ([d7bd6c](https://github.com/facebook/react-native/commit/c953e0b4319da0976ece877c09b648a55bc57d9f) by [@Salakar](https://github.com/Salakar)) +- Fixed `mostRecentEventCount` is not updated ([b8aac0](https://github.com/facebook/react-native/commit/60c0a60c508346f7639d32fde0376fabded9f3f0) by [@jainkuniya](https://github.com/jainkuniya)) + +#### iOS specific + +- Pass back correct dimensions for application window in Dimensions module ([72b4cc](https://github.com/facebook/react-native/commit/33b55ccccad56e0b97af294749d728b67b03e658) by [@rdonnelly](https://github.com/rdonnelly)) +- Fixed warning: "RCTImagePickerManager requires main queue setup" ([effb02](https://github.com/facebook/react-native/commit/6508b88cfdccdb2da6bfde05faac4647436ce4e7) by [@scarlac](https://github.com/scarlac)) + +## v0.59.4 + +This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/100) for cherry-picking commits. + +### Changed + +- Make Jest transform @react-native-community packages by default ([7e23c7c565](https://github.com/facebook/react-native/commit/7e23c7c5654818fa076eeb627b709d39130f57f6) by [@thymikee](https://github.com/thymikee)) + +#### iOS specific + +- Add `scrollToOverflowEnabled` prop to **ScrollView** ([6f4239b37c](https://github.com/facebook/react-native/commit/6f4239b37c3059d6cb1fdaf2dcd3b6c962dde471) by [@mysport12](https://github.com/mysport12)) + +### Fixed + +- Fix **Touchable** long-press ([59e50237bf](https://github.com/facebook/react-native/commit/59e50237bff9521d2b78d7576abf4e23d844ac1b) by [@Kida007](https://github.com/Kida007)) + +#### Android specific + +- Fix a crash when setting `underlineColorAndroid` in **TextInput** ([556aa93ed7](https://github.com/facebook/react-native/commit/556aa93ed72d9dc0f18a1c6d7dec3d9c182fee85) by [@sunnylqm](https://github.com/sunnylqm)) + +#### iOS specific + +- Fix universal links not working in iOS 12 / Xcode 10 ([56679ed359](https://github.com/facebook/react-native/commit/56679ed359834c2177c8837d744cc7bf2ceb6b0a) by [@IljaDaderko](https://github.com/IljaDaderko)) +- Fix triangle views ([7a6fe0cda0](https://github.com/facebook/react-native/commit/7a6fe0cda0a1089c1c82fdd5f7f2db940f70feae) by [@zhongwuzw](https://github.com/zhongwuzw)) + +## v0.59.3 + +This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/100) for cherry-picking commits. + +### Changed + +#### Android specific + +- Improve RTL support ([b3c74967ca](https://github.com/facebook/react-native/commit/b3c74967ca6b20d7bda84c690ae3a99dfe255843) by [@dulmandakh](https://github.com/dulmandakh)) + +### Fixed + +- Fix **VirtualizedList**, **SectionList** and **FlatList** behavior on rendering list headers with inverted prop and zero items ([c13f5d48cf](https://github.com/facebook/react-native/commit/c13f5d48cfe3e7c0f6c6d0b745b50a089d6993ef) by [@michalchudziak](https://github.com/michalchudziak)) +- Fix **VirtualizedList** debug mode crash ([02e8e531dd](https://github.com/facebook/react-native/commit/02e8e531ddfd86e9abf7ef47fbf30445afeb37cf)) +- Fix running Metro on Windows ([43d3313788](https://github.com/facebook/react-native/commit/43d3313788a5f0a36abdbfadc000b06b2188fc06) and [9db347fabc](https://github.com/facebook/react-native/commit/9db347fabca19c66f669faf4054c81cc3624be03) by [@aliazizi](https://github.com/aliazizi) and [@nazreinkaram](https://github.com/nazreinkaram)) + +#### Android specific + +- Fix IllegalStateException when invalid URL or headers are passed ([aad4dbbbfe](https://github.com/facebook/react-native/commit/aad4dbbbfe937d1924e5359556979ab067198a58) by [@dryganets](https://github.com/dryganets)) +- Fix IllegalStateException when tapping next on Android Keyboard ([b943db418f](https://github.com/facebook/react-native/commit/b943db418f4f0b9d0865642aaca3e1a2f1529663) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- Show Perf Monitor after reloading JS ([15619c22e5](https://github.com/facebook/react-native/commit/15619c22e57f73dfbed7bbe5fd6d9b3d2a8c9225) by [@usrbowe](https://github.com/usrbowe)) +- Fix **TextInput**'s `maxLength` when inserting characters at begin ([17415938c7](https://github.com/facebook/react-native/commit/17415938c7180a95811db949122b8ad24a442866) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix runtime crash in Xcode 10.2 when using `RCT_EXTERN_MODULE` for swift classes ([ff66600224](https://github.com/facebook/react-native/commit/ff66600224e78fec5d0e902f8a035b78ed31a961)) + +## v0.59.2 + +This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/100) for cherry-picking commits. + +### Fixed + +#### Android specific + +- Crash on pre-26 Android devices when setting **TextInput** content type ([d4aa1e7a52](https://github.com/facebook/react-native/commit/d4aa1e7a52b51fa5d7fc9ded132b7b50170f2190) by [@hramos](https://github.com/hramos)) +- Crash when scroll to index 0 in a **SectionList** ([8fa116cc0e](https://github.com/facebook/react-native/commit/8fa116cc0e1cadbb6cf0734cfde0e0b8060f6b59) by [@danilobuerger](https://github.com/danilobuerger)) +- **Switch**'s `trackColor` being reset when toggled ([7652e31d8c](https://github.com/facebook/react-native/commit/7652e31d8c233c1c831f6597c8a2f7ce3d9c0b6e) and [d6ee448e15](https://github.com/facebook/react-native/commit/d6ee448e15a25a7485482a4702aadb2e396445c7) by [@dulmandakh](https://github.com/dulmandakh) and [@ejanzer](https://github.com/ejanzer)) + +#### iOS specific + +- **ScrollView** offset out of content size ([9c1c5a7455](https://github.com/facebook/react-native/commit/9c1c5a7455d90ec837a9a6141c096de70b798e43) by [@zhongwuzw](https://github.com/zhongwuzw)) +- **RefreshControl** state's race condition ([95d399bc82](https://github.com/facebook/react-native/commit/95d399bc825c5471e08b83eff4b1b1b510e384a0) by [@rostislav-simonik](https://github.com/rostislav-simonik)) +- Start Metro packager from project root ([fe3aebf87b](https://github.com/facebook/react-native/commit/fe3aebf87b4123f8b16cdfcb9e2e774e6e0bf0b6) by [@MatthieuLemoine](https://github.com/MatthieuLemoine)) +- **TextInput**s that are single-line reverting to default text ([e38be82dfa](https://github.com/facebook/react-native/commit/e38be82dfa8b49385b990629318f027de26500cf) by [@PeteTheHeat](https://github.com/PeteTheHeat)) + +### Changed + +#### Android specific + +- Add TLS 1.3 support to all Android versions using Conscrypt; to use this, you must add `implementation('org.conscrypt:conscrypt-android:2.0.0')` to `build.gradle` ([75af15ede4](https://github.com/facebook/react-native/commit/75af15ede44135110e40de75a649d5b15430c590) by [@dulmandakh](https://github.com/dulmandakh)) +- Turn off Metro JS Deltas by default for Android ([845189c17d](https://github.com/facebook/react-native/commit/845189c17de621cc5aa373503220c1c12f649c3c) by [@PeteTheHeat](https://github.com/PeteTheHeat)) + +## v0.59.1 + +This is a small patch release that addresses two critical issues from the 0.59.0 release. + +### Fixed + +#### Android specific + +- Template build gradle error on x86_64 ([4b996da470](https://github.com/facebook/react-native/commit/4b996da470b43f97fd0426b54bda739d7717fb28) by [@grabbou](https://github.com/grabbou)) + +#### iOS specific + +- Build error warning of **Text** module ([d834197746](https://github.com/facebook/react-native/commit/d834197746371b203bd7d7aaabdc2bc581acc867) by [@zhongwuzw](https://github.com/zhongwuzw)) + +## v0.59.0 + +Welcome to release 0.59 of React Native! For highlights of this release, please view the dedicated [blog post](https://reactnative.dev/blog/2019/03/12/releasing-react-native-059). Thanks to those who gave feedback during the [release candidate phase](https://github.com/react-native-community/react-native-releases/issues/79). If you're interested in helping evaluate our next release (0.60), subscribe to the dedicated issue [here](https://github.com/react-native-community/react-native-releases/issues/99). + +### Added + +- Add a Metro configuration to the template with inline require/import options; read more about it [in the blog post](https://reactnative.dev/blog/2019/03/12/releasing-react-native-059) ([ae11993d0f](https://github.com/facebook/react-native/commit/ae11993d0f6c6de661867b5d032d844e91c83c6f) by [@cpojer](https://github.com/cpojer)) + +#### Android specific + +- **Text** and **TextInput** now has prop [maxFontSizeMultiplier](https://reactnative.dev/docs/text#maxfontsizemultiplier) ([4936d284df](https://github.com/facebook/react-native/commit/4936d284df36071047ce776d9e2486c0371f7b97) by [@rigdern](https://github.com/rigdern)) +- **TextInput** now has prop [autoComplete](https://reactnative.dev/docs/textinput#autocomplete) prop ([f15145639d](https://github.com/facebook/react-native/commit/f15145639dab1e8d7a1c79a127b7d45c91d025a8)) +- **CameraRoll**'s `getPhotos` now supports `assetType: "All"` to let users pick from video and photos simultaneously ([54534e79d7](https://github.com/facebook/react-native/commit/54534e79d724ff57572efc43f65100067f35d4c1) by [@kesha-antonov](https://github.com/kesha-antonov)) +- **Text** and **TextInput** now support `textAlign:justify` for android O+ (api level >=26) ([d2153fc58d](https://github.com/facebook/react-native/commit/d2153fc58d825006076a3fce12e0f7eb84479132) by [sunnylqm](https://github.com/sunnylqm)) + +#### iOS specific + +- **TextInput** now has prop `rejectResponderTermination` to enable TextInputs inside Swipeables to function properly ([11df0eae5f](https://github.com/facebook/react-native/commit/11df0eae5ff8f530bfaf56aaf2209ff48f3ed9ac) by [@cmcewen](https://github.com/cmcewen)) +- **ActionSheetIOS** has a new prop `destructiveButtonIndexes` for an `Array` of destructive indexes ([67e7f16944](https://github.com/facebook/react-native/commit/67e7f16944530aa0d1a4d375b0de5efd5c432865) by [@sdg9](https://github.com/sdg9)) +- Add `isEventFromThisApp` to `KeyboardEvent` notifications to disambiguate keyboard events when apps are running side-by-side ([05f35c296d](https://github.com/facebook/react-native/commit/05f35c296d91d946acf4edd94106fbdd0dd69a29) by [@nossbigg](https://github.com/nossbigg)) +- Allow changing the project path in `react-native-xcode.sh` using env var `PROJECT_ROOT` ([9ccde378b6](https://github.com/facebook/react-native/commit/9ccde378b6e6379df61f9d968be6346ca6be7ead) by [@janicduplessis](https://github.com/janicduplessis)) + +### Changed + +- `React` is now at `v16.8.3` ([ccefc700d0](https://github.com/facebook/react-native/commit/ccefc700d0120539eba73747d1d6b65effb0645d) and ([2af13b4477](https://github.com/facebook/react-native/commit/2af13b4477342d3498ab302ceb5297fcbc17e097) by [@cpojer](https://github.com/cpojer) and [@hramos](https://github.com/hramos)) +- `Flow` dependency is now at `v0.92.0` ([5ee738659b](https://github.com/facebook/react-native/commit/5ee738659b4ac7b0e73b9dba09a63091d4571ed9) by [@pakoito](https://github.com/pakoito)) +- `@react-native-community/cli` dependency is at `v1.2.1` ([a252aee2ea](https://github.com/facebook/react-native/commit/a252aee2eabd9eeffb279b9fcf1827093ef4039c) and [5e1504b0fc](https://github.com/facebook/react-native/commit/5e1504b0fca99cad3bfe2339ac0e7862b2315f9c) by [@grabbou](https://github.com/grabbou)) +- Enhance Flow types definitions for **ViewPropTypes** ([7ff9456f2e](https://github.com/facebook/react-native/commit/7ff9456f2e5fd72286f5be52598988707eaef69c) by [@danibonilha](https://github.com/danibonilha)) + +#### Android specific + +- Clarify error message to direct people to `react-native start` rather than `react-native bundle` ([46aaa02274](https://github.com/facebook/react-native/commit/46aaa02274a51ebe2aaa9fca2422dcebf9323475) by [@sunnylqm](https://github.com/sunnylqm)) +- **BREAKING** - removed `OkHttpClientProvider.replaceOkHttpClient` method; please use `OkHttpClientProvider.setOkHttpClientFactory` from 0.54+ ([7cbdd7b6ac](https://github.com/facebook/react-native/commit/7cbdd7b6ac7db2192f7d0193d22326041517a63e) by [@cdlewis](https://github.com/cdlewis)) +- **BREAKING** - remove `ViewHelper`, use `ViewCompat` instead; this may also require changing the `android:theme` to be from `Theme.AppCompat`; read more about it [in the blog post](https://reactnative.dev/blog/2019/03/12/releasing-react-native-059) ([c493cfe708](https://github.com/facebook/react-native/commit/c493cfe7083a6b97b6ec9eb9cb59cf1fdec45458) by [@dulmandakh](https://github.com/dulmandakh)) +- Add nullable annotations to `ReadableMap`, `WritableMap`, `ReadableArray`, `Writable`, `ReactPackage`, and native module interfaces; this may impact Kotlin usage ([b640b6faf7](https://github.com/facebook/react-native/commit/b640b6faf77f7af955e64bd03ae630ce2fb09627), [c93cbdf1b2](https://github.com/facebook/react-native/commit/c93cbdf1b272cfd60124d9ddb4c52b58ca59d319), [7b33d6b0b9](https://github.com/facebook/react-native/commit/7b33d6b0b96578a548e9a7f973eb59ac9236697b), and [84f40da990](https://github.com/facebook/react-native/commit/84f40da990dfd21eb1c21e20f2be0f8b2c5a78e4) by [@dulmandakh](https://github.com/dulmandakh)) +- `Soloader` is now at `v0.6.0` ([07d1075f37](https://github.com/facebook/react-native/commit/07d1075f372bb864ddc62b9c8f613b03becfa568) by [@dulmandakh](https://github.com/dulmandakh)) +- Android Support Library is now at `v28.0.0` ([5bbed43854](https://github.com/facebook/react-native/commit/5bbed43854957a37c4b51f49f30669665a72e7f7) by [@dulmandakh](https://github.com/dulmandakh)) +- `targetSdkVersion` is now at `v28` ([57f444bd8a](https://github.com/facebook/react-native/commit/57f444bd8a175038c367fa1b7d93e2e8ba9de7ed) by [@dulmandakh](https://github.com/dulmandakh)) +- Android Plugin is now at `v3.3.1` ([da5b5d2fa1](https://github.com/facebook/react-native/commit/da5b5d2fa134aa09dda4a620be9fa4d3d419201f) by [@dulmandakh](https://github.com/dulmandakh)) +- Enable Java 8 support ([38eb2a70af](https://github.com/facebook/react-native/commit/38eb2a70afa87c49c1e62754f5ae3cd26e7f59c3) by [@dulmandakh](https://github.com/dulmandakh)) +- Suppress misleading missing permission warnings ([d53dbb0dfb](https://github.com/facebook/react-native/commit/d53dbb0dfb99bdee5cd7eeaaa6f4ae51dcca00c5) by [@dulmandakh](https://github.com/dulmandakh)) +- Add back `buildToolsVersion` to build.gradle ([cf52ab561d](https://github.com/facebook/react-native/commit/cf52ab561d9fa0e4d14de7a8f3324cbc2b25bf92) by [@dulmandakh](https://github.com/dulmandakh)) +- **TimePickerAndroid** has better Flow types definitions ([2ed1bb2e01](https://github.com/facebook/react-native/commit/2ed1bb2e01ab7360d9bf13e4f9e13cb9c9c9d32e) by [@yushimatenjin](https://github.com/yushimatenjin)) +- `ReactActivity`, `ReactSlider`, `ReactTextView`, and `ReactPicker` extends `AppCompatActivity`; updates to `TimePickerDialogModule` and `DatePickerDialogModule` as well ([dda2b82a0a](https://github.com/facebook/react-native/commit/dda2b82a0a49da52b43b50db5a2bda50a216c09b), [3b9604feda](https://github.com/facebook/react-native/commit/3b9604feda8f9e8fe3dd884912ec7d9be67d7f1d), [ba0c3ffd5b](https://github.com/facebook/react-native/commit/ba0c3ffd5b46963a8bb27b40eb396965535cd927), [833429dd63](https://github.com/facebook/react-native/commit/833429dd633b33fff71224a7ce663b60681a7f81), [adc1410572](https://github.com/facebook/react-native/commit/adc14105727f708c990b7a744a0ea270ff0fba13), [c6c5a173bc](https://github.com/facebook/react-native/commit/c6c5a173bce3d8c847931d26eddb295956285438), and [be361d0fc1](https://github.com/facebook/react-native/commit/be361d0fc1930b1679c4226e15c1a5b416b94105) by [@dulmandakh](https://github.com/dulmandakh)) +- Fix lint error/warnings that cause older Android crashes ([d2fc19f4aa](https://github.com/facebook/react-native/commit/d2fc19f4aa94888b7c3d3f4a5fb621bf96a1aff9) by [@dulmandakh](https://github.com/dulmandakh)) +- The error message on getting Android drawable folder suffix now gives more information ([a159a33c02](https://github.com/facebook/react-native/commit/a159a33c02e0c0d7aa245adfd540a066ec065362) by [@BrunoVillanova](https://github.com/BrunoVillanova)) +- `SYSTEM_ALERT_WINDOW` permissions available only in debug builds ([84a2fb0a4a](https://github.com/facebook/react-native/commit/84a2fb0a4a67cd9dc37cf4e5bab814f25181cfb7) by [@dulmandakh](https://github.com/dulmandakh)) +- Add talkback navigation support for links and header ([b9d3743cda](https://github.com/facebook/react-native/commit/b9d3743cda95d1f475dbec8f6d72935941519deb) by [@yangweigbh](https://github.com/yangweigbh)) +- **FlatList** has `removeClippedSubviews` default to `true` on Android ([1a499f43b2](https://github.com/facebook/react-native/commit/1a499f43b2d03cc27dd6c25c8f13a767862afba1) by [@fred2028](https://github.com/fred2028)) + +#### iOS specific + +- Moved iOS build cache directory from `~/.rncache` to `~/Library/Caches/com.facebook.ReactNativeBuild` ([1024dc251e](https://github.com/facebook/react-native/commit/1024dc251e1f4777052b7c41807ea314672bb13a) by [@sryze](https://github.com/sryze)) +- Keyboard API Event flow types have been improved ([7ee13cc84c](https://github.com/facebook/react-native/commit/7ee13cc84c342244d3aa9e485de0e759482287ea) by [@nossbigg](https://github.com/nossbigg)) +- Expose **AsyncLocalStorage** get/set methods to native code ([7b8235a95a](https://github.com/facebook/react-native/commit/7b8235a95ad9519e9735cc1555a8d3aa5bb7c0ee) by [@ejmartin504](https://github.com/ejmartin504)) +- Clear RCTBridge **launchOptions** when bridge is reloaded ([19d04a312b](https://github.com/facebook/react-native/commit/19d04a312bf4221cd26beff6d0da6dd296a28cd0) by [@venik](https://github.com/venik)) + +### Deprecated + +The following deprecations are part of our Lean Core initiative; read more about it [in the blog post](https://reactnative.dev/blog/2019/03/12/releasing-react-native-059). + +- Deprecated [MaskedViewIOS](https://reactnative.dev/docs/maskedviewios) as it has now been moved to [react-native-community/masked-view](https://github.com/react-native-community/react-native-masked-view) ([4ac65f5413](https://github.com/facebook/react-native/commit/4ac65f5413ee59f7546b88a2eae2c4ce6fa8826b) by [@FonDorn](https://github.com/FonDorn)) +- Deprecated [ViewPagerAndroid](https://reactnative.dev/docs/viewpagerandroid) as it has now been moved to [react-native-community/viewpager](https://github.com/react-native-community/react-native-viewpager) ([77300ca91c](https://github.com/facebook/react-native/commit/77300ca91c17d371f6ba04230b8c2e8f5cd99ab8) by [@ferrannp](https://github.com/ferrannp)) +- Deprecated [AsyncStorage](https://reactnative.dev/docs/asyncstorage) as it has now been moved to [react-native-community/asyncstorage](https://github.com/react-native-community/react-native-async-storage) ([ffe37487b2](https://github.com/facebook/react-native/commit/ffe37487b228b77a3697c32767e91f1dd68041d8) by [@Krizzu](https://github.com/Krizzu)) +- Deprecated [Slider](https://reactnative.dev/docs/slider) as it has now been moved to [react-native-community/slider](https://github.com/react-native-community/react-native-slider) ([bf888a7582](https://github.com/facebook/react-native/commit/bf888a7582763a593d8b36874d242653fc0a9575) by [@michalchudziak](https://github.com/michalchudziak)) +- Deprecated [NetInfo](https://reactnative.dev/docs/netinfo) as it has now been moved to [react-native-community/netinfo](https://github.com/react-native-community/react-native-netinfo) ([d9c0dfe353](https://github.com/facebook/react-native/commit/d9c0dfe353eceb91efcec774bab0f65b6792e4fa) by [@matt-oakes](https://github.com/matt-oakes)) +- Deprecated [ImageStore](https://reactnative.dev/docs/imagestore) and directed users to `expo-file-system` and `react-native-fs` ([62599fa8ff](https://github.com/facebook/react-native/commit/62599fa8ff7f308259fe178fa37b7bcf3c1a408c) by [@EvanBacon](https://github.com/EvanBacon)) + +#### iOS specific + +- Replace deprecated `stringByReplacingPercentEscapesUsingEncoding:` with `stringByAddingPercentEncodingWithAllowedCharacters:` ([61ca119650](https://github.com/facebook/react-native/commit/61ca11965046f75e7500e5152c5f2b60df2a2cd5) by [@pvinis](https://github.com/pvinis)) + +### Removed + +- `react-native-git-upgrade` is now officially dead; use `react-native upgrade` instead (which uses [rn-diff-purge](https://github.com/react-native-community/rn-diff-purge) under the covers) ([a6bdacb257](https://github.com/facebook/react-native/commit/a6bdacb2575dcc3be2acec95d8a6db6e2db909c4) by [@cpojer](https://github.com/cpojer)) + +#### iOS specific + +- Remove the previously deprecated **TabBarIOS** ([02697291ff](https://github.com/facebook/react-native/commit/02697291ff41ddfac5b85d886e9cafa0261c8b98) by [@axe-fb](https://github.com/axe-fb)) +- **AlertIOS** is now replaced with **Alert** ([e2bd7db732](https://github.com/facebook/react-native/commit/e2bd7db732602b2c477fe040f2946bd8293df297) by [@wellmonge](https://github.com/wellmonge)) + +### Fixed + +- **KeyboardAvoidingView** now shows the correct height after the keyboard is toggled ([745484c892](https://github.com/facebook/react-native/commit/745484c892e40cfe15ded128f5a589edb28d8f6b) by [@shauns](https://github.com/shauns)) +- Adds fixes for react-native-windows UWP ([dfcbf9729f](https://github.com/facebook/react-native/commit/dfcbf9729fab64c4bd8c00e1d092ec4e9bae717f) by [@rozele](https://github.com/rozele)) +- The `Map` and `Set` polyfills no longer reject non-extensible object keys; also fix hash collision scenario ([90850cace9](https://github.com/facebook/react-native/commit/90850cace9991ed0a02605586ea5c32ce099de65) by [@benjamn](https://github.com/benjamn)) +- Corrected StyleSheet's transformation perspective to match iOS's behavior, regardless of screen density ([4c10f9321c](https://github.com/facebook/react-native/commit/4c10f9321c9d01dbcac4808e7e6674cba12f3aa5) by [@syaau](https://github.com/syaau)) +- Fix `yarn test` in new projects ([5218932b13](https://github.com/facebook/react-native/commit/5218932b13ad0649ff2a57aaf1ec682fe278c47d) by [@Esemesek](https://github.com/Esemesek)) +- Fix issue with `getInspectorDataForViewTag` that caused red screen when toggling inspector ([46f3285a3f](https://github.com/facebook/react-native/commit/46f3285a3f240f9325a548e677a1927402d76bd7) by [@TranLuongTuanAnh](https://github.com/TranLuongTuanAnh)) +- Fix `displayName` for `Image`; this will make tests no longer mistake it as `Component` ([4989123f8c](https://github.com/facebook/react-native/commit/4989123f8cab37c95b020e23b9a925746a3f3677) by [@linnett](https://github.com/linnett)) +- Fix regression of **VirtualizedList** jumpy header ([e4fd9babe0](https://github.com/facebook/react-native/commit/e4fd9babe03d82fcf39ba6a46376f746a8a3e960) by [@danilobuerger](https://github.com/danilobuerger)) +- Set `wait_for_recheck=true` to work around crash in Flow ([ffc9908bef](https://github.com/facebook/react-native/commit/ffc9908bef535ba1392c370ca4e9e4e528c3c4c5) by [@gabelevi](https://github.com/gabelevi)) +- Fix flow typing of **Text** ([10c8352141](https://github.com/facebook/react-native/commit/10c835214160cc5a5726c8dd9f0d42a0275d198b) by [@sahrens](https://github.com/sahrens)) +- Fix `jest` and `jest-junit` to be only development dependencies ([c7b57f1986](https://github.com/facebook/react-native/commit/c7b57f19869f31474c8ee17f7a1ac1551bab1b6e) by [@vovkasm](https://github.com/vovkasm)) +- Fix layout issue with **SwipeableQuickActionButton** ([ad52f52624](https://github.com/facebook/react-native/commit/ad52f526247af6eebadd2ea436b86ff7eb874f27) by [@varungupta85](https://github.com/varungupta85)) + +#### Android specific + +- Fix textTransform when used with other text styles on Android (#22670) ([3a33e75183](https://github.com/facebook/react-native/commit/3a33e75183bf196d61b46e662b4c3f84a5f570bd) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix warnings related to updating to gradle 4.10.1 or higher ([5be50d4820](https://github.com/facebook/react-native/commit/5be50d482082917351b46ee2e339e56e7e34e111) by [@misaku](https://github.com/misaku)) +- Fix issue with use of Android API 28 by adding security config for metro access ([5747094532](https://github.com/facebook/react-native/commit/5747094532bace3fe6b1ebdf55235e53189baa71), [19492b730b](https://github.com/facebook/react-native/commit/19492b730b6779486f83d5ddbaeeb870cb3d5e9c), [3b0b7ce8c3](https://github.com/facebook/react-native/commit/3b0b7ce8c3c3679610c14ca72beb1a9dcf84d930), and [84572c4051](https://github.com/facebook/react-native/commit/84572c4051f11f68ddf0928d2c3df5850ae15491) by [@Salakar](https://github.com/Salakar) and [@dulmandakh](https://github.com/dulmandakh)) +- Fix Inverted Horizontal **ScrollView** ([32cb9ec49c](https://github.com/facebook/react-native/commit/32cb9ec49c801fcebe61486149134ab542d9364b) by [@dmainas](https://github.com/dmainas)) +- Fix crash on **CheckBox** on older Android versions ([58437cd10a](https://github.com/facebook/react-native/commit/58437cd10a667bbcbc16781df855fd7c3d73bf49) by [@vonovak](https://github.com/vonovak)) +- Fix undefined error description in **Image** `onError` callback ([7795a672d3](https://github.com/facebook/react-native/commit/7795a672d3a24a5b50df6ad6d30555d856b557cc) by [@Jyrno42](https://github.com/Jyrno42)) +- Fix Android crash on animating with `useNativeDriver` ([e405e84fc3](https://github.com/facebook/react-native/commit/e405e84fc35923888442df748757787698040010) by [@scisci](https://github.com/scisci)) +- Fix dev settings menu not appearing for certain codebases due to namespace conflicts ([9968d0c203](https://github.com/facebook/react-native/commit/9968d0c2030c1065979db34cc9a244bd52b7b2a5) by [@khaled-cliqz](https://github.com/khaled-cliqz)) +- Fix exception occurring while fading a **TextView** ([f83281e2ce](https://github.com/facebook/react-native/commit/f83281e2ce2aece44b1207844d8a5149d5d2e78d) by [@mdvacca](https://github.com/mdvacca)) +- Fix **StatusBar** overwriting previously set `SystemUiVisibility` flags ([8afa0378cd](https://github.com/facebook/react-native/commit/8afa0378cd09b8fa6c30d759539fc9a680e8cae2) by [@rogerkerse](https://github.com/rogerkerse)) +- Prevent `fetch()` POST requests from appending `charset=utf-8` to `Content-Type` header ([4a807761a4](https://github.com/facebook/react-native/commit/4a807761a4aca9e551ff2cee8ca18a2450fb11ca) and [0d5aebbd9a](https://github.com/facebook/react-native/commit/0d5aebbd9ac92a90ec7ab1426ed92dd22ae8c736) by [@nhunzaker](https://github.com/nhunzaker)) +- Fix issue with **Location** that led to exceptions in two cases ([f32dc63546](https://github.com/facebook/react-native/commit/f32dc635467a2e93371f0cf2e40b07a712349288) by [@mikelambert](https://github.com/mikelambert)) + +#### iOS specific + +- Fix **TextInput** mistakenly capitalizing I's after emojiis ([f307ac7c5e](https://github.com/facebook/react-native/commit/f307ac7c5e3adb9b4c0f8b2e4b8cdc2f980c7733) by [@dchersey](https://github.com/dchersey)) +- Fix **TextView**'s `setAttributedText` for CJK languages on single-line text fields ([e38be82dfa](https://github.com/facebook/react-native/commit/e38be82dfa8b49385b990629318f027de26500cf) by [@mandrigin](https://github.com/mandrigin)) +- Fix RCTImageLoader multi thread crash ([5ed31ce524](https://github.com/facebook/react-native/commit/5ed31ce5240a7392afdc522120edef182e0014ed)) +- Fix removing keys of large values from **AsyncStorage** ([27b4d21564](https://github.com/facebook/react-native/commit/27b4d215641f9397ef415cbb2acfc1275e6110ac) by [@esprehn](https://github.com/esprehn)) +- Fix overscroll behavior on virtualized lists; behavior is now consistent ([4d5f85ed42](https://github.com/facebook/react-native/commit/4d5f85ed426cfb43dc5e63f915e416a47d76b965)) +- Fix **Alert** to not block input focus and blur ([e4364faa3c](https://github.com/facebook/react-native/commit/e4364faa3cab150b82272819fc92086fb4da297e) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix broken JSIexecutor search path ([2aa2401766](https://github.com/facebook/react-native/commit/2aa24017667721ba17a859ca4e13d43e52d86bc5) by [@amccarri](https://github.com/amccarri)) +- Fix potential linker issues when using Xcode project ([9f72e6a5d0](https://github.com/facebook/react-native/commit/9f72e6a5d02d84fe8ed545e0c0904199b9cb3c7a) by [@tyrone-sudeium](https://github.com/tyrone-sudeium)) +- Fix crash when `scrollEnabled` used in singleline textinput ([9ff43abe65](https://github.com/facebook/react-native/commit/9ff43abe653ac5af0e591b369228f0809caad204) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix crash in gif image usage ([d0cd3cae13](https://github.com/facebook/react-native/commit/d0cd3cae13a1b1fff8a2e378b5228d3cdccd695f) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix **geolocation** to not constantly reset accuracy to default of 100 meters ([bbcb97a29a](https://github.com/facebook/react-native/commit/bbcb97a29adc2a3a05728b47d28e28fa78d84df2) by [@omnikron](https://github.com/omnikron)) +- Fix iOS build issue related to missing `DoubleConversion` and `glog` to `cxxreact`, `jsi` and `jsiexecutor` subspecs in `React.podspec` file ([00392ac46b](https://github.com/facebook/react-native/commit/00392ac46b6319dcff2b6df2e5f7bb4ee094612f) by [@alexruperez](https://github.com/alexruperez)) +- Fix "'folly/folly-config.h' file not found" build error when using React via CocoaPods ([5560a47c1d](https://github.com/facebook/react-native/commit/5560a47c1dbc7daab1e4f4aac0667080fdea836a) by [@Salakar](https://github.com/Salakar)) +- Fix image cache to follow [MDN strategy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#Freshness) ([fb8ba3fe95](https://github.com/facebook/react-native/commit/fb8ba3fe959fd2a0c4ef0025fd84f6deffd9d03b) and [fb8ba3fe95](https://github.com/facebook/react-native/commit/fb8ba3fe959fd2a0c4ef0025fd84f6deffd9d03b) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix crash due to IllegalArgumentException when creating CookieManage ([cda8171af3](https://github.com/facebook/react-native/commit/cda8171af30815edfa331e07d1bbf605f0926303) by [@mdvacca](https://github.com/mdvacca)) +- Fix cursor placement after toggling `secureTextEntry` cursor spacing ([8ce3c1b43e](https://github.com/facebook/react-native/commit/8ce3c1b43edd47191c8e5ee8432c58f6e93dfca7) by [@ericlewis](https://github.com/facebook/react-native/commits?author=ericlewis)) + +## v0.58.6 + +This release is fairly small, as we approach stable status for [0.59](https://github.com/react-native-community/react-native-releases/issues/79). + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/95) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/97). + +### Fixed + +#### Android specific + +- Fix Inverted Horizontal ScrollView on Android (#23233) ([32cb9ec49c](https://github.com/facebook/react-native/commit/32cb9ec49c801fcebe61486149134ab542d9364b) by [@dmainas](https://github.com/dmainas)) + +#### iOS specific + +- Map TextInput textContentType strings to Objective-C constants (#22611) ([a89fe4165c](https://github.com/facebook/react-native/commit/a89fe4165c2a331a9d88636d89a5a48151ab8660) by [@levibuzolic](https://github.com/levibuzolic)) +- Don't reconnect inspector if connection refused (#22625) ([d9489c4e9c](https://github.com/facebook/react-native/commit/d9489c4e9c646b79025f07635b840e9974be8cd5) by [@msand](https://github.com/msand)) + +## v0.58.5 + +This release resolves a few bugs and includes a few improvements, listed below. + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/86) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/95). + +### Removed + +- Remove fallback cache ([9d60c20cb3](https://github.com/facebook/react-native/commit/9d60c20cb35074e92a90b803d3d6f420f6671635) by [@grabbou](https://github.com/grabbou)) + +### Fixed + +- Fixes capitalized I's when emojis are present after the text being edited. (#21951) ([f307ac7c5e](https://github.com/facebook/react-native/commit/f307ac7c5e3adb9b4c0f8b2e4b8cdc2f980c7733) by [@dchersey](https://github.com/dchersey)) +- Fix broken jsiexecutor search path. (#23274) ([2aa2401766](https://github.com/facebook/react-native/commit/2aa24017667721ba17a859ca4e13d43e52d86bc5) by [@amccarri](https://github.com/amccarri)) +- Fix duplicate symbols linker error in xcodeproj (#23284) ([9f72e6a5d0](https://github.com/facebook/react-native/commit/9f72e6a5d02d84fe8ed545e0c0904199b9cb3c7a) by [@tyrone-sudeium](https://github.com/tyrone-sudeium)) +- apply Network Security Config file (fixes #22375) (part 2 of #23105) (#23135) ([84572c4051](https://github.com/facebook/react-native/commit/84572c4051f11f68ddf0928d2c3df5850ae15491) by [@Salakar](https://github.com/Salakar)) +- Fix crash for web socket in some race conditions (#22439) ([dd209bb789](https://github.com/facebook/react-native/commit/dd209bb7891ed5f05b96a9922c7b0e39bf3ac9e9) by [@zhongwuzw](https://github.com/zhongwuzw)) + +#### iOS specific + +- Don't attempt to load RCTDevLoadingView lazily ([a9dd828c68](https://github.com/facebook/react-native/commit/a9dd828c68338dbf0e55ffa1838bf8ff574f317d) by [@fkgozali](https://github.com/fkgozali)) + +### Security + +#### Android specific + +- improve Android Network Security config (#23429) ([5747094532](https://github.com/facebook/react-native/commit/5747094532bace3fe6b1ebdf55235e53189baa71) by [@dulmandakh](https://github.com/dulmandakh)) + +## v0.58.4 + +This release resolves a few bugs and includes a few improvements, listed below. + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/81) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/86). + +### Added + +#### Android specific + +- Add error description to Image onError callback ([7795a672d3](https://github.com/facebook/react-native/commit/7795a672d3a24a5b50df6ad6d30555d856b557cc) by [@Jyrno42](https://github.com/Jyrno42)) + +### Changed + +#### Android specific + +- bump soloader to `0.6.0` ([07d1075f37](https://github.com/facebook/react-native/commit/07d1075f372bb864ddc62b9c8f613b03becfa568) by [@dulmandakh](https://github.com/dulmandakh)) + +### Removed + +- Remove jest and jest-junit from runtime dependencies (#23276) ([c7b57f1986](https://github.com/facebook/react-native/commit/c7b57f19869f31474c8ee17f7a1ac1551bab1b6e) by [@vovkasm](https://github.com/vovkasm)) + +### Fixed + +#### Android specific + +- Fixes Android crash on animated style with string rotation ([e405e84fc3](https://github.com/facebook/react-native/commit/e405e84fc35923888442df748757787698040010) by [@scisci](https://github.com/scisci)) + +#### iOS specific + +- fix incorrect type which makes animated gifs not loop forever on device (#22987) ([728a35fcf2](https://github.com/facebook/react-native/commit/728a35fcf2a2b0d695a4d7083b266eda486b1392) by [@chrisnojima](https://github.com/chrisnojima)) +- Fixes for running the simulator ([9a8c9596eb](https://github.com/facebook/react-native/commit/9a8c9596ebe41e27d37ba18d6bf09f1c931c1ff2) by [@osunnarvik](https://github.com/osunnarvik)), ([98bcfe00fb](https://github.com/facebook/react-native/commit/98bcfe00fbca066d6914a2680c3647b678caccc5) by [@cpojer](https://github.com/cpojer)) and ([8bddcb6cb0](https://github.com/facebook/react-native/commit/8bddcb6cb0914373a0aeb927f12a6d48ffc5bb84) by [@cpojer](https://github.com/cpojer)) + +## v0.58.3 + +This release resolves a regression in **StatusBar** using [these fixes](https://github.com/facebook/react-native/compare/v0.58.2...v0.58.3). + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/81) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/81). + +## v0.58.2 + +This release fixes an issue caused by a wrongly reverted merge commit, that caused a short timeframe of commits to not actually be in the original 0.58.0. Those commits have been added to the 0.58 changelog below, as many are intertwined with the original work. + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/81) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/81). + +## v0.58.1 + +There were some regressions with developer tools that prevented `react-native run-ios` from working properly in 0.58.0; this patch fix addresses that. + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/81) for cherry-picking commits - you can participate to the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/81). + +## v0.58.0 + +Welcome to first stable release of React Native of 2019! +There are a number of significant changes in this version, and we'd like to especially draw your attention to them: + +- [Modernizing](https://github.com/facebook/react-native/issues/21581) and [strengthening flow types](https://github.com/facebook/react-native/issues/22100) for core components +- Breaking changes to `ScrollView`, `CameraRollView`, and `SwipeableRow` that make it no longer bound to the component instance in certain methods +- Support for mutual TLS in WebKit +- Asset serving from directories besides `/assets` +- Numerous crash fixes and resolutions for unexpected behavior + +Aside from those: + +- if you are an iOS developer, you'll need to manually link `JavaScriptCore.framework` when upgrading; this can be done via Xcode, and following the steps shown [here](https://camo.githubusercontent.com/c09cd42747364b498efa7c82fcb73978ba076eae/687474703a2f2f646f63732e6f6e656d6f62696c6573646b2e616f6c2e636f6d2f696f732d61642d73646b2f616464696e672d6672616d65776f726b732e706e67). + +- Android developers, please note that Android's target SDK 27 is supported. Work is still underway to land target SDK 28 support, and it will come soon. + +Thanks to those who gave feedback during the [release candidate phase](https://github.com/react-native-community/react-native-releases/issues/41). If you're interested in helping evaluate our next release (0.59), subscribe to the dedicated issue [here](https://github.com/react-native-community/react-native-releases/issues/79). + +### Added + +- Add support for `publicPath` to enable serving static assets from different locations ([0b314960aa](https://github.com/facebook/react-native/commit/0b314960aa34c71fc731bac9c1f2b48f3223c5cb) by [@gdborton](https://github.com/gdborton)) +- Add **TouchableBounce** now has a simple `bounce()` function that can be used to trigger a bounce without callbacks ([7fe3f90156](https://github.com/facebook/react-native/commit/7fe3f90156e879fe53665efb5a90ba3a711475fa)) + +#### Android specific + +- Bundler server host can now be set using Android System Properties, making for easier debugging across multiple apps or app installs `adb shell setprop metro.host` ([e02a154787](https://github.com/facebook/react-native/commit/e02a154787274be1da3632cb1412554cbd53928b) by [@stepanhruda](https://github.com/stepanhruda)) +- Native Modules can now reject a promise with an additional `WritableMap` arg for extra properties (`userInfo`). See the interface defined in [`Promise.java`](https://github.com/facebook/react-native/blob/60b3942/ReactAndroid/src/main/java/com/facebook/react/bridge/Promise.java) for available methods. This is accessible in JavaScript as `Error.userInfo`. This is to match iOS's existing `Error.userInfo` behavior. See PR for examples. (#20940 by @Salakar) +- Native Modules now expose a `nativeStackAndroid` property to promises rejected with an Exception/Throwable - making native error stacks available inside Javascript: `Error.nativeStackAndroid`. This is to match iOS's existing `Error.nativeStackIOS` support. See PR for examples. (#20940 by @Salakar) + +#### iOS specific + +- Add `moduleForName: lazilyLoadIfNecessary` to **RCTBridge.h** to lookup modules by name and force load them, plus various improvements to LazyLoading ([d7a0c44590](https://github.com/facebook/react-native/commit/d7a0c44590bcf3fb9d055aeae3391d5bcd7e21be), [6534718a18](https://github.com/facebook/react-native/commit/6534718a1898aa472e255d2aa9a0a6cae305619a), [d7865ebde8](https://github.com/facebook/react-native/commit/d7865ebde879983b355d6f6e64232e4bd264081d), [04ea9762e2](https://github.com/facebook/react-native/commit/04ea9762e2013dcebf9f8a51d8974fa799e41cd5), [1f394fa673](https://github.com/facebook/react-native/commit/1f394fa673a876753fdc9ac2cb86a4d4a58cd8cd), [80f92adf1f](https://github.com/facebook/react-native/commit/80f92adf1f35e74ee6db0b2f445cc851463059cf), and [81b74ec1ed](https://github.com/facebook/react-native/commit/81b74ec1ed3792c0b406c30b0a1c01219a2d6243) by [@dshahidehpour](https://github.com/dshahidehpour), [@fkgozali](https://github.com/fkgozali), and [@mmmulani](https://github.com/mmmulani)) +- Add ability for **WebView** to `setClientAuthenticationCredential` when `useWebKit={true}` for mutual TLS authentication ([8911353c47](https://github.com/facebook/react-native/commit/8911353c47af018f78c1cff59dfab05b975e39ed) and [8911353c47](https://github.com/facebook/react-native/commit/8911353c47af018f78c1cff59dfab05b975e39ed) by [@mjhu](https://github.com/mjhu)) + +### Changed + +- Major improvements to Flow types for Core Components ([499c195eba](https://github.com/facebook/react-native/commit/499c195ebab0f276e3a58baf1e6172c1ba046a9e), [fbc5a4f5e6](https://github.com/facebook/react-native/commit/fbc5a4f5e65e024c10ad43d84f2b2353c9e92461), [f9050e0908](https://github.com/facebook/react-native/commit/f9050e09084cf3700bfc1954f97adf0f60cd8d88), [6476151717](https://github.com/facebook/react-native/commit/6476151717f44d3a90679f0f5293bed62a4f420e), [c03fc4087f](https://github.com/facebook/react-native/commit/c03fc4087ff9ac3ccbd1ab2261a1af329b354d99), [69213eea95](https://github.com/facebook/react-native/commit/69213eea9512c81ed998d240a6f5a3be05346b48), [136dfc8312](https://github.com/facebook/react-native/commit/136dfc831230e5418db02d1202e60d23a95c17b6), [3c0211b61a](https://github.com/facebook/react-native/commit/3c0211b61a1e723c3aaeba42c61b60bc724a3729), [c127000a7d](https://github.com/facebook/react-native/commit/c127000a7d2bb54599c9d80503528c3e8d75fddc), [636e146c4a](https://github.com/facebook/react-native/commit/636e146c4a27990547c81c2d36411d36b2c8e788), [c3dea894bd](https://github.com/facebook/react-native/commit/c3dea894bdb07d0b7ec18ab0388626d0340e6b69), [35a65cd704](https://github.com/facebook/react-native/commit/35a65cd704f2da67cd759c4d91251f8d4964b251), [79274979b7](https://github.com/facebook/react-native/commit/79274979b775e89d5f54a557a34062f873134199), [45c51835d6](https://github.com/facebook/react-native/commit/45c51835d69e111b67b4fcf1af39a13f7df1ee48), [a97d104b44](https://github.com/facebook/react-native/commit/a97d104b44daa068fa3848cc6c3225356f9dc318), [fb4825a2c6](https://github.com/facebook/react-native/commit/fb4825a2c65fba3aa905f7defb7d0c125fff644d), [84c5416617](https://github.com/facebook/react-native/commit/84c541661729dd20ab260c7468e48abbbe82affb), [3649a503cf](https://github.com/facebook/react-native/commit/3649a503cf52feac0386b4a10aab5ef6c4ec5ca0) by [@mottox2](https://github.com/mottox2), [@saitoxu](https://github.com/saitoxu), [@RSNara](https://github.com/RSNara), [@watanabeyu](https://github.com/watanabeyu), [@Tnarita0000](https://github.com/Tnarita0000), [@exced](https://github.com/exced), [@nd-02110114](https://github.com/nd-02110114), [@flowkraD](https://github.com/flowkraD)) +- Many public components were converted to ES6 classes ([ScrollView](https://github.com/facebook/react-native/commit/010e3302b8101287f231254086f3a8788a5a2c3e) by [@thymikee](https://github.com/thymikee), [CameraRollView](https://github.com/facebook/react-native/pull/21619), [SwipeableRow](https://github.com/facebook/react-native/pull/21876/files) and [ProgressBarAndroid](https://github.com/facebook/react-native/pull/21874) by [@exceed](https://github.com/exceed), [ProgressViewIOS](https://github.com/facebook/react-native/pull/21588) by [@empyrical](https://github.com/empyrical), [SegmentedControlIOS](https://github.com/facebook/react-native/pull/21888/files), [ToolbarAndroid](https://github.com/facebook/react-native/pull/21893/files) by [@nd-02110114](https://github.com/nd-02110114) +- Flow dependency is now at `v0.85.0` ([adc8a33fcf](https://github.com/facebook/react-native/commit/adc8a33fcfeb8fc163f48ae4a4bc5aaac98bcb0d) by [@samwgoldman](https://github.com/samwgoldman)) +- metro dependency is now at `v0.49.1` ([f867db366a](https://github.com/facebook/react-native/commit/f867db366aa4f0ead5a20c0d3154ca58be43fc20), [88882951e1](https://github.com/facebook/react-native/commit/88882951e1607b0af6f1772ef13135e037f9c4e3), [31bb551e75](https://github.com/facebook/react-native/commit/31bb551e75bda155b4821381e5497dc423326e3c), [de60e8643a](https://github.com/facebook/react-native/commit/de60e8643ac4e13a7f92175351268dd3c3e768db), and [de60e8643a](https://github.com/facebook/react-native/commit/de60e8643ac4e13a7f92175351268dd3c3e768db) by [@alexkirsz](https://github.com/alexkirsz) and [@rafeca](https://github.com/rafeca)) +- jest dependency is now at `v24.0.0-alpha.6` ([1b4fd64325](https://github.com/facebook/react-native/commit/1b4fd643256817d29163b37101da612867a225a1), [66aba09251](https://github.com/facebook/react-native/commit/66aba092514abd2b278a4fb66c30abffbdd5d5ff), and [06c13b3e06](https://github.com/facebook/react-native/commit/06c13b3e066636b414f5dc19c919dcb138763c71) by [@rafeca](https://github.com/rafeca) and [@rubennorte](https://github.com/rubennorte)) +- fbjs-scripts dependency is now at `v1.0.0` (#21880) ([cdbf719307](https://github.com/facebook/react-native/commit/cdbf719307f41e94a62307ec22463bb562d1c8de) by [@jmheik](https://github.com/jmheik)) +- folly dependency is now at `v2018.10.22.00` ([a316dc6ec3](https://github.com/facebook/react-native/commit/a316dc6ec34655981c0f226186f4fb668e4a01e2), [287934dba9](https://github.com/facebook/react-native/commit/287934dba943cd954164bde8b06f9ba85940b45f), and [a70625abd7](https://github.com/facebook/react-native/commit/a70625abd7bf4fba3dafb8a969a73854b7ddcd42) by [@Kudo](https://github.com/Kudo) and [@radko93](https://github.com/radko93)) +- React is set to `16.6.3` now via sync for revisions 4773fdf...6bf5e85 ([0cb59b5c23](https://github.com/facebook/react-native/commit/0cb59b5c23b76771a30f59cdcedaa3c95c4dd280) and [073ad6a036](https://github.com/facebook/react-native/commit/073ad6a0367c3156e03680c0ab0648feed2bf89c) by [@yungsters](https://github.com/yungsters)) +- Clearer error messages when hot reloading ([c787866d64](https://github.com/facebook/react-native/commit/c787866d644be4c8d30bb17c237a50fdd6e1a82d) by [@alexkirsz](https://github.com/alexkirsz)) +- Allow CxxModules to implement functions which take two callbacks ([8826d8b233](https://github.com/facebook/react-native/commit/8826d8b233c1e3325a575d5012b713c4786e6062) by [@acoates-ms](https://github.com/acoates-ms)) + +#### Breaking Changes 💥 + +- Public methods of components converted to ES6 classes are no longer bound to their component instance. For `ScrollView`, the affected methods are `setNativeProps`, `getScrollResponder`, `getScrollableNode`, `getInnerViewNode`, `scrollTo`, `scrollToEnd`, `scrollWithoutAnimationTo`, and `flashScrollIndicators`. For `CameraRollView`, the affected methods are: `rendererChanged`. For `SwipeableRow`, the affected methods are: `close`. Therefore, it is no longer safe to pass these method by reference as callbacks to functions. Auto-binding methods to component instances was a behaviour of `createReactClass` that we decided to not preserve when switching over to ES6 classes. (you can refer to [this example](https://github.com/react-native-community/react-native-releases/issues/81#issuecomment-459252692)) +- Native Modules in Android now require `@ReactModule` annotations to access `.getNativeModule` method on the `ReactContext`. This is how your updated Native Module should look like: + + ```diff + // CustomModule.java + + // ... + + import com.facebook.react.module.annotations.ReactModule; + + + @ReactModule(name="CustomBridge") + public class CustomModule extends ReactContextBaseJavaModule { + // ... + + @Override + public String getName() { + return "CustomBridge"; + } + + // ... + } + ``` + +#### Android specific + +- Optimize `PlatformConstants.ServerHost`, `PlatformConstants.isTesting`, and `PlatformConstants.androidID` for performance ([2bf0d54f15](https://github.com/facebook/react-native/commit/2bf0d54f155c28244fa60230871b3eed60a20c6d), [339d9d3afb](https://github.com/facebook/react-native/commit/339d9d3afba45bb28073db59e365caea37258891), and [9f9390ddfc](https://github.com/facebook/react-native/commit/9f9390ddfccab706ff2d346fdbd408c1cfc1c312) by [@stepanhruda](https://github.com/stepanhruda), [@fkgozali](https://github.com/fkgozali), and [@axe-fb](https://github.com/axe-fb)) + +#### iOS specific + +- Suppress yellow box about missing export for native modules ([5431607c6d](https://github.com/facebook/react-native/commit/5431607c6d4983e0adccf0192dd4dc4f5dc85443) by [@fkgozali](https://github.com/fkgozali)) + +### Removed + +- Remove `UIManager.measureViewsInRect()` ([d6236796b2](https://github.com/facebook/react-native/commit/d6236796b285e6ad19c53c5308a0ad9c10792a05) by [@shergin](https://github.com/shergin)) + +### Fixed + +- Fix potential UI thread stalling scenario from Yoga JNI bindings ([2a8f6c3028](https://github.com/facebook/react-native/commit/2a8f6c3028feec7fc9a01cbdfad45955c4771bf8) by [@davidaurelio](https://github.com/davidaurelio)) +- Fix crash happening due to race condition around bridge cxx module registry ([188cbb04ad](https://github.com/facebook/react-native/commit/188cbb04ad264aea32ae235b85b61e626b767b83), [188cbb04ad](https://github.com/facebook/react-native/commit/188cbb04ad264aea32ae235b85b61e626b767b83), and [188cbb04ad](https://github.com/facebook/react-native/commit/188cbb04ad264aea32ae235b85b61e626b767b83) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Fix **View** and **Text**'s displayName; show the specific name rather than generic "Component" ([7a914fcef4](https://github.com/facebook/react-native/commit/7a914fcef4ae035221e1f984c104ba20430d6fad) by [@rajivshah3](https://github.com/rajivshah3)) +- Fix `react-native init --help` so that it doesn't return `undefined` ([58732a88b6](https://github.com/facebook/react-native/commit/58732a88b629b40b2d223a76fac46ecee5ae7295) by [@ignacioola](https://github.com/ignacioola)) +- Fix `react-native --sourceExts` ([ce860803a4](https://github.com/facebook/react-native/commit/ce860803a4341c4121a0bb504dc669349ac0db35) by [@elyalvarado](https://github.com/elyalvarado)) +- Fix accidental showing of **Modal** when `visible` prop is undefined or null ([cc13a7367b](https://github.com/facebook/react-native/commit/cc13a7367b08bd766749ddbfaacc25ade1f33a8f) by [@MateusAndrade](https://github.com/MateusAndrade)) +- Fix crash during **VirtualizedList** pagination ([5803772017](https://github.com/facebook/react-native/commit/580377201793314ca643250c1bd7cf1c47d49920)) +- Fix scenario where removing a module with remote debugging and Delta bundles may cause incorrect stack traces ([bea57d871f](https://github.com/facebook/react-native/commit/bea57d871f6b5bed76d1625b3e3f483695bd13e9) by [@alexkirsz](https://github.com/alexkirsz)) +- Fix regression in **StyleSheet** `setStyleAttributePreprocessor` ([04085337bc](https://github.com/facebook/react-native/commit/04085337bc47392922c7911b95b8fdaea98800e8) by [@brentvatne](https://github.com/brentvatne)) +- Fix React Native AsyncMode and DevTools ([aacb06c594](https://github.com/facebook/react-native/commit/aacb06c594dcd4581918035f713a69cf73bf125b) by [@bvaughn](https://github.com/bvaughn)) + +#### Android specific + +- Fix crash when removing root nodes ([b649fa96a0](https://github.com/facebook/react-native/commit/b649fa96a088a9e8ccbf3f979ebfa4a5e28a066f) by [@ayc1](https://github.com/ayc1)) +- Fix various **ReactInstanceManager** deadlocks and race conditions ([df7e8c64ff](https://github.com/facebook/react-native/commit/df7e8c64ff8f5ff739fba2ba5ed6b0610567235e), [df7e8c64ff](https://github.com/facebook/react-native/commit/df7e8c64ff8f5ff739fba2ba5ed6b0610567235e), and [be282b5287](https://github.com/facebook/react-native/commit/be282b5287f7eecf8a3fd14b06ab36454dbba5fe) by [@ayc1](https://github.com/ayc1)) +- Fix IllegalArgumentException when dismissing ReactModalHostView and DialogManager ([e57ad4ee37](https://github.com/facebook/react-native/commit/e57ad4ee37b02cd4c9e10a97d7a1d2b799204d7d) and [38e01a20c3](https://github.com/facebook/react-native/commit/38e01a20c343e60d5f8cd92fb26454e9940565df) by [@mdvacca](https://github.com/mdvacca)) +- Fix incorrect merged asset path with flavor for Android Gradle Plugin 3.2 ([e90319e9fa](https://github.com/facebook/react-native/commit/e90319e9fa18661144ad29faf36efba3750edb32) by [@yatatsu](https://github.com/yatatsu)) +- Fix HTTP connection ontimeout callback ([a508134724](https://github.com/facebook/react-native/commit/a50813472450f51d2ef24b40be99a22beefec33c)) +- Fix websocket properly closing when remote server initiates close ([2e465bca15](https://github.com/facebook/react-native/commit/2e465bca158ae9cfa89448e2a3bb8cc009397ac8) by [@syaau](https://github.com/syaau)) +- Fix compatibility issue for Android 16 device ([5939d078a0](https://github.com/facebook/react-native/commit/5939d078a01edc9f83fce102317540ffbcac17c1), [f22473e9e9](https://github.com/facebook/react-native/commit/f22473e9e9f73605cd27c5e38298bd793478c84d), and [f22473e9e9](https://github.com/facebook/react-native/commit/f22473e9e9f73605cd27c5e38298bd793478c84d) by [@gengjiawen](https://github.com/gengjiawen)) +- Fix issue where `Image.resizeMode` isn't respected while source is loading, resulting in unexpected padding ([673ef39561](https://github.com/facebook/react-native/commit/673ef39561ce6640e447fa40299c263961e4f178) by [@dulmandakh](https://github.com/dulmandakh)) +- Fix Android 28's inverted **ScrollView** so that momentum is in the proper direction ([b971c5beb8](https://github.com/facebook/react-native/commit/b971c5beb8c7f90543ea037194790142f4f57c80) by [@mandrigin](https://github.com/mandrigin)) +- Fix HTTP connection timeout callback to be appropriately called ([a508134724](https://github.com/facebook/react-native/commit/a50813472450f51d2ef24b40be99a22beefec33c)) +- Fix compatibility issue with Android 16 device ([5939d078a0](https://github.com/facebook/react-native/commit/5939d078a01edc9f83fce102317540ffbcac17c1) by [@gengjiawen](https://github.com/gengjiawen)) +- Fix crash when releasing RN views and removing root nodes([83405ff316](https://github.com/facebook/react-native/commit/83405ff3167eaba6fa59ca52c54943221a05ee09) and [b649fa96a0](https://github.com/facebook/react-native/commit/b649fa96a088a9e8ccbf3f979ebfa4a5e28a066f) by [@ayc1](https://github.com/ayc1)) +- Close websocket properly when remote server initiates close ([2e465bca15](https://github.com/facebook/react-native/commit/2e465bca158ae9cfa89448e2a3bb8cc009397ac8) by [@syaau](https://github.com/syaau)) +- Workaround a wrong fling direction for inverted ScrollViews on Android P ([b971c5beb8](https://github.com/facebook/react-native/commit/b971c5beb8c7f90543ea037194790142f4f57c80) by [@mandrigin](https://github.com/mandrigin)) +- Fix **Image** to respect `resizeMode` for `defaultSource` images rather than showing padding while loading ([673ef39561](https://github.com/facebook/react-native/commit/673ef39561ce6640e447fa40299c263961e4f178) by [@dulmandakh](https://github.com/dulmandakh)) + +#### iOS specific + +- Fix case where content of inline views didn't get relaid out ([798517a267](https://github.com/facebook/react-native/commit/798517a267841675956cb52a1c0ae493a913962a) by [@rigdern](https://github.com/rigdern)) +- Fix issue with **ImagePickerIOS**'s inconsistent image when using the front-facing camera ([4aeea4d2dc](https://github.com/facebook/react-native/commit/4aeea4d2dc14cf02dc3766043e2938bf367c6170)) +- Fix race condition and crash around shutdown of the JSC for iOS 11 and earlier ([bf2500e38e](https://github.com/facebook/react-native/commit/bf2500e38ec06d2de501c5a3737e396fe43d1fae) by [@mhorowitz](https://github.com/mhorowitz)) +- Fix crash in **NetInfo**'s \_firstTimeReachability ([eebc8e230a](https://github.com/facebook/react-native/commit/eebc8e230a9f72c3dde34a5cfd59bbffba55e53d) by [@mmmulani](https://github.com/mmmulani)) +- Fix case where inline view is visible even though it should have been truncated ([70826dbafc](https://github.com/facebook/react-native/commit/70826dbafcb00c08e0038c5066e33848141be77b) by [@rigdern](https://github.com/rigdern)) +- Fix crash with **ScrollView** related to content offsets ([585f7b916d](https://github.com/facebook/react-native/commit/585f7b916d63b7b4d22a7347334765ffcd7945e9) by [@shergin](https://github.com/shergin)) +- Fix an issue where **CameraRoll** wasn't showing the front-facing camera consistently during capture and preview ([4aeea4d2dc](https://github.com/facebook/react-native/commit/4aeea4d2dc14cf02dc3766043e2938bf367c6170)) +- Fix case where inline view is visible even though it should have been truncated ([70826dbafc](https://github.com/facebook/react-native/commit/70826dbafcb00c08e0038c5066e33848141be77b) by [@rigdern](https://github.com/rigdern)) + +### Known issues + +It is possible that you'll face an AAPT error regarding missing resources, [here](https://github.com/infinitered/ignite-andross/issues/244) is an example of this error, in this case, you should try to update the build tools versions to `buildToolsVersion = "28.0.2"` in your android/build.gradle file. If you maintain a react-native library which uses native code you should avoid using hardcoded versions of the build tools and use the packaged version numbers, here is an example you can [follow](https://github.com/react-native-community/react-native-linear-gradient/blob/master/android/build.gradle) + +## v0.57.8 + +**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.3"`. + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/71) for cherry-picking commits - you can participate to the decision process for the next release [here](https://github.com/react-native-community/react-native-releases/issues/75). + +### Added + +- Fix: Add displayName to ActivityIndicator (#22417) ([53da585832](https://github.com/facebook/react-native/commit/53da5858326bbddd2df112f86b2c1e935adc3882)) + +### Changed + +- Switch: Improve Accessibility ([0c8db08f51](https://github.com/facebook/react-native/commit/0c8db08f519fdf5162dff1d9a18b58885c4c7d2f) by [@yungsters](https://github.com/yungsters)) +- React sync for revisions 3ff2c7c...6bf5e85 ([073ad6a036](https://github.com/facebook/react-native/commit/073ad6a0367c3156e03680c0ab0648feed2bf89c) by [@yungsters](https://github.com/yungsters)) + +#### iOS specific + +- Extend reason message for `RCTFatalException` (#22532) ([2831d9ef61](https://github.com/facebook/react-native/commit/2831d9ef614280d08699f3134eeaeda84c30234e) by [@zackzachariah](https://github.com/zackzachariah)) + +### Removed + +- Remove trailing slash from origin header if no port is specified (#22290) ([cbe7d41f3f](https://github.com/facebook/react-native/commit/cbe7d41f3f509aaa8b8b0819b0d8ad4996fd7296)) + +### Fixed + +- Fix text alpha bug ([fd78eee11b](https://github.com/facebook/react-native/commit/fd78eee11b71799aa7fa57bbd70d59c6c642c3b3) by [@necolas](https://github.com/necolas)) +- fix possible NPE in StatusBarModule ([0f3be77b7d](https://github.com/facebook/react-native/commit/0f3be77b7d4177c8f94d775bf8ef2a2b68f1e828) by [@mdvacca](https://github.com/mdvacca)) +- Fixes animated gifs incorrectly looping/not stopping on last frame (#21999) ([de759b949e](https://github.com/facebook/react-native/commit/de759b949e4aa4904fd60a2fcbb874a3c857b50c) by [@staufman](https://github.com/staufman)) +- Fix ListEmptyComponent is rendered upside down when using inverted flag. (#21496) ([198eb02697](https://github.com/facebook/react-native/commit/198eb0269781803cc16254916b0477916afbcb0e) by [@hyochans](https://github.com/hyochans)) +- Fix bug in comparison logic of object property (#22348) ([c3b3eb7f73](https://github.com/facebook/react-native/commit/c3b3eb7f73b0fb4035d4b2478bf9827caf746372) by [@vreality64](https://github.com/vreality64)) +- Fix dispatch of OnLayout event for first render ([844e11967d](https://github.com/facebook/react-native/commit/844e11967d9292bd5cfe423d0fd57e34388f2337) by [@mdvacca](https://github.com/mdvacca)) +- KeyboardAvoidingView: Duration cannot be less then 10ms (#21858) ([87b6533937](https://github.com/facebook/react-native/commit/87b65339379362f9db77ae3f5c9fa8934da34b25)) +- default hitSlop values to 0 (#22281) ([f6d3a61677](https://github.com/facebook/react-native/commit/f6d3a6167730cc9253b796b859d8f1f33f821687) by [@Taylor123](https://github.com/Taylor123)) + +#### iOS specific + +- Fixed for supporting mediaPlaybackRequiresUserAction under iOS 10. (#22208) ([c45d290b07](https://github.com/facebook/react-native/commit/c45d290b079f95466ad4054acf7b93c66cabc429) by [@ifsnow](https://github.com/ifsnow)) +- Use main.jsbundle in iOS template for production build (#22531) ([a2ef5b85d8](https://github.com/facebook/react-native/commit/a2ef5b85d8c46cefd5873bf5fc6dddabf1d51d13) by [@radeno](https://github.com/radeno)) +- Use relative path for SCRIPTDIR (#22598) ([0314fca63a](https://github.com/facebook/react-native/commit/0314fca63a035c95864e5b198e1fbd9a5ee1d2a7) by [@sunnylqm](https://github.com/sunnylqm)) +- Fix UIScrollView crash ([585f7b916d](https://github.com/facebook/react-native/commit/585f7b916d63b7b4d22a7347334765ffcd7945e9) by [@shergin](https://github.com/shergin)) +- Avoid using `-[UITextView setAttributedString:]` while user is typing (#19809) ([f77aa4eb45](https://github.com/facebook/react-native/commit/f77aa4eb459b9dcb7f0b558ad3f04e0c507955e9)) + +### Security + +- Bump ws package to 1.1.5 due to vulnerability issues (#21769) ([96ce6f9538](https://github.com/facebook/react-native/commit/96ce6f9538ed3559ffea6040a47b1d6a30546ab9) by [@prog1dev](https://github.com/prog1dev)) + +## v0.57.7 + +**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.1"`. + +This patch release fixes version 0.57.6 about losing focus in `TextInput` because of [ada7089066](https://github.com/facebook/react-native/commit/ada70890663503b65b42bb5f6f98d3df412ecdc4). + +Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/64) for cherry-picking commits. + +## v0.57.6 + +**INFO NOTE**: It's highly recommended that you skip this version and upgrade to 0.57.7. + +**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.1"`. +This patch release fixes a number of crashes, resolves build issues (both for iOS and Android). Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/64) for cherry-picking commits. + +### Added + +#### iOS specific + +- Add iOS 12 textContentType options (#21079) ([644fc57fad](https://github.com/facebook/react-native/commit/644fc57fad4b163e96c3b3d6ec441c7b566d2d43) by [@ultramiraculous](https://github.com/ultramiraculous)) + +### Removed + +- Remove useless additional blur call (#22156) ([ada7089066](https://github.com/facebook/react-native/commit/ada70890663503b65b42bb5f6f98d3df412ecdc4)) + +### Fixed + +- Improving Modal `visible` prop check to handle undefined and null (#22072) ([cc13a7367b](https://github.com/facebook/react-native/commit/cc13a7367b08bd766749ddbfaacc25ade1f33a8f) by [@MateusAndrade](https://github.com/MateusAndrade)) +- Fix crash in nativeInjectHMRUpdate (#22412) ([0b4fd621e3](https://github.com/facebook/react-native/commit/0b4fd621e3ab511510d6852af67183a3581d1aad) by [@vovkasm](https://github.com/vovkasm)) +- Fix IllegalArgumentException when dismissing ReactModalHostView ([e57ad4ee37](https://github.com/facebook/react-native/commit/e57ad4ee37b02cd4c9e10a97d7a1d2b799204d7d) by [@mdvacca](https://github.com/mdvacca)) +- Fix regression in StyleSheet.setStyleAttributePreprocessor (#22262) ([04085337bc](https://github.com/facebook/react-native/commit/04085337bc47392922c7911b95b8fdaea98800e8) by [@brentvatne](https://github.com/brentvatne)) +- Fix React Native AsyncMode and DevTools ([f41383fb6d](https://github.com/facebook/react-native/commit/f41383fb6d6d0858e1b09dda79a74632d7932d07) by [@bvaughn](https://github.com/bvaughn)) +- CxxReact: Silence 'unused lambda capture' warnings in open-source (#22240) ([0c0540965a](https://github.com/facebook/react-native/commit/0c0540965ad9e3cdd9af16f606e141eca8ab2193) by [@empyrical](https://github.com/empyrical)) + +#### Android specific + +- Fixed HTTP connection timeout on Android (#22164) ([a508134724](https://github.com/facebook/react-native/commit/a50813472450f51d2ef24b40be99a22beefec33c)) +- resizeMode applies to Image.defaultSource (#22216) ([673ef39561](https://github.com/facebook/react-native/commit/673ef39561ce6640e447fa40299c263961e4f178) by [@dulmandakh](https://github.com/dulmandakh)) +- Android: Close websocket properly when remote server initiates close (#22248) ([2e465bca15](https://github.com/facebook/react-native/commit/2e465bca158ae9cfa89448e2a3bb8cc009397ac8) by [@syaau](https://github.com/syaau)) +- Workaround a wrong fling direction for inverted ScrollViews on Android P (#21117) ([b971c5beb8](https://github.com/facebook/react-native/commit/b971c5beb8c7f90543ea037194790142f4f57c80) by [@mandrigin](https://github.com/mandrigin)) +- Fix crash when releasing RN views ([83405ff316](https://github.com/facebook/react-native/commit/83405ff3167eaba6fa59ca52c54943221a05ee09) by [@ayc1](https://github.com/ayc1)) + +#### iOS specific + +- iOS: Support inline view truncation (#21456) ([70826dbafc](https://github.com/facebook/react-native/commit/70826dbafcb00c08e0038c5066e33848141be77b) by [@rigdern](https://github.com/rigdern)) +- NetInfo: try to solve crash with releasing \_firstTimeReachability ([eebc8e230a](https://github.com/facebook/react-native/commit/eebc8e230a9f72c3dde34a5cfd59bbffba55e53d) by [@mmmulani](https://github.com/mmmulani)) +- Generate ip.txt before SKIP_BUNDLING check (#20554) ([9c1ea45d38](https://github.com/facebook/react-native/commit/9c1ea45d38a6ec731894443debe8879fa3876ab7) by [@keatongreve](https://github.com/keatongreve)) +- Revert [Performance improvement for loading cached images on iOS ] ([7eeb305933](https://github.com/facebook/react-native/commit/7eeb305933fca695c5a15d675bb10569c3385109) by [@kelset](https://github.com/kelset)) +- Fix inability to remove 'Disabled' state from AccessibilityStates ([5eaa2d29c0](https://github.com/facebook/react-native/commit/5eaa2d29c0c4c633a40f7241408737c754edea84)) + +## v0.57.5 + +**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.1"`. + +This patch release fixes a number of crashes, resolves build issues (both for iOS and Android), and brings React to v16.6.1. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/54) for cherry-picking commits. + +### Changed + +- React is now at v16.6.1 ([8325e09e5c](https://github.com/facebook/react-native/commit/8325e09e5cd8538fded1b5a1b4fff1854e17eb22) and [76c99f20e3](https://github.com/facebook/react-native/commit/76c99f20e39ef1b5fa93487bc8c82e7c6aede5dd) by [@yungsters](https://github.com/yungsters)) + +#### iOS specific + +- Performance improvement for loading cached images ([54f7eb3424](https://github.com/facebook/react-native/commit/54f7eb34243715a1d4bc821ccbadeec12486d22c) and [3a98318c91](https://github.com/facebook/react-native/commit/3a98318c91283a1bba35c0bca93b975d4a550330) by [@esamelson](https://github.com/esamelson) and others) + +### Fixed + +- Fix crash in **VirtualizedList** during pagination ([5803772017](https://github.com/facebook/react-native/commit/580377201793314ca643250c1bd7cf1c47d49920)) +- Fix polyfilling of **regeneratorRuntime** to avoid setting it to undefined in some situations ([2a7e02edf6](https://github.com/facebook/react-native/commit/2a7e02edf64c20410b2f95f35e313279545b40db) by [@rafeca](https://github.com/rafeca)) +- Fix **View**, **Text**, and **ActivityIndicator**'s `displayName` ([7a914fcef4](https://github.com/facebook/react-native/commit/7a914fcef4ae035221e1f984c104ba20430d6fad) and [53da585832](https://github.com/facebook/react-native/commit/53da5858326bbddd2df112f86b2c1e935adc3882) by [@rajivshah3](https://github.com/rajivshah3) and others) +- Fix crash that happens when a component throws an exception that contains a null message ([6debfdf6d6](https://github.com/facebook/react-native/commit/6debfdf6d6172cec2d87fd1e780c3b347d41dc1d) by [@mdvacca](https://github.com/mdvacca)) + +#### Android specific + +- Fix incorrect merged asset path with flavor for Android Gradle Plugin 3.2 ([e90319e9fa](https://github.com/facebook/react-native/commit/e90319e9fa18661144ad29faf36efba3750edb32) by [@yatatsu](https://github.com/yatatsu)) +- Fix crash in **ReadableNativeArray.getType** when size of ReadableNativeArray's length > 512 ([09c78fe968](https://github.com/facebook/react-native/commit/09c78fe968e1bb71108c4058e76ebf70178e5a8b) by [@dryganets](https://github.com/dryganets)) + +#### iOS specific + +- Fix crash in rapid use of **NetInfo.getCurrentConnectivity** ([67afaefa78](https://github.com/facebook/react-native/commit/67afaefa78c314b38249a7e2758e0af38c18f34a) by [@mmmulani](https://github.com/mmmulani)) +- Fix Xcode 10 errors relating to third-party ([277c19c93e](https://github.com/facebook/react-native/commit/277c19c93eacf3e3ce63f71236fd399214d6e6d0) by [@mmccartney](https://github.com/mmccartney)) +- Fix build errors when path to `$NODE_BINARY` contains spaces ([7d4e94edcc](https://github.com/facebook/react-native/commit/7d4e94edccfc2f642fcbd1d6aa00756f02e3a525) by [@sundbry](https://github.com/sundbry)) +- Fix case where content of inline views didn't get relaid out ([798517a267](https://github.com/facebook/react-native/commit/798517a267841675956cb52a1c0ae493a913962a) by [@rigdern](https://github.com/rigdern)) +- Fix **InputAccessoryView**'s safe area when not attached to a **TextInput** ([2191eecf54](https://github.com/facebook/react-native/commit/2191eecf54b5c4bf278dfaf23fec46d44ac9a1f0) by [@janicduplessis](https://github.com/janicduplessis)) + +## v0.57.4 + +**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.0-alpha.8af6728"` (next version, 0.57.5, will update to `16.6.0`, and it will come soon). Also, please check the _Known issues_ section below, especially if you are using Xcode 10. + +Thanks to everyone that contributed to the [discussion](https://github.com/react-native-community/react-native-releases/issues/48) for cherry-picking the commits that landed in this release, and the developers who submitted those commits! + +### Added: new features + +#### Android specific additions + +- Android textTransform style support ([22cf5dc566](https://github.com/facebook/react-native/commit/22cf5dc5660f19b16de3592ccae4c42cc16ace69) by Stephen Cook) + +### Changes: existing functionality that is now different + +- Add deprecation notice to SwipeableListView ([99471f87b9](https://github.com/facebook/react-native/commit/99471f87b944b26bbdaa0fb0881db91c1118b741) by [@TheSavior](https://github.com/TheSavior)) + +#### Android specific changes + +- Consolidate native dependencies versions ([ba608a2db7](https://github.com/facebook/react-native/commit/ba608a2db786a8e983a6e30b31662fac254286c0) by [@dulmandakh](https://github.com/dulmandakh)) +- bump okhttp3 to 3.11 ([10fc548809](https://github.com/facebook/react-native/commit/10fc548809cc08db209ae6696b723341925137d1) by [@dulmandakh](https://github.com/dulmandakh)) +- Android: Send `` metrics in onTextLayout events ([737f93705c](https://github.com/facebook/react-native/commit/737f93705ca8b5d3fdd207f870cf27adcf1e885b) by [@mmmulani](https://github.com/mmmulani)) +- Use TextLegend example in Android as well ([335927db44](https://github.com/facebook/react-native/commit/335927db44fe47e20db4503a1ab5fcf8d62144a8) by [@mmmulani](https://github.com/mmmulani)) + +#### iOS specific changes + +- Bump xcode@1.0.0 ([b9514995a2](https://github.com/facebook/react-native/commit/b9514995a26b4c3f6d555257740457dd4d6cfeae) by [@peat-psuwit](https://github.com/peat-psuwit)) +- Text: send metrics after rendering (iOS) ([737f93705c](https://github.com/facebook/react-native/commit/737f93705ca8b5d3fdd207f870cf27adcf1e885b) by [@mmmulani](https://github.com/mmmulani)) +- Allow specifying iOS version for run-ios with simulator option ([0fab27cbac](https://github.com/facebook/react-native/commit/0fab27cbaca57b90119ab36104af4d0b3052ae30) by [@elyalvarado](https://github.com/elyalvarado)) +- Relax the requirement that lazy module cannot be initialized on the main thread ([dbc864c9cd](https://github.com/facebook/react-native/commit/dbc864c9cd95f9df268d85a642742e84e2360db4) by [@spredolac](https://github.com/spredolac)) + +### Fixed: bugs that have been resolved + +- Fix crashes on invalid regex ([298f14da12](https://github.com/facebook/react-native/commit/298f14da1210460b3e25c6002e8d1aa5f7b4e0ef) by [@RSNara](https://github.com/RSNara)) +- Fix pull to refresh refresh component clipping on Android ([8a3a0ad2d0](https://github.com/facebook/react-native/commit/8a3a0ad2d0f894a3d8c1e403a9336dab17c2dde8) by Andy Huang) +- ListView requestAnimationFrame leak ([70b5eb3aa2](https://github.com/facebook/react-native/commit/70b5eb3aa27822fa11571c3d8d3628ecf03268ab) by [@exced](https://github.com/exced)) + +#### Android specific fixes + +- reverted [Update bad method](https://github.com/facebook/react-native/commit/1592a8d42411d1f91c8ceb738c0533c1cee73f71) +- Fix accessibility role crash ([1f96ff62cf](https://github.com/facebook/react-native/commit/1f96ff62cf786f93c91e6625bf2b819077902251) by Haseeb Saeed) +- Fix accessibilityRole value lookup ([1f96ff62cf](https://github.com/facebook/react-native/commit/1f96ff62cf786f93c91e6625bf2b819077902251) by [@ayc1](https://github.com/ayc1)) +- Fix DynamicFromMap object pool synchronization ([b0d68c0bb9](https://github.com/facebook/react-native/commit/b0d68c0bb971a44dfdf7722682933f1e96e1cd45) by [@haitaoli](https://github.com/haitaoli)) +- Back out "[react-native][pr] Rounded corner rendering fixed on Android N." ([bb407fa1ec](https://github.com/facebook/react-native/commit/bb407fa1ec0bd0367373961fdc0e840150840068) by Jonathan Lee) +- Fix onTextLayout metrics on Android when using alignText ([1c240ae898](https://github.com/facebook/react-native/commit/1c240ae898e26534b8d9a09a334dec02e96faa05) by [@mmmulani](https://github.com/mmmulani)) +- Cleaning up imports in ViewGroupManager ([082a869dae](https://github.com/facebook/react-native/commit/082a869daef3cf602a088d0418c185279052b8c3) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific fixes + +- Fix issue when inserting text at 0 when maxLength is set ([17415938c7](https://github.com/facebook/react-native/commit/17415938c7180a95811db949122b8ad24a442866) by [@ejanzer](https://github.com/ejanzer)) + +### Known issues + +There are a few issues that don't have a finalized solution (as it happens for 0.x projects). In particular: + +- when using Xcode 10 and `react-native init`, your build may fail due to third-party build steps ([#20774](https://github.com/facebook/react-native/issues/20774)). There is a [commit](https://github.com/facebook/react-native/commit/b44c5ae92eb08125d466cf151cb804dabfbbc690) we are planning to cherry pick in a future release that should help - in the meantime, you should be able to run these commands from the project folder to fix the issue (you should need to do it only once per project): + + ```bash + cd node_modules/react-native + scripts/ios-install-third-party.sh + cd third-party/glog-0.3.5/ + ../../scripts/ios-configure-glog.sh + ``` + +- React `16.6.0` works for the most part, aside from the Context API (check [this issue](https://github.com/facebook/react-native/issues/21975)) - and if you are eager to test the new React Hooks you will have to be patient, as they are not production ready and `16.7.alpha` is **not** yet [supported](https://github.com/facebook/react-native/issues/21967) by React Native. + +## v0.57.3 + +**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.0-alpha.8af6728"`. Also, please check the _Known issues_ section below, especially if you are using Xcode 10. + +Thanks to everyone that contributed to the [discussion](https://github.com/react-native-community/react-native-releases/issues/46) for cherry-picking the commits that landed in this release, and the developers who submitted those commits! + +### Added: new features + +- Expose enableBabelRuntime config param externally ([89a358f347](https://github.com/facebook/react-native/commit/89a358f34786198c8a9a2d379588efd57b6a0eec) by [@rafeca](https://github.com/rafeca)) + +#### Android specific additions + +- Add test for InterpolatorType ([b7526b2095](https://github.com/facebook/react-native/commit/b7526b2095e4a5c8641e8264786d1622d6390029) by [@ejanzer](https://github.com/ejanzer)) + +### Changes: existing functionality that is now different + +- React sync for revisions ade5e69...d836010 ([fa6035bda6](https://github.com/facebook/react-native/commit/7142e9b1c5f95e82ceb04798b166318385004147) by [@yungsters](https://github.com/yungsters)) +- React: Bump Canary Version ([8258b6a280](https://github.com/facebook/react-native/commit/8258b6a2801121bebb25272bfcc5d3da1fb5ae39) by [@yungsters](https://github.com/yungsters)) +- FBJS: Upgrade to ^1.0.0 ([ee034596fe](https://github.com/facebook/react-native/commit/ee034596fecfb47ff9e6e1fc30cefb0e970e7d80) by [@yungsters](https://github.com/yungsters)) +- Bump metro@0.48.1 ([bf47589b8b](https://github.com/facebook/react-native/commit/bf47589b8be145750e954d09684370463a616779) by [@rafeca](https://github.com/rafeca)) +- Update to Detox 9 ([15c05988e9](https://github.com/facebook/react-native/commit/15c05988e980118151bdf41ed82ebb8c8e30a0f3) by [@kelset](https://github.com/kelset)) +- Add Deprecation Warning to ListView ([e90f5fa263](https://github.com/facebook/react-native/commit/e90f5fa2630f8a89e15fa57c70ada83e75a20642) by [@TheSavior](https://github.com/TheSavior)) +- Deprecate legacyImplementation of FlatList ([3aa8f09b44](https://github.com/facebook/react-native/commit/3aa8f09b4437eab8b91429b7325f8a6173ffa49a) by [@TheSavior](https://github.com/TheSavior)) + +#### Android specific changes + +- bump Android NDK to r17c ([436cf154bb](https://github.com/facebook/react-native/commit/436cf154bb9cf4fc0bcafd7115d33544ce36b759) by [@dulmandakh](https://github.com/dulmandakh)) +- Resolve protocol http, https when not in lowercase ([d00bdb9bb8](https://github.com/facebook/react-native/commit/d00bdb9bb8b9b11bce900689c7e28cebd2eb0807) by [@hyunjongL](https://github.com/hyunjongL)) +- Normalize scheme for URL on Android ([4b6f02ea75](https://github.com/facebook/react-native/commit/4b6f02ea758a9ab5853a29ebfc054eaa98e6dc53) by [@radeno](https://github.com/radeno)) + +#### iOS specific changes + +- Bump up the buffer size and show a warning if the trace might be truncated ([1fc8a46570](https://github.com/facebook/react-native/commit/1fc8a46570561a32657ffccb0f5a12c6f4d6a3dd) by [@alexeylang](https://github.com/alexeylang)) + +### Fixed: bugs that have been resolved + +- Fix deprecation warning message in Switch ([997f382adc](https://github.com/facebook/react-native/commit/997f382adcc7f82fccd97ac671d13e86aef7171e) by [@radko93](https://github.com/radko93)) + +#### Android specific fixes + +- Fix default accessibility delegate ([fa6035bda6](https://github.com/facebook/react-native/commit/fa6035bda6c606868977179534cb941f26fbdb92) by [@ayc1](https://github.com/ayc1)) +- Fix accessibility role/label ([fa6035bda6](https://github.com/facebook/react-native/commit/fa6035bda6c606868977179534cb941f26fbdb92) by [@ayc1](https://github.com/ayc1)) +- When converting arguments JS->Java, handle integers correctly ([bb9b9a8b9d](https://github.com/facebook/react-native/commit/bb9b9a8b9d5868c7ab5034117b785943496f6405) by [@mhorowitz](https://github.com/mhorowitz)) +- Fix CameraRoll.getPhotos() crash on Android if device has a problematic video asset ([4768bea0cf](https://github.com/facebook/react-native/commit/4768bea0cf288cf9c8097fc498b896610728c645) by [@naxel](https://github.com/naxel)) +- Android ScrollView fix for snapToInterval not snapping to end ([6eeff75849](https://github.com/facebook/react-native/commit/6eeff75849c9b8bf91592c1b7906b4dab8fba518) by [@olegbl](https://github.com/olegbl)) +- Fix for InterpolatorType crash ([01a1004808](https://github.com/facebook/react-native/commit/01a1004808928e29a6d6c698b3b18312fed17a02) by [@ejanzer](https://github.com/ejanzer)) +- Update bad method ([1592a8d424](https://github.com/facebook/react-native/commit/1592a8d42411d1f91c8ceb738c0533c1cee73f71) by [@grabbou](https://github.com/grabbou)) + +#### iOS specific fixes + +- Dealloc first time RCTNetInfo reachability callback ([e7e63fd409](https://github.com/facebook/react-native/commit/e7e63fd4092a81beec482fc48d05f1a048801037) by [@mmmulani](https://github.com/mmmulani)) +- iOS: fix the baseline issue when displaying a mixture of different-language characters ([c1561ab441](https://github.com/facebook/react-native/commit/c1561ab4411854bef96b5d268d38002a013d6d3e) by [@BingBingL](https://github.com/BingBingL)) +- Fix artifacting on RN-drawn borders with asymmetric radii ([9e6522374b](https://github.com/facebook/react-native/commit/9e6522374bc605bb1a92ff02842878ace35e9f3d) by [@jamesreggio](https://github.com/jamesreggio)) +- check isAvailable key on simulator object ([1031872784](https://github.com/facebook/react-native/commit/1031872784e9373082797e5bf5c815816af2105b) by [@antonychan](https://github.com/antonychan)) +- ios-simulator: change default iphone version ([6d09df5b72](https://github.com/facebook/react-native/commit/6d09df5b726ac951417b87a49bc345ebc9142951) by Vitor Capretz) + +### Known issues + +There are a few issues that don't have a finalized solution. In particular, when using Xcode 10 and `react-native init`, your build may fail due to third-party build steps ([#20774](https://github.com/facebook/react-native/issues/20774)). There is an open pull request which we are testing and hope to land soon ([#21458](https://github.com/facebook/react-native/pull/21458)). In the meantime, you can find a workaround here: [https://github.com/facebook/react-native/issues/20774](https://github.com/facebook/react-native/issues/20774). + +## v0.57.2 + +Thanks to everyone that contributed to the [discussion](https://github.com/react-native-community/react-native-releases/issues/45) for cherry-picking the commits that landed in this release, and the developers who submitted those commits! + +### Added: new features + +#### Android specific additions + +- Android subpixel text ([65e4e674fc](https://github.com/facebook/react-native/commit/65e4e674fca7127fd7800ae011cab449561f475b) by [@kevinresol](https://github.com/kevinresol)) + +### Changes: existing functionality that is now different + +- ReactScrollView should account for `overflow: scroll` ([201f2f189f](https://github.com/facebook/react-native/commit/201f2f189f2c41092397e5457eda83b0764ee4cd) by [@mcolotto](https://github.com/mcolotto)) +- bump metro 0.47.0 ([4750f52b34](https://github.com/facebook/react-native/commit/4750f52b34f524cae8ca08fcacec063c0725e4de) by [@rafeca](https://github.com/rafeca)) +- Use babel runtime instead of relying on global babelHelpers and regenerator ([36033bd0ed](https://github.com/facebook/react-native/commit/36033bd0edecd20fe2ae5edd56408bcc134378e7) by [@janicduplessis](https://github.com/janicduplessis)) +- React: Upgrade to react-devtools@^3.4.0 ([25119f95c8](https://github.com/facebook/react-native/commit/25119f95c81039761dd505c216c1e499003c6294) by [@yungsters](https://github.com/yungsters)) +- Change new Date() to Date.now() to save on date allocations ([bbb2d9a5b3](https://github.com/facebook/react-native/commit/bbb2d9a5b358bc0c150fe6ff74c45594c987e949) by [@dulinriley](https://github.com/dulinriley)) +- Make config object read-only ([2c1057062e](https://github.com/facebook/react-native/commit/2c1057062e81f8b43d3f942a35371fb3db841bed) by [@rafeca](https://github.com/rafeca)) +- Cleanup the transformer flow types ([28dedfb6d6](https://github.com/facebook/react-native/commit/28dedfb6d61e64a50d78aa06ee4f744665a54c2a) by [@rafeca](https://github.com/rafeca)) +- bump metro 0.47.1 ([12ab08a5aa](https://github.com/facebook/react-native/commit/12ab08a5aab3e14c9b2fb35454b16708b8ce093d) by [@rafeca](https://github.com/rafeca)) + +#### Android specific changes + +- Android ScrollView support for `overflow: visible` ([4af4da9089](https://github.com/facebook/react-native/commit/4af4da9089e20aa84bc5660bfb37763556442a4e) by [@olegbl](https://github.com/olegbl)) +- Expose a getter for overflow setting in ReactViewGroup ([02ad56f541](https://github.com/facebook/react-native/commit/02ad56f5419675572d684c3cc8a28644f29afffa) by [@kmagiera](https://github.com/kmagiera)) +- Add workaround for Android Gradle Plugin 3.2 change to asset dir ([ff084a4e80](https://github.com/facebook/react-native/commit/ff084a4e8071adb4ff6198b32aa8a7e8e29cca1c) by [@edilaic](https://github.com/edilaic)) + +### Fixed: bugs that have been resolved + +- Fix HEAD request failing with `Invalid response for blob` ([7e9c3f77cc](https://github.com/facebook/react-native/commit/7e9c3f77cce881dbb47af266993da5a2b6e98b5b) by [@anthonyhumphreys](https://github.com/anthonyhumphreys)) +- Check if child view != null before dropping ([af181fb192](https://github.com/facebook/react-native/commit/af181fb192c83e1dd0575c24e38d8814bbf187d6) by [@chrusart](https://github.com/chrusart)) + +#### Android specific fixes + +- Fix event handlers for DPad arrows on Android TV ([4d71b1525d](https://github.com/facebook/react-native/commit/4d71b1525d357a61a1740d6de5c1b97b6527f986) by [@krzysztofciombor](https://github.com/krzysztofciombor)) +- Rounded corner rendering fixed on Android N ([748cf82c97](https://github.com/facebook/react-native/commit/748cf82c974d6cf5d5df64b6e6013211c870530c) by [@dryganets](https://github.com/dryganets)) +- Android: fix cookies lost on Android 5.0 and above ([ea53727e16](https://github.com/facebook/react-native/commit/ea53727e16223d412fcbba49df79cc68b39f5d93) by chenwenyu) +- allow zero offset when shadow radius is nonzero ([97f0e43710](https://github.com/facebook/react-native/commit/97f0e43710a990c30e14d66bf67c7d612377d3f2) by Timothy Kukulski) +- Android ScrollView fix for pagingEnabled ([e0170a9445](https://github.com/facebook/react-native/commit/e0170a944501bb487e899b92363bf5aa64b29299) by [@olegbl](https://github.com/olegbl)) + +### Removed: features that have been removed; these are breaking + +- Remove global babelHelpers and regenerator ([458d56c0a1](https://github.com/facebook/react-native/commit/458d56c0a1ac73c088660830a8bf2db65de7d9a2) by [@janicduplessis](https://github.com/janicduplessis)) +- Remove overflow hidden killswitch ([59aada873e](https://github.com/facebook/react-native/commit/59aada873e13bf0b1f5e3a10cfe9a5a45c28f9fb) by [@ayc1](https://github.com/ayc1)) +- Remove absolute path parameter from transformers ([2e0d5c87e9](https://github.com/facebook/react-native/commit/2e0d5c87e93bb970ef1c8864ca44b47b36d6ae2e) by [@rafeca](https://github.com/rafeca)) + +## v0.57.1 + +We are trying, for 0.57, to approach it as a version with a longer "support", while waiting for some features to land that will allow for [0.58 to be cut](https://github.com/react-native-community/react-native-releases/issues/41). + +Thanks to everyone that contributed to the [discussion](https://github.com/react-native-community/react-native-releases/issues/34) for cherry-picking the commits that landed in this release, and the developers who submitted those commits! + +### Added: new features + +- Expose AllowFileAccess property in WebView ([0c576ef84a](https://github.com/facebook/react-native/commit/0c576ef84a1c7f79b228f205cc687ab1b945bda1) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific additions + +- Expose scrollEnabled as iOS prop for TextInput ([b9c28c236b](https://github.com/facebook/react-native/commit/b9c28c236bc971a5fbc51a3bda09c3980d547b96) by Chun Chen) + +### Changes: existing functionality that is now different + +- Give RNPM the ability to look for plugins in `@Scoped` modules ([4b106be477](https://github.com/facebook/react-native/commit/4b106be47765dd391f7a4cc6cf0e705ae977b90a) by [empyrical](https://github.com/empyrical)) +- Upgrade babel-eslint to 9.0.0 ([44dc283bcd](https://github.com/facebook/react-native/commit/44dc283bcd0a75826d9be86cdc727e32d5697ef2) by [@rafeca](https://github.com/rafeca)) +- bump metro 0.45.6 ([7bac0565e8](https://github.com/facebook/react-native/commit/7bac0565e82981d4a6e2b500d376ba9fa8aba721) by [@rafeca](https://github.com/rafeca)) + +#### iOS specific changes + +- Making RCTIsIPhoneX() return true for the R and Max models ([5e7c3ca005](https://github.com/facebook/react-native/commit/5e7c3ca0057f6084d692e30ae4db863fb20968ff) by [@shergin](https://github.com/shergin)) +- Way to register RCT_MODULE in Plugin2.0 instead of +load ([5c160e5ded](https://github.com/facebook/react-native/commit/5c160e5dedae713c686d88d4b9d4308b596e68a7) by Jeff Thomas) +- Update RCTLinkingManager.h to explicitly state the 'nullability' of parameters ([2271d1f912](https://github.com/facebook/react-native/commit/2271d1f912435eba7da2414ea4665ba8e56c7ad7) by Warren Knox) + +### Fixed: bugs that have been resolved + +- Pass the maxWorkers config param correctly to Metro ([7a69f1aa27](https://github.com/facebook/react-native/commit/7a69f1aa272a9b71755033a80f6f4aa5e9dcbaf6) by [@rafeca](https://github.com/rafeca)) +- Fix ignored --projectRoot/watchFolders arguments (([9fca769e76](https://github.com/facebook/react-native/commit/9fca769e7666df696299b422c140d6509e726ec6) by [@oblador](https://github.com/oblador)) +- Debug only code were leaking into release builds on iOS. (([d1ff0b0cc5](https://github.com/facebook/react-native/commit/d1ff0b0cc51c31cae89689b2ad2f4b35f29531d8) by [@dryganets](https://github.com/dryganets)) + +#### iOS specific fixes + +- Fix RCTNetInfo first time connection status ([e7e63fd409](https://github.com/facebook/react-native/commit/e7e63fd4092a81beec482fc48d05f1a048801037) by [@karanjthakkar](https://github.com/karanjthakkar)) + +### Removed: features that have been removed; these are breaking + +#### iOS specific removals + +- Removing development team from Xcode project ([8103c431c8](https://github.com/facebook/react-native/commit/8103c431c897c02d47cfad1e71bb2e6ddaabbdc0) by [@hramos](https://github.com/hramos)) + +## v0.57.0 + +Welcome to the 0.57 release of React Native! This release addresses a number of issues and has some exciting improvements. We again skipped a monthly release, focused on quality by extending the release candidate phase, and let some upstream packages reach stable for inclusion. + +This release includes [599 commits by 73 different contributors](https://github.com/facebook/react-native/compare/0.56-stable...0.57-stable)! In response to feedback, we've prepared a changelog that contains only user-impacting changes. Please share your input and let us know how we can make this even more useful, and as always [let us know](https://github.com/react-native-community/react-native-releases/issues/34) if you have any feedback on this process. + +### Highlights + +#### New features + +- Accessibility APIs now support accessibility hints, inverted colors, and easier usage of defining the element's role and states; read more at [@ziqichen6's excellent blog post](https://reactnative.dev/blog/2018/08/13/react-native-accessibility-updates) +- On iOS, `WKWebView` can now be used within the `WebView` component; read more at [@rsnara's awesome blog post](https://reactnative.dev/blog/2018/08/27/wkwebview) +- Better support for out-of-tree platforms. For details, please refer to [the discussion](https://github.com/react-native-community/discussions-and-proposals/issues/21) that the community used to get this up and running (there will be a new page in the docs dedicated to it too) - huge props to @empyrical for working on this! + +#### Tooling updates + +- Android tooling has been updated to match newer configuration requirements (SDK 27, gradle 4.4, and support library 27); building with Android plugin 3.2 doesn't work due to the gradle scripts, so **please** stay on Android Studio 3.1 for now +- Support Babel 7 stable landed! Be sure to read [here](https://blogs.msdn.microsoft.com/typescript/2018/08/27/typescript-and-babel-7/) about using TypeScript and check out the [Babel 7 migration guide](https://babeljs.io/docs/en/next/v7-migration) for help migrating. +- Metro has been upgraded (with Babel 7 and better transformer support), and in the next major release we plan on having two new features (ram bundles and inline requires) optional for you all to use - you can read how it will happen [here](https://github.com/react-native-community/discussions-and-proposals/blob/master/core-meetings/2018-09-metro-meeting.md); moreover, if you have a custom packager config, we recommend you read also the "updating to this version" section. +- Flow, React, and related packages have also been updated; this includes [working support](https://github.com/facebook/react-native/commit/5491c3f942430982ce9cb6140ed1733879ed3d1d) for the [React Profiler](https://react.dev/blog/2018/09/10/introducing-the-react-profiler.html). + +#### The Slimmening is happening + +As mentioned a few times in the past, the core team is reviewing the repository to trim it to the base React Native features in order to make the whole ecosystem more maintainable (by using a _divide-et-impera_ approach, the community will move faster and enable pull requests to be reviewed and merged quicker). This change requires extracting some components into their own separate repos and removing old, unused code ([details here](https://github.com/react-native-community/discussions-and-proposals/issues/6)). + +0.57 is **not** directly affected by any changes, but we want you to know that: + +- `WebView` will be moved to its own repo at [react-native-community/react-native-webview](https://github.com/react-native-community/react-native-webview). There is already a base implementation there. Help us out by giving that a try, and expect that `WebView` will be deprecated soon +- `NavigatorIOS` will be **fully** removed from the main codebase starting 0.58.0 (via [this commit](https://github.com/facebook/react-native/commit/0df92afc1caf96100013935d50bdde359b688658)); it is now deprecated + +### Updating to this version + +1. Upgrade the version of React Native in the `package.json` from `0.56.0` to `0.57.0`, and the React version to `16.5` +2. Change the babel-preset dependency from `"babel-preset-react-native": "^5",` to `"metro-react-native-babel-preset": "^0.45.0",`, then change the `.babelrc` configuration to: + + ```JSON + { + "presets": ["module:metro-react-native-babel-preset"] + } + ``` + +3. Ensure that you have all the babel dependencies to version `^7.0.0` (you may also need to add `"babel-core": "7.0.0-bridge.0"` as a yarn resolution to ensure retro-compatibility). The Babel team has released a tool, [babel-upgrade](https://github.com/babel/babel-upgrade), that should help you in this migration. +4. Upgrading android gradle version to 4.4 + 1. In your project's `android/gradle/wrapper/gradle-wrapper.properties` file, change the `distributionUrl` to `https\://services.gradle.org/distributions/gradle-4.4-all.zip` + 2. In `android/build.gradle` file add `google()` right above `jcenter()` in both `buildscript` and `allprojects` repositories. Then change Android build tools to version 3.1.4 `classpath 'com.android.tools.build:gradle:3.1.4'` + 3. In `android/app/build.gradle` file update all your `compile` statements to be `implementation`, e.g. `implementation 'com.facebook.fresco:animated-gif:1.10.0'` + 4. Do note that when running your app from within Android Studio, you may encounter `Missing Byte Code` errors. This is due to [a known issue](https://issuetracker.google.com/issues/72811718) with version 3.1.x of the android tools plugin. You'll need to disable Instant Run to get past this error. +5. If you have a custom packager configuration via `rn-cli.config.js`, you probably need to update it to work with the updated Metro configuration structure (for full detail refer to Metro's [documentation](https://facebook.github.io/metro/docs/en/configuration)); here are some commonly encountered changes to `rn-cli.config.js`: + + ```diff + -const blacklist = require('metro/src/blacklist') + +const blacklist = require('metro-config/src/defaults/blacklist') + + // ... + + module.exports = { + + watchFolders: alternateRoots, + + resolver: { + + blacklistRE: blacklist + + }, + + transformer: { + + babelTransformerPath: require.resolve('./scripts/transformer.js'), + + }, + - getProjectRoots() { + - return [ + - path.resolve(__dirname), + - ].concat(alternateRoots) + - }, + - getBlacklistRE() { + - return blacklist; + - }, + - transformModulePath: require.resolve('./scripts/transformer.js'), + } + ``` + +6. Run `yarn` to ensure that all the new dependencies have been installed + +### Added: new features + +- Add .nvmrc and ensure node version required is compatible with ESLint 5 ([30b9d81087](https://github.com/facebook/react-native/commit/30b9d81087cb86f5fb272d00bfee63a0632009f5) by [@slorber](https://github.com/slorber)) +- Major improvements to accessibility features ([48b3d1322b](https://github.com/facebook/react-native/commit/48b3d1322b884f62eb5aeb36136bcd76c502e42d), [b5b704dc19](https://github.com/facebook/react-native/commit/b5b704dc19b80a1909d66adcd617220a98c7aace), [c36e8b3307](https://github.com/facebook/react-native/commit/c36e8b3307295690cddf74e3a41ca0ac11ac4c6b), [40f6998b67](https://github.com/facebook/react-native/commit/40f6998b6766e8aa3c038a1416e5c62cbafca109), [c1d0ccde0f](https://github.com/facebook/react-native/commit/c1d0ccde0f6f8615fce077ef7ee0867a14ca0fb7), [5eaa2d29c0](https://github.com/facebook/react-native/commit/5eaa2d29c0c4c633a40f7241408737c754edea84), [10b603fdd3](https://github.com/facebook/react-native/commit/10b603fdd34919f72304720c25d1420668a6213a), [d9eeae91a0](https://github.com/facebook/react-native/commit/d9eeae91a08123c3a458704869acd6f637fc4c53), [3cfa7ae698](https://github.com/facebook/react-native/commit/3cfa7ae69847cc3b687930346016b248f2427864), [5acb7211bb](https://github.com/facebook/react-native/commit/5acb7211bb211e0ef48334630ddccbb3f0ffa2da), [5741f77156](https://github.com/facebook/react-native/commit/5741f771562962110e105114a2c65def4baa805b), [d0b86ecb4f](https://github.com/facebook/react-native/commit/d0b86ecb4f33d6b10a99062f050a4d659db4ddfc), [e739143809](https://github.com/facebook/react-native/commit/e7391438093cd5dd5033204cdce62e66509e66e1), [c27b495a89](https://github.com/facebook/react-native/commit/c27b495a89e71ff13959eb4c34605a527514fa1e), [5aa040dfb7](https://github.com/facebook/react-native/commit/5aa040dfb780c09a6efa5d3072232dea775d432f), [03036f79f7](https://github.com/facebook/react-native/commit/03036f79f7b062ae11015b33cca3dd7e4e67dda6), [3bedc78a35](https://github.com/facebook/react-native/commit/3bedc78a35b9efc259299744f4134ac0e880d1ea), [ca01290d8e](https://github.com/facebook/react-native/commit/ca01290d8e8fe73494f317ed9f81d339e65fdea0), [121e2e5ca6](https://github.com/facebook/react-native/commit/121e2e5ca6cdb17051c6d8072072f7f480ac2015), [1bc52267f5](https://github.com/facebook/react-native/commit/1bc52267f504eb02c8744c380fa2de878b0ab79f), [48b3d1322b](https://github.com/facebook/react-native/commit/48b3d1322b884f62eb5aeb36136bcd76c502e42d), [ef3d8b23c3](https://github.com/facebook/react-native/commit/ef3d8b23c35246d4e088d532c41723e06b688f1b), [ef3d8b23c3](https://github.com/facebook/react-native/commit/ef3d8b23c35246d4e088d532c41723e06b688f1b), [50e400128e](https://github.com/facebook/react-native/commit/50e400128eba554af5de4ca267430524e3eff107), and [f39d0923c7](https://github.com/facebook/react-native/commit/f39d0923c78686118a5d268c0e659d2608d28df0) by [@ziqichen6](https://github.com/ziqichen6)) +- Add `YogaNodeProperties` implementation based on `ByteBuffer` ([0c97e75dfe](https://github.com/facebook/react-native/commit/0c97e75dfeec831abb6cb39889309d8299cdce9f) and [23657ccf5b](https://github.com/facebook/react-native/commit/23657ccf5bcab6c511903660b3c617c3b8248f20) by [@davidaurelio](https://github.com/davidaurelio)) +- Add `FlatList` and `SectionList` to Animated exports ([daa7c78055](https://github.com/facebook/react-native/commit/daa7c78055857cd2d9ea650de0c4b0f72d3f2acf) by [@yunyu](https://github.com/yunyu)) +- Adding new styling props to `FlatList`/`VirtualizedList` for `ListHeaderComponent` and `ListFooterComponent` ([a2675ced4e](https://github.com/facebook/react-native/commit/a2675ced4efe0df7745bf38908efa41d4d7a9841)) +- Added more info to Module Registry systraces ([c7fdd2701f](https://github.com/facebook/react-native/commit/c7fdd2701f7edc1a771a04c890da4d742dca6ffb) by [@axe-fb](https://github.com/axe-fb)) +- Added support for out-of-tree platform plugins via a new `haste` field in `package.json`; read more in the [docs entry](https://reactnative.dev/docs/out-of-tree-platforms) ([03476a225e](https://github.com/facebook/react-native/commit/03476a225e012a0285650780430d64fc79674f0f) by [@empyrical](https://github.com/empyrical)) +- Added `snapToOffsets` to `ScrollView` and made a number of fixes to `snapToInterval` as well ([fd744dd56c](https://github.com/facebook/react-native/commit/fd744dd56ca183933a67e8398e1d20da14a31aab) by [@olegbl](https://github.com/olegbl)) + +#### Android specific additions + +- Allow registering custom packager command handlers ([b3ef1c3a56](https://github.com/facebook/react-native/commit/b3ef1c3a5645793ef42d25bb16ef023a743a1f9f) by [@fkgozali](https://github.com/fkgozali)) +- Implement `AccessibilityInfo.setAccessibilityFocus` for Android ([be715ec705](https://github.com/facebook/react-native/commit/be715ec7053a77fa6c9087990a493d17c1155de2) by [@draperunner](https://github.com/draperunner)) +- Add Support for `overflow` style property ([b81c8b51fc](https://github.com/facebook/react-native/commit/b81c8b51fc6fe3c2dece72e3fe500e175613c5d4) and [bbdc12eda7](https://github.com/facebook/react-native/commit/bbdc12eda7dec135799b7f4c41fe678180970dd2)by [@yungsters](https://github.com/yungsters)) + +#### iOS specific additions + +- `WebView` can now use `WKWebView` internally if you pass `useWebKit={true}` ([7062e5bdb5](https://github.com/facebook/react-native/commit/7062e5bdb5582bb21d1ef890965f08cc20d292b7), [1442c265da](https://github.com/facebook/react-native/commit/1442c265da36601114ce184cd5bc322f45dc1b44), [3703927e7e](https://github.com/facebook/react-native/commit/3703927e7e12ffc8922644ea251cd6f7a384570c), [7a6dd9807c](https://github.com/facebook/react-native/commit/7a6dd9807cda45c2d60641864f2d6c8d401e8ae3), [e5f95aba9b](https://github.com/facebook/react-native/commit/e5f95aba9b23376de498456282ad17113ef44cd9), [1741fe9571](https://github.com/facebook/react-native/commit/1741fe95710556f30dc2442aaaae23e31dad4cc0), [90e85a4adc](https://github.com/facebook/react-native/commit/90e85a4adc749666f81034119f281ac54840e7df), [0022354525](https://github.com/facebook/react-native/commit/0022354525eae0a368704da65c9d0f85f33ba5fb), [03b57d9db6](https://github.com/facebook/react-native/commit/03b57d9db6509fa3e715f23c8270caf6ca091acd), [1584108805](https://github.com/facebook/react-native/commit/1584108805ca6c8eff7a77e15c8553028665b53f), [a997c0ac16](https://github.com/facebook/react-native/commit/a997c0ac16d8863333d057269a8b5e28994b84eb), [4ca949b46e](https://github.com/facebook/react-native/commit/4ca949b46ec8fd72b5305daa06fac3ef58a8fa5f), [721763020a](https://github.com/facebook/react-native/commit/721763020a4a7b4b3cad1a9c074ec2e51a8d840b), [1af17f1648](https://github.com/facebook/react-native/commit/1af17f164828b6d6fa0450af46baf945745363e7), [215fa14efc](https://github.com/facebook/react-native/commit/215fa14efc2a817c7e038075163491c8d21526fd), [bacfd92976](https://github.com/facebook/react-native/commit/bacfd9297657569006bab2b1f024ad1f289b1b27), [95801f1eda](https://github.com/facebook/react-native/commit/95801f1eda2d723d9b87760d88fa9f1a1bb33ab1), [b18fddadfe](https://github.com/facebook/react-native/commit/b18fddadfeae5512690a0a059a4fa80c864f43a3), [28b058c341](https://github.com/facebook/react-native/commit/28b058c341690bd35e1d59885762ec29614a3d45), and [78fcf7c559](https://github.com/facebook/react-native/commit/78fcf7c5598ce7f5d0d62110eb34fe5a4b962e71) by [@rsnara](https://github.com/rsnara)) +- Add `accessibilityHint` for iOS ([253b29dbd8](https://github.com/facebook/react-native/commit/253b29dbd8ddb11824866e423c00a4a68bb856f3) by [@draperunner](https://github.com/draperunner)) + +### Changes: existing functionality that is now different + +- _[BREAKING]_ In the CLI, `unbundle` is now `ram-bundle` ([ebf5aeab28](https://github.com/facebook/react-native/commit/ebf5aeab280f2ebc439ec39d25c48fdf1980cf73) by [@jeanlauliac](https://github.com/jeanlauliac)) +- Bump minimum Node version to 8.3 (#20236) ([e64e13fce3](https://github.com/facebook/react-native/commit/e64e13fce394332ce609f0def35fa573f30138e9) by [@hramos](https://github.com/hramos)) +- Updated React ([70913a4623](https://github.com/facebook/react-native/commit/70913a4623c53db8a0db578eec30cad8671f8319), [b7bb25fe4c](https://github.com/facebook/react-native/commit/b7bb25fe4c1bfbedb5b8c75725721cf901dc54b0), and [672528ffde](https://github.com/facebook/react-native/commit/672528ffde3b467ccdfd6b1ce0352f150b20c922) by [@acdlite](https://github.com/acdlite), [@hramos](https://github.com/hramos), and [@yungsters](https://github.com/yungsters)) +- Upgrade Flow to v0.76.0 ([eac34e3021](https://github.com/facebook/react-native/commit/eac34e30215d88b5fe9056f9678275b894032636) by [@gabelevi](https://github.com/gabelevi)) +- Upgrade jest to 23.4.1 ([51cf9eb3e8](https://github.com/facebook/react-native/commit/51cf9eb3e823a13304570b352b81734f069c18c3) by [@rafeca](https://github.com/rafeca)) +- Upgrade babel-eslint to v9.0.0-beta.2 with better support for Flow ([abf1188de2](https://github.com/facebook/react-native/commit/abf1188de225e4b7d36ecbad316af92ca29c85c2) by [@rubennorte](https://github.com/rubennorte)) +- Upgrade ESLint to 5.1.0 ([0f2f0cad41](https://github.com/facebook/react-native/commit/0f2f0cad41f632d1dbb0c676d5edea5db62eb01c) by [@rubennorte](https://github.com/rubennorte)) +- Upgrade Babel to v7.0.0 ([b9d1c832b0](https://github.com/facebook/react-native/commit/b9d1c832b0bb7161bcec48d655e878af609b8350), [724c7498b6](https://github.com/facebook/react-native/commit/724c7498b6f10f6fd03eb217160508001fb1c5b3) by Peter van der Zee, and [bf8e1b4ffa](https://github.com/facebook/react-native/commit/bf8e1b4ffab4958587efdf3ce97e4ebdd887a20c) by [@rubennorte](https://github.com/rubennorte) and [@rafeca](https://github.com/rafeca)) +- Metro is now at v0.45.0 ([169d6839bb](https://github.com/facebook/react-native/commit/169d6839bb32d0149036ab1641d13318c0eb6f9d), [bda84a32d0](https://github.com/facebook/react-native/commit/bda84a32d08d6de3849d6afac4cbbf309837b676), [877212e18c](https://github.com/facebook/react-native/commit/877212e18c86905feda9faa1b2508c0c39396227), [169812f9ce](https://github.com/facebook/react-native/commit/169812f9ce60317dd7320384007879be16278678), [cfeb60c19b](https://github.com/facebook/react-native/commit/cfeb60c19bd23e683f1809f6535439c81e8ed166) by [@CompuIves](https://github.com/CompuIves) and [@rafeca](https://github.com/rafeca)) +- Hide pre-bundled notification when not on dev mode ([edf71005b5](https://github.com/facebook/react-native/commit/edf71005b5a4d7cfb09eae14f5765d30b9c5704e) by [@yancouto](https://github.com/yancouto)) +- Refined `StyleSheet.compose` Flow Type ([50a481d23a](https://github.com/facebook/react-native/commit/50a481d23ae72a434849d2c85007e411b0c2bb1f) by [@yungsters](https://github.com/yungsters)) +- Catch JS bundle load failure and prevent calls to JS after that ([201ba8c69d](https://github.com/facebook/react-native/commit/201ba8c69d2defc284a04acadcd13df001028ada) by [@fkgozali](https://github.com/fkgozali)) +- Use new Metro configuration in react-native cli ([a32620dc3b](https://github.com/facebook/react-native/commit/a32620dc3b7a0ebd53feeaf7794051705d80f49e) and [aaf797ad67](https://github.com/facebook/react-native/commit/aaf797ad67b965f64450b199c554c65ad8dad351) by [@CompuIves](https://github.com/CompuIves)) +- Whitelist `react-native-dom` in haste/cli config defaults ([c4bcca6685](https://github.com/facebook/react-native/commit/c4bcca66853cd231486de61f11cbcec42427b7b2) by [@vincentriemer](https://github.com/vincentriemer)) +- In the CLI, don't override `metro.config.js` settings ([c5297c75cb](https://github.com/facebook/react-native/commit/c5297c75cb6da58a241c8f91b0d2fefbc5835a46) by [@rozele](https://github.com/rozele)) + +#### Breaking Changes + +- Public methods of Image (`blur`, `focus`, `measure`, `measureInWindow`, `measureLayout`, `setNativeProps`) are no longer bound to the image component instance. Therefore, it is unsafe to pass these methods by reference (i.e: as callbacks) to functions. So, things like `setTimeout(this._imgRef.focus, 1000)` will no longer work. Please instead do: `setTimout(() => this._imgRef.focus(), 1000)`. + +#### Android specific changes + +- `Image` source without a uri now returns null ([28c7ccf785](https://github.com/facebook/react-native/commit/28c7ccf785132458fce32c234ce777a6fe475c93) by [@himabindugadupudi](https://github.com/himabindugadupudi)) +- `targetSdkVersion` is 26 ([bfb68c09ee](https://github.com/facebook/react-native/commit/bfb68c09ee88c6e1d91d3b54c01746f9a98c7c6c) by [@dulmandakh](https://github.com/dulmandakh)) +- Upgrade NDK to r17b ([6117a6c720](https://github.com/facebook/react-native/commit/6117a6c7205c969f93d39ba02e0583881572d5fa) by [@dulmandakh](https://github.com/dulmandakh)) +- Upgrade NDK toolchain to 4.9 ([ccdd450b12](https://github.com/facebook/react-native/commit/ccdd450b1284b73bee80a9709c864816cbfc1108) by [@dulmandakh](https://github.com/dulmandakh)) +- Upgrade Android Support Library to version 27.1.1 and set compileSdkVersion to 27; buildToolsVersion comes along for the ride, too ([874cca1ac2](https://github.com/facebook/react-native/commit/874cca1ac258ec224bade999722d7a34c307def0) and [044b399e65](https://github.com/facebook/react-native/commit/044b399e6590d84065a9b186750f77bc9d851aac) by [@dulmandakh](https://github.com/dulmandakh)) +- Upgrade Android gradle plugin to 3.1.4, Gradle wrapper to 4.4 ([6e356895e7](https://github.com/facebook/react-native/commit/6e356895e79fb92640295a14483af1a430732247) and [33d20da41b](https://github.com/facebook/react-native/commit/33d20da41b814a2fb9ba02cbab8b61a819cad95b) by [@gengjiawen](https://github.com/gengjiawen) and [@dulmandakh](https://github.com/dulmandakh)) +- Upgrade to soloader 0.5.1 ([b6f2aad9c0](https://github.com/facebook/react-native/commit/b6f2aad9c0119d11e52978ff3fa9c6f269f04a14) by [@gengjiawen](https://github.com/gengjiawen)) +- Upgrade mockito to 2.19.1 ([3ea803a814](https://github.com/facebook/react-native/commit/3ea803a814f43edb3ec256dd85d778c652ca99d1) by [@dulmandakh](https://github.com/dulmandakh)) +- Upgrade glog to 0.3.5 ([b5fca80605](https://github.com/facebook/react-native/commit/b5fca806059e628edb504cb1bacf62e89ee6f102) by [@dulmandakh](https://github.com/dulmandakh)) + +### Fixed: bugs that have been resolved + +- Fixed builds on Windows machines ([3ac86c366c](https://github.com/facebook/react-native/commit/3ac86c366c91f8d62f0128057019b94a783b4249) by [@rafeca](https://github.com/rafeca)) +- Fixed building tvOS ([1f1ddd0261](https://github.com/facebook/react-native/commit/1f1ddd0261762bdeff3e747250400b208b18839b)) +- Fixed `TextInputState`'s `currentlyFocusedField()` ([b4b594cec1](https://github.com/facebook/react-native/commit/b4b594cec1d91c38faac11a90a787ae692e35296) by [@janicduplessis](https://github.com/janicduplessis)) +- `` fix for jumpy content when `initialScrollIndex` specified ([e0c73633cf](https://github.com/facebook/react-native/commit/e0c73633cfc0a62df9d39991b0df65fa5875609a) by [@rbrosboel](https://github.com/rbrosboel)) +- Fix local-cli assetRegistryPath and middlewares ([f05943de0a](https://github.com/facebook/react-native/commit/f05943de0abfc16da41163c6b91a04ecc8de8e67) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix issue with when all are `flexGrow` and `flexShrink` set to 0 except for one ([90a408ea6f](https://github.com/facebook/react-native/commit/90a408ea6ff7833e33b4058f490073e04460d00b) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) +- Fix react-native CLI's debugger UI path and metro host/port arg usage ([5067540487](https://github.com/facebook/react-native/commit/50675404873c1ffac0deedc51fe745168051148b) by [@Kureev](https://github.com/Kureev)) +- Hotfix to include `react-native-windows` in hasteImpl accepted paths ([54942746d4](https://github.com/facebook/react-native/commit/54942746d4037e1153e14fcfc95e4edc772d296a) by [@rubennorte](https://github.com/rubennorte)) +- Fix some classes of incorrect Flow errors for `Animated` ([db2159d0b3](https://github.com/facebook/react-native/commit/db2159d0b3fd57556383eff68d32d32246dd9081) by [@yunyu](https://github.com/yunyu)) +- Fixed a typo in DockerTests.md ([c1831d50cf](https://github.com/facebook/react-native/commit/c1831d50cfd35b7a7393e50bc71d8389b36021ce) by [@kant](https://github.com/kant)) +- Fix invalid use of destructuring in jest preprocessor ([9d5bd50737](https://github.com/facebook/react-native/commit/9d5bd507372c7b63e59a94383c3e3091d96409de) by [@umairda](https://github.com/umairda)) +- Fixed a CLI crash when using old versions of node ([e61176d650](https://github.com/facebook/react-native/commit/e61176d650e2b5fe51dd6cd4c429ff47a1a9b1dc) by [@keksipurkki](https://github.com/keksipurkki)) + +#### Android specific fixes + +- Fix issue with AsyncStorage not behaving properly on Android 7+ ([1b09bd7fba](https://github.com/facebook/react-native/commit/1b09bd7fba92431d63d2cecb83565491e91db396)) +- Fixed extreme `` slowness ([5017b86b52](https://github.com/facebook/react-native/commit/5017b86b525e3ef6023f0f8a88e6fd1cf98024e0) by [@gnprice](https://github.com/gnprice)) +- Fixed `` placeholder not being completely visible ([84022321c4](https://github.com/facebook/react-native/commit/84022321c437e597660ecd8a773e51bdf8855f4e) and [86f24ccf71](https://github.com/facebook/react-native/commit/86f24ccf71f4c41904838c8c7e13268c300fd745) by [@jainkuniya](https://github.com/jainkuniya)) +- Fix Horizontal ``'s scroll position during layout changes with RTL content ([de573277bf](https://github.com/facebook/react-native/commit/de573277bf64703aefdeb52db2c2524b2c241bab)) +- Fix Horizontal `` overflow issue ([d5465a9a0a](https://github.com/facebook/react-native/commit/d5465a9a0a840f7e759bb8fb6679b01017eb3d05)) +- Fixing crash on SDK 15 on ReactTextInputLocalData ([1bb2bead8b](https://github.com/facebook/react-native/commit/1bb2bead8bef850037c8b72209cd72a442572821)) +- Fix Drawing Rect for ReactScrollView ([6a16bec882](https://github.com/facebook/react-native/commit/6a16bec882cba809bdf9027367b76f6543b6617d) by [@yungsters](https://github.com/yungsters)) +- Fixed NoSuchKeyException Thrown From ReadableNativeMap bysafely unwrapping ReadableMap by defaulting to 0 if key not present ([1a6666a116](https://github.com/facebook/react-native/commit/1a6666a116fd8b9e8637956de2b41a1c315dd470) by [@Bhavik-P](https://github.com/Bhavik-P)) +- Fixed runAndroid to enable the use of a package on port <> 8081 for Windows ([3cd0737fe2](https://github.com/facebook/react-native/commit/3cd0737fe2dce9df29822854bfbfaf2f22346c69) by [@ihenshaw](https://github.com/ihenshaw)) +- Don't crash on upload retry when trying to fetch on a varying quality network ([79fe925f1d](https://github.com/facebook/react-native/commit/79fe925f1daa053d5a5d92a228e5c7beff565ab4) by [@dryganets](https://github.com/dryganets)) + +#### iOS specific fixes + +- Fix `TextInput.clear()` and `TextInput.setNativeProps({text: ''})` to work ([2307ea60d0](https://github.com/facebook/react-native/commit/2307ea60d03edd234511bfe32474c453f30c1693) by [@magicien](https://github.com/magicien)) +- Correct fishhook import in RCTReconnectingWebSocket ([75a0273de2](https://github.com/facebook/react-native/commit/75a0273de21948b0b959263100f09111f738ec35)) +- Change in RCTImagePickerManager to handle crashes if height/width is nil ([82af7c989b](https://github.com/facebook/react-native/commit/82af7c989be42a516f438f162d21f699be297e79) by [@abhi06276](https://github.com/abhi06276)) +- Fix controlled `` on iOS when inputting in Chinese/Japanese ([892212bad2](https://github.com/facebook/react-native/commit/892212bad2daadd373f4be241e4cd9889b0a1005) by [@mmmulani](https://github.com/mmmulani)) +- Fixed `` bug encountered with brownfield apps ([fab5fffbb3](https://github.com/facebook/react-native/commit/fab5fffbb3eb8668c9202dec5e770330d49880b0) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Fixed missing selection indicator lines on `` ([e592d6f8c7](https://github.com/facebook/react-native/commit/e592d6f8c7b0409ab6f0a2dbf6ebe3cea28c3e79) by [@VSchlattinger](https://github.com/VSchlattinger)) +- Fix crash in RCTImagePicker on iOS ([934c50fbe0](https://github.com/facebook/react-native/commit/934c50fbe07e49391ba27c3469f99bec65e48d39) by [@mmmulani](https://github.com/mmmulani)) +- Fix `undefined_arch` error received when building in Xcode 10 beta ([e131fffb37](https://github.com/facebook/react-native/commit/e131fffb37a545363daf11735a0243165b57f63f) by [@futuun](https://github.com/futuun)) +- Add support for connecting to the Packager when running the iOS app on device when using custom Debug configuration ([079bf3f206](https://github.com/facebook/react-native/commit/079bf3f2067cb268b60e75cd9e1bc51a9c85359c)) +- Fixed RCTAnimation import for integrating with cocoapods ([eef8d47a37](https://github.com/facebook/react-native/commit/eef8d47a37211bf7d4978db75df1fedd9cacbde8) by [@LukeDurrant](https://github.com/LukeDurrant)) + +### Removed: features that have been removed; these are breaking + +- _[BREAKING]_ Removed `ScrollView.propTypes`; use flow or typescript for verifying correct prop usage instead ([5b6ff01764](https://github.com/facebook/react-native/commit/5b6ff01764502c88848867c7e04cab969da384a2) by [@sahrens](https://github.com/sahrens)) + +#### Android specific removals + +- `ReactInstancePackage` is now deprecated; use `@link ReactPackage` or `@link LazyReactPackage` ([b938cd524a](https://github.com/facebook/react-native/commit/b938cd524a20c239a5d67e4a1150cd19e00e45ba) by [@axe-fb](https://github.com/axe-fb)) + +## v0.56.0 + +Welcome to the June 2018 release of React Native! +Over 60 contributors made [821 commits](https://github.com/facebook/react-native/compare/0.55-stable...0.56-stable) since March - and we are extremely grateful to every single one of you. + +As you'll see in a second, this new version has some important **breaking changes** that required a lot of extra efforts to bring to a stable 0.56. This was the main reason behind skipping April and May from the monthly release cycle, but looking forward we are planning on going back to do a rollout every month. + +### Highlights + +#### React Native now uses **Babel 7** + +When upgrading to 0.56, make sure to bump your `babel-preset-react-native` `package.json` dependency to `5.0.2` or newer (but still as _fixed_ value). + +React Native library authors will need to update their libraries to make use of the updated Babel preset as Babel 7 is **not** backwards compatible. + +If you have issues upgrading to Babel 7, please double check the [related documentation](https://new.babeljs.io/docs/en/next/v7-migration.html#versioning-dependencies-blog-2017-12-27-nearing-the-70-releasehtml-peer-dependencies-integrations), in particular the sections related to _Package Renames_ and _Scoped Packages_. + +The [`babel-bridge`](https://github.com/babel/babel-bridge) library may be used if you need to use libraries that have not yet upgraded to Babel 7. You may also enforce the Babel 7 dependency via tools like [yarn resolutions](https://yarnpkg.com/lang/en/docs/selective-version-resolutions/). Overall, you need to ensure all the `@babel/*` deps are fixed at version `7.0.0-beta.47`. + +#### **Node 8** is now the minimum required version + +Trailing commas are now allowed. + +#### **iOS 9** is now the minimum required version + +Any device that can run iOS 8, can upgrade to iOS 9. Developers who support iOS 8 in their apps may continue doing so as this is a Xcode-level setting (`IPHONEOS_DEPLOYMENT_TARGET`). + +#### **Xcode 9** is now the minimum required version + +We recommend using Xcode 9.4 as that is what we use to run our tests. + +#### **Android** projects are now compiled using the _Android 26 SDK_ + +The target API level is left unchanged in this release. + +Starting August 2018, new apps submitted to the Play Store will need to target API 26 as a minimum. You can now opt your project in to use API 26 (or newer) as the target. Please let us know about any issues, as we'd like to finalize support for Android API 26 by the time `0.57.0` is released. + +#### `WebView` will only load http(s) URLs by default + +Geolocation is disabled by default. + +#### Consistently Throw for `` + +Removes a pitfall that people may run into when releasing an app for Android if the bulk of the testing has been performed on iOS only. Nesting a `` within a `` component (e.g. ``) is unsupported on Android, but using this pattern on iOS has not thrown errors in the past. With this release, nesting a `` inside a `` will now throw an error on iOS in order to reduce the parity gap between the platforms. + +#### Flow improvements, migrating away from PropTypes + +Added Flow types for several components. + +We're migrating away from PropTypes and runtime checks and instead relying on **Flow**. You'll notice many improvements related to Flow in this release. + +- Fix project settings warnings on newer Xcode versions, remove unnecessary console logging. +- Modernized `YellowBox`. + Sort warnings by recency, group warnings by format string, present stack traces, show status of loading source maps, support inspecting each occurrence of a warning, and bug fixes. +- Prettier files! +- Lots of bug fixes. + +#### State of React Native + +Heads-up: the Facebook internal team is [currently working on a rewrite of some core architecture pieces](https://reactnative.dev/blog/2018/06/14/state-of-react-native-2018). This is a **work in progress** and we do not expect it to be ready for use in open source quite yet, but we felt the need to let you know what those commits mentioning Fabric are about. + +--- + +### Added: new features + +- Update `babelHelpers` with Babel 7 support ([fbd1beaf66](https://github.com/facebook/react-native/commit/fbd1beaf666be9c09a380784f8c0cd34ba083a6b)) +- `FlatList` is now Strict Mode compliant ([a90d0e3614](https://github.com/facebook/react-native/commit/a90d0e3614c467c33cf85bcbe65be71903d5aecc)) +- Enable `?.` optional chaining operator plugins ([aa6f394c42](https://github.com/facebook/react-native/commit/aa6f394c4236e5a4998c3be8ed61ec1bab950775)) +- Support `flexWrap: 'wrap-reverse'` ([d69e55060f](https://github.com/facebook/react-native/commit/d69e55060fd76d91eccc45905d250a9fce4b2c49)) +- Add prop type `accessibilityTraits` to `Text` ([654435d1ed](https://github.com/facebook/react-native/commit/654435d1ed9e584e65fff601e1fa50591e042664)) +- Add devDependencies support for templates ([c4ab03a18e](https://github.com/facebook/react-native/commit/c4ab03a18e75e6ed55444b5d86f3ceee435b9a78)) +- Add support for springDamping in `SpringInterpolator` ([1dde989919](https://github.com/facebook/react-native/commit/1dde989919d2c272ca7fcaa5c4b2d9ee02c490a0)) + +#### Android specific additions + +- Add support for build.gradle with CRLF for use with `react-native link` ([843cfc3b20](https://github.com/facebook/react-native/commit/843cfc3b202433aad9a236b1b623da7c45e1ac15)) +- add decimal pad to android ([75e49a0637](https://github.com/facebook/react-native/commit/75e49a0637eaa3bd3bb7e445648f084a42d9c8af)) +- Add a way to dismiss PopupMenu elements ([353c070be9](https://github.com/facebook/react-native/commit/353c070be9e9a5528d2098db4df3f0dc02d758a9)) +- Implement `Image.defaultSource` ([b0fa3228a7](https://github.com/facebook/react-native/commit/b0fa3228a77d89d6736da6fcae5dd32f74f3052c)) +- Support Image resizeMode=repeat ([0459e4ffaa](https://github.com/facebook/react-native/commit/0459e4ffaadb161598ce1a5b14c08d49a9257c9c)) +- Yoga: Add back deprecated `getParent` methods for non-breaking API change ([c3c5c3cbce](https://github.com/facebook/react-native/commit/c3c5c3cbce24a31f73ae6339e377ee76ca6401ad)) + +#### iOS specific additions + +- Run tests using Xcode 9.4 and iOS 11.4 ([c55bcd6ea7](https://github.com/facebook/react-native/commit/c55bcd6ea729cdf57fc14a5478b7c2e3f6b2a94d)) +- Add support for Homebrew-installed Node ([0964135a17](https://github.com/facebook/react-native/commit/0964135a178b459e06b44a49a4ecb0dd6c5bec9b)) +- Add textTransform style support ([8621d4b797](https://github.com/facebook/react-native/commit/8621d4b79731e13a0c6e397abd93c193c6219000)) +- Add docs for Swift usage to `RCTBridgeModule.h` ([ca898f4367](https://github.com/facebook/react-native/commit/ca898f4367083e0943603521a41c48dec403e6c9)) + +--- + +### Changes: existing functionality that is now different + +- Upgrade React Native to Babel 7 ([f8d6b97140](https://github.com/facebook/react-native/commit/f8d6b97140cffe8d18b2558f94570c8d1b410d5c)) +- New projects created using `react-native init` will use Babel 7 ([e315ec9891](https://github.com/facebook/react-native/commit/e315ec9891eb0bcb51afb0e797dbd49aa8f9ac71)) +- Restrict `WebView` to only http(s) URLs: ([634e7e11e3](https://github.com/facebook/react-native/commit/634e7e11e3ad39e0b13bf20cc7722c0cfd3c3e28), [23f8f7aecb](https://github.com/facebook/react-native/commit/23f8f7aecb1f21f4f5e44fb9e4a7456ea97935c9)) +- Node 8 is now the minimum required version ([c1e6f27823](https://github.com/facebook/react-native/commit/c1e6f278237e84c8ed26d3d2eb45035f250e2d40)) +- Upgrade React to v16.4.1, sync React Renderer to revision ae14317 ([c749d951ad](https://github.com/facebook/react-native/commit/c749d951ada829c6f6fb76f35e68142e61054433)) +- Update new project template's Flow config to fix `Cannot resolve module X` isse due to removal of `@providesModule` ([843a433e87](https://github.com/facebook/react-native/commit/843a433e87b0ccaa64ab70d07e22bffbabad8045)) +- Upgrade Flow to v0.75 ([3bed272a62](https://github.com/facebook/react-native/commit/3bed272a620ac806a6142327013265ea8138641a), [bc2f12c68c](https://github.com/facebook/react-native/commit/bc2f12c68cf8cfdf8c060354e84392fd9a3645d8), [6264b6932a](https://github.com/facebook/react-native/commit/6264b6932a08e1cefd83c4536ff7839d91938730)) +- Upgrade Flow definitions ([f8b4850425](https://github.com/facebook/react-native/commit/f8b4850425f115c8a23dead7ec0716b61663aed6)) +- Upgrade Prettier to v1.13.6 ([29fb2a8e90](https://github.com/facebook/react-native/commit/29fb2a8e90fa3811f9485d4b89d9dbcfffea93a6), [bc2f12c68c](https://github.com/facebook/react-native/commit/bc2f12c68cf8cfdf8c060354e84392fd9a3645d8)) +- Upgrade Jest to v23.2.0 ([536c937269](https://github.com/facebook/react-native/commit/536c9372692712b12317e657fc3e4263ecc70164), [bc2f12c68c](https://github.com/facebook/react-native/commit/bc2f12c68cf8cfdf8c060354e84392fd9a3645d8)) +- Upgrade Metro to v0.38 ([d081f83a04](https://github.com/facebook/react-native/commit/d081f83a0487ffbc7d19f8edc7532611b359dfc6)) +- Modernized `YellowBox` ([d0219a0301](https://github.com/facebook/react-native/commit/d0219a0301e59e8b0ef75dbd786318d4b4619f4c)) +- Disallow requiring from invariant/warning ([521fb6d041](https://github.com/facebook/react-native/commit/521fb6d041167ec8a8d0e98ac606db1f27f0c5c8)) +- Remove native prop type validation ([8dc3ba0444](https://github.com/facebook/react-native/commit/8dc3ba0444c94d9bbb66295b5af885bff9b9cd34)) +- Add `$FlowFixMe` to invalid prop accesses where Flow wasn't complaining before ([f19ee28e7d](https://github.com/facebook/react-native/commit/f19ee28e7d896aaacf26c6f850230019bdef0d3d)) +- Create Flow props for `Image` ([8bac869f5d](https://github.com/facebook/react-native/commit/8bac869f5d1f2ef42e707d0ec817afc6ac98b3b2)) +- Flow type for `SegmentedControlIOS` ([113f009698](https://github.com/facebook/react-native/commit/113f009698dbd8f1b4c1048d77ff1eb373021083)) +- Flow type for `ProgressViewIOS` ([c87701ba05](https://github.com/facebook/react-native/commit/c87701ba05a8524756e87c089eb92c8f3c81823e)) +- Flow type for `PickerIOS` ([1c66cdc7e8](https://github.com/facebook/react-native/commit/1c66cdc7e8ce8190dfbef76629601497446b2b0a)) +- Flow type for `Switch` ([06052a2330](https://github.com/facebook/react-native/commit/06052a2330fc9c1dd0d56c6bbe5a17703f80c6b9)) +- Flow type for `Slider` ([cbe045a95f](https://github.com/facebook/react-native/commit/cbe045a95f1ca53d99ae521742a93299a53d6136)) +- Flow type for `RefreshControl` ([891dfc3da4](https://github.com/facebook/react-native/commit/891dfc3da4b5825097aedf73ff04e8982c00aeff)) +- Flow type for `ListView` ([4b1ecb6204](https://github.com/facebook/react-native/commit/4b1ecb62045fbb78764d1f51030f2253be705c5c)) +- Flow type for `TextInput` ([c8bcda8150](https://github.com/facebook/react-native/commit/c8bcda8150278fde07331ca6958976b2b3395688)) +- Flow type for `TouchableBounce` ([8454a36b0b](https://github.com/facebook/react-native/commit/8454a36b0bc54cb1e267bc264657cc693607da71)) +- Flow type for `TouchableOpacity` ([44743c07ad](https://github.com/facebook/react-native/commit/44743c07ad672e39668f92a801578906ec92996a)) +- Flow type for `TouchableHighlight` ([f0c18dc820](https://github.com/facebook/react-native/commit/f0c18dc820537892dcc33d5aebbf4f52cf299b95)) +- Flow type for `TouchableWithoutFeedback` ([0b79d1faa2](https://github.com/facebook/react-native/commit/0b79d1faa21eb3c29aeeba08ee0fb2ed62e6cc54)) +- Flow type for `ScrollView` ([b127662279](https://github.com/facebook/react-native/commit/b1276622791d5dbe4199bb075f473908c3e62b31)) +- Flow type for `DatePickerIOS` ([97e572ea6d](https://github.com/facebook/react-native/commit/97e572ea6d7b1fd829ca20f5d5c8ff970d88e68b)) +- Flow type for `KeyboardAvoidingView` ([188b118b60](https://github.com/facebook/react-native/commit/188b118b6075be1614c553596b85d430767f2dbc)) +- Flow type for `ActivityIndicator` ([0b71d1ddb0](https://github.com/facebook/react-native/commit/0b71d1ddb03c036ed118574c105b0af505da19fc)) +- Remove `$FlowFixMe` in `TouchableBounce` ([ffda017850](https://github.com/facebook/react-native/commit/ffda0178509ed92396f15db37a41d3d668ade4e6)) +- Remove `$FlowFixMe` in `ScrollView` ([af6e2eb02d](https://github.com/facebook/react-native/commit/af6e2eb02d3651f869b5436e68e61ef3ab3405a0)) +- Remove `$FlowFixMe` in `ListView` ([af6e2eb02d](https://github.com/facebook/react-native/commit/af6e2eb02d3651f869b5436e68e61ef3ab3405a0)) +- Remove `$FlowFixMe` in `Text` ([6042592cf4](https://github.com/facebook/react-native/commit/6042592cf46787f089e76b661376705380607207)) +- Remove `$FlowFixMe` in `RTLExample` ([206ef54aa4](https://github.com/facebook/react-native/commit/206ef54aa415e3e2bb0d48111104dfc372b97e0f)) +- Remove `$FlowFixMe` in `AppContainer` ([a956551af7](https://github.com/facebook/react-native/commit/a956551af73cf785ee4345e92e71fd5b17c5644e)) +- Remove `$FlowFixMe` in `Slider` ([1615f9d161](https://github.com/facebook/react-native/commit/1615f9d16149c7082ce0e1485aa04a6f2108f7ba)) +- `StyleSheet`: Support animated values for border dimensions ([3e3b10f404](https://github.com/facebook/react-native/commit/3e3b10f4044ada7b523d363afb614720468c217f)) +- Update `react-devtools-core` and `plist` to include security fixes reported by `npm audit` ([3a1d949906](https://github.com/facebook/react-native/commit/3a1d949906acb0c3b44d125d54d0c99305bbbb56)) +- Update `Switch` to ES6 Class ([970caa4552](https://github.com/facebook/react-native/commit/970caa4552d4ba87c1a954391535ff42b00832e7)) +- Update `Slider` to ES6 Class ([5259450c14](https://github.com/facebook/react-native/commit/5259450c143f71c65e157d6b7d3f0e1655eb7aa1)) +- Update `ActivityIndicator` to ES6 Class ([edd7acbb1e](https://github.com/facebook/react-native/commit/edd7acbb1e6fe185600a19cc1cbb38feb16c85ad)) +- Update `RefreshControl` to ES6 Class ([a35a238317](https://github.com/facebook/react-native/commit/a35a23831789030e17f766f72d307ae315be107d)) +- Update `KeyboardAvoidingView` to ES6 Class ([c017dcb0f2](https://github.com/facebook/react-native/commit/c017dcb0f2903b49b2f21cc150226aeb7f5026ee)) +- Update `DatePickerIOS` to ES6 Class ([f8c8231706](https://github.com/facebook/react-native/commit/f8c8231706492b588331354d45b833aa21434e13)) +- Update `Text` to ES6 Class ([ab92c00245](https://github.com/facebook/react-native/commit/ab92c00245c0ce717819ddb0ab8b9204d4c13c34)) +- Replace `context.isInAParentText` w/ `React.createContext` ([e1339bc183](https://github.com/facebook/react-native/commit/e1339bc18303ca5394cd0c9dc97cededb2261581)) +- Cleanup `Text` implementation ([06c05e744d](https://github.com/facebook/react-native/commit/06c05e744d8af9582bde348210f254d76dae48b9)) +- Switch `Text` to `React.forwardRef` ([e708010d18](https://github.com/facebook/react-native/commit/e708010d18f938e2d6b6424cfc9485d8e5dd2800)) +- Switch `View` to `React.forwardRef` ([3e534b9aab](https://github.com/facebook/react-native/commit/3e534b9aab5156adac67762877b2457408fe8934)) +- Update uses of `genMockFunction` and `genMockFn` to `fn` in tests ([390ded871c](https://github.com/facebook/react-native/commit/390ded871cb905d149e9c1f4a082e67a7ec7addb)) +- Make `ViewProps` exact ([65c336f38f](https://github.com/facebook/react-native/commit/65c336f38f4afd43c8b5f81745abf38bd9b8ddbf)) +- Spread `TVViewProps` into `ViewProps` instead of intersection ([bc658d3c44](https://github.com/facebook/react-native/commit/bc658d3c4405676643d952a126295dbc7fc26217)) +- Allow trailing commas ([1e2de71290](https://github.com/facebook/react-native/commit/1e2de712907e5fe0d17648f0ff5c81d4384ca85b)) +- Use `let`/`const` ([8f5ebe5952](https://github.com/facebook/react-native/commit/8f5ebe5952d0675b463137103a82f3fb0c26ae0d)) +- Refactor `MockNativeMethods` in Jest ([5d4c542c58](https://github.com/facebook/react-native/commit/5d4c542c58d84bbe05f76bf01d9efdd9d438572c)) +- Use app name from `app.json` after ejecting ([57774a4a98](https://github.com/facebook/react-native/commit/57774a4a981e2f12cfe9b029447e34f203221b18)) +- Suggest `git apply --reject` for failed upgrades ([4fbd244b9a](https://github.com/facebook/react-native/commit/4fbd244b9a6b62e0efe1b4b5a7ec3de468f020f6)) +- Moved `TouchHistoryMath` from React to React Native ([06085d3836](https://github.com/facebook/react-native/commit/06085d38366373f3135074dc14e2c9871ca4fe29)) +- Refactor `RCTInputAccessoryView` ([c136c54ff0](https://github.com/facebook/react-native/commit/c136c54ff0211e2bf149fab600cd6e295f9d19dd)) +- Don't wrap `ListEmptyComponent` in an extra view ([db061ea8c7](https://github.com/facebook/react-native/commit/db061ea8c7b78d7e9df4a450c9e7a24d9b2382b4)) +- Move `Text` PropTypes to its own file ([cd8128b2ec](https://github.com/facebook/react-native/commit/cd8128b2eccf6898cdf798a1e1be1f7a5762a0d4)) +- Mock `ReactNative.NativeComponent` native methods in Jest ([3e9a371ace](https://github.com/facebook/react-native/commit/3e9a371ace5f25b2eb7a0d30177251f8a0c10ed9)) +- Tightening types for `View` and `VirtualizedList` ([5035af80ec](https://github.com/facebook/react-native/commit/5035af80ecddb44e2a8444780f25f336b760bf32)) +- Make values optional in `ViewPropTypes` ([f1316cab6c](https://github.com/facebook/react-native/commit/f1316cab6c351852ef1da9939d4c8f0244fb8a6f)) +- propTypes are optional for native components ([dbdf43b428](https://github.com/facebook/react-native/commit/dbdf43b428da19a9eba012753904bcf33339ea9a)) +- Rename `Style` to `DangerouslyImpreciseStyle` ([4895c645ea](https://github.com/facebook/react-native/commit/4895c645ea17ff939811f3d5ec6218cd4e31c5fb)) +- _[BREAKING]_ `requireNativeComponent`'s signature has been simplified to only take extraOptions ([820673e707](https://github.com/facebook/react-native/commit/820673e7076b5906ba50e09e40fb9a32cf500c1b), [b549e364e0](https://github.com/facebook/react-native/commit/b549e364e0025e0e1b4005f04a9de2d767006da1), [28d37781c6](https://github.com/facebook/react-native/commit/28d37781c6589574de1113bd12077f6d54053ffb), [1c90a2b47b](https://github.com/facebook/react-native/commit/1c90a2b47b420a4b6aa16a55a344cc08f0eacbe3), and [1ab7d49c2d](https://github.com/facebook/react-native/commit/1ab7d49c2df5673dd214eb8a9b7fd3defb0ff857) by [@yungsters](https://github.com/yungsters)) + +#### Breaking Changes + +- Public methods of Text (`blur`, `focus`, `measure`, `measureInWindow`, `measureLayout`, `setNativeProps`) are no longer bound to the text component instance. It is therefore unsafe to pass these methods by reference (i.e: as callbacks) to functions. So, things like `setTimeout(this._txtRef.focus, 1000)` will no longer work. Please instead do: `setTimeout(() => this._txtRef.focus(), 1000)`. + +### iOS specific changes + +- _[BREAKING]_ WebViews now can only use https; do not use it for `file://` ([634e7e11e3](https://github.com/facebook/react-native/commit/634e7e11e3ad39e0b13bf20cc7722c0cfd3c3e28) by [@mmmulani](https://github.com/mmmulani)) +- iOS 9 is now the minimum required version ([f50df4f5ec](https://github.com/facebook/react-native/commit/f50df4f5eca4b4324ff18a49dcf8be3694482b51)) +- Update podspecs to target iOS 9 ([092103e752](https://github.com/facebook/react-native/commit/092103e7525e58e04346e0a1a16a67ca4f31c2e9)) +- Xcode 9.4 is now used to run tests ([c55bcd6ea7](https://github.com/facebook/react-native/commit/c55bcd6ea729cdf57fc14a5478b7c2e3f6b2a94d)) +- Prevent console logging on iOS 11.3+ within WebSocket ([8125be942b](https://github.com/facebook/react-native/commit/8125be942bd5fd8fe851bad04ae6b9bcb0af4727)) +- Expose `RCTFont` size overrides ([6611fefef7](https://github.com/facebook/react-native/commit/6611fefef7559c4cd3d1824235d263bff210d5e2)) + +### Android specific changes + +- Projects are now compiled using Android SDK 26 ([065c5b6590](https://github.com/facebook/react-native/commit/065c5b6590de18281a8c592a04240751c655c03c)) +- Use Google Maven repo in new Android projects ([6d56a234e3](https://github.com/facebook/react-native/commit/6d56a234e3cf5984335ff2713236260fac977f5f)) +- Upgrade Buck to v2018.03.26.01 ([1324e7b558](https://github.com/facebook/react-native/commit/1324e7b5580db815471172cf6dd140124bd2f11a)) +- Upgrade gradle-plugin to 2.3.3, gradle to 3.5.1, gradle-download-task to 3.4.3 ([699e5eebe8](https://github.com/facebook/react-native/commit/699e5eebe807d1ced660d2d2f39b5679d26925da)) +- Bump NDK APP_PLATFORM to android-16 ([b5dc45420a](https://github.com/facebook/react-native/commit/b5dc45420a0d3aa54d2d2075d7f14ff1835df78a)) +- Bump glog to 0.3.5 (added libc++ support) ([b5fca80605](https://github.com/facebook/react-native/commit/b5fca806059e628edb504cb1bacf62e89ee6f102)) +- `ReactFragmentActivity` deprecated as it's not necessary when targeting API level 14 and above ([77a02c0d83](https://github.com/facebook/react-native/commit/77a02c0d83dbfcd9a5397cf63e1ab2e6c94cfdde)) +- Touchables now play a sound on press ([722f88ca90](https://github.com/facebook/react-native/commit/722f88ca9058c5d902c416b826a7a7ab347326b8)) +- Default `underlineColorAndroid` to transparent ([a3a98eb1c7](https://github.com/facebook/react-native/commit/a3a98eb1c7fa0054a236d45421393874ce8ce558)) +- Disable `WebView` geolocation by default ([23d61b35fb](https://github.com/facebook/react-native/commit/23d61b35fb6fdbfb84f77b6d99ff155a0ff868e6)) +- Ensure cookies with illegal characters are not sent to okhttp ([04028bf216](https://github.com/facebook/react-native/commit/04028bf2169b01f79bd86ecd6b0d8aa5f99599f1)) +- Update app icons to match recent Android releases ([94393f8652](https://github.com/facebook/react-native/commit/94393f8652c414806fc861c214ad36e9ac1b6114)) +- Better error messages for `ReadableNativeMap` ([30d06b4286](https://github.com/facebook/react-native/commit/30d06b42862fc5e8704e109db652d62f86f8eabc)) +- Update Fresco to v1.9.0, okhttp3 to v3.10.0 ([6b07602915](https://github.com/facebook/react-native/commit/6b07602915157f54c39adbf0f9746ac056ad2d13)) +- Add tint color to inline icons ([e8e2a6e410](https://github.com/facebook/react-native/commit/e8e2a6e4102c1ba0ee3d068769e47fa61c160524)) +- Fix antialiasing rounded background ([e4f88c66e3](https://github.com/facebook/react-native/commit/e4f88c66e300505d3c86329dacd84d84e8109837)) +- `react-native link` will now replace '/' by '\_' when linking projects. If you previously linked scoped packages, they will get linked again. ([dbd47592a1](https://github.com/facebook/react-native/commit/dbd47592a18ed09ee6e94c79bed16d63be625af6)) +- New project template now uses project-wide properties ([0a3055d98a](https://github.com/facebook/react-native/commit/0a3055d98a36e49746144e883edc7e20afec4fcb)) + +--- + +### Fixed: bugs that have been resolved + +- `VirtualizedList` now accounts for `ListHeaderComponent` length when calculating offset ([604bcfa4a8](https://github.com/facebook/react-native/commit/604bcfa4a83396c402ba8beaa13f40d05d6e9f5c)) +- Prevent showing a hidden status bar when opening modals ([076b1cea35](https://github.com/facebook/react-native/commit/076b1cea3563cae30e11d63cc100ceaed9082692)) +- Fix crash when reloading while Perf Monitor is enabled ([4fcd9970bd](https://github.com/facebook/react-native/commit/4fcd9970bd2dfb24890bc87e9c82e16dab71ec09)) +- Fixed concurrency issue in remote debugger ([578b0b2a51](https://github.com/facebook/react-native/commit/578b0b2a51fc0c2aba5d27cdd5335396d5351463)) +- Fix `Modal` + `FlatList` scrolling ([45b0907f61](https://github.com/facebook/react-native/commit/45b0907f619f455825f459838615a5a7cc59a204)) +- Fix bug in `RCTNetworking` where not all tasks/handlers were being cleared during invalidation ([b805172034](https://github.com/facebook/react-native/commit/b8051720344f3716e964eaf7cfdd2a91dc703602)) +- Fix keyboard handling with `keyboardShouldPersistTaps: never` ([ffe6c110f7](https://github.com/facebook/react-native/commit/ffe6c110f7ce33460fe0399ccbda16a6adbe90ca)) +- Fix Responder Logic in `Text` ([e2ce22b823](https://github.com/facebook/react-native/commit/e2ce22b823661a7dcf6b70a825921a2910383bd1)) +- Fix `VirtualizedSectionList` lint warnings ([26a1eba1ce](https://github.com/facebook/react-native/commit/26a1eba1cef853b0dab7aad5731699c06d36b781)) +- Fix `VirtualizedSectionList:ItemWithSeparators` ([488a4c7e1c](https://github.com/facebook/react-native/commit/488a4c7e1c86ac5900ff9194106511fbf5a8e3cb)) +- Fix `TextInput`'s initial layout measurements ([c6b4f9f2ce](https://github.com/facebook/react-native/commit/c6b4f9f2ce59bc757d9e211f46294faa03df55c6)) +- Fix `requireNativeComponent` check ([1c90a2b47b](https://github.com/facebook/react-native/commit/1c90a2b47b420a4b6aa16a55a344cc08f0eacbe3)) +- Fix `TextInput` autocapitalization bug ([ff70ecf868](https://github.com/facebook/react-native/commit/ff70ecf868cf12fc66b45dc1496391d0a1e9011f)) +- Add missing events to `ViewPropTypes` ([41a940392c](https://github.com/facebook/react-native/commit/41a940392cea497bc5eb627b24083d0211d1eb89)) +- Add missing Jest mock in `StatusBarManager` ([4a2c560768](https://github.com/facebook/react-native/commit/4a2c560768abb2d8407900fdb2fbe4971ae00a1c)) +- Add Flow declaration for Metro module ([1853e15190](https://github.com/facebook/react-native/commit/1853e1519030caaeeb7f31017d98823aa5696daf)) +- Fix type for `ReactNative.NativeComponent` (1/2) ([de11ba2a5e](https://github.com/facebook/react-native/commit/de11ba2a5ee90929dbc67d914de59bdd2ebc29ca)) +- Fix type for `ReactNative.NativeComponent` (2/2) ([752863629d](https://github.com/facebook/react-native/commit/752863629d63bca6d96a101bfeccc4e7ad3e953e)) +- Move Image PropTypes to new file ([67656991b3](https://github.com/facebook/react-native/commit/67656991b32075e8b4a99c6409b0a131206c6941)) +- Tests: Fix JUnit report location when running Jest ([85fc98d437](https://github.com/facebook/react-native/commit/85fc98d437c08cdec883a73161e120478737ba72)) +- Tests: Fix ReactImagePropertyTest SoLoader failures (#19607) ([a52d84d7e1](https://github.com/facebook/react-native/commit/a52d84d7e1cdb287f2877c4d85f2e9866c248d43)) +- Tests: Fix jest snapshot testing on Windows ([216bce3163](https://github.com/facebook/react-native/commit/216bce31632480ce70cc03b1b2a57ec12440afd7)) +- Fixes "Cannot resolve module" errors in new `react-native init` projects ([843a433e87](https://github.com/facebook/react-native/commit/843a433e87b0ccaa64ab70d07e22bffbabad8045)) +- Haste hotfix for `react-native-windows` ([54942746d4](https://github.com/facebook/react-native/commit/54942746d4037e1153e14fcfc95e4edc772d296a)) + +#### iOS specific fixes + +- Fix undefined_arch error in Xcode 10 beta - e131fff +- Make `react-native run-ios` command play nicely with multiple Xcode versions ([a130239257](https://github.com/facebook/react-native/commit/a1302392577789faab79dad0cb39b147464e0e42)) +- Correct fishhook import ([75a0273de2](https://github.com/facebook/react-native/commit/75a0273de21948b0b959263100f09111f738ec35)) +- Fix bug where a Backspace event was emitted when entering characters after clearing a text in `TextInput` by an empty string ([1ffb2b63be](https://github.com/facebook/react-native/commit/1ffb2b63be4c4af331fece0b4286e5c92b1e575d)) +- Expose `InputAccessoryView` so it can be imported ([80fc415cf1](https://github.com/facebook/react-native/commit/80fc415cf179ffe26d020bc8d6e4451352da94fd)) +- Fix `InputAccessoryView` safe area conformance ([490f22ae72](https://github.com/facebook/react-native/commit/490f22ae72ba43fa9364ce0f6c238744c07ac830)) +- Fix use of C++ syntax in header file ([bfcfe7961d](https://github.com/facebook/react-native/commit/bfcfe7961db0970e2575eafe2f3c9c668bd8940d)) +- Fix install step when running `run-ios` ([0934c1778f](https://github.com/facebook/react-native/commit/0934c1778f0e3c0b691e1a3ca2df1d486eb905dd)) +- Fix `run-ios` not turning on Simulator ([9736ddc061](https://github.com/facebook/react-native/commit/9736ddc061e9c4291df8a3185c7f9d6f73e435c7)) +- Use correct library reference for Fishhook. This fixes the build for the new Xcode build system, on both Xcode 9 and Xcode 10 ([a8b74576da](https://github.com/facebook/react-native/commit/a8b74576da6f1a42fde4e39f97e88c8f45a3a51d)) +- Add missing `onChange` event definition to `DatePickerIOS` ([3b53091869](https://github.com/facebook/react-native/commit/3b53091869b673ea33a4af34242e2227ca944768)) +- Fix crash during Archive phase on Xcode 9.3 ([344c205070](https://github.com/facebook/react-native/commit/344c205070d5ad670c97984dd86ec9ac13c73f81)) +- `RNTesterPods`: Add missing folly include ([128c9343c4](https://github.com/facebook/react-native/commit/128c9343c464f3e7898d6e245f135f8bdf6caa6a)) +- `RNTesterPods`: folly::Optional's `has_value()` to `hasValue()` until folly is upgraded ([128c9343c4](https://github.com/facebook/react-native/commit/128c9343c464f3e7898d6e245f135f8bdf6caa6a)) +- `RNTesterPods`: Fix import for `RCTTestAttributes.h` ([128c9343c4](https://github.com/facebook/react-native/commit/128c9343c464f3e7898d6e245f135f8bdf6caa6a)) +- `RNTesterPods`: Fix `conversions.h` to use namespaced includes ([128c9343c4](https://github.com/facebook/react-native/commit/128c9343c464f3e7898d6e245f135f8bdf6caa6a)) +- Fix or mark enum conversions surfaced by `-Wenum-conversion` ([b8f30db0ae](https://github.com/facebook/react-native/commit/b8f30db0ae21d5f96547702abbf50aefa93b1094)) +- Fix CocoaPods integration without DevSupport subspec ([c09d509c2b](https://github.com/facebook/react-native/commit/c09d509c2b8a5a02701829e1f0ace8081ce64277)) +- Update Yoga to handle being in a Xcode framework project ([cf036dbc7a](https://github.com/facebook/react-native/commit/cf036dbc7af16a8453c115372694dc51e8086fcf)) +- Fix Blob memory leak ([122b3791ed](https://github.com/facebook/react-native/commit/122b3791ede095345f44666691aa9ce5aa7f725a)) +- Avoid double reload event when reloading JS ([7b9b1559a7](https://github.com/facebook/react-native/commit/7b9b1559a7f6719c3c9ad8e894fcdd99ed109afe)) +- Suppress spurious warning about RCTCxxModule ([569061dd83](https://github.com/facebook/react-native/commit/569061dd8384a86cd27719b8b068360d8379f4c3)) + +#### Android specific fixes + +- Fix extreme `TextInput` slowness on Android ([5017b86b52](https://github.com/facebook/react-native/commit/5017b86b525e3ef6023f0f8a88e6fd1cf98024e0)) +- Correct draw path dimensions while doing even border, fixes blurred borders ([c5ca26a0e5](https://github.com/facebook/react-native/commit/c5ca26a0e5c0660196300ee34d6007c63879611f)) +- Don't pass additional arguments to `requireNativeComponent` in `.android.js` files ([a51e8b19cc](https://github.com/facebook/react-native/commit/a51e8b19cc4dc36dee42ac95278b883c06b2e40f)) +- Prevent `RefreshControl` from getting stuck when a parent is scrolled horizontally ([33ffa79a51](https://github.com/facebook/react-native/commit/33ffa79a51d4db9ba69148861f2da304646175cd)) +- Prevent crash due to unsupported ellipsize mode ([85e33aaf90](https://github.com/facebook/react-native/commit/85e33aaf908996e99220bff4a2bdbbdf7c0d12b0)) +- Fix okhttp3 response handling in `DevServerHelper` ([56d48bd9ec](https://github.com/facebook/react-native/commit/56d48bd9ecd2d0f08625259121312531064a09f2)) +- Fix `ReactInstanceManager` unmountApplication to support `ReactRootView` recycling ([4a9b2a7302](https://github.com/facebook/react-native/commit/4a9b2a73021fb547febe1fa193c3effb7ff8da4e)) +- Fix `NullPointerException` when emitting event using `UIManagerModule` ([291c01f4ff](https://github.com/facebook/react-native/commit/291c01f4ffe614760852e36b05d78b42cb4271df)) +- Fix link to Android build guide ([57e7556b8d](https://github.com/facebook/react-native/commit/57e7556b8db61e5fcc3ccea56c1b163b82a091a6)) +- Fix Android open source test failures ([3e0ebc7663](https://github.com/facebook/react-native/commit/3e0ebc76632238f21c60caa92c7a2b5ee8102b71)) +- Fix view indices with LayoutAnimation ([05b75b9ebf](https://github.com/facebook/react-native/commit/05b75b9ebfa3ce6d67b2a3aee446ff0cd515311b)) +- Fix originalNode memory leak ([8102e35271](https://github.com/facebook/react-native/commit/8102e35271ab68e0525a9c60d86a855bbeef9c1a)) +- Fix `ScrollView` with a `TextInput` ([2f1421dec7](https://github.com/facebook/react-native/commit/2f1421dec7cd3a35779caceac108e872033c7d72)) +- Disable onKeyPRess logic when handler not defined ([41975f75d9](https://github.com/facebook/react-native/commit/41975f75d96ef4b606b4618461bf24d5db063b77)) +- fix permission requests on pre-M android ([4e1abdd74d](https://github.com/facebook/react-native/commit/4e1abdd74dc4127a86d62e7750d01d39bb781c08)) + +--- + +### Removed: features that have been removed; these are breaking + +- Deprecate `focusTextInput` and `blurTextInput` ([ce3b7b8204](https://github.com/facebook/react-native/commit/ce3b7b8204dad0fd62a76a0ce66472eca4b25bc8)) +- _[BREAKING]_ `ImageResizeMode` on `Image` is no longer exposed; check your usage of `resizeMode`; the same resize modes exist, but pass them as strings instead ([870775ee73](https://github.com/facebook/react-native/commit/870775ee738e9405c6545500f9a637df9b513a02) by [@TheSavior](https://github.com/TheSavior)) + +#### Android specific removals + +- Remove native extensions ([7c5845a5a2](https://github.com/facebook/react-native/commit/7c5845a5a26592598c9380df078766a680a23f06)) +- Remove Fresco ProGuard rules ([07df36557c](https://github.com/facebook/react-native/commit/07df36557c8cbbaee5e870460162aa725a606ff4)) + +#### iOS specific removals + +- Disallow nesting of `` within `` (e.g. ``) ([6a1b41643a](https://github.com/facebook/react-native/commit/6a1b41643a5f5035c61a96263220d11d3462e8f2) +- Removed deprecated `UIActionSheetDelegate` methods ([5863b564f8](https://github.com/facebook/react-native/commit/5863b564f84b9fe97b256f8cde0f7f2e1db9b641)) + +--- + +### Known issues + +During the RC testing of this version, a few issues that have been opened don't have yet a finalized solution ( [19827](https://github.com/facebook/react-native/issues/19827), [19763](https://github.com/facebook/react-native/issues/19763), [19859](https://github.com/facebook/react-native/issues/19859), [19955](https://github.com/facebook/react-native/issues/19955) ). We are aware of them and we hope that by releasing 0.56.0 the surface of developers interacting to find solutions to them will allow for faster resolution and an even better 0.56.1 release. So please check the already opened issues before submitting new ones. + +If you are using Windows to develop React Native apps, we suggest you keep an eye on [this issue in particular](https://github.com/facebook/react-native/issues/19953) since there have been many reports of issues related to Win 10 and RN 0.56. + +## v0.55.0 + +Welcome to the March 2018 release of React Native ! Over 81 contributors made 247 commits since February. Thanks for another exciting release. + +Here are a few highlights: + +- React Native is now using the MIT license +- Android TV device support + +[![RNAndroidTVDemo](http://img.youtube.com/vi/EzIQErHhY20/0.jpg)](http://www.youtube.com/watch?v=EzIQErHhY20) + +- Animated tracking with native driver - check out the [silky smooth framerate](https://t.co/dE1KST1i3g) +- Lots of Flow improvements +- Bugfixes + +### Added: new features + +- Added support for animated tracking to native driver. Now you can use `useNativeDriver` flag with animations that track other `Animated.Values` ([b48f7e5605](https://github.com/facebook/react-native/commit/b48f7e560545d53db7c906ced51a91c4cce6ee94) by [@kmagiera](https://github.com/kmagiera)) +- There's a new UTFSequence module in the library for common Unicode sequences (Emoji!) ([54870e0c6c](https://github.com/facebook/react-native/commit/54870e0c6ca8611fed775e5ba12a0d6d9b1cdbd7) and [4761d5a83e](https://github.com/facebook/react-native/commit/4761d5a83e707e0ed651f02a9e02fc5d66b1869a) by [@sahrens](https://github.com/sahrens)) +- Added `contextMenuHidden` property for **TextInput** ([2dd2529b3a](https://github.com/facebook/react-native/commit/2dd2529b3ab3ace39136a6e24c09f80ae421a17e) by [@amhinson](https://github.com/amhinson)) +- Add `testOnly_pressed` to **TouchableHighlight** for snapshot tests ([3756d41de1](https://github.com/facebook/react-native/commit/3756d41de1feb167482f01b26f9a5f2563ef8bff) by [@sahrens](https://github.com/sahrens)) + +#### Android specific additions + +- Added support for Android TV devices ([b7bb2e5745](https://github.com/facebook/react-native/commit/b7bb2e5745f2bdbfeeccef8d97d469730942e01c) by [@krzysztofciombor](https://github.com/krzysztofciombor)) +- Implemented style `letterSpacing` for **Text** and **TextInput** ([5898817fc1](https://github.com/facebook/react-native/commit/5898817fc1a66bd317d65ce96520159df2f96045) by [@motiz88](https://github.com/motiz88)) +- Bundle download progress is now shown [d06e143420](https://github.com/facebook/react-native/commit/d06e143420462344ea6fc21c0446db972f747404) by [@janicduplessis](https://github.com/janicduplessis)) +- **AndroidInfoModule** now also returns Android ID ([216c8ec04b](https://github.com/facebook/react-native/commit/216c8ec04b22704f722ecaac4718157af4434a0c) by [@L33tcodex0r](https://github.com/L33tcodex0r)) + +#### iOS specific additions + +- Introducing **InputAccessoryView**, "a component which enables customization of the keyboard input accessory view" ([38197c8230](https://github.com/facebook/react-native/commit/38197c8230657d567170cdaf8ff4bbb4aee732b8), [84ef7bc372](https://github.com/facebook/react-native/commit/84ef7bc372ad870127b3e1fb8c13399fe09ecd4d), and [6d9fe455dc](https://github.com/facebook/react-native/commit/6d9fe455dc815cdce86c00f81c71c9ca0c724964) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- `base-line` metric exposure for **Text** and **TextInput** ([51b3529f6c](https://github.com/facebook/react-native/commit/51b3529f6c2ca354800c0cf6ecb8eb3115eaa36e), [0dbe18375e](https://github.com/facebook/react-native/commit/0dbe18375ebb712be8bebd3b6592170f90f8b7bc), and [7630a614e4](https://github.com/facebook/react-native/commit/7630a614e4bd56c1a3ac728e1dfafd114340f2b7) by [@shergin](https://github.com/shergin)) +- **DatePickerIOS** now has `initialDate` prop ([446ce49e9b](https://github.com/facebook/react-native/commit/446ce49e9b097d2a5e95b0f17aa23756733c27ec)) +- Expose version via `RCTVersion.h`'s `RCTGetReactNativeVersion()` ([30469ed001](https://github.com/facebook/react-native/commit/30469ed00170a74743d2ba5aadce61aae742715c) by [@LeoNatan](https://github.com/LeoNatan)) +- Allow running multiple simulators simultaneously with `react-native run-ios --simulator ...` ([2ad34075f1](https://github.com/facebook/react-native/commit/2ad34075f1d048bebb08ef30799ac0d081073150) by [@koenpunt](https://github.com/koenpunt)) +- Introduced **RCTSurfaceHostingProxyRootView** for migration to **RCTSurfaceHostingView** ([34b8876ac6](https://github.com/facebook/react-native/commit/34b8876ac6510398e03a03c94f4ffb9aaa7519d3) by [@fkgozali](https://github.com/fkgozali)) +- New UIManager API allowing intercept/delay mounting process ([402ae2f01f](https://github.com/facebook/react-native/commit/402ae2f01fd91051be5b717b0578e18b863854af) and [b90c1cf6c3](https://github.com/facebook/react-native/commit/b90c1cf6c30454859579278be18ac650c66f516b) by [@shergin](https://github.com/shergin)) + +### Changes: existing functionality that is now different + +- React Native has now adopted the MIT license ([1490ab12ef](https://github.com/facebook/react-native/commit/1490ab12ef156bf3201882eeabfcac18a1210352) and [26684cf3ad](https://github.com/facebook/react-native/commit/26684cf3adf4094eb6c405d345a75bf8c7c0bf88) by [@sophiebits](https://github.com/sophiebits)) +- The HelloWorld template now exclude `*.jsbundle` files from Git ([21231084db](https://github.com/facebook/react-native/commit/21231084dbccc8abe7823d4444a7e772c08e3e72) by [@aneophyte](https://github.com/aneophyte)) +- `react-native-git-upgrade` now shows files merged with conflicts in red ([e53a8f7097](https://github.com/facebook/react-native/commit/e53a8f7097965f38d87eade1407661bc63adc68e) by [@alvinthen](https://github.com/alvinthen)) +- `ResolvedAssetSource` type to have all read-only members ([4d0ee37293](https://github.com/facebook/react-native/commit/4d0ee37293b5e21fc3c7a8c6edd72c9ff899df7d) by [@sahrens](https://github.com/sahrens)) +- Flow types improvements ([b6c7e551a9](https://github.com/facebook/react-native/commit/b6c7e551a91c406884cbbe8ee37c0038a1b7f0be), [b98bf1e097](https://github.com/facebook/react-native/commit/b98bf1e09739860d82e37225f1635bba3bc817b3), [80c18395e2](https://github.com/facebook/react-native/commit/80c18395e24760cd12b69592a10037f071255437), [70a3ececc3](https://github.com/facebook/react-native/commit/70a3ececc368a8d0fe4b57b13ac956ad99a637c7), [f7343576fc](https://github.com/facebook/react-native/commit/f7343576fc2ca941b03145d9e97208bcbc8c345b), [a817c64043](https://github.com/facebook/react-native/commit/a817c6404338b7b15aaeac5693ae3635a0a3dde0), [3fd82d3c89](https://github.com/facebook/react-native/commit/3fd82d3c89f2d7e5103b024b54250f2ded970d88), [cd8128b2ec](https://github.com/facebook/react-native/commit/cd8128b2eccf6898cdf798a1e1be1f7a5762a0d4), [5035af80ec](https://github.com/facebook/react-native/commit/5035af80ecddb44e2a8444780f25f336b760bf32), [26734a8473](https://github.com/facebook/react-native/commit/26734a8473ac2f5715f2b7a016f0cc8a15c6f073), [321ba067a8](https://github.com/facebook/react-native/commit/321ba067a8323c80262e51c94a931199d5ff5cd7), [b6b80f6a70](https://github.com/facebook/react-native/commit/b6b80f6a70c6d790c52b58453fefc2cea6cd06fe), [f1316cab6c](https://github.com/facebook/react-native/commit/f1316cab6c351852ef1da9939d4c8f0244fb8a6f), [2520c645f8](https://github.com/facebook/react-native/commit/2520c645f863c299e8dccb844bac3dc6a9d553e0), [214da52fe7](https://github.com/facebook/react-native/commit/214da52fe76c1688d0c1a402b3e6c4d0fc19d882), [dbdf43b428](https://github.com/facebook/react-native/commit/dbdf43b428da19a9eba012753904bcf33339ea9a), [49396aa78d](https://github.com/facebook/react-native/commit/49396aa78d218625c1933fa864acd70853faa9f9), [4895c645ea](https://github.com/facebook/react-native/commit/4895c645ea17ff939811f3d5ec6218cd4e31c5fb), [a3c07c95ef](https://github.com/facebook/react-native/commit/a3c07c95effd891c2bd5f3257efe5b24d85862be), [49ffc9fada](https://github.com/facebook/react-native/commit/49ffc9fada4266c3ba9751c5e8e4c475174c7e6c), and [c129457d3a](https://github.com/facebook/react-native/commit/c129457d3a6622d7c28e8b27829ffc2b0a03c5eb) by [@TheSavior](https://github.com/TheSavior), [@yungsters](https://github.com/yungsters), and [@alex288ms](https://github.com/alex288ms)) +- Better enable cross-platform support of WebSocket.js ([b9be28915c](https://github.com/facebook/react-native/commit/b9be28915cf323eb36f1d7c77821cdf994954074) by [@rozele](https://github.com/rozele)) +- Better error handling in the CLI around making directories ([d2817f48a1](https://github.com/facebook/react-native/commit/d2817f48a1146b469d544ee78015251551d358c3) by [@BridgeAR](https://github.com/BridgeAR)) +- Verify that the component passed to createAnimatedComponent is not functional ([10b642a7af](https://github.com/facebook/react-native/commit/10b642a7af097bd508dab7b5d4723ccb4339d35f) by [@janicduplessis](https://github.com/janicduplessis)) +- Don't truncate in the middle of an emoji ([9c8c597000](https://github.com/facebook/react-native/commit/9c8c5970002d048e8b18088f7c63b39431def50b) by [@Vince0613](https://github.com/Vince0613)) +- Loosen Platform check to allow better code sharing for out-of-tree platforms ([84affbd6a3](https://github.com/facebook/react-native/commit/84affbd6a371dd865a3550b1fde1ebabee921341)) +- In CLI, fix issue with `isInstalled` check for Android and references to unregister ([ec884890b1](https://github.com/facebook/react-native/commit/ec884890b1f40da42e84202e082b4cef2506bbfc) by [@rozele](https://github.com/rozele)) + +#### iOS specific changes + +- tvOS `onPress` magnification animation now works via the `tvParallaxProperties` prop object taking `pressMagnification`, `pressDuration`, and `pressDelay` ([6c353fd7e9](https://github.com/facebook/react-native/commit/6c353fd7e9fd324717951ad62754d817537d7339) by [@JulienKode](https://github.com/JulienKode)) + +### Fixed: bugs that have been resolved + +- In **TouchableOpacity**, trigger animation on `opacity` upon change in `disabled` prop ([9366ce416f](https://github.com/facebook/react-native/commit/9366ce416fbf015e4795987d39a65199b1b335c2) by [@maxkomarychev](https://github.com/maxkomarychev)) +- Fixed an issue encountered when using `react-native-vector-icons` ([a759a44358](https://github.com/facebook/react-native/commit/a759a44358711180b37cf4ad25f28af47e3de298) and [54dc11a5fb](https://github.com/facebook/react-native/commit/54dc11a5fbafaccc9c0a781f1151225909717597) by [@jeanlauliac](https://github.com/jeanlauliac) and [@t4deu](https://github.com/t4deu))) +- Add missing mock for Jest for `removeEventListener` method ([59c7b2cfac](https://github.com/facebook/react-native/commit/59c7b2cfac534a79ff2461af5fd2034b280812a3) by [@MoOx](https://github.com/MoOx)) +- Fix main size calculation from the aspect ratio ([f751c3460e](https://github.com/facebook/react-native/commit/f751c3460e5dc48c1f1a2d72a56173285899de21)) +- Fix crash in Subscribable due to uglify-es ([b57a78c3de](https://github.com/facebook/react-native/commit/b57a78c3def50eda11e57542be0e5233a62d173b) by [@iMagdy](https://github.com/iMagdy)) +- Update `node-notifier` dependency to fix memory leak ([860fcd458a](https://github.com/facebook/react-native/commit/860fcd458a1873ebcf977be01670be5912ae7104) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Fix issues with pollParams and link ([ca8ce83cc3](https://github.com/facebook/react-native/commit/ca8ce83cc3c38751604afce5a3e2f0473d9cba91) by [@grabbou](https://github.com/grabbou)) + +#### iOS specific fixes + +- DevLoadingView now supports the iPhone X screen shape ([47b36d3ff0](https://github.com/facebook/react-native/commit/47b36d3ff0dbb99fd3fc98f6e981a38084dd4d2c) by [@mrtnrst](https://github.com/mrtnrst)) +- Added bounds check to prevent ScrollView from scrolling to an offset which is out of bounds of the ScrollView ([16c9e5b715](https://github.com/facebook/react-native/commit/16c9e5b71500135a631480035af6cd2de3dafdc9) by [@siddhantsoni](https://github.com/siddhantsoni)) +- **NetInfo** `isConnected` works again ([dbafc29e60](https://github.com/facebook/react-native/commit/dbafc29e60aba1d5b24c2b0d321834c40e0b9bca) by [@alburdette619](https://github.com/alburdette619)) +- In **AlertIOS**, fix duplicate var name declaration ([6893a26bfb](https://github.com/facebook/react-native/commit/6893a26bfb06a2d8ad9d23a572f4d9143305d905)) +- Permit `react-native run-ios --device [id]` by passing port when running on device ([f8fee0a631](https://github.com/facebook/react-native/commit/f8fee0a631d77313d7cb5e65a3dd04a5a8ba3d03) by [@jozan](https://github.com/jozan)) +- Fixed issue with `run-ios` where `Entry, ":CFBundleIdentifier", Does Not Exist` was being received ([5447ca6707](https://github.com/facebook/react-native/commit/5447ca67076a110e2b0df03b014f53d1df4646ab) by [@blackneck](https://github.com/blackneck)) +- Fixed problem in Text measurement on iOS ([a534672e13](https://github.com/facebook/react-native/commit/a534672e132136e7bbd17c94a7f4e67149bcc67a) by [@shergin](https://github.com/shergin)) +- Fix crash when reloading in tvOS ([3a3d884df2](https://github.com/facebook/react-native/commit/3a3d884df253dbc1c02ffef33e99c4a91ea8751b) by [@dlowder-salesforce](https://github.com/dlowder-salesforce)) +- Fixed a bug with positioning of nested views inside **Text** ([7d20de412b](https://github.com/facebook/react-native/commit/7d20de412b37a35951e615d98509573dc1a24bcb) by [@shergin](https://github.com/shergin)) +- Fix blob response parsing for empty body ([f5207ba9c7](https://github.com/facebook/react-native/commit/f5207ba9c764f33ef83fa897f6014d67193be0e2) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix tvOS react-native init release build ([3002c4eb98](https://github.com/facebook/react-native/commit/3002c4eb981d439f0ea304556d8dbd4ffd62a80b) by [@dlowder-salesforce](https://github.com/dlowder-salesforce) +- Fix RedBox from bridge reload due is not re-registering its root view ([2e51fa5f5d](https://github.com/facebook/react-native/commit/2e51fa5f5d4f229329ae457ab1a77ba5bcea0448) by [@fkgozali](https://github.com/fkgozali)) + +#### Android specific fixes + +- Fix: incorrect line-height calculation ([74e54cbcc4](https://github.com/facebook/react-native/commit/74e54cbcc408a8bbdd70f47cc8728d30cdc0d299) by [@strindhaug](https://github.com/strindhaug)) +- Fix crashes with TextInput introduced in 0.53 ([b60a727adb](https://github.com/facebook/react-native/commit/b60a727adbcfa785e3d1b13bf069b766216e60f8) by [@joshyhargreaves](https://github.com/joshyhargreaves)) +- Update ReactAndroid build script to support gradle 2.3.0 ([d8bb990abc](https://github.com/facebook/react-native/commit/d8bb990abc226e778e2f32c2de3c6661c0aa64e5)) +- Allow "unexpected URL" exception to be caught on Android when using fetch ([da84eba318](https://github.com/facebook/react-native/commit/da84eba318ae69fea28f40418178bdeb35c4a99b) by [@jcurtis](https://github.com/jcurtis)) +- Fix `onLayout` prop for **TextInput** ([8a073c1d8b](https://github.com/facebook/react-native/commit/8a073c1d8b89305a9a2561a7c33740919730f408) by [@rozele](https://github.com/rozele)) +- Fix ViewPager when using native navigation ([a1295e1707](https://github.com/facebook/react-native/commit/a1295e1707a856b9cd5c3129320d386aa9166310) by [@ruiaraujo](https://github.com/ruiaraujo)) +- Fix localization crash in **DevSettingsActivity** ([427e464bb9](https://github.com/facebook/react-native/commit/427e464bb95e4e0ecc7455e71b5d477014618200) by [@ayc1](https://github.com/ayc1)) +- Fix pinch crash in touch-responsive views ([67c3ad4e6a](https://github.com/facebook/react-native/commit/67c3ad4e6a1847cbac43115b01f72cc5c8932a61) by [@tobycox](https://github.com/tobycox)) +- Fix IllegalStateException thrown in looped timing native animation ([ef9d1fba23](https://github.com/facebook/react-native/commit/ef9d1fba237c08a158c8f32e823f229921e7c052) by [@kmagiera](https://github.com/kmagiera)) +- Workaround android-only js module resolution issue ([c20e0f94fe](https://github.com/facebook/react-native/commit/c20e0f94feb42a71633212114b42c62494fd4ff0) by [@fkgozali](https://github.com/fkgozali)) +- Fix ReadableNativeMap.toHashMap() for nested maps and arrays ([15fa2250fd](https://github.com/facebook/react-native/commit/15fa2250fdd0865ce1d0c6ac13b817e7b2c7757a) by [@esamelson](https://github.com/esamelson)) +- Fix Android Sanity Buck version check ([e0573225d5](https://github.com/facebook/react-native/commit/e0573225d5fe28e5ad61690eda3060289bdbf3a4) by [@hramos](https://github.com/hramos)) +- Fixes the connection to Firestore by following whatwg.org's XMLHttpRequest send() method ([d52569c4a1](https://github.com/facebook/react-native/commit/d52569c4a1b6bd19792e4bda23e3a8c3ac4ad8df) by [@samsafay](https://github.com/samsafay)) +- `invertStickyHeaders` can now be set from **SectionList** or **FlatList** ([dd479a9377](https://github.com/facebook/react-native/commit/dd479a93772c3a52561fc32ee84b25ce822a30fa) by [@dannycochran](https://github.com/dannycochran)) + +### Removed: features that have been removed; these are breaking + +- Removed various types ([b58e377961](https://github.com/facebook/react-native/commit/b58e377961ddd278bfa36df0e15953f976875de6), [ee26d9bcb0](https://github.com/facebook/react-native/commit/ee26d9bcb0719246efa51af404aa7805404675cc), [d89517d60a](https://github.com/facebook/react-native/commit/d89517d60a8a6cabc9013b603fa3f63a1face6a2), [852084ad45](https://github.com/facebook/react-native/commit/852084ad454565bb856e85f09e098f1a4a0771a6) by [@TheSavior](https://github.com/TheSavior)) +- Deleted `Systrace.swizzleJSON()` ([3e141cb6c9](https://github.com/facebook/react-native/commit/3e141cb6c957143e998bf2926b8fe1aabccbce2d) by [@yungsters](https://github.com/yungsters)) + +#### Android specific removals + +- `ReactInstanceManager#registerAdditionalPackages` has been removed; Create UIManager interface and extract common classes in uimanager/common ([6b45fb2cb1](https://github.com/facebook/react-native/commit/6b45fb2cb1ca44fa7375bc7696bf90a68a85df3c) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific removals + +- Remove callFunctionSync experimental APIs ([19a4a7d3cb](https://github.com/facebook/react-native/commit/19a4a7d3cb6d00780ccbbbd7b0062896f64ab24d) by [@danzimm](https://github.com/danzimm)) + +## v0.54.0 + +Welcome to the February 2018 release of React Native! This release includes work done by the React Native team and the community in January, and there are some big changes here after the holidays. Thanks for 270 commits from 87 contributors, you all are great! Here are a few highlights from the release: + +- Long awaited **Blob** changes: upload, download, fetch locally, and more +- Sticky headers now work on inverted Lists +- Update to the newest React, which deprecated some lifecycle methods and added new ones – expect Yellowbox until React Native is updated +- `Space-evenly` is now there (sorry for the confusion with 0.52's release notes) +- A lot of under-the-covers work on Yoga, iOS's **Text** and **TextInput**, and a ton of other areas +- Multiple crash fixes + +The changelog is arranged by the customary added, removed, changed, and fixed plus internal; the changes are also organized by platform. + +### Added + +- ✨ **Blob**s now can be: made from Strings, loaded by File using a FileReader API, uploaded and downloaded via `XMLHttpRequest#fetch`, and fetched on files to a local blob consistently ([be56a3efee](https://github.com/facebook/react-native/commit/be56a3efeefefa6dca816ca5149a3dabfa5164e2) and [854c2330eb](https://github.com/facebook/react-native/commit/854c2330ebe748eb0508bb788685232b6cff0022) by [@satya164](https://github.com/satya164) and [@fkgozali](https://github.com/fkgozali)) +- Dynamic node_module dependencies are now supported ([b5e19adc02](https://github.com/facebook/react-native/commit/b5e19adc02a3293cd3fdbe54cc45adc78f94d325) by [@jeanlauliac](https://github.com/jeanlauliac)) +- Support sticky headers for inverted Lists with `invertStickyHeaders` ([ecaca80d42](https://github.com/facebook/react-native/commit/ecaca80d42b686e4cf91aa4bb0c8fce69eba18bb) by [@janicduplessis](https://github.com/janicduplessis)) +- `space-evenly` is now supported (sorry for the confusion with 0.52 notes) ([b1cdb7d553](https://github.com/facebook/react-native/commit/b1cdb7d553146160f99319f9dbe4083b18db60e4) by [@gedeagas](https://github.com/gedeagas)) +- Platform plugins can participate in RNConfig, `link`, and `unlink` – keep an eye on [react-native-window's use of it](https://github.com/Microsoft/react-native-windows/pull/1601)! ([a40bfa730e](https://github.com/facebook/react-native/commit/a40bfa730e05c68da49e6f217ae0f161dcc7ba98) by [@rozele](https://github.com/rozele)) +- Add `minify` flag to react-native bundle command ([3f969cb1db](https://github.com/facebook/react-native/commit/3f969cb1db3a39dd8a4fd622abbb7e4270a84216) by [@tomduncalf](https://github.com/tomduncalf)) + +#### VR Specific Additions + +- Added **ScrollView** support ([6fa039dab0](https://github.com/facebook/react-native/commit/6fa039dab0b9f738a3cb464aeca378c6210a5747) by [@MartinSherburn](https://github.com/MartinSherburn)) + +#### Android Specific Additions + +- Bundle download progress is now shown like iOS ([d06e143420](https://github.com/facebook/react-native/commit/d06e143420462344ea6fc21c0446db972f747404) by [@janicduplessis](https://github.com/janicduplessis)) +- Add back ability to customise OkHttp client ([22efd95be1](https://github.com/facebook/react-native/commit/22efd95be1f0b236eeaaa8a8e6d01e89771c9543) by [@cdlewis](https://github.com/cdlewis)) + +#### iOS specific additions + +- **ScrollView** now supports smooth bi-directional content loading and takes new prop `maintainVisibleContentPosition` ([cae7179c94](https://github.com/facebook/react-native/commit/cae7179c9459f12b1cb5e1a1d998a9dc45f927dc) and [65184ec6b0](https://github.com/facebook/react-native/commit/65184ec6b0ef2d136c0db239d65e0624efac8a2d) by [@sahrens](https://github.com/sahrens)) +- Allow substituting a default font handler ([a9c684a0ff](https://github.com/facebook/react-native/commit/a9c684a0ff45852087310d5218062acfdab673f7) by [@mmmulani](https://github.com/mmmulani)) +- Add `accessibilityElementsHidden` prop ([31288161e1](https://github.com/facebook/react-native/commit/31288161e188723456fdb336c494f3c8a3f5b0a8) by [@aputinski](https://github.com/aputinski)) +- Add EXTRA_PACKAGER_ARGS extensibility point on `scripts/react-native-xcode.sh` (PR rev [0d4ff1b7ea](https://github.com/facebook/react-native/commit/0d4ff1b7ea768cceca0405c665e322c0d6b5ba20) by [@brunolemos](https://github.com/brunolemos) with landing assists [b8c86b8dec](https://github.com/facebook/react-native/commit/b8c86b8deced01027b609959576ffcf5d2d0f520) and [0d4ff1b7ea](https://github.com/facebook/react-native/commit/0d4ff1b7ea768cceca0405c665e322c0d6b5ba20)) + +### Removed + +- Remove internal `utf8` utility - use the **utf8** package now instead ([431670f908](https://github.com/facebook/react-native/commit/431670f90860936c24260d36fc73e0c5fbf4e02a) by [@mathiasbynens](https://github.com/mathiasbynens)) + +#### iOS specific removals + +- Removed outdated assertion in RCTShadowView related to breaking change in Yoga ([e3ff3cf6cb](https://github.com/facebook/react-native/commit/e3ff3cf6cbc137e315eff6ac8aed43954b3668eb) by [@shergin](https://github.com/shergin)) + +#### Android specific removals + +- Fix an issue when swapping to and from the `visible-password` or `phone-pad` keyboard types. ([164f6b6afd](https://github.com/facebook/react-native/commit/164f6b6afd7e0050d63134fcdc65ec6969ab03a0) by [@BrandonWilliamsCS](https://github.com/BrandonWilliamsCS)) +- Remove redundant config in AndroidManifest.xml ([d7a9ca2893](https://github.com/facebook/react-native/commit/d7a9ca2893fb240c25d1cd1e0778f6b93b1e3ded) by [@gengjiawen](https://github.com/gengjiawen)) + +#### iOS specific removals + +- Delete RCTBatchedBridge ([816d417189](https://github.com/facebook/react-native/commit/816d41718998868f276d83b0c21e17d11ad392a2) by [@mhorowitz](https://github.com/mhorowitz)) + +### Changed + +- Docs clarifications ([7abffc3f8c](https://github.com/facebook/react-native/commit/7abffc3f8ce69fab5bbb4147f9b8bcb85a7d2c38) by [@IgorGanapolsky](https://github.com/IgorGanapolsky)) + +#### iOS Specific Changes + +- ⚡️ **Text** and **TextInput** have been re-implemented from the ground up for performance, flexibility, and reduced technical debt ([2716f53220](https://github.com/facebook/react-native/commit/2716f53220f947c690d5f627286aad51313256a0), [74963eb945](https://github.com/facebook/react-native/commit/74963eb945438a6fd269b5764a6cb251c86deda8), [d7fa81f181](https://github.com/facebook/react-native/commit/d7fa81f18110f0dc0f310a5c066d9a30020ca830), [74963eb945](https://github.com/facebook/react-native/commit/74963eb945438a6fd269b5764a6cb251c86deda8), [6c4ef287ad](https://github.com/facebook/react-native/commit/6c4ef287ad95eb14475a9f512487e5d05949309a), [ebc98840e9](https://github.com/facebook/react-native/commit/ebc98840e93c336e8c9e4a93c78e6ca03591f0ec), [d7fa81f181](https://github.com/facebook/react-native/commit/d7fa81f18110f0dc0f310a5c066d9a30020ca830), [7d1ec7a3dc](https://github.com/facebook/react-native/commit/7d1ec7a3dc66654b13a8e9cb3ddf912e92506f55), [52648326e6](https://github.com/facebook/react-native/commit/52648326e6ac4470eeffc0a56d91bc487bc1eae4), [6bb8617f3a](https://github.com/facebook/react-native/commit/6bb8617f3a2f3f80f89eb00595a621aec35aca83), [5dbb3c586c](https://github.com/facebook/react-native/commit/5dbb3c586c9e8483aa7e6f1edd35ffb12bd4305d), [7e7d00aebe](https://github.com/facebook/react-native/commit/7e7d00aebefd2416f948066c65c739581c6e3f54), [46fd864348](https://github.com/facebook/react-native/commit/46fd8643485b21147c780d22ee8cf751b2dc8750), [9dfa2e7f3c](https://github.com/facebook/react-native/commit/9dfa2e7f3cfa5009f6c54382e90681d99a9c3cb8), [8a882fe6d6](https://github.com/facebook/react-native/commit/8a882fe6d6bb35776551eb8b0cd6892f41cab492), and [0f9fc4b295](https://github.com/facebook/react-native/commit/0f9fc4b2953d52fa1754e786dc5c74bfecbeaaca) by [@shergin](https://github.com/shergin) and [@hovox](https://github.com/hovox)) +- **Image**'s `resizeMode="center"` is now documented and has an example present ([be7037fd8e](https://github.com/facebook/react-native/commit/be7037fd8e1c4b92646caf7a70b9d6d28ef2c30a) by [@motiz88](https://github.com/motiz88)) +- Geolocation API no longer timeouts when `skipPermissionRequests: true` ([5c17db8352](https://github.com/facebook/react-native/commit/5c17db8352abfd94f094deb9b550284ec17f1fcd) by [@ngandhy](https://github.com/ngandhy)) +- Rounding pixels is now done with an algorithm from Yoga rather than React Native, reducing debt and improving performance ([ceb1d1ca5b](https://github.com/facebook/react-native/commit/ceb1d1ca5bc7c04b9d9ad16dcd9583f05b0ef498) and [114c258045](https://github.com/facebook/react-native/commit/114c258045ccca3a4433de206c7983b42d14c03b) by [@shergin](https://github.com/shergin)) + +#### Android specific changes + +- Numerous refactors around bundle handling and the `DevServerHelper` ([644123aa6f](https://github.com/facebook/react-native/commit/644123aa6fc6132125f56b485e5ab3b16f28f666), [e756251413](https://github.com/facebook/react-native/commit/e7562514130f614a9f138c0b855bfe4516150add), [6e44356c9b](https://github.com/facebook/react-native/commit/6e44356c9bb364195280aafc69aae48cdcb2ab84), [1019bda930](https://github.com/facebook/react-native/commit/1019bda930fa4c26fc0006efa023ee2c586705c6), [06d8f96a64](https://github.com/facebook/react-native/commit/06d8f96a64f00a003e34b0c1e93033893173ccc8), [f88c9d6382](https://github.com/facebook/react-native/commit/f88c9d63828e975a9792969e27accd851ead3e86), and [108f9664bf](https://github.com/facebook/react-native/commit/108f9664bffd1a4e0a7b2c2da3dc3810f1b29de2) by [@davidaurelio](https://github.com/davidaurelio)) + +### Fixed + +- Fix JS debugger issues related to CORS ([29f8354c19](https://github.com/facebook/react-native/commit/29f8354c1946a6325e9020b9ef5ee4ccdf0fa51f) by [@njbmartin](https://github.com/njbmartin)) +- Keep the `.gitignore`d files during the `react-native-git-upgrade` process ([7492860ffb](https://github.com/facebook/react-native/commit/7492860ffb3a010ff2273abf45c7414c098bdc37) by [@ncuillery](https://github.com/ncuillery)) +- Fix re-render case on SwipeableRow ([a580a44b0d](https://github.com/facebook/react-native/commit/a580a44b0d51ca7f33a4394b0a22d1c7d2234190)) +- Fix display of syntax error messages when HMR is enabled ([2b80cdf1bb](https://github.com/facebook/react-native/commit/2b80cdf1bba3b756915117139474440c203cbd8d) by [@ide](https://github.com/ide)) +- Add fixtures to metro blacklist in order to let build succeed ([54dc11a5fb](https://github.com/facebook/react-native/commit/54dc11a5fbafaccc9c0a781f1151225909717597) by [@t4deu](https://github.com/t4deu)) + +#### Android specific fixes + +- Don't crash when using decimal `Animated.modulo` values with `useNativeDriver: true` ([6c38972327](https://github.com/facebook/react-native/commit/6c389723274712bc52d6642cc6c1907b5523726d) by [@motiz88](https://github.com/motiz88)) +- Don't crash when receiving unknown websocket IDs ([1a790f8703](https://github.com/facebook/react-native/commit/1a790f8703d44c2322000dbf40a55678ca8a436a) by [@sunweiyang](https://github.com/sunweiyang)) +- Dont crash when `NativeModules.UIManager.showPopupMenu` method calls error callback ([0c18ec5b9c](https://github.com/facebook/react-native/commit/0c18ec5b9c64613dbdcd4be9f80e470e9532483d) by [@dryganets](https://github.com/dryganets)) +- Maintain cursor position when **TextInput**'s `secureTextEntry` changes ([09b43e479e](https://github.com/facebook/react-native/commit/09b43e479e97dfe31910503190b5d081c78e4ea2) by [@jainkuniya](https://github.com/jainkuniya)) +- Race condition fix in Dialogs module ([d5e3f081c6](https://github.com/facebook/react-native/commit/d5e3f081c6b41697533775d378969fcf554c7290) by [@dryganets](https://github.com/dryganets)) +- Fix NPE in Android Switch during measure ([7b1915e74d](https://github.com/facebook/react-native/commit/7b1915e74daa82d0a94e90ff266e9271bc43f4d8) by [@4ndroidev](https://github.com/4ndroidev)) +- Fix initialScrollIndex ([ef596dec49](https://github.com/facebook/react-native/commit/ef596dec49975dd4f8860ad8adcd29dd23e04c14) by [@olegbl](https://github.com/olegbl)) +- Fix redbox style ([f363dfe766](https://github.com/facebook/react-native/commit/f363dfe766244c8fc10eab3d2c4acdd8fc4b576b) by [@ayc1](https://github.com/ayc1)) +- Fix crash due to mishandling of UTF-8 in progressive download. ([9024f56bda](https://github.com/facebook/react-native/commit/9024f56bda4186fbade7bbd1e61f8e0252585c02) by [@dryganets](https://github.com/dryganets)) +- Fix crash because ClassCastException fix: getText() returns CharSequence not Spanned ([46cc4907e3](https://github.com/facebook/react-native/commit/46cc4907e3e49f5c7b1ac0a1088866f2958f43a1) by [@dryganets](https://github.com/dryganets)) +- Fix and re-enable "view flattening" optimizations ([877f1cde2e](https://github.com/facebook/react-native/commit/877f1cde2ebe8f304d6fd0855fc4a874d1d5ee27) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific fixes + +- Fix Crash when **CameraRoll** is getting assets from iCloud and no filename is provided ([2ae24361c5](https://github.com/facebook/react-native/commit/2ae24361c5e0fc4aed9a321123bba8ca416a35ff) by [@pentarex](https://github.com/pentarex)) +- Fix Xcode Archive task failing if project path contains whitespace ([8aa568e867](https://github.com/facebook/react-native/commit/8aa568e867bbbe7e23ded3651f23581ff2753323) by [@jevakallio](https://github.com/jevakallio)) +- `react-native link` has been fixed to correctly link iOS and tvOS targets ([a63fd378a4](https://github.com/facebook/react-native/commit/a63fd378a47173cc9f750e9980f18dc12dd7ea51) by [@dlowder-salesforce](https://github.com/dlowder-salesforce)) +- `GLog` fix on case sensitive APFS macOS ([2fef1bafc8](https://github.com/facebook/react-native/commit/2fef1bafc8bee33432486212caf4fef5c659dd37) by [@hovox](https://github.com/hovox)) +- Fixed issue where you cannot launch tvOS app on Apple TV simulator ([afd988f85a](https://github.com/facebook/react-native/commit/afd988f85a8cf0980b5844cb88c1803e41502d03)) + +### Internal work + +- A **massive** amount of Yoga optimizations, cleanups, refactors, and test fixes ([62d01006a1](https://github.com/facebook/react-native/commit/62d01006a125517c8991fa93979aaec6ccc18823), [1475fc4856](https://github.com/facebook/react-native/commit/1475fc4856d366f8ec2027374971ed5aefcdeafa), [9daa17458a](https://github.com/facebook/react-native/commit/9daa17458a5f4ab8ead4d7c29de331f08b1a4a46), [d4517ddb9f](https://github.com/facebook/react-native/commit/d4517ddb9f2ad6d6175cbe6a8be2b819e4aa2c29), [ca91f0e3ac](https://github.com/facebook/react-native/commit/ca91f0e3ac55cb1e7a0fa2399d594a47de80a100), [34b7ec82b5](https://github.com/facebook/react-native/commit/34b7ec82b5d22efbdaa8b74b930d3c4da87414ec), [fda861a889](https://github.com/facebook/react-native/commit/fda861a88914a008b94c12078c9e579a99929643), [9f7cedbe14](https://github.com/facebook/react-native/commit/9f7cedbe14321d24b7aee1ba969b3d23d5c9d204), [ac1c8c265e](https://github.com/facebook/react-native/commit/ac1c8c265e6030c52434f99e882639c67c8c175d), [fcf2c7cf61](https://github.com/facebook/react-native/commit/fcf2c7cf61ca454f10d398d57b78b5b29ed05ae2), [2b27f1aa19](https://github.com/facebook/react-native/commit/2b27f1aa1964eba749876100be1f3ac4c085fa8f), [210ae5b95a](https://github.com/facebook/react-native/commit/210ae5b95a9c94194e95a21fdb93f88ddfdc5ce2), [82088580ab](https://github.com/facebook/react-native/commit/82088580ab17417a51386722f98b83d6cad0a6a0), [7f94bff89a](https://github.com/facebook/react-native/commit/7f94bff89a09547e76b50ae4c96ec59de73a153a), [bd7bf94af9](https://github.com/facebook/react-native/commit/bd7bf94af9ddfc9221ac3f6f62821b7e53e9b0ea), [2fe65b032e](https://github.com/facebook/react-native/commit/2fe65b032e9ec3faf3cef31290372b9face2d3f1), [9658d9f82b](https://github.com/facebook/react-native/commit/9658d9f82ba536c2f39937d61b3954e3dcc6a54e), [ee5c91c031](https://github.com/facebook/react-native/commit/ee5c91c0317b0defbb8da21f7e6d8d3ac8967381), [64d530ba07](https://github.com/facebook/react-native/commit/64d530ba0785af21555d48ddc9e7d561af37db4c), [400a29e151](https://github.com/facebook/react-native/commit/400a29e15134f5264cc55b239bd2a18a107911dd), [f75e21f1ca](https://github.com/facebook/react-native/commit/f75e21f1caf9117ae3eda31c23e286116ebf586c), [528bbacf6b](https://github.com/facebook/react-native/commit/528bbacf6b8a5a62faf4db5bfc8dfe063f0b82a3), [be8e7c6e65](https://github.com/facebook/react-native/commit/be8e7c6e65724d4915862098238506172dbe9657), [d0f7d4d107](https://github.com/facebook/react-native/commit/d0f7d4d107a90fdfbf795d842f4bd4a81290ec62), [4b4959a21c](https://github.com/facebook/react-native/commit/4b4959a21cb1e9e356eab51bfba0f16b76e8ec7f), [fdef3784f0](https://github.com/facebook/react-native/commit/fdef3784f00e8c3233a30aa2e35aaaadaa867489), [831a1bb4b1](https://github.com/facebook/react-native/commit/831a1bb4b1cc201b53685874a9dbdd6c3c1615ad), [2a22d998f8](https://github.com/facebook/react-native/commit/2a22d998f8a7f896db6c0708ba92ed9c9082ee7c), [9f57dedc17](https://github.com/facebook/react-native/commit/9f57dedc1712733ce4a490121138a97917fd3a52), and [ff2658c3de](https://github.com/facebook/react-native/commit/ff2658c3de111ef745d9582c6863ab0d6c90f960) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar), [@passy](https://github.com/passy), [@ryu2](https://github.com/ryu2), and others) +- 🚧 Lifecycle methods were renamed to be consistent with [React RFC6](https://github.com/reactjs/rfcs/blob/master/text/0006-static-lifecycle-methods.md) – note that there are Yellowbox warnings right now because of this, it's work-in-progress ([6f007e8957](https://github.com/facebook/react-native/commit/6f007e8957c9bf5652b0184cba65f385050a8236) by [@bvaughn](https://github.com/bvaughn)) +- Some autogenerated mystery string files were added ([c7846c4bfb](https://github.com/facebook/react-native/commit/c7846c4bfb5b944714d95382210f83c83da1ac52), [bb6fceac27](https://github.com/facebook/react-native/commit/bb6fceac274422102b347ec7aedb36efd9b701cd), [8bd00a2361](https://github.com/facebook/react-native/commit/8bd00a2361bb39f1bda58a260b7ffd278a05d79d), [faa9519021](https://github.com/facebook/react-native/commit/faa951902161201846f20a4dc55950e8f96cb0ff), [f49f7932d5](https://github.com/facebook/react-native/commit/f49f7932d581fe1f9569fb460196801528cfb591)) +- Improvements to the cli's implementation ([1673c570f9](https://github.com/facebook/react-native/commit/1673c570f984d86e88a3b6b44eb78f4848eb0515), [752427b7b8](https://github.com/facebook/react-native/commit/752427b7b8221bbb8304a158b2dad12b26afd7a5), and [619a8c9f29](https://github.com/facebook/react-native/commit/619a8c9f298356db68f8cd7e5d25e5bcf48bab05) by [@arcanis](https://github.com/arcanis), [@voideanvalue](https://github.com/voideanvalue), and [@rozele](https://github.com/rozele)) +- Measure touch events from nearest "root view" ([a70fdac5bd](https://github.com/facebook/react-native/commit/a70fdac5bdd4500b4ca3074dac26d414bd931fb9) by [@mmmulani](https://github.com/mmmulani)) +- Allow to attach the HMR server to an external http server ([8c6b816caa](https://github.com/facebook/react-native/commit/8c6b816caa908845471460f453f9d761bfba3f3d) by [@rafeca](https://github.com/rafeca)) +- Split folly/Memory out from headers-only targets in Buck ([b8e79a7e8b](https://github.com/facebook/react-native/commit/b8e79a7e8be1f3db1482a849352fda6e23c1c78a) by [@mzlee](https://github.com/mzlee)) +- Code cleanup of **ReactHorizontalScrollView** in Android ([71ec85f24c](https://github.com/facebook/react-native/commit/71ec85f24c3a1007a9e1f036a140cce43b38019f) by [@mdvacca](https://github.com/mdvacca)) +- Always create a debugger websocket connection when in iOS dev builds ([fa334ce464](https://github.com/facebook/react-native/commit/fa334ce464da39625f4e4fbfee259e9dcea31abc) by [@bnham](https://github.com/bnham)) +- Make the React Native HMR client extend from the generic metro HMR client ([9a19867798](https://github.com/facebook/react-native/commit/9a198677989930971912b98487ec68d162636411) by [@rafeca](https://github.com/rafeca)) +- Removed use of xip.io ([40a8434bde](https://github.com/facebook/react-native/commit/40a8434bde855ecae42408ec1240622152432de7) by [@jvranish](https://github.com/jvranish)) +- Fix Buck dependencies ([cec2e80fc2](https://github.com/facebook/react-native/commit/cec2e80fc251e4ea45ce1e446323716a3792390d), [4f6c157250](https://github.com/facebook/react-native/commit/4f6c157250676f07619af2a935bddd8301b50caa) by [@swolchok](https://github.com/swolchok)) +- Fix permissions on test script ([42c410ac84](https://github.com/facebook/react-native/commit/42c410ac84619a3d12a4619e59a0a526a3ebdca9) by [@mzlee](https://github.com/mzlee)) +- Better handling exception in loadScript() ([3fbf7856d9](https://github.com/facebook/react-native/commit/3fbf7856d9acb0909357d6b315388471a6b5a69c)) +- Fix ESLint upgrade "parsing error" ([9d214967d2](https://github.com/facebook/react-native/commit/9d214967d2c8184ce26addec150e392e3b519fcd) by [@zertosh](https://github.com/zertosh)) +- Fixing 🤡 in RCTSurfaceRootShadowView ([5fba82deff](https://github.com/facebook/react-native/commit/5fba82deffde731176e3e118193c212f5d2c2bca) by [@shergin](https://github.com/shergin)) +- Handle invalidation error in RCTObjcExecutor ([493f3e8da5](https://github.com/facebook/react-native/commit/493f3e8da5a112e1b33bfb3e9f51e7a2bd7edc7a) by [@fromcelticpark](https://github.com/fromcelticpark)) +- Check for nullptr when accessing isInspectable method ([70d23e82ad](https://github.com/facebook/react-native/commit/70d23e82ad21a4cfde1ce7c3b1c00fe7c7d5adbd) by [@fromcelticpark](https://github.com/fromcelticpark)) +- Introduce new Fabric API in RNAndroid ([2d35bde101](https://github.com/facebook/react-native/commit/2d35bde10130167018791c1b2fe4fece27cefddc) by [@mdvacca](https://github.com/mdvacca)) +- Fixing Prepack model for latest global.nativeExtensions changes. ([01a58d182a](https://github.com/facebook/react-native/commit/01a58d182abd19c9e089ec38b08ffd4b45e2076c) by [@NTillmann](https://github.com/NTillmann)) +- General code cleanup: unused code and configurations ([e233646d09](https://github.com/facebook/react-native/commit/e233646d095a272091b07c29fa87b206831ad6e3) and [e7010348d8](https://github.com/facebook/react-native/commit/e7010348d8b2f703fcc057c2914bd45ca6238f98) by [@bvaughn](https://github.com/bvaughn) and others) +- Add support for finding multiple views with NativeIds using a single listener to Android ([f5efc460ad](https://github.com/facebook/react-native/commit/f5efc460ad30cc60a62edd540c3b0f45c67bcda3) by [@axe-fb](https://github.com/axe-fb)) +- Add CountingOutputStream ([a5e135aed6](https://github.com/facebook/react-native/commit/a5e135aed6941772c663adffd67729f7a5026d08) by [@hramos](https://github.com/hramos)) +- Changes from Prettier ([b815eb59be](https://github.com/facebook/react-native/commit/b815eb59bef7bed9825027adc676b8d09db463c6), [e758cb7f39](https://github.com/facebook/react-native/commit/e758cb7f397b37b5621a4e0afcabc1c74443bc06), [bf9cabb03c](https://github.com/facebook/react-native/commit/bf9cabb03c7245930c270a19816545eae1b9007d), and [a5af841d25](https://github.com/facebook/react-native/commit/a5af841d259b6b29d95a9fb346a0ffce9c6efbfe) by [@shergin](https://github.com/shergin)) +- Typos in code ([8ffc16c6e7](https://github.com/facebook/react-native/commit/8ffc16c6e7d25dd434ca3fc7f9ffd6d5917f7bcd) by [@ss18](https://github.com/ss18)) +- Support for inherited events in view managers ([2afe7d4765](https://github.com/facebook/react-native/commit/2afe7d4765ffc0d0c71d233211edd1d21972040e) by [@shergin](https://github.com/shergin)) +- Flow types changes ([3fc33bb54f](https://github.com/facebook/react-native/commit/3fc33bb54fc5dcf7ef696fe245addc320f85a269), [e485cde187](https://github.com/facebook/react-native/commit/e485cde187e4cd92bc821e58047b149a789dd713), [83ed9d170b](https://github.com/facebook/react-native/commit/83ed9d170b8fd750a345fc608ec69db2fe3ca9b2), [52ffa5d13e](https://github.com/facebook/react-native/commit/52ffa5d13ef6fe2752bc8f838dc1c2dfe651bb64), [d37cdd97ae](https://github.com/facebook/react-native/commit/d37cdd97aee4c1bac864cb28b686f2d1a128128e), [6e7fb01c02](https://github.com/facebook/react-native/commit/6e7fb01c02f3e91777c8292389c09a15d24cf800), [d99ba70c49](https://github.com/facebook/react-native/commit/d99ba70c492d3cd15ef6aded3f8712976d251f88), [bcfbdf4fbe](https://github.com/facebook/react-native/commit/bcfbdf4fbec1a05da151a2255f44a87b651965d6), and [a1c479fb3b](https://github.com/facebook/react-native/commit/a1c479fb3be674511131b46f856bc9b197a38cda) by [@alexeylang](https://github.com/alexeylang), [@sahrens](https://github.com/sahrens), [@yungsters](https://github.com/yungsters), and [@zjj010104](https://github.com/zjj010104)) +- Give IInspector a virtual destructor for correct InspectorImpl destruction ([2a3c37f424](https://github.com/facebook/react-native/commit/2a3c37f424a4d1b9f4c5a2960a1cbe3517eac007) by [@toulouse](https://github.com/toulouse)) +- Migrated `SourceCode` and `DeviceInfoModule` out of Native Modules ([47fe52380a](https://github.com/facebook/react-native/commit/47fe52380a232a1c364e21f71e2644a5a3348366) and [429fcc8cab](https://github.com/facebook/react-native/commit/429fcc8cab3ca877275d7deb1040fdff17a414c7)) +- Jest config change as part of bringing back support for the `assetPlugin` option in Metro ([af6450c660](https://github.com/facebook/react-native/commit/af6450c660d3055d9c5c70d200471541a1ce7e12) by [@ide](https://github.com/ide)) +- Nested virtualized lists should receive recordInteration events ([ae2d5b1e68](https://github.com/facebook/react-native/commit/ae2d5b1e68a2207c27ef2f1b533f86c86d6d849b)) +- Upgrade connect dependency ([709ede799c](https://github.com/facebook/react-native/commit/709ede799cc9820acadaf22aa84f0fe6dd2be319) by [@rafeca](https://github.com/rafeca)) +- xplat/js: asyncRequire: redirect async modules to control modules ([5e11b8870a](https://github.com/facebook/react-native/commit/5e11b8870aa855a56cfafa6575aed5e33b272065) by [@jeanlauliac](https://github.com/jeanlauliac)) +- More progress towards split bundle support ([1a1a956831](https://github.com/facebook/react-native/commit/1a1a956831aec93a4fe2c6e2f63f558271fb466b) and [9e34cbda9d](https://github.com/facebook/react-native/commit/9e34cbda9de8f7350cfb02c884fbef2da18e0e3a) by [@fromcelticpark](https://github.com/fromcelticpark)) +- Implement bundle sync status ([88980f2ef7](https://github.com/facebook/react-native/commit/88980f2ef7331aa630ff19e54427cdc3b7510869)) +- Various improvements to RCTSurface and RCTShadowView ([7d9e902d72](https://github.com/facebook/react-native/commit/7d9e902d72e240f54ea01225cc3272698ff70014), [06ebaf2205](https://github.com/facebook/react-native/commit/06ebaf2205f979b6e6595ec7985447a07d25c4d4), [6882132421](https://github.com/facebook/react-native/commit/688213242130536c5d4db8b9aa17dc418372aadf), and [193a2bd4cd](https://github.com/facebook/react-native/commit/193a2bd4cdffbbc79b69c067b31420663dc9b03a) by [@shergin](https://github.com/shergin)) +- Progress towards experimental ReactFabric and FabricUIManager ([b1e5c01483](https://github.com/facebook/react-native/commit/b1e5c01483a69b181c75d242231077cb2f96e846), [fa0ac92b2c](https://github.com/facebook/react-native/commit/fa0ac92b2c9cfc302314ff18325a96354bb1f432), [94dac23583](https://github.com/facebook/react-native/commit/94dac23583dc6b693475769c196c4b51954e74f1) by [@fkgozali](https://github.com/fkgozali)) +- (almost) kill fbjsc ([702b7e877e](https://github.com/facebook/react-native/commit/702b7e877e09afede0dcdc7f8c680be63e942153) by [@michalgr](https://github.com/michalgr)) +- Refactored bridge ReadableNativeMap and ReadableNativeArray to add centralized accesses ([7891805d22](https://github.com/facebook/react-native/commit/7891805d22e3fdc821961ff0ccc5c450c3d625c8), [28be33ac34](https://github.com/facebook/react-native/commit/28be33ac34d9214ffd452f88a4d19468683a6a0d), and [5649aed6d3](https://github.com/facebook/react-native/commit/5649aed6d3223ec49c42416f242249eb0c4fd890)) +- Removed unused core from Image.android.js ([ce3146a6f3](https://github.com/facebook/react-native/commit/ce3146a6f3162141c7dc06d2c91ec291d3756a92) by [@shergin](https://github.com/shergin)) +- Capture StackOverflowExceptions triggered when drawing a ReactViewGroup or ReactRootView and log more debugging information for it ([1aac962378](https://github.com/facebook/react-native/commit/1aac9623789e3d2a428b51ae699d4c340b3afb99) and [4d3519cc6a](https://github.com/facebook/react-native/commit/4d3519cc6af5bb33c6f21d9392b82379780d79dc) by [@mdvacca](https://github.com/mdvacca)) +- `babel-preset-react-native`: only require plugins once ([df6c48cf36](https://github.com/facebook/react-native/commit/df6c48cf36d39a75a6196462d661ce75c6aef104) by [@davidaurelio](https://github.com/davidaurelio)) +- Report module id as string and as double, in case of invalid values are passed to nativeRequire ([8f358a2088](https://github.com/facebook/react-native/commit/8f358a20881b61cf3256fa1e404b86d5f104932d) by [@fromcelticpark](https://github.com/fromcelticpark)) +- More work moving build configurations to Skylark ([d3db764f38](https://github.com/facebook/react-native/commit/d3db764f383fc588a87e0d1e4267b310d6188bc8), [869866cc5c](https://github.com/facebook/react-native/commit/869866cc5c639d8c0257c776368381987a7f7159), [a8c95d2417](https://github.com/facebook/react-native/commit/a8c95d241757fefaa06ff49193975f7c103a6418), and [79a63d040f](https://github.com/facebook/react-native/commit/79a63d040f1346a0e320104fb35da405502aae19) by [@mzlee](https://github.com/mzlee), [@ttsugriy](https://github.com/ttsugriy), and others) +- `[RCTShadowView isHidden]` was removed ([c19bc79688](https://github.com/facebook/react-native/commit/c19bc7968855e85758df9e1a47dc2a52e69668ed) by [@shergin](https://github.com/shergin)) +- Remove unused `packagerInstance` option and rename it to `server` ([bbbc18c4ee](https://github.com/facebook/react-native/commit/bbbc18c4ee9b13a5aeca10edcb29694db3f15769)) +- The blog has moved to [react-native-website](https://github.com/facebook/react-native-website/tree/master/website/blog) ([e16d67340e](https://github.com/facebook/react-native/commit/e16d67340e0ad1724afeee78f9d820177abbd8b6) by [@hramos](https://github.com/hramos)) +- Remove SoLoaderShim, use SoLoader ([fc6dd78935](https://github.com/facebook/react-native/commit/fc6dd78935a41106aa6a44058c1abb7d0ba0fa24) by [@foghina](https://github.com/foghina)) +- Removed broken link for 'Getting Help' in the README ([b3a306a667](https://github.com/facebook/react-native/commit/b3a306a66709a0ab0ff29151a38eaa3f8f845c1f) by [@rickydam](https://github.com/rickydam)) +- Changed to use boost-for-react-native cocoapod, which speeds up `pod install` a ton; this was in 0.53 originally but had to be re-added ([d40db3a715](https://github.com/facebook/react-native/commit/d40db3a715afaf1cde4a5e231e96e46b2808bbef) by [@CFKevinRef](https://github.com/CFKevinRef)) +- Remove fbobjc's RN copy ([af0c863570](https://github.com/facebook/react-native/commit/af0c8635709b8014c68ce88ebb1e9e94ec56768a)) +- Measure time to create **ReactInstanceManager** ([6224ef5301](https://github.com/facebook/react-native/commit/6224ef5301d67266b28c77e5e46816f319122f38) by [@alexeylang](https://github.com/alexeylang)) +- Upgrade create-react-class to v15.6.3 ([74f386633d](https://github.com/facebook/react-native/commit/74f386633d5e123b2ea73b4773d0ee7d83832fb5) by [@bvaughn](https://github.com/bvaughn)) +- Upgrade react-devtools to v3.1.0 ([8235a49a33](https://github.com/facebook/react-native/commit/8235a49a33cc8e84cd4ba1cc15bc09eed6712b4c) by [@bvaughn](https://github.com/bvaughn)) +- Upgrade flow to v0.65.0 ([7aba456b04](https://github.com/facebook/react-native/commit/7aba456b04ff6a4e4721bcf1064f22a8a87f90c7) and [298f3bb69a](https://github.com/facebook/react-native/commit/298f3bb69abecdcd83adb64e043a2974bd52b1ab) by [@avikchaudhuri](https://github.com/avikchaudhuri) and [@mroch](https://github.com/mroch)) +- Upgrade Jest to v22.2.1 ([46f4d3e1bc](https://github.com/facebook/react-native/commit/46f4d3e1bc9340009c53f366ebd98600c485c993) and [24e521c063](https://github.com/facebook/react-native/commit/24e521c063035e470587bb279976a955ff03717a) by [@mjesun](https://github.com/mjesun)) +- Upgrade ESLint to v4.17.0 (plus update related deps) ([bba19e846e](https://github.com/facebook/react-native/commit/bba19e846e377241826475906f642264409a3990) by [@zertosh](https://github.com/zertosh)) +- Upgrade React to v16.3.0-alpha.1 ([03d7b2aa0e](https://github.com/facebook/react-native/commit/03d7b2aa0e7f239c78b6fe3a96c0ddf3de00a58b) and [5e80d95e03](https://github.com/facebook/react-native/commit/5e80d95e034259af8c41b50756a623756cc81a77) by [@grabbou](https://github.com/grabbou) and [@hramos](https://github.com/hramos)) +- Synced React and ReactFabric render ([c7ed03a95c](https://github.com/facebook/react-native/commit/c7ed03a95c8c372c7631c11e0778cf9753afdabc), [13829751b1](https://github.com/facebook/react-native/commit/13829751b11330f8e1400c5c70c59c49ac2f091f), and [d676746f14](https://github.com/facebook/react-native/commit/d676746f14fb6d714d2576871655b13c005480e7) by [@bvaughn](https://github.com/bvaughn)) +- Upgrade metro to v0.26.0 ([9e6f3b8aff](https://github.com/facebook/react-native/commit/9e6f3b8aff7572f5e9008a2641c70846da0817bb), [ce50f25d22](https://github.com/facebook/react-native/commit/ce50f25d22d56f24bdb7d80a3f9a279863d5dc2a), [e9b83e608e](https://github.com/facebook/react-native/commit/e9b83e608e8487ef8fcbfc956a52bfa7ee1d727f), [2fe7483c36](https://github.com/facebook/react-native/commit/2fe7483c36b10146f737f0a84799c2eb01aaba79), [0f96ebd93b](https://github.com/facebook/react-native/commit/0f96ebd93b634ec3fb0e6036a4960bb4af167e7b), [0de470ec19](https://github.com/facebook/react-native/commit/0de470ec19f2b9f3f4f3ab3dd4322c0f0ece2868), [e8893a021f](https://github.com/facebook/react-native/commit/e8893a021f60ffeea27443998b1716e9a1963d64), and [b1d8af48ae](https://github.com/facebook/react-native/commit/b1d8af48ae251f57bdcd55f89d8fc62aa9eca872) by [@rafeca](https://github.com/rafeca) and [@grabbou](https://github.com/grabbou)) +- Add Context to Redbox report api ([e3c27f585a](https://github.com/facebook/react-native/commit/e3c27f585aaeb685e86250f45fc790c06932af0d) by [@ayc1](https://github.com/ayc1)) +- GitHub bot commands have been disabled in the short term ([b973fe45bd](https://github.com/facebook/react-native/commit/b973fe45bdbc84e12fd0a3afbd6fdd327bcb9d02) by [@hramos](https://github.com/hramos)) +- Various CI configuration changes ([17bd6c8e84](https://github.com/facebook/react-native/commit/17bd6c8e84d9f5d42767a6f42a9a2cf812aa778b), [51b6749c07](https://github.com/facebook/react-native/commit/51b6749c075bb87a340096a0dc06cd6cf9a19907), [a2f3ba864e](https://github.com/facebook/react-native/commit/a2f3ba864ed17ca32e71f15724a8ebf2b1e640c1), [2ef9b7f2da](https://github.com/facebook/react-native/commit/2ef9b7f2da5b875ac1a4fee0ade3cc16ad96772a), [40b17926bb](https://github.com/facebook/react-native/commit/40b17926bb2c724f1580b2eb0c30a37f5d48030a), [613afbab7f](https://github.com/facebook/react-native/commit/613afbab7f30748ba767b055f23d0d294562805f), [da8bec9f8b](https://github.com/facebook/react-native/commit/da8bec9f8b62b46e58e0e98413aa915ece05b71b), [fa11faecb6](https://github.com/facebook/react-native/commit/fa11faecb69f385a5c0aba60f4039612e46b87f3), [f50af7f8a4](https://github.com/facebook/react-native/commit/f50af7f8a48e9cae2cb512962870d5692da5aaf2), [9227ba73ab](https://github.com/facebook/react-native/commit/9227ba73ab8c2b8b8ce4086b5f4667a8a55cdcfa), [365a4d4b43](https://github.com/facebook/react-native/commit/365a4d4b4315d4ca7a0e1236012b763d7e5bb1fd), [b58d848d9c](https://github.com/facebook/react-native/commit/b58d848d9cf78d755fe38392e26826ed481175cd), [c8e98bbaf5](https://github.com/facebook/react-native/commit/c8e98bbaf58b7a7f866e831982355b78dfa43b9d), [f5975a97ad](https://github.com/facebook/react-native/commit/f5975a97adcf3ae9c2988d7e267947a84ab60cee), and [605a6e4031](https://github.com/facebook/react-native/commit/605a6e4031fc9b63edbb9120ffacf7b045dc9db8) by [@hramos](https://github.com/hramos), [@grabbou](https://github.com/grabbou), and [@dryganets](https://github.com/dryganets)) +- Restore copyright header ([4f883bd0bc](https://github.com/facebook/react-native/commit/4f883bd0bcdc015e2cf70bcc29bbe05fd5b8a40b) by [@hramos](https://github.com/hramos)) +- Trim docs that are already present in the open source docs site ([28d60b68ad](https://github.com/facebook/react-native/commit/28d60b68ad7bc5b7ebda6b720981feacd3bde337) by [@hramos](https://github.com/hramos)) +- Fix obsolete instructions about editing docs ([2f46712074](https://github.com/facebook/react-native/commit/2f46712074d187f5456723499e6885bf0941cfbc) by [@ExplodingCabbage](https://github.com/ExplodingCabbage)) +- Fix links to beginner friendly issues ([c355a34de1](https://github.com/facebook/react-native/commit/c355a34de107befd26bc495272b91c11957f3fd0) by [@hotchemi](https://github.com/hotchemi)) +- Typos in comments and log messages ([d2c569795c](https://github.com/facebook/react-native/commit/d2c569795ca07b6b7c0227cfc6d0b3bf5dd23b99) by [@ss18](https://github.com/ss18)) +- Don't run the Danger CI tool through Flow ([1ea3065feb](https://github.com/facebook/react-native/commit/1ea3065feb265bef738bd53e835567d595266725) by [@hramos](https://github.com/hramos)) +- Namespace custom ESLint rules through eslint-plugin-lint ([488b6825c5](https://github.com/facebook/react-native/commit/488b6825c5fb4ec68a8b7315559c4d34e012de12) by [@zertosh](https://github.com/zertosh)) + +- ... and now we're at 0.54 🎉 ([67e67ec83c](https://github.com/facebook/react-native/commit/67e67ec83ce83d4a1a38bc29dd52bf5c28723752), [21dd3dd296](https://github.com/facebook/react-native/commit/21dd3dd296989f4de2d4e9b1ba0df88ea2d32413), [49e35bd939](https://github.com/facebook/react-native/commit/49e35bd9399716a2734e824bab14faf1683cdfdd), [829f675b8b](https://github.com/facebook/react-native/commit/829f675b8b4abae696151e404552af515a2da1ce), and [294d95a236](https://github.com/facebook/react-native/commit/294d95a23687b2e3155fe4ae1bc5e4a649e6b014) by [@grabbou](https://github.com/grabbou) and [@hramos](https://github.com/hramos)) + +## v0.53.0 + +Welcome to the January 2018 release of React Native. The CLI now supports `--port` for both platforms, a few components were made to support consistent props across both platforms, and various fixes were made. There was a lot of under-the-cover work done with more test improvements and dependency updates. 118 commits were made by 43 contributors 🎉. + +### Added + +- ✨ **Keyboard** events now include `easing` and `duration` ([4d33080f0f](https://github.com/facebook/react-native/commit/4d33080f0fa7b2eb7b0e9ff7bbd50c222f461786) by [@sahrens](https://github.com/sahrens)) + +#### iOS exclusive additions + +- `react-native run-ios` now supports the `--port` argument for metro ([33d710e8c5](https://github.com/facebook/react-native/commit/33d710e8c58ef1dc69816a59ac1cf390894e7cb9)) + +#### Android exclusive additions + +- On Android, **ScrollView** now takes `snapToInterval` like iOS ([ddd65f1ba9](https://github.com/facebook/react-native/commit/ddd65f1ba9cca945313d116c1dcf75f3a0556099) and [b2848a54b0](https://github.com/facebook/react-native/commit/b2848a54b05470b3e258c935dd33b8c11a31b3c3) ) +- On Android, **TextInput** now takes `onKeyPress` like iOS ([c9ff0bc212](https://github.com/facebook/react-native/commit/c9ff0bc212b680232f7379fba7b9332927075c3c) by [@joshyhargreaves](https://github.com/joshyhargreaves)) + +### Changed + +- ⬆️ Metro to v0.24.2 ([2e008bc464](https://github.com/facebook/react-native/commit/2e008bc464f94df013794d3da6e9d4e4722151a0) and [0b5e8b4852](https://github.com/facebook/react-native/commit/0b5e8b485229957086d416c307f07c75a4139ffa) by [@rafeca](https://github.com/rafeca)) +- ⬆️ Flow to v0.63 ([6b95c4fb14](https://github.com/facebook/react-native/commit/6b95c4fb142a7015b2afca50cc19eec0b8913d8c) by [@gabelevi](https://github.com/gabelevi)) +- ⬆️ Danger to v2.0 ([b750e3b21b](https://github.com/facebook/react-native/commit/b750e3b21bc5c135773e8de53c5663bdf6266951) by [@hramos](https://github.com/hramos)) +- ⬆️ Jest to v22.0.0 ([4803419dc8](https://github.com/facebook/react-native/commit/4803419dc8406b6892f20cdfb448a01c16ad4338) by [@mjesun](https://github.com/mjesun)) +- 💄 Bundler is now called Metro Bundler in the terminal ([654d7595fe](https://github.com/facebook/react-native/commit/654d7595fe5766667c015307129e75d8986482e1) by [@edcs](https://github.com/edcs)) +- 📝 Update getting started url on Android CLI ([6661633390](https://github.com/facebook/react-native/commit/6661633390276f707faa60509b2805a83929e747)) +- 🐳 Dockerfile uses newest Android SDK, Buck, and new Docker tags have been pushed ([4fbfbe6bb0](https://github.com/facebook/react-native/commit/4fbfbe6bb0e0eaaf12ec713888bf2c6a347f0f96) and [c547f783c4](https://github.com/facebook/react-native/commit/c547f783c440019a4a87ba55b668b3af5ff8fc91) by [@hramos](https://github.com/hramos)) +- 📝 Update repo docs to use HTTPS ([33a2e533b7](https://github.com/facebook/react-native/commit/33a2e533b76d35c1b9fb32e926f7c2c27cb616e9) by [@him2him2](https://github.com/him2him2)) +- 🎨 Make **ScrollResponder** follow code style ([45e6fcdba0](https://github.com/facebook/react-native/commit/45e6fcdba089900555faa63fe8e37b4bd4a7700a) by [@TheSavior](https://github.com/TheSavior)) +- **VirtualizedList** now requires a windowSize greater than 0 ([3559e42c55](https://github.com/facebook/react-native/commit/3559e42c55366bacd9bb5178ecab64f95e9a8ea7)) +- react-devtools works with emulator and real devices now without needing to tweak the devServer value ([fa574c6092](https://github.com/facebook/react-native/commit/fa574c60920588e29d7b642e547e240ac8655e66) by [@jhen0409](https://github.com/jhen0409)) +- 📝 Clarify use of Flow props types in react-native-cli's template project ([9b147a53d1](https://github.com/facebook/react-native/commit/9b147a53d1ab1e14d7ef5b436f1e140a28a5d6a3) by [@hramos](https://github.com/hramos)) +- 📝 Add docs for `isInspectable` ([59c7967627](https://github.com/facebook/react-native/commit/59c79676277abaaaf61388309429c77164c3de4b) by [@bnham](https://github.com/bnham)) +- ✅ More Flow improvements (**Text**, **SectionList**, and others) ([f71f4e7906](https://github.com/facebook/react-native/commit/f71f4e7906648766e1a5b630abbad8935daef955), [632f1202ab](https://github.com/facebook/react-native/commit/632f1202ab3f9dd300a53f096bc15325e0d8f6c1), and [a8391bde7d](https://github.com/facebook/react-native/commit/a8391bde7d757d01521a6d12170fb9090c17a6a0) by [@yungsters](https://github.com/yungsters), [@samwgoldman](https://github.com/samwgoldman), and others) +- Various code cleanup to satisfy linting errors and standards ([b0319f3293](https://github.com/facebook/react-native/commit/b0319f3293b553c105b813dd12bff7d55940e60b), [dd4611721d](https://github.com/facebook/react-native/commit/dd4611721d0ad49ceaf4514df1b47cf2753b9ae6), and [7f58189605](https://github.com/facebook/react-native/commit/7f5818960596a2a18b7d427fd23d46396c05bee5) by [@ayc1](https://github.com/ayc1), [@grabbou](https://github.com/grabbou), and [@ide](https://github.com/ide)) + +#### iOS exclusive changes + +- 🔥⚡️ iOS UI Manager cleanup and optimizations ([0ec1017660](https://github.com/facebook/react-native/commit/0ec1017660602d6b3ae84b4d7a444cbd49ba0d53), [0ae4c47daa](https://github.com/facebook/react-native/commit/0ae4c47daa6280d2931d8bbf89612b2f1cb106d4), [2679f3efb6](https://github.com/facebook/react-native/commit/2679f3efb69bc7b0db1840b4ea59ebe791a54dd2),and [d9e5b313bb](https://github.com/facebook/react-native/commit/d9e5b313bb63a1ec0d402a96539c6df29bc72c42) by [@shergin](https://github.com/shergin)) +- If the inspector tries to handle a wrapped event but there is no connection, log a warning rather than a Redbox ([30da2622e2](https://github.com/facebook/react-native/commit/30da2622e222c338421508ce6e5663155fc874ef) by [@bnham](https://github.com/bnham)) +- Various under-the-covers changes around the bridge, RCTShadowView, RCTSurface, and a few others ([c3139d798a](https://github.com/facebook/react-native/commit/c3139d798af633bb81bf0da6df05b3c0beb0ced4), [2789ba016b](https://github.com/facebook/react-native/commit/2789ba016bfddace1407473769e933795333cfab), [b8e60a3ca3](https://github.com/facebook/react-native/commit/b8e60a3ca3314d79e9c38ee8c7995df81a27624c), [099b28006b](https://github.com/facebook/react-native/commit/099b28006b59abb11eae1f27424566b280860b0d), [b263560c73](https://github.com/facebook/react-native/commit/b263560c73af5559fdc3bba411f16c588abbffef), [19a9c5e41d](https://github.com/facebook/react-native/commit/19a9c5e41da0aa6ee28a54772edcb92daa498561), [d3b41e0da3](https://github.com/facebook/react-native/commit/d3b41e0da37c08ab0637d9f70d612e50b6f5e63c), [b2a251948f](https://github.com/facebook/react-native/commit/b2a251948f3309d2b1d0d533fb2fa74d2f8a10b8), [870bc4807a](https://github.com/facebook/react-native/commit/870bc4807a8c3f90498cf4c2ed3c030cb7b43ef9), [176a578238](https://github.com/facebook/react-native/commit/176a578238566ad857c0911e127669f1ee82107d), [c491b22233](https://github.com/facebook/react-native/commit/c491b2223313676bd4900de7a8c70a10051fa9f0), [c75612219e](https://github.com/facebook/react-native/commit/c75612219ef0c99d1ddca0aadf354f20de27608c), and[c01a171ed8](https://github.com/facebook/react-native/commit/c01a171ed881fb91a972ed475011f85697a29341) by [@shergin](https://github.com/shergin)) +- Changed to use _boost-for-react-native_ cocoapod, which speeds up `pod install` a ton ([d40db3a715](https://github.com/facebook/react-native/commit/d40db3a715afaf1cde4a5e231e96e46b2808bbef) by [@CFKevinRef](https://github.com/CFKevinRef)) + +#### Android exclusive changes + +- Include scroll momentum info when there are scroll events from Android ([c49d249fd7](https://github.com/facebook/react-native/commit/c49d249fd7c274f02e6018892992bcd273d6a465) by [@wwalser](https://github.com/wwalser)) +- Yoga's mkfile for Android now uses wildcard instead of manual file addition ([d89901fa60](https://github.com/facebook/react-native/commit/d89901fa6002802dc9d744bfe3e5e712d6a411a1) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) + +### Removed + +- **TextInput** no longer has the `autoGrow` prop, since this is platform-default behavior now ([dabb78b127](https://github.com/facebook/react-native/commit/dabb78b1278d922e18b2a84059460689da12578b) by [@shergin](https://github.com/shergin)) + +#### iOS exclusive removals + +- Updates to the bridge in order to enable future rendering optimizations ([d2dc451407](https://github.com/facebook/react-native/commit/d2dc4514077ae868f85d45ccdcc7c69df7b7648b) by [@shergin](https://github.com/shergin)) + +### Fixed + +- Do not set `minify=true` when calculating the list of dependencies for the CLI ([4a1bb8fe8d](https://github.com/facebook/react-native/commit/4a1bb8fe8dfd36ea207c0683d683bb8b22a282a5) by [@rafeca](https://github.com/rafeca)) +- 👷 Update CODEOWNERS now that the docs are in a separate repository ([85ff264445](https://github.com/facebook/react-native/commit/85ff264445aa4b9cf0b91aaca5764bb56caba997) by [@hramos](https://github.com/hramos)) +- Fixed a broken link in react-native-git-upgrade's readme ([bbedf2da9a](https://github.com/facebook/react-native/commit/bbedf2da9a3a091eeb687d43029f7d2450cf2612) by [@Taym95](https://github.com/Taym95)) +- 🤡 Do not use Node 8.x specific Stream.final for FS mocks ([4216cdef13](https://github.com/facebook/react-native/commit/4216cdef13c9ed47b9c746b39a0ddfdaf846d495) by [@hramos](https://github.com/hramos)) +- Fix virtualized cell keys for list headers and footers ([a010a0cebd](https://github.com/facebook/react-native/commit/a010a0cebd4afc0d88336c2c265a5d9dbb19918f)) +- Fix warnings of casting and null pointer handling in Yoga ([a8d4666651](https://github.com/facebook/react-native/commit/a8d46666518944a178e85c179da8047234c2d8fb) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) +- Fix broken buck failures on master ([4e767013ed](https://github.com/facebook/react-native/commit/4e767013ed73fb89f69f2e59626d6dcf3bb77684) by [@hramos](https://github.com/hramos)) +- **RefreshControl** appears correctly when expected on initial render of a **FlatList** again ([ed5872e2cc](https://github.com/facebook/react-native/commit/ed5872e2cca955ee407e87e37e13c7fed182199a) by [@vonovak](https://github.com/vonovak)) +- Fixed JS debugger CORS issue ([29f8354c19](https://github.com/facebook/react-native/commit/29f8354c1946a6325e9020b9ef5ee4ccdf0fa51f) by [@njbmartin](https://github.com/njbmartin)) + +#### Android exclusive fixes + +- Fix position of dev loading view on Android API < 20 ([7ff6657985](https://github.com/facebook/react-native/commit/7ff6657985a09bd2572615d16403fba3af709859) by [@kmagiera](https://github.com/kmagiera)) +- Fix Modal not disappearing when navigating from inside a Modal to another activity ([e5c2a66897](https://github.com/facebook/react-native/commit/e5c2a66897b9c562c549e63adcf70783ea34c418) + +#### iOS exclusive fixes + +- Fix regression introduced where layout wouldn't occur in some situations ([46be5bf71c](https://github.com/facebook/react-native/commit/46be5bf71c78d33cda5cb496c475dcfb8e229346) by [@shergin](https://github.com/shergin)) +- Fixed double initial prop applying for newly created views ([0ec1017660](https://github.com/facebook/react-native/commit/0ec1017660602d6b3ae84b4d7a444cbd49ba0d53) by [@shergin](https://github.com/shergin)) +- tvOS build now works again ([3bd89867d6](https://github.com/facebook/react-native/commit/3bd89867d6f23547f07b9b3a569d5a62971004f6) by [@dlowder-salesforce](https://github.com/dlowder-salesforce)) + +### Other + +Below is a list of the remaining, low-level changes that made it into this release of React Native. + +- Remove "prepareReact" call from the bridge ([80f9e1f7de](https://github.com/facebook/react-native/commit/80f9e1f7de407ea417cecb04b3ba20b05696b478) and [56a42e57d0](https://github.com/facebook/react-native/commit/56a42e57d05ff609e8fce35dcb5e9db7938db801) by [@fromcelticpark](https://github.com/fromcelticpark)) +- Add explicit componentControllerClass to CKComponent for RCTSurface ([ab972708a8](https://github.com/facebook/react-native/commit/ab972708a8dcc9b37c19843f2fe134928a7c7a3f)) +- Changes to RCTShadowView to increase RCTSurface performance ([f96f9c5fd6](https://github.com/facebook/react-native/commit/f96f9c5fd692000f561e87cba68642ef7daf43e7) by [@shergin](https://github.com/shergin)) +- Designated methods to control dirty propagation ([af226ef949](https://github.com/facebook/react-native/commit/af226ef949f3a21ef68a6e6b9fbd4cc06fa05152) by [@shergin](https://github.com/shergin)) +- Add missing tvOS header ([49cbca7464](https://github.com/facebook/react-native/commit/49cbca7464e27c34105122459ae29cc3b1247513) by [@grabbou](https://github.com/grabbou)) +- On Android, seperate logic to initialize JS from starting the app ([4996b9aeb4](https://github.com/facebook/react-native/commit/4996b9aeb4127892b7579b45927dec14833b8b4d) by [@axe-fb](https://github.com/axe-fb)) +- ♻️ JS linting was cleaned up: removed unused libs, strengthened the rules, removed unneeded rules, prevent disabled tests, and more ([2815ada238](https://github.com/facebook/react-native/commit/2815ada23872fc28dc8dd5a9833962cb73f452eb), [183c316f4c](https://github.com/facebook/react-native/commit/183c316f4c869804b88cffe40614c84ac0a472d0), [9c67e749d8](https://github.com/facebook/react-native/commit/9c67e749d8f63cf14ece201ec19eee4676f96a85), [79902f99b8](https://github.com/facebook/react-native/commit/79902f99b81f538042b38a857182c2e5adbfd006), [9a36872f0c](https://github.com/facebook/react-native/commit/9a36872f0c7ba03a92fabf65e4d659d6861ea786), [67a3c42d1a](https://github.com/facebook/react-native/commit/67a3c42d1a29b6fa1375f7445d1c9b4429939bae), [b826596700](https://github.com/facebook/react-native/commit/b82659670041d0e472f68c0a14b3ef5b962db09b), [a1a0a69546](https://github.com/facebook/react-native/commit/a1a0a6954635141ce6c167816b67674aa5c31062), and [11a495cb32](https://github.com/facebook/react-native/commit/11a495cb3235ebbc2ad890e92ec612fd5316bffb) by [@TheSavior](https://github.com/TheSavior)) +- 👷 Separate JS lint and flow checks from tests ([5ea5683d01](https://github.com/facebook/react-native/commit/5ea5683d01487b49c814fca6e11a818b9a777239) by [@hramos](https://github.com/hramos)) +- 👷 Fix Buck in build config to enable CI ([796122d8f3](https://github.com/facebook/react-native/commit/796122d8f3b825c0bf0c138c662f3477f8bab123), [7c3a61f3b6](https://github.com/facebook/react-native/commit/7c3a61f3b610e219fd798eccd330deb9a2471253), [82b123e744](https://github.com/facebook/react-native/commit/82b123e744b87cc59c96b4e82af9ed03981b4f42) by [@grabbou](https://github.com/grabbou)) +- ♻️ Various refactoring within the YGNode implementation ([28968e2c0b](https://github.com/facebook/react-native/commit/28968e2c0ba23db9af12b47681f165d29d0f132d), [0a9e652bdd](https://github.com/facebook/react-native/commit/0a9e652bdd031d53d712e2e9610fb608bfa54ff1), [6627d7723c](https://github.com/facebook/react-native/commit/6627d7723c2df244ccc8a462bd98499cc11da2e2), and [d85da86dc7](https://github.com/facebook/react-native/commit/d85da86dc7c7833e71099c6a621547bc3cec8d4f), [a163f70f87](https://github.com/facebook/react-native/commit/a163f70f875dff4428eebd989bfaf28dda6551bf) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) +- Fix ReactLegacy and delete RCTViewControllerProtocol ([a0ff8c7706](https://github.com/facebook/react-native/commit/a0ff8c7706fc37bdce78c9ec51da320f78d16a24) by [@javache](https://github.com/javache)) +- Define internal FB macro for OSS builds; remove some unused definitions ([077c3ab349](https://github.com/facebook/react-native/commit/077c3ab34952f4b442abdd7a47ab54ca4bd0ba2e) and ([a6a66c5b39](https://github.com/facebook/react-native/commit/a6a66c5b3943443e4016f32407e4a4f8d707e387) by [@ttsugriy](https://github.com/ttsugriy)) +- RNTester: Relax Bridge Release Check ([e3c6f38773](https://github.com/facebook/react-native/commit/e3c6f38773d0b578794726033d4fabbfa48d1c7b) by [@yungsters](https://github.com/yungsters)) +- Remove embeddedBundleURL from the asset resolver ([489b98bf10](https://github.com/facebook/react-native/commit/489b98bf1006818ba985e93478a088c0e1e1aae7)) +- Do not set FB_ASSERTION_ENABLED ([4cdbb77c33](https://github.com/facebook/react-native/commit/4cdbb77c3363e120877ff66f39cdcf51d668df7d) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) +- JSBigString to MAP_PRIVATE not MAP_SHARED ([f9f40cd3e4](https://github.com/facebook/react-native/commit/f9f40cd3e486314cd75bda8722147f2f0f5b8fe1)) +- Fixed black ARTSurfaceView ([5c8481e836](https://github.com/facebook/react-native/commit/5c8481e83646b9cae482a803c878fb007f370035) by [@shergin](https://github.com/shergin)) +- Kill orphaned marker end in JSCExecutor ([6ad1f0957a](https://github.com/facebook/react-native/commit/6ad1f0957a020cb57b177ab015c17aa883e1f0ad) by [@michalgr](https://github.com/michalgr)) +- Make YGNode as c++ struct with properties exposed through accessors ([f1055bcac8](https://github.com/facebook/react-native/commit/f1055bcac8b580c40f9646687e7a950fb6864c74) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) +- 🔖 ...and now we're at 0.53.0-rc.0 🎁 ([0b996577e3](https://github.com/facebook/react-native/commit/0b996577e321d439aa6ede4c7400ea76efb7816a) by [@grabbou](https://github.com/grabbou)) + +## v0.52.0 + +> This changelog has been prepared by Ryan Turner (@turnrye) - thank you for +> your time and making such a detailed changelog 🔥🔥 + +This release had a lot of work around the bundler and packager, a ton of +bugfixes, and updates to many of React Native's dependencies. Lots of +under-the-hood work was done as well to improve the layout engine. Happy new +year! + +> If you would like to help us with the next release changelog, please contact +> @grabbou + +### Added + +- Prettier has a config and an npm script; try it out with `npm run prettier` + ([164591218f](https://github.com/facebook/react-native/commit/164591218f5fab7d386e057e0d51b9c1fe30b0a9) by + [@janicduplessis](https://github.com/janicduplessis)) +- **Debug JS in Nuclide** is now an option in the dev menu 🐜 + ([7c7108a1e8](https://github.com/facebook/react-native/commit/7c7108a1e8e9354d8aeb2f0ff712561d8aa19408) and + [de424cc291](https://github.com/facebook/react-native/commit/de424cc291523a8f4e3d33059b725d5b85f31611)) +- Introducing **PlatformOS** – it looks a lot like **Platform**, but with a + simplified API + ([5ee27ff755](https://github.com/facebook/react-native/commit/5ee27ff7552a5707a6e6bdb3f23e7378f978a2f7) by + [@brishin](https://github.com/brishin)) +- New experimental _RCTSurface_: measure and layout a UI in a thread-safe and + synchronous manner + ([be6976d6fa](https://github.com/facebook/react-native/commit/be6976d6faa333311405bd6184300bbd8da6cbca), + [7df58e23a3](https://github.com/facebook/react-native/commit/7df58e23a3a265b0df0edc753cc79a153fec90d8), + [e75bd87a76](https://github.com/facebook/react-native/commit/e75bd87a76726a9b075061ef76156705b3c1e872), + [aa83b5a0ca](https://github.com/facebook/react-native/commit/aa83b5a0ca30736b2800833bcc6149dcbe8436fa), + [081f7d14ad](https://github.com/facebook/react-native/commit/081f7d14aded077a7627404e5e2d48163a5707ad), + [da17b237e1](https://github.com/facebook/react-native/commit/da17b237e15e20adf20d6b917349d6389efb17fd), + [e9e0cd7ab8](https://github.com/facebook/react-native/commit/e9e0cd7ab86c98bcd3201e306e96532685d8de1d), + [43b2509320](https://github.com/facebook/react-native/commit/43b25093202472c5af07d4f393d831e4d1484b07), + [ba6075120a](https://github.com/facebook/react-native/commit/ba6075120af9c0086b449aafa7420913fa58f746), + [d71d28f094](https://github.com/facebook/react-native/commit/d71d28f09495a1e2802db169e2d0cd1ec5bd5973), + [4d37cf0fbc](https://github.com/facebook/react-native/commit/4d37cf0fbcc529ad75eb4a04a185036a887e42c2), and + [d021dd25da](https://github.com/facebook/react-native/commit/d021dd25da92d84c62c9a77049bb798e3b891447) by + [@maicki](https://github.com/maicki) and + [@shergin](https://github.com/shergin)) +- Experimental **SwipeableRow**'s datasource now has a `getLastRowID` method + ([d79e245d19](https://github.com/facebook/react-native/commit/d79e245d19f7f246322bc657b407198b15cb1b98)) +- [React Native monthly + #5](https://reactnative.dev/blog/2017/11/06/react-native-monthly-5.html) + was added ([3c5a55ddc2](https://github.com/facebook/react-native/commit/3c5a55ddc21197cfa013dc6222e398138759b5d3) + by [@tenodi](https://github.com/tenodi)) + +#### iOS Specific + +- **DatePickerIOS** now takes **locale** 🌍 + ([fd9c3618fc](https://github.com/facebook/react-native/commit/fd9c3618fcd3dc80f9abf3da779627704c7350e4) by + [@RobertPaul01](https://github.com/RobertPaul01)) +- **CameraRoll** can now **deletePhotos** 📸 + ([554e873f58](https://github.com/facebook/react-native/commit/554e873f585ea05ce1e9fe4ff71173c47b3c259c) by + [@fxfactorial](https://github.com/fxfactorial)) +- There's now an API to specify a different directory for iOS image assets + ([8f9b291224](https://github.com/facebook/react-native/commit/8f9b291224d1ca57a5f90200ec4687abb4706f4b)) +- Support for [custom accessibility + actions](https://developer.apple.com/documentation/uikit/uiaccessibilitycustomaction) + on iOS ([36ad813899](https://github.com/facebook/react-native/commit/36ad8138997c195b8728906ceb51bd31338b6a24) by + [@ericdavmsft](https://github.com/ericdavmsft)) + +### Deprecated + +- Ignore YellowBox warnings with `YellowBox.ignoreWarnings([...])` rather than + `console.ignoredYellowBox = [...]` + ([26038f50bb](https://github.com/facebook/react-native/commit/26038f50bb003eec3770e2b66d428fbb739f1ce2) by + [@wli](https://github.com/wli)) + +### Changed + +- Metro-bundler is now metro, and it's v0.24.1; there were some performance + increases at the cost of a few breaking changes; improved tests of the bundler + too ([0bbd9f042a](https://github.com/facebook/react-native/commit/0bbd9f042a8ad7c7be094bd7636ca767c6f7b231), + [a2fd3fcef8](https://github.com/facebook/react-native/commit/a2fd3fcef84e916b36ef7753dff69b7c1b307890), + [503b4521a6](https://github.com/facebook/react-native/commit/503b4521a6ce6bb2282631df616440fa71416d25), + [654fed46f4](https://github.com/facebook/react-native/commit/654fed46f49b5002096ff55c2e8523af48b22c24), + [0091496891](https://github.com/facebook/react-native/commit/009149689119e180415f8138b2827366768fc1d3), + [aba148f733](https://github.com/facebook/react-native/commit/aba148f733e85a88d4be07b3b8ca37c43cf6a51e), + [3d5dc872a4](https://github.com/facebook/react-native/commit/3d5dc872a4eefa1557554b3b338227959d166370), + [48019a0c2a](https://github.com/facebook/react-native/commit/48019a0c2a9a45d51a4faab1d5bef52949f4b5c5), + [ecec4319c4](https://github.com/facebook/react-native/commit/ecec4319c4fda9bebc90216d5340442b2a5725df), + [f4d627c8fa](https://github.com/facebook/react-native/commit/f4d627c8faeb034eac8053fd253f17e42b85f2f2), + [f871d25eb4](https://github.com/facebook/react-native/commit/f871d25eb48dca224bb3796aa9cb5d714292662f), + [a7b231a327](https://github.com/facebook/react-native/commit/a7b231a3278e4fc2d7e4269ce106f22712f2e5a8), + [830b431453](https://github.com/facebook/react-native/commit/830b43145381e6e322569450affddba73f7dc2d1), + [29dafa1a86](https://github.com/facebook/react-native/commit/29dafa1a8644f7a537499074df334bab8da4ad00), + [7a5d5a4035](https://github.com/facebook/react-native/commit/7a5d5a40357bedfb24a01ff1160481656fda9554), + [4cd685a1e0](https://github.com/facebook/react-native/commit/4cd685a1e0a2ae07df02702dbf4702e407773df5), + [d326c86051](https://github.com/facebook/react-native/commit/d326c860519c5165c6e86fb4f3ce378ed055157c), + [231c7a0304](https://github.com/facebook/react-native/commit/231c7a03043b9fb3c4bf81251ad099bab0ba05c2), + [7d969a05de](https://github.com/facebook/react-native/commit/7d969a05de6a45543bc31a3b982828865bc57cdb), + [ae517307e7](https://github.com/facebook/react-native/commit/ae517307e76d977f813e5b880f3b7f42a20f461d), + [f587f8d51d](https://github.com/facebook/react-native/commit/f587f8d51dc57e6b9eb66edfbe58ee520a6cc568), + [fbf0aed3ac](https://github.com/facebook/react-native/commit/fbf0aed3acc056b5fd069af75fcae14246439a48), + [e9393f694d](https://github.com/facebook/react-native/commit/e9393f694d8f0d0190a3576fd65a65f747f8cce2), and + [968c88d141](https://github.com/facebook/react-native/commit/968c88d1410eac5b793345bacce6052f518fda8f) by + [@cpojer](https://github.com/cpojer), [@hramos](https://github.com/hramos), + [@jeanlauliac](https://github.com/jeanlauliac), and + [@rafeca](https://github.com/rafeca) + ) +- React is now v16.2.0, and it took react-test-renderer along with it; [now with + more + fragments!](https://react.dev/blog/2017/11/28/react-v16.2.0-fragment-support.html) + 🎉 ([c7f37074ac](https://github.com/facebook/react-native/commit/c7f37074ac89f7e568ca26a6bad3bdb02812c39f) and + [cd938d731c](https://github.com/facebook/react-native/commit/cd938d731c7531a683c050cd829a543d145e3dc1) by + [@bvaughn](https://github.com/bvaughn)) +- Jest is now v21.3.0-beta.13 + ([16bbd908e7](https://github.com/facebook/react-native/commit/16bbd908e72577e7d109397916323a0eeffce8d4) and + [ec2ea58e57](https://github.com/facebook/react-native/commit/ec2ea58e57872bfa077d9c9a5e1e8b253c6b37b3) by + [@mjesun](https://github.com/mjesun)) +- Flow is now v0.61.0, and there were a ton of Flow fixes/coverage improvements + made ([914ae93336](https://github.com/facebook/react-native/commit/914ae9333678df4888e3c72898991c8430625cce), + [eb0d6470e5](https://github.com/facebook/react-native/commit/eb0d6470e54663538610a70ab0bae9847eb33673), + [c8e72bb8b8](https://github.com/facebook/react-native/commit/c8e72bb8b8317bcdcb4fe2ff85978c7db70f4461), + [2d4bedba0f](https://github.com/facebook/react-native/commit/2d4bedba0f6a8f2cfe597a1044822eb635d5e243), + [e0202e459f](https://github.com/facebook/react-native/commit/e0202e459fd0181db551d0025ef562d7998186b0), + [2be3ae1ff2](https://github.com/facebook/react-native/commit/2be3ae1ff2441c0ee3f2b9255c23dc49ada852fe), + [22a1419900](https://github.com/facebook/react-native/commit/22a14199000ea994f24f6fe387ea26647af3c128), + [6ae0b344e5](https://github.com/facebook/react-native/commit/6ae0b344e5c221657287d1fc1511be520a6f6e58), + [76a2ca4c9c](https://github.com/facebook/react-native/commit/76a2ca4c9c09c9bdf922154c28040138a44ae672), + [3259353fce](https://github.com/facebook/react-native/commit/3259353fcec0dd9ea66de750a694c226f99f483d), + [e6c1fb7212](https://github.com/facebook/react-native/commit/e6c1fb72128fb13436028c2df9cdccf6ccfccb67), + [61d046be3c](https://github.com/facebook/react-native/commit/61d046be3c9b00f6a4d4f492d558a961a6d4210f), + [820cfa1f3b](https://github.com/facebook/react-native/commit/820cfa1f3b79406e47cb873773cadafefe0effb1), + [240039c6f2](https://github.com/facebook/react-native/commit/240039c6f2d8db700ebc15404b0acc2a49068249), + [343c5a97a0](https://github.com/facebook/react-native/commit/343c5a97a013669745cf3938728539001d3076e6), + [5f8d8e90c2](https://github.com/facebook/react-native/commit/5f8d8e90c2c43127b8a5d2fc5d18f16185c7a67e), and + [da047966e4](https://github.com/facebook/react-native/commit/da047966e4c2064a48e02ff74830c99808d8194b) by + [@Ashoat](https://github.com/Ashoat), + [@calebmer](https://github.com/calebmer), + [@cdlewis](https://github.com/cdlewis), + [@deecewan](https://github.com/deecewan), + [@grabbou](https://github.com/grabbou), + [@jamesisaac](https://github.com/jamesisaac), + [@mroch](https://github.com/mroch), [@nmn](https://github.com/nmn), + [@nmote](https://github.com/nmote), [@sahrens](https://github.com/sahrens), + [@samwgoldman](https://github.com/samwgoldman), + [@TheSavior](https://github.com/TheSavior), and others) +- react-devtools-core is now v3.0.0 + ([a7d46ea970](https://github.com/facebook/react-native/commit/a7d46ea97012bdcc644e3397bbf60bd3cb37e9eb) by + [@rsnara](https://github.com/rsnara)) +- Split out docs to [their own + repo](https://github.com/facebook/react-native-website/tree/master/docs) (and + a few formatting fixes along the journey) 👋 + ([2d86618e7e](https://github.com/facebook/react-native/commit/2d86618e7ef477cdfc2ed510c7bc05d41dbfe972), + [64d80b13db](https://github.com/facebook/react-native/commit/64d80b13db3dd28bb5d93cbedf511ae8f91e2127), + [3362da421c](https://github.com/facebook/react-native/commit/3362da421ce919fc6f4f1bda29b59e2e3bfe02de), + [75123c614b](https://github.com/facebook/react-native/commit/75123c614bb5a61c383cdc247230b3a76c76e14d), and + [79e24ede40](https://github.com/facebook/react-native/commit/79e24ede40b2508aaa77b8ff3876d3dbf4cfe6d8) by + [@hramos](https://github.com/hramos)). +- **TouchableHighlight** now has a default delayPressOut value of 100; it was + also refactored a bit for style + ([9a31fa5fd6](https://github.com/facebook/react-native/commit/9a31fa5fd62fa101b2a76c69b56248d7f5ba9876) by + [@sahrens](https://github.com/sahrens)) +- When in a dev build, more robustly validate arguments for native methods + ([ea2e2c54cb](https://github.com/facebook/react-native/commit/ea2e2c54cb4d1a99b41aaa98eaf51696d34770dd) by + [@mhorowitz](https://github.com/mhorowitz)) +- On integration tests, report _all_ errors + ([3bcb912786](https://github.com/facebook/react-native/commit/3bcb9127866ef60b3697553e98a3ae279d02290a) by + [@sahrens](https://github.com/sahrens)) +- Yoga has less technical debt, thanks to replacing _YGNodeList_ with vectors + ([b08a912f11](https://github.com/facebook/react-native/commit/b08a912f11c729f3fe76700c6614f9e6165ae1a1) by + [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) +- Yoga is now cpp, compiled as _c++1y_ + ([d7ab9496bc](https://github.com/facebook/react-native/commit/d7ab9496bc95f7b720fd6db1ed503af1c461e84d) by + [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) +- Bundle segments are handled better and used more + ([681278947e](https://github.com/facebook/react-native/commit/681278947eb4039a1d7a65f1edfeef25ae055a4f), + [a47431ed74](https://github.com/facebook/react-native/commit/a47431ed74f0b7b2a03ca48e84f2243d08ef3bdd), + [963c61d4d5](https://github.com/facebook/react-native/commit/963c61d4d546c94b689281ca1f5105ad050e10ff), + [b9f21dc2be](https://github.com/facebook/react-native/commit/b9f21dc2be14cd51543e6b2d1e63a861e5f433d1), + [f1258181ee](https://github.com/facebook/react-native/commit/f1258181eec84f73651d2fabd0d23764b8990ff8), and + [1988ba1d79](https://github.com/facebook/react-native/commit/1988ba1d7967dca04376e7e631e8910e5e79a6a7) by + [@fromcelticpark](https://github.com/fromcelticpark) and + [@jeanlauliac](https://github.com/jeanlauliac)) +- _packager-worker-for-buck_ has better tests + ([7fd5aa84a1](https://github.com/facebook/react-native/commit/7fd5aa84a1ef1744d01e7e877183b1f004216d00) by + [@jeanlauliac](https://github.com/jeanlauliac)) +- _RCTUIManager_ has less technical debt + ([46be5bf71c](https://github.com/facebook/react-native/commit/46be5bf71c78d33cda5cb496c475dcfb8e229346), + [60dc9bed00](https://github.com/facebook/react-native/commit/60dc9bed00cc13652752bf84f83c920ce66d5e39), and + [21714fe197](https://github.com/facebook/react-native/commit/21714fe1979ccbd62d665f383625f4ece8cf888e) by + [@shergin](https://github.com/shergin)) +- Numerous bridge changes, especially around URL resolution + ([e7bd0f056b](https://github.com/facebook/react-native/commit/e7bd0f056bf4edca1f0529d6eed03bbaaaca586a), + [260e6d2355](https://github.com/facebook/react-native/commit/260e6d23554a8e7f1743263894c9ca9a0cfbf01e), + [4894ac430d](https://github.com/facebook/react-native/commit/4894ac430d6df1118ce48f644fd8cf5bfce6344f), + [b983de9c54](https://github.com/facebook/react-native/commit/b983de9c5460e24c95a9a67f02695cd1c5f31bc5), + [b0193b098c](https://github.com/facebook/react-native/commit/b0193b098cdbd915bba90e1ab0b695ba44346f44), + [ae5ef653cb](https://github.com/facebook/react-native/commit/ae5ef653cbc4c03fe5edb5d4b0002e38cbb6f458), and + [1d6ce2311f](https://github.com/facebook/react-native/commit/1d6ce2311f6a51821b33c5473414d70c8bd34425) by + [@fromcelticpark](https://github.com/fromcelticpark) and others) +- Various cleanup and refactoring + ([053776338e](https://github.com/facebook/react-native/commit/053776338ea44c31f3671cb4502853da0c88e55a), + [0984f29a32](https://github.com/facebook/react-native/commit/0984f29a320ce7e40e8bc2a6c78b080908fa1384), + [6c70975689](https://github.com/facebook/react-native/commit/6c70975689d0f0839e6c2db9a9a25c3023f5be7b), + [d950dc6a21](https://github.com/facebook/react-native/commit/d950dc6a21c5cc1e736993b2ecc16abae086389e), + [70c359000a](https://github.com/facebook/react-native/commit/70c359000a2df091c3939f4c19db6024af992d43), + [cfa2bbf2f6](https://github.com/facebook/react-native/commit/cfa2bbf2f692d0bc5600d7e369a9a91272930ca6), and + [850efa8650](https://github.com/facebook/react-native/commit/850efa86508b19d800ff8cbdc725402c006db1a2) by + [@bnham](https://github.com/bnham), + [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar), and others) +- Jest preprocessing now uses the AST from metro + ([2ae255a6ea](https://github.com/facebook/react-native/commit/2ae255a6eaf820992bdf19799bb4403f3bbdcd5b) and + [d5b59517c2](https://github.com/facebook/react-native/commit/d5b59517c274874d7ce21e5c26d28b42ae389723) by + [@rafeca](https://github.com/rafeca)) +- `renderApplication()` now supports async initial render + ([1b22d49ae8](https://github.com/facebook/react-native/commit/1b22d49ae8945680dee4fd01e3fbb78b1e443e01) by + [@bvaughn](https://github.com/bvaughn)) +- Welcome [@lwinkyawmyat](https://github.com/lwinkyawmyat) to the React Native + GitHub Issue Task Force + ([4ebe76d559](https://github.com/facebook/react-native/commit/4ebe76d5598621160ffcf3ea8bc87c3ad1c1a2f8) by + [@lwinkyawmyat](https://github.com/lwinkyawmyat)) + +#### Android exclusive changes + +- Native components on Android register lazily rather than via ViewManager + ([1b71e03932](https://github.com/facebook/react-native/commit/1b71e03932f44e212b297b2c1e02100b6de74b93)) +- Android debug overlays (like **RedBox**, dev menu, loading) are no longer are + system overlays; they're now part of the _currentActivity_ + ([d19afc73f5](https://github.com/facebook/react-native/commit/d19afc73f5048f81656d0b4424232ce6d69a6368) by + [@kmagiera](https://github.com/kmagiera)) + +#### iOS exclusive changes + +- Improve iOS's _accessibilityLabel_ performance by up to 20% 📈 + ([19b0a65c5e](https://github.com/facebook/react-native/commit/19b0a65c5ecc4f41fea98a1e752785d6dbb6ea05) by + [@chendo](https://github.com/chendo)) + +### Fixed + +- Fix `backgroundColor` on **TouchableHighlight** + ([5a1171ebfa](https://github.com/facebook/react-native/commit/5a1171ebfaaedd9c7d5f1bfcf306049c3671a733) by + [@sahrens](https://github.com/sahrens)) +- Various corrections in messages, comments, and docblocks + ([58c3bc4901](https://github.com/facebook/react-native/commit/58c3bc490143b8d7831a00289e2565f49f5389ef), + [354e1cb508](https://github.com/facebook/react-native/commit/354e1cb5088a43fd4116504a34a65ca53c4de71b), + [58edf024a1](https://github.com/facebook/react-native/commit/58edf024a1ed3a71ef04f124546ee97496b6502f), + [b9e7006cc6](https://github.com/facebook/react-native/commit/b9e7006cc6dc2b0801ea0c776ba00cdea2204151), + [d2f0abdf4e](https://github.com/facebook/react-native/commit/d2f0abdf4ea94fbb3e2a5c7fb53ff5d1cf6abede), + [94cd9f5591](https://github.com/facebook/react-native/commit/94cd9f55915973355cdb63276b71f90df10281db), + [8547b7e111](https://github.com/facebook/react-native/commit/8547b7e11163d545b7b99d4bdd063ef71129d62c), + [44c16499fd](https://github.com/facebook/react-native/commit/44c16499fdc4665298f6c88b9ffee626fa1fc969), + [c91d87213e](https://github.com/facebook/react-native/commit/c91d87213e6862019b9ef7df7c38551bd6d659fd), + [85503a0612](https://github.com/facebook/react-native/commit/85503a0612b0c74b4d204e8748e9ed7010d838e4), and + [5b83dbe25a](https://github.com/facebook/react-native/commit/5b83dbe25af151d183009006b1fe323b2658d025) by + [@behrends](https://github.com/behrends), + [@bvaughn](https://github.com/bvaughn), + [@charpeni](https://github.com/charpeni), + [@dsandmark](https://github.com/dsandmark), + [@gusgard](https://github.com/gusgard), + [@nkabrown](https://github.com/nkabrown), + [@petterh](https://github.com/petterh), [@solon](https://github.com/solon), + [@swashcap](https://github.com/swashcap), and others) +- Various dev doc and project doc fixes for correctness and completeness + ([92c0980540](https://github.com/facebook/react-native/commit/92c0980540dde0053bad05fae6414cf8275a71b1), + [3c9092acf3](https://github.com/facebook/react-native/commit/3c9092acf39ecdb7c137a3cb0d4282694e95cbf5), + [e906525e84](https://github.com/facebook/react-native/commit/e906525e84f69a98de4d06ed1ec4c43d8589e350), + [60828566a7](https://github.com/facebook/react-native/commit/60828566a759dc579dbae1d76a8426e1e479166e), + [c49b97c4ef](https://github.com/facebook/react-native/commit/c49b97c4ef65a6351af437ef28033cb31ea0446f), + [45ed142596](https://github.com/facebook/react-native/commit/45ed14259677cff4cbd133e705ec4f0ec84bc216), + [cb6ec7c321](https://github.com/facebook/react-native/commit/cb6ec7c32141ef5bdde837d7f9d71b7adb83b751), + [9ec9567390](https://github.com/facebook/react-native/commit/9ec95673909beac7798f589e0e9821b4225f8fa9), + [e5a4ea97d9](https://github.com/facebook/react-native/commit/e5a4ea97d9e1b13509a3f36d0b469a6a88a90dc4), + [c544c0d2dc](https://github.com/facebook/react-native/commit/c544c0d2dca1d0e9f0b2a5565e03676ad71a36f5), + [33d5e5bd5a](https://github.com/facebook/react-native/commit/33d5e5bd5a5365ab712a2b9d33f33cbec305e128), + [95dac8db60](https://github.com/facebook/react-native/commit/95dac8db601ba48fe03da52e1adbdef0cac23546), + [6e1db1f1ee](https://github.com/facebook/react-native/commit/6e1db1f1ee263c3a8b68c3e1584e79ae86d5be86), + [e11d496e9d](https://github.com/facebook/react-native/commit/e11d496e9d907abb5bf58a8300c5a8f85aa03bbb), + [6da897945f](https://github.com/facebook/react-native/commit/6da897945f823728dbc82dd9f01c672354b1e76d), + [0ff576081b](https://github.com/facebook/react-native/commit/0ff576081b156ea26c4e7886f7266f3e4d8e3d5e), + [1ee64ccb8a](https://github.com/facebook/react-native/commit/1ee64ccb8a257210be3a74fb9b0adc83f2a8bb2b), + [3aa38564f7](https://github.com/facebook/react-native/commit/3aa38564f7b91c8588c8484140bc4221d50d55e0), + [6b26971a56](https://github.com/facebook/react-native/commit/6b26971a56fdd919d11cc338893d0b7a3f7a45ba), and + [de3976a486](https://github.com/facebook/react-native/commit/de3976a48655a248a2417fcf2d3a511be02e1996) by + [@adrianomelo](https://github.com/adrianomelo), + [@blargity](https://github.com/blargity), + [@charpeni](https://github.com/charpeni), + [@garlic-rice-with-butter](https://github.com/garlic-rice-with-butter), + [@gwmccull](https://github.com/gwmccull), + [@harikrishnanp](https://github.com/harikrishnanp), + [@hramos](https://github.com/hramos), + [@johnthewilson](https://github.com/johnthewilson), + [@jsdario](https://github.com/jsdario), [@kelset](https://github.com/kelset), + [@patrickkempff](https://github.com/patrickkempff), + [@ryanml](https://github.com/ryanml), + [@tiagomoraismorgado88](https://github.com/tiagomoraismorgado88), + [@timwangdev](https://github.com/timwangdev), and others) +- Stop `RCTRefreshControl` from jumping around + ([2e1707d0e6](https://github.com/facebook/react-native/commit/2e1707d0e600a30057511390dd87c18c00f19a59) by + [@sophiebits](https://github.com/sophiebits)) +- Fix a race condition in the animation module + ([515eb0e801](https://github.com/facebook/react-native/commit/515eb0e8012a7a8f085a8e410c6c694011fd8c1d) by + [@mhorowitz](https://github.com/mhorowitz)) +- Fix Windows local-cli's to not wrongfully identify as globally installed + ([ca106043fc](https://github.com/facebook/react-native/commit/ca106043fc655a1c51332aedf9b001a512269550) by + [@sballew](https://github.com/sballew)) +- Fix Jest mocks for **NetInfo**, **Dimensions**, and **ScrollView** modules + ([7fb3a9229d](https://github.com/facebook/react-native/commit/7fb3a9229df52bd45076470d059f245a8147cd2a), + [11a2a35c63](https://github.com/facebook/react-native/commit/11a2a35c63ae68de46482f5cd25271f8b0fb5ad4), and + [0c8a3e4f79](https://github.com/facebook/react-native/commit/0c8a3e4f797563c99e988ec2f42ec2a618a8b196) by + [@alvaromb](https://github.com/alvaromb), + [@timwangdev](https://github.com/timwangdev), and + [@uk-ar](https://github.com/uk-ar)) +- packager-worker-for-buck: `transformCommand`: add missing test + ([73a01be9bc](https://github.com/facebook/react-native/commit/73a01be9bcd9059f3172987fd30d8b6dc0125759) by + [@jeanlauliac](https://github.com/jeanlauliac)) +- Fixed issue where CLI wasn't following the config value for postMinifyProcess + when its running with `dev=false` + ([6d92046c56](https://github.com/facebook/react-native/commit/6d92046c56794a6a62bc07598545a23a7b53cdc0) by + [@rafeca](https://github.com/rafeca)) +- Fix asset resolver url handling + ([28d5d6baf1](https://github.com/facebook/react-native/commit/28d5d6baf1e6ac52e8672a653f56c3898e4e11d2) by + [@fkgozali](https://github.com/fkgozali)) +- Fix crash when destroying catalyst + ([f1015664e9](https://github.com/facebook/react-native/commit/f1015664e92f02c33417a591a2438db7c0cd3811)) +- You can now `justifyContent` while you're `minWidth`ing and `marginLeft`ing; + before the justification wasn't honored + ([f5becebc07](https://github.com/facebook/react-native/commit/f5becebc0710d5bb875bb9c0a2d3809a00f62605) by + [@woehrl01](https://github.com/woehrl01)) +- `marginLeft: auto` and `alignItem: stretch` now play nicely together; before + the width and height ended up incorrect + ([5f99b1a55f](https://github.com/facebook/react-native/commit/5f99b1a55f4002c105a7005cabf720aad422b628) by + [@woehrl01](https://github.com/woehrl01)) +- Fix assertion preventing YGNodeLayoutGet\* with YGEdgeEnd + ([a383b8ca05](https://github.com/facebook/react-native/commit/a383b8ca0545ba3704a51a78972107119f5683c0) by + [@justjake](https://github.com/justjake)) +- Fix shrinking in non-strech alignments + ([1d62848535](https://github.com/facebook/react-native/commit/1d6284853514be4da2b68d45732386eb81cc4253) by + [@woehrl01](https://github.com/woehrl01)) +- Correctly calculate min/max percentage constraints + ([4fdaf2de98](https://github.com/facebook/react-native/commit/4fdaf2de989c039a62681cc1f7a8407ec32b593e) by + [@woehrl01](https://github.com/woehrl01)) +- When running `react-native-git-upgrade`, don't execute git's hooks + ([0182086350](https://github.com/facebook/react-native/commit/018208635069311c1a7c7776c6f359f7ded45362) by + [@adrienthiery](https://github.com/adrienthiery)) +- When running `react-native-git-upgrade` and failing with a signal, return that + to the terminal + ([b9a5862f67](https://github.com/facebook/react-native/commit/b9a5862f670f52d48f1d3789c3f08ec139368da4) by + [@mateusz-](https://github.com/mateusz-)) +- In **KeyboardAvoidingView**, don't mistakenly try to layout when a hardware + keyboard changes + ([ad4450ac13](https://github.com/facebook/react-native/commit/ad4450ac1364710f052a927ceda7ae353440f682) by + [@koenpunt](https://github.com/koenpunt)) +- Don't endlessly collect websockets when not connected to the packager (dev + memory leak) + ([1e1e491246](https://github.com/facebook/react-native/commit/1e1e49124678f447d980bb22891d25db60fa83b3) by + [@mmmulani](https://github.com/mmmulani)) +- Fixed a bug in the sample project random `selection` prop that made it + not-so-random + ([766f020e68](https://github.com/facebook/react-native/commit/766f020e68abfc121ea6a9f92e0640368d69dae7) by + [@rozele](https://github.com/rozele)) + +#### Android exclusive fixes + +- Explicitly `#define isnan __builtin_isnan` for Android _clang-5_ to mimic + **gcc**'s default behavior + ([f8fe6b0c70](https://github.com/facebook/react-native/commit/f8fe6b0c70d1b7b626d05d9675c16b2f89339e8c)) +- Correctly update **NetInfo** on Android even if connection types change while + the app is in the background + ([e6f542d620](https://github.com/facebook/react-native/commit/e6f542d62037e9830c0ae5749a32874c44cf2334) by + [@berickson1](https://github.com/berickson1)) +- Direction-aware borders now work with Android APIs >= 17 + ([7170543e80](https://github.com/facebook/react-native/commit/7170543e8012250b7643a960b54cce7fd6d3a1e9) by + [@rsnara](https://github.com/rsnara)) +- Don't throw _BadTokenException_ and _IllegalArgmentException_ when showing or + dismissing Modal on Android + ([e57a43b97a](https://github.com/facebook/react-native/commit/e57a43b97ad24dc5b993753a45aa575b2a757b4f)) +- Fix Android crash when blurRadius is between 0 and 1 + ([dc01eff72d](https://github.com/facebook/react-native/commit/dc01eff72d23e1dd3f7ecf30859992ee3bf7c664) by + [@jamesreggio](https://github.com/jamesreggio)) +- Fix `borderRadius` with Android API level < 18 + ([5aa1fb3ff3](https://github.com/facebook/react-native/commit/5aa1fb3ff326a429e33a443576da866f2a63c20c) and + [ca7fe72c31](https://github.com/facebook/react-native/commit/ca7fe72c31fd7c7cbe4734118019f5808235560e) by + [@rsnara](https://github.com/rsnara)) +- Make Android `lineHeight` behavior match iOS's 📏 + ([3f1b021506](https://github.com/facebook/react-native/commit/3f1b0215060e4c27c286359cc90f3b2189956c4e)) +- Fixed autoscroll to cursor on Android **TextInput** + ([0bef872f3f](https://github.com/facebook/react-native/commit/0bef872f3fc8b1cd78c574d03eacc886bef4e239) by + [@shergin](https://github.com/shergin)) +- Fix logging unpacking time on Android when it happens concurrently with eager + unpacking ([028b64bcd3](https://github.com/facebook/react-native/commit/028b64bcd36c1c8dd76c0de95eeff80cf660aa23) + by [@alexeylang](https://github.com/alexeylang)) +- Prevent an Android crash when **TextInput** has `selectionColor` defined but + there is no drawable cursor + ([1e18d907bf](https://github.com/facebook/react-native/commit/1e18d907bfb8cc5f4f2e1a1ede0dd98aec40ab11) by + [@gpeal](https://github.com/gpeal)) + +#### iOS exclusive fixes + +- Don't have Xcode warnings for _YGDefaultLog_ in newly created projects + ([72e762d4bc](https://github.com/facebook/react-native/commit/72e762d4bca8d00cc2c73c390a654ae6143731bd) by + [@woehrl01](https://github.com/woehrl01)) +- iOS _RCTEventEmitter_ uses a `double` for count, not _NSInteger_ + ([eaa84997ce](https://github.com/facebook/react-native/commit/eaa84997cedc8dc4d46308e2217d2b094a51ed02)) +- Fix `isNuclideDebuggingAvailable` on iOS + ([59c3e33f63](https://github.com/facebook/react-native/commit/59c3e33f637d11e33204e8a912e98459ffad7fab)) +- iOS ScrollView is now rendered correctly with RefreshControl + ([75d62bf0a8](https://github.com/facebook/react-native/commit/75d62bf0a802b91a979d03ef497e84c3179e7767) by + [@vonovak](https://github.com/vonovak)) +- Fix a crash when keyboard is visible and bridge reload happens on iOS + ([d9c658566a](https://github.com/facebook/react-native/commit/d9c658566a14ce8767d87435264997aa18dd08e4) by + [@fromcelticpark](https://github.com/fromcelticpark)) +- **RedBox** now appears beneath the status bar on iOS + ([33cefc1760](https://github.com/facebook/react-native/commit/33cefc176096e03a4b3c3130a70abfabe9d40f38) by + [@adamjernst](https://github.com/adamjernst)) +- Fractional border widths on iOS are now the right size, honoring insets + ([15179f1798](https://github.com/facebook/react-native/commit/15179f1798b277c1836441fcf7f3b7f0bd5a4636) by + [@Nikita2k](https://github.com/Nikita2k)) +- Implement `requiresMainQueueSetup` in _RCTTVNavigationEventEmitter_ to satisfy + Xcode warning + ([ee3532b5c2](https://github.com/facebook/react-native/commit/ee3532b5c266d5ee7fb12920cb611a41b1daf750) by + [@charpeni](https://github.com/charpeni)) +- Support the iPhone X in the sample project's header + ([ad4b124aa1](https://github.com/facebook/react-native/commit/ad4b124aa117483b4a0ec9dfa145b8e9a17f06c6) by + [@vincentriemer](https://github.com/vincentriemer)) +- `testID` works on **TabBarItem** on iOS + ([e19d9dec9b](https://github.com/facebook/react-native/commit/e19d9dec9b3b257b5db3dc77ed8b95b93570f1e3)) +- On iOS, don't error on the first live-reload of large codebases because of too + little wait time + ([b6f1a6085f](https://github.com/facebook/react-native/commit/b6f1a6085f7470c16ae8850e7da8f4f9ae5c23ee) by + [@lelandrichardson](https://github.com/lelandrichardson)) +- Prevent iOS crash on receiving bad unicode in _XMLHTTPRequest_ + ([1c04ceeb4b](https://github.com/facebook/react-native/commit/1c04ceeb4ba954eee7ab34fc5b6c660d9772d9f6) by + [@cdlewis](https://github.com/cdlewis)) +- Define `pod_target_xcconfig` for PrivateDatabase + ([38b96cd7bb](https://github.com/facebook/react-native/commit/38b96cd7bb391f64066a6c91daa4173db1f33445) by + [@ide](https://github.com/ide)) +- Fixed podspec include/excludes around tvOS + ([ba1d7e92e4](https://github.com/facebook/react-native/commit/ba1d7e92e4f251b90a96be192214b5015cf6244e) by + [@yygene](https://github.com/yygene)) +- Don't spam the logs for iOS when receiving `ECONNREFUSED` on connecting to + packager ([b1701ccaef](https://github.com/facebook/react-native/commit/b1701ccaefa0c8cbb6d820b2ad07e0d911027d7c) + and [ff3dc2ed19](https://github.com/facebook/react-native/commit/ff3dc2ed19cdd4137ae8092599b16c09d4e2c711) by + [@adamjernst](https://github.com/adamjernst)) +- Don't crash Systrace when debugging JS remotely on iOS + ([e8eec24706](https://github.com/facebook/react-native/commit/e8eec24706e792314ee574bbf7f7c0066c4f3a7a) by + [@alexeylang](https://github.com/alexeylang)) + +### Removed + +- Removing `reactBridgeDidFinishTransaction` from _RCTScrollView_ + ([a255204e3e](https://github.com/facebook/react-native/commit/a255204e3e7fddefd2d7b0de224101768757ca7a) by + [@shergin](https://github.com/shergin)) +- Removing inherited background color optimization from _RCTText_ to reduce code + complexity – please give feedback if you find performance differences! + ([8c8944c10f](https://github.com/facebook/react-native/commit/8c8944c10fb7dc30ea99657225f25ea438cf6e14) by + [@shergin](https://github.com/shergin)) + +### Other + +Below is a list of the remaining, low-level changes that made it into this +release of React Native. + +- Foundational work for a new justifyContent value **space-evenly** + ([1050e0b476](https://github.com/facebook/react-native/commit/1050e0b47611602b758f73d99f51a1dd5ceabade) by + [@woehrl01](https://github.com/woehrl01)) +- Add Systrace-based telemetry to Hermes GC + ([05e862d48d](https://github.com/facebook/react-native/commit/05e862d48d363a8af765b2f0283569419dbd2e5c)) +- Unify Systrace native hook argument passing + ([52e3ae9063](https://github.com/facebook/react-native/commit/52e3ae9063705bac53bad99ffe23976c29c8f1b2) by + [@amnn](https://github.com/amnn)) +- Use different symbols for SystraceSection depending on `WITH_FBYSTRACE` + ([03956c4ecf](https://github.com/facebook/react-native/commit/03956c4ecfda381396336f725ea1c12d913df17d)) +- Don't set global.performance to undefined if it was initialized already + ([dfebcb70a5](https://github.com/facebook/react-native/commit/dfebcb70a5c948db94d1cd580bbcaa0aaa702349) by + [@alexeylang](https://github.com/alexeylang)) +- Autofixes for migrating to Buck's source-only ABI feature + ([801cbdb047](https://github.com/facebook/react-native/commit/801cbdb04788403cee022dec688136540da36fc5) by + [@jkeljo](https://github.com/jkeljo)) +- Add remote API to uninstall the global error handler in RN + ([1d16923063](https://github.com/facebook/react-native/commit/1d16923063940606dda89de94a83cbdf5f98e1f1)) +- Add _RCTLibraryPathForURL_ in _RCTUtil_ + ([2fecbf6171](https://github.com/facebook/react-native/commit/2fecbf61711f610124fc2453a79120932024f613)) +- Fix sections that come from React Fiber + ([1f40c95076](https://github.com/facebook/react-native/commit/1f40c95076297258a4194fd9c1b5af7002187c99) by + [@alexeylang](https://github.com/alexeylang)) +- Fix boolean conversion in sync RN method calls. + ([dd888d3346](https://github.com/facebook/react-native/commit/dd888d3346ef9477eae2cd2d29cef867467cb503)) +- Fix `embeddedBundleURL` update situation + ([d1fc8ef3a3](https://github.com/facebook/react-native/commit/d1fc8ef3a3cb3590b9cff4d1b3cc5d440b52ec8c)) +- Remove `android_react_native_perf.use_separate_ui_bg_thread` experiment. + ([4f886a29a1](https://github.com/facebook/react-native/commit/4f886a29a1234c967deae2354bbc5092e0e6595e)) +- ScrollView related files were moved to dedicated folder + ([098a63a1ce](https://github.com/facebook/react-native/commit/098a63a1cee1196a2f3eb5135eeb8fe59e7e8272) by + [@shergin](https://github.com/shergin)) +- move page registration logic in to jsinspector + ([bef7967f9a](https://github.com/facebook/react-native/commit/bef7967f9a485dc136d2cb32f552b2199ae3e2b8) by + [@bnham](https://github.com/bnham)) +- Type global hooks as function pointers + ([eca51eb46a](https://github.com/facebook/react-native/commit/eca51eb46a47112c8933d0a3b932f59008cadc78) by + [@johnislarry](https://github.com/johnislarry)) +- `std::string` to `const char*` + ([b952365ba6](https://github.com/facebook/react-native/commit/b952365ba6bd86f0e80a24aedec1f447cb3ec566) by + [@johnislarry](https://github.com/johnislarry)) +- Allow extending props supported by native animations + ([71751e9cc7](https://github.com/facebook/react-native/commit/71751e9cc7c67306ca038c5b254e6e81fe0aff1b) by + [@andrewimm](https://github.com/andrewimm)) +- Meyers singleton jsc error extractor + ([434f432d5d](https://github.com/facebook/react-native/commit/434f432d5d5ea2756c1adac8b1c36e82e60a2b13) by + [@johnislarry](https://github.com/johnislarry)) +- Do not overwrite the same text in **TextInput** + ([29f3f55298](https://github.com/facebook/react-native/commit/29f3f5529827579101f0d8bd6afe72f1cb0caeca)) +- Renaming _uiManagerWillFlushUIBlocks_ -> _uiManagerWillPerformMounting_ + ([0a8721c340](https://github.com/facebook/react-native/commit/0a8721c340480a972bb597cacdbddd9eb2015716) by + [@shergin](https://github.com/shergin)) +- Skylarkify flags macros. + ([ed2bfcb35a](https://github.com/facebook/react-native/commit/ed2bfcb35a2756eb700882ab8e21b6b273efa80a) by + [@ttsugriy](https://github.com/ttsugriy)) +- Skylarkify `config_utils_defs` macros. + ([88f6f69152](https://github.com/facebook/react-native/commit/88f6f69152e4b68609f28e80ee70705969529af8) by + [@ttsugriy](https://github.com/ttsugriy)) +- Round size geometry for Button and RichText components. + ([4034febb7e](https://github.com/facebook/react-native/commit/4034febb7ef9d9daa894a75b038226af74026163) by + [@iaroslav-pavlov](https://github.com/iaroslav-pavlov) +- Temporarily patched Map/Set non-extensible check into RN dev renderer + ([a99f0d6100](https://github.com/facebook/react-native/commit/a99f0d6100c9779f5f6df6008af54c06113355f6) by + [@bvaughn](https://github.com/bvaughn)) +- Run buildifier over all BUCK files + ([d674d48a7b](https://github.com/facebook/react-native/commit/d674d48a7b9b71169af59ceb886529371c26a2e5) by + [@zertosh](https://github.com/zertosh)) +- Pass `scriptURL` to _RCTTestRunner_ + ([266ab7a006](https://github.com/facebook/react-native/commit/266ab7a0061c11c4da7ccde9e0d461c0d7331563)) +- Make _RCTNativeModule::invokeInner_ explicitely return `folly::none` in case + of error ([0ac5a5230c](https://github.com/facebook/react-native/commit/0ac5a5230c4b5dd44db6a8dd7bb7752aff64d71c) + by [@fromcelticpark](https://github.com/fromcelticpark)) +- Make _RCTPackagerConnection_ a singleton + ([9180d4eb82](https://github.com/facebook/react-native/commit/9180d4eb82fb70a0fd396b15660c2ac6770183c9) by + [@adamjernst](https://github.com/adamjernst)) +- Register split segment paths with _RAMBundleRegistry_ + ([cff0d8e0e5](https://github.com/facebook/react-native/commit/cff0d8e0e599d1ab21b36779b41fbb26512874aa) by + [@fromcelticpark](https://github.com/fromcelticpark)) +- check if listener is still in the set before calling `onHostResume` + ([ad89ea7b50](https://github.com/facebook/react-native/commit/ad89ea7b5046c2cf9ca1cba88c387eb1db8dc042)) +- export _SeparatorsObj_ type for re-use in **ListItem**s etc. + ([c6fe101cdc](https://github.com/facebook/react-native/commit/c6fe101cdcc0b8d640a86108d8a76f7292b5f799) by + [@sahrens](https://github.com/sahrens)) +- Do not mark node as dirty if, new and old values are undefined + ([41da6e3128](https://github.com/facebook/react-native/commit/41da6e31284d46bb1dd2053c3c3100c075ace019) by + [@woehrl01](https://github.com/woehrl01)) +- Remove _RAMBundleRegistry_ subclasses + ([6ecae73fe5](https://github.com/facebook/react-native/commit/6ecae73fe5915863c27ac7e407f5b151fd0c5fc3) by + [@fromcelticpark](https://github.com/fromcelticpark)) +- Fix `minimumViewTime` in _ViewabilityHelper_ + ([d19d137cc1](https://github.com/facebook/react-native/commit/d19d137cc18f10957b5ac64ac727d15fde57f018)) + +[0.56]: https://github.com/facebook/react-native/compare/0.55-stable...0.56-stable +[0.55]: https://github.com/facebook/react-native/compare/0.54-stable...0.55-stable +[0.54]: https://github.com/facebook/react-native/compare/0.53-stable...0.54-stable +[0.53]: https://github.com/facebook/react-native/compare/0.52-stable...0.53-stable +[0.52.0]: https://github.com/facebook/react-native/compare/0.51-stable...0.52-stable diff --git a/CHANGELOG-pre-070.md b/CHANGELOG-pre-070.md new file mode 100644 index 00000000000000..8e4e433af8e309 --- /dev/null +++ b/CHANGELOG-pre-070.md @@ -0,0 +1,2434 @@ +# Changelog (pre 0.70) + +This file contains all changelogs for releases in the 0.60-0.69 range. Please check out the other `CHANGELOG-*.md` files for newer and older versions. + +## v0.69.12 + +### Changed + +- [0.69] Bump CLI to ^8.0.7, Metro to 0.70.4 ([56807fadfa](https://github.com/facebook/react-native/commit/56807fadfacf3c5cc62a8d1948b3d72ca51a5e6b) by [@robhogan](https://github.com/robhogan)) + +#### iOS specific +- [0.69] Use `Content-Location` header in bundle response as JS source URL (#37501) ([367fc7ad52](https://github.com/facebook/react-native/commit/367fc7ad5254c5dd2c8ef38248766173525cc77c) by [@robhogan](https://github.com/robhogan)) + +### Fixed + +#### Android specific +- Prevent crash in runAnimationStep on OnePlus and Oppo devices (#37487) ([4db7a10e25](https://github.com/facebook/react-native/commit/4db7a10e257c664aced8cd8a1737d7ed9ced14fe) by [@hsource](https://github.com/hsource)) + +## v0.69.11 + +### Fixed + +#### iOS specific + +- Make 0.69 compatible with Xcode 15 (thanks to @AlexanderEggers for the commit in main) ([37e8df1cdc](https://github.com/facebook/react-native/commit/37e8df1cdce4a66763c720b1b0768d049def9518)) + +## v0.69.10 + +### Fixed + +#### Android specific + +- Minimize EditText Spans 8/N: CustomStyleSpan ([b384bb613b](https://github.com/facebook/react-native/commit/b384bb613bf533aebf3271ba335c61946fcd3303) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize EditText Spans 6/N: letterSpacing ([5791cf1f7b](https://github.com/facebook/react-native/commit/5791cf1f7b43aed1d98cad7bcc272d97ab659111) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 5/N: Strikethrough and Underline ([0869ea29db](https://github.com/facebook/react-native/commit/0869ea29db6a4ca20b9043d592a2233ae1a0e7a2) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 4/N: ReactForegroundColorSpan ([8c9c8ba5ad](https://github.com/facebook/react-native/commit/8c9c8ba5adb59f7f891a5307a0bce7200dd3ac7d) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 3/N: ReactBackgroundColorSpan ([cc0ba57ea4](https://github.com/facebook/react-native/commit/cc0ba57ea42d876155b2fd7d9ee78604ff8aa57a) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 1/N: Fix precedence ([1743dd7ab4](https://github.com/facebook/react-native/commit/1743dd7ab40998c4d3491e3b2c56c531daf5dc47) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix measurement of uncontrolled TextInput after edit ([8a0fe30591](https://github.com/facebook/react-native/commit/8a0fe30591e21b90a3481c1ef3eeadd4b592f3ed) by [@NickGerleman](https://github.com/NickGerleman)) + +## v0.69.9 + +### Changed + +#### iOS specific + +- Relax Ruby requirements ([4e015c69d6](https://github.com/facebook/react-native/commit/4e015c69d646b320d58888f70af566c1d753eaed) by [@cipolleschi](https://github.com/cipolleschi)) + +### Fixed + +#### iOS specific + +- Fix React Codegen podspec to build on Xcode 14.3 ([74ba411b55](https://github.com/facebook/react-native/commit/74ba411b55535cee1b98062875b7b4b1428c931a) by [@cipolleschi](https://github.com/cipolleschi)) +- Blob data is no longer prematurely deallocated when using blob.slice ([36cc71ab36](https://github.com/facebook/react-native/commit/36cc71ab36aac5e5a78f2fbae44583d1df9c3cef) by [@awinograd](https://github.com/awinograd)) + +## v0.69.8 + +### Fixed + +#### Android specific + +- Mitigation for Samsung TextInput Hangs ([be69c8b5a7](https://github.com/facebook/react-native/commit/be69c8b5a77ae60cced1b2af64e48b90d9955be5) by [@NickGerleman](https://github.com/NickGerleman)) + +## v0.69.7 + +### Fixed + +- Force dependencies resolution to minor series for 0.69 ([c4da74c463](https://github.com/facebook/react-native/commit/c4da74c4636cbbd6bbf681d39a8a8cca49f11f56) by [@Titozzz](https://github.com/Titozzz)) + +## v0.69.6 + +### Changed + +- Bump version of `promise` from 8.0.3 to 8.2.0, enabling `Promise.allSettled` ([951538c080](https://github.com/facebook/react-native/commit/951538c080ef745da304fb308fa91d597e0dd98a) by [@retyui](https://github.com/retyui)) + +### Fixed + +- Fix hermes profiler ([81564c1a3d](https://github.com/facebook/react-native/commit/81564c1a3dae4222858de2a9a34089097f665e82) by [@janicduplessis](https://github.com/janicduplessis)) + +#### Android specific + +- Correctly resolve classes with FindClass(..) ([361b310bcc](https://github.com/facebook/react-native/commit/361b310bcc8dddbff42cf63495649291c894d661) by [@evancharlton](https://github.com/evancharlton)) + +#### iOS specific + +- Fix the way the orientation events are published, to avoid false publish on orientation change when app changes state to inactive ([7d42106d4c](https://github.com/facebook/react-native/commit/7d42106d4ce20c644bda4d928fb0abc163580cee) by [@lbaldy](https://github.com/lbaldy)) +- Fix React module build error with swift integration on new architecture mode ([3afef3c167](https://github.com/facebook/react-native/commit/3afef3c16702cefa5115b059a08741fba255b2db) by [@Kudo](https://github.com/Kudo)) + +## v0.69.5 + +### Changed + +- Bump react-native-codegen to 0.69.2 ([df3d52bfbf](https://github.com/facebook/react-native/commit/df3d52bfbf4254cd16e1dc0ca0af2743cd7e11c1) by [@dmytrorykun](https://github.com/dmytrorykun)) + +#### Android specific + +- Replaced reactnativeutilsjni with reactnativejni in the build process to reduce size ([54a4fcbfdc](https://github.com/facebook/react-native/commit/54a4fcbfdcc8111b3010b2c31ed3c1d48632ce4c) by [@SparshaSaha](https://github.com/SparshaSaha)) + +### Fixed + +- Codegen should ignore `.d.ts` files ([0f0d52067c](https://github.com/facebook/react-native/commit/0f0d52067cb89fdb39a99021f0745282ce087fc2) by [@tido64](https://github.com/tido64)) + +## v0.69.4 + +### Changed + +- Upgrade RN CLI to v8.0.4 ([66c68c37ce](https://github.com/facebook/react-native/commit/66c68c37ce94f6c1160e7f260c0d1887539c6605) by [@thymikee](https://github.com/thymikee)) + +#### Android specific + +- Modified **getDefaultJSExecutorFactory** method ([87cfd386cb](https://github.com/facebook/react-native/commit/87cfd386cb2e02bfa440c94706d9d0274f83070c) by [@KunalFarmah98](https://github.com/KunalFarmah98)) + +## v0.69.3 + +### Fixed + +#### iOS specific + +- Fix React-bridging header not found for third party modules ([fa2acc32d1](https://github.com/facebook/react-native/commit/fa2acc32d1490f6e418689dec321f8bd4ef7bb28) by [@Kudo](https://github.com/Kudo)) + +## v0.69.2 + +### Changed + +- Set react-shallow-renderer v16.15.0 for react v18 compat ([a39a7c453d](https://github.com/facebook/react-native/commit/a39a7c453d87086935ff07d549ba8220cbcf30bd) by [@mikehardy](https://github.com/mikehardy)) +- Upgrade RN CLI to v8.0.3 ([28cbd21d21](https://github.com/facebook/react-native/commit/28cbd21d21f2ffb3f38b2449a4983f013947ce0a) by [@thymikee](https://github.com/thymikee)) + +#### iOS specific + +- Hermes pod: change logic to use the hermes tag to set the pod source correctly ([46a9edc854](https://github.com/facebook/react-native/commit/46a9edc8544ae070149a97ea3d919b88dd6e2942) by [@kelset](https://github.com/kelset)) +- Fix the race condition when calling readAsDataURL after new Blob(blobs) ([bd12e41188](https://github.com/facebook/react-native/commit/bd12e41188c8d85c0acbd713f10f0bd34ea0edca) by [@wood1986](https://github.com/wood1986)) +- Make sure that Flipper pods are not installed when creating a release build ([23accbf58d](https://github.com/facebook/react-native/commit/23accbf58d2fa03ad020e07f00012a32609c7218) by [@cipolleschi](https://github.com/cipolleschi)) + +## v0.69.1 + +### Changed + +#### iOS specific + +- Make all Yoga headers public and add #ifdef __cplusplus ([43f831b23c](https://github.com/facebook/react-native/commit/43f831b23caf22e59af5c6d3fdd62fed3d20d4ec) by [@janicduplessis](https://github.com/janicduplessis)) + +### Fixed + +- Use monotonic clock for performance.now() ([114d31feee](https://github.com/facebook/react-native/commit/114d31feeeb47f5a57419e5088c3cbe9340f757a)) + +#### iOS specific + +- Fix build for React-RCTText ([4ea38e16bf](https://github.com/facebook/react-native/commit/4ea38e16bf533955557057656cba5346d2372acd) by [@ph4r05](https://github.com/ph4r05)) +- Fix RCT-Folly build error when use_frameworks! and hermes are both enabled ([79baca678a](https://github.com/facebook/react-native/commit/79baca678a743560fa16fdd551f1d0d018d34304) by [@Kudo](https://github.com/Kudo)) +- Fix use_frameworks! for 0.69 ([f97c6a5b49](https://github.com/facebook/react-native/commit/f97c6a5b498eec95e99a02c7842cb2ae160cd6cd) by [@Kudo](https://github.com/Kudo)) + +## v0.69.0 + +### Breaking + +- Support for `console.disableYellowBox` [has been dropped](https://github.com/facebook/react-native/commit/b633cc130533f0731b2577123282c4530e4f0abe) +- Already deprecated prop types have been removed ([cdfddb4dad](https://github.com/facebook/react-native/commit/cdfddb4dad7c69904850d7e5f089a32a1d3445d1), [3e229f27bc](https://github.com/facebook/react-native/commit/3e229f27bc9c7556876ff776abf70147289d544b), [10199b1581](https://github.com/facebook/react-native/commit/10199b158138b8645550b5579df87e654213fe42)) +- `removeListener`, deprecated since RN0.65, [was removed](https://github.com/facebook/react-native/commit/8dfbed786b40082a7a222e00dc0a621c0695697d) from Appearance +- If you were using `SegmentedComponentIOS`, you will now need to move to the [segmented-control](https://github.com/react-native-segmented-control/segmented-control) library ([235f168574](https://github.com/facebook/react-native/commit/235f1685748442553e53f8ec6d904bc0314a8ae6)) + +### Added + +- Add Hermes scripts to package ([004b8609d9](https://github.com/facebook/react-native/commit/004b8609d97b14a6d5cb8c9e63afdbe343c500da) by [@hramos](https://github.com/hramos)) +- Expose scheduler through FabricUIManager ([1730949e94](https://github.com/facebook/react-native/commit/1730949e94aa23927a90d2a64d91977b7e2904d6) by [@cortinico](https://github.com/cortinico)) +- Add event listeners to Scheduler ([e51e19ecc1](https://github.com/facebook/react-native/commit/e51e19ecc1d1b8ac5c860eac55338ef13471844f) by [@cortinico](https://github.com/cortinico)) +- C++ TurboModule methods can return functions ([c7380ba113](https://github.com/facebook/react-native/commit/c7380ba1131b26b487ecae87239a4cf82afefd15) by [@appden](https://github.com/appden)) +- Add support for devtools' profiler ([fefa7b6ac8](https://github.com/facebook/react-native/commit/fefa7b6ac8a1e0e33fa7a1070936c5c83c873c0a) by [@jpporto](https://github.com/jpporto)) +- Add getAll function to FormData class for getting all parts containing that key. This is also available in web API. ([d05a5d1551](https://github.com/facebook/react-native/commit/d05a5d15512ab794ef80b31ef91090d5d88b3fcd) by [@matinzd](https://github.com/matinzd)) +- Automatic type conversions for C++ TurboModules ([31f0796237](https://github.com/facebook/react-native/commit/31f079623732fb017b1fa38d56abe855d7738ece) by [@appden](https://github.com/appden)) +- New bridging API for JSI <-> C++ ([30cb78e709](https://github.com/facebook/react-native/commit/30cb78e709bccb4f7bf7aab3f6b0f1ba4261f577) by [@appden](https://github.com/appden)) +- Add asBool() method to JSI ([603620b739](https://github.com/facebook/react-native/commit/603620b7394da5855e2255790bfea9ad7d80ddf9) by [@appden](https://github.com/appden)) +- CustomEvent and Event polyfills for React Native ([6abbef1200](https://github.com/facebook/react-native/commit/6abbef1200af9adab1848de17955d77fbe0ad5da) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Implement Runtime.getHeapUsage for hermes chrome inspector ([cff9590864](https://github.com/facebook/react-native/commit/cff9590864c4be153a4eb49757b7cac8b3f23f66) by [@janicduplessis](https://github.com/janicduplessis)) +- Introduce ReactNativeFeatureFlags file to control FeatureFlags in React Native ([33aba77456](https://github.com/facebook/react-native/commit/33aba774564acdec216e02e28f17ad08ad7bc26b) by [@mdvacca](https://github.com/mdvacca)) +- Added fail-safe check to catch MissingWebViewPackage Exception ([8c573d9336](https://github.com/facebook/react-native/commit/8c573d933652ae4da1008502c53fce93057101c0) by [@Kunal-Airtel2022](https://github.com/Kunal-Airtel2022)) +- Add ability to access properties with symbol keys through JSI ([9010bfe457](https://github.com/facebook/react-native/commit/9010bfe457b77862024214ce6210504ff1786ef5) by [@neildhar](https://github.com/neildhar)) +- Allow color styles to be animated using native driver ([201f355479](https://github.com/facebook/react-native/commit/201f355479cafbcece3d9eb40a52bae003da3e5c) by [@genkikondo](https://github.com/genkikondo)) +- Make react-native depend on react-native-gradle-plugin ([3346efb7d4](https://github.com/facebook/react-native/commit/3346efb7d422bd8eb7f48650b454071f9981fa0b) by [@cortinico](https://github.com/cortinico)) +- Add RawEventTelemetryEventEmitter interface to ReactNativePrivateInterface ([1f15a64028](https://github.com/facebook/react-native/commit/1f15a6402869b001cae049facc17126924b97197) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Implement Runtime.getHeapUsage for hermes chrome inspector ([3568a72987](https://github.com/facebook/react-native/commit/3568a7298738a651d76c70763362c297ab601ee8) by [@janicduplessis](https://github.com/janicduplessis)) +- Add support for C++17 in OSS ([c2e4ae39b8](https://github.com/facebook/react-native/commit/c2e4ae39b8a5c6534a3fa4dae4130166eda15169) by [@sammy-SC](https://github.com/sammy-SC)) + +#### Android specific + +- Generate `Nullable` for optional objects and arrays in module codegen. ([ffaa5d69bc](https://github.com/facebook/react-native/commit/ffaa5d69bc268918891121e2d60e7ca08ee82530)) +- Expose an API to enable Concurrent Root on Android ([d7b64b8d4b](https://github.com/facebook/react-native/commit/d7b64b8d4b2f403ce00b27c5df89ffb3a64dc6de) by [@cortinico](https://github.com/cortinico)) +- Add scrollEventThrottle prop support in Android ([cf55fd587e](https://github.com/facebook/react-native/commit/cf55fd587e6cc82a73079be6076d244ab72fa359) by [@ryancat](https://github.com/ryancat)) +- Accessibility announcement for list and grid in FlatList ([dd6325bafe](https://github.com/facebook/react-native/commit/dd6325bafe1a539d348f3710e717a6344576b859) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Introduce ModuleDataCleaner.cleanDataFromModules(ReactContext) ([184dfb8f8b](https://github.com/facebook/react-native/commit/184dfb8f8bd4dfbb8d1575e9554e3f3361793015) by [@RSNara](https://github.com/RSNara)) +- Introduce ReactContext.getNativeModules() ([b978308519](https://github.com/facebook/react-native/commit/b978308519f71c6c7fda4b38a842aa219a349275) by [@RSNara](https://github.com/RSNara)) +- MapBuffer implementation for JVM -> C++ communication ([cf6f3b680b](https://github.com/facebook/react-native/commit/cf6f3b680b43fae31e97b14af681293503025a0c)) +- Make links independently focusable by Talkback ([7b5b114d57](https://github.com/facebook/react-native/commit/7b5b114d578142d18bf4a7a5279b179a9ac8d958) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Support animating text color with native driver ([87cdb607e4](https://github.com/facebook/react-native/commit/87cdb607e4792156d433c44b89932e7dae3371da) by [@genkikondo](https://github.com/genkikondo)) +- Added an experimental prop serialization path based on MapBuffer ([cbcdaae2b5](https://github.com/facebook/react-native/commit/cbcdaae2b5dda2a44c95d83dcb5b5aa0f43bc6f9)) +- Allow to setup a Gradle Enterprise instance via an external script ([f11dcfaea1](https://github.com/facebook/react-native/commit/f11dcfaea14249b059aea2474ce36a0665140d4f) by [@cortinico](https://github.com/cortinico)) +- Support platform color with AnimatedColor ([cb42049e0a](https://github.com/facebook/react-native/commit/cb42049e0ae262afe907ace1099414836ab0018d) by [@genkikondo](https://github.com/genkikondo)) +- Support running animations with AnimatedColor with native driver ([3f49e6763e](https://github.com/facebook/react-native/commit/3f49e6763e66447f6ae17dc2f032e27330b7b74a) by [@genkikondo](https://github.com/genkikondo)) +- Add public API to ReactRootView to control if JS touch events are dispatched ([0a517ae438](https://github.com/facebook/react-native/commit/0a517ae43892fb764d829f8bae56c1ac58356b1b) by [@ryancat](https://github.com/ryancat)) + +#### iOS specific + +- Prepare a method in the AppDelegate to control the concurrentRoot. ([8ac8439e0d](https://github.com/facebook/react-native/commit/8ac8439e0dcc0cc4a9c0cc99f614a5e19bae56eb) by [@cipolleschi](https://github.com/cipolleschi)) +- `hotkeysEnabled` property is added to `RCTDevMenu` which allows enabling/disabling hotkeys that triggers developer menu popup ([1a1a304ed2](https://github.com/facebook/react-native/commit/1a1a304ed2023d60547aef65b1a7bf56467edf08)) +- Allow modifying iOS image cache limits ([61b013e7ad](https://github.com/facebook/react-native/commit/61b013e7ad8a1cc28ee39434d2fd96b74b96cf5f) by [@danilobuerger](https://github.com/danilobuerger)) +- Add dismissActionSheet method to ActionSheetIOS ([64ebe5bbdd](https://github.com/facebook/react-native/commit/64ebe5bbdd32fc3b3a243a8a81a6f724d8f81267) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Integrated the `accessibilityLanguage` prop to all the available components. The prop is available for any platform but it will work only on iOS. ([7b05b091fd](https://github.com/facebook/react-native/commit/7b05b091fd97f95b778369277ac2147730abc7b8) by [@dgopsq](https://github.com/dgopsq)) +- Support running animations with AnimatedColor with native driver ([49f3f47b1e](https://github.com/facebook/react-native/commit/49f3f47b1e9b840e4374d46b105604f4d2c22dd5) by [@genkikondo](https://github.com/genkikondo)) + +### Changed + +- Update direct Metro dependencies to 0.70.1 ([b74e964e70](https://github.com/facebook/react-native/commit/b74e964e705c40834acad7020562e870cdad9db1), ([c92b64b16a](https://github.com/facebook/react-native/commit/c92b64b16a5710c1dfaea9af4c271931e4669636) by [@arushikesarwani94](https://github.com/arushikesarwani94)), ([f89a0b765c](https://github.com/facebook/react-native/commit/f89a0b765c09c9aba573f03777cc76673989628f) by [@robhogan](https://github.com/robhogan)) +- Upgrade RN CLI to v8.0.0 ([0605880c9e](https://github.com/facebook/react-native/commit/0605880c9ed0aec812f3198eb5075db64fba969a), [1e0226f933](https://github.com/facebook/react-native/commit/1e0226f933814bf9ada87eaa14348bfff863ead1), [24bb7f7380](https://github.com/facebook/react-native/commit/24bb7f7380662925f078d78a03fbc954af2da3d6), [7dceb9b63c](https://github.com/facebook/react-native/commit/7dceb9b63c0bfd5b13bf6d26f9530729506e9097) by [@thymikee](https://github.com/thymikee)) +- Replace use-subscripton with use-sync-external-store ([93b50be8c2](https://github.com/facebook/react-native/commit/93b50be8c2341a0daf41f6fdc656896c4907c4dc) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Expose UIManager from Scheduler ([54db5f2012](https://github.com/facebook/react-native/commit/54db5f201292ebf267800d92b7dd5bfa22431963) by [@cortinico](https://github.com/cortinico)) +- Optimized VirtualizedList context when used with nested lists ([ceb0a54608](https://github.com/facebook/react-native/commit/ceb0a546083509192c059cdd93d6aa379e38ef4e) by [@javache](https://github.com/javache)) +- Remove usage of std::string in EarlyJsErrorHandler. ([30051b2c41](https://github.com/facebook/react-native/commit/30051b2c4185bff015c72069488b5f6ba3391ad7) by [@sshic](https://github.com/sshic)) +- `eslint-config`: add support for ESLint 8 ([864a8c11b2](https://github.com/facebook/react-native/commit/864a8c11b2a7540f607ebc0e084edd7393169359) by [@wcandillon](https://github.com/wcandillon)) +- `eslint-config`: add support for TypeScript 4.5+ ([199ac680c7](https://github.com/facebook/react-native/commit/199ac680c7867a982e25620219bffa18f85f5404) by [@rnike](https://github.com/rnike)) +- Upgraded react-devtools-core dependency to 4.24.0 ([a7a781ff4a](https://github.com/facebook/react-native/commit/a7a781ff4a13e744f4eb3007ef0657740b277a72)) +- Avoid flattening nodes with event props ([980c52de41](https://github.com/facebook/react-native/commit/980c52de41258f6cf2d2360144ea7ca16a19c9f8)) +- Type the argument of Animated.interpolate as read-only ([6584304c10](https://github.com/facebook/react-native/commit/6584304c100ce4d51a5c4d606170a6ad0dc00875) by [@motiz88](https://github.com/motiz88)) +- Update gradle-download-task to 5.0.1 to support concurrent downloads ([a86cae7aac](https://github.com/facebook/react-native/commit/a86cae7aacc9837536e7d679870a57dcd0f45475) by [@michel-kraemer](https://github.com/michel-kraemer)) +- Logging a soft error when ReactRootView has an id other than -1 instead of crashing the app in hybrid apps ([1ca2c24930](https://github.com/facebook/react-native/commit/1ca2c2493027c1b027146cd41e17dd8a4fc33a41) by [@Kunal-Airtel2022](https://github.com/Kunal-Airtel2022)) +- Upgrade to React 18 ([41cbccd98d](https://github.com/facebook/react-native/commit/41cbccd98dd6c98d1f662674164cf455105a1359) by [@rickhanlonii](https://github.com/rickhanlonii)) + +#### Android specific + +- Gradle: extend the algoritm to find hermesc paths ([aeac6ab677](https://github.com/facebook/react-native/commit/aeac6ab6773cd2c0ca7abe9e5aa3f22fa81683e5) by [@cortinico](https://github.com/cortinico)) +- Bump boost for Android to 1.76 to align with iOS ([5cd6367f0b](https://github.com/facebook/react-native/commit/5cd6367f0b86543274a15bb6d0e53a8545fed845) by [@kelset](https://github.com/kelset)) +- Adopt `MapBuffer` interface for `ReadableMapBuffer` ([81e4249315](https://github.com/facebook/react-native/commit/81e42493158edd5e7b88f98c19c87e9d61ba4aba)) +- Mark intent as nullable ([5ffa0b0aa6](https://github.com/facebook/react-native/commit/5ffa0b0aa6c523234c634167be1f94b0d9edb0f7) by [@sshic](https://github.com/sshic)) +- Use CMake to build ReactAndroid module ([e3830ddffd](https://github.com/facebook/react-native/commit/e3830ddffd9260fe071e0c9f9df40b379d54cf26)) +- Update template/android and RN Tester to use `hermes-engine` from the `react-native` NPM package. ([4d91f40fbd](https://github.com/facebook/react-native/commit/4d91f40fbdf0012689b04084113299676342c0dc) by [@cortinico](https://github.com/cortinico)) +- Build Hermes from Source ([a3d9892ed9](https://github.com/facebook/react-native/commit/a3d9892ed9c993d16fa36fa6b713e2ead43fcc77) by [@cortinico](https://github.com/cortinico)) +- Rename field with default values for ReactConfig to DEFAULT_CONFIG ([964e816752](https://github.com/facebook/react-native/commit/964e81675286c80a8e322127aa7c052f62621098)) +- Moved `com/react/facebook/uimanager/interfaces` files into `com/react/facebook/uimanager` to enable Kotlin build ([b1a779392d](https://github.com/facebook/react-native/commit/b1a779392d483c649d428debfe4a6405247b8c0e)) +- Bump AGP to 7.1.0 and fix bundle inclusion in release mode ([200488e87c](https://github.com/facebook/react-native/commit/200488e87cf4bc355e03c78cd814b97b23452117) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Release react-native-gradle-plugin 0.0.5 ([42272211e4](https://github.com/facebook/react-native/commit/42272211e4a1b7cff7770b59cf1bcf649cbdd6fc) by [@cortinico](https://github.com/cortinico)) +- ViewPagerAndroid recommendation link. ([7e8cce3d2d](https://github.com/facebook/react-native/commit/7e8cce3d2ddffbe36bcb3c9ec2f006f7e1b42a79) by [@maaxg](https://github.com/maaxg)) +- Bump android Appcompat to 1.4.1 ([6b61995647](https://github.com/facebook/react-native/commit/6b61995647c789a567845521fed7b0cc1e0cddb7) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Remove `react-native-gradle-plugin` as a dependency from template's package.json ([cd79317672](https://github.com/facebook/react-native/commit/cd79317672e5c99636346f2abb641a688a4ceb82) by [@cortinico](https://github.com/cortinico)) +- Use 2g as a default heap size for gradle builds ([09e418ef8e](https://github.com/facebook/react-native/commit/09e418ef8e98fd026cf828696ff2475993b76ac2)) +- Use new StatusBar API on Android 11 (API 30)+ ([50c8e973f0](https://github.com/facebook/react-native/commit/50c8e973f067d4ef1fc3c2eddd360a0709828968) by [@ieatfood](https://github.com/ieatfood)) +- Change static string to public ([ab45138394](https://github.com/facebook/react-native/commit/ab45138394f41aeb13370882837968636de04c24) by [@sshic](https://github.com/sshic)) + +#### iOS specific + +- Use pre-built HermesC if available in current React Native release ([644fe430fd](https://github.com/facebook/react-native/commit/644fe430fdecc0bf1fa098d1c2d52178da6c987c) by [@hramos](https://github.com/hramos)) +- When building Hermes from source, the filesystem will now be prepared using the new hermes-utils.js scripts, outside of CocoaPods ([aaa01f7710](https://github.com/facebook/react-native/commit/aaa01f77106f891696d9ec508e2ee71111a6af2a) by [@hramos](https://github.com/hramos)) +- Expose scheduler through RCTSurfacePresenter ([614aa86916](https://github.com/facebook/react-native/commit/614aa86916394d8ee2ecb236f38de6bb7e161ca2) by [@cortinico](https://github.com/cortinico)) +- Adopt UIGraphicsImageRenderer API ([d70d7fd0b3](https://github.com/facebook/react-native/commit/d70d7fd0b3984ee54622afc4692a6c945618c345) by [@matrush](https://github.com/matrush)) +- Build Hermes from source when Hermes is used ([bb01b75637](https://github.com/facebook/react-native/commit/bb01b75637edc1159a3bdb3af86936e1c92f39c1) by [@hramos](https://github.com/hramos)) +- Update CodeGen scripts to accept custom node executable ([323db75c36](https://github.com/facebook/react-native/commit/323db75c36d26d771f6b231c8eabc5afc0da74d3) by [@cipolleschi](https://github.com/cipolleschi)) +- Fixed the fallback behavior when the `.xcode.env` file is missing, actually using the old `find-node-for-xcode.sh` script ([705c6f57d6](https://github.com/facebook/react-native/commit/705c6f57d66b4499f43489292183a58413402a74) by [@cipolleschi](https://github.com/cipolleschi)) +- Adding a link in a message for the users. ([2c52131f5e](https://github.com/facebook/react-native/commit/2c52131f5e0eb4668681242fcdd8150afe3c5827) by [@cipolleschi](https://github.com/cipolleschi)) +- Bump ruby to 2.7.5 ([2c87b7466e](https://github.com/facebook/react-native/commit/2c87b7466e098c5cd230e02b279fc7bc7a357615) by [@danilobuerger](https://github.com/danilobuerger)) +- This PR removes the `find-node.sh` scripts and replaces it with an `.xcode.env` file that is sourced by the script phases that needs it. The `.xcode.env` file is versioned: to customize a local environment, an unversioned `.xcode.local.env` can be used. ([0480f56c5b](https://github.com/facebook/react-native/commit/0480f56c5b5478b6ebe5ad88e347cad2810bfb17) by [@cipolleschi](https://github.com/cipolleschi)) +- Update `PushNotificationIOS.checkPermissions` to include iOS 10+ notification settings. ([17ecd2fb5b](https://github.com/facebook/react-native/commit/17ecd2fb5b3cfb8aa0282ed406b16dc3b9777018)) +- Enable SonarKit in React-Core when the configuration is `'Debug'` ([b5343a6b0d](https://github.com/facebook/react-native/commit/b5343a6b0dd07c1b4ef9dac549df67a4d68ebd1e) by [@cipolleschi](https://github.com/cipolleschi)) +- When Hermes is enabled, the Hermes Engine will be built from source instead of using the pre-built `hermes-engine` CocoaPod. ([12ad1fffe8](https://github.com/facebook/react-native/commit/12ad1fffe87c0c5ab2e001f318ff4f8d3eda7479) by [@hramos](https://github.com/hramos)) +- Replaced folly::Optional with std::optional from C++17 in Objc module generator. ([45e2941367](https://github.com/facebook/react-native/commit/45e2941367fbf13584193bbda598173802289167) by [@philIip](https://github.com/philIip)) +- Removed methodName parameter that was used only for a warning message and moved the warning parameter to be calculated inline. ([cfb11ca2f6](https://github.com/facebook/react-native/commit/cfb11ca2f67c59c090b8a58b2b7bdaacef0e19df)) +- Fix the crash caused by nil partialLoadHandler ([46bc521513](https://github.com/facebook/react-native/commit/46bc521513c9c78e5ffc49cf3e571757e1a91cef)) +- Synchronously render cached images ([189c2c8958](https://github.com/facebook/react-native/commit/189c2c8958442541c6b4f42860b2943ece612da2)) +- Updated Flipper-Glog to 0.5.0.4 ([cd60ffdb62](https://github.com/facebook/react-native/commit/cd60ffdb62b2183cd24baef3075d56f758cea24a)) +- Add function to report early js errors ([1804951595](https://github.com/facebook/react-native/commit/180495159517dc0bfa103621e5ff62fc04cb3c8b) by [@sshic](https://github.com/sshic)) + +### Deprecated + +- Deprecate the use of `react-native/jest/preprocessor.js` by external projects ([c1e9aa9a27](https://github.com/facebook/react-native/commit/c1e9aa9a272aed3cba60c4aeff783eeb8bffce68) by [@motiz88](https://github.com/motiz88)) +- Deprecate the Promise.prototype.done method and log a warning when it's called in development. ([35800962c1](https://github.com/facebook/react-native/commit/35800962c16a33eb8e9ff1adfd428cf00bb670d3) by [@motiz88](https://github.com/motiz88)) + +#### iOS specific + +- Deprecating support for iOS/tvOS SDK 11.0, 12.4+ is now required ([5f2835b14d](https://github.com/facebook/react-native/commit/5f2835b14d35681c268dd64d6ec284ea5f053be3), ([c71e6efbcd](https://github.com/facebook/react-native/commit/c71e6efbcd2b95faee327d9763d321488120bc5e), ([982ca30de0](https://github.com/facebook/react-native/commit/982ca30de079d7e80bd0b50365d58b9048fb628f) by [@philIip](https://github.com/philIip)) + +#### iOS specific + +- Removed lint restricting `DynamicColorIOS` to only two properties ([13b0b06522](https://github.com/facebook/react-native/commit/13b0b0652259ada468cc044b0b604edb666b2eb9)) + +### Fixed + +- Remove unactionable warning about `codegenNativeComponent` when on 'Paper' ([494b73cb33](https://github.com/facebook/react-native/commit/494b73cb33197fa865e9ead8fdca11bce6822917) by [@tido64](https://github.com/tido64)) +- Fix typo in Value's constructor with a Symbol ([a7a0f86a73](https://github.com/facebook/react-native/commit/a7a0f86a73ab51be31fb2c3205612d7ff1fb5384) by [@jpporto](https://github.com/jpporto)) +- Avoid full copy of large folly::dynamic objects by switching to std::move semantics ([3f98c8e4c2](https://github.com/facebook/react-native/commit/3f98c8e4c2c8f40b81c1a90aa65c1bdc9327faed) by [@NikoAri](https://github.com/NikoAri)) +- Fix performance issue on Animated.interpolate with big input range ([f503b21203](https://github.com/facebook/react-native/commit/f503b212039f79f00ea56b65ecf3cd150b82f087) by [@Almouro](https://github.com/Almouro)) +- Update function spacing linting rules ([8650220cf9](https://github.com/facebook/react-native/commit/8650220cf99739c4b904a37ce4f19ce7dfd3bdbb) by [@joeframbach](https://github.com/joeframbach)) +- Add supportsFromJs and supportsToJs template variables ([087624ccaf](https://github.com/facebook/react-native/commit/087624ccaf2e484c0b6425e57edf9afd62a06e9a) by [@appden](https://github.com/appden)) +- The Array appended to FormData is transmitted as a string ([d2e8e7d58e](https://github.com/facebook/react-native/commit/d2e8e7d58e680e0bb3b4da1f820dd4dd840639f5) by [@bang9](https://github.com/bang9)) +- AppState.removeEventListener correctly removes listener for blur and focus events ([9aab25ec53](https://github.com/facebook/react-native/commit/9aab25ec536473ffe6d22c5efeae8fea6bd769be) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) +- `focus()` on TextInput to respect its `editable` state ([8a5460ce80](https://github.com/facebook/react-native/commit/8a5460ce80e69c11a007121d4278d55642f6b10e) by [@vonovak](https://github.com/vonovak)) +- Restore Windows build with RawPropsParser.cpp ([2d64d1d693](https://github.com/facebook/react-native/commit/2d64d1d69360161c047c86a026403d8074ba28bb) by [@TatianaKapos](https://github.com/TatianaKapos)) +- Fix babel-plugin-codegen crash when export init is null ([ae756647c9](https://github.com/facebook/react-native/commit/ae756647c9b8a88ba615fd30185f621825a33427) by [@janicduplessis](https://github.com/janicduplessis)) +- Fixed compilation warning due to `using namespace` being used as part of header ([009d80bf5a](https://github.com/facebook/react-native/commit/009d80bf5a55dd74be448960b1344ac7599c6bae) by [@arhelmus](https://github.com/arhelmus)) +- Allow including TurboModule.h in mixed rtti/no-rtti environment, even if TurboModule.h/cpp is compiled without RTTI. ([1f87729697](https://github.com/facebook/react-native/commit/1f87729697370a4ab31e2bb9ab1780438d9e146f) by [@nlutsenko](https://github.com/nlutsenko)) +- Remove prettier from dependencies in eslint-config ([2db1bca952](https://github.com/facebook/react-native/commit/2db1bca95224ce39484c3f27508aec9a21ce126a) by [@Kerumen](https://github.com/Kerumen)) +- Switch Component doesn't disable click functionality when disabled ([b2e625a517](https://github.com/facebook/react-native/commit/b2e625a51723becea4cef0433448fbec679669ee) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Support numeric color values in StyleSheet's Flow types ([83b1975b90](https://github.com/facebook/react-native/commit/83b1975b90569a36020da33156615a13fcc7ba92) by [@motiz88](https://github.com/motiz88)) +- Fix build break on Windows with ReactCommon ([42b391775f](https://github.com/facebook/react-native/commit/42b391775f663df335f6f2553104fc2fa35b1bee) by [@chiaramooney](https://github.com/chiaramooney)) +- Fixed opacity value in TouchableOpacity ([3eddc9abb7](https://github.com/facebook/react-native/commit/3eddc9abb70eb54209c68aab7dbd69e363cc7b29) by [@hetanthakkar1](https://github.com/hetanthakkar1)) +- Remove illegal private property access in VirtualizedSectionList.scrollToLocation ([b2f871a6fa](https://github.com/facebook/react-native/commit/b2f871a6fa9c92dd0712055384b9eca6d828e37d) by [@motiz88](https://github.com/motiz88)) +- JS animated node value updates properly when listener is attached ([1f778014a7](https://github.com/facebook/react-native/commit/1f778014a7e95c5c473898c38d5b1e0725cd373c) by [@genkikondo](https://github.com/genkikondo)) +- Working around Long paths limitation on Windows ([7b76abc0d3](https://github.com/facebook/react-native/commit/7b76abc0d3a0a5bec37f314c80954e412fc5f5ec) by [@mganandraj](https://github.com/mganandraj)) +- Fix VirtualizedList with initialScrollIndex not rendering all elements when data is updated ([c5c17985da](https://github.com/facebook/react-native/commit/c5c17985dae402725abb8a3a94ccedc515428711) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) + +#### Android specific + +- Add back hermes inspector support ([6b6adcc111](https://github.com/facebook/react-native/commit/6b6adcc111123bec2c4c110070b2506385e74664) by [@Kudo](https://github.com/Kudo)) +- Fixed issue where any node with an AccessibilityDelegate set (which was any node with any accessibility propoerty), was using ExploreByTouchHelper's built in AccessibilityNodeProvider, and not properly populating their AccessibilityNodeInfo's, leading to focus issues and issues with automated test services like UIAutomator. ([70fcab76a4](https://github.com/facebook/react-native/commit/70fcab76a4dcf65e628ac897620fe050758574e3) by [@blavalla](https://github.com/blavalla)) +- Fix Extras usage in Android implementation of Linking.sendIntent() ([86f8d0bb52](https://github.com/facebook/react-native/commit/86f8d0bb528a75777c357ae214643ed58c326ca9)) +- Fix typo in gradle plugin deprecation message ([41cfd2f976](https://github.com/facebook/react-native/commit/41cfd2f9768e4742eedd299ab467d316d016705e) by [@mikehardy](https://github.com/mikehardy)) +- Fixed `TimingModule` related functions for headless JS tasks, eg. `setTimeout` ([dac56ce077](https://github.com/facebook/react-native/commit/dac56ce0776e0e4d23ed4f8b324f2e2432aefa6a) by [@marcesengel](https://github.com/marcesengel)) +- Improve support for Android users on M1 machine ([c5babd993a](https://github.com/facebook/react-native/commit/c5babd993a2bed2994ecc4710fa9e424b3e6cfc2) by [@cortinico](https://github.com/cortinico)) +- Do not use `rootProject` directly in Gradle scripts ([b2bc5aa5c9](https://github.com/facebook/react-native/commit/b2bc5aa5c903ad057a53d4caa82b0fe74e01c07c) by [@cortinico](https://github.com/cortinico)) +- Adding null check for context in redbox surface delegate ([9527ab1584](https://github.com/facebook/react-native/commit/9527ab1584869d7966c562e8aa7cbf48788156a3) by [@ryancat](https://github.com/ryancat)) +- Fix crash on empty snapToOffsets array ([145fd041c7](https://github.com/facebook/react-native/commit/145fd041c7afe9a18f08f461487bb515ab2f516a) by [@ryancat](https://github.com/ryancat)) +- Fix StatusBar not updating to use translucent values when set to the same value across different activities ([d34a75e9e5](https://github.com/facebook/react-native/commit/d34a75e9e5932adcac4a16f5b815bb909c3aa0dd)) +- Fix underlineColorAndroid transparent not working on API 21 ([52aee50a70](https://github.com/facebook/react-native/commit/52aee50a704bbeab91f5fa05fe3220dee304422f) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fixed regression on content in scroll view not responding to touch when fling got interrupted ([bb8ff9260f](https://github.com/facebook/react-native/commit/bb8ff9260fe6a783171f35ce1a459927d8179d08) by [@ryancat](https://github.com/ryancat)) +- Fixes android build error when compiling as library ([c34ef5841c](https://github.com/facebook/react-native/commit/c34ef5841cf3a63a9cc96add577d6bf6d52e4397) by [@nickfujita](https://github.com/nickfujita)) +- Cancel post touch process when new touch is received ([0368081858](https://github.com/facebook/react-native/commit/0368081858193d7c2537acd9080d11bb701ee98b) by [@ryancat](https://github.com/ryancat)) +- Improve rendering of images when resampled and corner radius applied ([f743bed657](https://github.com/facebook/react-native/commit/f743bed657591b078300a6519e3d68db542fd757) by [@javache](https://github.com/javache)) +- Fix transform when calculate overflowInset ([0975e96d53](https://github.com/facebook/react-native/commit/0975e96d53546ac05b2154352fe56e5d82e2a1f8) by [@ryancat](https://github.com/ryancat)) +- Fix ReactHorizontalScrollView contentOffset ([9f6f97151c](https://github.com/facebook/react-native/commit/9f6f97151c44a0f727c9dd938222be1860ecf3f9) by [@genkikondo](https://github.com/genkikondo)) +- Text Component does not announce disabled and disables click functionality when disabled ([7b2d8178b1](https://github.com/facebook/react-native/commit/7b2d8178b155f5f1b247614c46e5e20f31bbd438) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fix StatusBar on Android API 30 ([9ed2df628d](https://github.com/facebook/react-native/commit/9ed2df628ddd410cc3383e68b0386471432445c0) by [@ieatfood](https://github.com/ieatfood)) +- Use root locale when converting string case. ([5341ad8962](https://github.com/facebook/react-native/commit/5341ad896245c40a00b6faead1b90d01aac58f8c) by [@halaei](https://github.com/halaei)) +- Fix DarkMode on Calendar DateTimePicker ([97064ae1fb](https://github.com/facebook/react-native/commit/97064ae1fbf84a8a6b653c02c5872191b7d2d622) by [@mdvacca](https://github.com/mdvacca)) +- Fix ScrollView contentOffset ([be260b9f47](https://github.com/facebook/react-native/commit/be260b9f479a3b55ee43d2959d2c49fd3c1eb4ac) by [@genkikondo](https://github.com/genkikondo)) +- Do not bundle libhermes.so or libjsc.so inside the React Native Android AAR ([fa85417179](https://github.com/facebook/react-native/commit/fa854171798e67b8a10820f77d7198315e1784ed) by [@cortinico](https://github.com/cortinico)) +- Enable hitSlop to be set using a single number. ([d682753244](https://github.com/facebook/react-native/commit/d682753244feba28c6a15c31966a3da075a090e6) by [@javache](https://github.com/javache)) +- Fix crash caused by Image.queryCache parsing null ([ae3d4f7008](https://github.com/facebook/react-native/commit/ae3d4f700843ae4cbb6927ee620095136d1abc3f) by [@skychx](https://github.com/skychx)) +- Fix NullPointerException when disaptching events ([fbeb51ef51](https://github.com/facebook/react-native/commit/fbeb51ef5133303a5cb71569507d44403ded3447) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- ScrollView's contentInsetAdjustmentBehavior is reset to Never at every reuse to avoid layout artifacts. ([28a65f4387](https://github.com/facebook/react-native/commit/28a65f438789c29309d6e7c58063a73ca721ef43)) +- Prevent Nullptr segfault in TurboModule init path ([7f3cc256b5](https://github.com/facebook/react-native/commit/7f3cc256b5bcbf2e64540ca69401f62ec6869f0e) by [@RSNara](https://github.com/RSNara)) +- Expose the extraData dict attached to JavaScript errors to the native ExceptionManager on iOS, similar to Android ([a65ae8eff6](https://github.com/facebook/react-native/commit/a65ae8eff6ec6f9ad283ac8e96f00802421a14da) by [@GijsWeterings](https://github.com/GijsWeterings)) +- `RCTLocalizationProvider` Fall back to input when no localization is available ([18196512db](https://github.com/facebook/react-native/commit/18196512db6b8b4469a5e1b098d8892ae72d743a) by [@robhogan](https://github.com/robhogan)) +- Update iOS LogBox to render its UIWindow with the key window's UIWindowScene ([d31d83f410](https://github.com/facebook/react-native/commit/d31d83f4109c167ec612058c805fd65f69b82476) by [@vincentriemer](https://github.com/vincentriemer)) +- Remove Gemfile.lock from template ([1907bd31f0](https://github.com/facebook/react-native/commit/1907bd31f066865aa1c5fe4ec88e98ee46448771) by [@danilobuerger](https://github.com/danilobuerger)) +- Fix `pod install` when `RCT-Folly` version has been updated. ([b2517c3bdc](https://github.com/facebook/react-native/commit/b2517c3bdccc3f9d935f4ee06f959d6ce8f27bbe) by [@fortmarek](https://github.com/fortmarek)) +- Fix usage of cocoapods with --project-directory flag and new arch ([2f813f873a](https://github.com/facebook/react-native/commit/2f813f873a1692044ea3461e59ca732a4d952300) by [@danilobuerger](https://github.com/danilobuerger)) +- Ensure LogBoxView is sized relative to the key window instead of the full screen ([84f8c9ad55](https://github.com/facebook/react-native/commit/84f8c9ad550f98295d2e718b4b1d6b1ac724b898) by [@vincentriemer](https://github.com/vincentriemer)) +- Improved template fastlane gitignore ([f43f05d292](https://github.com/facebook/react-native/commit/f43f05d292fd2fbdf3d5fdfd194ed81b0e346657) by [@danilobuerger](https://github.com/danilobuerger)) +- Set RCTView borderColor to UIColor ([267d36d0af](https://github.com/facebook/react-native/commit/267d36d0afb4b3713df9b679c2019c44ac6bcc3f) by [@danilobuerger](https://github.com/danilobuerger)) +- Fix action sheet callback invoked more than once on iPad ([8935d6e697](https://github.com/facebook/react-native/commit/8935d6e697dffb0971f5a8ee1dfbc580080de3e0) by [@janicduplessis](https://github.com/janicduplessis)) +- Resolve border platform color based on current trait collection ([9a35818797](https://github.com/facebook/react-native/commit/9a3581879764f3f1b2743905e3e54611e96bb618) by [@danilobuerger](https://github.com/danilobuerger)) +- Enable custom sound for local push notifications. ([eb19499484](https://github.com/facebook/react-native/commit/eb1949948406195c4c02c6041d07cba074ae820c)) +- Invoke registerForRemoteNotifications on main UI thread. ([3633a05299](https://github.com/facebook/react-native/commit/3633a05299d99b12acc5c3c056b977463df1924e)) +- Bump flipper pods to get arm64 catalyst slice ([f811da7cc2](https://github.com/facebook/react-native/commit/f811da7cc20cc49ca5c8d4e023d6c61e36e15dd1) by [@fortmarek](https://github.com/fortmarek)) +- Fix `pod install --project-directory=ios` failing when Hermes is enabled ([1b22e8a039](https://github.com/facebook/react-native/commit/1b22e8a039081887ffd450596d822bff975d6900), ([eb7cc85a91](https://github.com/facebook/react-native/commit/eb7cc85a9146d058694247178f03d57cc125c97a) by [@tido64](https://github.com/tido64)) +- Fix compilation warning in yoga ([52d8a797e7](https://github.com/facebook/react-native/commit/52d8a797e7a6be3fa472f323ceca4814a28ef596) by [@cuva](https://github.com/cuva)) +- Prevent deadlock when dispatching events from observers on the same thread. ([68fd1e5508](https://github.com/facebook/react-native/commit/68fd1e55085e871a854563721ee29ca698239607) by [@Pickleboyonline](https://github.com/Pickleboyonline)) +- In RCTSurfaceHostingComponent, access ckComponent from main queue to pass assertion ([1874c81003](https://github.com/facebook/react-native/commit/1874c81003b468554c227541fec5e29c4adfb82f) by [@p-sun](https://github.com/p-sun)) +- Fix modal redbox for onDismiss ([46f68aceb2](https://github.com/facebook/react-native/commit/46f68aceb20a10c95c92b5ffeb90f289b015a559) by [@HeyImChris](https://github.com/HeyImChris)) +- Attempt to fix crash during app termination ([9cd43340a7](https://github.com/facebook/react-native/commit/9cd43340a7e2443564c2ff5e8e85d37f6e1e47ef) by [@sammy-SC](https://github.com/sammy-SC)) + +### Security + +- Encode URL params in URLSearchParams.toString() ([1042a8012f](https://github.com/facebook/react-native/commit/1042a8012fb472bd5c882b469fe507dd6279d562) by [@sshic](https://github.com/sshic)) + +## v0.68.7 + +### Fixed + +- Use logical operator instead of bit operation in Yoga ([c3ad8](https://github.com/facebook/react-native/commit/c3ad8ec7eb01b7236e0081ac7c7f888630caac21) by [@cuva](https://github.com/cuva)) + +#### Android specific + +- Minimize EditText Spans 8/N: CustomStyleSpan ([b384bb613b](https://github.com/facebook/react-native/commit/b384bb613bf533aebf3271ba335c61946fcd3303) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize EditText Spans 6/N: letterSpacing ([5791cf1f7b](https://github.com/facebook/react-native/commit/5791cf1f7b43aed1d98cad7bcc272d97ab659111) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 5/N: Strikethrough and Underline ([0869ea29db](https://github.com/facebook/react-native/commit/0869ea29db6a4ca20b9043d592a2233ae1a0e7a2) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 4/N: ReactForegroundColorSpan ([8c9c8ba5ad](https://github.com/facebook/react-native/commit/8c9c8ba5adb59f7f891a5307a0bce7200dd3ac7d) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 3/N: ReactBackgroundColorSpan ([cc0ba57ea4](https://github.com/facebook/react-native/commit/cc0ba57ea42d876155b2fd7d9ee78604ff8aa57a) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 1/N: Fix precedence ([1743dd7ab4](https://github.com/facebook/react-native/commit/1743dd7ab40998c4d3491e3b2c56c531daf5dc47) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix measurement of uncontrolled TextInput after edit ([8a0fe30591](https://github.com/facebook/react-native/commit/8a0fe30591e21b90a3481c1ef3eeadd4b592f3ed) by [@NickGerleman](https://github.com/NickGerleman)) + +## v0.68.6 + +### Fixed + +#### Android specific + +- Mitigation for Samsung TextInput Hangs ([be69c8b5a7](https://github.com/facebook/react-native/commit/be69c8b5a77ae60cced1b2af64e48b90d9955be5) by [@NickGerleman](https://github.com/NickGerleman)) + +## v0.68.5 + +### Fixed + +- Force dependencies resolution to minor series for 0.68 ([edcb3ca996](https://github.com/facebook/react-native/commit/edcb3ca996fb3296762af300a36c1d46356f1b24) by [@Titozzz](https://github.com/Titozzz)) + +## v0.68.4 + +### Changed + +- Bump version of `promise` from 8.0.3 to 8.2.0, enabling `Promise.allSettled` ([951538c080](https://github.com/facebook/react-native/commit/951538c080ef745da304fb308fa91d597e0dd98a) by [@retyui](https://github.com/retyui)) +- Bump react-native-codegen to 0.0.18 ([40a3ae3613](https://github.com/facebook/react-native/commit/40a3ae3613394fe5f0d728bada538d2d5b78a8a4) by [@dmytrorykun](https://github.com/dmytrorykun)) + +#### Android specific + +- Correctly resolve classes with FindClass(..) ([361b310bcc](https://github.com/facebook/react-native/commit/361b310bcc8dddbff42cf63495649291c894d661) by [@evancharlton](https://github.com/evancharlton)) + +### Fixed + +- Codegen should ignore `.d.ts` files ([0f0d52067c](https://github.com/facebook/react-native/commit/0f0d52067cb89fdb39a99021f0745282ce087fc2) by [@tido64](https://github.com/tido64)) + +#### iOS specific + +- Fix the way the orientation events are published ([7d42106d4c](https://github.com/facebook/react-native/commit/7d42106d4ce20c644bda4d928fb0abc163580cee) by [lbaldy](https://github.com/lbaldy)) + +## v0.68.3 + +### Changed + +#### Android specific + +- Let's not build reactnativeutilsjni shared library ([af9225ec5f](https://github.com/facebook/react-native/commit/af9225ec5fd22da802e3da4d786fa7f6ec956b0f) by [@SparshaSaha](https://github.com/SparshaSaha)) +- Modified **getDefaultJSExecutorFactory** method ([87cfd386cb](https://github.com/facebook/react-native/commit/87cfd386cb2e02bfa440c94706d9d0274f83070c) by [@KunalFarmah98](https://github.com/KunalFarmah98)) + +### Fixed + +- Use monotonic clock for performance.now() ([114d31feee](https://github.com/facebook/react-native/commit/114d31feeeb47f5a57419e5088c3cbe9340f757a)) + +#### Android specific + +- Logging a soft error when ReactRootView has an id other than -1 instead of crashing the app in hybrid apps ([1ca2c24930](https://github.com/facebook/react-native/commit/1ca2c2493027c1b027146cd41e17dd8a4fc33a41) by [@Kunal-Airtel2022](https://github.com/Kunal-Airtel2022)) + +## v0.68.2 + +### Changed + +- Bump used version of react-native-codegen to 0.0.17 ([dfda480a98](https://github.com/facebook/react-native/commit/dfda480a9888d95c542cea40f25e8e783565c1db) by [@cortinico](https://github.com/cortinico)) +- Bump react-native-codegen to 0.0.17 ([a5ddc2e165](https://github.com/facebook/react-native/commit/a5ddc2e16523ea336ffbecf7acfd4820469a29e7) by [@cortinico](https://github.com/cortinico)) + +### Fixed + +#### Android specific + +- Working around Long paths limitation on Windows ([62ef6f5fa1](https://github.com/facebook/react-native/commit/62ef6f5fa1ecb918bde130a6024b65afcd34c7e3) by [@mganandraj](https://github.com/mganandraj)) + +## v0.68.1 + +### Changed + +#### Android specific + +- Bump React Native Gradle plugin to 0.0.6 ([9573d7b84d](https://github.com/facebook/react-native/commit/9573d7b84d35233fbb39a4067cfef65490aa34a7) by [@cortinico](https://github.com/cortinico)) +- Don't require yarn for codegen tasks ([d5da70e17e](https://github.com/facebook/react-native/commit/d5da70e17e8c8210cd79a4d7b09c6a5ded4b5607) by [@danilobuerger](https://github.com/danilobuerger)) + +### Fixed + +- Fix dynamic_cast (RTTI) by adding key function to ShadowNodeWrapper and related classes ([58a2eb7f37](https://github.com/facebook/react-native/commit/58a2eb7f37c2dc27ad3575618778ad5b23599b27) by [@kmagiera](https://github.com/kmagiera)) +- Pin use-subscription to < 1.6.0 ([5534634892](https://github.com/facebook/react-native/commit/5534634892f47a3890e58b661faa2260373acb25) by [@danilobuerger](https://github.com/danilobuerger)) + +#### Android specific + +- Use NDK 23 only for Windows users. ([e48a580080](https://github.com/facebook/react-native/commit/e48a580080bdae58b375f30fbcf8a83cc1915b2f) by [@cortinico](https://github.com/cortinico)) +- Improve support for Android users on M1 machine ([4befd2a29c](https://github.com/facebook/react-native/commit/4befd2a29cb94b026d9c048a041aa9f1817295b5) by [@cortinico](https://github.com/cortinico)) +- Template: Specify abiFilters if enableSeparateBuildPerCPUArchitecture is not set. ([5dff920177](https://github.com/facebook/react-native/commit/5dff920177220ae5f4e37c662c63c27ebf696c83) by [@cortinico](https://github.com/cortinico)) +- Fix for building new architecture sources on Windows ([5a8033df98](https://github.com/facebook/react-native/commit/5a8033df98296c941b0a57e49f2349e252339bf9) by [@mganandraj](https://github.com/mganandraj)) + +## v0.68.0 + +### Breaking Changes + +- CI moved to Node 16. ([f1488db109](https://github.com/facebook/react-native/commit/f1488db109d13e748b071c02b40e90cdca1cc79d) by [@kelset](https://github.com/kelset)). + This change enforces Node >= 14 for React Native builds. +- Bump Android Gradle Plugin to 7.0.1. ([272cfe5d13](https://github.com/facebook/react-native/commit/272cfe5d1371c38a281cf3883ff0254a8d3505a3) by [@dulmandakh](https://github.com/dulmandakh)) + This version of Android Gradle plugin enforces JDK 11 for Android builds. Do not upgrade to AGP 7.1 as it is not supported by this version of react-native. +- Removed `fallbackResource` from `RCTBundleURLProvider` API ([0912ee179c](https://github.com/facebook/react-native/commit/0912ee179c210fb6b2ed9afbb3f2fbc5fb8a2bb3)) by [@philIip](https://github.com/philIip) + +### New Architecture + +*If you are interested in enabling the new architecture, please refer to [the dedicated documentation](https://reactnative.dev/docs/next/new-architecture-intro).* + +- Do not include Facebook license on users codegen'd code ([450967938a](https://github.com/facebook/react-native/commit/450967938ab25c4dabb9d5ecd9f7b57afb1c78dd) by [@cortinico](https://github.com/cortinico)) + +#### Android specific + +- Setup a `newArchEnabled` property to Opt-in the New Architecture in the template ([8d652fba4c](https://github.com/facebook/react-native/commit/8d652fba4ce07256784a1b7e86713c810336856d) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- Add fabric option to the default app template. ([2e9a376c84](https://github.com/facebook/react-native/commit/2e9a376c8488d1fb11c0b5d604137712321fd90d) by [@sota000](https://github.com/sota000)) +- Add turbo module support in the default app template. ([8ec0e6919c](https://github.com/facebook/react-native/commit/8ec0e6919c5fab118c8b54538860ee36009bfaa7) by [@sota000](https://github.com/sota000)) +- Rename the new architecture flag to RCT_NEW_ARCH_ENABLED. ([c0c5439959e](https://github.com/facebook/react-native/commit/c0c5439959e21d7806178bb9139c2cd19b857506) by [@sota000](https://github.com/sota000)) + +### Added + +- Create @fb-tools-support/yarn package ([7db294d6d5](https://github.com/facebook/react-native/commit/7db294d6d5b00a38f305dd52be3e0961f35695c8) by [@motiz88](https://github.com/motiz88)) +- Support string color values in Animated.Color ([d3a0c4129d](https://github.com/facebook/react-native/commit/d3a0c4129d6a5a7beced4e9aa62b2da4e3f4fed4)) +- New Animated.Color node ([ea90a76efe](https://github.com/facebook/react-native/commit/ea90a76efef60df0f46d29228289f8fc1d26f350)) +- Added linter warning config for unstable nested components ([988fefc44d](https://github.com/facebook/react-native/commit/988fefc44d39957e8c5e1eecb02dfd1ce119f34c) by [@javache](https://github.com/javache)) +- Option to supply `platformConfig` to NativeAnimated ([4a227ce2ab](https://github.com/facebook/react-native/commit/4a227ce2ab3f8c181150461ab28b831979093db0) by [@rozele](https://github.com/rozele)) +- Animated.event can be used to extract values with numeric keys from native events ([b2105711a0](https://github.com/facebook/react-native/commit/b2105711a0b90859f8e3fc1aaec4998e252c2d14) by [@javache](https://github.com/javache)) +- Adds a setSelection imperative method to TextInput ([771ca921b5](https://github.com/facebook/react-native/commit/771ca921b59cc3b3fd12c8fe3b08ed150bcf7a04) by [@lyahdav](https://github.com/lyahdav)) +- Native-only prop to optimize text hit testing on some RN platforms ([f3bf2e4f51](https://github.com/facebook/react-native/commit/f3bf2e4f51897f1bb71e37002c288ebf3b23cf78) by [@rozele](https://github.com/rozele)) + +#### Android specific + +- Added DoNotStripAny proguard rules ([48318b1542](https://github.com/facebook/react-native/commit/48318b1542910b939ab977c0bc82e98f098abe50) by [@ShikaSD](https://github.com/ShikaSD)) +- Add new API in ScrollView and HorizontalScrollView to process pointerEvents prop. ([48f6967ae8](https://github.com/facebook/react-native/commit/48f6967ae88100110160e1faf03e6c0d37e404bd) by [@ryancat](https://github.com/ryancat)) +- Add `accessibilityLabelledBy` props ([36037fa81b](https://github.com/facebook/react-native/commit/36037fa81bbdcc460057e7e7cf608cd364ca48a6) by [@grgr-dkrk](https://github.com/grgr-dkrk)) +- Added missing constructor to WritableNativeArray ([c68c47d2ba](https://github.com/facebook/react-native/commit/c68c47d2bafa8e8e25b534d6cdd1a63bc77a1cf4) by [@piaskowyk](https://github.com/piaskowyk)) +- Add new API for custom fling animator to provide predicted travel distance for its fling animation. ([fe6277a30d](https://github.com/facebook/react-native/commit/fe6277a30d3ec19e4772991e30ae20c3a9cfe565) by [@ryancat](https://github.com/ryancat)) +- Adding new API `onChildEndedNativeGesture` to the RootView interface to let its implementations notify the JS side that a child gesture is ended. ([9b33c31ee0](https://github.com/facebook/react-native/commit/9b33c31ee024bae30e441107f838e1b5044525ba) by [@ryancat](https://github.com/ryancat)) +- Make the `reactNativeArchitectures` property more discoverable ([0f39a1076d](https://github.com/facebook/react-native/commit/0f39a1076dc154995a2db79352adc36452f46210) by [@cortinico](https://github.com/cortinico)) +- Added `isAccessibilityServiceEnabled` to get if accessibility services are enabled ([c8b83d4e0b](https://github.com/facebook/react-native/commit/c8b83d4e0b33c2af45093f7b2262ee578ece2faf) by [@grgr-dkrk](https://github.com/grgr-dkrk)) +- Add bundleForVariant option ([d2c10da5d5](https://github.com/facebook/react-native/commit/d2c10da5d5687833545691f281473381e4466c2e) by [@grit96](https://github.com/grit96)) +- Add ACCEPT_HANDOVER, ACTIVITY_RECOGNITION, ANSWER_PHONE_CALLS, READ_PHONE_NUMBERS & UWB_RANGING to PermissionsAndroid ([4b25a0aaa0](https://github.com/facebook/react-native/commit/4b25a0aaa077caf9c437bcfeef8a226eda5a102e) by [@iBotPeaches](https://github.com/iBotPeaches)) + +#### iOS specific + +- Add new argument to announceForAccessibility to allow queueing on iOS ([4d1357918a](https://github.com/facebook/react-native/commit/4d1357918a4dcb331ccea2140699f487ca45ea30) by [@peterc1731](https://github.com/peterc1731)) +- Add volta support to find-node.sh ([765844055b](https://github.com/facebook/react-native/commit/765844055ba0d02262a11114bad5da67e935d8df) by [@liamjones](https://github.com/liamjones)) +- Support fnm when detecting node binary ([c9e4d34885](https://github.com/facebook/react-native/commit/c9e4d3488578d65e55198ad597252a2ac8cc5f73) by [@MoOx](https://github.com/MoOx)) +- Find-node.sh now respects .nvmrc ([35bcf934b1](https://github.com/facebook/react-native/commit/35bcf934b186e581d100d43e563044300759557f) by [@igrayson](https://github.com/igrayson)) +- Add macros to be able to stub C functions in tests ([749a9207b6](https://github.com/facebook/react-native/commit/749a9207b6f0545c03ca83efbda7971ffd4d2d57) by [@philIip](https://github.com/philIip)) + + +### Changed + +- Bump RN CLI to v7.0.3, and Metro to 67 ([848ba6fb1d](https://github.com/facebook/react-native/commit/848ba6fb1db81bbb44efd373af9e81f31f227aef) by [@kelset](https://github.com/kelset)) and ([df2e934a69](https://github.com/facebook/react-native/commit/df2e934a697b5b207053db3bbcf71492932a6062) by [@kelset](https://github.com/kelset)) +- Upgraded react-devtools-core dependency to 4.23.0 ([1cc217d5ef](https://github.com/facebook/react-native/commit/1cc217d5effdbee4cf2f64063a443ecb331673d4) by [@bvaughn](https://github.com/bvaughn)) +- Bump Flipper to 0.125.0 ([50057158ca](https://github.com/facebook/react-native/commit/50057158ca32842d70160541e3cb5d4bd512f8f5) by [@cortinico](https://github.com/cortinico)) +- Export Flow type for deceleration rate for use in other files to keep deceleration rate prop values consistently typed ([9b0ed920ef](https://github.com/facebook/react-native/commit/9b0ed920ef087c4c18504adacf9d4f557812cf1b)) +- Upgrade deprecated-react-native-prop-types dependency ([badd30885f](https://github.com/facebook/react-native/commit/badd30885fb999124b6b54b3fb016edbd988c16b) by [@chiaramooney](https://github.com/chiaramooney)) +- Improved error message in react.gradle ([7366a866b3](https://github.com/facebook/react-native/commit/7366a866b381db6fc5615153e7788aa4828cfd96) by [@vonovak](https://github.com/vonovak)) +- Upgraded packages to the latest versions for ESLint v7. ([cf763cdf81](https://github.com/facebook/react-native/commit/cf763cdf816e1cad20caf2347c54bc96c7f6dd47) by [@yungsters](https://github.com/yungsters)) +- Updated the links for the discussions and changelog ([daf37a1fce](https://github.com/facebook/react-native/commit/daf37a1fce43403e6320e1e3023e86fd1b970bdf) by [@MikeyAlmighty](https://github.com/MikeyAlmighty)) +- XMLHttpRequest.getAllResponseHeaders() now returns headers with names lowercased and sorted in ascending order, as per specification ([b2415c4866](https://github.com/facebook/react-native/commit/b2415c48669391ee1ab7c6450748c4d91097a666) by [@ascherkus](https://github.com/ascherkus)) +- Bump react-native-codegen to 0.0.9 ([e3a71b019f](https://github.com/facebook/react-native/commit/e3a71b019fa78e2b4b3454ccc59ea9c8cc543b29) by [@cortinico](https://github.com/cortinico)) +- Accessing `Image.propTypes`, `Text.propTypes`, `TextInput.propTypes`, `ColorPropType`, `EdgeInsetsPropType`, `PointPropType`, or `ViewPropTypes` now emits a deprecation warning. ([3f629049ba](https://github.com/facebook/react-native/commit/3f629049ba9773793978cf9093c7a71af15e3e8d) by [@yungsters](https://github.com/yungsters)) +- Bump `core-workflow-apply-version-label` version ([e973b3afc2](https://github.com/facebook/react-native/commit/e973b3afc274f892a0e5a6fdea9004dc5d84eb2b) by [@lucasbento](https://github.com/lucasbento)) +- Add `vendor/bundle` into .gitignore template ([2f67f5d68b](https://github.com/facebook/react-native/commit/2f67f5d68b17010c49f2996a788fe68c1fe2e9f6) by [@MoOx](https://github.com/MoOx)) + +#### Android specific + +- Add allowsEdgeAntialiasing on views with rotations or skew transforms ([e6a3410afe](https://github.com/facebook/react-native/commit/e6a3410afe7d9a4cecf3db0a95503d2ff05bb862)) +- Bump Kotlin version to 1.6.10 ([d0f0234656](https://github.com/facebook/react-native/commit/d0f0234656dc981b422d1e9aa0885afd5fd29879) by [@AKB48](https://github.com/AKB48)) +- Bump Soloader to 0.10.3 ([f45889ef95](https://github.com/facebook/react-native/commit/f45889ef95ec694520e91b0032e591a087e088e5) by [@osartun](https://github.com/osartun)) +- Bump Gradle to 7.3 ([c180627ac7](https://github.com/facebook/react-native/commit/c180627ac7e5e155707b3c9433c4582839e1820e) by [@dulmandakh](https://github.com/dulmandakh)) +- Bump Android compile and target SDK to 31 ([00ac034353](https://github.com/facebook/react-native/commit/00ac034353cbc867991bf79cb1dd103353f47126) by [@ShikaSD](https://github.com/ShikaSD)) +- Use side-by-side NDK for Android ([bd7caa64f5](https://github.com/facebook/react-native/commit/bd7caa64f5d6ee5ea9484e92c3629c9ce711f73c) by [@cortinico](https://github.com/cortinico)) +- Leverage Gradle implicit dependency substitution for Gradle Plugin ([0fccbd53af](https://github.com/facebook/react-native/commit/0fccbd53af86083a8742a33282dc183d07eb27a2) by [@cortinico](https://github.com/cortinico)) +- Remove unused import of JMessageQueueThread.h ([705236e363](https://github.com/facebook/react-native/commit/705236e3637e4f80e5fa4bd7234df9f1e14a5d3d) by [@sshic](https://github.com/sshic)) +- Made `MessageQueueThread#runOnQueue` return a boolean. Made `MessageQueueThreadImpl#runOnQueue` return false when the runnable is not submitted. ([89faf0c9a8](https://github.com/facebook/react-native/commit/89faf0c9a87f6de68ca416d10566dbcbe80d9450)) +- Assume *.ktx assets are packaged as Android drawables ([cb610ddca7](https://github.com/facebook/react-native/commit/cb610ddca79fe29b88568545ab011671fc392c9a) by [@motiz88](https://github.com/motiz88)) +- Add ViewConfigs to support onEnter/onExit/onMove events ([44143b50fd](https://github.com/facebook/react-native/commit/44143b50fdcafe22caa43d76ec3210132ce3af21) by [@mdvacca](https://github.com/mdvacca)) +- Let react_native_assert really abort the app ([2ae06df58f](https://github.com/facebook/react-native/commit/2ae06df58f5f5eaf4386c14d28af25b643401bf3) by [@cortinico](https://github.com/cortinico)) +- Bugfix for multiple shadow threads rendered at the same time, small probability crash. ([9d71b166a6](https://github.com/facebook/react-native/commit/9d71b166a6c9d9afec7186c6a33aedc6975aa43c) by [@chenmo187](https://github.com/chenmo187)) +- RootView's onChildStartedNativeGesture now takes the child view as its first argument ([03e513de41](https://github.com/facebook/react-native/commit/03e513de41bf60f071eacbbb9604c83605abf625) by [@javache](https://github.com/javache)) +- Add ReactInstanceEventListenerV2 for migration ([ce74aa4ed3](https://github.com/facebook/react-native/commit/ce74aa4ed335d4c36ce722d47937b582045e05c4) by [@sshic](https://github.com/sshic)) +- Improved logic of findTargetPathAndCoordinatesForTouch ([dfe42d6b75](https://github.com/facebook/react-native/commit/dfe42d6b75005f519c0e2c87c75e7886dce3345c) by [@javache](https://github.com/javache)) +- Set a resolution strategy for com.facebook.react:react-native when on New Architecture ([e695bc0bb5](https://github.com/facebook/react-native/commit/e695bc0bb50fc1c712e9862ed8fe4e7cc6619fae) by [@cortinico](https://github.com/cortinico)) +- Make hermes-executor-common a static lib ([b2cf24f41c](https://github.com/facebook/react-native/commit/b2cf24f41cb5f15653b34d396ef2a1c90defdf43) by [@janicduplessis](https://github.com/janicduplessis)) +- Static link for hermes-inspector ([20b0eba581](https://github.com/facebook/react-native/commit/20b0eba581a00e5e7e300f6377379b836617c147) by [@janicduplessis](https://github.com/janicduplessis)) + +#### iOS specific + +- Don't capitalize the first letter of a word that is starting by a number ([8b5a5d4645](https://github.com/facebook/react-native/commit/8b5a5d4645136ef3d6ee043348e583cbbac87ee3) by [@MaeIg](https://github.com/MaeIg)) +- updated `jsBundleURLForBundleRoot:fallbackResource` to `jsBundleURLForBundleRoot:` ([aef843bfe6](https://github.com/facebook/react-native/commit/aef843bfe60bda6bcc98d3fb4a6c295c9f4b66e3) by [@philIip](https://github.com/philIip)) +- Remove iOS 11 availability check ([9b059b6709](https://github.com/facebook/react-native/commit/9b059b67092f4e7d568867a2b3a51dfd7c6f1db6) by [@ken0nek](https://github.com/ken0nek)) +- Refactor: Assign string label to each case in RCTPLTag enum for startup performance logging ([60e60a9b3d](https://github.com/facebook/react-native/commit/60e60a9b3d42d342eaf5ddee4841b121f6474a6c) by [@p-sun](https://github.com/p-sun)) +- IOS Ruby Updates ([1e6add1a43](https://github.com/facebook/react-native/commit/1e6add1a43355bb88c57400a7420a656966bef97) by [@barbieri](https://github.com/barbieri)) +- Update Flipper pods to support re-enable macCatalyst ([2a5265dff7](https://github.com/facebook/react-native/commit/2a5265dff7e654f57b43335804840692313f2a56) by [@mikehardy](https://github.com/mikehardy)) +- Apple Silicon builds of glog & Flipper-Glog ([274c617f5b](https://github.com/facebook/react-native/commit/274c617f5bda263ff29115b3dcc013e47085a78d) by [@rayzr522](https://github.com/rayzr522)) + +### Fixed + +- Fix error "mockModal is not a function" ([507b05f4c0](https://github.com/facebook/react-native/commit/507b05f4c02b46109f483a2b79c924a775fd7bd3) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) +- Fixes execution of animation when a toValue of AnimatedValue is used. ([8858c21124](https://github.com/facebook/react-native/commit/8858c2112421be5212c024f9e404e66437a41389)) +- Fix RN version syntax to match new nightly build structure. ([3d1d4ee457](https://github.com/facebook/react-native/commit/3d1d4ee4572600425b8eb5d0d6512bb0d2a6ea44) by [@chiaramooney](https://github.com/chiaramooney)) +- Fix typo in _updateBottomIfNecessary function on KeyboardAvoidingView component ([0cc80b4d0c](https://github.com/facebook/react-native/commit/0cc80b4d0cb78a835977dbe5100262a16882bbea) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Fix: Removes interface only check from third party components GenerateThirdPartyFabricComponentsProvider ([3e6902244a](https://github.com/facebook/react-native/commit/3e6902244a0d189261dbbe327296db1349e37410) by [@Ubax](https://github.com/Ubax)) +- Set CxxModules' Instance before retrieving their Method vector. ([1d45b20b6c](https://github.com/facebook/react-native/commit/1d45b20b6c6ba66df0485cdb9be36463d96cf182) by [@JunielKatarn](https://github.com/JunielKatarn)) +- AnimatedValue.__detach should store getValue result with offset deducted ([fe53cae954](https://github.com/facebook/react-native/commit/fe53cae954b37528eeaa1258ac0060c4298473bb) by [@rozele](https://github.com/rozele)) +- AnimatedValue.stopAnimation callback with correct value for NativeAnimated ([8ba771c3dd](https://github.com/facebook/react-native/commit/8ba771c3ddc00b1499e95a2812b4cd5ac904c8df) by [@rozele](https://github.com/rozele)) +- ESLint no-undef rule clashing with TypeScript compiler for TS files ([ae67c5ac45](https://github.com/facebook/react-native/commit/ae67c5ac45a8044fc1db66aee8eae6e881d660e4) by [@fiznool](https://github.com/fiznool)) +- ESLint `no-shadow` rule returning false positive for TypeScript enums ([722a0ff6f8](https://github.com/facebook/react-native/commit/722a0ff6f88bed4d54579a2b8bc574e87948187f) by [@fiznool](https://github.com/fiznool)) +- Fix support for custom port ([b399c2e3d1](https://github.com/facebook/react-native/commit/b399c2e3d10fa521dbec87243d3e96f6bca7df1e) by [@enniel](https://github.com/enniel)) +- `onLayout` prop is handled correctly in `` ([9c5e177a79](https://github.com/facebook/react-native/commit/9c5e177a79c64c77f281ce727538973e8222e975)) +- Modal accepts a testID but didn't forward it to RCTModalHostView, therefore not making it show up for e2e tests depending on viewhierarchy. ([5050e7eaa1](https://github.com/facebook/react-native/commit/5050e7eaa17cb417baf7c20eb5c4406cce6790a5) by [@GijsWeterings](https://github.com/GijsWeterings)) +- Remove unused and incorrect type declarations in WebSocketInterceptor ([91728e2266](https://github.com/facebook/react-native/commit/91728e2266375b954302ba0cd4b5daf641aefc23) by [@mischnic](https://github.com/mischnic)) +- Complete missing Flow declarations in URL ([98abf1b02f](https://github.com/facebook/react-native/commit/98abf1b02f64ad40d523335e677a2ede15b3650d) by [@mischnic](https://github.com/mischnic)) +- Pressable not passing hover props and event handlers to PressabilityConfig ([1b30dd074b](https://github.com/facebook/react-native/commit/1b30dd074b579c2ae138a1111d07ddb56761315d) by [@Saadnajmi](https://github.com/Saadnajmi)) +- Composite animations will now be ran immediately when the app is in testing mode ([b03e824c52](https://github.com/facebook/react-native/commit/b03e824c52123219a5c8fbd89473391bf0bc31c8) by [@javache](https://github.com/javache)) +- Remove duplicate class members ([c0e489b729](https://github.com/facebook/react-native/commit/c0e489b7293f15858cb706f1b8587600e429af28) by [@bradzacher](https://github.com/bradzacher)) +- Fix: Use same implementation for `performance.now()` on iOS and Android ([1721efb54f](https://github.com/facebook/react-native/commit/1721efb54ff9cc4f577b5ae27f13fcf56801a92c) by [@mrousavy](https://github.com/mrousavy)) + +#### Android specific + +- Enable cliPath to have an absolute path value ([5d560ca99f](https://github.com/facebook/react-native/commit/5d560ca99ff7220de11d2d76dbe77d73990894a8) by [@Krisztiaan](https://github.com/Krisztiaan)) +- Make sure configureNdkBuild* tasks are depending on preBuild ([2fdbf6a10f](https://github.com/facebook/react-native/commit/2fdbf6a10fe67fa3209a51a1105a97c16991f561) by [@cortinico](https://github.com/cortinico)) +- Added a null check to native.value in Switch to fix https://github.com/facebook/react-native/issues/32594 ([8d50bf1133](https://github.com/facebook/react-native/commit/8d50bf113352a6ccdf74c979e1022c6c2ccf6e56) by [@jonathanmos](https://github.com/jonathanmos)) +- Fix overflowInset calculation by using transform values ([8aa87814f6](https://github.com/facebook/react-native/commit/8aa87814f62e42741ebb01994796625473c1310f) by [@ryancat](https://github.com/ryancat)) +- Add missing sources jar into published android artifacts ([384e1a0c7b](https://github.com/facebook/react-native/commit/384e1a0c7bc50d2aab5b59bcedcea5a3e98f1659) by [@Kudo](https://github.com/Kudo)) +- Fix math for detecting if children views are in parent's overflowInset area. ([45244ebce2](https://github.com/facebook/react-native/commit/45244ebce228dfbc3412670e64c11491ba8d8c47) by [@ryancat](https://github.com/ryancat)) +- Fixed empty screen after retrying a BundleDownloader failure in dev mode ([c8d823b9bd](https://github.com/facebook/react-native/commit/c8d823b9bd9619dfa1f5851af003cc24ba2e8830) by [@samkline](https://github.com/samkline)) +- Fix crash from ScrollView that occurs while reporting an error from JS ([2151d11527](https://github.com/facebook/react-native/commit/2151d1152719a230565165f1a8dcfab172689eb3) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Enable hitSlop to be set using a single number. ([589b129581](https://github.com/facebook/react-native/commit/589b129581903a737a64e14eab3f2e29620831d5) by [@javache](https://github.com/javache)) +- Fix fling and snap with recycler viewgroup where fling to the end of scrollable distance when it goes over current rendered children views. ([ead7b97944](https://github.com/facebook/react-native/commit/ead7b97944522e3066ceb2bd50c63c268c961277) by [@ryancat](https://github.com/ryancat)) +- Fixed edge case for quick small scrolls causing unexpected scrolling behaviors. ([f70018b375](https://github.com/facebook/react-native/commit/f70018b37532622f08f20b2c51cdbfca55d730ea) by [@ryancat](https://github.com/ryancat)) +- Fix crash on ReactEditText with AppCompat 1.4.0 ([e21f8ec349](https://github.com/facebook/react-native/commit/e21f8ec34984551f87a306672160cc88e67e4793) by [@cortinico](https://github.com/cortinico)) +- Do not .lowerCase the library name when codegenerating TurboModule Specs ([28aeb7b865](https://github.com/facebook/react-native/commit/28aeb7b8659b38ee3a27fae213c4d0800f4d7e31) by [@cortinico](https://github.com/cortinico)) +- Enable hitSlop to be set using a single number. ([a96bdb7154](https://github.com/facebook/react-native/commit/a96bdb7154b0d8c7f43977d8a583e8d2cbdcb795) by [@javache](https://github.com/javache)) +- Updated TextInput prop types to accomodate for new autoComplete values ([9eb0881c8f](https://github.com/facebook/react-native/commit/9eb0881c8fecd0e974b1cb9f479bad3075854340) by [@TheWirv](https://github.com/TheWirv)) +- Don't reconstruct app components https://github.com/facebook/react-native/issues/25040 ([fc962c9b6c](https://github.com/facebook/react-native/commit/fc962c9b6c4bf9f88decbe014ab9a9d5c1cf51bc) by [@Somena1](https://github.com/Somena1)) +- Do NOT skip the first child view in the scroll view group when measuring the lower and upper bounds for snapping. ([61e1b6f86c](https://github.com/facebook/react-native/commit/61e1b6f86cf98d8a74eeb9353143fe0c624fe6e6) by [@ryancat](https://github.com/ryancat)) +- Fix crash when a Switch is initialised with both backgroundColor and thumbColor. ([456cf3db14](https://github.com/facebook/react-native/commit/456cf3db14c443c483d63aa97c88b45ffd25799b) by [@smarki](https://github.com/smarki)) +- Fix devDisabledIn not working with multiple productFlavors ([055ea9c7b7](https://github.com/facebook/react-native/commit/055ea9c7b7dea030ef16da72d1f6ecb5d95ac468) by [@grit96](https://github.com/grit96)) +- Revert `ReactScrollView` to use `Context` instead of `ReactContext` in the constructor to be less restrictive. ([7b77cc637e](https://github.com/facebook/react-native/commit/7b77cc637e1faf4a2b134853f8415f277d0decdc) by [@ryancat](https://github.com/ryancat)) +- Fix onPress event for nested Text in RN Android ([e494e4beb6](https://github.com/facebook/react-native/commit/e494e4beb6a124008fd116178cbc38335bd87809) by [@mdvacca](https://github.com/mdvacca)) +- Fix enableVmCleanup not working for apps with product flavors ([a2b5e4cd82](https://github.com/facebook/react-native/commit/a2b5e4cd825a358419cef1e3823b72215b689686) by [@cortinico](https://github.com/cortinico)) +- Prevent NPE on ThemedReactContext ([f1b5fe1d3e](https://github.com/facebook/react-native/commit/f1b5fe1d3ea49294d8c89accfa27d76a1a97ccea) by [@sshic](https://github.com/sshic)) +- fix: jvm 11 error message from ReactPlugin.kt and react.gradle ([4e947ecb2d](https://github.com/facebook/react-native/commit/4e947ecb2dabfa0226af7f859c828847b4d891c0) by [@nomi9995](https://github.com/nomi9995)) + +#### iOS specific + +- ScrollView: Respect `contentInset` when animating new items with `autoscrollToTopThreshold`, make `automaticallyAdjustKeyboardInsets` work with `autoscrollToTopThreshold` (includes vertical, vertical-inverted, horizontal and horizontal-inverted ScrollViews) ([49a1460a37](https://github.com/facebook/react-native/commit/49a1460a379e3a71358fb38888477ce6ea17e81a) by [@mrousavy](https://github.com/mrousavy)) +- Prevent RCTConvert error for allowed null blob types ([e1b698c5f2](https://github.com/facebook/react-native/commit/e1b698c5f2b1d689fb3940f8c6a3e298d381ea3a) by [@habovh](https://github.com/habovh)) +- Migrate ScreenshotManager from NativeModule to TurboModule ([b13e41d98e](https://github.com/facebook/react-native/commit/b13e41d98e818279d1941f3425707d3c0ce407fc) by [@p-sun](https://github.com/p-sun)) +- Fix usage of cocoapods with --project-directory flag and new arch ([9e7d91f2fc](https://github.com/facebook/react-native/commit/9e7d91f2fc4d576b8fba81304a24e50134da93d6) by [@danilobuerger](https://github.com/danilobuerger)) +- Post RCTContentDidAppearNotification with new arch ([75105e692c](https://github.com/facebook/react-native/commit/75105e692c2be9bd192089a6a6ffde7572ee1ce1) by [@danilobuerger](https://github.com/danilobuerger)) +- Remove absolute paths from pods project ([42b01a32a1](https://github.com/facebook/react-native/commit/42b01a32a137f18ae9fd2f00914f2edb0e107421) by [@danilobuerger](https://github.com/danilobuerger)) +- Respect RCTSetDefaultFontHandler chosen font ([89efa1a0c1](https://github.com/facebook/react-native/commit/89efa1a0c1b633bf9edee66583800ad3fc54ce63) by [@danilobuerger](https://github.com/danilobuerger)) +- Fixed duplicated UUIDs problem during pod install phase. ([f595a4e681](https://github.com/facebook/react-native/commit/f595a4e681e75aaf737b6582f69855d76a1f33dd)) +- Fix `Time.h` patch not being applied when running `pod install --project-directory=ios` ([60cef850bd](https://github.com/facebook/react-native/commit/60cef850bd3fd12c32ee1196bd19a559592d1465) by [@tido64](https://github.com/tido64)) +- Fix WebSocket control frames having payloads longer than 125 bytes ([86db62b7a8](https://github.com/facebook/react-native/commit/86db62b7a8b28ac82dd0a0627a8b6c351875f682) by [@asmeikal](https://github.com/asmeikal)) +- Stop RedBox from appearing for LogBox handled errors ([9d2df5b8ae](https://github.com/facebook/react-native/commit/9d2df5b8ae95b3cfeae26f64bd1d50bd2b0bbae9) by [@liamjones](https://github.com/liamjones)) +- Enable hitSlop to be set using a single number. ([3addafa525](https://github.com/facebook/react-native/commit/3addafa5257ade685216900bebbad8c35e24e124) by [@javache](https://github.com/javache)) +- Fix `__apply_Xcode_12_5_M1_post_install_workaround` failing when one of the Pods has no IPHONEOS_DEPLOYMENT_TARGET set ([9cd4092336](https://github.com/facebook/react-native/commit/9cd40923362ff717a722f8f36c8250a29a5142b7) by [@Yonom](https://github.com/Yonom)) +- This is a quick speculative fix since we know `CFRunLoopPerformBlock` does not push/pop an autorelease pool. ([3fff164dfa](https://github.com/facebook/react-native/commit/3fff164dfa1c97f69b1701e974effc92a94152d6) by [@christophpurrer](https://github.com/christophpurrer)) +- Fixed RCTImageLoaderTests ([1542f83527](https://github.com/facebook/react-native/commit/1542f835273c08776b960929b5aa7cefbd225971) by [@philIip](https://github.com/philIip)) +- Fix Rosetta2 CocoaPods warning on Apple Silicon ([e918362be3](https://github.com/facebook/react-native/commit/e918362be3cb03ae9dee3b8d50a240c599f6723f) by [@oblador](https://github.com/oblador)) +- Fix `pod install --project-directory=ios` failing due to wrong path to `React-Codegen` ([ebb26cf2e4](https://github.com/facebook/react-native/commit/ebb26cf2e420616c8bf01a5148ca4f8419b238d3) by [@tido64](https://github.com/tido64)) + +### Deprecated + +#### Android specific + +- Gradle: Deprecate `reactRoot` in favor of `root` and `reactNativeDir` ([8bc324fd34](https://github.com/facebook/react-native/commit/8bc324fd34337ab159e2e21e213a6c5b06c548da) by [@cortinico](https://github.com/cortinico)) + + +### Removed + +- DeprecatedPropTypes (deep-link) modules removed from React Native. ([23717c6381](https://github.com/facebook/react-native/commit/23717c6381a41b1c5f189376bfa5bc73c7a4da87) by [@yungsters](https://github.com/yungsters)) +- `accessibilityStates` no longer passed through to RCTView. ([1121ed94ab](https://github.com/facebook/react-native/commit/1121ed94ab470be27207b0c8dbae5d19860c08da) by [@luism3861](https://github.com/luism3861)) + +#### iOS specific + +- Remove RCTUIManagerObserver from RCTNativeAnimatedTurboModule ([e9ed115bab](https://github.com/facebook/react-native/commit/e9ed115babbc82968380dae22fa928d4ce3cd6da) by [@p-sun](https://github.com/p-sun)) + +## v0.67.5 + +🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). + +### Fixed + +- Force dependencies resolution to minor series for 0.67 ([9f2acda1b8](https://github.com/facebook/react-native/commit/9f2acda1b807e790b3e7562ce3436b93bcc2ad09) by [@cortinico](https://github.com/cortinico)) + +## v0.67.4 + +### Fixed + +#### Android specific + +- Added a null check to native.value in Switch to fix https://github.com/facebook/react-native/issues/32594 ([8d50bf1133](https://github.com/facebook/react-native/commit/8d50bf113352a6ccdf74c979e1022c6c2ccf6e56) by [@jonathanmos](https://github.com/jonathanmos)) + +## v0.67.3 + +### Fixed + +#### Android specific + +- Text with adjustsFontSizeToFit changes the text layout infinitely ([c1db41f060](https://github.com/facebook/react-native/commit/c1db41f060908e6ab001aaace7c20c610056f59a)) + +#### iOS specific + +- Fix a broken input for the Korean alphabet in TextInput ([1a83dc36ce](https://github.com/facebook/react-native/commit/1a83dc36ce0af33ac7a3c311354fce4bfa5ba1a3) by [@bernard-kms](https://github.com/bernard-kms)) + +## v0.67.2 + +### Fixed + +- Fix error "mockModal is not a function" ([507b05f4c0](https://github.com/facebook/react-native/commit/507b05f4c02b46109f483a2b79c924a775fd7bd3) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) + +#### Android specific + +- Fix potential crash if ReactRootView does not have insets attached. ([6239e2f5ce](https://github.com/facebook/react-native/commit/6239e2f5ce82f7c2e683eb4699b9ce3ff1b58ac5) by [@enahum](https://github.com/enahum)) +- Upgrading OkHttp from 4.9.1 to 4.9.2 to fix CVE-2021-0341. ([e896d21](https://github.com/facebook/react-native/commit/e896d21ced3c0c917c2fc0044d2b93b44df9a081) by [@owjsub](https://github.com/owjsub)) + +#### iOS specific + +- Fix `Time.h` patch not being applied when running `pod install --project-directory=ios` ([60cef850bd](https://github.com/facebook/react-native/commit/60cef850bd3fd12c32ee1196bd19a559592d1465) by [@tido64](https://github.com/tido64)) +- Find-node.sh now respects .nvmrc ([35bcf934b1](https://github.com/facebook/react-native/commit/35bcf934b186e581d100d43e563044300759557f) by [@igrayson](https://github.com/igrayson)) + +## v0.67.1 + +### Fixed + +#### Android specific + +- Do not remove libjscexecutor.so from release builds ([574a773f8f](https://github.com/facebook/react-native/commit/574a773f8f55fe7808fbb672066be8174c64d76d) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- Remove alert's window when call to `hide`. ([a46a99e120](https://github.com/facebook/react-native/commit/a46a99e12039c2b92651af1996489d660e237f1b) by [@asafkorem](https://github.com/asafkorem)) + +## v0.67.0 + +### Added + +#### Android specific +- Add `ACCESS_MEDIA_LOCATION` permission to PermisionsAndroid library. ([79db483568](https://github.com/facebook/react-native/commit/79db4835681f5d0149620ec8e0990411cb882241) by [@Skrilltrax](https://github.com/Skrilltrax)) +- Implement `SnapToAlignment` in `ReactScrollView` ([e774c037bc](https://github.com/facebook/react-native/commit/e774c037bce40a4b48e78d2d0a1085a1e4f5a328)), `ReactScrollViewManager` ([c6e5640e87](https://github.com/facebook/react-native/commit/c6e5640e87e7cb5b514ded2c8d4cbb039bd02c5f)), `ReactHorizontalScrollView` ([b12256394e](https://github.com/facebook/react-native/commit/b12256394e34c375942ca508ef79a8c816317976)), `ReactHorizontalScrollViewManager` ([deec1db9fd](https://github.com/facebook/react-native/commit/deec1db9fdf2848941326ba5bebc11f3592a301e)) and update `ScrollView.js` ([a54cfb9e57](https://github.com/facebook/react-native/commit/a54cfb9e5794f196d3834e19762f3aacf47a177d)) and reach parity with iOS ([04184ef851](https://github.com/facebook/react-native/commit/04184ef851c71141009c523ba59838ae6af19ba5)) by [@mdvacca](https://github.com/mdvacca) +- Show Redbox for C++ errors. ([d6c879edba](https://github.com/facebook/react-native/commit/d6c879edbad068d0f461381875b7fae6db99d18d) by [@sota000](https://github.com/sota000)) +- Added an experimental touch dispatch path ([a2feaeb5f1](https://github.com/facebook/react-native/commit/a2feaeb5f1121a860a9416b5d4e0e96debd45b09) by [@ShikaSD](https://github.com/ShikaSD)) + +#### iOS specific +- Added `cancelButtonTintColor` prop for `ActionSheetIOS` to change only the text color of the cancel button ([01856633a1](https://github.com/facebook/react-native/commit/01856633a1d42ed3b26e7cc93a007d7948e1f76e) by [@nomi9995](https://github.com/nomi9995)) +- Added [`LSApplicationQueriesSchemes`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW14) in info.plist with entries tel, telprompt, http, fb, geo ([b26f277262](https://github.com/facebook/react-native/commit/b26f2772624c863c91fa1ff627b481c92d7562fb) by [@utkarsh-dixit](https://github.com/utkarsh-dixit)) +- Add `UIAccessibilityTraitUpdatesFrequently` to progressBar role ([1a42bd6e97](https://github.com/facebook/react-native/commit/1a42bd6e97ae44a3b38ca552865bac63a6f35da5) by [@jimmy623](https://github.com/jimmy623)) +- Add `asdf-vm` support in `find-node.sh` ([3e7c310b1d](https://github.com/facebook/react-native/commit/3e7c310b1dcf5643920535eea70afa451888792a) by [@pastleo](https://github.com/pastleo)) + + +### Changed +- `ImageBackground` now respects `imageStyle` width and height ([dbd5c3d8e5](https://github.com/facebook/react-native/commit/dbd5c3d8e5e35685be89156194a96cead553a330) by [@Naturalclar](https://github.com/Naturalclar)) +- Rename deprecated `Keyboard.removeEventListener` to `Keyboard.removeListener`. ([8880c09076](https://github.com/facebook/react-native/commit/8880c09076e4727768ace26a74766cbe6f64021c) by [@yungsters](https://github.com/yungsters)) +- Update `Modal`'s mock to not render its children when it is not visible ([ec614c16b3](https://github.com/facebook/react-native/commit/ec614c16b331bf3f793fda5780fa273d181a8492) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) +- Upgraded `react-devtools-core` dependency to 4.19.1 ([356236471a](https://github.com/facebook/react-native/commit/356236471abc6b5b8c139223e15388fd1eecd2d1) by [@jstejada](https://github.com/jstejada)) +- React-native/normalize-color now supports Node.js ([65e58f26e1](https://github.com/facebook/react-native/commit/65e58f26e1fbd06b1ae32e2ab3a2616c8eef08e0) by [@yungsters](https://github.com/yungsters)) +- Updated to Contributor Covenant v2.1 ([19f8d2f7da](https://github.com/facebook/react-native/commit/19f8d2f7da13f4524f31acf7aa10cc0aa91b5da4)) + + +#### Android specific +- Hermes initialization will no longer need an explicit configuration. ([a40f973f58](https://github.com/facebook/react-native/commit/a40f973f58609ca717fac63bc501d5cf93b748ad) by [@Ashoat](https://github.com/Ashoat)) +- Setting `overflow: scroll` in View component style will clip the children in the View container ([93beb83abe](https://github.com/facebook/react-native/commit/93beb83abef42b92db43ee3bb8b156f486a6c00f) by [@ryancat](https://github.com/ryancat)) +- Native views backing `Animated.View` (w/ JavaScript-driven animations) will no longer be flattened; this should be a transparent change. ([4fdbc44ab5](https://github.com/facebook/react-native/commit/4fdbc44ab5945399338e4ed94ea5611098bd2142) by [@yungsters](https://github.com/yungsters)) +- Use new Locale API on Android 11 (API 30)+ ([b7c023a8c1](https://github.com/facebook/react-native/commit/b7c023a8c1122500c6ceb7de2547569b3b9251ba)) +- Changed `react.gradle` `detectCliPath` function logic for `cliPath` case ([ce51b62494](https://github.com/facebook/react-native/commit/ce51b6249449361ee50b8c99a427c28af7ab3531) by [@vitalyiegorov](https://github.com/vitalyiegorov)) +- Remove `"high"` and `"balanced"` as values for `android_hyphenationFrequency` on `Text` ([a0d30b848a](https://github.com/facebook/react-native/commit/a0d30b848a07480d0fccec608a62a505c71f8cac)) +- Bump Gradle version to 7.2, Bump Kotlin version to 1.5.31 ([9ae3367431](https://github.com/facebook/react-native/commit/9ae3367431428748f5486c782199beb4f9c6b477) by [@svbutko](https://github.com/svbutko)) +- Move mavenCentral repo below local paths ([046b02628d](https://github.com/facebook/react-native/commit/046b02628d32eadd6d44160ab79932f6c26b188d) by [@friederbluemle](https://github.com/friederbluemle)) + +#### iOS specific +- Optimized font handling for iOS ([4ac42d88ef](https://github.com/facebook/react-native/commit/4ac42d88ef60ae3fed7319851d47b93e98ac9afa) by [@Adlai-Holler](https://github.com/Adlai-Holler)) +- Remove iOS 11 version check as minimum deployment is iOS 11 ([398595e074](https://github.com/facebook/react-native/commit/398595e07483fa8f45579de4ca1aee9585e20620) by [@ken0nek](https://github.com/ken0nek)) +- Don't hang app for 60s if packager can't be reached, changed to 10s ([c0e04460f5](https://github.com/facebook/react-native/commit/c0e04460f546dfef2623bff367eb8db8fd75fa34) by [@radex](https://github.com/radex)) + +### Removed + +- Removed unnecessary global variable `GLOBAL`. ([a101fc768c](https://github.com/facebook/react-native/commit/a101fc768cedc7ac9754006e5b7292bb7084ab54) by [@rubennorte](https://github.com/rubennorte)) +- Removed unused files: `StaticContainer.react.js`, `ensurePositiveDelayProps.js`, `InteractionMixin.js`, `queryLayoutByID.js` ([64aa1e5ffe](https://github.com/facebook/react-native/commit/64aa1e5ffe5d577c04cabb3692246b956f65597b) by [@ecreeth](https://github.com/ecreeth)) + +#### Android specific + +- Remove `DatePickerAndroid` from react-native. ([7a770526c6](https://github.com/facebook/react-native/commit/7a770526c626e6659a12939f8c61057a688aa623) by [@andresantonioriveros](https://github.com/andresantonioriveros)) + +#### iOS specific + +### Fixed + +- Update metro config language to `blockList` ([7923804c28](https://github.com/facebook/react-native/commit/7923804c28aac731396f0db112cb6c3a9d30c08f) by [@rh389](https://github.com/rh389)) +- Ignores global npm prefix ([6334ac35ac](https://github.com/facebook/react-native/commit/6334ac35ac3cbc2c84b2d46d46ec118bf9bf714d) by [@redreceipt](https://github.com/redreceipt)) +- Support `Animated.ValueXY` when validating `Animated.event`. ([27dd2ecb70](https://github.com/facebook/react-native/commit/27dd2ecb70f1d08787c93a2e18250ffaff328e5f) by [@javache](https://github.com/javache)) +- Add a function `getIgnorePatterns` in `LogBoxData.js` for tests or other usecases. ([a950634424](https://github.com/facebook/react-native/commit/a950634424cddf31c0adb6c9799adf1cc5f83bf0)) + +#### Android specific + +- TextInput Drawable to avoid Null Pointer Exception RuntimeError https://github.com/facebook/react-native/issues/17530 ([254493e1fb](https://github.com/facebook/react-native/commit/254493e1fb0c3a1e279e2c957e83edac6252d041) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Nested Text Android `onPress` does not work with last character ([132d1d00f8](https://github.com/facebook/react-native/commit/132d1d00f885fe5a45d712fd7698db285c22bc4b) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fix non selectable Text in FlatList ([c360b1d92b](https://github.com/facebook/react-native/commit/c360b1d92b69e1d298b390ec88c4d29c1023945a) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Set `textBreakStrategy` default to be `'highQuality'` ([3b2d541989](https://github.com/facebook/react-native/commit/3b2d5419899363d84aea4f5cc3a4c75253dd6406)) +- Fix error handling when loading JSC or Hermes ([d839b24b06](https://github.com/facebook/react-native/commit/d839b24b06d31b4ce91fb459742831b942972f56) by [@iqqmuT](https://github.com/iqqmuT)) +- Fix encoding for gradlew.bat files ([ab2bdee735](https://github.com/facebook/react-native/commit/ab2bdee735cd0d53d3dbfbac5cd31f96eefb7e61) by [@yungsters](https://github.com/yungsters)) +- Fix `hermesFlags` not working with multiple variants ([91adb761cf](https://github.com/facebook/react-native/commit/91adb761cf1583598d4d63ce879fd7e0f4ae793c) by [@grit96](https://github.com/grit96)) +- `ScrollTo` API in ScrollView will check the actual scroll position before setting the scroll state ([1a9e2d5d55](https://github.com/facebook/react-native/commit/1a9e2d5d5589ce5cee92868ea5bccceb6e161eff) by [@ryancat](https://github.com/ryancat)) +- Compute Android Notch in `keyboardDidShow` height calculation API 28+ ([8bef3b1f11](https://github.com/facebook/react-native/commit/8bef3b1f1136ab5c2f2309a3101a7d9626ced1f5) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fix `currentActivity` being null when launching Redbox ([f4fdf4b55e](https://github.com/facebook/react-native/commit/f4fdf4b55e4489c21f4552b4ac01ef253c038b2d)) +- When sending OS intents, always set `"FLAG_ACTIVITY_NEW_TASK"` flag (required by OS). ([04fe3ed80d](https://github.com/facebook/react-native/commit/04fe3ed80d9c201a483a2b477aeebd3d4169fd6d) by [@Krizzu](https://github.com/Krizzu)) +- Fix missing WebView provider crash in ForwardingCookieHandler ([d40cb0e1b0](https://github.com/facebook/react-native/commit/d40cb0e1b0fb233a27b9d476167814d2853acf2a) by [@RodolfoGS](https://github.com/RodolfoGS)) +- Fix `keyboardDismissMode="on-drag"` on Android ([7edf9274cf](https://github.com/facebook/react-native/commit/7edf9274cf6d3398075c19cd1cb020a5d6a346a2) by [@janicduplessis](https://github.com/janicduplessis)) +- Fixed `alignItems: baseline` for elements on Android ([1acf334614](https://github.com/facebook/react-native/commit/1acf33461451834097463f43e70d90bae0f67198)) +- `OnKeyPress` event not fired with numeric keys ([ee3e71f536](https://github.com/facebook/react-native/commit/ee3e71f536127295ba4ea377e618499409a2e9ba) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Exclude unused .so files for reduce android .apk and .aab ([6f126740fa](https://github.com/facebook/react-native/commit/6f126740fa560d7a831979b9f3747baacfb28dba) by [@enniel](https://github.com/enniel)) + +#### iOS specific + +- Fixed an edge case when scroll to item/index is called without animation, the offset position is not updated. This caused the measurement of the position to be wrong. ([55392f65a6](https://github.com/facebook/react-native/commit/55392f65a6addbdd8214b61d4ae286f26d63a94f) by [@ryancat](https://github.com/ryancat)) +- Fixed the issue when moving cursor in multi-line TextInput. ([22801870f0](https://github.com/facebook/react-native/commit/22801870f0613c2544ade1ebc5363e6e2f015c79) by [@xiankuncheng](https://github.com/xiankuncheng)) +- Fix NSInvalidArgumentException for invalid font family names. ([5683932862](https://github.com/facebook/react-native/commit/5683932862ab870e735342342c68e03fb5ca9e09) by [@yungsters](https://github.com/yungsters)) +- Fix Image `defaultSource` not showing on iOS ([900210cacc](https://github.com/facebook/react-native/commit/900210cacc4abca0079e3903781bc223c80c8ac7) by [@cristianoccazinsp](https://github.com/cristianoccazinsp)) +- Warn if Rosetta2 is being used (x86_64 on arm64) ([51bf557948](https://github.com/facebook/react-native/commit/51bf55794899284e1c465d346a3f6ebd8a485da2) by [@barbieri](https://github.com/barbieri)) +- Source map path for schemes containing whitespaces ([f3fe7a0fb5](https://github.com/facebook/react-native/commit/f3fe7a0fb5fc0325fbe062c6df4cbf8b58779189) by [@andersonvom](https://github.com/andersonvom)) +- Fix build error after running `pod install` with `--project-directory=ios` ([ef5ff3e055](https://github.com/facebook/react-native/commit/ef5ff3e055482771cbe866d4961ee2d0a9e00e45) by [@sonicdoe](https://github.com/sonicdoe)) +- Fixed inability to build apps when gflags is installed ([ab8dbdf663](https://github.com/facebook/react-native/commit/ab8dbdf66363f3d65f0dfbcc4ec7c71b1cd69b2a) by [@KDederichs](https://github.com/KDederichs)) + +### Security + +- Avoiding logging root view params outside of dev / debug mode builds ([e612d3a116](https://github.com/facebook/react-native/commit/e612d3a116f39ab354169643bab0d4bb9cfc1a85) by [@sterlingwes](https://github.com/sterlingwes)) + +## v0.66.5 + +🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). + +### Fixed + +- Force dependencies resolution to minor series for 0.66 ([201824c89e](https://github.com/facebook/react-native/commit/201824c89ecebd749ba7e603415edbe6a5b9b73d) by [@cortinico](https://github.com/cortinico)) + +## v0.66.4 + +### Fixed + +#### iOS specific + +- Revert "Fix Deadlock in RCTi18nUtil (iOS)" ([70ddf46](https://github.com/facebook/react-native/commit/70ddf46c8afcd720e188b6d82568eac6ac8125e6) by [@Saadnajmi](https://github.com/Saadnajmi)) +- `apply_Xcode_12_5_M1_post_install_workaround` causing pods targetting iOS 12 and above to fail ([a4a3e67554](https://github.com/facebook/react-native/commit/a4a3e675542827bb281a7ceccc7b8f5533eae29f) by [@Yonom](https://github.com/Yonom)) + +## v0.66.3 + +### Changed + +- Rename deprecated `Keyboard.removeEventListener` to `Keyboard.removeListener`. ([8880c09076](https://github.com/facebook/react-native/commit/8880c09076e4727768ace26a74766cbe6f64021c) by [@yungsters](https://github.com/yungsters)) + +### Fixed + +- Revert changes in Jest preprocessor to fix tests in external projects ([142090a5f3fa7](https://github.com/facebook/react-native/commit/142090a5f3fa7c3ab2ed4c536792e3f26582bd3b) by [@rubennorte](https://github.com/rubennorte)) + +## v0.66.2 + +### Fixed + +- Add a function `getIgnorePatterns` in `LogBoxData.js` for tests or other usecases. ([a950634424](https://github.com/facebook/react-native/commit/a950634424cddf31c0adb6c9799adf1cc5f83bf0)) +- Reintroduce generated codegen files ([7382f556d3](https://github.com/facebook/react-native/commit/7382f556d327d51bd09456efda83edec7e05ecd2) by [@kelset](https://github.com/kelset)) + +#### iOS specific + +- Hide the logbox window explicitly. New behavior in iOS SDK appears to retain UIWindow while visible. ([72ea0e111f](https://github.com/facebook/react-native/commit/72ea0e111fccd99456abf3f974439432145585e3) by [@paddlefish](https://github.com/paddlefish)) + +## v0.66.1 + +### Fixed + +- For Android, general fixes to Appearance API and also fixes AppCompatDelegate.setDefaultNightMode(). For iOS, now works correctly when setting window.overrideUserInterfaceStyle ([25a2c608f7](https://github.com/facebook/react-native/commit/25a2c608f790f42cbc4bb0a90fc06cc7bbbc9b95) by [@mrbrentkelly](https://github.com/mrbrentkelly)) + +#### Android specific + +- Fix Android border positioning regression ([d1a33cd139](https://github.com/facebook/react-native/commit/d1a33cd139fab4565b1fc691f5751c4af99d5849) by [@oblador](https://github.com/oblador)) + +#### iOS specific + +- Fix for unable to find `find-node.sh` in `react-native-xcode.sh` script ([cc59a7cbde](https://github.com/facebook/react-native/commit/cc59a7cbde1c0fc6d6ef059321d23bf287f08218) by [@garethknowles](https://github.com/garethknowles)) + +## v0.66.0 + +### Highlights + +- Hermes 0.9.0 + - This Hermes release is primarily about closing gap between Hermes cut and this React Native release. Among ~400 commits, contains memory and size wins, bugfixes and other progress behind the scenes. See [issue for more details](https://github.com/facebook/hermes/issues/586). +- Allow taps on views outside the bounds of a parent with `overflow: visible` ([e35a963bfb](https://github.com/facebook/react-native/commit/e35a963bfb93bbbdd92f4dd74d14e2ad6df5e14a) by [@hsource](https://github.com/hsource)) +- Fixes for building on Apple Silicon and Xcode 13 ([ac4ddec542](https://github.com/facebook/react-native/commit/ac4ddec542febda744de218dae3a3d34edc7da84) thanks to [@mikehardy](https://github.com/mikehardy)) +- New bluetooth permissions for Android ([2bcc6fac38](https://github.com/facebook/react-native/commit/2bcc6fac3844f0752bc7067517c92a643679575e), [eeb8e58](https://github.com/facebook/react-native/commit/eeb8e5829e183f6b5cd5fd327cf6da03a7db0541) by [@iBotPeaches](https://github.com/iBotPeaches)) + +### Breaking + +- Remove Picker and PickerIOS components + [cddb97ad18](https://github.com/facebook/react-native/commit/cddb97ad18cfdb663dcf015af3c9426d5414e396), [77366cd869](https://github.com/facebook/react-native/commit/77366cd8696cb8ada3f84d7fb4d36a27f7007b06), [ad0ccac0d6](https://github.com/facebook/react-native/commit/ad0ccac0d6471fa5428bf137c3aa0646883e8446) +- Remove StatusBarIOS component ([7ce0f40f5c](https://github.com/facebook/react-native/commit/7ce0f40f5cd8c0928ce720d6d121bcc5963958a2) by [@ecreeth](https://github.com/ecreeth)) + +#### Android specific + +- Updated `autoCompleteType` prop of `TextInput` to `autoComplete` ([27fec9569e](https://github.com/facebook/react-native/commit/27fec9569e08a04e0dbdbd5de063a599ad0416fa) by [@jeswinsimon](https://github.com/jeswinsimon)) + +### Added + +- Add `global.queueMicrotask` ([be189cd819](https://github.com/facebook/react-native/commit/be189cd81905a735f08a8519c62a707658c7fb27) by [@Huxpro](https://github.com/Huxpro)) +- Added data field to `markerPoint` to allow callers to add additional arbitrary string data to logged points ([aa98978302](https://github.com/facebook/react-native/commit/aa9897830293955b7cc77fd818a50e8d736e715d)) +- Adds accessibility actions to Button ([44717152ca](https://github.com/facebook/react-native/commit/44717152cadb18c7aff74e9465fdb70efdb1bf81) by [@dennisurtubia](https://github.com/dennisurtubia)) +- Add accessibilityState prop to Slider component ([35dd86180b](https://github.com/facebook/react-native/commit/35dd86180ba730425b97592ef6e5c4d449caee06) by [@sladyn98](https://github.com/sladyn98)) +- Add support for "togglebutton" `accessibilityRole` ([da899c0cc4](https://github.com/facebook/react-native/commit/da899c0cc4372830e5ca053a096b74fff2a19cb8) by [@kacieb](https://github.com/kacieb)) + +#### Android specific + +- Add INFO, and MENU key event support ([bb33c1050b](https://github.com/facebook/react-native/commit/bb33c1050ba6098a68d70055e33186d9438c4374) by [@havlasme](https://github.com/havlasme)) +- Added all autofill types to TextEdit ([d9e0ea77f0](https://github.com/facebook/react-native/commit/d9e0ea77f0111fd8400c65d68e45d54e2f84287b) by [@safaiyeh](https://github.com/safaiyeh)) +- Add support to URI keyboard type in Android ([1465c8f387](https://github.com/facebook/react-native/commit/1465c8f3874cdee8c325ab4a4916fda0b3e43bdb)) +- Add `MEDIA_STOP`, `MEDIA_NEXT`, and `MEDIA_PREVIOUS` event support to Android TV ([3e2bb331fc](https://github.com/facebook/react-native/commit/3e2bb331fc0974bc870b2e7bd3171e585183ed1b) by [@havlasme](https://github.com/havlasme)) +- Allow configuring ndk build architectures ([d6ed1ff58b](https://github.com/facebook/react-native/commit/d6ed1ff58b2ca4d1c8b45416e56fa1da75633c07) by [@janicduplessis](https://github.com/janicduplessis)) +- Added support for accessibility role of "list" for flatlist and sectioned list ([25a16123a6](https://github.com/facebook/react-native/commit/25a16123a610ae377ced23ef81ed4c03ad7d06d9) by [@anaskhraza](https://github.com/anaskhraza)) +- Support for foreground ripple in Pressable ([0823f299e5](https://github.com/facebook/react-native/commit/0823f299e560efda5c0f344fcec86cf68801f4ab) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- Support for ScrollAway native nav bars added to `ReactScrollView` ([0ef5beee85](https://github.com/facebook/react-native/commit/0ef5beee855afa592cc647383ba6a3ceae9cc40a) by [@JoshuaGross](https://github.com/JoshuaGross)) + +#### iOS specific + +- Added new prop "selection" to `TextInputProps` ([8434177722](https://github.com/facebook/react-native/commit/8434177722f70a9325f9a6adf46b5315b1f4ffa4)) +- Support for onRequestClose for iOS Modal component. ([c29ec46b0e](https://github.com/facebook/react-native/commit/c29ec46b0eee99670ce7762898fe3a4810db968b) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- Allow `PlatformColor` to return user-defined named asset color ([36c0a7dec1](https://github.com/facebook/react-native/commit/36c0a7dec121bd3a4b92d02c03a24771d3c4cf84) by [@oblador](https://github.com/oblador)) +- Add support for the `UIAccessibilityTraitsTabBar` ([11f8d9c7cd](https://github.com/facebook/react-native/commit/11f8d9c7cd4bae0b1a5e880ea9b2da7447ad76c2) by [@jimmy623](https://github.com/jimmy623)) +- Added "altitudeAngle" property to touch events from Apple Pencil/Stylus devices. ([f1b1ba8963](https://github.com/facebook/react-native/commit/f1b1ba8963ff152d995c3cd132bc0755413bc44f) by [@swittk](https://github.com/swittk)) +- Introduce `RCTInitializing` to allow NativeModules to initialize themselves ([9b45df1fce](https://github.com/facebook/react-native/commit/9b45df1fced066f40034b0a58be6f4caafd5f785) by [@RSNara](https://github.com/RSNara)) +- Introduce `RCTCallableJSModules` API for NativeModules ([ece373d244](https://github.com/facebook/react-native/commit/ece373d24421d96e62dafa9a064b38acd6b71e46) by [@RSNara](https://github.com/RSNara)) +- Attach `RCTBundleManager` to NativeModules ([329f58ee46](https://github.com/facebook/react-native/commit/329f58ee461e7afade36d8c249d3f4930c485312) by [@RSNara](https://github.com/RSNara)) +- Introduce RCTBundleManager for bundleURL access ([4a1bafe591](https://github.com/facebook/react-native/commit/4a1bafe591917482d78be998d45552e2568e3e23) by [@RSNara](https://github.com/RSNara)) + +### Changed + +- Initialized LogBox earlier and centralized access in LogBox module ([8abe737068](https://github.com/facebook/react-native/commit/8abe737068a54a874571c8b5560b2118b1df31ad) by [@rubennorte](https://github.com/rubennorte)) +- ExceptionsManager will no longer report exceptions with `type === 'warn'`. ([883e0d5752](https://github.com/facebook/react-native/commit/883e0d5752b952c829c8d45504d3532f52bb272f) by [@yungsters](https://github.com/yungsters)) +- Disable TouchableOpacity when `accessibilityState.disabled` is set ([ea609defe8](https://github.com/facebook/react-native/commit/ea609defe8462a6beeac4da3aa7a43397ee9a77f) by [@chakrihacker](https://github.com/chakrihacker)) +- Upgrade Babel from 7.12.3 to 7.14.1 ([58a0f9b4e2](https://github.com/facebook/react-native/commit/58a0f9b4e202a921ab0820c79d6a3dd54204da46) by [@MichaReiser](https://github.com/MichaReiser)) +- Upgrade `react-devtools-core` from ~4.6.0 to ^4.13.0 ([9e020ef476](https://github.com/facebook/react-native/commit/9e020ef476e24bb5703fc421225f1a94ae14512b) by [@bvaughn](https://github.com/bvaughn)) +- Update Flipper to 0.99.0 ([41f45a77ad](https://github.com/facebook/react-native/commit/41f45a77ad09b46de328fb2a72775a052dac1e93) by [@swrobel](https://github.com/swrobel)) +- Bump CLI to ^6.0.0 ([c677e196a9](https://github.com/facebook/react-native/commit/c677e196a9c4d6cfdf84d97e4746922bb4ed4823) by [@thymikee](https://github.com/thymikee)) +- Upgrade ESLint TS parser and plugin ([3b751d396b](https://github.com/facebook/react-native/commit/3b751d396ba0acaa1b4c8e1115c79eb45dab403d) by [@wcandillon](https://github.com/wcandillon)) +- Upgrade folly to 2021.06.28.00 and boost to 1.76.0 ([b77948e33b](https://github.com/facebook/react-native/commit/b77948e33bc5e0df422fffca3b4c9253f611d298) by [@Kudo](https://github.com/Kudo)) + +#### Android specific + +- Add BLUETOOTH_ADVERTISE to `PermissionsAndroid` ([2bcc6fac38](https://github.com/facebook/react-native/commit/2bcc6fac3844f0752bc7067517c92a643679575e) by [@iBotPeaches](https://github.com/iBotPeaches)) +- Native ScrollView listeners list maintains weak references to listeners to avoid memory leaks ([b673e352fb](https://github.com/facebook/react-native/commit/b673e352fb0ea44b545edf5a7e8c1b422180838a) by [@dalves](https://github.com/dalves)) +- Rename the "Toggle Inspector" DevMenu item to "Hide/Show Element Inspector" ([e91fb05db7](https://github.com/facebook/react-native/commit/e91fb05db7f576e07114755b9db1eee91c672f25) by [@RSNara](https://github.com/RSNara)) +- Localize "search", "button", and "togglebutton" accessibility roles by using the platform roles ([399285f91c](https://github.com/facebook/react-native/commit/399285f91c2f675dea16fe61a86049ef7fecf35b) by [@kacieb](https://github.com/kacieb)) +- Refactor `AndroidTextInput.AndroidTextInput.color` prop to use SharedColor instead of int ([bc57056cc3](https://github.com/facebook/react-native/commit/bc57056cc3263431d54982426d890ba60b4cadb7) by [@mdvacca](https://github.com/mdvacca)) +- Upgraded `infer-annotation` to 0.18.0. ([b5c94e316c](https://github.com/facebook/react-native/commit/b5c94e316cc9b4ff090d8daa8970bf1becf77959) by [@yungsters](https://github.com/yungsters)) +- Bumped AGP to 4.2.2 ([ae494e7ce1](https://github.com/facebook/react-native/commit/ae494e7ce199cc5d524f791d45ddce51535cdadb) by [@cortinico](https://github.com/cortinico)) +- Upgrade folly to 2021.06.28.00 ([ebe939b18a](https://github.com/facebook/react-native/commit/ebe939b18aa859eb0f7f265222874c292ed771a4) by [@Kudo](https://github.com/Kudo)) +- Bump NDK to 21.4.7075529 ([aa43aab77c](https://github.com/facebook/react-native/commit/aa43aab77c8571632a2b0913c80fbf822dac01bc) by [@dulmandakh](https://github.com/dulmandakh)) + +#### iOS specific + +- ScrollView scrollIndicatorInsets to not automatically add safe area on iOS13+ ([bc1e602e0c](https://github.com/facebook/react-native/commit/bc1e602e0c7922da6bf238675b7bf8b4c3faa493) by [@justinwh](https://github.com/justinwh)) + +### Removed + +- `StyleSheet.create` will no longer do DEV-time validation. ([2e8c0bd7ea](https://github.com/facebook/react-native/commit/2e8c0bd7ea7db1aac183eb7f656772d3cffcb132) by [@yungsters](https://github.com/yungsters)) + +### Fixed + +- Fix `window` not existing in jest setup ([bc1c533833](https://github.com/facebook/react-native/commit/bc1c533833bfe25a22f1abd105b8bcb1babce3b5) by [@timomeh](https://github.com/timomeh)) +- Clamp negative values for `numberOfLines` in component ([3bc883c6c6](https://github.com/facebook/react-native/commit/3bc883c6c60632f6a41df3867368f16f684b3865) by [@ShikaSD](https://github.com/ShikaSD)) +- Add missing `jest/create-cache-key-function` dep root package.json ([9a43eac7a3](https://github.com/facebook/react-native/commit/9a43eac7a32a6ba3164a048960101022a92fcd5a) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix Switch ref forwarding ([1538fa4455](https://github.com/facebook/react-native/commit/1538fa4455fa7095879aceba7f74a519c1337a8b) by [@janicduplessis](https://github.com/janicduplessis)) +- Report fatal errors even if its `type` is "warn". ([e4a4c4d6d7](https://github.com/facebook/react-native/commit/e4a4c4d6d71ab1a747d768e4b518e64e100ddfde) by [@yungsters](https://github.com/yungsters)) +- Parse `accessibilityAction` props into object instead of string ([faaeb778df](https://github.com/facebook/react-native/commit/faaeb778dfe25df67fc00b599d023819c10406e8) by [@ShikaSD](https://github.com/ShikaSD)) +- Avoid downgrading `console.error` when passed warning-like objects. ([0dba0aff18](https://github.com/facebook/react-native/commit/0dba0aff185f4fd46e1146362235e68e52c59556) by [@yungsters](https://github.com/yungsters)) +- Fix natively driven animations not getting reset properly ([129180c77b](https://github.com/facebook/react-native/commit/129180c77b0b99a3acedbeb04ce6ec4667f74cac) by [@tienphaw](https://github.com/tienphaw)) +- Fix compilation errors on Windows. ([6d04a46f74](https://github.com/facebook/react-native/commit/6d04a46f7427b9e107608f8f620fe2a1a84ff42d)) +- Fixed bug parsing hermes call stacks when the file name is empty ([e539e7d0be](https://github.com/facebook/react-native/commit/e539e7d0bed4fef42f458f28d06100ae23f52cb7) by [@MartinSherburn](https://github.com/MartinSherburn)) +- Upgrade dependencies / version of eslint package ([463ec22bb9](https://github.com/facebook/react-native/commit/463ec22bb9f2938164fef6133dfd94d2e428e5b0) by [@mikehardy](https://github.com/mikehardy)) + +#### Android specific + +- Allow taps on views outside the bounds of a parent with `overflow: visible` ([e35a963bfb](https://github.com/facebook/react-native/commit/e35a963bfb93bbbdd92f4dd74d14e2ad6df5e14a) by [@hsource](https://github.com/hsource)) +- Fixed to use correct Android theme color for dark theme ([b3a715f6ea](https://github.com/facebook/react-native/commit/b3a715f6ea3d0faaf6d09e2a49267f2a5fb3fad2) by [@sidverma32](https://github.com/sidverma32)) +- Fixed dynamic behavior of `` on Android ([59021521e7](https://github.com/facebook/react-native/commit/59021521e7aba0f70b91b5c7778ccdd1b30eaae4)) +- Fix Dimensions not updating ([c18a492858](https://github.com/facebook/react-native/commit/c18a492858e94b31e632560ad17499012e688158) by [@jonnyandrew](https://github.com/jonnyandrew)) +- Fix dashed/dotted border-drawing when `borderRadius` is 0 ([3e5998e651](https://github.com/facebook/react-native/commit/3e5998e651eba840603dcb1a9c0be564fc3f868d) by [@IjzerenHein](https://github.com/IjzerenHein)) +- Fix selectionColor doesn't style Android TextInput selection handles ([5819538a08](https://github.com/facebook/react-native/commit/5819538a087f1f48d564e7b4e273fe43dfb026cc) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fix Modal being dismissed incorrectly when pressing escape on a hardware keyboard ([f51773ecde](https://github.com/facebook/react-native/commit/f51773ecdedbac19d25eb20894e532edef2cb304) by [@levibuzolic](https://github.com/levibuzolic)) +- Avoid calling setHint with a null parameter causing cursor to jump to the right ([3560753559](https://github.com/facebook/react-native/commit/356075355908f4901b87ad6ce33c157f01c8e748) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Create slider accessibility delegate in createViewInstance ([91cac20289](https://github.com/facebook/react-native/commit/91cac2028900cd18d17e70f9050cc125ed1eb12e) by [@janicduplessis](https://github.com/janicduplessis)) +- Quickfix individual border style dotted or dashed rendering as solid ([cb0e1d603a](https://github.com/facebook/react-native/commit/cb0e1d603aa4439a4d4804ad2987e4cb1f9bbf90) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Make `mHybridData` thread safe ([7929551623](https://github.com/facebook/react-native/commit/7929551623d4e3fbd849500d795755d0c41fdbbd)) +- Exit early from layout in textview if text layout is null ([8dfc3bcda1](https://github.com/facebook/react-native/commit/8dfc3bcda1e77fc982bc98da20dc129c23d8cc77) by [@ShikaSD](https://github.com/ShikaSD)) +- Fix `NullPointerException` caused by race condition in `ReactInstanceManager.getViewManagerNames` method ([fb386fccdd](https://github.com/facebook/react-native/commit/fb386fccddfe381fd6af5656c13fac802bffd316) by [@mdvacca](https://github.com/mdvacca)) +- Pressable ripple subsequent press coordinates. ([961b00d8c0](https://github.com/facebook/react-native/commit/961b00d8c0117750ce147c0b27c59af93f64b65c) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- TouchableNativeFeedback ripple starts on previous touch location. ([d85d72d0d9](https://github.com/facebook/react-native/commit/d85d72d0d9143693f73cef24c8e5bbb4d539a620) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- Fix Crash in `ViewProps.isLayoutOnly` ([e6b9508f12](https://github.com/facebook/react-native/commit/e6b9508f12ffd732d773ddcf9c2f633b0eca4232) by [@javache](https://github.com/javache)) +- Fixed a crash when updating `snapToOffsets` to a null value ([ba387b91d3](https://github.com/facebook/react-native/commit/ba387b91d3c7c9c1acd4b08f07fcd45629f3edfb) by [@maxoumime](https://github.com/maxoumime)) +- Adding `setAccessible` to `ReactImageManager` to allow screenreader announce Image accessibilityState of "disabled" ([333b46c4b0](https://github.com/facebook/react-native/commit/333b46c4b0ddee286e6d1d4b971fe8554a5c14cb) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fixed Android library builds with react.gradle file ([88f0676ae4](https://github.com/facebook/react-native/commit/88f0676ae49fd629331495101248c8e13423aed2) by [@Legion2](https://github.com/Legion2)) + +#### iOS specific + +- Fix deadlock on `RCTi18nUtil` ([fcead14b0e](https://github.com/facebook/react-native/commit/fcead14b0effe2176a5d08ad50ee71e48528ddbd) by [@Saadnajmi](https://github.com/Saadnajmi)) +- Avoid re-encoding images when uploading local files ([f78526ce3d](https://github.com/facebook/react-native/commit/f78526ce3d4004eb4bf8ca5178ca7e2c1c9abc1a) by [@arthuralee](https://github.com/arthuralee)) +- content is reset when emoji is entered at the max length ([f3b8d4976f](https://github.com/facebook/react-native/commit/f3b8d4976f8608c2cda1f071923f14b6d4538967)) +- Use `actionName` in accessibility event callback ([fed6ad5bad](https://github.com/facebook/react-native/commit/fed6ad5badb4196a1895370fc81c522572cb34b4) by [@ShikaSD](https://github.com/ShikaSD)) + +## v0.65.3 + +🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). + +### Fixed + +- Force dependencies resolution to minor series for 0.65 ([9548eaea74](https://github.com/facebook/react-native/commit/9548eaea74c6ad242c015d1984503c4b7eb19b6f) by [@kelset](https://github.com/kelset)) + +## v0.65.2 + +### Fixed + +- For Android, general fixes to Appearance API and also fixes AppCompatDelegate.setDefaultNightMode(). For iOS, now works correctly when setting window.overrideUserInterfaceStyle ([25a2c608f7](https://github.com/facebook/react-native/commit/25a2c608f790f42cbc4bb0a90fc06cc7bbbc9b95) by [@mrbrentkelly](https://github.com/mrbrentkelly)) + +## v0.65.1 + +### Changed + +- Set `react-test-renderer` to `17.0.2` in the template ([d272880](https://github.com/facebook/react-native/commit/d27288044e94a248982f596e9885d55d066bc72e) by [@@rickhanlonii](https://github.com/@rickhanlonii)) + +### Fixed + +- Resolve `NODE_BINARY` after finding the right path to node ([d75683](https://github.com/facebook/react-native/commit/d75683ac943205d64dd4142cca713ab2356094b8) by [@santiagofm](https://github.com/santiagofm)) + +#### Android specific + +- `ColorProps` with value null should be defaultColor instead of transparent ([842bcb902e](https://github.com/facebook/react-native/commit/842bcb902ed27928255b60cb20524e9318d9bf70) by [@hank121314](https://github.com/hank121314)) +- Android Gradle Plugin 7 compatibility ([06e31c748f](https://github.com/facebook/react-native/commit/06e31c748fe87a866dbaf4d0c2019e76ec00e309) by [@dulmandakh](https://github.com/dulmandakh)) + +## v0.65.0 + +### Highlights + +- Hermes 0.8.1. Please see the highlighted changes from its [0.8.0](https://github.com/facebook/hermes/releases/tag/v0.8.0) and [0.8.1](https://github.com/facebook/hermes/releases/tag/v0.8.1) release notes. +- `react-native-codegen` version `0.0.7` is now needed as a `devDependency` in the `package.json`. + +### Breaking Changes + +#### iOS specific + +- Replace `flipper_post_install` with `react_native_post_install` hook. Will automatically detect if Flipper is enabled. ([42dde12aac](https://github.com/facebook/react-native/commit/42dde12aac81208c4e69da991f4e08b9e62d18f6) by [@grabbou](https://github.com/grabbou)) + +### Added + +- Add `onPressIn` & `onPressOut` props to Text ([1d924549ca](https://github.com/facebook/react-native/commit/1d924549cad75912191005c8f68dd73e15b07183) by [@adrienharnay](https://github.com/adrienharnay)) +- Stabilize `RootTagContext`. And temporarily export both `unstable_RootTagContext` and `RootTagContext` ([9d489354ae](https://github.com/facebook/react-native/commit/9d489354ae373614b20cd91f588eb25743686ee0) by [@nadiia](https://github.com/nadiia)) +- Implement `sendAccessibilityEvent` in the React(Fabric/non-Fabric) renderer ([99b7052248](https://github.com/facebook/react-native/commit/99b7052248202cee172e0b80e7ee3dfb41316746) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Re-added `localeIdentifier` to `I18nManager` constants ([6b91ae73cd](https://github.com/facebook/react-native/commit/6b91ae73cdf096e15a3235ae76276f9d7fb12f7b) by [@acoates-ms](https://github.com/acoates-ms)) +- Add PressabilityPerformanceEventEmitter ([c4c0065b00](https://github.com/facebook/react-native/commit/c4c0065b0009ced0049c5abc4dddd327ac638928) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Added `displayName` to some RN contexts to make them more easy to differentiate when debugging. ([68a476103a](https://github.com/facebook/react-native/commit/68a476103a95be77f4fc7c582e52cc94946de1b4) by [@bvaughn](https://github.com/bvaughn)) +- Add `displayName` to `TouchableHighlight` and `TouchableOpacity` ([c4e40b81c0](https://github.com/facebook/react-native/commit/c4e40b81c01d061c189a7d28a4f56a588c3d1aea) by [@brunohkbx](https://github.com/brunohkbx)) +- Added context to URL's error messages when the feature is not implemented ([452240bafa](https://github.com/facebook/react-native/commit/452240bafa970578144aedaea0223e17863d2d26) by [@Crash--](https://github.com/Crash--)) +- Add a `stickyHeaderHiddenOnScroll` option to keep the sticky header hidden during scrolling down, and only slide in when scrolling up ([ffba25c648](https://github.com/facebook/react-native/commit/ffba25c648152021dd3fb9e79afd8cade7008d05)) +- Added `debugName` parameter to `renderApplication` to use as the display name for the React root tree ([eeb36f4709](https://github.com/facebook/react-native/commit/eeb36f470929c2fdd8e1ed69898a5ba9144b8715) by [@rubennorte](https://github.com/rubennorte)) +- Adding support for `cancelOnBackground` for UserFlow ([0d4985900b](https://github.com/facebook/react-native/commit/0d4985900b52d5def22fce4371c2259ee65368ee) by [@dmitry-voronkevich](https://github.com/dmitry-voronkevich)) +- Introducing RuntimeScheduler module ([eb13baf2a6](https://github.com/facebook/react-native/commit/eb13baf2a687b53dde04b9a336f18629d94f4b79) by [@sammy-SC](https://github.com/sammy-SC)) +- Roll out TurboModule Promise Async Dispatch ([5c4f145e33](https://github.com/facebook/react-native/commit/5c4f145e33d92969f8a86284360a5a2f09308500) by [@RSNara](https://github.com/RSNara)) + +#### Android specific + +- Add `getRecommendedTimeoutMillis` to AccessibilityInfo ([d29a7e7a89](https://github.com/facebook/react-native/commit/d29a7e7a89f4e5e3489e9723979426bb1b6f0674) by [@grgr-dkrk](https://github.com/grgr-dkrk)) +- TalkBack now announces "unselected" when changing `accessibilityState.selected` to false. ([73bc96ecf9](https://github.com/facebook/react-native/commit/73bc96ecf9a16d420533c12e9e1812ffe21c10a2) by [@yungsters](https://github.com/yungsters)) +- Fbjni version bump to 0.0.3 ([24f9f75bf6](https://github.com/facebook/react-native/commit/24f9f75bf66b8f32a117ba9f9dea3c65b35b1e00) by [@IvanKobzarev](https://github.com/IvanKobzarev)) +- Add `onFocus` and `onBlur` for Pressable on Android. ([cab4da7288](https://github.com/facebook/react-native/commit/cab4da728814bf9d3c0cc7c9921e982bfc090730)) +- Introduce API to allow applications to register `TurboModuleManagerDelegates` with `ReactInstanceManager` ([eb7e89e286](https://github.com/facebook/react-native/commit/eb7e89e2864e941b4a21d55a7403a6028e9a26a2) by [@RSNara](https://github.com/RSNara)) +- Added convenience methods to simplify native Event classes and ease migrations ([72d0ddc16f](https://github.com/facebook/react-native/commit/72d0ddc16f2f631003c3486e0a59e50c145ec613) by [@JoshuaGross](https://github.com/JoshuaGross)) + +#### iOS specific + +- High contrast dynamic color options for dark and light mode. ([4b9d9dda27](https://github.com/facebook/react-native/commit/4b9d9dda270acd4e0314f40490c699ffd0f6e30e) by [@birkir](https://github.com/birkir)) +- Adds an ability to retrieve the notifications authorization status from JavaScript side. ([b86e52a9ec](https://github.com/facebook/react-native/commit/b86e52a9ec9ec828388eb4a717a3782a54c7b3d9)) +- Added reset method to `RCTFabricSurface` to help with reloads ([53858ceaa3](https://github.com/facebook/react-native/commit/53858ceaa3beab02726b1bd6e125e506477d445e) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Allow `RCTRootView` to be initialized with a frame ([00bc09c8f7](https://github.com/facebook/react-native/commit/00bc09c8f76879eb1f9a92a6a643191da9355de8) by [@appden](https://github.com/appden)) +- Allow for configuring the `NSURLSessionConfiguration` ([58444c74f5](https://github.com/facebook/react-native/commit/58444c74f5c18b74e88a6c1cd0f059fe434c1a21) by [@hakonk](https://github.com/hakonk)) +- Use react-native-codegen in iOS app template ([e99b8bbb40](https://github.com/facebook/react-native/commit/e99b8bbb404f8cd1f11b6c7998083be530d7b8a4) by [@hramos](https://github.com/hramos)) + +### Changed + +- Bump Flipper + Bump hermes (#31872 by [@Titozzz](https://github.com/Titozzz)) +- Show warning when native module without `addListener` or `removeListeners` is passed to `NativeEventEmitter` ([114be1d217](https://github.com/facebook/react-native/commit/114be1d2170bae2d29da749c07b45acf931e51e2) by [@rubennorte](https://github.com/rubennorte)) +- Disable `accessibilityState` when the `TouchableWithoutFeedback` is `disabled`. ([697164077c](https://github.com/facebook/react-native/commit/697164077c362cfa9a384b0f4e246d6bd9c470ba) by [@carloscuesta](https://github.com/carloscuesta)) +- Upgraded `react-devtools-core dependency` to 4.12.0 ([5a2693d78f](https://github.com/facebook/react-native/commit/5a2693d78f1a886f0aa5b7f86830d3ddb54a57e9) by [@bvaughn](https://github.com/bvaughn)) +- Set disabled `accessibilityState` when `TouchableHighlight` is disabled ([f69e096bb4](https://github.com/facebook/react-native/commit/f69e096bb4df67474351786f674b1bb1e42d3363) by [@Naturalclar](https://github.com/Naturalclar)) +- Add checks and logs to for better error handling ([ea1f9531f0](https://github.com/facebook/react-native/commit/ea1f9531f00b5cd834e03f58cdfa117a93634624)) +- CreateAnimatedComponent: removed deprecated lifecycles usage ([ba61267015](https://github.com/facebook/react-native/commit/ba61267015567bf180dd3272a295dc262b3e2c97) by [@nadiia](https://github.com/nadiia)) +- Hide caret in the `TextInput` during test runs. ([397bfa6ad7](https://github.com/facebook/react-native/commit/397bfa6ad7dff71f4b6d27ac17acc76fe8a6bbb5) by [@nadiia](https://github.com/nadiia)) +- Use `usePressability` hook in TextInput ([c4aa411ee3](https://github.com/facebook/react-native/commit/c4aa411ee374f2320343b900f1f8b24a47b633c9) by [@nadiia](https://github.com/nadiia)) +- `Keyboard` no longer inherits from `NativeEventEmitter`, so it no longer implements `removeAllListeners`, and `removeSubscription`. ([1049835b50](https://github.com/facebook/react-native/commit/1049835b504cece42ee43ac5b554687891da1349) by [@yungsters](https://github.com/yungsters)) +- `AppState` no longer inherits from `NativeEventEmitter`, so it no longer implements `addListener`, `removeAllListeners`, and `removeSubscription`. ([6f22989e92](https://github.com/facebook/react-native/commit/6f22989e920246a2cd611b93e170024d89903027) by [@yungsters](https://github.com/yungsters)) +- `DevSettings` no longer inherits from `NativeEventEmitter` ([70cd569e7e](https://github.com/facebook/react-native/commit/70cd569e7e4cceac81023eae4ea5089cff2f9b59) by [@yungsters](https://github.com/yungsters)) +- LogBox will not initially collapse stack frames if every frame would be collapsed. ([88a41f180c](https://github.com/facebook/react-native/commit/88a41f180c315bc55e05d77ddc3fc671ad8630e6) by [@yungsters](https://github.com/yungsters)) +- Update package name warning of deprecated modules ([34e1b0ef98](https://github.com/facebook/react-native/commit/34e1b0ef981559adc09cd9f994bef9584f1c82b7) by [@Naturalclar](https://github.com/Naturalclar)) +- Update react-native-codegen to 0.0.7 ([cd6c9f3273](https://github.com/facebook/react-native/commit/cd6c9f3273fbe41052c4ec8512d3b1129daf149b) by [@Naturalclar](https://github.com/Naturalclar)) +- Update template devDependencies ([652e3953f4](https://github.com/facebook/react-native/commit/652e3953f48938580e1bf8ea1ba70105997e59d2) by [@Bardiamist](https://github.com/Bardiamist)) +- Don't minify JS bundle by default when using hermes ([1a67dda668](https://github.com/facebook/react-native/commit/1a67dda668c71d961a4bb3b0cdf6aa22c0e5c138) by [@janicduplessis](https://github.com/janicduplessis)) +- Migrate warnings in index.js to point to new lean core repos ([4421a64ac1](https://github.com/facebook/react-native/commit/4421a64ac1ea9df3827fb99194c8576a0750beab) by [@Naturalclar](https://github.com/Naturalclar)) +- Update Flipper to 0.93.0 ([06c33e9abe](https://github.com/facebook/react-native/commit/06c33e9abe6ed51b1c8bba03982ebce2b6da3860) by [@mweststrate](https://github.com/mweststrate)) +- Update Flipper to 0.91.1, fixed iOS build support for i386, `use_flipper!()` will no longer need custom overrides to build with XCode 12.5 ([4246c75d0d](https://github.com/facebook/react-native/commit/4246c75d0d5b9dccbe0fd5ecec66b4cc0331f815) by [@mweststrate](https://github.com/mweststrate)) +- Find node on m1 via homebrew node managers ([4d40b53c12](https://github.com/facebook/react-native/commit/4d40b53c12c8ad52760c63cacde417ee876bdfb1) by [@danilobuerger](https://github.com/danilobuerger)) +- Clean up EventObjectPropertyType ([0e46080847](https://github.com/facebook/react-native/commit/0e46080847595fb7577b18042c932db958bc0959) by [@RSNara](https://github.com/RSNara)) +- `Appearance.addChangeListener` now returns an `EventSubscription`. ([305b4253c2](https://github.com/facebook/react-native/commit/305b4253c2a9ed4d71be33e02cb12b6d570e2fb1) by [@yungsters](https://github.com/yungsters)) +- `Dimensions.addEventListener` now returns an `EventSubscription`. ([c47a03563d](https://github.com/facebook/react-native/commit/c47a03563db72d1580bf87b7729bd22ce6ca63dd) by [@yungsters](https://github.com/yungsters)) +- Updated react-native-community/cli to v6 (hence updating metro to 0.66) ([0d32aef3aa](https://github.com/facebook/react-native/commit/0d32aef3aa9a75b00d99503b8e4f502c52380dea) by [@Titozzz](https://github.com/Titozzz)) +- Reflect Hermes release version from HermesBadge ([c54aeccf1a](https://github.com/facebook/react-native/commit/c54aeccf1a8e16240e400d783dda5ec07fcf3808) by [@Huxpro](https://github.com/Huxpro)) + +#### Android specific + +- Modified `NativeEventEmitter` to also use the passed native module to report subscriptions on Android ([f5502fbda9](https://github.com/facebook/react-native/commit/f5502fbda9fe271ff6e1d0da773a3a8ee206a453) by [@rubennorte](https://github.com/rubennorte)) +- RefreshControl.size prop changed its type to string, the valid values are: 'default' and 'large' ([dd60414578](https://github.com/facebook/react-native/commit/dd604145781ac07c8db8d9100043bd76f6d6e913), [65975dd28d](https://github.com/facebook/react-native/commit/65975dd28de0a7b8b8c4eef6479bf7eee5fcfb93) by [@mdvacca](https://github.com/mdvacca)) +- TouchableNativeFeedback: sync disabled prop with accessibilityState ([88f2356eed](https://github.com/facebook/react-native/commit/88f2356eedf71183d02cde0826c8a0c6910f83dd) by [@kyamashiro](https://github.com/kyamashiro)) +- Rename `hasActiveCatalystInstance` to `hasActiveReactInstance` ([dfa8eb0558](https://github.com/facebook/react-native/commit/dfa8eb0558338f18ea01f294a64d355f6deeff06)) +- Record latest error type in dev support ([423453e105](https://github.com/facebook/react-native/commit/423453e1050c9aedda2df050a5ee6d40e7c82031)) +- Passing accessibility state in button so it can announce disabled in talkback ([5889cbebe3](https://github.com/facebook/react-native/commit/5889cbebe392dd19c6ce0cfd5fa1f725ece1060a) by [@huzaifaaak](https://github.com/huzaifaaak)) +- Fixed issue that causes HorizontalScrollView to shift to the right when a TextInput is selected and keyboard pops up ([b9b23e1ab1](https://github.com/facebook/react-native/commit/b9b23e1ab138189d2a4c22b13ba6ad8f8957579e) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Fixed jumpy RTL horizontal ScrollViews. If you have Android-specific JS hacks for handling RTL in ScrollViews, you probably can/probably want to remove them, because they should be reliable now and require fewer hacks. ([fc032cd8d8](https://github.com/facebook/react-native/commit/fc032cd8d889d828edad3ea4b735205092cf0d40) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Add a new check to avoid calling this method ([2b708560fc](https://github.com/facebook/react-native/commit/2b708560fc002c26f0b09f09cfa451827a3425ac)) +- Clipping subviews has been temporarily disabled in HorizontalScrollView in RTL mode. Minor/negligible perf impact. ([da8ed6b625](https://github.com/facebook/react-native/commit/da8ed6b6252fd53a83f14ab6da7e9b467f12ffe1) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Change StatusBar style handling strategy ([7324b92dc4](https://github.com/facebook/react-native/commit/7324b92dc45679d3b38526378b7d3e78ad082641)) +- Clean listeners during destroy of `ReactContext` ([d79212120b](https://github.com/facebook/react-native/commit/d79212120b7168015d3d0225ef372ed851a230fa) by [@mdvacca](https://github.com/mdvacca)) +- Bump buildToolsVersion to 30.0.2, ([5d01110b53](https://github.com/facebook/react-native/commit/5d01110b5370f884907b6dbdc56773f03518a54d) by [@dulmandakh](https://github.com/dulmandakh)) +- Initial replacement of jcenter with mavenCentral. ([704dd2812f](https://github.com/facebook/react-native/commit/704dd2812f7b8c79971274cc9e4c717e56847ac0) by [@ShikaSD](https://github.com/ShikaSD)) +- Remove developer tool guard for android ([c7d28bca30](https://github.com/facebook/react-native/commit/c7d28bca308c1654c576df9a0328a3116ed65d54)) +- Bump Android compileSdkVersion and targetSdkVersion from 29 to 30 ([55c8833817](https://github.com/facebook/react-native/commit/55c8833817c3e9cf9882a712c8b9946a262df231), [c7efd5b369](https://github.com/facebook/react-native/commit/c7efd5b369aa7605a1017791440735ab72bc9fa8) by [@mdvacca](https://github.com/mdvacca)) +- Upgrade jsc-android to 250230.2.1 ([341f061ce3](https://github.com/facebook/react-native/commit/341f061ce3ae057f3a958654e0ec3a9c4c8211ad) by [@Kudo](https://github.com/Kudo)) +- Bump Gradle to 6.9, Android Gradle Plugin to 4.2.1 ([547b4c92e4](https://github.com/facebook/react-native/commit/547b4c92e4743f5b5816297f48a608ace9de6bb5) by [@dulmandakh](https://github.com/dulmandakh)) +- Bump gradle wrapper to 6.8.3 ([7258afeea3](https://github.com/facebook/react-native/commit/7258afeea38949dc408c0af79924f6f36f7ade84) by [@dulmandakh](https://github.com/dulmandakh)) +- Bumping OkHttp from 4.9.0 to 4.9.1. ([6caec9d91f](https://github.com/facebook/react-native/commit/6caec9d91fe71bcd80d670218d752c4f251bde81) by [@gedeagas](https://github.com/gedeagas)) +- Bumping OkHttp from v3 to v4. ([8207e97f91](https://github.com/facebook/react-native/commit/8207e97f9174a04e319431193c0f63d47a093c44) by [@arazabishov](https://github.com/arazabishov)) +- Update Okhttp to version 3.14.19 ([6bfd89d277](https://github.com/facebook/react-native/commit/6bfd89d27724f2aac602fa2acbf4753950f4152e) by [@LukasFPV](https://github.com/LukasFPV)) +- Bump Fresco to 2.5.0 ([8fa8934011](https://github.com/facebook/react-native/commit/8fa8934011e4d9f1f7a49c8519fcc97f30a5c74b) by [@dulmandakh](https://github.com/dulmandakh)) +- Bump Fresco to 2.3.0 ([280f524b49](https://github.com/facebook/react-native/commit/280f524b491e7a36bb9f9a26e354bb8e125375ed) by [@dulmandakh](https://github.com/dulmandakh)) + +#### iOS specific + +- Give RCTNetworking handler provider block RCTModuleRegistry ([4c5182c1cc](https://github.com/facebook/react-native/commit/4c5182c1cc8bafb15490adf602c87cb5bf289ffd) by [@RSNara](https://github.com/RSNara)) +- Give RCTImageURLLoader's loader/decoder provider blocks RCTModuleRegistry ([af6bcfa3ab](https://github.com/facebook/react-native/commit/af6bcfa3ab0ef6e1b0f669dda6cd7d6a5e8975ba) by [@RSNara](https://github.com/RSNara)) +- Make RCTTurboModule `getTurboModule`: required ([e0b8f5080f](https://github.com/facebook/react-native/commit/e0b8f5080f814ba2a75807ed6d7f2944aab98d7e) by [@RSNara](https://github.com/RSNara)) +- Update React.podspec to require cocoapods >= 1.10.1 ([b50b7e3a19](https://github.com/facebook/react-native/commit/b50b7e3a191dfa95aa122c259e0df8699cbaccae) by [@sunnylqm](https://github.com/sunnylqm)) +- Fix glog pod install with Xcode 12 ([8a5fd8ea95](https://github.com/facebook/react-native/commit/8a5fd8ea95678a0b4423db2cbcbefc1a33595813) by [@dulmandakh](https://github.com/dulmandakh)) +- Only show Dev Menu on shake if RN view is visible ([7186c4de4f](https://github.com/facebook/react-native/commit/7186c4de4fc76e87fa1386f2839f178dd220a02b) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- `progressViewOffset` prop of `RefreshControl` and `VirtualizedList` now works on iOS ([310a6bcf4b](https://github.com/facebook/react-native/commit/310a6bcf4ba7ca162d3ba1c03e0ab07ff41f9ead) by [@davidbiedenbach](https://github.com/davidbiedenbach)) +- Roll out TurboModule block copy ([5275895af5](https://github.com/facebook/react-native/commit/5275895af5136bc278c0c5eb07ae93e395c5b29b) by [@RSNara](https://github.com/RSNara)) +- Add instructions to template/ios/Podfile for enabling hermes ([a326a30e32](https://github.com/facebook/react-native/commit/a326a30e322f6cdff880734aafe965b299febb8d) by [@SConaway](https://github.com/SConaway)) + +### Deprecated + +- `EventEmitter#removeSubscription` is now deprecated. ([cb6cbd12f8](https://github.com/facebook/react-native/commit/cb6cbd12f80152b4ce742f37e2e6eefadf89d927) by [@yungsters](https://github.com/yungsters)) +- It is now deprecated to pass a constructor argument to `EventEmitter(...)`. ([14f7a2b707](https://github.com/facebook/react-native/commit/14f7a2b70754c92804d746959d1ff091bf49af69) by [@yungsters](https://github.com/yungsters)) +- Deprecate `AccessibilityInfo.removeEventListener`. ([003d63d6e5](https://github.com/facebook/react-native/commit/003d63d6e501411f870ff5dbef819ad2aca20974) by [@yungsters](https://github.com/yungsters)) +- Deprecate `Linking.removeEventListener`. Instead, call `remove()` on the subscription returned by `Linking.addEventListener`. ([6d1aca806c](https://github.com/facebook/react-native/commit/6d1aca806cee86ad76de771ed3a1cc62982ebcd7), [035718ba97](https://github.com/facebook/react-native/commit/035718ba97bb44c68f2a4ccdd95e537e3d28690c) by [@yungsters](https://github.com/yungsters)) +- Old Native method to create ScrollEvent has been deprecated and will be removed at some point in the (distant) future ([62f0dee235](https://github.com/facebook/react-native/commit/62f0dee2353b14ce1524dc62de5e1d2f1883a089) by [@JoshuaGross](https://github.com/JoshuaGross)) + +#### Android specific + +- Deprecate `NativeModule.onCatalystInstanceDestroy()` for `NativeModule.invalidate()` ([18c8417290](https://github.com/facebook/react-native/commit/18c8417290823e67e211bde241ae9dde27b72f17) by [@RSNara](https://github.com/RSNara)) +- Mark `hasActiveCatalystInstance()` as Deprecated ([1b50722a7e](https://github.com/facebook/react-native/commit/1b50722a7e84cd8acffd3f0f84d77057e1e0d955)) + +### Removed + +- Stabilize `RootTagContext` ([9b98edcd01](https://github.com/facebook/react-native/commit/9b98edcd0155a4a8a1f71d19e565c485910a6137) by [@nadiia](https://github.com/nadiia)) +- Removed `getNode()` from animated component refs. ([b914153286](https://github.com/facebook/react-native/commit/b914153286ea537d4a57ff934e63e07172c576a0) by [@yungsters](https://github.com/yungsters)) +- Remove legacy context API usage in AppContainer ([17be3a0032](https://github.com/facebook/react-native/commit/17be3a0032c181a100efc7af17b7366a3d636c52) by [@nadiia](https://github.com/nadiia)) +- Removed `AccessibilityInfo.fetch`, use `isScreenReaderEnabled` instead. ([d831134d51](https://github.com/facebook/react-native/commit/d831134d514c5db6be1ee35cc7e9994b777179c1) by [@yungsters](https://github.com/yungsters)) +- Remove unused VR-only props ([95f7c791c5](https://github.com/facebook/react-native/commit/95f7c791c56b527dadbe0b4ec7a1be5af12d7afe) by [@Simek](https://github.com/Simek)) +- Removed `RCTDeviceEventEmitter.sharedSubscribers`. ([3af0c84aa5](https://github.com/facebook/react-native/commit/3af0c84aa5d1633f058ea3e7aef0d125fe33e01d) by [@yungsters](https://github.com/yungsters)) +- Moved `ScrollResponder.Mixin` methods into ScrollView to Remove ScrollResponder.js ([099f67cf8a](https://github.com/facebook/react-native/commit/099f67cf8aa290592092cfa0cb4e938d0543b696) by [@kacieb](https://github.com/kacieb)) +- `NativeEventEmitter` no longer inherits from `EventEmitter`, so it no longer implements `removeListener` and `removeSubscription`. Instead, use the `remove()` method on the subscription object returned by `addListener`. ([d39643b9de](https://github.com/facebook/react-native/commit/d39643b9de11c6b44984166ede34a7f44de76fe5) by [@yungsters](https://github.com/yungsters)) +- `RCTDeviceEventEmitter` no longer throws for `StatusBar`, `Keyboard`, and `AppState` events. However, you are still recommended to use the more appropriate modules for listening to these events. ([c8c975f0d7](https://github.com/facebook/react-native/commit/c8c975f0d7b8a57e9e90373a2be4d630ed9dd65e) by [@yungsters](https://github.com/yungsters)) +- Removed second optional argument of `NativeEventEmitter` constructor ([f5f47879b8](https://github.com/facebook/react-native/commit/f5f47879b8320a9934914cb8ce7a72269840a83a) by [@yungsters](https://github.com/yungsters)) +- Removed warning on Android for `setTimeout` with delays greater than 1 minute. ([480dabd665](https://github.com/facebook/react-native/commit/480dabd66547a60522249eda203a3eb1934b02e5) by [@yungsters](https://github.com/yungsters)) +- Removed `Touchable.TOUCH_TARGET_DEBUG` property. ([ef765d423c](https://github.com/facebook/react-native/commit/ef765d423cb188957a9fb2fd92c62b0efe8a36a6) by [@yungsters](https://github.com/yungsters)) + +#### Android specific + +- Remove okhttp3 proguard rules ([b4c9f13fe7](https://github.com/facebook/react-native/commit/b4c9f13fe794283d76766c1baef87888d174cb1c) by [@doniwinata0309](https://github.com/doniwinata0309)) +- Remove filter pills ([5cf4ab8dd2](https://github.com/facebook/react-native/commit/5cf4ab8dd28b5a336d7af29d295ede51f0d19587) by [@suminkimm](https://github.com/suminkimm)) +- Remove `ReactFragmentActivity` class. ([2798e7172b](https://github.com/facebook/react-native/commit/2798e7172b01b9e2dbe2937d0163f98ab29230cf) by [@dulmandakh](https://github.com/dulmandakh)) +- Remove jcenter ([70da640946](https://github.com/facebook/react-native/commit/70da64094608f5f2e3c554ed719e9aad624e3459) by [@dulmandakh](https://github.com/dulmandakh)) + +#### iOS specific + +- Removed event methods except `addListener` from `Networking` ([a81b7d18fa](https://github.com/facebook/react-native/commit/a81b7d18fa65a727539c6c7ea17f787673d3c889) by [@yungsters](https://github.com/yungsters)) +- Delete deprecated "live reloading" setting ([b512beb0c4](https://github.com/facebook/react-native/commit/b512beb0c497158f9c861fcc16af960655b1feb5) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Remove iOS10/tvOS10 support ([f2c6279ca4](https://github.com/facebook/react-native/commit/f2c6279ca497b34d5a2bfbb6f2d33dc7a7bea02a), [a1d626739d](https://github.com/facebook/react-native/commit/a1d626739d95d6cbbb1be169b93952cdd1465486) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Remove iOS10/tvOS10 support from remaining podfiles ([f0faa7843c](https://github.com/facebook/react-native/commit/f0faa7843c5a0e9041edb6e77fd6631335ab2b12) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Delete RCTTurboModuleManagerDelegate `getTurboModule:initParams` ([c4c34a1237](https://github.com/facebook/react-native/commit/c4c34a1237ec584c667c62358dc577174bf11033) by [@RSNara](https://github.com/RSNara)) + +### Fixed + +- Don't disconnect DevTools WebSocket connection on Cmd+D ([60a18c138c](https://github.com/facebook/react-native/commit/60a18c138c51d3adcfeba7785315fc222cdfeb35) by [@bvaughn](https://github.com/bvaughn)) +- For native components that accept color arrays, invalid elements will now fallback to transparent with a console error. ([bb6cd56fae](https://github.com/facebook/react-native/commit/bb6cd56fae4118f44ae47fd6978710a22f9e1510) by [@yungsters](https://github.com/yungsters)) +- Fixes usage of std::thread in runtime executor ([75d9ba733f](https://github.com/facebook/react-native/commit/75d9ba733f4a041e4320098b52903f69747df02b) by [@asklar](https://github.com/asklar)) +- Fix sticky header not sticking on first render in ScrollView ([921c9ff165](https://github.com/facebook/react-native/commit/921c9ff165d47a73e9978df918b1761b95f9979d) by [@kacieb](https://github.com/kacieb)) +- Fix ScrollView `getInnerViewNode` and `getInnerViewRef` ref methods ([6e36d046a3](https://github.com/facebook/react-native/commit/6e36d046a313c7961cc2f91e0422f4bf29005eb6) by [@vshab](https://github.com/vshab)) +- Fix stalling UI due to a bug in KeyboardAvoidingView ([67309277fe](https://github.com/facebook/react-native/commit/67309277fe588c4dd64fe0c680d1d00d2f3fb2b6) by [@sammy-SC](https://github.com/sammy-SC)) +- Avoid eating clicks/taps into ScrollView when using physical keyboard ([6d2a527984](https://github.com/facebook/react-native/commit/6d2a5279841886a9a14f82057202bf8950c3f917) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix nested FlatList not firing `onScrollDragEnd` and `onMomentum` methods ([46be292f67](https://github.com/facebook/react-native/commit/46be292f671c70aac4ecc178c96e3a2a6a3d16da) by [@kacieb](https://github.com/kacieb)) +- Fix race condition in Debug Inspector shutdown ([d021000b9e](https://github.com/facebook/react-native/commit/d021000b9e358a9379ca5d6208f24757c0c8ce97) by [@MartinSherburn](https://github.com/MartinSherburn)) +- Fixes layout of nodes with `YGDisplayNone` and `YGPositionTypeAbsolute` ([b15f8a30e7](https://github.com/facebook/react-native/commit/b15f8a30e75b54a8de5cc9456aaa07ebe8d8a176) by [@rozele](https://github.com/rozele)) +- Fix changes of View visibilities ([4076293aa1](https://github.com/facebook/react-native/commit/4076293aa1059005704576530d8fe948b85e6a6d) by [@mdvacca](https://github.com/mdvacca)) +- Fix: save connection url as class variable ([8facc865ab](https://github.com/facebook/react-native/commit/8facc865ab2ec032da34f6f755ee8870ee4741aa) by [@sirpy](https://github.com/sirpy)) +- Fix Hermes build on folly version 2021.04.26.00 ([8eceee744e](https://github.com/facebook/react-native/commit/8eceee744ed9fee1eb2402f6b13bb606f6046f62) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Fix disabled handling for Text ([33ff4445dc](https://github.com/facebook/react-native/commit/33ff4445dcf858cd5e6ba899163fd2a76774b641) by [@lunaleaps](https://github.com/lunaleaps)) +- Fix disabled prop not disabling onPress for voice assistant ([1c7d9c8046](https://github.com/facebook/react-native/commit/1c7d9c8046099eab8db4a460bedc0b2c07ed06df) by [@kacieb](https://github.com/kacieb)) +- Fix unsafe cast and detect overflow in MapBuffer. ([e69f1c9f50](https://github.com/facebook/react-native/commit/e69f1c9f50c64bfcaeb684d763f02b9ccadec960)) +- Fix(deps): bump metro to 0.66.2 + dedup ([e40f58272d](https://github.com/facebook/react-native/commit/e40f58272d51a40e7b5fa77c14767ddaf9ecc006) by [@Titozzz](https://github.com/Titozzz)) + +#### Android specific + +- Fixed crash when using style `borderRadius: any` with `backgroundColor: null` ([42b6e6682c](https://github.com/facebook/react-native/commit/42b6e6682ce0fa9ac6eb5c1bf8ef0c224d2d80c0)) +- Fix font weight numeric values ([3827ca6171](https://github.com/facebook/react-native/commit/3827ca61714b699c866e17d58b4697dde86e3d00) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fix wrong ripple color on Switch component ([1b0683533a](https://github.com/facebook/react-native/commit/1b0683533a07aa8875b4d494d8c2a3d18ef69438) by [@rnike](https://github.com/rnike)) +- Fix Selected State does not announce when TextInput Component selected on Android ([7ee2acc6c8](https://github.com/facebook/react-native/commit/7ee2acc6c84c9ea6a51908495a6f14a26f346b29) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fix layout bug in ReactTextView. ([dec1b6ba15](https://github.com/facebook/react-native/commit/dec1b6ba15df8f255d30b696a7c08ef543d1d19c)) +- Fix source build on Windows machines vol. 2 ([c37d49492b](https://github.com/facebook/react-native/commit/c37d49492b20c3815ca10133f971755f659b1b6a)) +- Make NativeModules immediately initializable ([2bf866e401](https://github.com/facebook/react-native/commit/2bf866e4018ea72c1f1c92c806db85378c801fb7) by [@RSNara](https://github.com/RSNara)) +- Restore `android_hyphenationFrequency` on `Text`. ([1433ed6333](https://github.com/facebook/react-native/commit/1433ed6333162189730d6f92cf80f3077ac69120) by [@yungsters](https://github.com/yungsters)) +- Display the `testID` as the `resource-id` for black-box testing frameworks ([381fb395ad](https://github.com/facebook/react-native/commit/381fb395ad9d2d48717a5d082aaedbecdd804554) by [@jdeff](https://github.com/jdeff)) +- Fix support for blobs larger than 64 KB ([f00e348ca7](https://github.com/facebook/react-native/commit/f00e348ca7f031c3577b1335a3163bc3e4eb4b41) by [@tomekzaw](https://github.com/tomekzaw)) +- Fix building React Android on Windows. ([5dc15222b2](https://github.com/facebook/react-native/commit/5dc15222b256e32517df553c5fe7f6f5b7d0d31f)) +- Fix race-condition on the initialization of ReactRootViews ([74a756846f](https://github.com/facebook/react-native/commit/74a756846fdab1ef7d183c4df3069a23fcd0d49e) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- Animated images without loop no longer animate twice ([17aa1e320e](https://github.com/facebook/react-native/commit/17aa1e320e75393d46a54ec0fee8b068eeef142f) by [@comvenger-brandon](https://github.com/comvenger-brandon)) +- Allow PlatformColor to work with border colors ([c974cbff04](https://github.com/facebook/react-native/commit/c974cbff04a8d90ac0f856dbada3fc5a75c75b49) by [@danilobuerger](https://github.com/danilobuerger)) +- RCTSurfaceHostingView default background color is now consistent with RCTRootView ([f31497354b](https://github.com/facebook/react-native/commit/f31497354b72ad51b452a4b8bd3b70de16830025) by [@fkgozali](https://github.com/fkgozali)) +- Invalidate TurboModules with infra-generated method queues on their method queues ([497eb578ab](https://github.com/facebook/react-native/commit/497eb578ab32614744a4ef61d7a6bca0d4251885) by [@RSNara](https://github.com/RSNara)) +- Fix RefreshControl layout when removed from window ([e67811e7a6](https://github.com/facebook/react-native/commit/e67811e7a6df0937ed61d3367ab10fab95b31bfa) by [@janicduplessis](https://github.com/janicduplessis)) +- Tab Accessibility Role had incorrect localization string ([80a10953f9](https://github.com/facebook/react-native/commit/80a10953f9de8cc251e9b8c1e59a173af87febb9) by [@adkenyon](https://github.com/adkenyon)) +- Incorrect ScrollView offset on update ([a4526bcc3f](https://github.com/facebook/react-native/commit/a4526bcc3f89f5b9d3f86c814ade8f55c86e819e) by [@rnike](https://github.com/rnike)) +- Modal's `onDismiss` prop will now be called successfully. ([d85d5d2e19](https://github.com/facebook/react-native/commit/d85d5d2e1974b463318e4c86da29a5ccdd60a977) by [@kkoudev](https://github.com/kkoudev)) +- Fix DatePicker sizing issue ([84d55868e8](https://github.com/facebook/react-native/commit/84d55868e8b4e5a555d324c6162b8e38571524d8) by [@sammy-SC](https://github.com/sammy-SC)) +- First press not working after pull to refresh ([c4950610e4](https://github.com/facebook/react-native/commit/c4950610e40f2019c828bc99e29769cd4089c217) by [@rnike](https://github.com/rnike)) +- Fix Codegen silently failing when Yarn is not installed, or when Yarn v2 is active. ([07e4953514](https://github.com/facebook/react-native/commit/07e4953514636aaadc5915944cc64c12028516f2) by [@ivanmoskalev](https://github.com/ivanmoskalev)) +- Make codegen more reliable on iOS ([12fccdeea3](https://github.com/facebook/react-native/commit/12fccdeea33324b8ddaa3ac0e2dbf81a44ca1eb2) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix crash in RCTCoreModulesClassProvider during quit ([2f62c2892d](https://github.com/facebook/react-native/commit/2f62c2892d9979f80752350d1b949f2770511956) by [@appden](https://github.com/appden)) +- Fix an issue calling stopSurface in bridgeless mode before surface is started ([81096901a8](https://github.com/facebook/react-native/commit/81096901a8a6da75744cef7b663ccea2ff9c4c09)) +- Move hermes to a separate podspec ([0959ff36d1](https://github.com/facebook/react-native/commit/0959ff36d1f3264e117021eb1999d0bdb71377c3) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix cli bundle platform for Mac Catalyst in `react-native-xcode.sh` ([b496a531e0](https://github.com/facebook/react-native/commit/b496a531e0b4b5d828077b0e7dff43dd28fed5eb) by [@robertying](https://github.com/robertying)) +- Fix `prefetchImageWithMetadata` redbox([f27e305056](https://github.com/facebook/react-native/commit/f27e305056152ff9ad7aeb9018bf289d51719eb9) by [@p-sun](https://github.com/p-sun)) +- Roll out RCTNetworking extraneous NativeModule call removal ([0e0d2e84f5](https://github.com/facebook/react-native/commit/0e0d2e84f56ea233e72d980ff6bd9797df250553) by [@RSNara](https://github.com/RSNara)) +- Fix Hermes + no Flipper build on Xcode 12.5 ([b9243e00e3](https://github.com/facebook/react-native/commit/b9243e00e30be057a45af6ed1916af4328c458e4) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Fix(hermes): fixed hermes build on iOS ([59abb5f378](https://github.com/facebook/react-native/commit/59abb5f378e116288cdea2f619de0c128bb0b0eb) by [@Titozzz](https://github.com/Titozzz)) +- Fix builds on Xcode 12.5 ([36b58a824e](https://github.com/facebook/react-native/commit/36b58a824ea20daa22fe7c528a3bf0ff4e6a4cb5) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Fix running React Native project with Xcode 12 in Release on iPhone Simulator ([fdcacd7f76](https://github.com/facebook/react-native/commit/fdcacd7f76ea8ca6dafda32ac431c8adc7bdad00) by [@grabbou](https://github.com/grabbou)) + +## v0.64.4 + +🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). + +### Fixed + +- Add an afterEvaluate to solve AGP 4.1.x configuration resolution ([667f1bd21a](https://github.com/facebook/react-native/commit/667f1bd21abfdda19e56f8bbf0520fddba3102ed) by [@cortinico](https://github.com/cortinico)) +- Force dependencies resolution to minor series for 0.64 ([a6a183ad81](https://github.com/facebook/react-native/commit/a6a183ad8106d67e3befce842138e82fb1e136fd) by [@kelset](https://github.com/kelset)) + +## v0.64.3 + +### Fixed + +- For Android, general fixes to Appearance API and also fixes AppCompatDelegate.setDefaultNightMode(). For iOS, now works correctly when setting window.overrideUserInterfaceStyle ([25a2c608f7](https://github.com/facebook/react-native/commit/25a2c608f790f42cbc4bb0a90fc06cc7bbbc9b95) by [@mrbrentkelly](https://github.com/mrbrentkelly)) + +## v0.64.2 + +### Changed + +- Find-node.sh supports Homebrew on M1 ([502b819049](https://github.com/facebook/react-native/commit/502b81904998b800f2d960bb4a8e244988c72958) by [@dulmandakh](https://github.com/dulmandakh)) +- Refactor UIManagerHelper.getUIManager to return null when there's no UIManager registered ([b0e8c1eac0](https://github.com/facebook/react-native/commit/b0e8c1eac0a9edda12ecfa264209a8b3222afe27) by [@mdvacca](https://github.com/mdvacca)) + +### Fixed + +- Fix ScrollViewStickyHeader to push up header above it ([d754bdefc6](https://github.com/facebook/react-native/commit/d754bdefc68ff757ac2b5a2ffa38d5aad234d484) by [@kacieb](https://github.com/kacieb)) + +#### Android specific + +- Font family is not apply when secureTextEntry is true ([cda77c77dd83cba07e6c2e56e938c3e4f7faf8fc](https://github.com/facebook/react-native/commit/cda77c77dd83cba07e6c2e56e938c3e4f7faf8fc) by [@hank121314](https://github.com/hank121314)) +- Dimension update events are now properly sent following orientation change ([a6a4d3365f17332e367c34357a07a73f97d6ec83](https://github.com/facebook/react-native/commit/a6a4d3365f17332e367c34357a07a73f97d6ec83) by [@ajpaulingalls](https://github.com/ajpaulingalls)) + +## v0.64.1 + +### Fixed + +#### iOS specific + +- Fixes to ensure Xcode 12.5 builds ([cf8a364767](https://github.com/facebook/react-native/commit/cf8a364767df830d7255339741350bb53ab1a68a), [1c4ac48a55](https://github.com/facebook/react-native/commit/1c4ac48a55cf0703f0c8a32cbb07474a2d126f3e) and [76f45d35e7](https://github.com/facebook/react-native/commit/76f45d35e710f84a1cc44c90bc128494bc4280ce) by [@kelset](https://github.com/kelset)) + +### Security + +- Update validateBaseUrl to use latest regex ([33ef82ce6d](https://github.com/facebook/react-native/commit/33ef82ce6dfd31e1f990d438c925a0e52723e16b) by [@FBNeal](https://github.com/FBNeal)) + +## v0.64.0 + +### Breaking + +- Enable `inlineRequires` by default in new projects' `metro.config.js`. Gives a performance benefit but slightly different JS execution order ([959365a902](https://github.com/facebook/react-native/commit/959365a90216ee14d0f8b5d2f4653a1ab4c10d7e) by [@GantMan](https://github.com/GantMan)) +- Minimum supported Node version changed to 12 ([4b92e2e53d](https://github.com/facebook/react-native/commit/4b92e2e53d9c79f5b5858b3eb0d1654da79a4a68) by [@safaiyeh](https://github.com/safaiyeh)) +- Remove deprecated `CameraRoll` API (deprecated in 0.61) ([824d3a9770](https://github.com/facebook/react-native/commit/824d3a977057b336d81237ec3cec3a49a9d5e34d) by [@seanyusa](https://github.com/seanyusa)) +- Remove deprecated `CheckBox` component (deprecated in 0.60) ([dff17effe5](https://github.com/facebook/react-native/commit/dff17effe54dc58dda19fcc81ebacbd8f46e9005) by [@poteto](https://github.com/poteto)) +- Removed `DEPRECATED_sendUpdatedChildFrames` prop from `ScrollView` component (deprecated in 0.47) ([345d0c1abb](https://github.com/facebook/react-native/commit/345d0c1abb1afe937a06982c4328caee57820832) by [@ZHUANGPP](https://github.com/ZHUANGPP)) +- On `Image`, `onLoad` event objects' `source.url` is now renamed to `source.uri`. ([74ab8f6e5a](https://github.com/facebook/react-native/commit/74ab8f6e5a61999f1132351ff52df43c91360a09) by [@yungsters](https://github.com/yungsters)) + +#### Android specific + +- Remove support of Android API levels 16 through 20. The new minSDK version will be 21+ moving forward. ([973198667d](https://github.com/facebook/react-native/commit/973198667d7bbbf3b5d8890fc0a53dc99d0bce18), [25a40cbc61](https://github.com/facebook/react-native/commit/25a40cbc61e6c718d8cdea6d67fd82c6309963b1), [f829722b54](https://github.com/facebook/react-native/commit/f829722b54b34f145c41a95edfa5b522c837f9fc), [b133427778](https://github.com/facebook/react-native/commit/b13342777856bc4024d8489de790e7f90cd6b33b), [9b34aa261c](https://github.com/facebook/react-native/commit/9b34aa261c272d96829c9a7d5b166594b3162f9d), and [79d0a7d711](https://github.com/facebook/react-native/commit/79d0a7d71119122d2a2b9954e6038bbee119b8fa) by [@mdvacca](https://github.com/mdvacca); [49f10fd2e5](https://github.com/facebook/react-native/commit/49f10fd2e526b64294777357ab2fef8880739f26) and [a17ff44adc](https://github.com/facebook/react-native/commit/a17ff44adcf003dd4e4ef2301e1f80b77913f712) by [@JoshuaGross](https://github.com/JoshuaGross); [dd4298a377](https://github.com/facebook/react-native/commit/dd4298a3770eee7f66846ef0cc4c41a628b7bf01) by [@safaiyeh](https://github.com/safaiyeh)) +- Fix ReadableArray null annotations. Possibly breaking change for Kotlin apps. ([d76556543f](https://github.com/facebook/react-native/commit/d76556543f96f4d739be3a708b8f6314bb32cc87) by [@dulmandakh](https://github.com/dulmandakh)) +- On `Image`, `onLoad` and `onError` event objects will no longer have an extra `uri` property. ([74ab8f6e5a](https://github.com/facebook/react-native/commit/74ab8f6e5a61999f1132351ff52df43c91360a09) by [@yungsters](https://github.com/yungsters)) +- Deletes the method PlayTouchSound method from UIManagerModule, this method was moved to the SoundManagerModule class. ([d0c4c5eaf9](https://github.com/facebook/react-native/commit/d0c4c5eaf90430c7004621d1596c5f2a55ad03e0) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- Remove `calculateChildFrames` from `RCTScrollView` ([62aa84a325](https://github.com/facebook/react-native/commit/62aa84a3257bd3c513df3fcb4b4eaa350ecf77bb) by [@PeteTheHeat](https://github.com/PeteTheHeat)) + +### Deprecated + +#### Android specific + +- Deprecated method `UIManagerModule.getUIImplementation`. This method will not be part of the new architecture of React Native. ([fe79abb32c](https://github.com/facebook/react-native/commit/fe79abb32ca3425ff689b7641d9200461ea8166d) by [@mdvacca](https://github.com/mdvacca)) + +### Added + +- Adds the Hermes runtime bytecode version number to the JS bundle requestURL. This allows Metro with Bytecode to work with prebuilt binaries. ([34c405462f](https://github.com/facebook/react-native/commit/34c405462f890afbccdfeaa7804791f7e9bcaa83)) +- TextInput now supports `onPressIn` and `onPressOut`. ([b7b0e23202](https://github.com/facebook/react-native/commit/b7b0e232028723794af4c79fc6366c483ae2350b) by [@yungsters](https://github.com/yungsters)) +- Allow setting a custom performance logger in XMLHttpRequest ([57b10f759e](https://github.com/facebook/react-native/commit/57b10f759efed786b46cfe082367f929aa2925d3) by [@rubennorte](https://github.com/rubennorte)) +- Add mock for `DevSettings` to jest preset ([a50f736bb6](https://github.com/facebook/react-native/commit/a50f736bb6ade9ea9caae45e41ca4b92f6707b17) by [@MarcoScabbiolo](https://github.com/MarcoScabbiolo)) +- Added Inspector overlay support for Pressable ([8ac467c51b](https://github.com/facebook/react-native/commit/8ac467c51b94c82d81930b4802b2978c85539925) by [@yungsters](https://github.com/yungsters)) +- Introduce NativeModulePerfLogger ([0486640571](https://github.com/facebook/react-native/commit/0486640571c89a0ce067c0437655a6b375308bcd) by [@RSNara](https://github.com/RSNara)) +- Add default `titlePlaceholder` in template configuration. ([8ffa180d80](https://github.com/facebook/react-native/commit/8ffa180d80b9c9acb76a0631b5a709d2c0adcd86) by [@Esemesek](https://github.com/Esemesek)) +- Modified `renderApplication` to forward `initialProps` to `WrapperComponent` ([4f5a092bf6](https://github.com/facebook/react-native/commit/4f5a092bf68a0cd825328ce4a1e6bb41a8fad2e3) by [@rubennorte](https://github.com/rubennorte)) +- Add warning to `VirtualizedList` when incorrectly using nested Lists or custom scroll components ([7f2515ece8](https://github.com/facebook/react-native/commit/7f2515ece8833f7a8adba025ef544013f89ae26f) by [@kacieb](https://github.com/kacieb)) +- Add native module for loading split JS bundles in development ([fca3a39da5](https://github.com/facebook/react-native/commit/fca3a39da5f1c31514e8969738e7b2c2d22bc230) by [@makovkastar](https://github.com/makovkastar)) +- Added `listenerCount()` to `DeviceEventEmitter` and `NativeEventEmitter`. ([b11d6ecbb8](https://github.com/facebook/react-native/commit/b11d6ecbb8bb2f0d6f423be6775e587f4e9b1c4d) by [@yungsters](https://github.com/yungsters)) + +#### Android specific + +- Upgrade Hermes to version 0.7 and turn on ES6 Proxy support ([776a415d98](https://github.com/facebook/react-native/commit/776a415d98dffd04b11200812a32204aa1c5e157) and [bb003816a3](https://github.com/facebook/react-native/commit/bb003816a389b8655c53fa34444417c14516459c) by [@Huxpro](https://github.com/Huxpro), [a28dd38909](https://github.com/facebook/react-native/commit/a28dd3890974d699070f08ab43781324411e6f5c) by [@janicduplessis](https://github.com/janicduplessis)) +- Add support for `shadowColor` on API level >= 28 ([cfa4260598](https://github.com/facebook/react-native/commit/cfa42605989eee5a9de42bdb1259fb7f4d9451fb) by [@IjzerenHein](https://github.com/IjzerenHein)) +- Add `android_hyphenationFrequency` prop to Text component ([0fda91ffff](https://github.com/facebook/react-native/commit/0fda91ffffa4972ebe58e3d0b610692a1286eaa1) and [7d8aeb4955](https://github.com/facebook/react-native/commit/7d8aeb4955a4101ca7e8e486f935309c21ab76ff) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Add `accessibilityHint` to TouchableNativeFeedback ([72285d808d](https://github.com/facebook/react-native/commit/72285d808dfce748287a19e2620d58517a5f76e7) by [@CMDadabo](https://github.com/CMDadabo)) +- Adds support for the `onProgress` event on `Image` ([fa0e6f8051](https://github.com/facebook/react-native/commit/fa0e6f8051d2208af467b789a2a9306ec7ddad76) by [@yungsters](https://github.com/yungsters)) +- ScrollView now supports `contentOffset` ([ed29ba13f9](https://github.com/facebook/react-native/commit/ed29ba13f97f240c91fdf6c0ef3fb601046697b9) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Add an explicit NDK version to Android template ([18ffe12203](https://github.com/facebook/react-native/commit/18ffe12203d03b4e960d61d7bb50cd02bba94663) by [@safaiyeh](https://github.com/safaiyeh)) +- Exposed `getFlex` method as part of ReactShadowNode API ([6570f7887b](https://github.com/facebook/react-native/commit/6570f7887b8824705ae09b5653d631428e17bc5f) by [@mdvacca](https://github.com/mdvacca)) +- Add `\*.hprof` files to gitignore ([69ce9c21d4](https://github.com/facebook/react-native/commit/69ce9c21d433a23ffb9934062b46fa64277ee255) by [@enesozturk](https://github.com/enesozturk)) +- Move `DevSettingsActivity` from main to debug ([d8e6c45782](https://github.com/facebook/react-native/commit/d8e6c45782a5c9132bb7ec315fe0b9ba3999e830) by [@invalid-email-address](https://github.com/invalid-email-address)) + +#### iOS specific + +- `PlatformColor`: add missing `clearColor` ([b7167c23fc](https://github.com/facebook/react-native/commit/b7167c23fc052f8d9f8c27a7f4ad9c5cdf51281e) by [@Simek](https://github.com/Simek)) +- Update template to Xcode 12 ([6685aba462](https://github.com/facebook/react-native/commit/6685aba462699c696cb6ac95626b9592deb292fc) by [@janicduplessis](https://github.com/janicduplessis)) +- Add `importantForAccessibility` to `AccessibilityProps` ([fd660fd0c5](https://github.com/facebook/react-native/commit/fd660fd0c50a0acca730bd1ecd427e574bbe81c7) by [@ZHUANGPP](https://github.com/ZHUANGPP)) +- Allow hotkeys to be used without command key ([f2b9ec7981](https://github.com/facebook/react-native/commit/f2b9ec798172db76dfb55f390e1fcea90dd341da) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Add `disableButtonsIndices` option to `ActionSheetIOS` component ([a7c1c5aff2](https://github.com/facebook/react-native/commit/a7c1c5aff24671bba609caeb82092a8de3d3b232) by [@lukewalczak](https://github.com/lukewalczak)) +- Add `showSoftInputOnFocus` to `TextInput` ([d54113d8c4](https://github.com/facebook/react-native/commit/d54113d8c4bcd0e0c7a09acca60819724eb69926) by [@gurs1kh](https://github.com/gurs1kh)) +- Added hostname to loading banner. ([96999339b6](https://github.com/facebook/react-native/commit/96999339b6a7aeabd0cd706ef7736fd91d9ecf80) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Allow iOS `PlatformColor` strings to be ObjC or Swift UIColor selectors ([25793eab56](https://github.com/facebook/react-native/commit/25793eab56217a9961620761ea65ec2fcb97dcb0) by [@tom-un](https://github.com/tom-un)) +- Add Dark Mode support to loading banner ([94c45af136](https://github.com/facebook/react-native/commit/94c45af136f44245b5f2e56bded60c8ebd9b1235) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Allow image loaders to enable/disable image telemetry ([e37708dfb6](https://github.com/facebook/react-native/commit/e37708dfb605dd9ee9f4b2dac5d841d98b7d376c) by [@p-sun](https://github.com/p-sun)) +- Add `RCTDevSplitBundleLoader` native module ([ad879e50bc](https://github.com/facebook/react-native/commit/ad879e50bcd51caca76b1073720f2b63df485ff1) by [@cpojer](https://github.com/cpojer)) + +### Changed + +- Update flipper to 0.75.1 ([3399896ae7](https://github.com/facebook/react-native/commit/3399896ae756719b238e837001077a46508849be) by [@janicduplessis](https://github.com/janicduplessis)) +- Refined Flow type for `Text` component. ([a911efaecd](https://github.com/facebook/react-native/commit/a911efaecd005237816ddb480218eb5388460d16) by [@yungsters](https://github.com/yungsters)) +- Changed type definition of IPerformanceLogger from object to interface ([b90f4d978f](https://github.com/facebook/react-native/commit/b90f4d978fa27e37926d9f4a1d13c9168243798c) by [@rubennorte](https://github.com/rubennorte)) +- Removed `fbjs` dependency from `react-native`. ([54e19a6b7f](https://github.com/facebook/react-native/commit/54e19a6b7f217ffc0611e660f2a6b1a8ad14775b) by [@yungsters](https://github.com/yungsters)) +- Refined `ImageSource` Flow type for array-variant and headers. ([a0dc252dc8](https://github.com/facebook/react-native/commit/a0dc252dc89699f7bd0d733642b98762d0db423a) by [@yungsters](https://github.com/yungsters)) +- Some warnings changed to use `console.warn` without the "Warning:" prefix. ([982272932c](https://github.com/facebook/react-native/commit/982272932cee3be599076bd18b290bc812285533) by [@yungsters](https://github.com/yungsters)) +- Core/Differ: detect and optimize reparenting ([1e4d8d902d](https://github.com/facebook/react-native/commit/1e4d8d902daca8e524ba67fc3c1f4b77698c4d08) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Improve "not a registered callable module" error message ([e27d656ef3](https://github.com/facebook/react-native/commit/e27d656ef370958c864b052123ec05579ac9fc01) by [@vonovak](https://github.com/vonovak)) +- Use `VirtualizedList`'s `onEndReachedThreshold` default value when null is provided ([10b4b9505a](https://github.com/facebook/react-native/commit/10b4b9505a51f8bf3fbc12d296a087b784a9201a) by [@fatalsun](https://github.com/fatalsun)) +- Migrate large amount of modules to flow strict and strict-local ([4409642811](https://github.com/facebook/react-native/commit/4409642811c787052e0baeb92e2679a96002c1e3) by [@rubennorte](https://github.com/rubennorte)) +- Enable exact objects by default in the project template Flow config ([050a7dd019](https://github.com/facebook/react-native/commit/050a7dd019be435b848de0a86030599d83f8791d) by [@rubennorte](https://github.com/rubennorte)) +- Minor fix in Hermes Inspector cli tool help message ([6ffb983f83](https://github.com/facebook/react-native/commit/6ffb983f83afdee5d9290c683c5060d2a959818d)) +- Updated the React Hooks ESLint Plugin in the community ESLint config ([ac87e90fa5](https://github.com/facebook/react-native/commit/ac87e90fa517676440c1adf9575cb48f90de8069) by [@gaearon](https://github.com/gaearon)) +- Don't scroll to `initialScrollIndex` if `contentOffset` is provided to the same `VirtualizedList` ([3346ac7f96](https://github.com/facebook/react-native/commit/3346ac7f96d2fd3f77dca5acb283b28e02ad21fa) by [@markv](https://github.com/markv)) +- Migrated `VirtualizedList` legacy context implementation to `React.Context`. ([7bd694fc6f](https://github.com/facebook/react-native/commit/7bd694fc6f4bb027b6d7ee04034cad41a43e5695) by [@yungsters](https://github.com/yungsters)) +- Changed Flow type of `BackHandler` to be more specific. ([a903d1b86a](https://github.com/facebook/react-native/commit/a903d1b86ab56163abcdcb584f335949ba0c85fc) by [@Naturalclar](https://github.com/Naturalclar)) +- Updated transitive dependency `kind-of` to 6.0.3 to resolve vulnerability ([abde0154ba](https://github.com/facebook/react-native/commit/abde0154ba4247d2c9f1451b5de8b3cba1abd316) by [@TheSavior](https://github.com/TheSavior)) +- Upgrade eslint-config dependencies. ([93019dc190](https://github.com/facebook/react-native/commit/93019dc19072776053a88f9ab595e435b83fead0) by [@wcandillon](https://github.com/wcandillon)) +- Upgrade to Jest 25 ([f248ba1c8b](https://github.com/facebook/react-native/commit/f248ba1c8b15a12a0c590ce8211855cde31defe8) by [@cpojer](https://github.com/cpojer)) +- Use `React.Children.count` for counting children of `TextInput` ([92160f3144](https://github.com/facebook/react-native/commit/92160f3144dcfa510ff14b5f2eb231643f107af9) by [@vonovak](https://github.com/vonovak)) +- Annotate components in QPL logging using ImageAnalyticsTagContext ([60b7a3085c](https://github.com/facebook/react-native/commit/60b7a3085c0d83c126023b98e666ecda6f769454) by [@p-sun](https://github.com/p-sun)) +- Upgrade to React 17 ([24bca492c3](https://github.com/facebook/react-native/commit/24bca492c349ab90d40f9444df0f477145a4c311) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Made promise polyfill conditionalized on Hermes ([0a28b34dac](https://github.com/facebook/react-native/commit/0a28b34dacb91a7e74cd5feec59cf8f8fb0487c9) by [@Huxpro](https://github.com/Huxpro)) +- Flow: Remove type union in PickeriOS/PickerNativeComponent ([3113e47b9b](https://github.com/facebook/react-native/commit/3113e47b9bc92e3b0efb96db776f650848093dfc) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Flow: export ColorValue from StyleSheet instead of StyleSheetTypes ([0a67133124](https://github.com/facebook/react-native/commit/0a6713312467d3f5b5dc993e91db9e7b1aa4fc8c)) +- Forward URL parameters from main bundle to hot reloaded bundles ([b4785e5144](https://github.com/facebook/react-native/commit/b4785e514430dc3ba45ed6d136ec63574be88e26) by [@motiz88](https://github.com/motiz88)) +- Add package name / bundle ID to bundle URL in development ([9b5359133b](https://github.com/facebook/react-native/commit/9b5359133b46b16be200e37dba0b03d82b73b4a0) by [@motiz88](https://github.com/motiz88)) + +#### Android specific + +- Bump Gradle Wrapper to 6.7 ([8988a073b4](https://github.com/facebook/react-native/commit/8988a073b48df0f0cd4a7126edf1a421f4537d58), [5bc67b658e](https://github.com/facebook/react-native/commit/5bc67b658e581e0176deb7ed95b51a5c1cbe65c2), and [3a8559b86c](https://github.com/facebook/react-native/commit/3a8559b86c3c0b0ab6d6c6904c6efd97ab2c7b38) by [@friederbluemle](https://github.com/friederbluemle); [e559aee642](https://github.com/facebook/react-native/commit/e559aee64275126eaa135486e6bf09138be70f4d) and [e9fd93f53f](https://github.com/facebook/react-native/commit/e9fd93f53f8b14f921578cd401b3a6529e4e0c9f) by [@dulmandakh](https://github.com/dulmandakh)) +- Bump Android Gradle Plugin to 4.1.0 ([cf8368f204](https://github.com/facebook/react-native/commit/cf8368f2046ae1ff0f6b02bb6857eeeff8f57d7d) and [553fb8b28d](https://github.com/facebook/react-native/commit/553fb8b28d0ad332d75a944d244832be3390b6ba) by [@friederbluemle](https://github.com/friederbluemle), [dfa9db49e3](https://github.com/facebook/react-native/commit/dfa9db49e34c6f54c04148b877de938bf103a059) by [@dulmandakh](https://github.com/dulmandakh)) +- Bump Okio to 1.17.5 ([1e78e0655d](https://github.com/facebook/react-native/commit/1e78e0655d53ac947f523bcadf9c5339ab07bbb8) by [@dulmandakh](https://github.com/dulmandakh)) +- Make Android versionCodeOverride for new apps using the template human-readable ([e1bf515ae8](https://github.com/facebook/react-native/commit/e1bf515ae8e77fb24f76037d9f22e903799fb637) by [@gedeagas](https://github.com/gedeagas)) +- Bump SoLoader to 0.9.0 ([7465239230](https://github.com/facebook/react-native/commit/7465239230881f453d64364d51272f28614c8653) by [@dulmandakh](https://github.com/dulmandakh)) +- Update Okhttp to version 3.12.12 ([0f6fcb2c27](https://github.com/facebook/react-native/commit/0f6fcb2c2788dc7150f6c3673a8f4f9d8f929441) by [@halaei](https://github.com/halaei)) +- Update Android build tools to 29.0.3 ([e629e94b46](https://github.com/facebook/react-native/commit/e629e94b466ebbd5924b1d4493c026004dad707d) by [@friederbluemle](https://github.com/friederbluemle)) +- ViewCommands on Android now execute earlier, as a perf optimization. ([c6b9cc36da](https://github.com/facebook/react-native/commit/c6b9cc36da4f7d190d05122048aa4ada9c152b73) by [@JoshuaGross](https://github.com/JoshuaGross)) +- Effect of `blurRadius` now more closely matches other platforms. ([64860972be](https://github.com/facebook/react-native/commit/64860972be828fb601acbef11b4c2dbc672dee8a) by [@yungsters](https://github.com/yungsters)) +- Migrate Android tests to Robolectric v4 ([6a78b32878](https://github.com/facebook/react-native/commit/6a78b32878aea1b0dac98ff36378fb9392d4aeb1) by [@jselbo](https://github.com/jselbo), [d373a8d88c](https://github.com/facebook/react-native/commit/d373a8d88c30af910133d97ae973d256c4479929) and [18f7abae07](https://github.com/facebook/react-native/commit/18f7abae07b8ea60c7530a5d9f34541c50f5edd9) by [@fkgozali](https://github.com/fkgozali)) +- Get ripple drawables by id instead of by name ([c8ed2dbbb2](https://github.com/facebook/react-native/commit/c8ed2dbbb287deed05a8782fb8665c1edf45bbac) by [@vonovak](https://github.com/vonovak)) +- `TextInput`: Set `caretHidden` default value to `true` on Xiaomi devices to fix the crash ([b5b4a70410](https://github.com/facebook/react-native/commit/b5b4a7041027fd767850a564b5d80fa4a98ba2a2)) +- Update loading banner text and colors ([6afc984e81](https://github.com/facebook/react-native/commit/6afc984e8187ac91f780f125dad4421576131c83) by [@makovkastar](https://github.com/makovkastar)) +- Declare all attrs used in res targets ([05abbd245c](https://github.com/facebook/react-native/commit/05abbd245c2326b12d24698bb13007a7ce11e586) by [@IanChilds](https://github.com/IanChilds)) + +#### iOS specific + +- Upgraded JSI with a new HERMES_ENABLE_BITCODE flag ([311d4e9ef0](https://github.com/facebook/react-native/commit/311d4e9ef080aa429f840236cc23c013c0ae644c) by [@grabbou](https://github.com/grabbou)) +- Remove main queue execution of constantsToExport in NativeModules ([d7ac21cec5](https://github.com/facebook/react-native/commit/d7ac21cec5492e180fbf3817af7be64ab121cb75) by [@RSNara](https://github.com/RSNara)) +- Updated loading banner messages and color ([3729fe8de0](https://github.com/facebook/react-native/commit/3729fe8de0109c80014f6c20fae8b949b3628de2) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Speed up loading banner animations ([3fb37b4326](https://github.com/facebook/react-native/commit/3fb37b4326090def3aea43bd8189a0df648ccb34) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Shrink loading bar down to not cover safe area. ([f0dfd35108](https://github.com/facebook/react-native/commit/f0dfd35108dd3f092d46b65e77560c35477bf6ba) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Build macOS framework and add CocoaPods podspec ([ffa3d7f638](https://github.com/facebook/react-native/commit/ffa3d7f638c820dc208320193e6ba65667d751eb) by [@alloy](https://github.com/alloy)) +- Set `NSAllowsArbitraryLoads` to `false` by default in template ([7b61a968fd](https://github.com/facebook/react-native/commit/7b61a968fd774a6ca2196a731b6cec4282ab25cc) by [@wddwycc](https://github.com/wddwycc)) + +### Removed + +- `Text.viewConfig` is no longer exported. ([06ce643565](https://github.com/facebook/react-native/commit/06ce64356594a921cd9ae4f71c15dd56dd0e53a3) by [@yungsters](https://github.com/yungsters)) +- Removed `once()` and `removeCurrentListener()` from `DeviceEventEmitter` and `NativeEventEmitter`. ([87a2e29f59](https://github.com/facebook/react-native/commit/87a2e29f5928c2e09ac9a98c54732d5f697d8e61) by [@yungsters](https://github.com/yungsters)) +- Removed tvOS related files from the template ([df03228a61](https://github.com/facebook/react-native/commit/df03228a61881cdfa520fa6d8a9d9cfb6e77fdde) by [@Naturalclar](https://github.com/Naturalclar)) + +#### Android specific + +- Remove undocumented ColorAndroid function ([411c344794](https://github.com/facebook/react-native/commit/411c3447946c18743476e7d613358233464d6f58) by [@tom-un](https://github.com/tom-un)) + +### Fixed + +- Fix handling of very deeply nested data across the bridge ([a8c90e6af4](https://github.com/facebook/react-native/commit/a8c90e6af4a4e5ac115016a3e8977ecff90e99a0) by [@mhorowitz](https://github.com/mhorowitz)) +- Prevent TypeError in TaskQueue when cancelling a started but not resolved promise. ([14042fb76f](https://github.com/facebook/react-native/commit/14042fb76fee3573529d590ec6f8ad216aa0b820) by [@robwalkerco](https://github.com/robwalkerco)) +- Fix typo in `ActionSheetManager` invariant message ([9c353b5ab0](https://github.com/facebook/react-native/commit/9c353b5ab060be9392a7aaf437bba4ffc56d78ca) by [@sweatherall](https://github.com/sweatherall)) +- `TouchableHighlight` now correctly fires `onPress` when pressed for >500ms, when `onLongPress` is not supplied. ([bdf3c79110](https://github.com/facebook/react-native/commit/bdf3c7911007f547101d753903da11ea4ee095f9) by [@yungsters](https://github.com/yungsters)) +- `Pressability` now consistently fires `onPressIn` and `onPressOut`, even without an `onPress`. ([0c392bc405](https://github.com/facebook/react-native/commit/0c392bc4052784de7497bf7b5eaf207b02409877) by [@yungsters](https://github.com/yungsters)) +- Remove extraneous argument for `onResponderGrant` Flow type on `Text`. ([49015b0f5b](https://github.com/facebook/react-native/commit/49015b0f5bda83794b88b17dd3cbd834fa235b72) by [@yungsters](https://github.com/yungsters)) +- Prevent `ScrollView` From Stealing Responder Capture When Using Physical Keyboard ([93e7a7a70d](https://github.com/facebook/react-native/commit/93e7a7a70dc2f41fccd3c1e4cce80d92913c4243) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix failure when debugging code in a browser; was caused by `performanceNow()` function. ([db474a47b7](https://github.com/facebook/react-native/commit/db474a47b70e4fa50f594f4dea8a2f531ca9fc07) by [@zerkella](https://github.com/zerkella)) +- Fix test renderer mocks to use the `displayName` more often. ([4b935ae95f](https://github.com/facebook/react-native/commit/4b935ae95f09e4a1eb1e5ac8089eb258222a0f8b) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Make sure `LogBox` is not included in production bundles ([d3b937f990](https://github.com/facebook/react-native/commit/d3b937f990012a31b8d917e220f4ed2f0a4fd2d3) by [@janicduplessis](https://github.com/janicduplessis)) +- Mark `force` as an optional property of the PressEvent object ([ad2f98df8f](https://github.com/facebook/react-native/commit/ad2f98df8f2ad8aff1dcdc11b187f35b372e3f0e) by [@Simek](https://github.com/Simek)) +- Fix invalid `event` objects from `onPressOut` in certain cases ([2c600b7c5a](https://github.com/facebook/react-native/commit/2c600b7c5a0e79bfc632b39b471e6ba774d7b0b3) by [@yungsters](https://github.com/yungsters)) +- When Hermes debugger is enabled continue to send log messages to the console ([77ef8f881f](https://github.com/facebook/react-native/commit/77ef8f881f2e4067894b412f308e2a80042c946f) by [@MartinSherburn](https://github.com/MartinSherburn)) +- Handle nullish `initialProps` correctly in `renderApplication` ([26c120c632](https://github.com/facebook/react-native/commit/26c120c6329d45e27318d82aaf5a50338bd6fa7d) by [@rubennorte](https://github.com/rubennorte)) +- Fix Flow type of Touchable{Opacity,Bounce,Highlight} being exported as `any` ([de7f69a58e](https://github.com/facebook/react-native/commit/de7f69a58ed4e18887f4b9d4d853293fb136afb7) by [@draperunner](https://github.com/draperunner)) +- Clarified the boundaries in error message of `scrollToIndex` ([78d2b3c813](https://github.com/facebook/react-native/commit/78d2b3c8138f54c2433958b0ad6b9f52ca59115a) by [@sasurau4](https://github.com/sasurau4)) +- Fix jsi cmake include dirs ([f5d00e5a29](https://github.com/facebook/react-native/commit/f5d00e5a2922d35a0b44935592da5700518c422b) by [@ryantrem](https://github.com/ryantrem)) +- Fix race condition in `KeyboardAvoidingView` ([b08fff6f86](https://github.com/facebook/react-native/commit/b08fff6f869e00c20c0dcdf7aca71284c2f276f0) by [@sammy-SC](https://github.com/sammy-SC)) +- Fix clone issue in YogaNodeJNIBase ([2707c17b07](https://github.com/facebook/react-native/commit/2707c17b0727f241d404f4a21090021c27c66f2c) by [@pasqualeanatriello](https://github.com/pasqualeanatriello)) +- Fix "Cannot read property 'getNativeScrollRef' of undefined" in createAnimatedComponent ([629e10e91b](https://github.com/facebook/react-native/commit/629e10e91b728c4251f1ed78a50df62820ce0dc4) by [@sammy-SC](https://github.com/sammy-SC)) + +#### Android specific + +- Fix App Bundle/Release build missing index.android.bundle with gradle plugin 4.1.0/gradle 6.5 ([53f55001af](https://github.com/facebook/react-native/commit/53f55001afbf07494de0df064a92dfdd42f37c98) by [@tomoima525](https://github.com/tomoima525)) +- Do not crash when `ScrollView` `snapToOffsets` array is empty ([d238da71aa](https://github.com/facebook/react-native/commit/d238da71aa8cdd7ce519de617a9a200406da794c) by [@makovkastar](https://github.com/makovkastar)) +- Fixed `TextInput` not being selectable in `removeClippedSubviews` FlatLists ([12a50c0a44](https://github.com/facebook/react-native/commit/12a50c0a442b78d9095398d955bec307cfcb0f69) by [@hsource](https://github.com/hsource)) +- Make nested `Text` components accessible as links ([b352e2da81](https://github.com/facebook/react-native/commit/b352e2da8137452f66717cf1cecb2e72abd727d7) by [@ejanzer](https://github.com/ejanzer)) +- Move selection to the end of the text input on accessibility click ([f0e80ae229](https://github.com/facebook/react-native/commit/f0e80ae2292ebf7ce32666900007845724844fb5) by [@ejanzer](https://github.com/ejanzer)) +- Fix secure text entry setting to always hide text ([f19372361f](https://github.com/facebook/react-native/commit/f19372361f22201a453ff38eb69c5fa052b57474) by [@smeenai](https://github.com/smeenai)) +- Make promise NativeModule methods dispatch to NativeModules thread ([9c35b5b8c4](https://github.com/facebook/react-native/commit/9c35b5b8c4710dfe6a4b689a5565aa78ae5b37d3) by [@RSNara](https://github.com/RSNara)) +- Fix `NoSuchMethodException` when calling `DisplayMetricsHolder.initDisplayMetrics` in Android API level <= 16 (though those Android versions are no longer supported) ([35128f45d1](https://github.com/facebook/react-native/commit/35128f45d1ba97010e437423d14fa5ea0faf5fa3) by [@mdvacca](https://github.com/mdvacca)) +- Fixed error message in `DebugCorePackage.getModule` ([a71f37b951](https://github.com/facebook/react-native/commit/a71f37b951ca49c180b037ea8955851654b09afa) by [@TheWirv](https://github.com/TheWirv)) +- ScrollView, HorizontalScrollView: do not ignore `null` `contentOffset` prop ([9e85b7ad88](https://github.com/facebook/react-native/commit/9e85b7ad889900cd57cd2f82286aa8e034b0a32b) by [@vonovak](https://github.com/vonovak)) +- Picker - fix usage of setNativeSelectedPosition in onSelect ([078e386024](https://github.com/facebook/react-native/commit/078e386024474edc9b464f6c0fd8a1429e922289)) +- Fix intermittent crash of ReactSlider on Android ([32888a8b4a](https://github.com/facebook/react-native/commit/32888a8b4a9d75b9d3f6cc4578ce6a6ccd932407) by [@mdvacca](https://github.com/mdvacca)) +- Use actual constructor when throwing GradleScriptException ([8ef0f1d90b](https://github.com/facebook/react-native/commit/8ef0f1d90bbb2fa98e48ce89281718e5ac79365a)) +- Fix `skewX` transform decomposition ([797367c089](https://github.com/facebook/react-native/commit/797367c0890a38ec51cfaf7bd90b9cc7db0e97c7) by [@wcandillon](https://github.com/wcandillon)) +- Allow passing partial contentOffset to ScrollView on Android ([0348953914](https://github.com/facebook/react-native/commit/03489539146556ec5ba6ba07ac338ce200f5b0f4) by [@janicduplessis](https://github.com/janicduplessis)) +- Check if NativeModules returned from CatalystInstanceImpl.getNativeModule are null before using them. ([9263eb5d38](https://github.com/facebook/react-native/commit/9263eb5d3864a42925b699343db2c09cc8934ed0) by [@RSNara](https://github.com/RSNara)) +- Fix calculating view position within the window in split-screen mode ([b020e7c440](https://github.com/facebook/react-native/commit/b020e7c440f58dabd4cc64b72869f3ae9680ef30) by [@jakubkinst](https://github.com/jakubkinst)) +- Text layout no longer ignores parent bounds ([025be8148a](https://github.com/facebook/react-native/commit/025be8148a9abc533a8ae108e49cfd3f4512c581) by [@yungsters](https://github.com/yungsters)) +- Fixed excessive space in Text view with word-wrapping ([dda7f82261](https://github.com/facebook/react-native/commit/dda7f82261cc5684564e2c67071c13e379985308) by [@yungsters](https://github.com/yungsters)) +- `Pressable`: ripple should be applied even when borderless == false ([44ec762e41](https://github.com/facebook/react-native/commit/44ec762e41029bf43530b1ff9b36ca3512c526e2) by [@vonovak](https://github.com/vonovak)) +- Fix `ReadableNativeMap.getNullableValue` to match signature and return null instead of throwing ([1015194ba1](https://github.com/facebook/react-native/commit/1015194ba1a81eab99000d589914100e4b9ea037) by [@dulmandakh](https://github.com/dulmandakh)) +- `Picker`: set color filter so that the arrow matches the text color ([bb8d0f5732](https://github.com/facebook/react-native/commit/bb8d0f57328a20c942991f2d19d86639a7791924) by [@ejanzer](https://github.com/ejanzer)) +- `Modal`: fix crash when updating props after the activity disappeared ([7abcaafd66](https://github.com/facebook/react-native/commit/7abcaafd6600535825aa8330af7290ba8acea245) by [@mdvacca](https://github.com/mdvacca)) +- Fix crash while measuring ReactSlider in Android API < 21 ([75e6f7961f](https://github.com/facebook/react-native/commit/75e6f7961fb3f6de6afbe79d49c42ad55fba1673) by [@mdvacca](https://github.com/mdvacca)) +- Fix measureLayout function for VirtualTexts ([5c48c94f8c](https://github.com/facebook/react-native/commit/5c48c94f8c0441bc78a007f0ea0c5b2763ff6875) by [@mdvacca](https://github.com/mdvacca)) +- Smoother scrolling in ScrollView, HorizontalScrollView ([10314fe621](https://github.com/facebook/react-native/commit/10314fe621e1649654e83df197adf657e0ca8363) by [@JoshuaGross](https://github.com/JoshuaGross)) + +#### iOS specific + +- Synchronize RCTImageLoader loaders initialization ([edb6fa7979](https://github.com/facebook/react-native/commit/edb6fa79791beb804e450ca4a562a248abf730e5) by [@p-sun](https://github.com/p-sun)) +- Make sure js bundle still exists at bundle-output path ([3a41f69f9c](https://github.com/facebook/react-native/commit/3a41f69f9ce1ab778112c0727a69a753fe36c77a) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix crash in WebSocket module ([748aa13747](https://github.com/facebook/react-native/commit/748aa137472d6080427f74bb686c795b925c7d43) by [@marksinkovics](https://github.com/marksinkovics)) +- Align multi-line `TextInput` `onSubmitEditing` behavior: don't call onSubmitEditing when blurOnSubmit=false ([521b16730d](https://github.com/facebook/react-native/commit/521b16730dd07d80261086c2f33eed2a766d404e) by [@tido64](https://github.com/tido64)) +- Fix passing react native path in Podfile template ([e599d6c5d3](https://github.com/facebook/react-native/commit/e599d6c5d338c1b4d1a0d988e0d9ff83c179fb54) by [@janicduplessis](https://github.com/janicduplessis)) +- Call [RCTEventEmitter stopObserving] on correct method queue ([23717e48af](https://github.com/facebook/react-native/commit/23717e48aff3d7fdaea30c9b8dcdd6cfbb7802d5) by [@appden](https://github.com/appden)) +- Persist Enable Fast Refresh across app launches ([845e9eaafb](https://github.com/facebook/react-native/commit/845e9eaafb08b4ca87a9987e840798e0ba011676) by [@stigi](https://github.com/stigi)) +- Fix xcodebuild warnings in React-Core ([cb719a16cc](https://github.com/facebook/react-native/commit/cb719a16cc496b0cdb09d8d971b5e95cc8863b77)) +- Fix that RCTModalHostView can't be dismissed while being presented ([8933724d7d](https://github.com/facebook/react-native/commit/8933724d7d0f9ec012b2708d8e737f02f03e4a6f) by [@Mi-ZAZ](https://github.com/Mi-ZAZ)) +- Fix "'RCTBlobPlugins.h' file not found" when building iOS ([aaeffdb49a](https://github.com/facebook/react-native/commit/aaeffdb49a8412a98bb52477933fd208d1dcc096) by [@tido64](https://github.com/tido64)) +- Improved text rendering on macOS Catalyst ([694e22de84](https://github.com/facebook/react-native/commit/694e22de847e5f789b7d5ffe472b63aabbd7a5b0) by [@andymatuschak](https://github.com/andymatuschak)) +- Fixed showing Alert while closing a Modal ([f319ff321c](https://github.com/facebook/react-native/commit/f319ff321c4b7c0929b99e3ebe7e1ce1fa50b34c) by [@devon94](https://github.com/devon94)) +- Fix `refreshControl` messes up navigationBar largeTitles ([1b0fb9bead](https://github.com/facebook/react-native/commit/1b0fb9bead4d158d14df5a994423d06716b5e377) by [@yogevbd](https://github.com/yogevbd)) +- When Sec-WebSocket-Protocol header is empty vaulue, IIS server will return error 502. ([fd85b84a86](https://github.com/facebook/react-native/commit/fd85b84a863cea9f33e5b39230b27af53c1307e7) by [@bill2004158](https://github.com/bill2004158)) +- Fix multiline `TextInput` crash when inserting/removing lots of text ([15dda0ab5a](https://github.com/facebook/react-native/commit/15dda0ab5a491dcc83539f9ef32c9896be41074a) by [@tido64](https://github.com/tido64)) +- Group accessible views using the view hierarchy ([e2fd9d4f22](https://github.com/facebook/react-native/commit/e2fd9d4f22cda85c995c38875fc3a2a20a198c4a) by [@p-sun](https://github.com/p-sun)) +- Fix Flow types for StatusBar showHideTransition ([e5a8f4270e](https://github.com/facebook/react-native/commit/e5a8f4270ea71749a5ce6bd7ae198f695edb4307) by [@Simek](https://github.com/Simek)) +- Better error message when missing entry file ([e73208e2ca](https://github.com/facebook/react-native/commit/e73208e2ca59a2cf6a8a9c5e4e5b33afb5131f09) by [@petrbela](https://github.com/petrbela)) +- Fix imports in `RCTUtilsUIOverride.h` ([b7e8f66795](https://github.com/facebook/react-native/commit/b7e8f667953c2bc65c25b00968051c063a684d01) by [@Fanghao](https://github.com/Fanghao)) +- Fix skewX/skewY/perspective/matrix transforms. ([4b956fe5a6](https://github.com/facebook/react-native/commit/4b956fe5a6b3a05b1c2883efc82a95c2524aeb56) by [@wcandillon](https://github.com/wcandillon)) +- Fix module lookup race condition on bridge invalidation. ([8ad810717e](https://github.com/facebook/react-native/commit/8ad810717ee1769aa5ff6c73e0c9bfa8c43a3bac) by [@fkgozali](https://github.com/fkgozali)) +- Fix duration calculation for `RCTUIImageViewAnimated` ([12f8b2598f](https://github.com/facebook/react-native/commit/12f8b2598fa46533ea59834a0225cc9e36b20111)) +- Cap loading banner percentage at 100% ([e27542bb13](https://github.com/facebook/react-native/commit/e27542bb13d1f8f422cd307c4d43148c8bd82bc0) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Delay loading banner message to prevent flashing messages ([2b771b0129](https://github.com/facebook/react-native/commit/2b771b0129f2ef921c7cdb9c952e004f931927c3) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Do not update loading banner message while hiding the banner ([131c497aa2](https://github.com/facebook/react-native/commit/131c497aa2c081f9dfd03e45b25fb7ae388b98bd) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Search en0 through en8 for the Metro Bundler's IP address when generating iOS debug builds ([b2b23a2017](https://github.com/facebook/react-native/commit/b2b23a20170d12f6d8bf2733b93d7f9ab9c6cb15)) +- Migrate `frameInterval` to `preferredFramesPerSecond`, fixing Xcode warnings ([335f3aabe2](https://github.com/facebook/react-native/commit/335f3aabe28ec8f9b96fd695edabf0d5ab0b402a) by [@safaiyeh](https://github.com/safaiyeh)) +- Animated image should animate at the same speed regardless of framerate ([b0d0e51a77](https://github.com/facebook/react-native/commit/b0d0e51a7724dcefe3ce1c2dfb334a731b2a385c) by [@p-sun](https://github.com/p-sun)) +- Fix logging lifecycle when image is scrolled out and immediately back in ([1f95c9b62e](https://github.com/facebook/react-native/commit/1f95c9b62e306fdaf0ef351b02fb79713941259c) by [@p-sun](https://github.com/p-sun)) +- Fix image instrumentation lifecycle on image cancel ([6cba4d2006](https://github.com/facebook/react-native/commit/6cba4d20068ef4ca9b9832e4c5cf71a7e361ddbe) by [@p-sun](https://github.com/p-sun)) +- Break retain cycle in RCTLegacyViewManagerInteropCoordinator ([8f90ce26a5](https://github.com/facebook/react-native/commit/8f90ce26a55f2b1aab42d7c44b0d527321fa8c21) by [@sammy-SC](https://github.com/sammy-SC)) +- Respect port information if available from RCTBundleURLProvider ([7d44959940](https://github.com/facebook/react-native/commit/7d44959940b7f7b03feefde0e9a15382f04dad6d) by [@jimmy623](https://github.com/jimmy623)) +- Remove port from JSLocation when returning packager host ([12543d557f](https://github.com/facebook/react-native/commit/12543d557f00545a719b4dfd76cc0d0adfa37a01) by [@jimmy623](https://github.com/jimmy623)) +- Remove requestToken being nil check from [RCTNetworkTask validateRequestToken] ([ffc90c7f92](https://github.com/facebook/react-native/commit/ffc90c7f92e63e1a53ed107833e3deed492ab435) by [@sammy-SC](https://github.com/sammy-SC)) +- Remove unnecessary packager running check when saved JSLocation is empty ([bbb7bef539](https://github.com/facebook/react-native/commit/bbb7bef539f418bdb452e40987d399c9369df5a2) by [@jimmy623](https://github.com/jimmy623)) +- Check whether packager is running in RCTBundleURLProvider for saved JSLocation ([3d882495d5](https://github.com/facebook/react-native/commit/3d882495d5e4415c2ebb8f4280e18e16025e0736) by [@jimmy623](https://github.com/jimmy623)) +- Fix crash inside RCTRedBox when trying to present same UIViewController twice ([46c77dc296](https://github.com/facebook/react-native/commit/46c77dc296dfab754356cd9346a01dae8d4869f4) by [@sammy-SC](https://github.com/sammy-SC)) +- Fix outdated CocoaPods version requirement in a React.podspec ([8a6ac1fef3](https://github.com/facebook/react-native/commit/8a6ac1fef369071405a3bf14a89924c66f28d192) by [@sunnylqm](https://github.com/sunnylqm)) + +## v0.63.5 + +🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). + +### Fixed + +- Add an afterEvaluate to solve AGP 3.x configuration resolution ([473a36099c](https://github.com/facebook/react-native/commit/473a36099c80de08591e3cb51687f7d531145ee3) by [@cortinico](https://github.com/cortinico)) +- Force dependencies resolution to minor series for 0.63 ([28cc286cc4](https://github.com/facebook/react-native/commit/28cc286cc4d43b9fe5153d779ea3eecf4d72c51e) by [@cortinico](https://github.com/cortinico)) + +## v0.63.4 + +### Changed + +- [Maintenance] Bump detox to xcode 12 compatible version ([ccd4efac90](https://github.com/facebook/react-native/commit/ccd4efac90191e57b1dd6e7fff0da13e5764bcc4) by [@kelset](https://github.com/kelset)) + +#### Android specific + +- Bump SoLoader to 0.9.0 ([7465239230](https://github.com/facebook/react-native/commit/7465239230881f453d64364d51272f28614c8653) by [@dulmandakh](https://github.com/dulmandakh)) +- Update Okhttp to version 3.12.12 ([0f6fcb2c27](https://github.com/facebook/react-native/commit/0f6fcb2c2788dc7150f6c3673a8f4f9d8f929441) by [@halaei](https://github.com/halaei)) +- ScrollView now supports `contentOffset` ([ed29ba13f9](https://github.com/facebook/react-native/commit/ed29ba13f97f240c91fdf6c0ef3fb601046697b9) by [@JoshuaGross](https://github.com/JoshuaGross)) + +### Fixed + +#### Android specific + +- Fix ReadableNativeMap.getNullableValue to match signature ([1015194ba1](https://github.com/facebook/react-native/commit/1015194ba1a81eab99000d589914100e4b9ea037) by [@dulmandakh](https://github.com/dulmandakh)) +- Dimension update events are now properly sent following orientation change ([0e9296b95d](https://github.com/facebook/react-native/commit/0e9296b95da06789121f052e6cd6d7cac808464c) by [@ajpaulingalls](https://github.com/ajpaulingalls)) +- Font family is not apply when secureTextEntry is true. ([00d9deaf6b](https://github.com/facebook/react-native/commit/00d9deaf6ba26c605694d303bb0cb072fceae5a1) by [@hank121314](https://github.com/hank121314)) +- Fix App Bundle/Release build missing index.android.bundle with gradle plugin 4.1.0/gradle 6.5 ([53f55001af](https://github.com/facebook/react-native/commit/53f55001afbf07494de0df064a92dfdd42f37c98) by [@tomoima525](https://github.com/tomoima525)) +- ScrollView, HorizontalScrollView: do not ignore `null` `contentOffset` prop ([9e85b7ad88](https://github.com/facebook/react-native/commit/9e85b7ad889900cd57cd2f82286aa8e034b0a32b) by [@vonovak](https://github.com/vonovak)) +- SkewX transforms ([797367c089](https://github.com/facebook/react-native/commit/797367c0890a38ec51cfaf7bd90b9cc7db0e97c7) by [@wcandillon](https://github.com/wcandillon)) +- Allow passing partial contentOffset to ScrollView on Android ([0348953914](https://github.com/facebook/react-native/commit/03489539146556ec5ba6ba07ac338ce200f5b0f4) by [@janicduplessis](https://github.com/janicduplessis)) +- Set color filter so that the arrow matches the text color ([bb8d0f5732](https://github.com/facebook/react-native/commit/bb8d0f57328a20c942991f2d19d86639a7791924) by [@ejanzer](https://github.com/ejanzer)) + +#### iOS specific + +- A crash in WebSocket module ([748aa13747](https://github.com/facebook/react-native/commit/748aa137472d6080427f74bb686c795b925c7d43) by [@marksinkovics](https://github.com/marksinkovics)) +- Fixed showing Alert while closing a Modal ([f319ff321c](https://github.com/facebook/react-native/commit/f319ff321c4b7c0929b99e3ebe7e1ce1fa50b34c) by [@devon94](https://github.com/devon94)) +- Bug with skewX/skewY/perspective/matrix transforms. ([4b956fe5a6](https://github.com/facebook/react-native/commit/4b956fe5a6b3a05b1c2883efc82a95c2524aeb56) by [@wcandillon](https://github.com/wcandillon)) + +## v0.63.3 + +### Added + +#### iOS specific + +- Ability to set which configuration to enable flipper for when using use_flipper! ([dc2df75426](https://github.com/facebook/react-native/commit/dc2df754267df3909631d81c22b9fcab58dfa241) by [@nicoburns](https://github.com/nicoburns)) + +### Changed + +- Update Flipper to 0.54 ([d8b70b19b3](https://github.com/facebook/react-native/commit/d8b70b19b39ead4dd41895d666d116a43c56474e) by [@mweststrate](https://github.com/mweststrate)) +- Removed default 130ms delay from Pressability and Pressable. ([86ffb9c41e](https://github.com/facebook/react-native/commit/86ffb9c41e033f59599e01b7ad016706b5f62fc8) by [@yungsters](https://github.com/yungsters)) + +### Fixed + +#### Android specific + +- `KeyboardDidHide` wrong `screenY` coordinates with `windowTranslucentStatus=true` ([45954ac5dc](https://github.com/facebook/react-native/commit/45954ac5dccdfe05de7553a0f08c4f0e66e3d62e) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fix Xiaomi TextInput crash in native ([07a597ad18](https://github.com/facebook/react-native/commit/07a597ad185c8c31ac38bdd4d022b0b880d02859)) + +#### iOS specific + +- Prefetch images using a lower download priority ([058eeb43b4](https://github.com/facebook/react-native/commit/058eeb43b489f52183f081fb7232be683002a242) by [@p-sun](https://github.com/p-sun)) +- Fix `RCTImageLoader` not using decoders provided. ([663b5a878b](https://github.com/facebook/react-native/commit/663b5a878be9faafd13b41c222a1bc2ac7bb3a65) by [@sjchmiela](https://github.com/sjchmiela)) +- Support Swift based libraries using Xcode 12’s build system. ([6e08f84719](https://github.com/facebook/react-native/commit/6e08f84719c47985e80123c72686d7a1c89b72ed) by [@alloy](https://github.com/alloy)) +- Fix "main.jsbundle does not exist" issue ([83777cb4fb](https://github.com/facebook/react-native/commit/83777cb4fb5dda89c430b7eff9cd1f28d2577831)) +- Fixed headers in `Image.getSizeWithHeaders`. ([0bcc686c1c](https://github.com/facebook/react-native/commit/0bcc686c1cc90fd44de7a28e2f56ea20fe2f5123) by [@PaitoAnderson](https://github.com/PaitoAnderson)) + +### Security + +- Fix security issues with `@react-native-community/cli` by bumping version ([001eb7cbd6](https://github.com/facebook/react-native/commit/001eb7cbd66c7dc1a302ee2a638c1cfc164538f4) by [@alexbrazier](https://github.com/alexbrazier)) + +## v0.63.2 + +### Fixed + +- Restore Previous Behavior for StyleSheet Validation of Null/Undefined Styles ([e75557b48f](https://github.com/facebook/react-native/commit/e75557b48fbee1d136b8b7d1a78ea8f9b9467479) by [@NickGerleman](https://github.com/NickGerleman)) + +#### Android specific + +- Set LogBox windowTranslucentNavigation to false ([23036b38bc](https://github.com/facebook/react-native/commit/23036b38bc4443c8db4865e5c2b21aca7ab4f92f) by [@Ashoat](https://github.com/Ashoat)) +- Fix unable to run in debug mode on Android API < 21 ([7694b32a88](https://github.com/facebook/react-native/commit/7694b32a88078278457dd8721eb61da9c4ac0f5a) by [@Shywim](https://github.com/Shywim)) + +#### iOS specific + +- Fix image cannot show in iOS 14 ([123423c2a9](https://github.com/facebook/react-native/commit/123423c2a9258c9af25ca9bffe1f10c42a176bf3)) + +## v0.63.1 + +### Added + +- Added `minPressDuration` to `Pressable`. ([4aaf629982](https://github.com/facebook/react-native/commit/4aaf62998247bcfd8ebf369d73290096fde08012) by [@yungsters](https://github.com/yungsters)) +- Support for array buffers in the JavaScriptCore implementation of JSI ([9c32140068](https://github.com/facebook/react-native/commit/9c32140068463739b91874689f741ea9630d8c3b) by [@ryantrem](https://github.com/ryantrem)) + +#### Android specific + +- ProGuard rule for hermes ([449dc37720](https://github.com/facebook/react-native/commit/449dc37720b24d9d88661314424c9f982e70ec3a) by [@radko93](https://github.com/radko93)) + +### Fixed + +- LogBox.ignoreAllLogs() should ignore logs ([f28c7505fa](https://github.com/facebook/react-native/commit/f28c7505fa5b4a7ddf1e9311d38dfcd15e8953a2) by [@rickhanlonii](https://github.com/rickhanlonii)) + +#### Android specific + +- Fix font variant crash on Android < 4.4 ([f23feced42](https://github.com/facebook/react-native/commit/f23feced42abd1d18a12e413bf79a51bead61379) by [@Almouro](https://github.com/Almouro)) +- Fix border-drawing when changing border-radius back to 0` ([7757ad0576](https://github.com/facebook/react-native/commit/7757ad05762284c059807d7d75fd03559e86f2b2) by [@IjzerenHein](https://github.com/IjzerenHein)) +- Fix rounded border-drawing when border-radius is smaller than border-width` ([28dce3665d](https://github.com/facebook/react-native/commit/28dce3665d8a63e902c165c060400486fe6234f4) by [@IjzerenHein](https://github.com/IjzerenHein)) + +#### iOS specific + +- TextInput color has the same default (#000) on iOS whether in light or dark mode ([a2f8b9c36e](https://github.com/facebook/react-native/commit/a2f8b9c36e5eba6bc354a2f53bf8d3ca11297d00) by [@JonnyBurger](https://github.com/JonnyBurger)) +- Fixes TextInput shaking when typing Chinese ([9cdc19a936](https://github.com/facebook/react-native/commit/9cdc19a93669b37c0518bd32263e156ffc9193c7) by [@zhongwuzw](https://github.com/zhongwuzw)) + +## v0.63.0 + +### Breaking + +- The `target` field of events is now a native component, not a react tag ([3b813cade1](https://github.com/facebook/react-native/commit/3b813cade1f5d6f248a39f6bbd983f68c5794fe6) by [@TheSavior](https://github.com/TheSavior)) +- Modal: Remove support for `animated` prop (deprecated in 0.26) ([1e9db7bd6d](https://github.com/facebook/react-native/commit/1e9db7bd6df3055b9b81d23f15a54bb250621a41) by [@TheSavior](https://github.com/TheSavior)) +- Alert: Remove deprecated support for passing callback as fourth argument to `Alert.prompt` (deprecated in 0.59) ([a26d622d04](https://github.com/facebook/react-native/commit/a26d622d04451d6872eed2491e5d3f7d4689824d) by [@TheSavior](https://github.com/TheSavior)) +- Switch: Remove support for `thumbTintColor`, `tintColor`, `onTintColor` props (deprecated in 0.57) ([26912bd979](https://github.com/facebook/react-native/commit/26912bd9798aeb38931466b8ddcd3a48973b0528) by [@TheSavior](https://github.com/TheSavior)) +- Multiple deprecations and breaking changes to `TextInputState`. Use native component refs instead of react tags ([6286270e4c](https://github.com/facebook/react-native/commit/6286270e4cb10b40cfd7c8193e31d965f6815150) by [@TheSavior](https://github.com/TheSavior)) +- Bump supported Node engines to >= 10 ([f0c7178a3a](https://github.com/facebook/react-native/commit/f0c7178a3a24e7694b765946f0d884104c8cfa4c) by [@safaiyeh](https://github.com/safaiyeh)) + +### Deprecated + +- Add deprecation warnings for `Clipboard`, `SegmentedControlIOS`, `ProgressViewIOS`, `ProgressBarAndroid`. These modules have been moved to [react-native-community](https://github.com/react-native-community) libraries. ([f295d7f608](https://github.com/facebook/react-native/commit/f295d7f60843a45bb09fc366e497f512c2bc0046) by [@Naturalclar](https://github.com/Naturalclar)) +- Deprecated `console.disableYellowBox` in favor of `LogBox.ignoreAllLogs`. ([87f1e22434](https://github.com/facebook/react-native/commit/87f1e22434210ad22f526422bbda0413f59786ce) by [@rickhanlonii](https://github.com/rickhanlonii)) + +#### Android specific + +- We are deprecating the method `UIManagerModule.resolveRootTagFromReactTag`, this will not be supported in the next version of RN ([acbf9e18ea](https://github.com/facebook/react-native/commit/acbf9e18ea666b07c1224a324602a41d0a66985e) by [@mdvacca](https://github.com/mdvacca)) +- Add warning message for trying to use `ToolbarAndroid` which has been removed from the core since 0.61. ([6249d14a61](https://github.com/facebook/react-native/commit/6249d14a61723b22deb1336457b4295978471885) by [@Naturalclar](https://github.com/Naturalclar)) + +#### iOS specific + +- Deprecate iOS 9.x support ([58a6a40eac](https://github.com/facebook/react-native/commit/58a6a40eac9afb5c4de78a63418cc48ea97da1a4), [829a2237d2](https://github.com/facebook/react-native/commit/829a2237d270c03c80467eb6c2b5b18c87135a45), [674b591809](https://github.com/facebook/react-native/commit/674b591809cd1275b5f1c4d203c2f0ec52303396) by [@fkgozali](https://github.com/fkgozali), [d1265077d6](https://github.com/facebook/react-native/commit/d1265077d6638bb9219180628caf6ff83f8d6019) by [@sunnylqm](https://github.com/sunnylqm)) + +### Added + +- Implement `nativePerformanceNow` and `performance.now()` ([232517a574](https://github.com/facebook/react-native/commit/232517a5740f5b82cfe8779b3832e9a7a47a8d3d) by [@emilisb](https://github.com/emilisb)) +- Support `PerformanceLogger` stopTimespan updates ([08c338eebf](https://github.com/facebook/react-native/commit/08c338eebf67ef6c8c8fb7e3a91bbf89bbc2bb4c) by [@sahrens](https://github.com/sahrens)) +- Added `PlatformColor` implementations for iOS and Android ([f4de45800f](https://github.com/facebook/react-native/commit/f4de45800f25930a1c70f757d12269d859066d3d) by [@tom-un](https://github.com/tom-un)) +- Stamp React Native Version Into C++ Code ([427ba359e0](https://github.com/facebook/react-native/commit/427ba359e0c9411438286dd137bbca67f9829fde) by [@NickGerleman](https://github.com/NickGerleman)) +- New `` Component to make it easier to create touchable elements ([3212f7dfe8](https://github.com/facebook/react-native/commit/3212f7dfe82d187e27f1410c8c3cb1d9fb9f5094) by [@TheSavior](https://github.com/TheSavior), [bd3868643d](https://github.com/facebook/react-native/commit/bd3868643d29e93610e19312571a9736df2cbdf8) by [@vonovak](https://github.com/vonovak)) +- Export `LogBox` module ([799bf56f6f](https://github.com/facebook/react-native/commit/799bf56f6f6a46b6bd42ac5a824f44bd1412f3b6) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Export `LayoutAnimationConfig` flow type ([f0dafd34fe](https://github.com/facebook/react-native/commit/f0dafd34fedb0d63eb2499b978a52da9e6b71ea1) by [@sahrens](https://github.com/sahrens)) +- Added `react-native-community/eslint-plugin` as a dependency for `react-native-community/eslint-config` ([2c2e35c634](https://github.com/facebook/react-native/commit/2c2e35c634cd936bd7ea7a7fe444058268308224) by [@Naturalclar](https://github.com/Naturalclar)) +- `DEBUG_NETWORK_SEND_DELAY` can be used to simulate slow network. ([4aac019176](https://github.com/facebook/react-native/commit/4aac019176e3359068ac671ed4157a6e3ada481f) by [@sahrens](https://github.com/sahrens)) +- Support for `accessibilityLabel` prop to the `Picker` component ([0a525b6d9d](https://github.com/facebook/react-native/commit/0a525b6d9d2a88dddf24b85a2485b928fca23b16) by [@KevinGVargas](https://github.com/KevinGVargas)) +- Allow `zIndex` to `useNativeDriver` ([6a4e06faa8](https://github.com/facebook/react-native/commit/6a4e06faa8afbcb607fc2696c45c4f3257b6665d) by [@mackenziemance](https://github.com/mackenziemance)) + +#### Android specific + +- Support item background color in Dialog `Picker` ([22eb711c84](https://github.com/facebook/react-native/commit/22eb711c84587ac92da97e486fecaa79424fa925)) +- Add OverrideColorScheme interface and setOverrideColorScheme method to AppearanceModule([45d7df6cf7](https://github.com/facebook/react-native/commit/45d7df6cf7482b9790c97db613055ff5d3e59a87)) +- Allow setting custom ripple radius on `TouchableNativeFeedback` ([7f2a79f40b](https://github.com/facebook/react-native/commit/7f2a79f40b4a4c41344ca90cefe318af607675e0) by [@vonovak](https://github.com/vonovak)) +- Add `resizeMode` prop support on `TextInlineView` ([6871416328](https://github.com/facebook/react-native/commit/68714163280695c3148544b95b05a2c1464dbbba) by [@mdvacca](https://github.com/mdvacca)) +- Added an API for checking if there are busy timers to `TimingModule` ([22764e6cdc](https://github.com/facebook/react-native/commit/22764e6cdcf45ca5930676f6e95f9ab2f82bc78d) by [@ejanzer](https://github.com/ejanzer)) +- Make packager location customizable in dev mode ([3714f3648a](https://github.com/facebook/react-native/commit/3714f3648a8ac51f2bb7f2791e2381551d0209b4)) + +#### iOS specific + +- `UIScene` support for `RCTImageView` ([f332fac163](https://github.com/facebook/react-native/commit/f332fac16346d2f03d056575cc988a0b2bbb48c6) by [@tido64](https://github.com/tido64)) +- Status bar style is now correctly changed in multi-window iPadOS 13 apps if you use `RCTRootViewController` and set `UIViewControllerBasedStatusBarAppearance=YES` ([80e6d672f3](https://github.com/facebook/react-native/commit/80e6d672f32fdc860c73eabcc63763dcab3c6269) by [@radex](https://github.com/radex)) +- Added `userInterfaceStyle` for `ActionSheetIOS` and `Share` to override user interface style on IOS 13 ([0a9cc34dd8](https://github.com/facebook/react-native/commit/0a9cc34dd82a3a7dba576997ebd424b12876dbaa) by [@Arjan-Zuidema](https://github.com/Arjan-Zuidema)) +- Add localized accessibility strings to `ReactCore` pod ([aebf54aee4](https://github.com/facebook/react-native/commit/aebf54aee41cc892198b055a7a546743297412bd) by [@xuelgong](https://github.com/xuelgong)) +- Resolve and reject promise for `PushNotificationIOS.requestPermissions` ([edfdafc7a1](https://github.com/facebook/react-native/commit/edfdafc7a14e88a2660b95cb220c62f29b1b28c0) by [@p-sun](https://github.com/p-sun)) +- Use autolink script in template on iOS ([a35efb9400](https://github.com/facebook/react-native/commit/a35efb94006bfa3f541bf3fc3ab5262740f00525) by [@janicduplessis](https://github.com/janicduplessis)) +- Added `Flipper` to template app ([52cd9cd6fe](https://github.com/facebook/react-native/commit/52cd9cd6fec0866177aa02f7129a8b3d8b2bdbea) by [@safaiyeh](https://github.com/safaiyeh)) +- Add `textColor` and `backgroundColor` props to `SegmentedControl` for iOS >=13 ([e8f577e541](https://github.com/facebook/react-native/commit/e8f577e541815bfd8adebdf14f70c9e4205f8e4e) by [@Naturalclar](https://github.com/Naturalclar)) +- Adds `RCTOverrideAppearancePreference` to the iOS `Appearance` module ([fa65b156d4](https://github.com/facebook/react-native/commit/fa65b156d4109e6a3121484b601358b11cf0d541)) +- Changed iOS LaunchScreen from `xib` to `storyboard` ([33b3a1a145](https://github.com/facebook/react-native/commit/33b3a1a1453ca51690e59b758eeb61a4fa8f35bc) by [@jeswinsimon](https://github.com/jeswinsimon)) + +### Changed + +- Update `react-native-community/eslint-config` to 1.1.0, adding the new color rule ([780f06cd47](https://github.com/facebook/react-native/commit/780f06cd477f34da48646a949bd25dd3f883a9a2) by [@TheSavior](https://github.com/TheSavior)) +- Update community eslint plugin in the eslint config ([b2d10bc602](https://github.com/facebook/react-native/commit/b2d10bc60272fc2318835ff38655a9eb4a2bbed0) by [@Naturalclar](https://github.com/Naturalclar)) +- Upgrade `eslint-config` and `metro-preset` in project template ([ad86a18305](https://github.com/facebook/react-native/commit/ad86a183052e8b25d599eb395aef55412c02ff7b) by [@Naturalclar](https://github.com/Naturalclar)) +- Add ES Lint rules for `DynamicColorIOS()`and `ColorAndroid()` ([602070f44b](https://github.com/facebook/react-native/commit/602070f44b02220aeb036a7b3c26dad5c611b636) by [@tom-un](https://github.com/tom-un)) +- Make `ScrollView` use `forwardRef` ([d2f314af75](https://github.com/facebook/react-native/commit/d2f314af75b63443db23e131aaf93c2d064e4f44) by [@kacieb](https://github.com/kacieb)) +- Upgrade embedded React DevTools backend from v4.0.6 to v4.6.0 ([93ee5b2cc8](https://github.com/facebook/react-native/commit/93ee5b2cc8391bc5cb12ca7cf08ed0e44c74d29a) by [@bvaughn](https://github.com/bvaughn)) +- Updated the React Hooks ESLint Plugin ([6ce3f0a4f7](https://github.com/facebook/react-native/commit/6ce3f0a4f7495adb82e655d037dc4e5af462f955) by [@gaearon](https://github.com/gaearon)) +- Update to React 16.13.1 ([9637d6214a](https://github.com/facebook/react-native/commit/9637d6214a47e58d7fa8252a3de8c057e5cfb101) by [@gaearon](https://github.com/gaearon)) +- Relax `RefreshControl`'s `onRefresh` flow typing ([884c86ae02](https://github.com/facebook/react-native/commit/884c86ae02b0be7ea1e4b258dab39f4c5aee0b9d) by [@vonovak](https://github.com/vonovak)) +- Improved flowtype support for `Animated` ([bdafc55f50](https://github.com/facebook/react-native/commit/bdafc55f50c7d580ee2e643a02cb95d0196f721c) by [@javache](https://github.com/javache)) +- Upgrade `eslint-plugin-relay` to 1.6.0 ([0483404d82](https://github.com/facebook/react-native/commit/0483404d827416b7270e8a42b84e424035127892) by [@kassens](https://github.com/kassens)) +- Upgrade to latest dependencies in package.json template ([82e8239337](https://github.com/facebook/react-native/commit/82e82393377ddcedba01c401a5d79d5bbcdc4dc9) by [@codler](https://github.com/codler)) +- Make JSStringToSTLString 23x faster ([733532e5e9](https://github.com/facebook/react-native/commit/733532e5e95c85b8295b6c66009ca9efd2a77622) by [@radex](https://github.com/radex)) +- Changed property `disableIntervalMomentum` to work with both horizontal and vertical ScrollViews ([6237cfb325](https://github.com/facebook/react-native/commit/6237cfb325e39571ede0054a67d60f2c978d6d58) by [@Shaninnik](https://github.com/Shaninnik)) +- Upgraded to Flow v0.114.0 ([aa78457343](https://github.com/facebook/react-native/commit/aa7845734352eab2bd32f7d6e683d6674fd6680d) by [@mroch](https://github.com/mroch)) +- Updated CLI to the latest version ([ddc33007ad](https://github.com/facebook/react-native/commit/ddc33007ad0b4a0a24966b833e797227b9c56cca) by [@grabbou](https://github.com/grabbou)) +- Upgrade Prettier from 1.17 to 2.0.2. ([cf44650b3f](https://github.com/facebook/react-native/commit/cf44650b3f4f13df8208ceded60ec5c48bd6baf3) by [@bolinfest](https://github.com/bolinfest)) +- Only set dimensions if the window attributes change ([35c6bb9ac0](https://github.com/facebook/react-native/commit/35c6bb9ac0fc452428e85fee72affb4fc29f500c) by [@cpojer](https://github.com/cpojer)) +- Upgrade internal packages to support ESLint >= 6 ([89d04b5e4a](https://github.com/facebook/react-native/commit/89d04b5e4a3fd0b0f77b5a390c0aa62a3804e2bc) by [@Barbiero](https://github.com/Barbiero)) +- Make `JSCRuntime::createValue` faster ([24e0bad8be](https://github.com/facebook/react-native/commit/24e0bad8bea95ef7ddf72e2f00a93ffd47872d5b) by [@radex](https://github.com/radex)) +- Add perf markers in `XMLHttpRequest` ([71b8ececf9](https://github.com/facebook/react-native/commit/71b8ececf9b298fbf99aa27d0e363b533411e93d) by [@sahrens](https://github.com/sahrens)) +- Update SoLoader to 0.8.2 ([0a6f058b6b](https://github.com/facebook/react-native/commit/0a6f058b6bd0493f7eece972b1f73be3606ca8d5) by [@passy](https://github.com/passy)) +- `console.error` calls, and uncaught exceptions are now displayed in the Metro logs as well ([ffb82cb2f0](https://github.com/facebook/react-native/commit/ffb82cb2f052f276a94a004d5acea0ab44f8098c) by [@mweststrate](https://github.com/mweststrate)) +- Upgrade Flipper to 0.37.0 ([17f025bc26](https://github.com/facebook/react-native/commit/17f025bc26da13da795845a3f7daee65563420c0) by [@sunnylqm](https://github.com/sunnylqm)) + +#### Android specific + +- Upgraded to Hermes 0.5.0 ([4305a291a9](https://github.com/facebook/react-native/commit/4305a291a9408ca65847994bbec42f1fbc97071d) by [@willholen](https://github.com/willholen)) +- Internal storage now will be preferred for caching images from `ImageEditor`. ([79efa43428](https://github.com/facebook/react-native/commit/79efa4342852a3e9271a56e3a0fb7c15be664e9a) by [@kitttn](https://github.com/kitttn)) +- Update Gradle Wrapper to 6.2 ([d4d8887b50](https://github.com/facebook/react-native/commit/d4d8887b5018782eeb3f26efa85125e6bbff73e4) by [@friederbluemle](https://github.com/friederbluemle)) +- Upgrade Folly to v2020.01.13.00 ([6e2131b8fa](https://github.com/facebook/react-native/commit/6e2131b8fa85da8b3fb0391803e7fbecba890ffb) by [@Kudo](https://github.com/Kudo)) +- Only update dimensions in `ReactRootView` if they've changed ([cc3e27d484](https://github.com/facebook/react-native/commit/cc3e27d484d3a412f632454b7f1c637b2c271af2) by [@ejanzer](https://github.com/ejanzer)) +- `ReactEditText` extends `AppCompatEditText` ([aaa2765a92](https://github.com/facebook/react-native/commit/aaa2765a920de8234f0def4cae05ca5d6c8c8ac8) by [@dulmandakh](https://github.com/dulmandakh)) +- Make `ReactApplicationContext` nullable as the constructor argument of `ReactContextBaseJavaModule` ([f8d5c5bfd7](https://github.com/facebook/react-native/commit/f8d5c5bfd79be0e20a205a1856bd9946143eeacf) by [@RSNara](https://github.com/RSNara)) +- Update Android Gradle plugin to 3.5.3 ([e1e081b00e](https://github.com/facebook/react-native/commit/e1e081b00e5efb32bce74211c850212eca8a9412) by [@SaeedZhiany](https://github.com/SaeedZhiany)) +- Don't emit dimensions update event on initial load ([383934a06e](https://github.com/facebook/react-native/commit/383934a06e22e8e1a5ee50d121722240259f95d0) by [@ejanzer](https://github.com/ejanzer)) +- Bump Android build-tools to 29.0.2, compileSdk to 29 ([edcbfb9821](https://github.com/facebook/react-native/commit/edcbfb98210d9aaa6bb1d7c64281ae9cfb41cac2) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- Disambiguate autolinking-ios.rb script from CLI’s “autolinking” feature and bring RNTester & template in line. ([4118d79826](https://github.com/facebook/react-native/commit/4118d798265341061105f3a53550db83c66a71cb) by [@alloy](https://github.com/alloy)) +- Updated Flipper iOS integration to be included by default in the `Debug` configuration ([619d5d60df](https://github.com/facebook/react-native/commit/619d5d60dfa94966e7104febec08166c1b5eca49) by [@alloy](https://github.com/alloy)) +- Use Apple unified logging API (os_log) ([f501ed682a](https://github.com/facebook/react-native/commit/f501ed682ae68136d966aee2b0d3cc0f1e8b90cd) by [@LeoNatan](https://github.com/LeoNatan)) +- Upgrade Folly to v2020.01.13.00 ([a27e31c059](https://github.com/facebook/react-native/commit/a27e31c059971b1d554ad6c7c81706f08eafac87) by [@Kudo](https://github.com/Kudo)) +- Remove the `xcshareddata` from .gitignore ([7980615d37](https://github.com/facebook/react-native/commit/7980615d371a7bf607a3787bca91cfde229c41dc) by [@pvinis](https://github.com/pvinis)) +- Add `complete_nullability = True` to compatible libraries ([796a4ea7e3](https://github.com/facebook/react-native/commit/796a4ea7e31ae05b76e59e02ab05f9c955f7c149)) +- Remove the Flipper pod post install step ([44beb2a685](https://github.com/facebook/react-native/commit/44beb2a685b7ceb0311bde7d0d33cb70bb891d30) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) +- Enable Flipper with CocoaPods `:configuration` ([7bb1c4e1b8](https://github.com/facebook/react-native/commit/7bb1c4e1b8715a5c9cb6f9e4e77a6df783481d3d) by [@alloy](https://github.com/alloy)) + +### Removed + +- Remove unused`ImageProp` ([fbd09b1797](https://github.com/facebook/react-native/commit/fbd09b179759cd90f2be5c24caa11bdb483ad8cd) by [@Naturalclar](https://github.com/Naturalclar)) +- Remove leftover `Incremental` component ([e99800267b](https://github.com/facebook/react-native/commit/e99800267b78aa581aff956d47b8be91858628b9) by [@venits](https://github.com/venits)) +- Remove "Debug with Nuclide" option ([011eb4cea5](https://github.com/facebook/react-native/commit/011eb4cea5d482cef54d7659e7436a04e539ff19) by [@rickhanlonii](https://github.com/rickhanlonii)) + +#### Android specific + +- Remove unused Feature Flag: `lazilyLoadViewManagers` ([3963f34980](https://github.com/facebook/react-native/commit/3963f34980f501ef89a945a1d0e76716af84527d) by [@JoshuaGross](https://github.com/JoshuaGross)) +- `PickFirst` options for RNTester and template ([4bb0b4f205](https://github.com/facebook/react-native/commit/4bb0b4f205b1bc9a91150fe1f609f7d7313eb806) by [@passy](https://github.com/passy)) +- Remove Kotlin version from the default template ([ced959bb3d](https://github.com/facebook/react-native/commit/ced959bb3d6abdab30c5e64af9bff6059b111cdd) by [@grabbou](https://github.com/grabbou)) + +#### iOS specific + +- Remove core `RCTConvert` CoreLocation Libraries ([bcf2a716fb](https://github.com/facebook/react-native/commit/bcf2a716fb8b8954d6f7b801a1699eeea9418e73) by [@maschad](https://github.com/maschad)) +- Remove copyright notices from iOS application template ([9c3fa57337](https://github.com/facebook/react-native/commit/9c3fa573379bb4824bbe02b5b5aa1ae3502772d8) by [@alloy](https://github.com/alloy)) +- Remove three properties: `textColor`, `font` and `textAlignment` from `RCTBackedTextInputViewProtocol`, unifying the usage into `defaultTextAttributes`. ([aff6bad27c](https://github.com/facebook/react-native/commit/aff6bad27c6c2232ba8bde17823d0a0db4ac589b) by [@jimmy623](https://github.com/jimmy623)) + +### Fixed + +- Add support to render `` with no fixed size nested within a `` ([dbb7eacb42](https://github.com/facebook/react-native/commit/dbb7eacb429adb4160e740017c212bfd6df0f03a) by [@mdvacca](https://github.com/mdvacca)) +- Fixes bug where `` would crash. ([66601e755f](https://github.com/facebook/react-native/commit/66601e755fcad10698e61d20878d52194ad0e90c) by [@TheSavior](https://github.com/TheSavior)) +- Use new `setTextCursorDrawable` API for Android 10 ([e7a14b803f](https://github.com/facebook/react-native/commit/e7a14b803fdc8840bbcde51d4bfa9cf9a85a8472) by [@sturmen](https://github.com/sturmen)) +- Fix `Animated.Value` initialized with undefined in `ScrollView` ([cf02bd9b76](https://github.com/facebook/react-native/commit/cf02bd9b765e29ed8aa2bbf62661e89c84bb80e5) by [@janicduplessis](https://github.com/janicduplessis)) +- Do not explicitly include `.js` in Library imports ([161b910494](https://github.com/facebook/react-native/commit/161b9104941663dcc0b08a73789c0ff3410fc661) by [@NickGerleman](https://github.com/NickGerleman)) +- Fixed `Pressability` to properly fire `onLongPress`. ([5ca1d8f260](https://github.com/facebook/react-native/commit/5ca1d8f260bfb64111a6ba39f76a0a935829c0f2) by [@yungsters](https://github.com/yungsters)) +- Fixed typo from `inly` to `only` inside `Modal.js` library code. ([686d8a57f8](https://github.com/facebook/react-native/commit/686d8a57f889fe74dc1c66566c80f0ed6d677729) by [@Darking360](https://github.com/Darking360)) +- Fix viewability calculations for nested `VirtualizedLists` inside of a parent list's `FooterComponent` ([074a2fab74](https://github.com/facebook/react-native/commit/074a2fab74754c28cba0ccc51552a246a3046501) by [@logandaniels](https://github.com/logandaniels)) +- Fix android `TextInput` transitions ([0a17a4fe56](https://github.com/facebook/react-native/commit/0a17a4fe56ff2cabc3c7d1cc5b34bd3fdd032e59)) +- Remove JS autoFocus implementation ([0569d4c431](https://github.com/facebook/react-native/commit/0569d4c4315d61d2d8f4ab628a54eb1e1db45dc2) by [@janicduplessis](https://github.com/janicduplessis)) +- Check null values in `shouldAnimate` ([3498b3b96b](https://github.com/facebook/react-native/commit/3498b3b96b2e27c7c7f6407b3673b44540871a31) by [@axe-fb](https://github.com/axe-fb)) +- Fix `AccessibilityInfo.isScreenReaderEnabled` mock in Jest setup ([ec3327b61a](https://github.com/facebook/react-native/commit/ec3327b61ab1be3fd1565c8a35fe56747bd9069f) by [@rubennorte](https://github.com/rubennorte)) +- Fix crash when passing invalid UTF-16 data from JSC into native code ([011cf3f884](https://github.com/facebook/react-native/commit/011cf3f88428ca83552d0b51c7c3a0c47b9728e5) by [@motiz88](https://github.com/motiz88)) +- Make `YGValue.h` compile with Clang on Windows ([014bc95135](https://github.com/facebook/react-native/commit/014bc95135a38d65b991509492c0979cfd153e71) by [@christophpurrer](https://github.com/christophpurrer)) +- Fix documentation comments for HermesJS's `Function::callWithThis` method to accurately reflect how `this` is handled. ([399bda5284](https://github.com/facebook/react-native/commit/399bda52840161bf7d30c09eca061b4378b8f6e4) by [@Kronopath](https://github.com/Kronopath)) +- Fix resolving assets outside of the project root ([7deeec7396](https://github.com/facebook/react-native/commit/7deeec73966d84140492c2a767819977318c4d2d) by [@janicduplessis](https://github.com/janicduplessis)) +- Transform empty responses into empty `Blob`s ([9a8c06b502](https://github.com/facebook/react-native/commit/9a8c06b502c774f7a0bff1bdc064fbfe16ca75be) by [@RSNara](https://github.com/RSNara)) +- Fix validation of event mappings for `AnimatedEvent` ([19362f6116](https://github.com/facebook/react-native/commit/19362f6116bad441c5e23f2bab420af78664b3d3) by [@javache](https://github.com/javache)) +- Fix `NativeJSCHeapCapture` ([7e3a43c23d](https://github.com/facebook/react-native/commit/7e3a43c23d028a4481bc455dd28c391a81ff1a94) by [@RSNara](https://github.com/RSNara)) +- Add `AnimationInterpolation` as possible type for toValue ([26e8870fbf](https://github.com/facebook/react-native/commit/26e8870fbf310f0fb438a86cb2fe260f0bc419b9) by [@nabati](https://github.com/nabati)) +- Fix return type of `StyleSheet.create` ([4e71a30969](https://github.com/facebook/react-native/commit/4e71a30969d74073309d0350be55cadb84ae43ff) by [@jbrown215](https://github.com/jbrown215)) +- Adjust HelloWorld-tvOSTests/Info.plist `CFBundleIdentifier` to use `PRODUCT_BUNDLE_IDENTIFIER` ([98ebc1ea25](https://github.com/facebook/react-native/commit/98ebc1ea25102049ec53288a458ff16ed5b4ada0) by [@MoOx](https://github.com/MoOx)) +- Fix bug where if `Error` global is not callable when building an error, jsi will throw a JS exception back to JS code. #158 ([a195447539](https://github.com/facebook/react-native/commit/a1954475394dc03704a2e093e6fc4b48188640fa) by [@mhorowitz](https://github.com/mhorowitz)) +- Fix stylesheet validation for functions with custom prototype methods. ([f464dad5d4](https://github.com/facebook/react-native/commit/f464dad5d4f0fbf1cb23e21d22907ffddeaf97e4)) +- Fix sporadic issue with `onEndReached` called on load when not needed ([8ddf231306](https://github.com/facebook/react-native/commit/8ddf231306e3bd85be718940d04f11d23b570a62) by [@sahrens](https://github.com/sahrens)) +- Correct argument types of `NativeJSDevSupport.onSuccess` ([b42371da5a](https://github.com/facebook/react-native/commit/b42371da5a41916522b569a66c0a126333cf9cac) by [@RSNara](https://github.com/RSNara)) +- Add `URLSearchParams` and `Headers` to eslint globals ([7a13a1a88f](https://github.com/facebook/react-native/commit/7a13a1a88fdf26dca817b76399f1c86a8a05eccb) by [@sonnyp](https://github.com/sonnyp)) +- Export exception classes with default visibility ([84adc85523](https://github.com/facebook/react-native/commit/84adc85523770ebfee749a020920e0b216cf69f8) by [@appden](https://github.com/appden)) +- Add `URL` to eslint globals. ([ff9def41ff](https://github.com/facebook/react-native/commit/ff9def41ff3e7760d076bf1b899583d4b36cba0d) by [@sonnyp](https://github.com/sonnyp)) +- Plumb through memory allocation profiler feature to Chrome Inspector ([ed3054927c](https://github.com/facebook/react-native/commit/ed3054927c30c8823f78026b9c4cb42fbe4f8b00) by [@jbower-fb](https://github.com/jbower-fb)) +- Better monorepo support when building release apk ([a8e85026cf](https://github.com/facebook/react-native/commit/a8e85026cfa60056b1bcbcd39cde789e4d65f9cb) by [@grabbou](https://github.com/grabbou)) +- `LogBox` - Fix dependency cycle ([6ba2aeefa8](https://github.com/facebook/react-native/commit/6ba2aeefa8dfe031bf1dc46dbea29235aec31d61) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Always update background color and bar style on Android status bar ([9457efa84c](https://github.com/facebook/react-native/commit/9457efa84c872f029027cdcfc3bae4f403715e48)) +- Disable accessibility state changes of the focused view for Android API < 21 ([f2d58483c2](https://github.com/facebook/react-native/commit/f2d58483c2aec689d7065eb68766a5aec7c96e97) by [@mdvacca](https://github.com/mdvacca)) + +#### Android specific + +- Gradle release config ([0d1fb458ab](https://github.com/facebook/react-native/commit/0d1fb458ab8027dcfac5f2fa11e8c16d6853c59c) by [@vdmtrv](https://github.com/vdmtrv)) +- Change how `TextInput` responds to `requestFocus` to fix a11y focus issue ([d4a498aba2](https://github.com/facebook/react-native/commit/d4a498aba2d2843e7a741a31b0c91c6a79a7386c) by [@ejanzer](https://github.com/ejanzer)) +- Fixed style in `TextInputTestCase` ([8c493804f3](https://github.com/facebook/react-native/commit/8c493804f3f7b3ae3761679a978971ab9d71baa0) by [@ejanzer](https://github.com/ejanzer)) +- Fix template instacrash from missing androidx dependency ([a1b14deb3e](https://github.com/facebook/react-native/commit/a1b14deb3e32df797aae99a75743a4d283e5337b) by [@alloy](https://github.com/alloy)) +- Implement native `TextInput` `autoFocus` on Android ([055a41b081](https://github.com/facebook/react-native/commit/055a41b081c5bc9535b071d9b4b7488b92e71803) by [@janicduplessis](https://github.com/janicduplessis)) +- Support for case insensitive `Origin` headers for `Websockets` ([aeaf286c77](https://github.com/facebook/react-native/commit/aeaf286c77b50a95c4961de0d2355caad8ffa396) by [@brunobar79](https://github.com/brunobar79)) +- RNTester Buck Build ([a3cb377645](https://github.com/facebook/react-native/commit/a3cb377645f2ccb7632ded73c230a41025d38f6f) by [@passy](https://github.com/passy)) +- Fix bug in updating dimensions in JS ([bef845ffd5](https://github.com/facebook/react-native/commit/bef845ffd521aa83d779de584ec370f9f88f27f3) by [@ejanzer](https://github.com/ejanzer)) +- Applied missing changes from bumping Gradle wrapper to 6.0.1 ([aa0ef15335](https://github.com/facebook/react-native/commit/aa0ef15335fe27c0c193e3e968789886d82e82ed) by [@SaeedZhiany](https://github.com/SaeedZhiany)) +- Unregister `JSDevSupport` from `DebugCorePackage` ([c20963e11c](https://github.com/facebook/react-native/commit/c20963e11cc1c10f20a2a0a3c209f5b403c9e899) by [@RSNara](https://github.com/RSNara)) +- Make sure `ServerHost` is optional in `NativePlatformConstants.js` ([048f88a33a](https://github.com/facebook/react-native/commit/048f88a33a53ebd4e45865b319c42291f1d6c7f2) by [@RSNara](https://github.com/RSNara)) +- Removed code that would cause accessibility header role to be spoken twice ([7428271995](https://github.com/facebook/react-native/commit/7428271995adf21b2b31b188ed83b785ce1e9189) by [@KevinGVargas](https://github.com/KevinGVargas)) +- Fail silently in `AppStateModule.sendEvent` if `CatalystInstance` is not available ([c4806fada6](https://github.com/facebook/react-native/commit/c4806fada6532894e2242cf31f7145d2992e3a2b) by [@JoshuaGross](https://github.com/JoshuaGross)) +- RN `Picker` - fix types in `AndroidDialogPickerManagerInterface` ([56b0f5cb6b](https://github.com/facebook/react-native/commit/56b0f5cb6ba48ecefc2890152ebe88e3df61a0ea)) +- Fix Hermes debugger being disabled by default ([b8621f5d30](https://github.com/facebook/react-native/commit/b8621f5d303442ab78dc5d745cfc86a941d4737c) by [@willholen](https://github.com/willholen)) + +#### iOS specific + +- Fixed connection of metro reload command to iOS device ([f9df93385e](https://github.com/facebook/react-native/commit/f9df93385eee0e1cd1144a65e05410dfb48b119c) by [@reyalpsirc](https://github.com/reyalpsirc)) +- Remove `RCTDevLoadingView` jank ([faff19a7c6](https://github.com/facebook/react-native/commit/faff19a7c651c740d8d649b86727b63b63562b20) by [@RSNara](https://github.com/RSNara)) +- Fix crash when passing null value in object parameter of bridged method ([15434c7c43](https://github.com/facebook/react-native/commit/15434c7c435928a40b9cd66fe9f5d1bcdea8d954)) +- Get ready for Clang 10 ([8721ee0a6b](https://github.com/facebook/react-native/commit/8721ee0a6b10e5bc8a5a95809aaa7b25dd5a6043) by [@maxovtsin](https://github.com/maxovtsin)) +- Fix `RCTBlobManager` cleanup crash ([91c5ff4a12](https://github.com/facebook/react-native/commit/91c5ff4a12982ccead56c9c038761e9316d01409) by [@RSNara](https://github.com/RSNara)) +- Make Lambda function called in `NativeModule` mutable ([5290047d09](https://github.com/facebook/react-native/commit/5290047d09c0a41c85a1d47a638877c226d9c191) by [@maschad](https://github.com/maschad)) +- Fix crash in `RCTCxxBridge.executeApplicationScript` ([0c2db3256f](https://github.com/facebook/react-native/commit/0c2db3256f6cbb3ec564e0f183a52a439ed33f52) by [@ahimberg](https://github.com/ahimberg)) +- Fix `RCTDevLoadingView` `RedBox` on reload ([fe5ac2c3f9](https://github.com/facebook/react-native/commit/fe5ac2c3f9e47cfb7c5820a755a5d74d47624953) by [@RSNara](https://github.com/RSNara)) +- Fix `Image` component crashing when `uri` is `null` ([06b8b15b0a](https://github.com/facebook/react-native/commit/06b8b15b0af84b6f8b44d200dc25f29eac51181c) by [@mlazari](https://github.com/mlazari)) +- Fix `RCTDevLoadingView` not showing up with `UIScene` ([74b667dbc2](https://github.com/facebook/react-native/commit/74b667dbc2a48183dec0b9c3b5401bc3f9e54e7b) by [@tido64](https://github.com/tido64)) +- Prevent interactive dismissal for non-fullscreen modals ([1e7ed81d16](https://github.com/facebook/react-native/commit/1e7ed81d16dda4188352e0ccdc0f0bd3ad4741f3)) +- Resolve localization warnings in template ([0e4bcaa296](https://github.com/facebook/react-native/commit/0e4bcaa2960a2b1aa42dbe716fc6a35652aa7207) by [@safaiyeh](https://github.com/safaiyeh)) +- Implement `requiresMainQueueSetup` in `RCTDevSettings.mm` ([adf87dd7ed](https://github.com/facebook/react-native/commit/adf87dd7eddcf65a3300e6ac9092838d9c8a3279) by [@logandaniels](https://github.com/logandaniels)) +- Resolve `React-RCTText` Xcode warning ([04fed6508b](https://github.com/facebook/react-native/commit/04fed6508b74b23c954183af3f6121fb344d2138) by [@safaiyeh](https://github.com/safaiyeh)) +- Resolve Xcode warnings from `React-cxxreact`. ([dc6c57ce0d](https://github.com/facebook/react-native/commit/dc6c57ce0d4f5424bfb047c51fee18eac381a98b) by [@safaiyeh](https://github.com/safaiyeh)) +- `RCTReconnectingWebSocket` is reconnecting infinitely when stopped before getting connected ([0d4b0e9417](https://github.com/facebook/react-native/commit/0d4b0e941725657d8e63940428888aaceff505ad)) +- Fix prop name of `passwordRules` in `TextInput` ([3f5c42f357](https://github.com/facebook/react-native/commit/3f5c42f357d58268d0a0fd1bfc639f41feab937c) by [@Naturalclar](https://github.com/Naturalclar)) +- Remove need for Swift file in the user’s project in order to use Flipper ([8f93dedc6a](https://github.com/facebook/react-native/commit/8f93dedc6a5653edd2220c65ccb4ff8736ee060c) by [@alloy](https://github.com/alloy)) +- Clear all held `jsi::Functions` when `jsi::Runtime` is deleted ([9ae95582e7](https://github.com/facebook/react-native/commit/9ae95582e792a3dca4487bdce9080c6d874c7dd7) by [@RSNara](https://github.com/RSNara)) +- Make framework builds work again by making `RCTImageLoader` C++ requirement opt-in ([25571ec452](https://github.com/facebook/react-native/commit/25571ec4522931193b41723d3f80b3bced1fca3b) by [@alloy](https://github.com/alloy)) +- Enable dev keyboard shortcuts on Mac Catalyst ([56dfc86d64](https://github.com/facebook/react-native/commit/56dfc86d64a2a1f2ad05239b6d11aacac73cbac9) by [@charpeni](https://github.com/charpeni)) +- Fix `RCTTextView` layout issue that happens on some font with `leading` attribute not equal to zero, which causes wrong base-alignment layout ([5d08aab526](https://github.com/facebook/react-native/commit/5d08aab526b2702b46ff75ea7e943a33aa6df288)) +- Fix LAN instead of Wi-Fi device bundle configuration ([d1e6f8d3c4](https://github.com/facebook/react-native/commit/d1e6f8d3c4de1fbb4bddd5205cd3b35c572b495b) by [@Oleg-E-Bakharev](https://github.com/Oleg-E-Bakharev)) +- Add autorelease pool for each run loop for JS Thread ([948cbfdacc](https://github.com/facebook/react-native/commit/948cbfdacc42f8d2640e69f61df55f6adb823fcf) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fixed bug in implementation of ``'s `selectOnFocus` prop ([e020576b34](https://github.com/facebook/react-native/commit/e020576b34fb6ca6d3f9fe38916844b78a45c0e3) by [@shergin](https://github.com/shergin)) +- `RCTRedBox` doesn't appear in apps implementing `UISceneDelegate` ([d0a32c2011](https://github.com/facebook/react-native/commit/d0a32c2011ca00991be45ac3fa320f4fc663b2e8) by [@tido64](https://github.com/tido64)) +- Fixes the `InputAccessoryView.backgroundColor` prop’s typing to use `ColorValue`. ([a43fd60e18](https://github.com/facebook/react-native/commit/a43fd60e18aff9ee6bcaf8ec576adb8678d5bcf4) by [@alloy](https://github.com/alloy)) +- Fix `Animated` image crash when `CADisplayLink` target in `RCTWeakProxy` is `nil` ([e5a6655e71](https://github.com/facebook/react-native/commit/e5a6655e71d41a58ce0e51d37aa9fb8792e37dd5) by [@p-sun](https://github.com/p-sun)) + +## v0.62.3 + +### Security + +- Update validateBaseUrl to use latest regex ([33ef82ce6d](https://github.com/facebook/react-native/commit/33ef82ce6dfd31e1f990d438c925a0e52723e16b) by [@FBNeal](https://github.com/FBNeal)) + +### Fixed + +#### iOS specific + +- Change autolink to match requirements for FlipperFolly working with Xcode 12.5 ([c6f4611dcb](https://github.com/facebook/react-native/commit/c6f4611dcbfbb64d5b54e242570e2a1acffcabef) by [@kelset](https://github.com/kelset)) +- Change podfile to rely on the autolink-ios rb file ([c4ea556d64](https://github.com/facebook/react-native/commit/c4ea556d64c7fc146d1412548788c48bbcc0f6bb) by [@kelset](https://github.com/kelset)) +- Update detox to work on Xcode 12 ([158b558e50](https://github.com/facebook/react-native/commit/158b558e500576f434dec09417bb02cc0bc53f7a) by [@kelset](https://github.com/kelset)) + +## v0.62.2 + +### Fixed + +- Fix Appearance module when using Chrome Debugger ([f7b90336be](https://github.com/facebook/react-native/commit/f7b90336be25b78935549aa140131d4d6d133f7b) by [@TheSavior](https://github.com/TheSavior)) +- Fix mock for TextInput ([5a3c6faee9](https://github.com/facebook/react-native/commit/5a3c6faee9c44a2d99b13d113c91dbf98990f8af) by [@SergioEstevao](https://github.com/SergioEstevao)) +- Flow errors from YellowBox and BubblingEventHandler ([a049130f34](https://github.com/facebook/react-native/commit/a049130f34be951c9c67d2a472c7eb7f3d08f070) by [@thymikee](https://github.com/thymikee)) + +#### iOS specific + +- Make Vibration library compatible with TurboModules. ([3904228704](https://github.com/facebook/react-native/commit/390422870466beba571dda04f669380e14055056) by [@brunobar79](https://github.com/brunobar79)) +- Exclude Flipper from iOS Release builds ([e5497ca8f6](https://github.com/facebook/react-native/commit/e5497ca8f6e3b240948fdbeef0ac2a710f25bb56) by [@javiercr](https://github.com/javiercr)) +- Fix crash when enabling Performance Monitor on iOS 13.4 ([e2c417f7cf](https://github.com/facebook/react-native/commit/e2c417f7cf5ae7efa5ea1f9644a51c4c706a983f) by [@IjzerenHein](https://github.com/IjzerenHein)) + +## v0.62.1 + +### Fixed + +- Bump CLI to 4.5.1 to improve DX ([eac56b9749](https://github.com/facebook/react-native/commit/eac56b9749ed624275d4190b5e48b775583acb3f) by [@alloy](https://github.com/alloy)) +- Fix a YellowBox regression in v0.62.0 where the Flipper network inspector causes YellowBox to crash the app due to using base64 images. ([227aa96bb2](https://github.com/facebook/react-native/commit/227aa96bb23b6ff20eebbd8a9335fd172ed6005b) by [@rickhanlonii](https://github.com/rickhanlonii)) + +#### Android specific + +- Add new DoNotStrip class to proguard config ([cfcf5eba43](https://github.com/facebook/react-native/commit/cfcf5eba4317f80ef8902463b7c0b2e1e7b534a7) by [@janicduplessis](https://github.com/janicduplessis)) + +#### iOS specific + +- Fix Performance Monitor in dark appearance ([576ddfb3a8](https://github.com/facebook/react-native/commit/576ddfb3a84a5461679959f0d3f229a000dcea8d) by [@gorhom](https://github.com/gorhom)) +- Inverted ScrollViews scroll to their bottom when the status bar is pressed ([7a4753d76a](https://github.com/facebook/react-native/commit/7a4753d76aab1c52a09f26ec6f7fd43a68da8a97) by [@emilioicai](https://github.com/emilioicai)) +- Revert [previous incomplete fix](https://github.com/facebook/react-native/commit/bd2b7d6c0366b5f19de56b71cb706a0af4b0be43) for [an issue](https://github.com/facebook/react-native/issues/26473) with `Modal`’s `onDismiss` prop. ([27a3248a3b](https://github.com/facebook/react-native/commit/27a3248a3b37410b5ee6dda421ae00fa485b525c) by [@grabbou](https://github.com/grabbou)) +- Fix double call to onEndReached in VirtualizedList ([d3658bc2b6](https://github.com/facebook/react-native/commit/d3658bc2b6437e858d3b3f5688277dedbca779b8) by [@MartinSherburn](https://github.com/MartinSherburn)) + +### Changed + +- Update warning message of deprecated imports ([405200e9a9](https://github.com/facebook/react-native/commit/405200e9a930cded47954f374f2a779ec769cd4c) by [@Naturalclar](https://github.com/Naturalclar)) + +## v0.62.0 + +This major release includes Flipper support by default, improved dark mode support, moving Apple TV to [react-native-tvos](https://github.com/react-native-community/react-native-tvos), and more. See the [blog post](https://reactnative.dev/blog/2020/03/26/version-0.62) for all of the highlights. + +This release comes in the midst of a global pandemic. We’re releasing this version today to respect the work of hundreds of contributors who made this release possible and to prevent the release from falling too far behind master. Please be mindful of the reduced capacity of contributors to help with issues and prepare to delay upgrading if necessary. + +If you're upgrading, manual intervention may be required for your app. Please see the [upgrade-helper](https://react-native-community.github.io/upgrade-helper/) for a detailed breakdown of the changes required and see [this issue](https://github.com/react-native-community/releases/issues/179) for known issues. + +One known issue with workaround is regarding Android builds and [APK size increases](https://github.com/facebook/react-native/issues/28330). + +### Breaking + +- React DevTools v4 integration ([92a3c9da0a](https://github.com/facebook/react-native/commit/92a3c9da0a38870a8bad7c91bdc3ddb494f6e5f2) by [@bvaughn](https://github.com/bvaughn)) +- Remove `TextInput`'s `onTextInput` prop ([3f7e0a2c96](https://github.com/facebook/react-native/commit/3f7e0a2c9601fc186f25bfd794cd0008ac3983ab) by [@shergin](https://github.com/shergin)) +- Remove `TextInput`'s `inputView` prop ([1804e7cbea](https://github.com/facebook/react-native/commit/1804e7cbea707a35046118090966a54031edfae8) by [@TheSavior](https://github.com/TheSavior)) +- Animated: Remove `defaultProps` Parameter ([a70987cee2](https://github.com/facebook/react-native/commit/a70987cee24bcd027b9c4a5aa85dfd6a1aab74b3) by [@yungsters](https://github.com/yungsters)) +- Remove `TextInput`'s `selectionState` prop ([2becdfd404](https://github.com/facebook/react-native/commit/2becdfd4041f7f28138ba3a61c03e17c06dc2e50) by [@yungsters](https://github.com/yungsters)) +- Remove support for `framesToPop` ([8bc02fdd52](https://github.com/facebook/react-native/commit/8bc02fdd52124d0a24d96e4a61d7688328ef1660) [cf4d45ec2b](https://github.com/facebook/react-native/commit/cf4d45ec2bcd301be7793d5840de21ec7d02275b) [a483f802fd](https://github.com/facebook/react-native/commit/a483f802fddfd927f2baa0d95e2b4094d452cddd) by [@motiz88](https://github.com/motiz88)) +- Remove `TimePickerAndroid` ([dbf070c51e](https://github.com/facebook/react-native/commit/dbf070c51ecd14127a8317faa75cb661697b5a6b) by [@cpojer](https://github.com/cpojer)) +- Remove `scrollWithoutAnimationTo` from ScrollView ([c7e89909da](https://github.com/facebook/react-native/commit/c7e89909da70ac5290f9971080eb897567db3e43) by [@TheSavior](https://github.com/TheSavior)) +- Bump CLI to ^4.2.x ([be5088401f](https://github.com/facebook/react-native/commit/be5088401fd8e19d57adda42d275cab437448064) by [@alloy](https://github.com/alloy)) - for details on what v4 of the CLI improves on (like monorepo support), please refer to the [dedicated blog post](https://callstack.com/blog/react-native-cli-3-1-0-and-4-0-0-whats-new/) and the [release notes](https://github.com/react-native-community/cli/releases) +- Remove `accessibilityStates` property ([7b35f427fd](https://github.com/facebook/react-native/commit/7b35f427fd66cb0f36921b992095fe5b3c14d8b9) by [@marcmulcahy](https://github.com/marcmulcahy)) +- Upgraded to Hermes 0.4.0. If you're using ProGuard you will need to add the following rule to `proguard-rules.pro`: `-keep class com.facebook.jni.** { *; }` ([ab3c184555](https://github.com/facebook/react-native/commit/ab3c184555e382b8693cbfcdfe01ba89583ee726) by [@willholen](https://github.com/willholen)) + +#### Android specific + +- Fix setting keyboardType from breaking autoCapitalize ([233fdfc014](https://github.com/facebook/react-native/commit/233fdfc014bb4b919c7624c90e5dac614479076f) by [@safaiyeh](https://github.com/safaiyeh)) +- Limit size of video uploaded from camera roll in android (< 100 MB) ([d21f695edf](https://github.com/facebook/react-native/commit/d21f695edf367166a03af4c6e9376cd498b38665)) +- Remove "Reload on JS change" from RN Android ([478df155e7](https://github.com/facebook/react-native/commit/478df155e70a4ce30219adcac6f0801c4e4d10ec) by [@cpojer](https://github.com/cpojer)) + +### Added + +- Add support for Flipper by default ([multiple commits](https://github.com/facebook/react-native/pulls?q=is%3Apr+Flipper+is%3Aclosed)) +- Add `getNativeScrollRef` method to FlatList component ([bde1d63c85](https://github.com/facebook/react-native/commit/bde1d63c853630609b22c87121c125775dd1f5cb) by [@kacieb](https://github.com/kacieb)) +- Add missing accessibility props on Touchables ([8c0c860e38](https://github.com/facebook/react-native/commit/8c0c860e38f57e18296f689e47dfb4a54088c260) by [@xuelgong](https://github.com/xuelgong)) +- Added missing `console` polyfills in release builds. ([b7ab922bb3](https://github.com/facebook/react-native/commit/b7ab922bb3fd4f9f103e583bed9e9295a9521578) by [@yungsters](https://github.com/yungsters)) +- Platform.select now supports native as an option. ([a6fc0898de](https://github.com/facebook/react-native/commit/a6fc0898de990959d201b9665501deda215e41a4) by [@koke](https://github.com/koke)) +- Export the DevSettings module, add `addMenuItem` method ([cc068b0551](https://github.com/facebook/react-native/commit/cc068b055185e6fb7341bf945f69a74ed3ef4814) by [@janicduplessis](https://github.com/janicduplessis)) +- Expose RCTNetworking as a public 'Networking' API ([42ee5ec934](https://github.com/facebook/react-native/commit/42ee5ec93425c95dee6125a6ff6864ec647636aa) by [@adamchel](https://github.com/adamchel)) +- Add `useColorScheme` hook ([51681e80ab](https://github.com/facebook/react-native/commit/51681e80ab0d1efdaba684b626994b694d53d2a5) by [@hramos](https://github.com/hramos)) +- Add `unstable_enableLogBox` ([dd8e5f468a](https://github.com/facebook/react-native/commit/dd8e5f468a29e299647ffbd0887f53afd24936e3) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Expose Hermes Sampling Profiler ([15ecb60d6d](https://github.com/facebook/react-native/commit/15ecb60d6deb96fcb7b0ef70faccd10594ededa3) by [@axe-fb](https://github.com/axe-fb)) +- Add `error-subclass-name` lint rule ([6611c4b8f4](https://github.com/facebook/react-native/commit/6611c4b8f42520add983cc48fe4e14f7a02cc7cf) by [@motiz88](https://github.com/motiz88)) +- Add `HostComponent` to the public API of React Native ([a446a38aaa](https://github.com/facebook/react-native/commit/a446a38aaab5bea2e279f1958cfd90090bfd7e09) by [@TheSavior](https://github.com/TheSavior)) +- Add `RCTExceptionsManager.reportException` ([9a57145f52](https://github.com/facebook/react-native/commit/9a57145f52a03678da02d5d00cbe11eed3f5a0fc) by [@motiz88](https://github.com/motiz88)) +- Add `accessibilityValue` property ([7df3eea1a7](https://github.com/facebook/react-native/commit/7df3eea1a79f12c2dfff1976d0cef605a83232ec) by [@marcmulcahy](https://github.com/marcmulcahy)) +- Add `Appearance` module to expose the user's current Night theme preference ([17862a78db](https://github.com/facebook/react-native/commit/17862a78db59d60fe316961f9111efc330ba2abd) [63fa3f21c5](https://github.com/facebook/react-native/commit/63fa3f21c5ab308def450bffb22054241a8842ef) by [@hramos](https://github.com/hramos)) +- Add `onSlidingComplete` callbacks when sliders adjusted via a11y. ([c7aa6dc827](https://github.com/facebook/react-native/commit/c7aa6dc8270c0eabc913fe6c617c8131e3f4b3c5) by [@marcmulcahy](https://github.com/marcmulcahy)) + +#### Android specific + +- Implement `adjustsFontSizeToFit` on Android ([2c1913f0b3](https://github.com/facebook/react-native/commit/2c1913f0b3d12147654501f7ee43af1d313655d8) by [@janicduplessis](https://github.com/janicduplessis)) +- Allow overriding `EditText` construction in `ReactTextInputShadowNode` ([a5b5d1a805](https://github.com/facebook/react-native/commit/a5b5d1a805a9c54d325763b432be1cf2c8811dc9) by [@mchowning](https://github.com/mchowning)) +- Add Android support for `fontVariant` prop ([c2c4b43dfe](https://github.com/facebook/react-native/commit/c2c4b43dfe098342a6958a20f6a1d841f7526e48) by [@mcuelenaere](https://github.com/mcuelenaere)) +- Custom entry file on android using `ENTRY_FILE` environment variable ([a0d8740878](https://github.com/facebook/react-native/commit/a0d87408782fcf191988612198493d9130736c72)) +- Added `statusBarTranslucent` prop to Modal component ([c35a419e5d](https://github.com/facebook/react-native/commit/c35a419e5d2eca4fe9cd0939df085088fa88423b) by [@pfulop](https://github.com/pfulop)) +- Add `fadingEdgeLength` prop to FlatList and ScrollView ([51aacd5241](https://github.com/facebook/react-native/commit/51aacd5241c4b4c0b9b1e1b8f9dabac45e5b5291)) +- Support `removeClippedSubviews` for horizontal ScrollViews ([42152a3fa3](https://github.com/facebook/react-native/commit/42152a3fa3f949f5112461753eb44a436355dfb1)) +- Introducing `ReactCallerContextFactory` interface ([9713b63d9a](https://github.com/facebook/react-native/commit/9713b63d9ac1e1ae85accd86b78b351ac6295d01) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- Added web socket support for macOS ([f21fa4ecb7](https://github.com/facebook/react-native/commit/f21fa4ecb73551bdc4c3d70db9fc13e93b19b3a6) by [@andymatuschak](https://github.com/andymatuschak)) +- Added Warning message Linking API with Phones in iOS Simulator ([e1d89fbd9d](https://github.com/facebook/react-native/commit/e1d89fbd9df91679ec36e955a3d0f699c2d5e777) by [@espipj](https://github.com/espipj)) +- Added missing deps for React-CoreModules ([15b2353382](https://github.com/facebook/react-native/commit/15b2353382c46dc5f0130ff44b9deb6a2361e3e5) by [@fkgozali](https://github.com/fkgozali)) +- Expose the `isPackagerRunning` methods on RCTBundleURLProvider ([fe9cba74fa](https://github.com/facebook/react-native/commit/fe9cba74fa6241b4c38a3df9481d3634ebd51bf9) by [@afoxman](https://github.com/afoxman)) +- Add `autoFocus` to TextInput ([6adba409e6](https://github.com/facebook/react-native/commit/6adba409e6256fd2dcc27a4272edcedae89927af) by [@janicduplessis](https://github.com/janicduplessis)) + +### Changed + +- Upgrade metro version to 0.56.3 ([4b487ba500](https://github.com/facebook/react-native/commit/4b487ba50025becb6a83c805b99d45651db6b8c1) by [@EssamEmad](https://github.com/EssamEmad)) +- Upgrade `eslint-plugin-relay` to 1.3.12 ([f0bcfbe9be](https://github.com/facebook/react-native/commit/f0bcfbe9be0eb6a06d096a682717a23e43c39d52) by [@jstejada](https://github.com/jstejada)) +- Upgrade to Flow v0.108.0 ([d34bc5fa64](https://github.com/facebook/react-native/commit/d34bc5fa64a54dfc2e780461ee2997a4b17f8c65) by [@mvitousek](https://github.com/mvitousek)) +- Upgrade metro babel preset ([cef001713f](https://github.com/facebook/react-native/commit/cef001713fc6384353bbcb4d45645ceee44ed1a9) by [@alloy](https://github.com/alloy)) +- TextInput now properly sends native the end selection location on change ([dff490d140](https://github.com/facebook/react-native/commit/dff490d140010913d3209a2f3e987914b9c4eee4) by [@TheSavior](https://github.com/TheSavior)) +- TextInput now uses `forwardRef` allowing it to be used directly by new APIs requiring a host component. ([bbc5c35a61](https://github.com/facebook/react-native/commit/bbc5c35a61cd3af47ccb2dc62430e4b6a4d4e08f) by [@TheSavior](https://github.com/TheSavior)) +- TextInput no longer does an extra round trip to native on focus/blur ([e9b4928311](https://github.com/facebook/react-native/commit/e9b4928311513d3cbbd9d875827694eab6cfa932) by [@TheSavior](https://github.com/TheSavior)) +- Render collapsed JavaScript frames in RedBox ([468d1a2d2e](https://github.com/facebook/react-native/commit/468d1a2d2e6c72d7c6d435ecaad8499997584de6) by [@motiz88](https://github.com/motiz88)) +- Enable `no-useless-escape` lint rule ([90977b0e00](https://github.com/facebook/react-native/commit/90977b0e00acc6b3263502017c27094392e89478) by [@motiz88](https://github.com/motiz88)) +- Update `DevSettings.reload` to accept a reason ([549cac63cb](https://github.com/facebook/react-native/commit/549cac63cb252037f73453c5d4e7ae5f15586607) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Move `react-native-implementation.js` to `index.js` ([e54ecf907e](https://github.com/facebook/react-native/commit/e54ecf907e9f0660d05dc807ec0e67127143ebed) by [@cpojer](https://github.com/cpojer)) +- Delete Long Press Error in Touchable ([9a3d722ccb](https://github.com/facebook/react-native/commit/9a3d722ccb523f227ffd7770a809996e6cfe75d9) by [@yungsters](https://github.com/yungsters)) +- Add Intl to eslint globals. ([f6a62f9ae2](https://github.com/facebook/react-native/commit/f6a62f9ae2278c0f3a1e5c1a6ec3b7cca3421a41)) +- Add WebSocket to eslint globals ([af8ea06bb4](https://github.com/facebook/react-native/commit/af8ea06bb44e84ce51d4ca4e76f0d66bf34323bd) by [@dr2009](https://github.com/dr2009)) +- Change default `accessibilityRole` of Switch component from `button` to `switch` ([36672c3851](https://github.com/facebook/react-native/commit/36672c3851a044a1ab0edcfaa2790c02f7909695) by [@alvinmatias69](https://github.com/alvinmatias69)) + +#### Android specific + +- Bump gradle-download-task to 4.0.2 ([088be260b6](https://github.com/facebook/react-native/commit/088be260b6727ba82167fe58cb1ee4410a6920b2) by [@dulmandakh](https://github.com/dulmandakh)) +- Bump Gradle to 6.0.1 ([701e66bde4](https://github.com/facebook/react-native/commit/701e66bde4ea0e404626c7805e2bcdfa0c129c05) by [@dulmandakh](https://github.com/dulmandakh)) +- Bump Gradle wrapper 5.6.4 ([928f4434b9](https://github.com/facebook/react-native/commit/928f4434b9829c90098b1626b03938d932a9c1f6) by [@friederbluemle](https://github.com/friederbluemle)) +- Bump Soloader to 0.8.0 ([614039834b](https://github.com/facebook/react-native/commit/614039834bf255de096f8b1d168832f81b0cf3fa)) +- Update Android Gradle plugin to 3.5.2 ([b41b5ce8ae](https://github.com/facebook/react-native/commit/b41b5ce8ae2902169ae58860da2c70a9233bea53) by [@friederbluemle](https://github.com/friederbluemle)) +- Improve exception message when JSC loading fails ([65d3167a80](https://github.com/facebook/react-native/commit/65d3167a802b2ca04d4f05ff972c2d51765f1e0d) by [@mhorowitz](https://github.com/mhorowitz)) +- Expose `addCookies` method ([cc845ccfb4](https://github.com/facebook/react-native/commit/cc845ccfb4c0f841b876bca55c5f70efd72be538) by [@safaiyeh](https://github.com/safaiyeh)) +- Migrated from libfb to libfbjni for JNI calls ([9ad5e72b77](https://github.com/facebook/react-native/commit/9ad5e72b77013083f925108870ea6b17f4711a1d) by [@passy](https://github.com/passy)) +- Formatted cpp/h code with clang-format ([d5ba113bb2](https://github.com/facebook/react-native/commit/d5ba113bb2cd839ea38768785e527fbbc9636e41) by [@passy](https://github.com/passy)) +- Switch MainActivity launchMode to singleTask ([7a42596438](https://github.com/facebook/react-native/commit/7a42596438018129d52ff04899ab4ddabd27cdcb) by [@dulmandakh](https://github.com/dulmandakh)) +- Changing method signatures for ImageLoaderModule to accept double for requestId ([641e9657dd](https://github.com/facebook/react-native/commit/641e9657ddab5d1b2676e98d86fd369372281d2c) by [@ejanzer](https://github.com/ejanzer)) +- Use Node's module resolution algorithm to find JSC & Hermes ([fc25f288fe](https://github.com/facebook/react-native/commit/fc25f288fe553cb7e8f04b8ce4b56297b7fa40d5) by [@ide](https://github.com/ide)) +- Add `ACCESS_BACKGROUND_LOCATION` to PermissionsAndroid ([8c099b5f53](https://github.com/facebook/react-native/commit/8c099b5f53405fe0806113ca7ccf0bbe1af92a21) by [@dulmandakh](https://github.com/dulmandakh)) + +#### iOS specific + +- Add `xcscheme` files for iOS template back in. ([a715decd2d](https://github.com/facebook/react-native/commit/a715decd2d3bcdab9537f3246c8398ad9869e94e) by [@pvinis](https://github.com/pvinis)) + +### Deprecated + +- Add deprecation warning to `AccessibilityInfo.fetch` ([523ab83338](https://github.com/facebook/react-native/commit/523ab8333800afbfb169c6fd70ab6611fe07cc2a) by [@TheSavior](https://github.com/TheSavior)) +- Make setting `useNativeDriver` required. Add runtime warning if not specified ([5876052615](https://github.com/facebook/react-native/commit/5876052615f4858ed5fc32fa3da9b64695974238) by [@TheSavior](https://github.com/TheSavior)) +- Refs on an Animated component are now the internal component. The `getNode` call has been deprecated. ([66e72bb4e0](https://github.com/facebook/react-native/commit/66e72bb4e00aafbcb9f450ed5db261d98f99f82a) by [@yungsters](https://github.com/yungsters)) + +#### iOS specific + +- Deprecate `[bridge reload]`, prefer `RCTReloadCommand` ([ffe2306164](https://github.com/facebook/react-native/commit/ffe2306164ed7edfe5ab9d75b5122791037a852a) by [@PeteTheHeat](https://github.com/PeteTheHeat)) + +#### Android specific + +- Deprecate `CallerContext` from `ReactImageManager` ([8accd77c45](https://github.com/facebook/react-native/commit/8accd77c45a4b051bf02904c3485d6a0dcd27631) by [@mdvacca](https://github.com/mdvacca)) + +### Removed + +- Removing experimental `IncrementalPresenter` component ([0ef0d3167e](https://github.com/facebook/react-native/commit/0ef0d3167e291f31ce01ceb729df77cc679d2330) by [@TheSavior](https://github.com/TheSavior)) +- TouchableWithoutFeedback no longer exports Props. Use React.ElementConfig, instead. ([7bcae81299](https://github.com/facebook/react-native/commit/7bcae812997f669de5803cc781dcf3ea65baf0e9) by [@yungsters](https://github.com/yungsters)) +- Remove `Sample` and `CrashyCrash` Modules ([8ec7e0966c](https://github.com/facebook/react-native/commit/8ec7e0966cf83ed29a39aab47c686bc60a124983) by [@RSNara](https://github.com/RSNara)) +- Remove `propTypes` from Animated components. ([86d90c03eb](https://github.com/facebook/react-native/commit/86d90c03ebe39ebc4b2c6dcc0747b4f3a34f5f2f) by [@yungsters](https://github.com/yungsters)) +- Remove `propTypes` from TouchableHighlight. ([7c01172bef](https://github.com/facebook/react-native/commit/7c01172befd07f1d082b18993b87fc880e4b718f) by [@yungsters](https://github.com/yungsters)) +- Remove `propTypes` from TouchableNativeFeedback. ([2185dd298a](https://github.com/facebook/react-native/commit/2185dd298a788c2b713ea17878fd36e06205b4da) by [@yungsters](https://github.com/yungsters)) +- Remove `propTypes` from TouchableOpacity. ([88ae24f719](https://github.com/facebook/react-native/commit/88ae24f719d365b004696aff6461535188ca9f41) by [@yungsters](https://github.com/yungsters)) +- Remove `propTypes` from TouchableWithoutFeedback. ([ebf7d75816](https://github.com/facebook/react-native/commit/ebf7d758164873169937321a4dccc3782359a0d3) by [@yungsters](https://github.com/yungsters)) +- Remove `__skipSetNativeProps_FOR_TESTS_ONLY` from Animated components. ([dcd63078bd](https://github.com/facebook/react-native/commit/dcd63078bdab864830168005b940f638f1e08b23) by [@yungsters](https://github.com/yungsters)) +- Remove Apple TV Props ([548aad4ff1](https://github.com/facebook/react-native/commit/548aad4ff1dfef0d71bdd39aa83ad71e522a2546) by [@yungsters](https://github.com/yungsters)) + +#### Android specific + +- Remove `NativeRunnableDeprecated` ([973253af8a](https://github.com/facebook/react-native/commit/973253af8a47d9ebd137f554054e7a95f8ef2e45) by [@passy](https://github.com/passy)) +- Remove `com.facebook.react.modules.debug.NativeSourceCodeSpec` ([4d9e5f8481](https://github.com/facebook/react-native/commit/4d9e5f8481531000380cf4d3d485fcde1321a37b) by [@RSNara](https://github.com/RSNara)) + +### Fixed + +- Fix `require` cycle warning in ScrollResponder. ([674ac69cee](https://github.com/facebook/react-native/commit/674ac69cee7c1ce6096bee258880e79966322ee0) by [@Naturalclar](https://github.com/Naturalclar)) +- Restore behavior for `underlayColor={null}` in `TouchableHighlight`. ([37d8440a8e](https://github.com/facebook/react-native/commit/37d8440a8e35a53b81914e429502db527790b3cd) by [@yungsters](https://github.com/yungsters)) +- Fix stack traces showing the wrong function name in some cases ([60b4ba16c0](https://github.com/facebook/react-native/commit/60b4ba16c008c23959ebd27ea7215f83878d1343) by [@motiz88](https://github.com/motiz88)) +- Fix `requestAnimationFrame` when focusing input on mount ([5798cf2aa9](https://github.com/facebook/react-native/commit/5798cf2aa9b86bbcb40016aae14eca88fca19fde) by [@janicduplessis](https://github.com/janicduplessis)) +- Reduce overhead of setting up timers in DEV ([75a154b449](https://github.com/facebook/react-native/commit/75a154b4499e44b4ab31ccf28f9eb1dbf21578ac) by [@motiz88](https://github.com/motiz88)) +- Fixed an issue where margin and padding were resolved incorrectly. ([1d683faf1d](https://github.com/facebook/react-native/commit/1d683faf1dc89e4950e7e1f5c5a67f9a7ca1ee24) by [@SidharthGuglani](https://github.com/SidharthGuglani)) +- Fix using width for calculating margin top percent ([0599af2282](https://github.com/facebook/react-native/commit/0599af2282ffbf636604bce1cb4c049201fed393) by [@SidharthGuglani](https://github.com/SidharthGuglani)) +- Don't restore default values in NativeAnimated when components unmount ([686ab49107](https://github.com/facebook/react-native/commit/686ab49107df8ed20d4e810f1366715cd70b4a31) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix eslint-config peer dependency warnings ([1353da5a53](https://github.com/facebook/react-native/commit/1353da5a538d4a6f76fc9530711394cf981034a0) by [@friederbluemle](https://github.com/friederbluemle)) +- Remove style rules from eslint config for prettier options ([e4b62bb139](https://github.com/facebook/react-native/commit/e4b62bb139c258b65a9ebf2a8ee692ea52c3afab) by [@iRoachie](https://github.com/iRoachie)) +- Fix separators displays in wrong places with the inverted list ([dfb4f4af68](https://github.com/facebook/react-native/commit/dfb4f4af68726d2e05f63689a9c74c9bb9a0611b) by [@dy93](https://github.com/dy93)) +- Fix issue where we attempt to connect to React devtools every 2 seconds ([e7f6210d5d](https://github.com/facebook/react-native/commit/e7f6210d5d417c5b6d4ba7f5cf96b40dbf70b9cd) by [@ejanzer](https://github.com/ejanzer)) +- Fix so that early logs don't get dropped by Metro ([4ed05ca241](https://github.com/facebook/react-native/commit/4ed05ca241b791ad629fd154429a4a53c7731556) by [@gaearon](https://github.com/gaearon)) +- Fix to announce accessibility state changes happening in the background ([baa66f63d8](https://github.com/facebook/react-native/commit/baa66f63d8af2b772dea8ff8eda50eba264c3faf) by [@xuelgong](https://github.com/xuelgong)) +- Fix `JSBigString` not compiling on Windows due to Unix-specific headers ([80857f295c](https://github.com/facebook/react-native/commit/80857f295c17e5f8966b3d1c1207d3c4570a1b26) by [@empyrical](https://github.com/empyrical)) +- Fix exception in `scrollResponderScrollNativeHandleToKeyboard` when ref is null ([da8ae011bb](https://github.com/facebook/react-native/commit/da8ae011bbabc8acb7ef7f6903f68dd60aaa1f9d) by [@TheSavior](https://github.com/TheSavior)) +- Fix excessive toggles on the Switch component ([b782934f3f](https://github.com/facebook/react-native/commit/b782934f3f2a80ae7e3872cc7d7a610aa6680ec4) by [@rurikoaraki](https://github.com/rurikoaraki)) +- Fix bare hosts in `URL`. Add missing / between url ([20ab946f34](https://github.com/facebook/react-native/commit/20ab946f34b1d9727ff08c733b2006e84fd79349) by [@jeswinsimon](https://github.com/jeswinsimon)) +- Fix the non-standard usage of `ATOMIC_VAR_INIT` macro from code with systrace enabled ([75a7a52db4](https://github.com/facebook/react-native/commit/75a7a52db496bd3892a367372eea25bf50840fc3)) +- Fix `useWindowDimensions` hook firing continuously after dimensions change ([3b3c95b017](https://github.com/facebook/react-native/commit/3b3c95b0170e60983eb6e89b910d100d08eee141) by [@dulmandakh](https://github.com/dulmandakh)) +- Fix throttling in ScrollView ([4159e20146](https://github.com/facebook/react-native/commit/4159e201462c346c456de1fa869d88a9cce7b6d4) by [@sammy-SC](https://github.com/sammy-SC)) +- Fix `TimingAnimation` rounding error issue ([77b6e26538](https://github.com/facebook/react-native/commit/77b6e2653835af61b186903eae45d67f35351ade) by [@MartinSherburn](https://github.com/MartinSherburn)) +- Fix recycling of Switch ([a261e6dfb2](https://github.com/facebook/react-native/commit/a261e6dfb2680a955943db53c4b0a7bb887bfe22) by [@sammy-SC](https://github.com/sammy-SC)) + +#### Android specific + +- Fix to reset sMatrixDecompositionContext before applying transformations ([bf01dfbc97](https://github.com/facebook/react-native/commit/bf01dfbc97ea8be9d88214ab31809f2f42d6c064) by [@makovkastar](https://github.com/makovkastar)) +- Fix animations in OSS debug builds by modifying `Platform.isTesting()` behavior ([1fbc6a7c17](https://github.com/facebook/react-native/commit/1fbc6a7c178d13421b0b84d6ea01f9174105325f) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Fix Modal not disappearing when reloading ([5ddf00ee1a](https://github.com/facebook/react-native/commit/5ddf00ee1acbf66c7204227c398a58c13e4545cf) by [@sunnylqm](https://github.com/sunnylqm)) +- Fix to support nullable returns NativeModule methods returning Boxed Primitives ([f57b0caaa4](https://github.com/facebook/react-native/commit/f57b0caaa4452c64006c159cd28a1a562b332c21) by [@RSNara](https://github.com/RSNara)) +- Fix crash in TextInput ([6ebd3b046e](https://github.com/facebook/react-native/commit/6ebd3b046e5b71130281f1a7dbe7220eff95d74a) by [@MarcoPolo](https://github.com/MarcoPolo)) +- Fix View.getGlobalVisibleRect() to clip result rect properly when overflow is 'hidden' ([df9abf7983](https://github.com/facebook/react-native/commit/df9abf798351c43253c449fe2c83c2cca0479d80) by [@davidbiedenbach](https://github.com/davidbiedenbach)) +- Fix throwing "Unknown array type" exception ([4b9350061f](https://github.com/facebook/react-native/commit/4b9350061fa3d186fdd3a973e1b46f60a7ac03b9) by [@petterh](https://github.com/petterh)) +- Fix issue with refresh control not working properly on an inverted ScrollView ([0a282c42b4](https://github.com/facebook/react-native/commit/0a282c42b4d1c2316513cd5588a0a92b54db2991) by [@migbot](https://github.com/migbot)) +- Fix to listen to NFC actions for linking url events ([8d8c3d4e1e](https://github.com/facebook/react-native/commit/8d8c3d4e1eb88366074e87385c4d96a46dfdd544) by [@cimitan](https://github.com/cimitan)) +- Fix onPress prop for Touchable Components being called twice on AndroidTV. ([21890e964d](https://github.com/facebook/react-native/commit/21890e964df7674fcf13cefc8cb939441f6eddef) by [@dbarr33](https://github.com/dbarr33)) +- Fix `includeFontPadding` for `TextInput` placeholder ([211ea485cd](https://github.com/facebook/react-native/commit/211ea485cd993ca25d6640be41e54f327ca1629c) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix medium font weights for TextInput on Android ([8b9f790069](https://github.com/facebook/react-native/commit/8b9f7900697b2e4bb72b37ed2e6c3d113185d327) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix close button issue in KeyboardAvoidingView ([f1c6029e48](https://github.com/facebook/react-native/commit/f1c6029e4868084e5a10d81c15ee3cc5e301599a) by [@saxenanickk](https://github.com/saxenanickk)) +- Fix activity recreation on theme change ([83a16b16c9](https://github.com/facebook/react-native/commit/83a16b16c9afa0fe0328ab818470d4fce098876b) by [@Esemesek](https://github.com/Esemesek)) +- Fix ForwardingCookieHandler missing WebView exceptions. ([314eba98b2](https://github.com/facebook/react-native/commit/314eba98b2f2755cb26ed7a268d3fe83a7626efa) by [@siddhantsoni](https://github.com/siddhantsoni)) +- Fix ReactInstanceManagerBuilder.build crashing if SoLoader has not been explicitly initialized ([60e00d9d96](https://github.com/facebook/react-native/commit/60e00d9d96d7b186c1d4c1542caddc1b74eeb3da) by [@petterh](https://github.com/petterh)) +- Fix default accessibility hint not being read. ([f8dff0bcb3](https://github.com/facebook/react-native/commit/f8dff0bcb3147b7a1aa8ac7159952d848e198e29)) +- Fix JS bundle loading progress bar ([7b9d6d19e2](https://github.com/facebook/react-native/commit/7b9d6d19e2c0854aa53587ef68ce715fb7803e2a) by [@makovkastar](https://github.com/makovkastar)) +- Fix Android Q related NaN error - don't try to do math with NaN values ([db5994980d](https://github.com/facebook/react-native/commit/db5994980df136c5cce6cd90348b4bf18180562f)) +- Fix throwing exceptions when the host activity is not FragmentActivity ([7cfabf42b8](https://github.com/facebook/react-native/commit/7cfabf42b816de758d8e52896bbab0c50e3a802a) by [@mganandraj](https://github.com/mganandraj)) +- Fix crash when using `TextInput.FontVariant` prop in Android API level < 26 ([e885ddedb9](https://github.com/facebook/react-native/commit/e885ddedb9b0a025cb8031414dcc4bd22744a0eb) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- Fix support for `onRequestClose` in Modal on iOS 13+ ([8e5fac89bb](https://github.com/facebook/react-native/commit/8e5fac89bbdcc3028bb5d81a358969a235abf991) by [@koke](https://github.com/koke)) +- Fix `Dimensions` module to update on initial split screen ([7a72c35a20](https://github.com/facebook/react-native/commit/7a72c35a20a18c19bf6ab883cb2c53a85bd4c5c0) by [@sahrens](https://github.com/sahrens)) +- Fix spinner visibility on `beginRefreshingProgrammatically` ([e341489521](https://github.com/facebook/react-native/commit/e341489521ad495e68e8aba01ff4dd25a5e4ff3e) by [@nnabinh](https://github.com/nnabinh)) +- Reconnect to debugger websocket after Metro is restarted. ([13992f90e4](https://github.com/facebook/react-native/commit/13992f90e48fc11e0b7217ee6d9413f97c32268a) by [@rickhanlonii](https://github.com/rickhanlonii)) +- Fix Slider not disabling properly if the disabled prop is set. ([fa9ff07017](https://github.com/facebook/react-native/commit/fa9ff07017edbc76595fe2f2d964ee13c5f4088a)) +- Fix apps crashing on iOS 13.x when running timer in the background ([e1d03b4cc0](https://github.com/facebook/react-native/commit/e1d03b4cc00c361e10687eb4a9f902563cd1cbe1) by [@radko93](https://github.com/radko93)) +- Fix TextInput blur when tabbing in iOS simulator. ([a7437710d2](https://github.com/facebook/react-native/commit/a7437710d25adfc9150fc079e4525ed59d5404e2) by [@fat](https://github.com/fat)) +- Fix promised returned by `Share.share(content, options)` not resolving if share dialog dismissed ([7468a6c903](https://github.com/facebook/react-native/commit/7468a6c9033ffe8cc2315a3de3a759b8745fe43d) by [@v-fernandez](https://github.com/v-fernandez)) +- Fix maximum searching depth while measuring layout by removing it. ([2f8328dbb0](https://github.com/facebook/react-native/commit/2f8328dbb0d9813c904c0b888b2b7500cf4a4bce) by [@draws](https://github.com/dratwas)) +- Fix SafeAreaInsets call to not crash on older versions of iOS ([03acf57b76](https://github.com/facebook/react-native/commit/03acf57b767553acbee4ff589055fbd239ffffbb) by [@mmmulani](https://github.com/mmmulani)) +- Fix to retain `cropData` struct arg in ImageEditingManager.cropImage call ([002d3c179d](https://github.com/facebook/react-native/commit/002d3c179dd2515f0a4d894d9b7f70c4e538f728) by [@RSNara](https://github.com/RSNara))) +- Fix bug rendering nested text on iOS13 ([06599b3e59](https://github.com/facebook/react-native/commit/06599b3e594355a1d5062ede049ff3e333285516) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Fix longstanding bug where RCTNullIfNil() can return nil ([79b573511b](https://github.com/facebook/react-native/commit/79b573511bd55e6c82c0044e1930549ccfa8a923) by [@PeteTheHeat](https://github.com/PeteTheHeat)) +- Fix crash in RCTScrollViewComponentView ([e7ef9921d3](https://github.com/facebook/react-native/commit/e7ef9921d3f91b02cfec4bbfd88b4968434e201c) by [@shergin](https://github.com/shergin)) +- Fix how the amount of free memory is calculated to mimic the logic Apple uses. ([b53d3d80f9](https://github.com/facebook/react-native/commit/b53d3d80f991937915a87ba8515f403551de139e)) +- Fix animated gifs incorrectly looping ([6f2e6f170e](https://github.com/facebook/react-native/commit/6f2e6f170e3ee785d1ba844971447ea24f91185e) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix `tintColor` in SegmentedControlIOS component ([be89e4d928](https://github.com/facebook/react-native/commit/be89e4d928a504de304f5afb19bd3cc15ae3eb7d) by [@sammy-SC](https://github.com/sammy-SC)) + +## v0.61.5 + +This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/151) to improve the quality of the 0.61 release. Thanks to everyone who contributed! + +### Fixes + +#### Android specific + +- Fix bundling assets in monorepo ([a3b0804867](https://github.com/facebook/react-native/commit/a3b08048674e324dbe1f0ca816f35607e9e06a2f) by [@Esemesek](https://github.com/Esemesek)) +- Fix multiple `set-cookie` not aggregated correctly in response headers ([1df8bd4932](https://github.com/facebook/react-native/commit/1df8bd4932f42958c01dccf44cee92b75a6988ed) by **Vincent Cheung**) + +## v0.61.4 + +This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/150) to improve the quality of the 0.61 release. Thanks to everyone who contributed! + +### Fixed + +- Fix build with Hermes on Windows ([81a6b6ed3c](https://github.com/facebook/react-native/commit/81a6b6ed3c54498f6f2148c106846352405949bf) by [@B27](https://github.com/B27)) +- Fix Chrome debugger showing console.logs at incorrect locations ([42ac240bce](https://github.com/facebook/react-native/commit/42ac240bceb104474494c6007df0089baec00f7a) by [@rickhanlonii](https://github.com/rickhanlonii)) + +#### iOS specific + +- Fix bug in iOS 13 when application would be terminated immediately when in background ([d7c9173b07](https://github.com/facebook/react-native/commit/d7c9173b07171164bcadf73855454e90e07b31be) by [@radko93](https://github.com/radko93)) + +## v0.61.3 + +This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/148) to improve the quality of the 0.61 release. Thanks to everyone who contributed! + +### Fixed + +- Fix bug where ScrollView contentInset top set to undefined wouldn't default to 0 ([d576a5bcc0](https://github.com/facebook/react-native/commit/d576a5bcc0e03dd9c4ccd982f723d6e376e5b680) by [TheSavior](https://github.com/TheSavior)) +- Fix TimingAnimation rounding error issue ([bfd01552af](https://github.com/facebook/react-native/commit/bfd01552af6c074a425da2e7cc1a5908faba2644) by [MartinSherburn](https://github.com/MartinSherburn)) + +#### iOS specific + +- Fix selecting videos from library in iOS 13 ([63769518e0](https://github.com/facebook/react-native/commit/63769518e0c7db60eb39bb5f47fe24f4bc664862) by [fatalsun](https://github.com/fatalsun)) +- Fix bug in iOS13 nested text rendering ([7cf43afa8d](https://github.com/facebook/react-native/commit/7cf43afa8d6a03ccb4cfdc09f81891eabe8b8b70) by [PeteTheHeat](https://github.com/PeteTheHeat)) + +#### Android specific + +- Release underlying resources when JS instance is GC'ed on Android try ([9b2374b542](https://github.com/facebook/react-native/commit/9b2374b542f87b7baefcfb4a3eb4f57029069b57) by [janicduplessis](https://github.com/janicduplessis)) + +## v0.61.2 + +This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/146) to improve the quality of the 0.61 release. Thanks to everyone who contributed! + +### Fixed + +#### Android specific + +- Fix elevation issues on Android ([8fd9ab2f54](https://github.com/facebook/react-native/pull/26682) by [@grabbou](https://github.com/grabbou)) + +### Added + +- Use `warnOnce` for excessive number of callbacks error ([0cafa0f5d1](https://github.com/facebook/react-native/commit/0cafa0f5d1e7fa5369b765f4b97f38bf1608230a) by [@janicduplessis](https://github.com/anicduplessis)) +- Include transform in OUTER_PROPS ([b94438](https://github.com/facebook/react-native/commit/b94438) by [@migbot](https://github.com/migbot)) + +#### iOS specific + +- Better iOS13 support in `StatusBar` API ([796b3a1f88](https://github.com/facebook/react-native/commit/796b3a1f8823c87c9a066ea9c51244710dc0b9b5) by [@gaodeng](https://github.com/gaodeng)) + +#### Android specific + +- Improve error message in NativeModuleRegistryBuilder ([113c4e229c](https://github.com/facebook/react-native/commit/113c4e229c374232c46a89afd74df7117a3447c1) by [@vonovak](https://github.com/vonovak)) + +## v0.61.1 + +This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/144) to improve the quality of the 0.60 release. Thanks to everyone who contributed! + +### Fixed + +#### iOS specific + +- Fix ShareSheet crash on iOS 13 ([a4fbb8e75b](https://github.com/facebook/react-native/commit/a4fbb8e75bd9f521037926a68a8b75eaca2eca74) by [@tomtargosz](https://github.com/tomtargosz)) + +#### Android specific + +- Allow again for injecting custom root view via ReactActivityDelegate ([9f0dede1c9](https://github.com/facebook/react-native/commit/9f0dede1c913612e1241432f4cbccdc74d23a1e4) by [@kmagiera](https://github.com/kmagiera)) + +## v0.61.0 + +This is a major release that includes the new reloading experience Fast Refresh. It also removes the React `.xcodeproj`, fixes `use_frameworks!` for CocoaPods support, adds a `useWindowDimensions` hook, and upgrades to React 16.9. + +### Added + +- Add Fast Refresh by default ([17f8e5810f](https://github.com/facebook/react-native/commit/17f8e5810f3260ce1b24c61665883bab8847aabe) by [@gaearon](https://github.com/gaearon)) +- Add `useWindowDimensions` hook to replace most `Dimensions` usage ([103ec2f770](https://github.com/facebook/react-native/commit/103ec2f770dbb785ef4bc26f8662c74edded796a) by [@sahrens](https://github.com/sahrens)) + +#### Android specific + +- Add exception in .gitignore for `debug.keystore` to the android template. ([d55025694b](https://github.com/facebook/react-native/commit/d55025694be8b4ee5d09c8fdc910d42a5f144883) by [@bondehagen](https://github.com/bondehagen)) +- Add jitpack repository to template ([1a92cf9b2a](https://github.com/facebook/react-native/commit/1a92cf9b2afa718a81299b4be5ab6bdff16f4863) by [@iyegoroff](https://github.com/iyegoroff)) + +#### iOS specific + +- Add RCTWeakProxy to properly deallocate RCTUIImageViewAnimated ([947e71a922](https://github.com/facebook/react-native/commit/947e71a922c0db5d3d3780d249d1a8d183534c22) by [@mmmulani](https://github.com/mmmulani)) + +### Changed + +- Use prettyFormat for Metro logging ([abd7faf354](https://github.com/facebook/react-native/commit/abd7faf3547e165abfc52383d3709b9d4d2e9006) by [@cpojer](https://github.com/cpojer)) +- Tweak messages and fix the warning condition ([2a3ac0429b](https://github.com/facebook/react-native/commit/2a3ac0429b0e4c443d185807a39b41fc5a2ab1d2) by [@gaearon](https://github.com/gaearon)) +- Allow jest globals in **mocks** directories ([e78c01375a](https://github.com/facebook/react-native/commit/e78c01375aef88e0bb4029479acac9e85ecaf080) by [@artdent](https://github.com/artdent)) +- Make Animation EndCallback type allow any return value ([306c8d64d9](https://github.com/facebook/react-native/commit/306c8d64d91f87b248f627333de7f24355248088) by [@draperunner](https://github.com/draperunner)) +- create two layout pass reason flexLayout and flexMeasure instead of flex ([6ce985463b](https://github.com/facebook/react-native/commit/6ce985463b2724451baed8b0486b298f969e36e7) by [@SidharthGuglani](https://github.com/SidharthGuglani)) +- Use shorthand for Fragment in App.js ([7cac6a4b6c](https://github.com/facebook/react-native/commit/7cac6a4b6cfa8c1b54db62f2b1510f7c52f4574d) by [@ferdicus](https://github.com/ferdicus)) +- Use eslint-plugin-prettier recommended config ([d2b92fffb1](https://github.com/facebook/react-native/commit/d2b92fffb1d14dd0ec628e9dcdfd76e39f2067ff) by [@Justkant](https://github.com/Justkant)) +- Support string command arguments ([0314305e12](https://github.com/facebook/react-native/commit/0314305e1202e48c74091e15da8574f1b92ce441) by [@TheSavior](https://github.com/TheSavior)) +- chore: Link to CLA wiki and CLA form. ([e2d55d5c5e](https://github.com/facebook/react-native/commit/e2d55d5c5ef40ccae3220dc0e1fca7cf3592c676) by [@JustinTRoss](https://github.com/JustinTRoss)) +- CLI is now ^3.0.0-alpha.1 ([5edd1c674c](https://github.com/facebook/react-native/commit/5edd1c674c911a6c59aaad8ed36ce12fa98787ff) by [@thymikee](https://github.com/thymikee)) +- Flow is now v0.104.0 ([59db059dbd](https://github.com/facebook/react-native/commit/59db059dbddb8101212f3739eecf0db494cfab41) by [@mroch](https://github.com/mroch)) +- React is now at 16.9 ([40e8a5f685](https://github.com/facebook/react-native/commit/40e8a5f685376300aa5365de4557cd395996b9a2), [0ccedf3964](https://github.com/facebook/react-native/commit/0ccedf3964b1ebff43e4631d1e60b3e733096e56) by [@TheSavior](https://github.com/TheSavior)) +- Use Metro for auto-collapsing internal stack frames ([77125a1ac3](https://github.com/facebook/react-native/commit/77125a1ac364a6b7e2382fdc86cc19a3e2eba089) by [@motiz88](https://github.com/motiz88)) +- Move React error message formatting into ExceptionsManager ([2dadb9e2b0](https://github.com/facebook/react-native/commit/2dadb9e2b0ba26223ed83a30af620ce3e62e245f) by [@motiz88](https://github.com/motiz88)) +- Improve VirtualizedList error message ([bef87b648c](https://github.com/facebook/react-native/commit/bef87b648c4bed228f1c5889abe0181a271edf76) by [@vonovak](https://github.com/vonovak)) + +#### Android specific + +- Bump Hermes to v0.2.1 ([811401bcac](https://github.com/facebook/react-native/commit/811401bcac02f3e6e154c7e0f76f9f82eeaa6959) by [@sunnylqm](https://github.com/sunnylqm)) +- Use centralized package for DoNotStrip annotation ([35fc0add2d](https://github.com/facebook/react-native/commit/35fc0add2d3a278bf90257284fe23e03898008de) by [@passy](https://github.com/passy)) + +#### iOS specific + +- Do not override ActivityIndicator color when setting its size ([14b0ed4c5d](https://github.com/facebook/react-native/commit/14b0ed4c5d872cd992f6e1ca072a2c44c8ece25f) by [@cabelitos](https://github.com/cabelitos)) +- fix display problems when image fails to load ([71d7d6883c](https://github.com/facebook/react-native/commit/71d7d6883cb9a3d18666f04a444de7b4a611b304)) +- Renamed yoga podspec to Yoga ([82a8080f07](https://github.com/facebook/react-native/commit/82a8080f0704e83079d0429e4e367f5131052e64) by [@axe-fb](https://github.com/axe-fb)) +- Update loading pre-bundled message ([eb92f8181f](https://github.com/facebook/react-native/commit/eb92f8181f3119bbc69ff7cb5aff2e03d993b8b3) by [@rickhanlonii](https://github.com/rickhanlonii)) + +### Deprecated + +- Deprecate method UIManagerModule.playTouchSound() ([e3ec8dbe15](https://github.com/facebook/react-native/commit/e3ec8dbe15a07e86530e1fd801c27ad8c1023b5c) by [@mdvacca](https://github.com/mdvacca)) +- Deprecate UIManager.measureLayoutRelativeToParent ([e42009b784](https://github.com/facebook/react-native/commit/e42009b7849f1cfd6d6d34e28c564ec5e39680bb) by [@mdvacca](https://github.com/mdvacca)) + +#### Android specific + +- DrawerLayoutAndroid drawerPosition now expects a string, number is deprecated ([305b0a2814](https://github.com/facebook/react-native/commit/305b0a28142414d559d2d08795a5963716dc4b0f) by [@TheSavior](https://github.com/TheSavior)) + +### Removed + +#### Android specific + +- Remove supportLibVersion variable in build.gradle ([fee7f0617e](https://github.com/facebook/react-native/commit/fee7f0617ee6e4f10edf6b8e36da6c5fb00d22ac) by [@ferdicus](https://github.com/ferdicus)) + +#### iOS Specific + +- Remove 's.static_framework = true' requirement for podspec ([ca9e108110](https://github.com/facebook/react-native/commit/ca9e108110e4a3cc39044805f879d9a9cb637c41) by [@jtreanor](https://github.com/jtreanor)) + +### Fixed + +- Add ErrorUtils to eslint globals ([76af5f9163](https://github.com/facebook/react-native/commit/76af5f916303d7906ea522076c965292145a1370) by [@rodineijf](https://github.com/rodineijf)) +- URL: Do not prepend baseUrl if the URL is not a relative URL ([e104204ae0](https://github.com/facebook/react-native/commit/e104204ae083d31e0b9967373ce79f2f1ca8fbb6) by [@jeswinsimon](https://github.com/jeswinsimon)) +- Memory Leak due to JSStringRelease not called ([b8d6ef3726](https://github.com/facebook/react-native/commit/b8d6ef372663fe6d467144abfc5d2c9352dc28d6) by [@sachinservicemax](https://github.com/sachinservicemax)) +- Fixed rotateZ native animation ([f4f08d3c54](https://github.com/facebook/react-native/commit/f4f08d3c549f2af7cd04ef78fe800d3bc12af1f0) by [@Titozzz](https://github.com/Titozzz)) +- Fix indentation in Gradle files ([9b0adb5ad1](https://github.com/facebook/react-native/commit/9b0adb5ad132b8ff37e707a4943411d92b4e58dc) by [@sonicdoe](https://github.com/sonicdoe)) +- Fix handling of failed image downloads ([71d7d6883c](https://github.com/facebook/react-native/commit/71d7d6883cb9a3d18666f04a444de7b4a611b304) by [@sammy-SC](https://github.com/sammy-SC)) +- Fix SectionList scrollToLocation and prevent regressions ([8a82503b54](https://github.com/facebook/react-native/commit/8a82503b54e3c63230a07de99ec082b2dcb54bc7) by [@vonovak](https://github.com/vonovak)) +- [General][internal] Fix incorrect `module.name_mapper` in template .flowconfig ([e6b2cf0418](https://github.com/facebook/react-native/commit/e6b2cf04188fc9647bae4bef4cca5d4dde22a657) by [@MoOx](https://github.com/MoOx)) +- Fall back to `JSON.stringify` in `console.log` if Symbol is unavailable ([179889704b](https://github.com/facebook/react-native/commit/179889704b6f9d56cb990d5b9bba6ee5ea2cd13f) by [@cpojer](https://github.com/cpojer)) +- Pop frames correctly in console.error handler ([3eaf245540](https://github.com/facebook/react-native/commit/3eaf2455402b5ad73c8a059311f0cb213df9dd28) by [@motiz88](https://github.com/motiz88)) +- Add documentation to TextInput's Flow types ([d00f0882fb](https://github.com/facebook/react-native/commit/d00f0882fbdd532f8698d2569bd771ca5843d0f5) by [@empyrical](https://github.com/empyrical)) + +#### Android specific + +- Add missing Hermes include ([1db96a3c46](https://github.com/facebook/react-native/commit/1db96a3c469b872e851553207e5420d54afc731a) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix UIManager.measure to consider scale and rotation transforms ([28d50189f3](https://github.com/facebook/react-native/commit/28d50189f3350e7550bf03ea5bd1363839ee2911) by [@floriancargoet](https://github.com/floriancargoet)) + +#### iOS specific + +- Fixed iOS packager connection ([4ab9da134c](https://github.com/facebook/react-native/commit/4ab9da134c988db832b1a2daa90ce38bf8c419eb) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fixed compatibility with CocoaPods frameworks. ([8131b7bb7b](https://github.com/facebook/react-native/commit/8131b7bb7b4794e0e7003a6e3d34e1ebe4b8b9bc) by [@jtreanor](https://github.com/jtreanor)) +- Don't call sharedApplication in App Extension ([c5ea18f738](https://github.com/facebook/react-native/commit/c5ea18f7389fe821e7a9882e4b1b30b0a1b266f4) by [@zhongwuzw](https://github.com/zhongwuzw)) + +## v0.60.6 + +This is a small patch release with a commit to fix the build break in MSVC to help the users of react-native-windows. ([9833ee7bc1](https://github.com/facebook/react-native/commit/9833ee7bc19982acd6ccaf6ac222bc24a97667a8) by [@acoates-ms](https://github.com/acoates-ms)) + +## v0.60.5 + +This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/130) to improve the quality of the 0.60 release. Thanks to everyone who contributed! + +### Added + +- Added a default Prettier config for new projects ([7254bab0b3](https://github.com/facebook/react-native/commit/7254bab0b3fa129cd238783ab993fbae1102d60a) by [@jpdriver](https://github.com/jpdriver)) + +#### Android specific + +- Add showSoftInputOnFocus to TextInput ([d88e4701fc](https://github.com/facebook/react-native/commit/d88e4701fc46b028861ddcfa3e6ffb141b3ede3d)) + +### Changed + +- Bump CLI to ^2.6.0 ([fafe5ee072](https://github.com/facebook/react-native/commit/fafe5ee0726061e3590b91d3b5cff04e33781f87) by [@thymikee](https://github.com/thymikee)) + +### Fixed + +- Ensure right version of Metro bundler is used ([1bb197afb1](https://github.com/facebook/react-native/commit/1bb197afb191eab134354386700053914f1ac181) by [@kelset](https://github.com/kelset)) + +#### Android specific + +- Fix `ClassNotFound` exception in Android during Release builds ([ffdf3f22c6](https://github.com/facebook/react-native/commit/ffdf3f22c68583fe77517f78dd97bd2e97ff1b9e) by [@thecodrr](https://github.com/thecodrr)) +- Remove unnecessary flag when running JS server ([a162554f5d](https://github.com/facebook/react-native/commit/a162554f5dc36fa0647b5bf52119a62bd20046e3) by [@thecodrr](https://github.com/thecodrr)) +- Correctly set the border radius on android ([b432b8f13b](https://github.com/facebook/react-native/commit/b432b8f13b4871dcafd690e57d37298662712b50) by [@cabelitos](https://github.com/cabelitos)) +- Fix addition of comma at the end of accessibility labels on Android. ([812abfdbba](https://github.com/facebook/react-native/commit/812abfdbba7c27978a5c2b7041fc4a900f3203ae) by [@marcmulcahy](https://github.com/marcmulcahy)) + +#### iOS specific + +- Don't call sharedApplication in App Extension ([c5ea18f738](https://github.com/facebook/react-native/commit/c5ea18f7389fe821e7a9882e4b1b30b0a1b266f4) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Delete fishhook ([46bdb4161c](https://github.com/facebook/react-native/commit/46bdb4161c84b33f1d0612e9c7cdd824462a31fd) by [@mmmulani](https://github.com/mmmulani)) + +You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). + +## v0.60.4 + +This is a patch release that contains two more Hermes related fixes, thanks to the contributors for helping improving the support! + +### Fixed + +#### Android specific + +- Generate correct source map if hermes not enabled ([b1f81be4bc](https://github.com/facebook/react-native/commit/b1f81be4bc21eb9baa39dd7ef97709d9927ad407) by [@HazAT](https://github.com/HazAT)) +- Generate source maps outside of assets/ ([60e75dc1ab](https://github.com/facebook/react-native/commit/60e75dc1ab73b2893ec2e25c0320f32b3cf12b80) by [@motiz88](https://github.com/motiz88)) + +You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). + +## v0.60.3 + +This is a patch release that fixes the binary path to Hermes package, thanks to [@zoontek](https://github.com/zoontek)) for creating the PR! + +You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). + +## v0.60.2 + +This is a patch release that fixes the path to Hermes package. + +You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). + +## v0.60.1 + +This is a patch release that includes the Hermes JavaScript Engine announced at Chain React Conf 2019. + +Check out the documentation to opt-in and give [Hermes a try](https://reactnative.dev/docs/hermes). + +You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). + +## v0.60.0 + +This feature release of React Native includes many milestone changes for the platform. Please refer to the [blog post](https://reactnative.dev/blog/2019/07/03/version-60) for selected details. For upgrading users, some of the progress comes with breaking changes; manual intervention may be required for your app. We're also aware that existing CocoaPods integrations using `use_frameworks` are not out-of-the-box compatible with this version, but please consider [various workarounds](https://github.com/facebook/react-native/issues/25349) while we prepare a long-term solution for a future release. If you're interested in helping evaluate our next release (0.61), subscribe to the dedicated issue [here](https://github.com/react-native-community/react-native-releases/issues/130). + +Have you ever considered contributing to React Native itself? Be sure to check out [Contributing to React Native](https://github.com/facebook/react-native/blob/master/CONTRIBUTING.md). + +### Added + +- CLI autolinking support ([5954880875](https://github.com/facebook/react-native/commit/5954880875d8dfb9b7868aa316647f8fe2b3d8c3), [da7d3dfc7d](https://github.com/facebook/react-native/commit/da7d3dfc7d3bd83e7522175a720b30fee4c9b3d3) by [@zhongwuzw](https://github.com/zhongwuzw) and [@hramos](https://github.com/hramos)) +- New Intro screen ([6b393b27e1](https://github.com/facebook/react-native/commit/6b393b27e18e663d39b66fd121ee302bce29d77d), [233fddbe01](https://github.com/facebook/react-native/commit/233fddbe012098dce3719ba066d3dc653e05e6c9), [fe88e9e48c](https://github.com/facebook/react-native/commit/fe88e9e48ce99cb8b9da913051cc36575310018b), [aa926e349b](https://github.com/facebook/react-native/commit/aa926e349b1656b02b8c1a2048cc56b25f9567c1), [a9e8a71e53](https://github.com/facebook/react-native/commit/a9e8a71e531510baf126780cecdcbc64c934f4dd), [ad4a5d9a3e](https://github.com/facebook/react-native/commit/ad4a5d9a3eac9794038e93158d45e7f1ceb9e495), and [0245fd713e](https://github.com/facebook/react-native/commit/0245fd713ea9ff6fe334980f537e2254a9e3126c) by [@cpojer](https://github.com/cpojer), [@eliperkins](https://github.com/eliperkins), [@lucasbento](https://github.com/lucasbento), [@orta](https://github.com/orta), [@adamshurson](https://github.com/adamshurson), [@karanpratapsingh](https://github.com/karanpratapsingh) and [@glauberfc](https://github.com/glauberfc)) +- Add enhanced accessibility actions support ([7fb02bd908](https://github.com/facebook/react-native/commit/7fb02bd90884f0a717e8151d4d30767fe38392c1) by [@xuelgong](https://github.com/xuelgong)) +- Add additional accessibility roles and states ([1aeac1c625](https://github.com/facebook/react-native/commit/1aeac1c62528004d994200664368dc85fba1795d)) +- Add `isReduceMotionEnabled()` plus `reduceMotionChanged` to `AccessibilityInfo` ([0090ab32c2](https://github.com/facebook/react-native/commit/0090ab32c2aeffed76ff58931930fe40a45e6ebc) by [@estevaolucas](https://github.com/estevaolucas)]) +- Add support for cancelling fetch requests with `AbortController` ([h5e36b0c](https://github.com/facebook/react-native/commit/5e36b0c6eb2494cefd11907673aa018831526750) by [@janicduplessis](https://github.com/janicduplessis)) + +#### Android specific + +- Enable views to be nested within **Text**; this brings feature parity to Android, but be aware that it [has some limitations](https://github.com/facebook/react-native/commit/a2a03bc68ba062a96a6971d3791d291f49794dfd) ([5c399a9f74](https://github.com/facebook/react-native/commit/5c399a9f74f22c58c11f75abde32ac7dc269ccc0) by [@rigdern](https://github.com/rigdern)) +- Add a `touchSoundDisabled` prop to **Button**, **Touchable**, and **TouchableWithoutFeedback** ([45e77c8324](https://github.com/facebook/react-native/commit/45e77c8324f7dc2d53109e45a4e0b18cbab6a877) by [@yurykorzun](https://github.com/yurykorzun)) + +#### iOS specific + +- Add `announceForAccessibility` and `announcementFinished` APIs for making screen reader announcements ([cfe003238a](https://github.com/facebook/react-native/commit/cfe003238ab8c5686d185f6ce9e0776eeb4bb729) by [@rigdern](https://github.com/rigdern)) +- Ability to force network requests to use WiFi using the `allowsCellularAccess` property. This can ensure that network requests are sent over WiFi if communicating with a local hardware device and is accomplished by setting a flag. Default behavior of allowing network connections over cellular networks when available is unchanged. ([01c70f2fb9](https://github.com/facebook/react-native/commit/01c70f2fb9e8ac78a4d0cbd016d4de47316fe4d1) and [916186a7e6](https://github.com/facebook/react-native/commit/916186a7e6c43b1a1c68652ab82862bcd8fb1e01) by [@bondparkerbond](https://github.com/bondparkerbond)and [@zhongwuzw](https://github.com/zhongwuzw)) +- `$RN_CACHE_DIR` can now be used to manually specify the iOS build cache directory ([845eee403e](https://github.com/facebook/react-native/commit/845eee403e1cd3cb36935ef142f411f2b5075346) by [@hramos](https://github.com/hramos)) + +### Changed + +- _BREAKING_ Migrated to AndroidX; please see [this thread](https://github.com/react-native-community/discussions-and-proposals/issues/129#issuecomment-503829184) for more details on this change +- Cleanup **RedBox** message and stack output; it's now far easier to understand ([49d26eb0c4](https://github.com/facebook/react-native/commit/49d26eb0c4aeb611c6cb37a568708afa67b48c18) by [@thymikee](https://github.com/thymikee)) +- Add default `scrollEventThrottle` value to **Animated.FlatList** and **Animated.SectionList**; this now behaves consistently with **Animated.ScrollView** ([933e65e245](https://github.com/facebook/react-native/commit/933e65e245b30f7dc5a26aa51881153fb7c3628e) by [@janicduplessis](https://github.com/janicduplessis)) +- Remove invariant on nested sibling **VirtualizedLists** without unique listKey props; they now trigger a **RedBox** ([af5633bcba](https://github.com/facebook/react-native/commit/af5633bcba224f71f035ba4214a93b69723c9b93)) +- **FlatList** and **VirtualizedList**'s default `keyExtractor` now checks `item.id` and `item.key` ([de0d7cfb79](https://github.com/facebook/react-native/commit/de0d7cfb79c7f4011d4b6748b1afc656d33fd5ac) by [@sahrens](https://github.com/sahrens)) +- **SectionList**'s `scrollToLocation` on iOS now counts `itemIndex` like Android; both platforms are now consistent, and the `itemIndex` value 0 now represents scrolling to the first heading ([248a108abf](https://github.com/facebook/react-native/commit/248a108abf206b7ae32208537f0b73a8192a4829) by [@vonovak](https://github.com/vonovak)) +- Slightly speedup core initialization by moving native version check to DEV only ([5bb2277245](https://github.com/facebook/react-native/commit/5bb22772452e49dbcfbf183f6ebeee4576e67947) by [@mmmulani](https://github.com/mmmulani)) +- `react` is now at v16.8.6 ([53cec2dc1f](https://github.com/facebook/react-native/commit/53cec2dc1f1f5d143d0bb9752629b72350ebd112), [ee681b72ce](https://github.com/facebook/react-native/commit/ee681b72ce89539e5764ed59e5dfea4fab04d48c), and [6001acb319](https://github.com/facebook/react-native/commit/6001acb319958242f8d8e2dd40cb91a55b5eab2e) by [@kelset](https://github.com/kelset), [@mdvacca](https://github.com/mdvacca), [@gaearon](https://github.com/gaearon)) +- `react-native-community/cli` is now at v2.0.0 (by [@thymikee](https://github.com/thymikee)) +- `flow` is now at v0.98 ([0e1dfd4369](https://github.com/facebook/react-native/commit/0e1dfd436917a78a09da7b57a0b50397e6a0b6e1) by [@nmote](https://github.com/nmote)) +- `prettier` is now at v1.17.0 ([ff9f8f347d](https://github.com/facebook/react-native/commit/ff9f8f347d71630664dc3da1e8be0425799c0ce0)) +- `metro` packages are now at v0.54.1 ([7ff3874ec0](https://github.com/facebook/react-native/commit/7ff3874ec060bce568537a2238aea2c888e6e13f), [343f0a1d50](https://github.com/facebook/react-native/commit/343f0a1d50662aa37ef0b26d5436b2a0b40fbabb) by [@motiz88](https://github.com/motiz88)) +- Replace patched fetch polyfill with `whatwg-fetch@3.0` ([bccc92dfdd](https://github.com/facebook/react-native/commit/bccc92dfdd2d85933f2a9cb5c8d1773affb7acba) by [@janicduplessis](https://github.com/janicduplessis)) + +#### Android specific + +- Use class canonical name for `PARTIAL_WAKE_LOCK` tag ([88dbb4558c](https://github.com/facebook/react-native/commit/88dbb4558cd10f129f2c31e3b0b872924aba5416) by [@timwangdev](https://github.com/timwangdev)) + +#### iOS specific + +- _BREAKING_: Split React.podspec into separate podspecs for each Xcode project; your libraries will need to update for this change as well to avoid CocoaPods build errors ([2321b3fd7f](https://github.com/facebook/react-native/commit/2321b3fd7f666ce30f5dad4cd2673ddf22972056) by [@fson](https://github.com/fson)) +- Improve handling of native module exceptions; they are now propagated to crash reporting tools with the context and callstack ([629708beda](https://github.com/facebook/react-native/commit/629708bedae65a30e39d234da6b04d6fa101a779) by [@pvinis](https://github.com/pvinis)) +- Switch **Slider** `onSlidingComplete` event to a non-bubbling event on iOS to match Android ([7927437a6d](https://github.com/facebook/react-native/commit/7927437a6d5d63de2424d43d58085291c1067091) by [@rickhanlonii](https://github.com/rickhanlonii)) + +### Deprecated + +- **StatusBar** is no longer deprecated; thank you for the feedback ([a203ebe206](https://github.com/facebook/react-native/commit/a203ebe2062b3c12f85783f46030971f3aa5db1d) by [@cpojer](https://github.com/cpojer)) + +### Removed + +- **NetInfo** has been removed; its replacement is now available via the [react-native-community/netinfo](https://github.com/react-native-community/react-native-netinfo) package ([5a30c2a205](https://github.com/facebook/react-native/commit/5a30c2a2052ba76e88dbf71b5b5c92966591bf26) by [@cpojer](https://github.com/cpojer)) +- **WebView** has been removed; its replacement is now available via the [react-native-community/webview](https://github.com/react-native-community/react-native-webview) package ([](https://github.com/facebook/react-native/commit/6ca438a7f4bd7e6b317f0461aebbd5a7186151ed), [1ca9a95537](https://github.com/facebook/react-native/commit/1ca9a9553763a89c977f756b45486f8b9cedab80), and [954f715b25](https://github.com/facebook/react-native/commit/954f715b25d3c47c35b5a23ae23770a93bc58cee) by [@cpojer](https://github.com/cpojer) and [@thorbenprimke](https://github.com/thorbenprimke)) +- **Geolocation** has been removed; its replacement is now available via the [react-native-community/geolocation](https://github.com/react-native-community/react-native-geolocation) package ([17dbf98884](https://github.com/facebook/react-native/commit/17dbf988845bb7815dbb6182218c8c28d027fb91) and [9834c580af](https://github.com/facebook/react-native/commit/9834c580af654366bf0d38b78cd2694b0a0c477f) by [@cpojer](https://github.com/cpojer) and [@mmmulani](https://github.com/mmmulani)) + +### Fixed + +- Fix `Animated.Value` value after animation if component was re-mounted ([b3f7d53b87](https://github.com/facebook/react-native/commit/b3f7d53b87413abdf302c521114e4d77aa92e07f) by [@michalchudziak](https://github.com/michalchudziak)) +- Consistent reporting native module name on crash on native side ([fdd8fadea8](https://github.com/facebook/react-native/commit/fdd8fadea84f475714a16b6f0ec433f898d09558) and [b79d7db9db](https://github.com/facebook/react-native/commit/b79d7db9dbf588085b29274e507d34438e2e2595) by [@DimitryDushkin](https://github.com/DimitryDushkin)) +- Handle null filenames in symbolicated stack trace gracefully in **ExceptionsManager** ([2e8d39bed7](https://github.com/facebook/react-native/commit/2e8d39bed70e2e5eeddeb2dc98155bf70f9abebd) by [@motiz88](https://github.com/motiz88)) +- Fix HasteImpl platform name regex ([28e0de070d](https://github.com/facebook/react-native/commit/28e0de070d2dae9a486ab5915b6fd76723bd84ef) by [@CaptainNic](https://github.com/CaptainNic)) +- Fix a JS memory leak in Blob handling; this resolves multiple leaks around `fetch` ([05baf62721](https://github.com/facebook/react-native/commit/05baf6272143667694585a14fb59657fdc93c3b1) and [9ef5107d04](https://github.com/facebook/react-native/commit/9ef5107d04da374fc566d8b296572ddd992419f0) by [@janicduplessis](https://github.com/janicduplessis)) +- **SectionList**'s `scrollToLocation` now scrolls to the top of the sticky header as expected ([d376a444e3](https://github.com/facebook/react-native/commit/d376a444e318beabd8ebe9ccb41ffc300e12ea76) by [@danilobuerger](https://github.com/danilobuerger)) + +#### Android specific + +- Fix duplicate resource error in Android build ([962437fafd](https://github.com/facebook/react-native/commit/962437fafd02c936754d1e992479056577cafd05) and [eb534bca58](https://github.com/facebook/react-native/commit/eb534bca58a89ae306010626a8bdae92c23b8784) by [@mikehardy](https://github.com/mikehardy) and [@Dbroqua](https://github.com/Dbroqua)) +- Reorder operations of native view hierarchy ([5f027ec64d](https://github.com/facebook/react-native/commit/5f027ec64d6764fbbb9813fabb373194dec79db7) by [@lunaleaps](https://github.com/lunaleaps)) +- Fix performance regression from new custom fonts implementation ([fd6386a07e](https://github.com/facebook/react-native/commit/fd6386a07eb75a8ec16b1384a3e5827dea520b64) by [@dulmandakh](https://github.com/dulmandakh)) +- Fix internal test case around disabled state of buttons ([70e2ab2ec9](https://github.com/facebook/react-native/commit/70e2ab2ec9a1df60b39987946af18cac8621b3b0)) +- Fix extra call of **PickerAndroid**'s `onValueChange` on initialization; now it is only called when `selectedValue` changes ([82148da667](https://github.com/facebook/react-native/commit/82148da6672e613f34ffb48133cdefc235418dea) by [@a-c-sreedhar-reddy](https://github.com/a-c-sreedhar-reddy)) +- Fix **PickerAndroid** will reset selected value during items update ([310cc38a5a](https://github.com/facebook/react-native/commit/310cc38a5acb79ba0f1cda22913bd1d0cb296034) by [@Kudo](https://github.com/Kudo)) +- Fix unexpected PARTIAL_WAKE_LOCK when no headless tasks registered. ([bdb1d4377e](https://github.com/facebook/react-native/commit/bdb1d4377e47c6cd49ff619134d4860519a3cb0c) by [@timwangdev](https://github.com/timwangdev)) +- Fix calling **TextInput**'s `onKeyPress` method when the user types an emoji ([a5c57b4ed4](https://github.com/facebook/react-native/commit/a5c57b4ed4965ac4bb231399fd145da8095cece3)) +- Fix value of **TextInput**'s `onSelectionChange` start and end arguments by normalizing them ([2ad3bb2e2d](https://github.com/facebook/react-native/commit/2ad3bb2e2d62ffb780bab020f645626a16dd3b4a) by [@uqmessias](https://github.com/uqmessias)) +- In `Linking.getInitialURL` method, use the `InteractionManager` to wait for the current activity to finish initializing ([c802d0b757](https://github.com/facebook/react-native/commit/c802d0b757912358d703d4d8a114073377a905b9) by [@mu29](https://github.com/mu29)) +- Disable delta bundles on the first app run ([e4aff423ac](https://github.com/facebook/react-native/commit/e4aff423ac0421f4af7b9a111e5ad954f489da19) by [@wojteg1337](https://github.com/wojteg1337)) +- In **DatePickerAndroid**, work around Android Nougat bug displaying the wrong the spinner mode ([bb060d6cf8](https://github.com/facebook/react-native/commit/bb060d6cf89500778bba27d1da5925e2623c7a99) by [@luancurti](https://github.com/luancurti)) +- Fix crash in Animated Interpolation when inputMin === inputMax ([7abfd23b90](https://github.com/facebook/react-native/commit/7abfd23b90db08b426c3c91b0cb6d01d161a9b9e) by [@olegbl](https://github.com/olegbl)) +- Fix symbolication for **RedBox** and **YellowBox** when using delta bundling ([a05e9f8e09](https://github.com/facebook/react-native/commit/a05e9f8e094b25cc86ee297477cccafc3be5ef52) by [@motiz88](https://github.com/motiz88)) +- Fix **CameraRoll** crash on mime type guessing ([ebeb893b50](https://github.com/facebook/react-native/commit/ebeb893b50b4aa1ad77bdb203e4f8faed75db43a) by [@Sroka](https://github.com/Sroka)) + +#### iOS specific + +- Call designated initializer for SurfaceHostingProxyRootView ([3c125e867f](https://github.com/facebook/react-native/commit/3c125e867f52efd7f18b2bd8c9a21b246afcd788) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix **RedBox** JS symbolication when adding JS engine tag to the message ([920632cadb](https://github.com/facebook/react-native/commit/920632cadb108ceeacad93e9316e706608df2942) by [@motiz88](https://github.com/motiz88)) +- Fix **TextInput**'s `onSelectionChange` behavior in single line text inputs ([0c11d8d9b4](https://github.com/facebook/react-native/commit/0c11d8d9b4edf7830255f5b016d0ba7ef72ae827) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix accessibility problem with **TextInput** Clear Button ([4e37d37cbf](https://github.com/facebook/react-native/commit/4e37d37cbff27e61659440094a662e00eafd8fc4) by [@shergin](https://github.com/shergin)) +- Fix `renderingMode` not applied to GIF **Image**s ([75380aa329](https://github.com/facebook/react-native/commit/75380aa3296210777dc0be70a722701767276117) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix **ScrollView** `centerContent` not work in some cases ([2cdf9694b5](https://github.com/facebook/react-native/commit/2cdf9694b56e76477dde572eb3dc38be31361eab) by [@zhongwuzw](https://github.com/zhongwuzw)) +- Fix crash on performance logger ([5d3d3987d8](https://github.com/facebook/react-native/commit/5d3d3987d8a81b84d43dc88808d7f50c7bf11d19) by [@zhigang1992](https://github.com/zhigang1992)) +- Do not run packager in Release mode ([4ea6204111](https://github.com/facebook/react-native/commit/4ea62041118fb031d7540726df2d29185c6b130d) by [@lucasbento](https://github.com/lucasbento)) +- Fix `code` and `reason` arguments being ignored when calling `WebSocket.close` ([0ac2171c54](https://github.com/facebook/react-native/commit/0ac2171c549b389228c4a37ae645eb0d9813b82d) by [@jeanregisser](https://github.com/jeanregisser)) +- Fix return value of `Linking.openURL()` ([4a5d0bdbd7](https://github.com/facebook/react-native/commit/4a5d0bdbd75c433d2f51f160657a0ad91e440272) by [@thib92](https://github.com/thib92)) +- When an accessibilityLabel can't be discerned, return `nil` instead of `@""` ([d4ff5ed258](https://github.com/facebook/react-native/commit/d4ff5ed258b75fe77c5d801af7b097b04fcd3690) by [@sammy-SC](https://github.com/sammy-SC)) +- Fix Xcode build when the project's path contains whitespace ([f0770b6b37](https://github.com/facebook/react-native/commit/f0770b6b370f483fdd729bdba04069cc783353dc)) +- Move accessibility props to UIView+React ([9261035c2b](https://github.com/facebook/react-native/commit/9261035c2bf2fe9522806fb1c535a1835e7acfa2) by [@janicduplessis](https://github.com/janicduplessis)) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbd665ac8382e5..25d4ad442083ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,440 @@ # Changelog +This file contains all changelogs for latest releases, from 0.70.0 onward. Please check out the other `CHANGELOG-*.md` files for previous versions. + +## v0.72.3 + +### Fixed + +#### iOS specific + +- Revert "Fix pod install for swift libs using new arch (#38121)" to fix [build error with Xcode lower than Xcode 14.3](https://github.com/facebook/react-native/issues/38294) ([8f41f25](https://github.com/facebook/react-native/commit/8f41f25c214f995073e90b786c805eb45ff7dee5) by [@kelset](https://github.com/kelset)) + +## v0.72.2 + +### Changed + +- Remove deprecated stub types `@types/metro-config` from template ([63f78ea8de](https://github.com/facebook/react-native/commit/63f78ea8de68688005e7f48c6849bdf9f95e26ff) by [@kelset](https://github.com/kelset)) +- Bump CLI to 11.3.5 and Metro do 0.76.7 ([ba5fa9c394](https://github.com/facebook/react-native/commit/ba5fa9c394e7cd127e3ee543e0716c37912b0b40) by [@kelset](https://github.com/kelset)) +- Bump `@react-native/metro-config` to `0.72.9` ([21daa6e790](https://github.com/facebook/react-native/commit/21daa6e79030574ce41665ea13c39316eac8c305), [f37386176](https://github.com/facebook/react-native/commit/f37386176cb081e7b38fad8b5442099598bf1968) by [@kelset](https://github.com/kelset)) + +#### Android specific + +- Remove okhttp3 internal util usage ([3e3032636d](https://github.com/facebook/react-native/commit/3e3032636dc90a21a499492dcb88f819bcf4f003) by [@adrianha](https://github.com/adrianha)) + +#### iOS specific + +- Update logic to add and remove views in the view registry for the interop layer. ([8d2eec367d](https://github.com/facebook/react-native/commit/8d2eec367dd6fbd60792ca1bde12b875a8261fa6) by [@cipolleschi](https://github.com/cipolleschi)) +- Disable NSTextStorage caching in OSS ([5bda54c1f1](https://github.com/facebook/react-native/commit/5bda54c1f183fbc51dc7264b0ab94d5bbcc3f172) by [@sammy-SC](https://github.com/sammy-SC)) + +### Fixed + +- `global.performance` in undefined when starting metro from Expo CLI ([0ccbd65581](https://github.com/facebook/react-native/commit/0ccbd65581304faa286b452f75058b6292a6240f) by [@Kudo](https://github.com/Kudo)) +- Re-enabled debugging for debug builds ([41477c898c](https://github.com/facebook/react-native/commit/41477c898cf5726eae9edbb1596366a6eea2b01e) by Matt Blagden) +- Add global hook to assert that base Metro config is called ([29f2602ff9](https://github.com/facebook/react-native/commit/29f2602ff9c3c9a9999c54a6004c99d6fd15ebc3) by [@huntie](https://github.com/huntie)) + +#### Android specific + +- Do not create RuntimeExecutor on non-JSI executors (#38125) ([d73b61c7c7](https://github.com/facebook/react-native/commit/d73b61c7c7dae23630b51b00048eafe5fcb47bd3) by [@lunaleaps](https://github.com/lunaleaps)) +- Prevent crash on OnePlus/Oppo devices in runAnimationStep ([a46a7cd1](https://github.com/facebook/react-native/commit/a46a7cd1f613d6eaea1d1cd07751f17cdc07c21b) by [@hsource](https://github.com/hsource)) + +#### iOS specific + +- Fix build error when there are multiple EXTRA_COMPILER_ARGS ([28f4ebab8a](https://github.com/facebook/react-native/commit/28f4ebab8ab4b0f337699e6a135e2aa983866f42) by [@fergusean](https://github.com/fergusean)) +- Build failure with pnpm and use_frameworks! due to incorrect header paths ([58adc5e4b9](https://github.com/facebook/react-native/commit/58adc5e4b9ab74b67b4af04d1e72c387af848ea7) by evelant) +- Fix onChangeText not firing when clearing the value of TextInput with multiline=true on iOS ([0c9c57a9f7](https://github.com/facebook/react-native/commit/0c9c57a9f73294414d92428c5d2472dc1e1e5e96) by [@kkoudev](https://github.com/kkoudev)) +- Fix pod install for libraries using Swift code when the new architecture is enabled ([a4a0655496](https://github.com/facebook/react-native/commit/a4a065549677c61eb91bf587032976ed48c75821) by [@louiszawadzki](https://github.com/louiszawadzki)) + +## v0.72.1 + +### Added + +#### iOS specific + +- Add warning to help users migrate away from the interop layer. ([a702d0515f](https://github.com/facebook/react-native/commit/a702d0515f9005714da52cda7f6851e06b4103da) by [@cipolleschi](https://github.com/cipolleschi)) +- Allow to lookup for ViewManager without the RCT prefix in the Interop Layer ([a28881a3d7](https://github.com/facebook/react-native/commit/a28881a3d79e732670157638aa5207c88c79718c) by [@cipolleschi](https://github.com/cipolleschi)) + +### Changed + +- `react-native/metro-config` now includes all base config values from `metro-config` ([bbcedd385b](https://github.com/facebook/react-native/commit/bbcedd385bf7fe374955378d2c2a065318f740cb) by [@huntie](https://github.com/huntie)) +- Bump CLI to 11.3.3 ([da84901f78](https://github.com/facebook/react-native/commit/da84901f78bdfc8c84ed71996c01f585d8b96367) by [@kelset](https://github.com/kelset)) +- Bumped `@react-native/metro-config` to `0.72.7`, `@react-native/gradle-plugin` to `0.72.11`, `@react-native/virtualized-lists` to `0.72.6` ([95db9f98f2](https://github.com/facebook/react-native/commit/95db9f98f2673d9015f6786db2df4e5f16dc74fc) by [@kelset](https://github.com/kelset)) + +### Fixed + +- `react-native/virtualized-lists` does not need `react-test-renderer` at runtime ([7a2a3278d0](https://github.com/facebook/react-native/commit/7a2a3278d08b13dbde7a6e967474c20d6a5c76a5) by [@tido64](https://github.com/tido64)) + +#### Android specific + +- Exclude trailing whitespace from newline character on measuring text line width ([83d7a48a46](https://github.com/facebook/react-native/commit/83d7a48a46c00b99c52a8ac5897c013924e10152) by [@bernhardoj](https://github.com/bernhardoj)) +- Set kotlin.jvm.target.validation.mode=warning on user projects ([10beefbbfa](https://github.com/facebook/react-native/commit/10beefbbfadcbe6e40314564e409bf592a16e571) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- Bump SocketRocket to 6.1.0 ([8ce471e2fa](https://github.com/facebook/react-native/commit/8ce471e2fa802cc50ff2d6ab346627cb5f6d79b4) by [@cipolleschi](https://github.com/cipolleschi)) +- fix `pod install --project-directory=ios` failing ([0b96bdcf32](https://github.com/facebook/react-native/commit/0b96bdcf326944b13e447f71739dee3c25c7b59a) by [@tido64](https://github.com/tido64)) + +## v0.72.0 + +### Breaking + +- Bump version of Node used to 18 ([f75b92a](https://github.com/facebook/react-native/commit/f75b92a12b829d74f202aded7d4c8f4e1d23e402) by [@leotm](https://github.com/leotm)), and minimum Node JS version to 16 ([afc91de79a](https://github.com/facebook/react-native/commit/afc91de79a8804696f05219214e0e67235d34d77) by [@robhogan](https://github.com/robhogan)) +- Constrain data type in `getItemLayout` callback ([febf6b7f33](https://github.com/facebook/react-native/commit/febf6b7f33fdb4904669f99d795eba4c0f95d7bf) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix react-native/eslint-config linting of jsx files ([59ee573527](https://github.com/facebook/react-native/commit/59ee57352738f030b41589a450209e51e44bbb06) by [@NickGerleman](https://github.com/NickGerleman)) + +#### iOS specific + +- Generates RNCore components inside the ReactCommon folder and create a new pod for platform-specific ImageManager classes ([5d175c6775](https://github.com/facebook/react-native/commit/5d175c6775d0c630fb53b41df4e2a08f15bd94a4) by [@cipolleschi](https://github.com/cipolleschi)) +- Moved the RCTAppSetupUtils to the AppDelegate library to break a dependency cycle ([36a64dc2bd](https://github.com/facebook/react-native/commit/36a64dc2bd9de52841a52c549f35b944020bdb53) by [@cipolleschi](https://github.com/cipolleschi)) +- Split the `ReactCommon/react/nativemodule/core/platform/ios` and `ReactCommon/react/nativemodule/samples` in two separate pods to break circular dependencies. ([21d530208f](https://github.com/facebook/react-native/commit/21d530208f57feda87dce9f93f471bbf57635477) by [@cipolleschi](https://github.com/cipolleschi)) + +### Added + +- Improve handling of invalid DimensionValue usage ([02e29abead](https://github.com/facebook/react-native/commit/02e29abeada3d78dd7d90d1d89049cd1517afb55) by [@NickGerleman](https://github.com/NickGerleman)) +- Add new JS performance API to support getting RN app startup timings ([c1023c73b0](https://github.com/facebook/react-native/commit/c1023c73b010245f2e8182b75cc3bccd112d5e2e)) +- Add performance memory API with native memory Info ([70fb2dce45](https://github.com/facebook/react-native/commit/70fb2dce4557da1195289a24638b1e4d2c2edbf7)) +- Added Web-compatible `DOMRect` and `DOMRectReadOnly` classes to the global scope. ([673c7617bc](https://github.com/facebook/react-native/commit/673c7617bcf90a892a0afc2c0d9cf9c0493fdf27) by [@rubennorte](https://github.com/rubennorte)) +- Add onStartReached and onStartReachedThreshold to VirtualizedList ([7683713264](https://github.com/facebook/react-native/commit/76837132649d740e1ec2c3c78f0085b444a4367c) by [@janicduplessis](https://github.com/janicduplessis)) +- Added `setColorScheme` to `Appearance` module ([c18566ffdb](https://github.com/facebook/react-native/commit/c18566ffdb44103a3e24cd8017d0ae6a69c68e40), ([0a4dcb0309](https://github.com/facebook/react-native/commit/0a4dcb0309fdc8f4529ed7599c4170341b42c9b1) by [@birkir](https://github.com/birkir)) +- Add logical border block color properties ([597a1ff60b](https://github.com/facebook/react-native/commit/597a1ff60b3e1844b4794fb4acd40fa073f2e93b) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Add logical border-radius implementation ([4ae4984094](https://github.com/facebook/react-native/commit/4ae4984094e4846bc2bc0e3374ab5d934ee6bc5f) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Added CSS logical properties. ([3681df2878](https://github.com/facebook/react-native/commit/3681df287835f5467a2ad5afe950eae16b95fd8b) by [@necolas](https://github.com/necolas)) +- Concurrent rendering safe implementation of Animated ([5cdf3cf726](https://github.com/facebook/react-native/commit/5cdf3cf72613a2068884151efb08fd4c17fec5fd), ([5e863fc42c](https://github.com/facebook/react-native/commit/5e863fc42c8a2b27f4a785766eb643de9a243b2d) by [@sammy-SC](https://github.com/sammy-SC)) +- Create explicit error message for TypeScript functions used as props in Codegen components, redirecting devs to the supported function types `BubblingEventHandler` and `DirectEventHandler`. ([dc2cbed07c](https://github.com/facebook/react-native/commit/dc2cbed07c82b5b80e66f5c6a1bd6244f4972ede) by [@gtomitsuka](https://github.com/gtomitsuka)) +- Generate enum types that would be allowed to be used as well as string/number in c++ turbo modules generators ([ceb1d0dea6](https://github.com/facebook/react-native/commit/ceb1d0dea694739f357d86296b94f5834e5ee7f7) by [@vzaidman](https://github.com/vzaidman)) +- Add enum example to Android/iOS rn-tester TurboModule ([7c82a3fa11](https://github.com/facebook/react-native/commit/7c82a3fa110a618c7bd59555a3ae94304ab25b1f) by [@christophpurrer](https://github.com/christophpurrer)) +- Allow the use of "Partial" in Turbo Module specs. ([97e707d897](https://github.com/facebook/react-native/commit/97e707d897e63715023dc68bb059f4aa5332fc78) by [@vzaidman](https://github.com/vzaidman)) +- Added newline to UTFSequence ([9cf35bfcc4](https://github.com/facebook/react-native/commit/9cf35bfcc47c928392ac524cd9e3fd30a1130fbb)) +- Added "coverage" folder generated from `jest --coverage` to .gitignore ([7324c22ff9](https://github.com/facebook/react-native/commit/7324c22ff91c572b4022a1d22c6c7751a73ad76a) by [@Adnan-Bacic](https://github.com/Adnan-Bacic)) +- Add support for getting/setting reload-and-profile-related settings in iOS + Android ([96d6680e00](https://github.com/facebook/react-native/commit/96d6680e00c28575d6ebf95d5f55487d69fda51f)) +- For supporting Dev Loading View across platforms, adding the DevLoadingViewController without an activity/context. ([662b51fad2](https://github.com/facebook/react-native/commit/662b51fad2fb4c267da519c9122ab4d12dcfdaae)) +- Pass DevTools Settings Manager to connectToDevTools ([a9bed8e75d](https://github.com/facebook/react-native/commit/a9bed8e75d9b9613c5fcb69436a2d3af763f456d)) +- React-native-code-gen Add Union Type support for Java/ObjC TurboModules ([2eccd59d7c](https://github.com/facebook/react-native/commit/2eccd59d7c735df3c29fc7ca342555890eb7055b) by [@christophpurrer](https://github.com/christophpurrer)) +- Making Dev Loading View cross platform by abstracting out the activity/context logic from the controller in a polymorph class. ([1a4fa92b25](https://github.com/facebook/react-native/commit/1a4fa92b253aeb70162322e9d4135fb34901dcf1)) +- Added CSS logical properties by mapping layout props. ([cf3747957a](https://github.com/facebook/react-native/commit/cf3747957ab210e31504109bb6b3e34e773a5b9a) by [@mayank-96](https://github.com/mayank-96)) +- Add, but don't use, DevTools Settings Manager. ([6152763398](https://github.com/facebook/react-native/commit/6152763398efe60521fc86fcf992b6a84361df12)) + +#### Android specific + +- Adding pager, scrollview, viewgroup, webview, drawer accessibility roles ([55c0df43b9](https://github.com/facebook/react-native/commit/55c0df43b9859853e41b6e2ef271b78b783538f0) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Add TYPE_VIEW_HOVER_ENTER to AccessibilityNodeInfo sendAccessibilityEvent ([a0adf57e50](https://github.com/facebook/react-native/commit/a0adf57e509dbb9074b2fa14339c5add140f5332) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Add maintainVisibleContentPosition support on Android ([c19548728c](https://github.com/facebook/react-native/commit/c19548728c9be3ecc91e6fefb35bc14929109d60) by [@janicduplessis](https://github.com/janicduplessis)) +- For supporting Dev Loading View across multiple platforms, changing the Loading View of Android to rely on the native implementation instead of Toast while keeping backwards comptability. ([9f6b532bdb](https://github.com/facebook/react-native/commit/9f6b532bdb7e60eddec62b7a0b89141e4c8df127)) +- For supporting Dev Loading View across multiple platforms, adding native implementation for showMessage() & hide() of Dev Loading Module ([4923a0997b](https://github.com/facebook/react-native/commit/4923a0997b1a8c827b11ec15e45e6ce00f398d99)) +- For supporting Dev Loading View across multiple platforms, altering the javascript implementation of Loading view of android to also rely on native implementation as iOS instead of Toast, thereby unifying both platforms ([068a20842d](https://github.com/facebook/react-native/commit/068a20842d349318db2236676415e96be2a663f9)) +- Added possibility to mark Fresco image pipeline as already initialized ([605a52fe3e](https://github.com/facebook/react-native/commit/605a52fe3ec099b652fc222947d1ddffa41cfd7f) by [@oprisnik](https://github.com/oprisnik)) +- Support generating `getName` in react-native-codegen for Java TurboModules ([90538909f9](https://github.com/facebook/react-native/commit/90538909f988a8be9475cf12471269b70dbc179e) by [@javache](https://github.com/javache)) +- Override default Talkback automatic content grouping and generate a custom contentDescription ([759056b499](https://github.com/facebook/react-native/commit/759056b49975c30cd561826e1499ebdf7aa8674d) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Enable AnimatedInterpolation to interpolate arbitrary color types. ([e7dbfb2dbd](https://github.com/facebook/react-native/commit/e7dbfb2dbd98059ddd6e982e2e43c1e7df91a4cc) by [@javache](https://github.com/javache)) +- Added getter for line height in CustomLineHeightSpan ([2d2f9da80b](https://github.com/facebook/react-native/commit/2d2f9da80b86505dace0ee8ffbadde151067cb8f)) +- Add POST_NOTIFICATIONS permission to AndroidManifest of RNTester ([c84cc4b46c](https://github.com/facebook/react-native/commit/c84cc4b46c8dfbb62c3b95fc26aa59f0105f0438) by [@makovkastar](https://github.com/makovkastar)) + +#### iOS specific + +- Added examples of direct manipulation ([a44d8a0f8a](https://github.com/facebook/react-native/commit/a44d8a0f8a9b6533b50ac6318fa5993bd41d444b) by [@cipolleschi](https://github.com/cipolleschi)) +- Support workspace and isolated setups with `pod install` ([0eff8d66c9](https://github.com/facebook/react-native/commit/0eff8d66c9acfad91c9e6a37b321034358ee4719) by [@robhogan](https://github.com/robhogan)) +- Add example in the Interop Layer to use constants ([a5866ca3aa](https://github.com/facebook/react-native/commit/a5866ca3aad53802e8010295a205e956e8e26120) by [@cipolleschi](https://github.com/cipolleschi)) +- Add example in the Interop Layer to use events ([c005830958](https://github.com/facebook/react-native/commit/c005830958921a030fd46b6968b778509d3bcb45) by [@cipolleschi](https://github.com/cipolleschi)) +- Add invoking dev menu on iOS by pressing `d` in terminal. ([f72f8daeaf](https://github.com/facebook/react-native/commit/f72f8daeaf20ae53e778143aecbb96303852aeb0) by [@szymonrybczak](https://github.com/szymonrybczak)) +- Add comments for specifying the path to React Native ([3876368f0c](https://github.com/facebook/react-native/commit/3876368f0c5e5dcbafee9a71da80a4a7226096a0) by [@sottar](https://github.com/sottar)) +- Add explicit support for M2 iPad Apple Pencil hovering in the Pointer Events implementation ([0c150b2289](https://github.com/facebook/react-native/commit/0c150b2289818267c940b6e726ec2f7725659817) by [@vincentriemer](https://github.com/vincentriemer)) +- Add message with instructions about what to do if the cleanup of the build folder fails. ([1b7127bb05](https://github.com/facebook/react-native/commit/1b7127bb052096509de60ee5eb098d669c616f32)) +- Enable AnimatedInterpolation to interpolate arbitrary color types. ([56b10a8351](https://github.com/facebook/react-native/commit/56b10a83511ee509c36eb91f53da58d5eda643d5) by [@javache](https://github.com/javache)) +- Allow for custom project dir in react-native-xcode script ([436da18fce](https://github.com/facebook/react-native/commit/436da18fce99af6361bae5719cfce0ed4539a3f7) by [@itxch](https://github.com/itxch)) +- Enable AnimatedInterpolation to interpolate arbitrary color types. ([6003e70e84](https://github.com/facebook/react-native/commit/6003e70e84c369d7dc2c6bea50ea41f0bac79595) by [@javache](https://github.com/javache)) + +### Changed + +- Default condition set for experimental Package Exports is now `['require', 'react-native']` ([308838c0ff](https://github.com/facebook/react-native/commit/308838c0ff3cdc4c7817afe349eddfab80c0c76c) by [@huntie](https://github.com/huntie)) +- Run commit hooks before layout calculation ([8d0b5af1fc](https://github.com/facebook/react-native/commit/8d0b5af1fc13928c024663f10b0257e816bd6696) by [@tomekzaw](https://github.com/tomekzaw)) +- Support mixed props for components in codegen ([0ae5e50e37](https://github.com/facebook/react-native/commit/0ae5e50e3753f03712e796dc28a36083bde87dc1) by [@genkikondo](https://github.com/genkikondo)) +- Switch from `types/jest` to `jest/globals` for new react-native projects ([9af3c9654a](https://github.com/facebook/react-native/commit/9af3c9654ae8e2cb10d49770dd3438aec038fcef) by [@UNIDY2002](https://github.com/UNIDY2002)) +- Move virtualized lists to react-native/virtualized-lists package ([2e3dbe9c2f](https://github.com/facebook/react-native/commit/2e3dbe9c2fbff52448e2d5a7c1e4c96b1016cf25) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Add minimum necessary .d.ts files to react-native-codegen ([ac5aec3f5c](https://github.com/facebook/react-native/commit/ac5aec3f5caa732f4565328447ffa9da7ede8dec), ([be3845adec](https://github.com/facebook/react-native/commit/be3845adec324e4b3ae6efd8f85d3569f1cb60b8) by [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT)) +- Change PerformanceApiExample to use ModulePathing ([6a395cb2d7](https://github.com/facebook/react-native/commit/6a395cb2d722761825c9f24468b6d036e3e0f52c) by [@TatianaKapos](https://github.com/TatianaKapos)) +- Re-organize the parameters of TurboModuleBinding::install() ([cbdbb47467](https://github.com/facebook/react-native/commit/cbdbb474675bb6fbd5857873234d825c52ca16b3)) +- `EventEmitter#addListener` now throws if the 2nd argument is not a function. ([2780ba38ff](https://github.com/facebook/react-native/commit/2780ba38ff23f4c5e717b8fd8a733b649701f00c) by [@yungsters](https://github.com/yungsters)) +- When a ScrollView's `ref` or `innnerViewRef` changes, the old ref will now be invoked with `null` and the new ref with the active instance. (Previously, changing `ref` or `innerViewRef` on a `ScrollView` would be treated as though the ref had not changed at all.) ([7cf4cf3afb](https://github.com/facebook/react-native/commit/7cf4cf3afbea4463427944fbed30768a796db724) by [@yungsters](https://github.com/yungsters)) +- Turbo Module supports intersection type for TypeScript ([bbed15d4ae](https://github.com/facebook/react-native/commit/bbed15d4ae6df23bab2f0730562396ef61f0bc59) by [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT)) +- Find node binary when using asdf as the node version manager with custom `$ASDF_DIR` ([f6a4e4f20f](https://github.com/facebook/react-native/commit/f6a4e4f20f0d3b5fe2aad171cded9aba06d3c8f8) by [@MuhmdRaouf](https://github.com/MuhmdRaouf)) +- Turbo module codegen support interface with inheritance in module ([bf34810c5c](https://github.com/facebook/react-native/commit/bf34810c5c188cd1c42e2ac0c52d08790209bc1e) by [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT)) +- Use number literals in TypeScript types for `FileReader` and `XMLHttpRequest` states ([8568b93733](https://github.com/facebook/react-native/commit/8568b937335b152c2836e7790c1db75e93365787) by [@eps1lon](https://github.com/eps1lon)) +- Moved jest config from package.json to dedicated jest.config.js file ([473eb1dd87](https://github.com/facebook/react-native/commit/473eb1dd870a4f62c4ebcba27e12bde1e99e3d07) by [@Adnan-Bacic](https://github.com/Adnan-Bacic)) +- Removed iOS flag from `scrollEventThrottle` docs ([8ea1cba06a](https://github.com/facebook/react-native/commit/8ea1cba06a78fba023e5a441ad5c4755d0d504ac) by [@robwalkerco](https://github.com/robwalkerco)) +- Renamed App-test.tsx to App.test.tsx to unify naming convention with create-react-app ([3c03aef151](https://github.com/facebook/react-native/commit/3c03aef1511844262f38149ad261e26703f55ead) by [@Adnan-Bacic](https://github.com/Adnan-Bacic)) +- Turbo module codegen support interface like alias in module ([8befb740d6](https://github.com/facebook/react-native/commit/8befb740d6cd3de6ead067ac01b70c37d4b5b1bc) by [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT)) +- Append RCTRedBoxGetEnabled() in RCTExceptionsManager.mm ([2217ea4136](https://github.com/facebook/react-native/commit/2217ea4136e96185c46947b5afe0a24574b3f23a) by [@nxdm](https://github.com/nxdm)) +- ActivityIndicator and remove .flow ([9c57a7f209](https://github.com/facebook/react-native/commit/9c57a7f20925765da69590256ca8755b71735cdb) by [@lunaleaps](https://github.com/lunaleaps)) +- Mark methods on JSI references as const. ([03b17d9af7](https://github.com/facebook/react-native/commit/03b17d9af7e4e3ad3f9ec078b76d0ffa33a3290e) by [@neildhar](https://github.com/neildhar)) +- Fix codegen output for object with indexer ([f07490b1f1](https://github.com/facebook/react-native/commit/f07490b1f1b492b75cfa06df00f6e89b404a1ee8) by [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT)) +- Fix codegen to add `T` of `Promise` in CodegenSchema.js ([8a38e03e0f](https://github.com/facebook/react-native/commit/8a38e03e0f25528063d24a429c1d650363a0eee7) by [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT)) +- Renamed react-native/polyfills -> react-native/js-polyfills and align with other packages versions (0.72.0) as a part of migration to monorepo ([71399d0891](https://github.com/facebook/react-native/commit/71399d089187c3e2e58b3cbf31977368d0f216fa) by [@hoxyq](https://github.com/hoxyq)) +- Rename normalize-color to normalize-colors as part of https://github.com/react-native-community/discussions-and-proposals/pull/480 ([dc3355920d](https://github.com/facebook/react-native/commit/dc3355920d7f6f4ef887e0ff01153e23e660b5ea) by [@Titozzz](https://github.com/Titozzz)) +- Renamed react-native-codegen package to react-native/codegen and updated references ([b7a85b59b5](https://github.com/facebook/react-native/commit/b7a85b59b5798add4e9dbfb5f5f2fc62756e30b5) by [@shivenmian](https://github.com/shivenmian)) +- Rename assets to assets-registry ([3c5a8290ae](https://github.com/facebook/react-native/commit/3c5a8290ae1645672ee585feaf6ff38df1e30b34) by [@fortmarek](https://github.com/fortmarek)) +- Rename polyfills to js-polyfills as part of https://github.com/react-native-community/discussions-and-proposals/pull/480 ([ca1ae5c44f](https://github.com/facebook/react-native/commit/ca1ae5c44ffa0b1a149e69e47b7f51cb6a914734) by [@Titozzz](https://github.com/Titozzz)) +- Rename react-native-gradle-plugin to react-native/gradle-plugin ([6f11b10a88](https://github.com/facebook/react-native/commit/6f11b10a88235ad7de1a5777e5cdf7a582a231b7) by [@hoxyq](https://github.com/hoxyq)) +- Renamed `react-native-community/eslint-plugin` to `react-native/eslint-plugin` v0.72.0 to align with other packages ([5aead70e80](https://github.com/facebook/react-native/commit/5aead70e8026e6567cb79e585ab2c6cf6e396892) by [@afoxman](https://github.com/afoxman)) +- Untrack Test Reports generated by test libraries (reporters E.g. `jest-junit`) ([0ba1127c15](https://github.com/facebook/react-native/commit/0ba1127c15182564ac25b41b55433ed8f9512a9c) by [@Pranav-yadav](https://github.com/Pranav-yadav)) +- Add `TSMethodSignature` to react-native-codegen ([ae1d54bc5a](https://github.com/facebook/react-native/commit/ae1d54bc5ac5ecdf5f7e17b709c53872c606277e) by [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT)) +- Any `ref` set on `TextInput` will now be updated less frequently (when the underlying `ref` has not changed). ([666f56bff3](https://github.com/facebook/react-native/commit/666f56bff318549b62ae5f68f0a046ef8d81c545) by [@yungsters](https://github.com/yungsters)) +- Add intersection types in react-native-codegen for TypeScript ([813fd04118](https://github.com/facebook/react-native/commit/813fd04118c30054cc7c30e231cd9d4002423d32) by [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT)) +- Update TextInput inputMode to map "none" to showSoftInputOnFocus ([b6869be1ac](https://github.com/facebook/react-native/commit/b6869be1ac0bedcb846722160f29fb4591ae5013) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- LogBox now makes URL links tappable. ([d9ade19b71](https://github.com/facebook/react-native/commit/d9ade19b711fae03838581ff2564185d5b7a24cb) by [@sammy-SC](https://github.com/sammy-SC)) +- Upgrade to deprecated-react-native-prop-types@4.1.0 ([f84256a924](https://github.com/facebook/react-native/commit/f84256a924ef8aee8ac5773dbf569ee627472101) by [@yungsters](https://github.com/yungsters)) +- Flipper to 0.182.0 ([8fae37eaea](https://github.com/facebook/react-native/commit/8fae37eaeab0c75c0be2885ce9198131e4d74c92) by [@cortinico](https://github.com/cortinico)) +- Bump metro to 0.76.5 and CLI to 11.3.1 ([7c5dc1d9bc](https://github.com/facebook/react-native/commit/7c5dc1d9bc57c9b07ecabaff53b5ed79c9dd586f)) +- Bump tsconfig/react-native to 3.0.0 ([5c4649af27](https://github.com/facebook/react-native/commit/5c4649af279d40c83b181f2a35b7cf58a50eac2a) by [@NickGerleman](https://github.com/NickGerleman)) +- Brew overwrites system Python 3. ([ed8a3e08e2](https://github.com/facebook/react-native/commit/ed8a3e08e2f227a37730b697b0e4e2c7d63e27ff) by [@blakef](https://github.com/blakef)) +- Change the way types for New Architecture/experimental APIs are exposed. ([f9bf14d09d](https://github.com/facebook/react-native/commit/f9bf14d09d70fb89f7425c6c7f99aec96cbb2bf8) by [@lunaleaps](https://github.com/lunaleaps)) +- Backporting babel bumps to 0.72 ([97986561f6](https://github.com/facebook/react-native/commit/97986561f60d7cf17eed3e264743198429b54a8b) by [@hoxyq](https://github.com/hoxyq)) + +#### Android specific + +- Migrate packages to not eager initialize view managers ([d7eb3bfcb3](https://github.com/facebook/react-native/commit/d7eb3bfcb3df43d787af34cbd16730b2a12b6714)) +- Do not explicitely depend on androidx.swiperefreshlayout:swiperefreshlayout ([179d5ab8ee](https://github.com/facebook/react-native/commit/179d5ab8eeb4393737049655876f5853b07f2560) by [@cortinico](https://github.com/cortinico)) +- Remove the enableSeparateBuildPerCPUArchitecture from the template entirely ([dadf74fb68](https://github.com/facebook/react-native/commit/dadf74fb68980f4cba3d23e3802ee431a0713cca) by [@cortinico](https://github.com/cortinico)) +- Convert Bridge-only calls to overridable functions ([1058bb8096](https://github.com/facebook/react-native/commit/1058bb809602a5223fa0adba74e7cab4df766685)) +- Use ThemedReactContext explicitly to reduce confusion ([9f78517d64](https://github.com/facebook/react-native/commit/9f78517d6401f3a7ece453825a059a13b73f6140)) +- Add notes to `aria-labelledby` from Text props ([72d3da19ce](https://github.com/facebook/react-native/commit/72d3da19cecca6a1bc8119f963311e1126e4c04b) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Add POST_NOTIFICATION runtime permission to RNTester ([63a4539e4d](https://github.com/facebook/react-native/commit/63a4539e4d36ac90137eea6cdde0154ca06878c0) by [@makovkastar](https://github.com/makovkastar)) +- Removing code for Android API level < 21 ([22ba1e45c5](https://github.com/facebook/react-native/commit/22ba1e45c52edcc345552339c238c1f5ef6dfc65) by [@mdvacca](https://github.com/mdvacca)) +- Align creation of FabricUIManager with bridge ([6d45e49dc7](https://github.com/facebook/react-native/commit/6d45e49dc783d0af3a39be2df5e8495541d65e5f)) +- For supporting Dev Loading View across multiple platforms, changed the Loading View of Android to rely on the native implementation instead of Toast. Getting rid of the JS changes relying on Toast for Dev Loading View now that the native module is released. ([208f559505](https://github.com/facebook/react-native/commit/208f5595055426305a9f23e92546b2ad09a8a52c)) +- Remove unnecessary repositories{} block from top level build.gradle ([51a48d2e2c](https://github.com/facebook/react-native/commit/51a48d2e2c64a18012692b063368e369cd8ff797) by [@cortinico](https://github.com/cortinico)) +- Include the inspector in all build modes, and only turn it off/on at runtime. ([8284303ec8](https://github.com/facebook/react-native/commit/8284303ec8d670a421745b3f580f184afa892592)) +- Bump Soloader to 0.10.5 ([92a705b0e0](https://github.com/facebook/react-native/commit/92a705b0e0654429068d9de130f2216373124bbb) by [@simpleton](https://github.com/simpleton)) +- Bump AGP to 7.4.x ([4c5eb8dd2a](https://github.com/facebook/react-native/commit/4c5eb8dd2a8cfb78783ab9cc3ac5a1c3f7937b63), ([5647d79dc9](https://github.com/facebook/react-native/commit/5647d79dc97ab2787a9575cb1621725d865b9814) by [@cortinico](https://github.com/cortinico)) +- Bump Gradle to 8.x ([81dd3afe0b](https://github.com/facebook/react-native/commit/81dd3afe0bb88fbfa5b11d6f4c95f8684c9e1b47), ([10a8f186eb](https://github.com/facebook/react-native/commit/10a8f186eb41441ebad0c91be4f88deb4f9c6366) by [@cortinico](https://github.com/cortinico)) +- Kotlin to 1.7.22 for Gradle ([270584ac79](https://github.com/facebook/react-native/commit/270584ac79ebb5b8e256bf7422615a5311e0c080) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- Fixed URL to New Arch info ([6714b99289](https://github.com/facebook/react-native/commit/6714b99289d68b2f1efdb38d9977da725778e949) by [@frankcalise](https://github.com/frankcalise)) +- Prefer `Content-Location` header in bundle response as JS source URL ([671ea383fe](https://github.com/facebook/react-native/commit/671ea383fe45dd9834a0c0481360de050df7f0c9) by [@robhogan](https://github.com/robhogan)) +- Add support to enable the Hermes Sampling Profiler ([dce9d8d5de](https://github.com/facebook/react-native/commit/dce9d8d5de381fe53760ddda0d6cbbdfb5be00e4) by [@cipolleschi](https://github.com/cipolleschi)) +- Enable layout animations on iOS in OSS ([0a30aa3612](https://github.com/facebook/react-native/commit/0a30aa361224639dbec0bbf33351673b67d31e75) by [@sammy-SC](https://github.com/sammy-SC)) +- Update how the `react-native.config.js` is consumed to add elements in the interop layer. ([a055e07c3e](https://github.com/facebook/react-native/commit/a055e07c3ecd82dad6b2f9d9cc0088bce689d07e) by [@cipolleschi](https://github.com/cipolleschi)) +- Use contents of sdks/.hermesversion to let cocoapods recognize Hermes updates. ([9f496e2be5](https://github.com/facebook/react-native/commit/9f496e2be5cfa55cd993c94f3a9210955bea085c) by [@dmytrorykun](https://github.com/dmytrorykun)) +- Rename "Debug Menu" title to "Dev Menu" ([6971540c90](https://github.com/facebook/react-native/commit/6971540c90ae9e56bcc65e0c33c1ffb3db0a1e06) by [@huntie](https://github.com/huntie)) +- Give precedence to `textContentType` property for backwards compat as mentioned in https://github.com/facebook/react-native/issues/36229#issuecomment-1470468374 ([c0abff11b6](https://github.com/facebook/react-native/commit/c0abff11b66d9ec3a8e1d09333a3fb6c05678bed) by [@lunaleaps](https://github.com/lunaleaps)) +- Use SocketRocket for web socket library ([9ee0e1c78e](https://github.com/facebook/react-native/commit/9ee0e1c78e422a83de01d045657c10454f66980a)) +- Pull out CGContext early in UIImage+Diff ([7f2dd1d49c](https://github.com/facebook/react-native/commit/7f2dd1d49cc3c0bf5e24fdb37f6457151c1f06c4) by [@Saadnajmi](https://github.com/Saadnajmi)) +- Remove assumptions on super's description ([a5bc6f0574](https://github.com/facebook/react-native/commit/a5bc6f0574b6eff52b65d5324749d89de01b63a5) by [@Saadnajmi](https://github.com/Saadnajmi)) +- Automatically update Search Path on pods ([ad686b0ce1](https://github.com/facebook/react-native/commit/ad686b0ce1ce69e8414e0c385ce0c7b4277f7a2f) by [@cipolleschi](https://github.com/cipolleschi)) +- Install the -DNDEBUG flag on Release configurations, without requiring PRODUCTION=1 flag ([93fdcbaed0](https://github.com/facebook/react-native/commit/93fdcbaed0f69b268e1ae708a52df9463aae2d53) by [@cipolleschi](https://github.com/cipolleschi)) +- Create a new compile time flag to enable remote sample profiling. ([de28f9b8ea](https://github.com/facebook/react-native/commit/de28f9b8ea2c4c2e3584da76145b9d6ce0e68b02)) +- Bumbed version of Cocoapods to support Ruby 3.2.0 ([0f56cee8e1](https://github.com/facebook/react-native/commit/0f56cee8e1fca9575e83f439274b83e01bdd98e2) by [@cipolleschi](https://github.com/cipolleschi)) +- Automatically install the RuntimeScheduler ([3e88fd01ce](https://github.com/facebook/react-native/commit/3e88fd01cecfa9c627506c8ab0081d1e4865862a) by [@cipolleschi](https://github.com/cipolleschi)) +- Generate RCTFabric framework's headers in the React folder ([e7becb06c1](https://github.com/facebook/react-native/commit/e7becb06c16718a38570ba3a06d5059276be4b23) by [@cipolleschi](https://github.com/cipolleschi)) +- Properly install dependencies with `use_frameworks!` ([6d34952420](https://github.com/facebook/react-native/commit/6d349524201e150029202134910de445328072e8) by [@cipolleschi](https://github.com/cipolleschi)) +- Moved the files from `.../textlayoutmanager/platform/ios` to `.../textlayoutmanager/platform/ios/react/renderer/textlayoutmanager` ([0e09d6f8a6](https://github.com/facebook/react-native/commit/0e09d6f8a665357f0dc642067eceb8f51ae24b76) by [@cipolleschi](https://github.com/cipolleschi)) +- Moved the files from `.../imagemanager/platform/ios` to `.../imagemanager/platform/ios/react/renderer/imagemanager` ([931a4c5e23](https://github.com/facebook/react-native/commit/931a4c5e239a006ecc81becf3252d23d44c969ef) by [@cipolleschi](https://github.com/cipolleschi)) +- Moved the files from `.../textinput/iostextinput` to `.../textinput/iostextinput/react/renderer/components/iostextinput` ([5588e0fe0b](https://github.com/facebook/react-native/commit/5588e0fe0b78bfcbc32b6880e9c985853aea5653) by [@cipolleschi](https://github.com/cipolleschi)) +- Moved the files from `.../nativemodule/xxx/platform/ios` to `.../nativemodule/xxx/platform/ios/ReactCommon` ([d1e500c3b1](https://github.com/facebook/react-native/commit/d1e500c3b19182897ccfb8abfe87e3f32dcacd3e) by [@cipolleschi](https://github.com/cipolleschi)) +- Moved the files from `.../platform/ios` to `.../platform/ios/react/renderer/graphics` ([b5e4fea86e](https://github.com/facebook/react-native/commit/b5e4fea86ef9df1ed0edb438f918dfc8330f649c) by [@cipolleschi](https://github.com/cipolleschi)) +- Build hermesc in Xcode run script phase. ([a5c77115ae](https://github.com/facebook/react-native/commit/a5c77115ae94b46823dc788add516493ee8e82cb) by [@dmytrorykun](https://github.com/dmytrorykun)) +- Do not add "Copy Hermes Framework" script phase to hermes-engine target. ([af6c9e2183](https://github.com/facebook/react-native/commit/af6c9e218305c70e479c75e5ce1a8d633b1e2947) by [@dmytrorykun](https://github.com/dmytrorykun)) +- Refactor RCTEventEmitter initialization ([25a00520d8](https://github.com/facebook/react-native/commit/25a00520d80b8b456b1eccfb106b75929f2f3bc2) by [@cipolleschi](https://github.com/cipolleschi)) + +### Deprecated + +#### iOS specific + +- Deprecate the `ReactCommon/react/renderer/graphics/conversions.h` in favor of `ReactCommon/react/core/graphicsConversions.h` ([d72697ca95](https://github.com/facebook/react-native/commit/d72697ca95820ebc7594b11bb5a6effeb84f2d90) by [@cipolleschi](https://github.com/cipolleschi)) + +### Removed + +- Remove inline props from experimental ([8c4694f708](https://github.com/facebook/react-native/commit/8c4694f708fec310fc13193cc7fda40d971ed847)) +- Refactor(react-native-github): internalized Slider JS files ([05968d16e1](https://github.com/facebook/react-native/commit/05968d16e1c4714a7ebfb08fff60ec7d5c914de1) by [@hoxyq](https://github.com/hoxyq)) +- Remove `.node_version` from app template. ([a80578afc4](https://github.com/facebook/react-native/commit/a80578afc456c352edb52fc9b7e19899553a359a) by [@robhogan](https://github.com/robhogan)) +- Clean up unnecessary lambda function for preallocate after D40403682 ([0569f6500e](https://github.com/facebook/react-native/commit/0569f6500e1ba9dbf021c8d693d5ac31af5dd586)) +- Remove unused type imports 1/1 ([58a6cf840a](https://github.com/facebook/react-native/commit/58a6cf840afc9522b6cd9f3b15d119ddba7dab31) by [@alunyov](https://github.com/alunyov)) +- Remove force_static from ReactCommon/react/renderer/core ([e088f81375](https://github.com/facebook/react-native/commit/e088f81375aa0216625bc38c964f50af6c4107b7) by [@javache](https://github.com/javache)) + +#### Android specific + +- Deprecate LazyReactPackage.getReactModuleInfoProviderViaReflection() ([11570e71a2](https://github.com/facebook/react-native/commit/11570e71a2747602ff485552094b413375b19a96)) +- UIManager.preInitializeViewManagers ([848ac0c3be](https://github.com/facebook/react-native/commit/848ac0c3bea5f38c002d316dbfb54c2d740bedfe) by [@javache](https://github.com/javache)) +- Removed android sources of Slider module ([4c40014d43](https://github.com/facebook/react-native/commit/4c40014d43abe88b17db75aca9de9cca349ecbcc) by [@hoxyq](https://github.com/hoxyq)) +- Remove the react.gradle file as it's unused ([d4a9bdc40e](https://github.com/facebook/react-native/commit/d4a9bdc40e06bdda9565cc43ea5af5a13ff6f1cf) by [@cortinico](https://github.com/cortinico)) +- Remove .mk prebuilt file and .mk file generation from codegen ([7933dd78da](https://github.com/facebook/react-native/commit/7933dd78daed84581f3013c0a8e0130b6fdf81f9) by [@cortinico](https://github.com/cortinico)) +- Remove deprecated POST_NOTIFICATION from `PermissionsAndroid` ([deb6b380b2](https://github.com/facebook/react-native/commit/deb6b380b251564163939fbf04cf62e07c9820bb) by [@cortinico](https://github.com/cortinico)) + +#### iOS specific + +- Removed unused RCTWeakProxy helper ([2fbefff178](https://github.com/facebook/react-native/commit/2fbefff178b11a61089bd41296c918fa1b8857b9) by [@javache](https://github.com/javache)) +- Removed Slider module ([465e937533](https://github.com/facebook/react-native/commit/465e9375338c8a3baab963c1f699c1c67af01029) by [@hoxyq](https://github.com/hoxyq)) +- Removed DatePickerIOS module ([0ff7b7fac2](https://github.com/facebook/react-native/commit/0ff7b7fac2750f149592e41bb8825dcc65dea71d) by [@hoxyq](https://github.com/hoxyq)) +- Removed iOS sources of Slider module ([fee9510b2d](https://github.com/facebook/react-native/commit/fee9510b2d8ff73be632dbe6f07003f001104836) by [@hoxyq](https://github.com/hoxyq)) +- Removed native iOS sources of ProgressViewIOS ([1453ef1a88](https://github.com/facebook/react-native/commit/1453ef1a8836ead03f66792bd36bfcde333434c0) by [@hoxyq](https://github.com/hoxyq)) +- Remove conformance to RCTComponentViewFactoryComponentProvider which does not exists in 0.72 ([ee177cab75](https://github.com/facebook/react-native/commit/ee177cab7583fa305d43c66342fb9b3693a4769a)) + +### Fixed + +- Improved support for AnimatedInterpolation of color props. ([b589123a3d](https://github.com/facebook/react-native/commit/b589123a3dc0c6190137fbd2e6c18f24b98642f1) by [@javache](https://github.com/javache)) +- Improved handling of native colors in Animated.Colors ([dccb57fb50](https://github.com/facebook/react-native/commit/dccb57fb50874e31dd0d3f6e39666e4a5b9a079d) by [@javache](https://github.com/javache)) +- Patch AnimatedStyle to avoid discarding the initial style info ([c06323f463](https://github.com/facebook/react-native/commit/c06323f46334ee720cc46d48405ce584de16163d) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Gracefully handle out-of-bounds initialScrollIndex ([aab9df3710](https://github.com/facebook/react-native/commit/aab9df37102b6b8661a9e22ee8ae63166c8c632e) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix VirtualizedList onViewableItemsChanged won't trigger if first item in data is null ([011ea3306f](https://github.com/facebook/react-native/commit/011ea3306f02479b8003f519f7fc568a743b2019) by [@gauravroy1995](https://github.com/gauravroy1995)) +- Fix VirtualizedList `onViewableItemsChanged` won't trigger if first item in data evaluate to false ([1f0c2c2895](https://github.com/facebook/react-native/commit/1f0c2c289506aa0a5e1fc0e77e1fe48351e2050d) by [@samchan0221](https://github.com/samchan0221)) +- Calculate VirtualizedList render mask for focused cell during batched state updates ([cab865be79](https://github.com/facebook/react-native/commit/cab865be797b724d2fda5441e0ef23559180f722) by [@NickGerleman](https://github.com/NickGerleman)) +- Bail on realizing region around last focused cell if we don't know where it is ([776fe7a292](https://github.com/facebook/react-native/commit/776fe7a29271d1b4678a0913315487724d201449) by [@NickGerleman](https://github.com/NickGerleman)) +- Avoid VirtualizedList viewability updates during state updates ([62a0640e4a](https://github.com/facebook/react-native/commit/62a0640e4a8297177e857530e46010e83315e70a) by [@NickGerleman](https://github.com/NickGerleman)) +- Add `lineBreakStrategyIOS` prop type for Text and TextInput ([0c5c07fc9b](https://github.com/facebook/react-native/commit/0c5c07fc9bf2ca13aece3dd9fa35d6c822f1fd84) by [@jeongshin](https://github.com/jeongshin)) +- Fix negative value rounding issue for nodes across an axis ([37171ec78f](https://github.com/facebook/react-native/commit/37171ec78f377fbae89ce43010f9cf69c1e60fbc)) +- Reduce use of assertions when parsing accessibility props passed from JS ([a064de151f](https://github.com/facebook/react-native/commit/a064de151f8314abacbd0f17127597266644fd78) by [@motiz88](https://github.com/motiz88)) +- Fixes crash when using togglebutton accessibilityRole with Text ([dcc5dbe562](https://github.com/facebook/react-native/commit/dcc5dbe562cedd3bb9e954736c18780830e5f719) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Fixes an issue with the EventEmitter type definition file ([4acef8e4a4](https://github.com/facebook/react-native/commit/4acef8e4a4d1ec51eeea751c7ee6aa36d8b7f457) by [@helenaford](https://github.com/helenaford)) +- Fix animated components ref type inferred `any` ([419b41f06d](https://github.com/facebook/react-native/commit/419b41f06dfd7c75d9734ce2d61b511f11097c63) by [@jeongshin](https://github.com/jeongshin)) +- Allow out-of-range initialScrollIndex after first scroll ([d595fbcc5a](https://github.com/facebook/react-native/commit/d595fbcc5a1a6c4a9fd9f20b6cabe1093ea346a6) by [@NickGerleman](https://github.com/NickGerleman)) +- Delete refs to unmounted CellRenderers ([c376e78224](https://github.com/facebook/react-native/commit/c376e782247766d2c1f92cadf3ce1ab368933d25) by [@NickGerleman](https://github.com/NickGerleman)) +- Enforce compatibility with `exactOptionalPropertyTypes` ([7858a2147f](https://github.com/facebook/react-native/commit/7858a2147fde9f754034577932cb5b22983f658f) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix touch handling so that hitSlop can extend beyond parent view bounds. ([96659f8e83](https://github.com/facebook/react-native/commit/96659f8e83e68f6330aaa59e3d5fb0953c67f1d1) by [@genkikondo](https://github.com/genkikondo)) +- Export EmitterSubscription TypeScript Type ([eb83356cee](https://github.com/facebook/react-native/commit/eb83356ceee1ff3bca3073d7c4050981f2c01a4c) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix: remove gap if its last element in line (fix flex gap extra spacing when children determine parents main axis size) ([d867ec0abb](https://github.com/facebook/react-native/commit/d867ec0abb6cf6da6e2be44d28bbf9fc38319298) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) +- Fixes JSDoc in Clipboard setString ([0ecb4e64f0](https://github.com/facebook/react-native/commit/0ecb4e64f0006a0dd2fb64cb64f97ed01c638781) by [@mikemikhaylov](https://github.com/mikemikhaylov)) +- Fix typing for TS AnimatableStringValue ([eb2f86a46a](https://github.com/facebook/react-native/commit/eb2f86a46a89765de3bd32541d3e7043fe236108) by [@rshest](https://github.com/rshest)) +- Fix types + documentation for CellRendererComponent ([2d41e6642e](https://github.com/facebook/react-native/commit/2d41e6642eaee636f90d5737ecdcddf2d89cfa2a) by [@NickGerleman](https://github.com/NickGerleman)) +- Fixed error during native DAG creation when there are multiple AnimatedValue props ([c72c592ecd](https://github.com/facebook/react-native/commit/c72c592ecd9d31ec1661958d4e5f77f8dfb37cac) by [@genkikondo](https://github.com/genkikondo)) +- Fix YogaLayoutableShadowNode handling of non-layoutable children ([024a8dc8ff](https://github.com/facebook/react-native/commit/024a8dc8ffd694426912c6abb0852e5d5f6c90c8) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix type definition for `unstable_batchedUpdates` ([71157f6ba6](https://github.com/facebook/react-native/commit/71157f6ba604a57b9fa79bc0401b89dc0b01145b) by [@k-yle](https://github.com/k-yle)) +- Add missing SectionList types for Animated SectionList ([ed39d639ea](https://github.com/facebook/react-native/commit/ed39d639ea196181732186df735f5e58543ace32) by [@jeongshin](https://github.com/jeongshin)) +- Add objectFit to the ImageStyle interface located in the StyleSheetTypes.d.ts file ([32d03c250c](https://github.com/facebook/react-native/commit/32d03c250c52e1d6e87c6eb0e2b87add4b56f031) by [@alvessteve](https://github.com/alvessteve)) +- Add src, srcSet, referrerPolicy, tintColor to Image.d.ts declaration file ([74cb6073f3](https://github.com/facebook/react-native/commit/74cb6073f3ae926de712d883d08eb19ed2339788) by [@alvessteve](https://github.com/alvessteve)) +- Fix missing `height`, `width`, `crossOrigin` props on Typescript Image.d.ts file ([bcf493f346](https://github.com/facebook/react-native/commit/bcf493f346e320d683ced471750bb8d8e3b1a5ae) by [@alvessteve](https://github.com/alvessteve)) +- Fixed typo in the initialNumToRenderOrDefault description's comment ([ba7f9b40a6](https://github.com/facebook/react-native/commit/ba7f9b40a65c0dbf59341ba61adc8ef736d0239e) by [@ellouzeskandercs](https://github.com/ellouzeskandercs)) +- Fixed string key calculation in constexpr from Performance C++ native module. ([6faddc3870](https://github.com/facebook/react-native/commit/6faddc3870b9dad0ed6d178492e92b03e8c00a8c)) +- Fix computation of relative layout to return empty layout for nodes with display: none and children. ([6018c19991](https://github.com/facebook/react-native/commit/6018c199917403c5f9f5159697dbc61903b9642d) by [@rubennorte](https://github.com/rubennorte)) +- Fix edge case when layout animation caused delete and create mutations in the same batch ([d9f2491a71](https://github.com/facebook/react-native/commit/d9f2491a713d872f2f3c8447dbf789fb17b94524)) +- Fix edge case when delete is queued with conflict layout animation ([cf9c7d51ef](https://github.com/facebook/react-native/commit/cf9c7d51efd99b65527f9b9d2fef0334b972a461)) +- VirtualizedList scrollToEnd with no data ([98009ad94b](https://github.com/facebook/react-native/commit/98009ad94b92320307f2721ee39dbeb9152c0a58) by [@Andarius](https://github.com/Andarius)) +- Fixed a typo in interface.js ([7fedd7577a](https://github.com/facebook/react-native/commit/7fedd7577a249b1dd4f51b5b4a03858fd09cb7ef) by [@rj1](https://github.com/rj1)) +- Add `borderCurve` and `pointerEvents` to `ViewStyle` ([a0800ffc7a](https://github.com/facebook/react-native/commit/a0800ffc7a676555aa9e769fc8fd6d3162de0ea6) by [@eps1lon](https://github.com/eps1lon)) +- Fix whitespace and newline at EOF in template ([efe5f62f91](https://github.com/facebook/react-native/commit/efe5f62f91754ce8101fde24d6a984a5b56186c6) by [@friederbluemle](https://github.com/friederbluemle)) +- Jest mocked requestAnimationFrame callbacks now receive a timestamp parameter ([b44fe4deee](https://github.com/facebook/react-native/commit/b44fe4deee505382698a98d2573691303b0159c3) by [@kmagiera](https://github.com/kmagiera)) +- Removes duplicate DoubleTypeAnnotation label ([1bab3e24b8](https://github.com/facebook/react-native/commit/1bab3e24b887259e29626835e6bb944d105dff59) by [@mikemikhaylov](https://github.com/mikemikhaylov)) +- Filter out Hermes internal bytecode frames (Promise implementation) from error stack traces ([4c911a2dec](https://github.com/facebook/react-native/commit/4c911a2deceb59fc07735205ae3a4622b4334f88) by [@motiz88](https://github.com/motiz88)) +- Add missing AccessibilityInfo Types to TS Typings ([76a14454d7](https://github.com/facebook/react-native/commit/76a14454d7f1f2b2ba8f5a79c2f640fafb42de6d) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix Errors with TypeScript Tests ([c4862a2322](https://github.com/facebook/react-native/commit/c4862a2322e3401eece360bc6b2ed97c26764121) by [@NickGerleman](https://github.com/NickGerleman)) +- Add missing VirtualizedList Imperative Types ([621969b8d8](https://github.com/facebook/react-native/commit/621969b8d85d10f4f9b66be7d5deae58651dc6aa) by [@NickGerleman](https://github.com/NickGerleman)) +- Add missing types for AppRegistry ([8d6e2f86f5](https://github.com/facebook/react-native/commit/8d6e2f86f5685264ee5fe7a1f7c24d6d9e40bbaa) by [@NickGerleman](https://github.com/NickGerleman)) +- Add type for RootTagContext ([4e5421fd9a](https://github.com/facebook/react-native/commit/4e5421fd9a5eb110e27e40b3ab283f973d38408b) by [@NickGerleman](https://github.com/NickGerleman)) +- Add missing types to PushNotificationIOS ([079312895b](https://github.com/facebook/react-native/commit/079312895b3bdc6b934ca51a377cf44419306e8d) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix types for deprecated scrollTo fields ([0d091318ed](https://github.com/facebook/react-native/commit/0d091318ed047c9f6cfe32d70b47fd5c4092c923) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix Vibration.vibrate() allowing null params ([2c2cb09c00](https://github.com/facebook/react-native/commit/2c2cb09c00b4eac98f59a4fcb874b6fbfdc839ff) by [@NickGerleman](https://github.com/NickGerleman)) +- Mark scrollToEnd animated as optional ([e1af6302fc](https://github.com/facebook/react-native/commit/e1af6302fc189948ed0e123a39e0b08cd253fc27) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix type for `StyleSheet.compose()` ([1752fdc0f5](https://github.com/facebook/react-native/commit/1752fdc0f573be4348e4e6e7e31bc53b00aa00c6) by [@NickGerleman](https://github.com/NickGerleman)) +- Add missing type for AnimatedValue.resetAnimation() and AnimatedValue.animate() ([25a25ea234](https://github.com/facebook/react-native/commit/25a25ea234fc60c7a0b99e9c70253f77a69edc60) by [@NickGerleman](https://github.com/NickGerleman)) +- Fixed a backwards compatibility issue with AnimatedInterpolation ([9b280ad1c5](https://github.com/facebook/react-native/commit/9b280ad1c5995f4d5bd5220dee778df3cd65db3f) by [@motiz88](https://github.com/motiz88)) +- Explicitly set parser for jsx in ESLint config ([cdb88a2427](https://github.com/facebook/react-native/commit/cdb88a24273262a64f0706169557dc02d8592568) by [@NickGerleman](https://github.com/NickGerleman)) +- Move flex gap props to the correct type ([ff984ac9b5](https://github.com/facebook/react-native/commit/ff984ac9b55c9c1af50d5785863f5f36f92b62d2) by [@NickGerleman](https://github.com/NickGerleman)) +- Remove constexpr from RectangleEdges.h ([879d303fc7](https://github.com/facebook/react-native/commit/879d303fc7084972d9a04c2aff27ea518b6449c6) by [@TatianaKapos](https://github.com/TatianaKapos)) +- Move certain list prop TS types from SectionList, FlatList to VirtualizedList([6c33fd1c48](https://github.com/facebook/react-native/commit/6c33fd1c4889a5d3dfb7f914c2518c3daa8a5337) by [@aliakbarazizi](https://github.com/aliakbarazizi)) +- Limit diagnostics width output by `hermesc` ([260bcf7f1b](https://github.com/facebook/react-native/commit/260bcf7f1bf78022872eb2f40f33fb552a414809) by [@tido64](https://github.com/tido64)) +- Fix autoComplete type for TextInput ([94356e14ec](https://github.com/facebook/react-native/commit/94356e14ec0562a1fd5a208d93021f102ba9565e) by [@iRoachie](https://github.com/iRoachie)) +- Fix performance issues in Hermes when Debug ([60a452b485](https://github.com/facebook/react-native/commit/60a452b4853dc5651c465867344904dd6fc86703)) +- Fix hermesc for linux ([32327cc177](https://github.com/facebook/react-native/commit/32327cc17779659bc441580d44784a60a74ede32) by [@cipolleschi](https://github.com/cipolleschi)) + +#### Android specific + +- Read GROUP name in gradle-plugin dependency code ([615d9aefc4](https://github.com/facebook/react-native/commit/615d9aefc4274ed7a193c0410ed7f86e90ad1bff) by [@douglowder](https://github.com/douglowder)) +- Fix letters duplication when using autoCapitalize https://github.com/facebook/react-native/issues/29070" ([cbe934bcff](https://github.com/facebook/react-native/commit/cbe934bcff0bdbd26f669fd9ace4fc818ca39e98) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Reset accessibility value when it gets a null value ([aacf28778e](https://github.com/facebook/react-native/commit/aacf28778eadfcae2ca33f66697620f7222d804c)) +- Fix check of "reduce motion" setting on android ([790df10fa9](https://github.com/facebook/react-native/commit/790df10fa9bac18a60bd52178cc222f5e368a44b) by [@baranga](https://github.com/baranga)) +- Fixed text measurement issue related to hyphenation frequency ([01e7ff5513](https://github.com/facebook/react-native/commit/01e7ff5513e2f5ca6f03bb8ac1b9a1a31612cc9a) by [@javache](https://github.com/javache)) +- Fix layout width calculation in onTextLayout ([ccbbcaab9c](https://github.com/facebook/react-native/commit/ccbbcaab9cf3e6148e72f94fe63f77ce5f92416c) by [@reepush](https://github.com/reepush)) +- Fix a bug that returns a random number from callback argument `timeRemaining` of `idleCallbacks` registered by `requestIdleCallbacks`. ([d9ab5e81cf](https://github.com/facebook/react-native/commit/d9ab5e81cf6a030438b36e0c27d45f20317c316e) by [@mir597](https://github.com/mir597)) +- Fix android emulator detection for packager host ([64ff077a66](https://github.com/facebook/react-native/commit/64ff077a6640f9eaed695287469735cb03478927) by [@deecewan](https://github.com/deecewan)) +- Invalid prop values no longer trigger Java exceptions in the legacy renderer ([e328fc2e24](https://github.com/facebook/react-native/commit/e328fc2e2429c7917e33125feafd26ad4699ee00) by [@motiz88](https://github.com/motiz88)) +- Fixed crash occurring in certain native views when handling keyboard events. ([f7e35d4ef7](https://github.com/facebook/react-native/commit/f7e35d4ef7d68d06fba1439c0aa6d9ed05b58a7f) by [@aleqsio](https://github.com/aleqsio)) +- Fixed ScrollView momentum not stopping when calling scrollTo programmatically ([681b35daab](https://github.com/facebook/react-native/commit/681b35daab2d0443278fe18c364b0e72c8c85673) by [@tomekzaw](https://github.com/tomekzaw)) +- Fix memory leak in Android ([bc766ec7f8](https://github.com/facebook/react-native/commit/bc766ec7f8b18ddc0ff72a2fff5783eeeff24857)) +- Address New Architecture performance regressions by properly setting NDEBUG ([8486e191a1](https://github.com/facebook/react-native/commit/8486e191a170d9eae4d1d628a7539dc9e3d13ea4) by [@cortinico](https://github.com/cortinico)) +- LoadingView of Android to use the Toast till the native implementation is functional ([8ccb861231](https://github.com/facebook/react-native/commit/8ccb861231a7cd620ad3cab8fc52088360082f22)) +- Linking.getInitialUrl should not wait for InteractionManager ([3921f05f59](https://github.com/facebook/react-native/commit/3921f05f594691285e79a379897ed698e081a705) by [@javache](https://github.com/javache)) +- Using AccessibilityNodeInfo#addAction to announce Expandable/Collapsible State ([082a033fbb](https://github.com/facebook/react-native/commit/082a033fbbe7d7094af78bafc3b2048194a02bd5) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) +- Corrected Nullable annotations for parameters and return values in TurboModules codegen ([6db3995175](https://github.com/facebook/react-native/commit/6db39951755cef82f06e23a5464cf1caf53c7966) by [@javache](https://github.com/javache)) +- Fix measurement of uncontrolled TextInput after edit ([8a0fe30591](https://github.com/facebook/react-native/commit/8a0fe30591e21b90a3481c1ef3eeadd4b592f3ed) by [@NickGerleman](https://github.com/NickGerleman)) +- Mimimize EditText Spans 9/9: Remove `addSpansForMeasurement()` ([92b8981499](https://github.com/facebook/react-native/commit/92b898149956a301a44f99019f5c7500335c5553) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize EditText Spans 8/N: CustomStyleSpan ([b384bb613b](https://github.com/facebook/react-native/commit/b384bb613bf533aebf3271ba335c61946fcd3303) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize EditText Spans 6/N: letterSpacing ([5791cf1f7b](https://github.com/facebook/react-native/commit/5791cf1f7b43aed1d98cad7bcc272d97ab659111) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 5/N: Strikethrough and Underline ([0869ea29db](https://github.com/facebook/react-native/commit/0869ea29db6a4ca20b9043d592a2233ae1a0e7a2) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 4/N: ReactForegroundColorSpan ([8c9c8ba5ad](https://github.com/facebook/react-native/commit/8c9c8ba5adb59f7f891a5307a0bce7200dd3ac7d) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 3/N: ReactBackgroundColorSpan ([cc0ba57ea4](https://github.com/facebook/react-native/commit/cc0ba57ea42d876155b2fd7d9ee78604ff8aa57a) by [@NickGerleman](https://github.com/NickGerleman)) +- Minimize Spans 1/N: Fix precedence ([1743dd7ab4](https://github.com/facebook/react-native/commit/1743dd7ab40998c4d3491e3b2c56c531daf5dc47) by [@NickGerleman](https://github.com/NickGerleman)) +- Fix the setup to allow the build-from-source on host projects ([fec5658a32](https://github.com/facebook/react-native/commit/fec5658a321a3c0d5da34efaa59fe8d05575f674) by [@cortinico](https://github.com/cortinico)) +- Fix a crash new app template when `createRootView` is invoked with null bundle ([990971186f](https://github.com/facebook/react-native/commit/990971186fccf1e14c8715cb35ab82ad8e43f99c) by [@cortinico](https://github.com/cortinico)) +- Resolved bug with Text components in New Architecture losing text alignment state. ([31a8e92cad](https://github.com/facebook/react-native/commit/31a8e92caddcdbef9fe74de53e7f412a7e998591) by [@javache](https://github.com/javache)) +- Fix border rendering issue when bottom borders has no width ([1d51032278](https://github.com/facebook/react-native/commit/1d5103227851ab92de889d5e7e910393b5d8743a) by [@BeeMargarida](https://github.com/BeeMargarida)) +- Fix possible `ConcurrentModificationException` in `UIManagerModuleConstantsHelper::createConstants` ([805b88c7a4](https://github.com/facebook/react-native/commit/805b88c7a41084ec7b82d18807b585e267b69352) by [@j-piasecki](https://github.com/j-piasecki)) +- Fixed incorrect logging of `isCatalystInstanceAlive` in exception handler ([daeee2a661](https://github.com/facebook/react-native/commit/daeee2a6619db59391de3b7c6e08db0dbe2331aa) by [@jonnycaley](https://github.com/jonnycaley)) +- Make sure the Native RuntimeScheduler is initialized on Old Arch ([133ccdcc67](https://github.com/facebook/react-native/commit/133ccdcc67a7d19ffa5130949893c2792e3ad9fb) by [@cortinico](https://github.com/cortinico)) +- RNGP dependency substitutions for fork with different Maven group ([012e4bd654](https://github.com/facebook/react-native/commit/012e4bd654f1eee2b00a066ba50a7f9c44cc305b) by [@douglowder](https://github.com/douglowder)) +- Make sure the -DANDROID compilation flag is always included ([3a321ae2bb](https://github.com/facebook/react-native/commit/3a321ae2bb623a8f5c7f064d82ca8ca9df3ebff4) by [@cortinico](https://github.com/cortinico)) +- Remove license header from android/app/build.gradle ([5e847c4309](https://github.com/facebook/react-native/commit/5e847c43097dc93ad2c6a5cdf542041b10f00634) by [@cortinico](https://github.com/cortinico)) +- Make sure Java Toolchain and source/target level is applied to all projects ([52d2065910](https://github.com/facebook/react-native/commit/52d20659105abe2b065148b33c441941104f4d30) by [@cortinico](https://github.com/cortinico)) +- Fix copy / paste menu and simplify controlled text selection on Android ([dfc64d5bcc](https://github.com/facebook/react-native/commit/dfc64d5bcc50c25bab40ba853af9f7b0c1c46d7a) by [@janicduplessis](https://github.com/janicduplessis)) +- Fixed random styling for text nodes with many children ([73f4a788f1](https://github.com/facebook/react-native/commit/73f4a788f18aed2277f6711f689b75ab8ce13b1b) by [@cubuspl42](https://github.com/cubuspl42)) +- Fix Android border clip check ([2d15f50912](https://github.com/facebook/react-native/commit/2d15f50912927b5214473b53cce7043fa128d6b3) by [@gabrieldonadel](https://github.com/gabrieldonadel)) +- Revert "fix: border width top/bottom not matching the border radius" ([0817eaa301](https://github.com/facebook/react-native/commit/0817eaa3012abc0104ffa0d41b844e1c2db1dcc2) by [@gabrieldonadel](https://github.com/gabrieldonadel)) + +#### iOS specific + +- Fix Flipper by moving podfile modification of preprocessor def `FB_SONARKIT_ENABLED` from React-Core to React-RCTAppDelegate where it is now used. ([34d5212f5c](https://github.com/facebook/react-native/commit/34d5212f5ca468ec28a2a82097c0f7cf8722739d)) +- Invalid prop values no longer trigger redbox in the legacy renderer ([cb28a2c46e](https://github.com/facebook/react-native/commit/cb28a2c46e1c65fbe71a69ee0b0e0bb4b2e20a35) by [@motiz88](https://github.com/motiz88)) +- Fix issue where keyboard does not open when `TextInput` `showSoftInputOnFocus` changes from `false` to `true` ([7425c24cbe](https://github.com/facebook/react-native/commit/7425c24cbe66ec743794b6ffc4cc1a653e821dde) by [@christianwen](https://github.com/christianwen)) +- Fix ScrollView `automaticallyAdjustKeyboardInsets` not resetting when Prefer Cross-Fade Transitions is enabled and keyboard hides ([b8f1bb50f7](https://github.com/facebook/react-native/commit/b8f1bb50f7734cbccb19808aae6f86a92fa8eea5) by [@grgmo](https://github.com/grgmo)) +- Unrecognized fontFamily values no longer trigger a redbox ([d6e9891577](https://github.com/facebook/react-native/commit/d6e9891577c81503407adaa85db8f5bf97557db0) by [@motiz88](https://github.com/motiz88)) +- Do not send extra onChangeText even wnen instantianting multiline TextView ([a804c0f22b](https://github.com/facebook/react-native/commit/a804c0f22b4b11b3d9632dc59a6da14f6c4325e3) by [@dmytrorykun](https://github.com/dmytrorykun)) +- Support 120 FPS or more in `RCTFPSGraph` ([987dd6a358](https://github.com/facebook/react-native/commit/987dd6a35842acde9d540fc42dfe4a2f34fd2ddf) by [@mrousavy](https://github.com/mrousavy)) +- Fix duplicate [RCTConvert UIUserInterfaceStyle:] ([d8b4737ca6](https://github.com/facebook/react-native/commit/d8b4737ca67591737e277cc43b7e352bd113dc7f) by [@NickGerleman](https://github.com/NickGerleman)) +- Blob data is no longer prematurely deallocated when using blob.slice ([36cc71ab36](https://github.com/facebook/react-native/commit/36cc71ab36aac5e5a78f2fbae44583d1df9c3cef) by [@awinograd](https://github.com/awinograd)) +- Unbreak cocoapods build ([419025df22](https://github.com/facebook/react-native/commit/419025df226dfad6a2be57c8d5515f103b96917b) by [@javache](https://github.com/javache)) +- Don't download hermes nightly tarball if it exists ([d2dd79f3c5](https://github.com/facebook/react-native/commit/d2dd79f3c5bd5684a10d40670e2351e4252020b3) by [@janicduplessis](https://github.com/janicduplessis)) +- Fix nullability warnings ([346b028227](https://github.com/facebook/react-native/commit/346b02822710152292eca25a711e9eeca68ab941) by [@tido64](https://github.com/tido64)) +- Use NSCAssert() in react_native_assert instead of C assert() ([c5bc3f1373](https://github.com/facebook/react-native/commit/c5bc3f1373d223d4068f762c597bdc45261fb6c5) by [@NickGerleman](https://github.com/NickGerleman)) +- Honour background color customisation in RCTAppDelegate ([5d6f21d744](https://github.com/facebook/react-native/commit/5d6f21d744d3a910eb82489404f0fe5dd1020d98) by [@cipolleschi](https://github.com/cipolleschi)) +- Turn on NDEBUG when pods are installed for production. ([421df9ffd5](https://github.com/facebook/react-native/commit/421df9ffd58092b1a2dec455a048edb6db1739de) by [@cipolleschi](https://github.com/cipolleschi)) +- Fix a crash when reloading JS bundle ([60f381a8b9](https://github.com/facebook/react-native/commit/60f381a8b9094e7dfaf01bea1b745d576cc458f6) by [@sammy-SC](https://github.com/sammy-SC)) +- Fix missing node error message not printed correctly when deprecated `find-node-for-xcode.sh` is used. ([0d82b402aa](https://github.com/facebook/react-native/commit/0d82b402aa546aa773e91921989fb8389aee81dc) by [@uloco](https://github.com/uloco)) +- Build codegen package while using old architecture ([90327d9fba](https://github.com/facebook/react-native/commit/90327d9fba9417577a14f293103ec84dbba5300a) by [@Saadnajmi](https://github.com/Saadnajmi)) +- Fix cocoapods warning about merging user_target_xcconfig ([2bfb53c2fb](https://github.com/facebook/react-native/commit/2bfb53c2fba366d3476892f2384265aac212fbeb) by [@yhkaplan](https://github.com/yhkaplan)) +- `-[RCTUITextField textView:shouldChangeTextInRange:replacementString:]` no longer crashes when we pass in a `nil` replacement string ([d5e6d9cecd](https://github.com/facebook/react-native/commit/d5e6d9cecd1a8b02d47c4dfaffc550167b093b32) by [@Saadnajmi](https://github.com/Saadnajmi)) +- Remove UIKit import from RCTDevLoadingView.h ([e7dcad2ba1](https://github.com/facebook/react-native/commit/e7dcad2ba14d8188cce0ff976187fe045ee7f9a4) by [@christophpurrer](https://github.com/christophpurrer)) +- Pod install with --project-directory ([efd39eea6f](https://github.com/facebook/react-native/commit/efd39eea6f553638b2430cbf0c3eed519995a940) by [@dcangulo](https://github.com/dcangulo)) +- Fixed Mac Catalyst availability checks ([70d9b56d71](https://github.com/facebook/react-native/commit/70d9b56d717a13450d3e18ccb62bcfcb71cf4008) by [@Saadnajmi](https://github.com/Saadnajmi)) +- Fix path issue to properly run the codegen cleanup step ([e71b094b24](https://github.com/facebook/react-native/commit/e71b094b24ea5f135308b1e66c86216d9d693403) by [@cipolleschi](https://github.com/cipolleschi)) +- Make sure to add the New Arch flag to libraries ([ef11e15ca3](https://github.com/facebook/react-native/commit/ef11e15ca357be56afcf36969979442a235f7aa9) by [@cipolleschi](https://github.com/cipolleschi)) +- Fix dataContentType may be [NSNull null] issue ([c0834b884b](https://github.com/facebook/react-native/commit/c0834b884bcaf2fd97a47bcb0320369b0b4469d2) by [@malacca](https://github.com/malacca)) +- Properly support static libraries and static frameworks ([be895c870c](https://github.com/facebook/react-native/commit/be895c870c897705e65513574c459e85c38d5f7d)) +- Use the right logic to decide when we have to build from source ([67d02640ba](https://github.com/facebook/react-native/commit/67d02640ba2465e4533ac050cb5baa9b34f58f0b)) +- Fix application of _progressViewOffset in RCTRefreshControl to not occur by default (when value is unset) ([0062b10b56](https://github.com/facebook/react-native/commit/0062b10b56985c4556011fbbb8d43f0a038d359e) by [@objectivecosta](https://github.com/objectivecosta)) +- Unexpected useEffects flushing semantics ([7211ef1962](https://github.com/facebook/react-native/commit/7211ef19624304b6a4d5219a8e0a2c67651b8b33) by [@sammy-SC](https://github.com/sammy-SC)) +- Add support for building with Xcode 15 ([8ed2cfded5](https://github.com/facebook/react-native/commit/8ed2cfded51d47731686c1060915bee7dd63647e) by [@AlexanderEggers](https://github.com/AlexanderEggers)) + +### Security + +- Update and Fixed Prototype Pollution in JSON5 via Parse Method ([4ac4a5c27d](https://github.com/facebook/react-native/commit/4ac4a5c27dc5705a42ed7f607e2333d363c0a6c5) by [@imhunterand](https://github.com/imhunterand)) + +#### iOS specific + +- Enable Address and Undefined Behavior Sanitizers on RNTester ([65e61f3c88](https://github.com/facebook/react-native/commit/65e61f3c88388d4a2ed88bcc9a2cb5ba63fd8afa) by [@Saadnajmi](https://github.com/Saadnajmi)) + +## v0.71.12 + +### Fixed + +- Prevent LogBox from crashing on very long messages ([cd56347dca](https://github.com/facebook/react-native/commit/cd56347dca4e948f5038643bcd804c41f037727a) by [@motiz88](https://github.com/motiz88)) + +#### Android specific + +- Added CSS logical properties by mapping layout props ([2b06a75631](https://github.com/facebook/react-native/commit/2b06a75631c6d9f1fdc13bc8a5567f264d2c9b9a) by [@NickGerleman](https://github.com/NickGerleman) and [@AlexanderEggers](https://github.com/AlexanderEggers)) to fix view flattening on Android. + +#### iOS specific + +- fix `pod install --project-directory=ios` failing ([fc1abe1d69](https://github.com/facebook/react-native/commit/fc1abe1d69530e95bc39b439d7d883f620b86fb9) by [@tido64](https://github.com/tido64)) + ## v0.71.11 ### Changed @@ -645,6 +1080,20 @@ Read the [announcement blogpost here](https://reactnative.dev/blog/2023/01/12/ve - Bump terser minor version to mitigate CVE-2022-25858 ([743f9ff63b](https://github.com/facebook/react-native/commit/743f9ff63bf1e3825a1788978a9f6bad8ebddc0d) by [@GijsWeterings](https://github.com/GijsWeterings)) +## v0.70.12 + +### Fixed + +#### iOS specific + +- Prefer `Content-Location` header in bundle response as JS source URL ([671ea383fe](https://github.com/facebook/react-native/commit/671ea383fe45dd9834a0c0481360de050df7f0c9) by [@robhogan](https://github.com/robhogan)) + +## v0.70.11 + +### Changed + +- Bump CLI to 9.3.3 and Metro do 0.72.4 ([2a9d71dc34](https://github.com/facebook/react-native/commit/2a9d71dc341992dce40038dcccefc3abfc745fe8) by [@kelset](https://github.com/kelset)) to address https://github.com/facebook/react-native/issues/36794 + ## v0.70.10 ### Fixed @@ -1007,4749 +1456,3 @@ Read the [announcement blogpost here](https://reactnative.dev/blog/2023/01/12/ve - Add GitHub token permissions for workflows ([3da3d82320](https://github.com/facebook/react-native/commit/3da3d82320bd035c6bd361a82ea12a70dba4e851) by [@varunsh-coder](https://github.com/varunsh-coder)) - Bump RCT-Folly to 2021-07-22 ([68f3a42fc7](https://github.com/facebook/react-native/commit/68f3a42fc7380051714253f43b42175de361f8bd) by [@luissantana](https://github.com/luissantana)) - -## v0.69.11 - -### Fixed - -#### iOS specific - -- Make 0.69 compatible with Xcode 15 (thanks to @AlexanderEggers for the commit in main) ([37e8df1cdc](https://github.com/facebook/react-native/commit/37e8df1cdce4a66763c720b1b0768d049def9518)) - -## v0.69.10 - -### Fixed - -#### Android specific - -- Minimize EditText Spans 8/N: CustomStyleSpan ([b384bb613b](https://github.com/facebook/react-native/commit/b384bb613bf533aebf3271ba335c61946fcd3303) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize EditText Spans 6/N: letterSpacing ([5791cf1f7b](https://github.com/facebook/react-native/commit/5791cf1f7b43aed1d98cad7bcc272d97ab659111) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize Spans 5/N: Strikethrough and Underline ([0869ea29db](https://github.com/facebook/react-native/commit/0869ea29db6a4ca20b9043d592a2233ae1a0e7a2) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize Spans 4/N: ReactForegroundColorSpan ([8c9c8ba5ad](https://github.com/facebook/react-native/commit/8c9c8ba5adb59f7f891a5307a0bce7200dd3ac7d) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize Spans 3/N: ReactBackgroundColorSpan ([cc0ba57ea4](https://github.com/facebook/react-native/commit/cc0ba57ea42d876155b2fd7d9ee78604ff8aa57a) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize Spans 1/N: Fix precedence ([1743dd7ab4](https://github.com/facebook/react-native/commit/1743dd7ab40998c4d3491e3b2c56c531daf5dc47) by [@NickGerleman](https://github.com/NickGerleman)) -- Fix measurement of uncontrolled TextInput after edit ([8a0fe30591](https://github.com/facebook/react-native/commit/8a0fe30591e21b90a3481c1ef3eeadd4b592f3ed) by [@NickGerleman](https://github.com/NickGerleman)) - -## v0.69.9 - -### Changed - -#### iOS specific - -- Relax Ruby requirements ([4e015c69d6](https://github.com/facebook/react-native/commit/4e015c69d646b320d58888f70af566c1d753eaed) by [@cipolleschi](https://github.com/cipolleschi)) - -### Fixed - -#### iOS specific - -- Fix React Codegen podspec to build on Xcode 14.3 ([74ba411b55](https://github.com/facebook/react-native/commit/74ba411b55535cee1b98062875b7b4b1428c931a) by [@cipolleschi](https://github.com/cipolleschi)) -- Blob data is no longer prematurely deallocated when using blob.slice ([36cc71ab36](https://github.com/facebook/react-native/commit/36cc71ab36aac5e5a78f2fbae44583d1df9c3cef) by [@awinograd](https://github.com/awinograd)) - -## v0.69.8 - -### Fixed - -#### Android specific - -- Mitigation for Samsung TextInput Hangs ([be69c8b5a7](https://github.com/facebook/react-native/commit/be69c8b5a77ae60cced1b2af64e48b90d9955be5) by [@NickGerleman](https://github.com/NickGerleman)) - -## v0.69.8 - -### Fixed - -#### Android specific - -- Mitigation for Samsung TextInput Hangs ([be69c8b5a7](https://github.com/facebook/react-native/commit/be69c8b5a77ae60cced1b2af64e48b90d9955be5) by [@NickGerleman](https://github.com/NickGerleman)) - -## v0.69.7 - -### Fixed - -- Force dependencies resolution to minor series for 0.69 ([c4da74c463](https://github.com/facebook/react-native/commit/c4da74c4636cbbd6bbf681d39a8a8cca49f11f56) by [@Titozzz](https://github.com/Titozzz)) - -## v0.69.6 - -### Changed - -- Bump version of `promise` from 8.0.3 to 8.2.0, enabling `Promise.allSettled` ([951538c080](https://github.com/facebook/react-native/commit/951538c080ef745da304fb308fa91d597e0dd98a) by [@retyui](https://github.com/retyui)) - -### Fixed - -- Fix hermes profiler ([81564c1a3d](https://github.com/facebook/react-native/commit/81564c1a3dae4222858de2a9a34089097f665e82) by [@janicduplessis](https://github.com/janicduplessis)) - -#### Android specific - -- Correctly resolve classes with FindClass(..) ([361b310bcc](https://github.com/facebook/react-native/commit/361b310bcc8dddbff42cf63495649291c894d661) by [@evancharlton](https://github.com/evancharlton)) - -#### iOS specific - -- Fix the way the orientation events are published, to avoid false publish on orientation change when app changes state to inactive ([7d42106d4c](https://github.com/facebook/react-native/commit/7d42106d4ce20c644bda4d928fb0abc163580cee) by [@lbaldy](https://github.com/lbaldy)) -- Fix React module build error with swift integration on new architecture mode ([3afef3c167](https://github.com/facebook/react-native/commit/3afef3c16702cefa5115b059a08741fba255b2db) by [@Kudo](https://github.com/Kudo)) - -## v0.69.5 - -### Changed - -- Bump react-native-codegen to 0.69.2 ([df3d52bfbf](https://github.com/facebook/react-native/commit/df3d52bfbf4254cd16e1dc0ca0af2743cd7e11c1) by [@dmytrorykun](https://github.com/dmytrorykun)) - -#### Android specific - -- Replaced reactnativeutilsjni with reactnativejni in the build process to reduce size ([54a4fcbfdc](https://github.com/facebook/react-native/commit/54a4fcbfdcc8111b3010b2c31ed3c1d48632ce4c) by [@SparshaSaha](https://github.com/SparshaSaha)) - -### Fixed - -- Codegen should ignore `.d.ts` files ([0f0d52067c](https://github.com/facebook/react-native/commit/0f0d52067cb89fdb39a99021f0745282ce087fc2) by [@tido64](https://github.com/tido64)) - -## v0.69.4 - -### Changed - -- Upgrade RN CLI to v8.0.4 ([66c68c37ce](https://github.com/facebook/react-native/commit/66c68c37ce94f6c1160e7f260c0d1887539c6605) by [@thymikee](https://github.com/thymikee)) - -#### Android specific - -- Modified **getDefaultJSExecutorFactory** method ([87cfd386cb](https://github.com/facebook/react-native/commit/87cfd386cb2e02bfa440c94706d9d0274f83070c) by [@KunalFarmah98](https://github.com/KunalFarmah98)) - -## v0.69.3 - -### Fixed - -#### iOS specific - -- Fix React-bridging header not found for third party modules ([fa2acc32d1](https://github.com/facebook/react-native/commit/fa2acc32d1490f6e418689dec321f8bd4ef7bb28) by [@Kudo](https://github.com/Kudo)) - -## v0.69.2 - -### Changed - -- Set react-shallow-renderer v16.15.0 for react v18 compat ([a39a7c453d](https://github.com/facebook/react-native/commit/a39a7c453d87086935ff07d549ba8220cbcf30bd) by [@mikehardy](https://github.com/mikehardy)) -- Upgrade RN CLI to v8.0.3 ([28cbd21d21](https://github.com/facebook/react-native/commit/28cbd21d21f2ffb3f38b2449a4983f013947ce0a) by [@thymikee](https://github.com/thymikee)) - -#### iOS specific - -- Hermes pod: change logic to use the hermes tag to set the pod source correctly ([46a9edc854](https://github.com/facebook/react-native/commit/46a9edc8544ae070149a97ea3d919b88dd6e2942) by [@kelset](https://github.com/kelset)) -- Fix the race condition when calling readAsDataURL after new Blob(blobs) ([bd12e41188](https://github.com/facebook/react-native/commit/bd12e41188c8d85c0acbd713f10f0bd34ea0edca) by [@wood1986](https://github.com/wood1986)) -- Make sure that Flipper pods are not installed when creating a release build ([23accbf58d](https://github.com/facebook/react-native/commit/23accbf58d2fa03ad020e07f00012a32609c7218) by [@cipolleschi](https://github.com/cipolleschi)) - -## v0.69.1 - -### Changed - -#### iOS specific - -- Make all Yoga headers public and add #ifdef __cplusplus ([43f831b23c](https://github.com/facebook/react-native/commit/43f831b23caf22e59af5c6d3fdd62fed3d20d4ec) by [@janicduplessis](https://github.com/janicduplessis)) - -### Fixed - -- Use monotonic clock for performance.now() ([114d31feee](https://github.com/facebook/react-native/commit/114d31feeeb47f5a57419e5088c3cbe9340f757a)) - -#### iOS specific - -- Fix build for React-RCTText ([4ea38e16bf](https://github.com/facebook/react-native/commit/4ea38e16bf533955557057656cba5346d2372acd) by [@ph4r05](https://github.com/ph4r05)) -- Fix RCT-Folly build error when use_frameworks! and hermes are both enabled ([79baca678a](https://github.com/facebook/react-native/commit/79baca678a743560fa16fdd551f1d0d018d34304) by [@Kudo](https://github.com/Kudo)) -- Fix use_frameworks! for 0.69 ([f97c6a5b49](https://github.com/facebook/react-native/commit/f97c6a5b498eec95e99a02c7842cb2ae160cd6cd) by [@Kudo](https://github.com/Kudo)) - -## v0.69.0 - -### Breaking - -- Support for `console.disableYellowBox` [has been dropped](https://github.com/facebook/react-native/commit/b633cc130533f0731b2577123282c4530e4f0abe) -- Already deprecated prop types have been removed ([cdfddb4dad](https://github.com/facebook/react-native/commit/cdfddb4dad7c69904850d7e5f089a32a1d3445d1), [3e229f27bc](https://github.com/facebook/react-native/commit/3e229f27bc9c7556876ff776abf70147289d544b), [10199b1581](https://github.com/facebook/react-native/commit/10199b158138b8645550b5579df87e654213fe42)) -- `removeListener`, deprecated since RN0.65, [was removed](https://github.com/facebook/react-native/commit/8dfbed786b40082a7a222e00dc0a621c0695697d) from Appearance -- If you were using `SegmentedComponentIOS`, you will now need to move to the [segmented-control](https://github.com/react-native-segmented-control/segmented-control) library ([235f168574](https://github.com/facebook/react-native/commit/235f1685748442553e53f8ec6d904bc0314a8ae6)) - -### Added - -- Add Hermes scripts to package ([004b8609d9](https://github.com/facebook/react-native/commit/004b8609d97b14a6d5cb8c9e63afdbe343c500da) by [@hramos](https://github.com/hramos)) -- Expose scheduler through FabricUIManager ([1730949e94](https://github.com/facebook/react-native/commit/1730949e94aa23927a90d2a64d91977b7e2904d6) by [@cortinico](https://github.com/cortinico)) -- Add event listeners to Scheduler ([e51e19ecc1](https://github.com/facebook/react-native/commit/e51e19ecc1d1b8ac5c860eac55338ef13471844f) by [@cortinico](https://github.com/cortinico)) -- C++ TurboModule methods can return functions ([c7380ba113](https://github.com/facebook/react-native/commit/c7380ba1131b26b487ecae87239a4cf82afefd15) by [@appden](https://github.com/appden)) -- Add support for devtools' profiler ([fefa7b6ac8](https://github.com/facebook/react-native/commit/fefa7b6ac8a1e0e33fa7a1070936c5c83c873c0a) by [@jpporto](https://github.com/jpporto)) -- Add getAll function to FormData class for getting all parts containing that key. This is also available in web API. ([d05a5d1551](https://github.com/facebook/react-native/commit/d05a5d15512ab794ef80b31ef91090d5d88b3fcd) by [@matinzd](https://github.com/matinzd)) -- Automatic type conversions for C++ TurboModules ([31f0796237](https://github.com/facebook/react-native/commit/31f079623732fb017b1fa38d56abe855d7738ece) by [@appden](https://github.com/appden)) -- New bridging API for JSI <-> C++ ([30cb78e709](https://github.com/facebook/react-native/commit/30cb78e709bccb4f7bf7aab3f6b0f1ba4261f577) by [@appden](https://github.com/appden)) -- Add asBool() method to JSI ([603620b739](https://github.com/facebook/react-native/commit/603620b7394da5855e2255790bfea9ad7d80ddf9) by [@appden](https://github.com/appden)) -- CustomEvent and Event polyfills for React Native ([6abbef1200](https://github.com/facebook/react-native/commit/6abbef1200af9adab1848de17955d77fbe0ad5da) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Implement Runtime.getHeapUsage for hermes chrome inspector ([cff9590864](https://github.com/facebook/react-native/commit/cff9590864c4be153a4eb49757b7cac8b3f23f66) by [@janicduplessis](https://github.com/janicduplessis)) -- Introduce ReactNativeFeatureFlags file to control FeatureFlags in React Native ([33aba77456](https://github.com/facebook/react-native/commit/33aba774564acdec216e02e28f17ad08ad7bc26b) by [@mdvacca](https://github.com/mdvacca)) -- Added fail-safe check to catch MissingWebViewPackage Exception ([8c573d9336](https://github.com/facebook/react-native/commit/8c573d933652ae4da1008502c53fce93057101c0) by [@Kunal-Airtel2022](https://github.com/Kunal-Airtel2022)) -- Add ability to access properties with symbol keys through JSI ([9010bfe457](https://github.com/facebook/react-native/commit/9010bfe457b77862024214ce6210504ff1786ef5) by [@neildhar](https://github.com/neildhar)) -- Allow color styles to be animated using native driver ([201f355479](https://github.com/facebook/react-native/commit/201f355479cafbcece3d9eb40a52bae003da3e5c) by [@genkikondo](https://github.com/genkikondo)) -- Make react-native depend on react-native-gradle-plugin ([3346efb7d4](https://github.com/facebook/react-native/commit/3346efb7d422bd8eb7f48650b454071f9981fa0b) by [@cortinico](https://github.com/cortinico)) -- Add RawEventTelemetryEventEmitter interface to ReactNativePrivateInterface ([1f15a64028](https://github.com/facebook/react-native/commit/1f15a6402869b001cae049facc17126924b97197) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Implement Runtime.getHeapUsage for hermes chrome inspector ([3568a72987](https://github.com/facebook/react-native/commit/3568a7298738a651d76c70763362c297ab601ee8) by [@janicduplessis](https://github.com/janicduplessis)) -- Add support for C++17 in OSS ([c2e4ae39b8](https://github.com/facebook/react-native/commit/c2e4ae39b8a5c6534a3fa4dae4130166eda15169) by [@sammy-SC](https://github.com/sammy-SC)) - -#### Android specific - -- Generate `Nullable` for optional objects and arrays in module codegen. ([ffaa5d69bc](https://github.com/facebook/react-native/commit/ffaa5d69bc268918891121e2d60e7ca08ee82530)) -- Expose an API to enable Concurrent Root on Android ([d7b64b8d4b](https://github.com/facebook/react-native/commit/d7b64b8d4b2f403ce00b27c5df89ffb3a64dc6de) by [@cortinico](https://github.com/cortinico)) -- Add scrollEventThrottle prop support in Android ([cf55fd587e](https://github.com/facebook/react-native/commit/cf55fd587e6cc82a73079be6076d244ab72fa359) by [@ryancat](https://github.com/ryancat)) -- Accessibility announcement for list and grid in FlatList ([dd6325bafe](https://github.com/facebook/react-native/commit/dd6325bafe1a539d348f3710e717a6344576b859) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Introduce ModuleDataCleaner.cleanDataFromModules(ReactContext) ([184dfb8f8b](https://github.com/facebook/react-native/commit/184dfb8f8bd4dfbb8d1575e9554e3f3361793015) by [@RSNara](https://github.com/RSNara)) -- Introduce ReactContext.getNativeModules() ([b978308519](https://github.com/facebook/react-native/commit/b978308519f71c6c7fda4b38a842aa219a349275) by [@RSNara](https://github.com/RSNara)) -- MapBuffer implementation for JVM -> C++ communication ([cf6f3b680b](https://github.com/facebook/react-native/commit/cf6f3b680b43fae31e97b14af681293503025a0c)) -- Make links independently focusable by Talkback ([7b5b114d57](https://github.com/facebook/react-native/commit/7b5b114d578142d18bf4a7a5279b179a9ac8d958) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Support animating text color with native driver ([87cdb607e4](https://github.com/facebook/react-native/commit/87cdb607e4792156d433c44b89932e7dae3371da) by [@genkikondo](https://github.com/genkikondo)) -- Added an experimental prop serialization path based on MapBuffer ([cbcdaae2b5](https://github.com/facebook/react-native/commit/cbcdaae2b5dda2a44c95d83dcb5b5aa0f43bc6f9)) -- Allow to setup a Gradle Enterprise instance via an external script ([f11dcfaea1](https://github.com/facebook/react-native/commit/f11dcfaea14249b059aea2474ce36a0665140d4f) by [@cortinico](https://github.com/cortinico)) -- Support platform color with AnimatedColor ([cb42049e0a](https://github.com/facebook/react-native/commit/cb42049e0ae262afe907ace1099414836ab0018d) by [@genkikondo](https://github.com/genkikondo)) -- Support running animations with AnimatedColor with native driver ([3f49e6763e](https://github.com/facebook/react-native/commit/3f49e6763e66447f6ae17dc2f032e27330b7b74a) by [@genkikondo](https://github.com/genkikondo)) -- Add public API to ReactRootView to control if JS touch events are dispatched ([0a517ae438](https://github.com/facebook/react-native/commit/0a517ae43892fb764d829f8bae56c1ac58356b1b) by [@ryancat](https://github.com/ryancat)) - -#### iOS specific - -- Prepare a method in the AppDelegate to control the concurrentRoot. ([8ac8439e0d](https://github.com/facebook/react-native/commit/8ac8439e0dcc0cc4a9c0cc99f614a5e19bae56eb) by [@cipolleschi](https://github.com/cipolleschi)) -- `hotkeysEnabled` property is added to `RCTDevMenu` which allows enabling/disabling hotkeys that triggers developer menu popup ([1a1a304ed2](https://github.com/facebook/react-native/commit/1a1a304ed2023d60547aef65b1a7bf56467edf08)) -- Allow modifying iOS image cache limits ([61b013e7ad](https://github.com/facebook/react-native/commit/61b013e7ad8a1cc28ee39434d2fd96b74b96cf5f) by [@danilobuerger](https://github.com/danilobuerger)) -- Add dismissActionSheet method to ActionSheetIOS ([64ebe5bbdd](https://github.com/facebook/react-native/commit/64ebe5bbdd32fc3b3a243a8a81a6f724d8f81267) by [@gabrieldonadel](https://github.com/gabrieldonadel)) -- Integrated the `accessibilityLanguage` prop to all the available components. The prop is available for any platform but it will work only on iOS. ([7b05b091fd](https://github.com/facebook/react-native/commit/7b05b091fd97f95b778369277ac2147730abc7b8) by [@dgopsq](https://github.com/dgopsq)) -- Support running animations with AnimatedColor with native driver ([49f3f47b1e](https://github.com/facebook/react-native/commit/49f3f47b1e9b840e4374d46b105604f4d2c22dd5) by [@genkikondo](https://github.com/genkikondo)) - -### Changed - -- Update direct Metro dependencies to 0.70.1 ([b74e964e70](https://github.com/facebook/react-native/commit/b74e964e705c40834acad7020562e870cdad9db1), ([c92b64b16a](https://github.com/facebook/react-native/commit/c92b64b16a5710c1dfaea9af4c271931e4669636) by [@arushikesarwani94](https://github.com/arushikesarwani94)), ([f89a0b765c](https://github.com/facebook/react-native/commit/f89a0b765c09c9aba573f03777cc76673989628f) by [@robhogan](https://github.com/robhogan)) -- Upgrade RN CLI to v8.0.0 ([0605880c9e](https://github.com/facebook/react-native/commit/0605880c9ed0aec812f3198eb5075db64fba969a), [1e0226f933](https://github.com/facebook/react-native/commit/1e0226f933814bf9ada87eaa14348bfff863ead1), [24bb7f7380](https://github.com/facebook/react-native/commit/24bb7f7380662925f078d78a03fbc954af2da3d6), [7dceb9b63c](https://github.com/facebook/react-native/commit/7dceb9b63c0bfd5b13bf6d26f9530729506e9097) by [@thymikee](https://github.com/thymikee)) -- Replace use-subscripton with use-sync-external-store ([93b50be8c2](https://github.com/facebook/react-native/commit/93b50be8c2341a0daf41f6fdc656896c4907c4dc) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Expose UIManager from Scheduler ([54db5f2012](https://github.com/facebook/react-native/commit/54db5f201292ebf267800d92b7dd5bfa22431963) by [@cortinico](https://github.com/cortinico)) -- Optimized VirtualizedList context when used with nested lists ([ceb0a54608](https://github.com/facebook/react-native/commit/ceb0a546083509192c059cdd93d6aa379e38ef4e) by [@javache](https://github.com/javache)) -- Remove usage of std::string in EarlyJsErrorHandler. ([30051b2c41](https://github.com/facebook/react-native/commit/30051b2c4185bff015c72069488b5f6ba3391ad7) by [@sshic](https://github.com/sshic)) -- `eslint-config`: add support for ESLint 8 ([864a8c11b2](https://github.com/facebook/react-native/commit/864a8c11b2a7540f607ebc0e084edd7393169359) by [@wcandillon](https://github.com/wcandillon)) -- `eslint-config`: add support for TypeScript 4.5+ ([199ac680c7](https://github.com/facebook/react-native/commit/199ac680c7867a982e25620219bffa18f85f5404) by [@rnike](https://github.com/rnike)) -- Upgraded react-devtools-core dependency to 4.24.0 ([a7a781ff4a](https://github.com/facebook/react-native/commit/a7a781ff4a13e744f4eb3007ef0657740b277a72)) -- Avoid flattening nodes with event props ([980c52de41](https://github.com/facebook/react-native/commit/980c52de41258f6cf2d2360144ea7ca16a19c9f8)) -- Type the argument of Animated.interpolate as read-only ([6584304c10](https://github.com/facebook/react-native/commit/6584304c100ce4d51a5c4d606170a6ad0dc00875) by [@motiz88](https://github.com/motiz88)) -- Update gradle-download-task to 5.0.1 to support concurrent downloads ([a86cae7aac](https://github.com/facebook/react-native/commit/a86cae7aacc9837536e7d679870a57dcd0f45475) by [@michel-kraemer](https://github.com/michel-kraemer)) -- Logging a soft error when ReactRootView has an id other than -1 instead of crashing the app in hybrid apps ([1ca2c24930](https://github.com/facebook/react-native/commit/1ca2c2493027c1b027146cd41e17dd8a4fc33a41) by [@Kunal-Airtel2022](https://github.com/Kunal-Airtel2022)) -- Upgrade to React 18 ([41cbccd98d](https://github.com/facebook/react-native/commit/41cbccd98dd6c98d1f662674164cf455105a1359) by [@rickhanlonii](https://github.com/rickhanlonii)) - -#### Android specific - -- Gradle: extend the algoritm to find hermesc paths ([aeac6ab677](https://github.com/facebook/react-native/commit/aeac6ab6773cd2c0ca7abe9e5aa3f22fa81683e5) by [@cortinico](https://github.com/cortinico)) -- Bump boost for Android to 1.76 to align with iOS ([5cd6367f0b](https://github.com/facebook/react-native/commit/5cd6367f0b86543274a15bb6d0e53a8545fed845) by [@kelset](https://github.com/kelset)) -- Adopt `MapBuffer` interface for `ReadableMapBuffer` ([81e4249315](https://github.com/facebook/react-native/commit/81e42493158edd5e7b88f98c19c87e9d61ba4aba)) -- Mark intent as nullable ([5ffa0b0aa6](https://github.com/facebook/react-native/commit/5ffa0b0aa6c523234c634167be1f94b0d9edb0f7) by [@sshic](https://github.com/sshic)) -- Use CMake to build ReactAndroid module ([e3830ddffd](https://github.com/facebook/react-native/commit/e3830ddffd9260fe071e0c9f9df40b379d54cf26)) -- Update template/android and RN Tester to use `hermes-engine` from the `react-native` NPM package. ([4d91f40fbd](https://github.com/facebook/react-native/commit/4d91f40fbdf0012689b04084113299676342c0dc) by [@cortinico](https://github.com/cortinico)) -- Build Hermes from Source ([a3d9892ed9](https://github.com/facebook/react-native/commit/a3d9892ed9c993d16fa36fa6b713e2ead43fcc77) by [@cortinico](https://github.com/cortinico)) -- Rename field with default values for ReactConfig to DEFAULT_CONFIG ([964e816752](https://github.com/facebook/react-native/commit/964e81675286c80a8e322127aa7c052f62621098)) -- Moved `com/react/facebook/uimanager/interfaces` files into `com/react/facebook/uimanager` to enable Kotlin build ([b1a779392d](https://github.com/facebook/react-native/commit/b1a779392d483c649d428debfe4a6405247b8c0e)) -- Bump AGP to 7.1.0 and fix bundle inclusion in release mode ([200488e87c](https://github.com/facebook/react-native/commit/200488e87cf4bc355e03c78cd814b97b23452117) by [@gabrieldonadel](https://github.com/gabrieldonadel)) -- Release react-native-gradle-plugin 0.0.5 ([42272211e4](https://github.com/facebook/react-native/commit/42272211e4a1b7cff7770b59cf1bcf649cbdd6fc) by [@cortinico](https://github.com/cortinico)) -- ViewPagerAndroid recommendation link. ([7e8cce3d2d](https://github.com/facebook/react-native/commit/7e8cce3d2ddffbe36bcb3c9ec2f006f7e1b42a79) by [@maaxg](https://github.com/maaxg)) -- Bump android Appcompat to 1.4.1 ([6b61995647](https://github.com/facebook/react-native/commit/6b61995647c789a567845521fed7b0cc1e0cddb7) by [@gabrieldonadel](https://github.com/gabrieldonadel)) -- Remove `react-native-gradle-plugin` as a dependency from template's package.json ([cd79317672](https://github.com/facebook/react-native/commit/cd79317672e5c99636346f2abb641a688a4ceb82) by [@cortinico](https://github.com/cortinico)) -- Use 2g as a default heap size for gradle builds ([09e418ef8e](https://github.com/facebook/react-native/commit/09e418ef8e98fd026cf828696ff2475993b76ac2)) -- Use new StatusBar API on Android 11 (API 30)+ ([50c8e973f0](https://github.com/facebook/react-native/commit/50c8e973f067d4ef1fc3c2eddd360a0709828968) by [@ieatfood](https://github.com/ieatfood)) -- Change static string to public ([ab45138394](https://github.com/facebook/react-native/commit/ab45138394f41aeb13370882837968636de04c24) by [@sshic](https://github.com/sshic)) - -#### iOS specific - -- Use pre-built HermesC if available in current React Native release ([644fe430fd](https://github.com/facebook/react-native/commit/644fe430fdecc0bf1fa098d1c2d52178da6c987c) by [@hramos](https://github.com/hramos)) -- When building Hermes from source, the filesystem will now be prepared using the new hermes-utils.js scripts, outside of CocoaPods ([aaa01f7710](https://github.com/facebook/react-native/commit/aaa01f77106f891696d9ec508e2ee71111a6af2a) by [@hramos](https://github.com/hramos)) -- Expose scheduler through RCTSurfacePresenter ([614aa86916](https://github.com/facebook/react-native/commit/614aa86916394d8ee2ecb236f38de6bb7e161ca2) by [@cortinico](https://github.com/cortinico)) -- Adopt UIGraphicsImageRenderer API ([d70d7fd0b3](https://github.com/facebook/react-native/commit/d70d7fd0b3984ee54622afc4692a6c945618c345) by [@matrush](https://github.com/matrush)) -- Build Hermes from source when Hermes is used ([bb01b75637](https://github.com/facebook/react-native/commit/bb01b75637edc1159a3bdb3af86936e1c92f39c1) by [@hramos](https://github.com/hramos)) -- Update CodeGen scripts to accept custom node executable ([323db75c36](https://github.com/facebook/react-native/commit/323db75c36d26d771f6b231c8eabc5afc0da74d3) by [@cipolleschi](https://github.com/cipolleschi)) -- Fixed the fallback behavior when the `.xcode.env` file is missing, actually using the old `find-node-for-xcode.sh` script ([705c6f57d6](https://github.com/facebook/react-native/commit/705c6f57d66b4499f43489292183a58413402a74) by [@cipolleschi](https://github.com/cipolleschi)) -- Adding a link in a message for the users. ([2c52131f5e](https://github.com/facebook/react-native/commit/2c52131f5e0eb4668681242fcdd8150afe3c5827) by [@cipolleschi](https://github.com/cipolleschi)) -- Bump ruby to 2.7.5 ([2c87b7466e](https://github.com/facebook/react-native/commit/2c87b7466e098c5cd230e02b279fc7bc7a357615) by [@danilobuerger](https://github.com/danilobuerger)) -- This PR removes the `find-node.sh` scripts and replaces it with an `.xcode.env` file that is sourced by the script phases that needs it. The `.xcode.env` file is versioned: to customize a local environment, an unversioned `.xcode.local.env` can be used. ([0480f56c5b](https://github.com/facebook/react-native/commit/0480f56c5b5478b6ebe5ad88e347cad2810bfb17) by [@cipolleschi](https://github.com/cipolleschi)) -- Update `PushNotificationIOS.checkPermissions` to include iOS 10+ notification settings. ([17ecd2fb5b](https://github.com/facebook/react-native/commit/17ecd2fb5b3cfb8aa0282ed406b16dc3b9777018)) -- Enable SonarKit in React-Core when the configuration is `'Debug'` ([b5343a6b0d](https://github.com/facebook/react-native/commit/b5343a6b0dd07c1b4ef9dac549df67a4d68ebd1e) by [@cipolleschi](https://github.com/cipolleschi)) -- When Hermes is enabled, the Hermes Engine will be built from source instead of using the pre-built `hermes-engine` CocoaPod. ([12ad1fffe8](https://github.com/facebook/react-native/commit/12ad1fffe87c0c5ab2e001f318ff4f8d3eda7479) by [@hramos](https://github.com/hramos)) -- Replaced folly::Optional with std::optional from C++17 in Objc module generator. ([45e2941367](https://github.com/facebook/react-native/commit/45e2941367fbf13584193bbda598173802289167) by [@philIip](https://github.com/philIip)) -- Removed methodName parameter that was used only for a warning message and moved the warning parameter to be calculated inline. ([cfb11ca2f6](https://github.com/facebook/react-native/commit/cfb11ca2f67c59c090b8a58b2b7bdaacef0e19df)) -- Fix the crash caused by nil partialLoadHandler ([46bc521513](https://github.com/facebook/react-native/commit/46bc521513c9c78e5ffc49cf3e571757e1a91cef)) -- Synchronously render cached images ([189c2c8958](https://github.com/facebook/react-native/commit/189c2c8958442541c6b4f42860b2943ece612da2)) -- Updated Flipper-Glog to 0.5.0.4 ([cd60ffdb62](https://github.com/facebook/react-native/commit/cd60ffdb62b2183cd24baef3075d56f758cea24a)) -- Add function to report early js errors ([1804951595](https://github.com/facebook/react-native/commit/180495159517dc0bfa103621e5ff62fc04cb3c8b) by [@sshic](https://github.com/sshic)) - -### Deprecated - -- Deprecate the use of `react-native/jest/preprocessor.js` by external projects ([c1e9aa9a27](https://github.com/facebook/react-native/commit/c1e9aa9a272aed3cba60c4aeff783eeb8bffce68) by [@motiz88](https://github.com/motiz88)) -- Deprecate the Promise.prototype.done method and log a warning when it's called in development. ([35800962c1](https://github.com/facebook/react-native/commit/35800962c16a33eb8e9ff1adfd428cf00bb670d3) by [@motiz88](https://github.com/motiz88)) - -#### iOS specific - -- Deprecating support for iOS/tvOS SDK 11.0, 12.4+ is now required ([5f2835b14d](https://github.com/facebook/react-native/commit/5f2835b14d35681c268dd64d6ec284ea5f053be3), ([c71e6efbcd](https://github.com/facebook/react-native/commit/c71e6efbcd2b95faee327d9763d321488120bc5e), ([982ca30de0](https://github.com/facebook/react-native/commit/982ca30de079d7e80bd0b50365d58b9048fb628f) by [@philIip](https://github.com/philIip)) - -#### iOS specific - -- Removed lint restricting `DynamicColorIOS` to only two properties ([13b0b06522](https://github.com/facebook/react-native/commit/13b0b0652259ada468cc044b0b604edb666b2eb9)) - -### Fixed - -- Remove unactionable warning about `codegenNativeComponent` when on 'Paper' ([494b73cb33](https://github.com/facebook/react-native/commit/494b73cb33197fa865e9ead8fdca11bce6822917) by [@tido64](https://github.com/tido64)) -- Fix typo in Value's constructor with a Symbol ([a7a0f86a73](https://github.com/facebook/react-native/commit/a7a0f86a73ab51be31fb2c3205612d7ff1fb5384) by [@jpporto](https://github.com/jpporto)) -- Avoid full copy of large folly::dynamic objects by switching to std::move semantics ([3f98c8e4c2](https://github.com/facebook/react-native/commit/3f98c8e4c2c8f40b81c1a90aa65c1bdc9327faed) by [@NikoAri](https://github.com/NikoAri)) -- Fix performance issue on Animated.interpolate with big input range ([f503b21203](https://github.com/facebook/react-native/commit/f503b212039f79f00ea56b65ecf3cd150b82f087) by [@Almouro](https://github.com/Almouro)) -- Update function spacing linting rules ([8650220cf9](https://github.com/facebook/react-native/commit/8650220cf99739c4b904a37ce4f19ce7dfd3bdbb) by [@joeframbach](https://github.com/joeframbach)) -- Add supportsFromJs and supportsToJs template variables ([087624ccaf](https://github.com/facebook/react-native/commit/087624ccaf2e484c0b6425e57edf9afd62a06e9a) by [@appden](https://github.com/appden)) -- The Array appended to FormData is transmitted as a string ([d2e8e7d58e](https://github.com/facebook/react-native/commit/d2e8e7d58e680e0bb3b4da1f820dd4dd840639f5) by [@bang9](https://github.com/bang9)) -- AppState.removeEventListener correctly removes listener for blur and focus events ([9aab25ec53](https://github.com/facebook/react-native/commit/9aab25ec536473ffe6d22c5efeae8fea6bd769be) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) -- `focus()` on TextInput to respect its `editable` state ([8a5460ce80](https://github.com/facebook/react-native/commit/8a5460ce80e69c11a007121d4278d55642f6b10e) by [@vonovak](https://github.com/vonovak)) -- Restore Windows build with RawPropsParser.cpp ([2d64d1d693](https://github.com/facebook/react-native/commit/2d64d1d69360161c047c86a026403d8074ba28bb) by [@TatianaKapos](https://github.com/TatianaKapos)) -- Fix babel-plugin-codegen crash when export init is null ([ae756647c9](https://github.com/facebook/react-native/commit/ae756647c9b8a88ba615fd30185f621825a33427) by [@janicduplessis](https://github.com/janicduplessis)) -- Fixed compilation warning due to `using namespace` being used as part of header ([009d80bf5a](https://github.com/facebook/react-native/commit/009d80bf5a55dd74be448960b1344ac7599c6bae) by [@arhelmus](https://github.com/arhelmus)) -- Allow including TurboModule.h in mixed rtti/no-rtti environment, even if TurboModule.h/cpp is compiled without RTTI. ([1f87729697](https://github.com/facebook/react-native/commit/1f87729697370a4ab31e2bb9ab1780438d9e146f) by [@nlutsenko](https://github.com/nlutsenko)) -- Remove prettier from dependencies in eslint-config ([2db1bca952](https://github.com/facebook/react-native/commit/2db1bca95224ce39484c3f27508aec9a21ce126a) by [@Kerumen](https://github.com/Kerumen)) -- Switch Component doesn't disable click functionality when disabled ([b2e625a517](https://github.com/facebook/react-native/commit/b2e625a51723becea4cef0433448fbec679669ee) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Support numeric color values in StyleSheet's Flow types ([83b1975b90](https://github.com/facebook/react-native/commit/83b1975b90569a36020da33156615a13fcc7ba92) by [@motiz88](https://github.com/motiz88)) -- Fix build break on Windows with ReactCommon ([42b391775f](https://github.com/facebook/react-native/commit/42b391775f663df335f6f2553104fc2fa35b1bee) by [@chiaramooney](https://github.com/chiaramooney)) -- Fixed opacity value in TouchableOpacity ([3eddc9abb7](https://github.com/facebook/react-native/commit/3eddc9abb70eb54209c68aab7dbd69e363cc7b29) by [@hetanthakkar1](https://github.com/hetanthakkar1)) -- Remove illegal private property access in VirtualizedSectionList.scrollToLocation ([b2f871a6fa](https://github.com/facebook/react-native/commit/b2f871a6fa9c92dd0712055384b9eca6d828e37d) by [@motiz88](https://github.com/motiz88)) -- JS animated node value updates properly when listener is attached ([1f778014a7](https://github.com/facebook/react-native/commit/1f778014a7e95c5c473898c38d5b1e0725cd373c) by [@genkikondo](https://github.com/genkikondo)) -- Working around Long paths limitation on Windows ([7b76abc0d3](https://github.com/facebook/react-native/commit/7b76abc0d3a0a5bec37f314c80954e412fc5f5ec) by [@mganandraj](https://github.com/mganandraj)) -- Fix VirtualizedList with initialScrollIndex not rendering all elements when data is updated ([c5c17985da](https://github.com/facebook/react-native/commit/c5c17985dae402725abb8a3a94ccedc515428711) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) - -#### Android specific - -- Add back hermes inspector support ([6b6adcc111](https://github.com/facebook/react-native/commit/6b6adcc111123bec2c4c110070b2506385e74664) by [@Kudo](https://github.com/Kudo)) -- Fixed issue where any node with an AccessibilityDelegate set (which was any node with any accessibility propoerty), was using ExploreByTouchHelper's built in AccessibilityNodeProvider, and not properly populating their AccessibilityNodeInfo's, leading to focus issues and issues with automated test services like UIAutomator. ([70fcab76a4](https://github.com/facebook/react-native/commit/70fcab76a4dcf65e628ac897620fe050758574e3) by [@blavalla](https://github.com/blavalla)) -- Fix Extras usage in Android implementation of Linking.sendIntent() ([86f8d0bb52](https://github.com/facebook/react-native/commit/86f8d0bb528a75777c357ae214643ed58c326ca9)) -- Fix typo in gradle plugin deprecation message ([41cfd2f976](https://github.com/facebook/react-native/commit/41cfd2f9768e4742eedd299ab467d316d016705e) by [@mikehardy](https://github.com/mikehardy)) -- Fixed `TimingModule` related functions for headless JS tasks, eg. `setTimeout` ([dac56ce077](https://github.com/facebook/react-native/commit/dac56ce0776e0e4d23ed4f8b324f2e2432aefa6a) by [@marcesengel](https://github.com/marcesengel)) -- Improve support for Android users on M1 machine ([c5babd993a](https://github.com/facebook/react-native/commit/c5babd993a2bed2994ecc4710fa9e424b3e6cfc2) by [@cortinico](https://github.com/cortinico)) -- Do not use `rootProject` directly in Gradle scripts ([b2bc5aa5c9](https://github.com/facebook/react-native/commit/b2bc5aa5c903ad057a53d4caa82b0fe74e01c07c) by [@cortinico](https://github.com/cortinico)) -- Adding null check for context in redbox surface delegate ([9527ab1584](https://github.com/facebook/react-native/commit/9527ab1584869d7966c562e8aa7cbf48788156a3) by [@ryancat](https://github.com/ryancat)) -- Fix crash on empty snapToOffsets array ([145fd041c7](https://github.com/facebook/react-native/commit/145fd041c7afe9a18f08f461487bb515ab2f516a) by [@ryancat](https://github.com/ryancat)) -- Fix StatusBar not updating to use translucent values when set to the same value across different activities ([d34a75e9e5](https://github.com/facebook/react-native/commit/d34a75e9e5932adcac4a16f5b815bb909c3aa0dd)) -- Fix underlineColorAndroid transparent not working on API 21 ([52aee50a70](https://github.com/facebook/react-native/commit/52aee50a704bbeab91f5fa05fe3220dee304422f) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fixed regression on content in scroll view not responding to touch when fling got interrupted ([bb8ff9260f](https://github.com/facebook/react-native/commit/bb8ff9260fe6a783171f35ce1a459927d8179d08) by [@ryancat](https://github.com/ryancat)) -- Fixes android build error when compiling as library ([c34ef5841c](https://github.com/facebook/react-native/commit/c34ef5841cf3a63a9cc96add577d6bf6d52e4397) by [@nickfujita](https://github.com/nickfujita)) -- Cancel post touch process when new touch is received ([0368081858](https://github.com/facebook/react-native/commit/0368081858193d7c2537acd9080d11bb701ee98b) by [@ryancat](https://github.com/ryancat)) -- Improve rendering of images when resampled and corner radius applied ([f743bed657](https://github.com/facebook/react-native/commit/f743bed657591b078300a6519e3d68db542fd757) by [@javache](https://github.com/javache)) -- Fix transform when calculate overflowInset ([0975e96d53](https://github.com/facebook/react-native/commit/0975e96d53546ac05b2154352fe56e5d82e2a1f8) by [@ryancat](https://github.com/ryancat)) -- Fix ReactHorizontalScrollView contentOffset ([9f6f97151c](https://github.com/facebook/react-native/commit/9f6f97151c44a0f727c9dd938222be1860ecf3f9) by [@genkikondo](https://github.com/genkikondo)) -- Text Component does not announce disabled and disables click functionality when disabled ([7b2d8178b1](https://github.com/facebook/react-native/commit/7b2d8178b155f5f1b247614c46e5e20f31bbd438) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fix StatusBar on Android API 30 ([9ed2df628d](https://github.com/facebook/react-native/commit/9ed2df628ddd410cc3383e68b0386471432445c0) by [@ieatfood](https://github.com/ieatfood)) -- Use root locale when converting string case. ([5341ad8962](https://github.com/facebook/react-native/commit/5341ad896245c40a00b6faead1b90d01aac58f8c) by [@halaei](https://github.com/halaei)) -- Fix DarkMode on Calendar DateTimePicker ([97064ae1fb](https://github.com/facebook/react-native/commit/97064ae1fbf84a8a6b653c02c5872191b7d2d622) by [@mdvacca](https://github.com/mdvacca)) -- Fix ScrollView contentOffset ([be260b9f47](https://github.com/facebook/react-native/commit/be260b9f479a3b55ee43d2959d2c49fd3c1eb4ac) by [@genkikondo](https://github.com/genkikondo)) -- Do not bundle libhermes.so or libjsc.so inside the React Native Android AAR ([fa85417179](https://github.com/facebook/react-native/commit/fa854171798e67b8a10820f77d7198315e1784ed) by [@cortinico](https://github.com/cortinico)) -- Enable hitSlop to be set using a single number. ([d682753244](https://github.com/facebook/react-native/commit/d682753244feba28c6a15c31966a3da075a090e6) by [@javache](https://github.com/javache)) -- Fix crash caused by Image.queryCache parsing null ([ae3d4f7008](https://github.com/facebook/react-native/commit/ae3d4f700843ae4cbb6927ee620095136d1abc3f) by [@skychx](https://github.com/skychx)) -- Fix NullPointerException when disaptching events ([fbeb51ef51](https://github.com/facebook/react-native/commit/fbeb51ef5133303a5cb71569507d44403ded3447) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific - -- ScrollView's contentInsetAdjustmentBehavior is reset to Never at every reuse to avoid layout artifacts. ([28a65f4387](https://github.com/facebook/react-native/commit/28a65f438789c29309d6e7c58063a73ca721ef43)) -- Prevent Nullptr segfault in TurboModule init path ([7f3cc256b5](https://github.com/facebook/react-native/commit/7f3cc256b5bcbf2e64540ca69401f62ec6869f0e) by [@RSNara](https://github.com/RSNara)) -- Expose the extraData dict attached to JavaScript errors to the native ExceptionManager on iOS, similar to Android ([a65ae8eff6](https://github.com/facebook/react-native/commit/a65ae8eff6ec6f9ad283ac8e96f00802421a14da) by [@GijsWeterings](https://github.com/GijsWeterings)) -- `RCTLocalizationProvider` Fall back to input when no localization is available ([18196512db](https://github.com/facebook/react-native/commit/18196512db6b8b4469a5e1b098d8892ae72d743a) by [@robhogan](https://github.com/robhogan)) -- Update iOS LogBox to render its UIWindow with the key window's UIWindowScene ([d31d83f410](https://github.com/facebook/react-native/commit/d31d83f4109c167ec612058c805fd65f69b82476) by [@vincentriemer](https://github.com/vincentriemer)) -- Remove Gemfile.lock from template ([1907bd31f0](https://github.com/facebook/react-native/commit/1907bd31f066865aa1c5fe4ec88e98ee46448771) by [@danilobuerger](https://github.com/danilobuerger)) -- Fix `pod install` when `RCT-Folly` version has been updated. ([b2517c3bdc](https://github.com/facebook/react-native/commit/b2517c3bdccc3f9d935f4ee06f959d6ce8f27bbe) by [@fortmarek](https://github.com/fortmarek)) -- Fix usage of cocoapods with --project-directory flag and new arch ([2f813f873a](https://github.com/facebook/react-native/commit/2f813f873a1692044ea3461e59ca732a4d952300) by [@danilobuerger](https://github.com/danilobuerger)) -- Ensure LogBoxView is sized relative to the key window instead of the full screen ([84f8c9ad55](https://github.com/facebook/react-native/commit/84f8c9ad550f98295d2e718b4b1d6b1ac724b898) by [@vincentriemer](https://github.com/vincentriemer)) -- Improved template fastlane gitignore ([f43f05d292](https://github.com/facebook/react-native/commit/f43f05d292fd2fbdf3d5fdfd194ed81b0e346657) by [@danilobuerger](https://github.com/danilobuerger)) -- Set RCTView borderColor to UIColor ([267d36d0af](https://github.com/facebook/react-native/commit/267d36d0afb4b3713df9b679c2019c44ac6bcc3f) by [@danilobuerger](https://github.com/danilobuerger)) -- Fix action sheet callback invoked more than once on iPad ([8935d6e697](https://github.com/facebook/react-native/commit/8935d6e697dffb0971f5a8ee1dfbc580080de3e0) by [@janicduplessis](https://github.com/janicduplessis)) -- Resolve border platform color based on current trait collection ([9a35818797](https://github.com/facebook/react-native/commit/9a3581879764f3f1b2743905e3e54611e96bb618) by [@danilobuerger](https://github.com/danilobuerger)) -- Enable custom sound for local push notifications. ([eb19499484](https://github.com/facebook/react-native/commit/eb1949948406195c4c02c6041d07cba074ae820c)) -- Invoke registerForRemoteNotifications on main UI thread. ([3633a05299](https://github.com/facebook/react-native/commit/3633a05299d99b12acc5c3c056b977463df1924e)) -- Bump flipper pods to get arm64 catalyst slice ([f811da7cc2](https://github.com/facebook/react-native/commit/f811da7cc20cc49ca5c8d4e023d6c61e36e15dd1) by [@fortmarek](https://github.com/fortmarek)) -- Fix `pod install --project-directory=ios` failing when Hermes is enabled ([1b22e8a039](https://github.com/facebook/react-native/commit/1b22e8a039081887ffd450596d822bff975d6900), ([eb7cc85a91](https://github.com/facebook/react-native/commit/eb7cc85a9146d058694247178f03d57cc125c97a) by [@tido64](https://github.com/tido64)) -- Fix compilation warning in yoga ([52d8a797e7](https://github.com/facebook/react-native/commit/52d8a797e7a6be3fa472f323ceca4814a28ef596) by [@cuva](https://github.com/cuva)) -- Prevent deadlock when dispatching events from observers on the same thread. ([68fd1e5508](https://github.com/facebook/react-native/commit/68fd1e55085e871a854563721ee29ca698239607) by [@Pickleboyonline](https://github.com/Pickleboyonline)) -- In RCTSurfaceHostingComponent, access ckComponent from main queue to pass assertion ([1874c81003](https://github.com/facebook/react-native/commit/1874c81003b468554c227541fec5e29c4adfb82f) by [@p-sun](https://github.com/p-sun)) -- Fix modal redbox for onDismiss ([46f68aceb2](https://github.com/facebook/react-native/commit/46f68aceb20a10c95c92b5ffeb90f289b015a559) by [@HeyImChris](https://github.com/HeyImChris)) -- Attempt to fix crash during app termination ([9cd43340a7](https://github.com/facebook/react-native/commit/9cd43340a7e2443564c2ff5e8e85d37f6e1e47ef) by [@sammy-SC](https://github.com/sammy-SC)) - -### Security - -- Encode URL params in URLSearchParams.toString() ([1042a8012f](https://github.com/facebook/react-native/commit/1042a8012fb472bd5c882b469fe507dd6279d562) by [@sshic](https://github.com/sshic)) - -## v0.68.7 - -### Fixed - -- Use logical operator instead of bit operation in Yoga ([c3ad8](https://github.com/facebook/react-native/commit/c3ad8ec7eb01b7236e0081ac7c7f888630caac21) by [@cuva](https://github.com/cuva)) - -#### Android specific - -- Minimize EditText Spans 8/N: CustomStyleSpan ([b384bb613b](https://github.com/facebook/react-native/commit/b384bb613bf533aebf3271ba335c61946fcd3303) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize EditText Spans 6/N: letterSpacing ([5791cf1f7b](https://github.com/facebook/react-native/commit/5791cf1f7b43aed1d98cad7bcc272d97ab659111) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize Spans 5/N: Strikethrough and Underline ([0869ea29db](https://github.com/facebook/react-native/commit/0869ea29db6a4ca20b9043d592a2233ae1a0e7a2) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize Spans 4/N: ReactForegroundColorSpan ([8c9c8ba5ad](https://github.com/facebook/react-native/commit/8c9c8ba5adb59f7f891a5307a0bce7200dd3ac7d) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize Spans 3/N: ReactBackgroundColorSpan ([cc0ba57ea4](https://github.com/facebook/react-native/commit/cc0ba57ea42d876155b2fd7d9ee78604ff8aa57a) by [@NickGerleman](https://github.com/NickGerleman)) -- Minimize Spans 1/N: Fix precedence ([1743dd7ab4](https://github.com/facebook/react-native/commit/1743dd7ab40998c4d3491e3b2c56c531daf5dc47) by [@NickGerleman](https://github.com/NickGerleman)) -- Fix measurement of uncontrolled TextInput after edit ([8a0fe30591](https://github.com/facebook/react-native/commit/8a0fe30591e21b90a3481c1ef3eeadd4b592f3ed) by [@NickGerleman](https://github.com/NickGerleman)) - -## v0.68.6 - -### Fixed - -#### Android specific - -- Mitigation for Samsung TextInput Hangs ([be69c8b5a7](https://github.com/facebook/react-native/commit/be69c8b5a77ae60cced1b2af64e48b90d9955be5) by [@NickGerleman](https://github.com/NickGerleman)) - -## v0.68.6 - -### Fixed - -#### Android specific - -- Mitigation for Samsung TextInput Hangs ([be69c8b5a7](https://github.com/facebook/react-native/commit/be69c8b5a77ae60cced1b2af64e48b90d9955be5) by [@NickGerleman](https://github.com/NickGerleman)) - -## v0.68.5 - -### Fixed - -- Force dependencies resolution to minor series for 0.68 ([edcb3ca996](https://github.com/facebook/react-native/commit/edcb3ca996fb3296762af300a36c1d46356f1b24) by [@Titozzz](https://github.com/Titozzz)) - -## v0.68.4 - -### Changed - -- Bump version of `promise` from 8.0.3 to 8.2.0, enabling `Promise.allSettled` ([951538c080](https://github.com/facebook/react-native/commit/951538c080ef745da304fb308fa91d597e0dd98a) by [@retyui](https://github.com/retyui)) -- Bump react-native-codegen to 0.0.18 ([40a3ae3613](https://github.com/facebook/react-native/commit/40a3ae3613394fe5f0d728bada538d2d5b78a8a4) by [@dmytrorykun](https://github.com/dmytrorykun)) - -#### Android specific - -- Correctly resolve classes with FindClass(..) ([361b310bcc](https://github.com/facebook/react-native/commit/361b310bcc8dddbff42cf63495649291c894d661) by [@evancharlton](https://github.com/evancharlton)) - -### Fixed - -- Codegen should ignore `.d.ts` files ([0f0d52067c](https://github.com/facebook/react-native/commit/0f0d52067cb89fdb39a99021f0745282ce087fc2) by [@tido64](https://github.com/tido64)) - -#### iOS specific - -- Fix the way the orientation events are published ([7d42106d4c](https://github.com/facebook/react-native/commit/7d42106d4ce20c644bda4d928fb0abc163580cee) by [lbaldy](https://github.com/lbaldy)) - -## v0.68.3 - -### Changed - -#### Android specific - -- Let's not build reactnativeutilsjni shared library ([af9225ec5f](https://github.com/facebook/react-native/commit/af9225ec5fd22da802e3da4d786fa7f6ec956b0f) by [@SparshaSaha](https://github.com/SparshaSaha)) -- Modified **getDefaultJSExecutorFactory** method ([87cfd386cb](https://github.com/facebook/react-native/commit/87cfd386cb2e02bfa440c94706d9d0274f83070c) by [@KunalFarmah98](https://github.com/KunalFarmah98)) - -### Fixed - -- Use monotonic clock for performance.now() ([114d31feee](https://github.com/facebook/react-native/commit/114d31feeeb47f5a57419e5088c3cbe9340f757a)) - -#### Android specific - -- Logging a soft error when ReactRootView has an id other than -1 instead of crashing the app in hybrid apps ([1ca2c24930](https://github.com/facebook/react-native/commit/1ca2c2493027c1b027146cd41e17dd8a4fc33a41) by [@Kunal-Airtel2022](https://github.com/Kunal-Airtel2022)) - -## v0.68.2 - -### Changed - -- Bump used version of react-native-codegen to 0.0.17 ([dfda480a98](https://github.com/facebook/react-native/commit/dfda480a9888d95c542cea40f25e8e783565c1db) by [@cortinico](https://github.com/cortinico)) -- Bump react-native-codegen to 0.0.17 ([a5ddc2e165](https://github.com/facebook/react-native/commit/a5ddc2e16523ea336ffbecf7acfd4820469a29e7) by [@cortinico](https://github.com/cortinico)) - -### Fixed - -#### Android specific - -- Working around Long paths limitation on Windows ([62ef6f5fa1](https://github.com/facebook/react-native/commit/62ef6f5fa1ecb918bde130a6024b65afcd34c7e3) by [@mganandraj](https://github.com/mganandraj)) - -## v0.68.1 - -### Changed - -#### Android specific - -- Bump React Native Gradle plugin to 0.0.6 ([9573d7b84d](https://github.com/facebook/react-native/commit/9573d7b84d35233fbb39a4067cfef65490aa34a7) by [@cortinico](https://github.com/cortinico)) -- Don't require yarn for codegen tasks ([d5da70e17e](https://github.com/facebook/react-native/commit/d5da70e17e8c8210cd79a4d7b09c6a5ded4b5607) by [@danilobuerger](https://github.com/danilobuerger)) - -### Fixed - -- Fix dynamic_cast (RTTI) by adding key function to ShadowNodeWrapper and related classes ([58a2eb7f37](https://github.com/facebook/react-native/commit/58a2eb7f37c2dc27ad3575618778ad5b23599b27) by [@kmagiera](https://github.com/kmagiera)) -- Pin use-subscription to < 1.6.0 ([5534634892](https://github.com/facebook/react-native/commit/5534634892f47a3890e58b661faa2260373acb25) by [@danilobuerger](https://github.com/danilobuerger)) - -#### Android specific - -- Use NDK 23 only for Windows users. ([e48a580080](https://github.com/facebook/react-native/commit/e48a580080bdae58b375f30fbcf8a83cc1915b2f) by [@cortinico](https://github.com/cortinico)) -- Improve support for Android users on M1 machine ([4befd2a29c](https://github.com/facebook/react-native/commit/4befd2a29cb94b026d9c048a041aa9f1817295b5) by [@cortinico](https://github.com/cortinico)) -- Template: Specify abiFilters if enableSeparateBuildPerCPUArchitecture is not set. ([5dff920177](https://github.com/facebook/react-native/commit/5dff920177220ae5f4e37c662c63c27ebf696c83) by [@cortinico](https://github.com/cortinico)) -- Fix for building new architecture sources on Windows ([5a8033df98](https://github.com/facebook/react-native/commit/5a8033df98296c941b0a57e49f2349e252339bf9) by [@mganandraj](https://github.com/mganandraj)) - -## v0.68.0 - -### Breaking Changes - -- CI moved to Node 16. ([f1488db109](https://github.com/facebook/react-native/commit/f1488db109d13e748b071c02b40e90cdca1cc79d) by [@kelset](https://github.com/kelset)). - This change enforces Node >= 14 for React Native builds. -- Bump Android Gradle Plugin to 7.0.1. ([272cfe5d13](https://github.com/facebook/react-native/commit/272cfe5d1371c38a281cf3883ff0254a8d3505a3) by [@dulmandakh](https://github.com/dulmandakh)) - This version of Android Gradle plugin enforces JDK 11 for Android builds. Do not upgrade to AGP 7.1 as it is not supported by this version of react-native. -- Removed `fallbackResource` from `RCTBundleURLProvider` API ([0912ee179c](https://github.com/facebook/react-native/commit/0912ee179c210fb6b2ed9afbb3f2fbc5fb8a2bb3)) by [@philIip](https://github.com/philIip) - -### New Architecture - -*If you are interested in enabling the new architecture, please refer to [the dedicated documentation](https://reactnative.dev/docs/next/new-architecture-intro).* - -- Do not include Facebook license on users codegen'd code ([450967938a](https://github.com/facebook/react-native/commit/450967938ab25c4dabb9d5ecd9f7b57afb1c78dd) by [@cortinico](https://github.com/cortinico)) - -#### Android specific - -- Setup a `newArchEnabled` property to Opt-in the New Architecture in the template ([8d652fba4c](https://github.com/facebook/react-native/commit/8d652fba4ce07256784a1b7e86713c810336856d) by [@cortinico](https://github.com/cortinico)) - -#### iOS specific - -- Add fabric option to the default app template. ([2e9a376c84](https://github.com/facebook/react-native/commit/2e9a376c8488d1fb11c0b5d604137712321fd90d) by [@sota000](https://github.com/sota000)) -- Add turbo module support in the default app template. ([8ec0e6919c](https://github.com/facebook/react-native/commit/8ec0e6919c5fab118c8b54538860ee36009bfaa7) by [@sota000](https://github.com/sota000)) -- Rename the new architecture flag to RCT_NEW_ARCH_ENABLED. ([c0c5439959e](https://github.com/facebook/react-native/commit/c0c5439959e21d7806178bb9139c2cd19b857506) by [@sota000](https://github.com/sota000)) - -### Added - -- Create @fb-tools-support/yarn package ([7db294d6d5](https://github.com/facebook/react-native/commit/7db294d6d5b00a38f305dd52be3e0961f35695c8) by [@motiz88](https://github.com/motiz88)) -- Support string color values in Animated.Color ([d3a0c4129d](https://github.com/facebook/react-native/commit/d3a0c4129d6a5a7beced4e9aa62b2da4e3f4fed4)) -- New Animated.Color node ([ea90a76efe](https://github.com/facebook/react-native/commit/ea90a76efef60df0f46d29228289f8fc1d26f350)) -- Added linter warning config for unstable nested components ([988fefc44d](https://github.com/facebook/react-native/commit/988fefc44d39957e8c5e1eecb02dfd1ce119f34c) by [@javache](https://github.com/javache)) -- Option to supply `platformConfig` to NativeAnimated ([4a227ce2ab](https://github.com/facebook/react-native/commit/4a227ce2ab3f8c181150461ab28b831979093db0) by [@rozele](https://github.com/rozele)) -- Animated.event can be used to extract values with numeric keys from native events ([b2105711a0](https://github.com/facebook/react-native/commit/b2105711a0b90859f8e3fc1aaec4998e252c2d14) by [@javache](https://github.com/javache)) -- Adds a setSelection imperative method to TextInput ([771ca921b5](https://github.com/facebook/react-native/commit/771ca921b59cc3b3fd12c8fe3b08ed150bcf7a04) by [@lyahdav](https://github.com/lyahdav)) -- Native-only prop to optimize text hit testing on some RN platforms ([f3bf2e4f51](https://github.com/facebook/react-native/commit/f3bf2e4f51897f1bb71e37002c288ebf3b23cf78) by [@rozele](https://github.com/rozele)) - -#### Android specific - -- Added DoNotStripAny proguard rules ([48318b1542](https://github.com/facebook/react-native/commit/48318b1542910b939ab977c0bc82e98f098abe50) by [@ShikaSD](https://github.com/ShikaSD)) -- Add new API in ScrollView and HorizontalScrollView to process pointerEvents prop. ([48f6967ae8](https://github.com/facebook/react-native/commit/48f6967ae88100110160e1faf03e6c0d37e404bd) by [@ryancat](https://github.com/ryancat)) -- Add `accessibilityLabelledBy` props ([36037fa81b](https://github.com/facebook/react-native/commit/36037fa81bbdcc460057e7e7cf608cd364ca48a6) by [@grgr-dkrk](https://github.com/grgr-dkrk)) -- Added missing constructor to WritableNativeArray ([c68c47d2ba](https://github.com/facebook/react-native/commit/c68c47d2bafa8e8e25b534d6cdd1a63bc77a1cf4) by [@piaskowyk](https://github.com/piaskowyk)) -- Add new API for custom fling animator to provide predicted travel distance for its fling animation. ([fe6277a30d](https://github.com/facebook/react-native/commit/fe6277a30d3ec19e4772991e30ae20c3a9cfe565) by [@ryancat](https://github.com/ryancat)) -- Adding new API `onChildEndedNativeGesture` to the RootView interface to let its implementations notify the JS side that a child gesture is ended. ([9b33c31ee0](https://github.com/facebook/react-native/commit/9b33c31ee024bae30e441107f838e1b5044525ba) by [@ryancat](https://github.com/ryancat)) -- Make the `reactNativeArchitectures` property more discoverable ([0f39a1076d](https://github.com/facebook/react-native/commit/0f39a1076dc154995a2db79352adc36452f46210) by [@cortinico](https://github.com/cortinico)) -- Added `isAccessibilityServiceEnabled` to get if accessibility services are enabled ([c8b83d4e0b](https://github.com/facebook/react-native/commit/c8b83d4e0b33c2af45093f7b2262ee578ece2faf) by [@grgr-dkrk](https://github.com/grgr-dkrk)) -- Add bundleForVariant option ([d2c10da5d5](https://github.com/facebook/react-native/commit/d2c10da5d5687833545691f281473381e4466c2e) by [@grit96](https://github.com/grit96)) -- Add ACCEPT_HANDOVER, ACTIVITY_RECOGNITION, ANSWER_PHONE_CALLS, READ_PHONE_NUMBERS & UWB_RANGING to PermissionsAndroid ([4b25a0aaa0](https://github.com/facebook/react-native/commit/4b25a0aaa077caf9c437bcfeef8a226eda5a102e) by [@iBotPeaches](https://github.com/iBotPeaches)) - -#### iOS specific - -- Add new argument to announceForAccessibility to allow queueing on iOS ([4d1357918a](https://github.com/facebook/react-native/commit/4d1357918a4dcb331ccea2140699f487ca45ea30) by [@peterc1731](https://github.com/peterc1731)) -- Add volta support to find-node.sh ([765844055b](https://github.com/facebook/react-native/commit/765844055ba0d02262a11114bad5da67e935d8df) by [@liamjones](https://github.com/liamjones)) -- Support fnm when detecting node binary ([c9e4d34885](https://github.com/facebook/react-native/commit/c9e4d3488578d65e55198ad597252a2ac8cc5f73) by [@MoOx](https://github.com/MoOx)) -- Find-node.sh now respects .nvmrc ([35bcf934b1](https://github.com/facebook/react-native/commit/35bcf934b186e581d100d43e563044300759557f) by [@igrayson](https://github.com/igrayson)) -- Add macros to be able to stub C functions in tests ([749a9207b6](https://github.com/facebook/react-native/commit/749a9207b6f0545c03ca83efbda7971ffd4d2d57) by [@philIip](https://github.com/philIip)) - - -### Changed - -- Bump RN CLI to v7.0.3, and Metro to 67 ([848ba6fb1d](https://github.com/facebook/react-native/commit/848ba6fb1db81bbb44efd373af9e81f31f227aef) by [@kelset](https://github.com/kelset)) and ([df2e934a69](https://github.com/facebook/react-native/commit/df2e934a697b5b207053db3bbcf71492932a6062) by [@kelset](https://github.com/kelset)) -- Upgraded react-devtools-core dependency to 4.23.0 ([1cc217d5ef](https://github.com/facebook/react-native/commit/1cc217d5effdbee4cf2f64063a443ecb331673d4) by [@bvaughn](https://github.com/bvaughn)) -- Bump Flipper to 0.125.0 ([50057158ca](https://github.com/facebook/react-native/commit/50057158ca32842d70160541e3cb5d4bd512f8f5) by [@cortinico](https://github.com/cortinico)) -- Export Flow type for deceleration rate for use in other files to keep deceleration rate prop values consistently typed ([9b0ed920ef](https://github.com/facebook/react-native/commit/9b0ed920ef087c4c18504adacf9d4f557812cf1b)) -- Upgrade deprecated-react-native-prop-types dependency ([badd30885f](https://github.com/facebook/react-native/commit/badd30885fb999124b6b54b3fb016edbd988c16b) by [@chiaramooney](https://github.com/chiaramooney)) -- Improved error message in react.gradle ([7366a866b3](https://github.com/facebook/react-native/commit/7366a866b381db6fc5615153e7788aa4828cfd96) by [@vonovak](https://github.com/vonovak)) -- Upgraded packages to the latest versions for ESLint v7. ([cf763cdf81](https://github.com/facebook/react-native/commit/cf763cdf816e1cad20caf2347c54bc96c7f6dd47) by [@yungsters](https://github.com/yungsters)) -- Updated the links for the discussions and changelog ([daf37a1fce](https://github.com/facebook/react-native/commit/daf37a1fce43403e6320e1e3023e86fd1b970bdf) by [@MikeyAlmighty](https://github.com/MikeyAlmighty)) -- XMLHttpRequest.getAllResponseHeaders() now returns headers with names lowercased and sorted in ascending order, as per specification ([b2415c4866](https://github.com/facebook/react-native/commit/b2415c48669391ee1ab7c6450748c4d91097a666) by [@ascherkus](https://github.com/ascherkus)) -- Bump react-native-codegen to 0.0.9 ([e3a71b019f](https://github.com/facebook/react-native/commit/e3a71b019fa78e2b4b3454ccc59ea9c8cc543b29) by [@cortinico](https://github.com/cortinico)) -- Accessing `Image.propTypes`, `Text.propTypes`, `TextInput.propTypes`, `ColorPropType`, `EdgeInsetsPropType`, `PointPropType`, or `ViewPropTypes` now emits a deprecation warning. ([3f629049ba](https://github.com/facebook/react-native/commit/3f629049ba9773793978cf9093c7a71af15e3e8d) by [@yungsters](https://github.com/yungsters)) -- Bump `core-workflow-apply-version-label` version ([e973b3afc2](https://github.com/facebook/react-native/commit/e973b3afc274f892a0e5a6fdea9004dc5d84eb2b) by [@lucasbento](https://github.com/lucasbento)) -- Add `vendor/bundle` into .gitignore template ([2f67f5d68b](https://github.com/facebook/react-native/commit/2f67f5d68b17010c49f2996a788fe68c1fe2e9f6) by [@MoOx](https://github.com/MoOx)) - -#### Android specific - -- Add allowsEdgeAntialiasing on views with rotations or skew transforms ([e6a3410afe](https://github.com/facebook/react-native/commit/e6a3410afe7d9a4cecf3db0a95503d2ff05bb862)) -- Bump Kotlin version to 1.6.10 ([d0f0234656](https://github.com/facebook/react-native/commit/d0f0234656dc981b422d1e9aa0885afd5fd29879) by [@AKB48](https://github.com/AKB48)) -- Bump Soloader to 0.10.3 ([f45889ef95](https://github.com/facebook/react-native/commit/f45889ef95ec694520e91b0032e591a087e088e5) by [@osartun](https://github.com/osartun)) -- Bump Gradle to 7.3 ([c180627ac7](https://github.com/facebook/react-native/commit/c180627ac7e5e155707b3c9433c4582839e1820e) by [@dulmandakh](https://github.com/dulmandakh)) -- Bump Android compile and target SDK to 31 ([00ac034353](https://github.com/facebook/react-native/commit/00ac034353cbc867991bf79cb1dd103353f47126) by [@ShikaSD](https://github.com/ShikaSD)) -- Use side-by-side NDK for Android ([bd7caa64f5](https://github.com/facebook/react-native/commit/bd7caa64f5d6ee5ea9484e92c3629c9ce711f73c) by [@cortinico](https://github.com/cortinico)) -- Leverage Gradle implicit dependency substitution for Gradle Plugin ([0fccbd53af](https://github.com/facebook/react-native/commit/0fccbd53af86083a8742a33282dc183d07eb27a2) by [@cortinico](https://github.com/cortinico)) -- Remove unused import of JMessageQueueThread.h ([705236e363](https://github.com/facebook/react-native/commit/705236e3637e4f80e5fa4bd7234df9f1e14a5d3d) by [@sshic](https://github.com/sshic)) -- Made `MessageQueueThread#runOnQueue` return a boolean. Made `MessageQueueThreadImpl#runOnQueue` return false when the runnable is not submitted. ([89faf0c9a8](https://github.com/facebook/react-native/commit/89faf0c9a87f6de68ca416d10566dbcbe80d9450)) -- Assume *.ktx assets are packaged as Android drawables ([cb610ddca7](https://github.com/facebook/react-native/commit/cb610ddca79fe29b88568545ab011671fc392c9a) by [@motiz88](https://github.com/motiz88)) -- Add ViewConfigs to support onEnter/onExit/onMove events ([44143b50fd](https://github.com/facebook/react-native/commit/44143b50fdcafe22caa43d76ec3210132ce3af21) by [@mdvacca](https://github.com/mdvacca)) -- Let react_native_assert really abort the app ([2ae06df58f](https://github.com/facebook/react-native/commit/2ae06df58f5f5eaf4386c14d28af25b643401bf3) by [@cortinico](https://github.com/cortinico)) -- Bugfix for multiple shadow threads rendered at the same time, small probability crash. ([9d71b166a6](https://github.com/facebook/react-native/commit/9d71b166a6c9d9afec7186c6a33aedc6975aa43c) by [@chenmo187](https://github.com/chenmo187)) -- RootView's onChildStartedNativeGesture now takes the child view as its first argument ([03e513de41](https://github.com/facebook/react-native/commit/03e513de41bf60f071eacbbb9604c83605abf625) by [@javache](https://github.com/javache)) -- Add ReactInstanceEventListenerV2 for migration ([ce74aa4ed3](https://github.com/facebook/react-native/commit/ce74aa4ed335d4c36ce722d47937b582045e05c4) by [@sshic](https://github.com/sshic)) -- Improved logic of findTargetPathAndCoordinatesForTouch ([dfe42d6b75](https://github.com/facebook/react-native/commit/dfe42d6b75005f519c0e2c87c75e7886dce3345c) by [@javache](https://github.com/javache)) -- Set a resolution strategy for com.facebook.react:react-native when on New Architecture ([e695bc0bb5](https://github.com/facebook/react-native/commit/e695bc0bb50fc1c712e9862ed8fe4e7cc6619fae) by [@cortinico](https://github.com/cortinico)) -- Make hermes-executor-common a static lib ([b2cf24f41c](https://github.com/facebook/react-native/commit/b2cf24f41cb5f15653b34d396ef2a1c90defdf43) by [@janicduplessis](https://github.com/janicduplessis)) -- Static link for hermes-inspector ([20b0eba581](https://github.com/facebook/react-native/commit/20b0eba581a00e5e7e300f6377379b836617c147) by [@janicduplessis](https://github.com/janicduplessis)) - -#### iOS specific - -- Don't capitalize the first letter of a word that is starting by a number ([8b5a5d4645](https://github.com/facebook/react-native/commit/8b5a5d4645136ef3d6ee043348e583cbbac87ee3) by [@MaeIg](https://github.com/MaeIg)) -- updated `jsBundleURLForBundleRoot:fallbackResource` to `jsBundleURLForBundleRoot:` ([aef843bfe6](https://github.com/facebook/react-native/commit/aef843bfe60bda6bcc98d3fb4a6c295c9f4b66e3) by [@philIip](https://github.com/philIip)) -- Remove iOS 11 availability check ([9b059b6709](https://github.com/facebook/react-native/commit/9b059b67092f4e7d568867a2b3a51dfd7c6f1db6) by [@ken0nek](https://github.com/ken0nek)) -- Refactor: Assign string label to each case in RCTPLTag enum for startup performance logging ([60e60a9b3d](https://github.com/facebook/react-native/commit/60e60a9b3d42d342eaf5ddee4841b121f6474a6c) by [@p-sun](https://github.com/p-sun)) -- IOS Ruby Updates ([1e6add1a43](https://github.com/facebook/react-native/commit/1e6add1a43355bb88c57400a7420a656966bef97) by [@barbieri](https://github.com/barbieri)) -- Update Flipper pods to support re-enable macCatalyst ([2a5265dff7](https://github.com/facebook/react-native/commit/2a5265dff7e654f57b43335804840692313f2a56) by [@mikehardy](https://github.com/mikehardy)) -- Apple Silicon builds of glog & Flipper-Glog ([274c617f5b](https://github.com/facebook/react-native/commit/274c617f5bda263ff29115b3dcc013e47085a78d) by [@rayzr522](https://github.com/rayzr522)) - -### Fixed - -- Fix error "mockModal is not a function" ([507b05f4c0](https://github.com/facebook/react-native/commit/507b05f4c02b46109f483a2b79c924a775fd7bd3) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) -- Fixes execution of animation when a toValue of AnimatedValue is used. ([8858c21124](https://github.com/facebook/react-native/commit/8858c2112421be5212c024f9e404e66437a41389)) -- Fix RN version syntax to match new nightly build structure. ([3d1d4ee457](https://github.com/facebook/react-native/commit/3d1d4ee4572600425b8eb5d0d6512bb0d2a6ea44) by [@chiaramooney](https://github.com/chiaramooney)) -- Fix typo in _updateBottomIfNecessary function on KeyboardAvoidingView component ([0cc80b4d0c](https://github.com/facebook/react-native/commit/0cc80b4d0cb78a835977dbe5100262a16882bbea) by [@gabrieldonadel](https://github.com/gabrieldonadel)) -- Fix: Removes interface only check from third party components GenerateThirdPartyFabricComponentsProvider ([3e6902244a](https://github.com/facebook/react-native/commit/3e6902244a0d189261dbbe327296db1349e37410) by [@Ubax](https://github.com/Ubax)) -- Set CxxModules' Instance before retrieving their Method vector. ([1d45b20b6c](https://github.com/facebook/react-native/commit/1d45b20b6c6ba66df0485cdb9be36463d96cf182) by [@JunielKatarn](https://github.com/JunielKatarn)) -- AnimatedValue.__detach should store getValue result with offset deducted ([fe53cae954](https://github.com/facebook/react-native/commit/fe53cae954b37528eeaa1258ac0060c4298473bb) by [@rozele](https://github.com/rozele)) -- AnimatedValue.stopAnimation callback with correct value for NativeAnimated ([8ba771c3dd](https://github.com/facebook/react-native/commit/8ba771c3ddc00b1499e95a2812b4cd5ac904c8df) by [@rozele](https://github.com/rozele)) -- ESLint no-undef rule clashing with TypeScript compiler for TS files ([ae67c5ac45](https://github.com/facebook/react-native/commit/ae67c5ac45a8044fc1db66aee8eae6e881d660e4) by [@fiznool](https://github.com/fiznool)) -- ESLint `no-shadow` rule returning false positive for TypeScript enums ([722a0ff6f8](https://github.com/facebook/react-native/commit/722a0ff6f88bed4d54579a2b8bc574e87948187f) by [@fiznool](https://github.com/fiznool)) -- Fix support for custom port ([b399c2e3d1](https://github.com/facebook/react-native/commit/b399c2e3d10fa521dbec87243d3e96f6bca7df1e) by [@enniel](https://github.com/enniel)) -- `onLayout` prop is handled correctly in `` ([9c5e177a79](https://github.com/facebook/react-native/commit/9c5e177a79c64c77f281ce727538973e8222e975)) -- Modal accepts a testID but didn't forward it to RCTModalHostView, therefore not making it show up for e2e tests depending on viewhierarchy. ([5050e7eaa1](https://github.com/facebook/react-native/commit/5050e7eaa17cb417baf7c20eb5c4406cce6790a5) by [@GijsWeterings](https://github.com/GijsWeterings)) -- Remove unused and incorrect type declarations in WebSocketInterceptor ([91728e2266](https://github.com/facebook/react-native/commit/91728e2266375b954302ba0cd4b5daf641aefc23) by [@mischnic](https://github.com/mischnic)) -- Complete missing Flow declarations in URL ([98abf1b02f](https://github.com/facebook/react-native/commit/98abf1b02f64ad40d523335e677a2ede15b3650d) by [@mischnic](https://github.com/mischnic)) -- Pressable not passing hover props and event handlers to PressabilityConfig ([1b30dd074b](https://github.com/facebook/react-native/commit/1b30dd074b579c2ae138a1111d07ddb56761315d) by [@Saadnajmi](https://github.com/Saadnajmi)) -- Composite animations will now be ran immediately when the app is in testing mode ([b03e824c52](https://github.com/facebook/react-native/commit/b03e824c52123219a5c8fbd89473391bf0bc31c8) by [@javache](https://github.com/javache)) -- Remove duplicate class members ([c0e489b729](https://github.com/facebook/react-native/commit/c0e489b7293f15858cb706f1b8587600e429af28) by [@bradzacher](https://github.com/bradzacher)) -- Fix: Use same implementation for `performance.now()` on iOS and Android ([1721efb54f](https://github.com/facebook/react-native/commit/1721efb54ff9cc4f577b5ae27f13fcf56801a92c) by [@mrousavy](https://github.com/mrousavy)) - -#### Android specific - -- Enable cliPath to have an absolute path value ([5d560ca99f](https://github.com/facebook/react-native/commit/5d560ca99ff7220de11d2d76dbe77d73990894a8) by [@Krisztiaan](https://github.com/Krisztiaan)) -- Make sure configureNdkBuild* tasks are depending on preBuild ([2fdbf6a10f](https://github.com/facebook/react-native/commit/2fdbf6a10fe67fa3209a51a1105a97c16991f561) by [@cortinico](https://github.com/cortinico)) -- Added a null check to native.value in Switch to fix https://github.com/facebook/react-native/issues/32594 ([8d50bf1133](https://github.com/facebook/react-native/commit/8d50bf113352a6ccdf74c979e1022c6c2ccf6e56) by [@jonathanmos](https://github.com/jonathanmos)) -- Fix overflowInset calculation by using transform values ([8aa87814f6](https://github.com/facebook/react-native/commit/8aa87814f62e42741ebb01994796625473c1310f) by [@ryancat](https://github.com/ryancat)) -- Add missing sources jar into published android artifacts ([384e1a0c7b](https://github.com/facebook/react-native/commit/384e1a0c7bc50d2aab5b59bcedcea5a3e98f1659) by [@Kudo](https://github.com/Kudo)) -- Fix math for detecting if children views are in parent's overflowInset area. ([45244ebce2](https://github.com/facebook/react-native/commit/45244ebce228dfbc3412670e64c11491ba8d8c47) by [@ryancat](https://github.com/ryancat)) -- Fixed empty screen after retrying a BundleDownloader failure in dev mode ([c8d823b9bd](https://github.com/facebook/react-native/commit/c8d823b9bd9619dfa1f5851af003cc24ba2e8830) by [@samkline](https://github.com/samkline)) -- Fix crash from ScrollView that occurs while reporting an error from JS ([2151d11527](https://github.com/facebook/react-native/commit/2151d1152719a230565165f1a8dcfab172689eb3) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Enable hitSlop to be set using a single number. ([589b129581](https://github.com/facebook/react-native/commit/589b129581903a737a64e14eab3f2e29620831d5) by [@javache](https://github.com/javache)) -- Fix fling and snap with recycler viewgroup where fling to the end of scrollable distance when it goes over current rendered children views. ([ead7b97944](https://github.com/facebook/react-native/commit/ead7b97944522e3066ceb2bd50c63c268c961277) by [@ryancat](https://github.com/ryancat)) -- Fixed edge case for quick small scrolls causing unexpected scrolling behaviors. ([f70018b375](https://github.com/facebook/react-native/commit/f70018b37532622f08f20b2c51cdbfca55d730ea) by [@ryancat](https://github.com/ryancat)) -- Fix crash on ReactEditText with AppCompat 1.4.0 ([e21f8ec349](https://github.com/facebook/react-native/commit/e21f8ec34984551f87a306672160cc88e67e4793) by [@cortinico](https://github.com/cortinico)) -- Do not .lowerCase the library name when codegenerating TurboModule Specs ([28aeb7b865](https://github.com/facebook/react-native/commit/28aeb7b8659b38ee3a27fae213c4d0800f4d7e31) by [@cortinico](https://github.com/cortinico)) -- Enable hitSlop to be set using a single number. ([a96bdb7154](https://github.com/facebook/react-native/commit/a96bdb7154b0d8c7f43977d8a583e8d2cbdcb795) by [@javache](https://github.com/javache)) -- Updated TextInput prop types to accomodate for new autoComplete values ([9eb0881c8f](https://github.com/facebook/react-native/commit/9eb0881c8fecd0e974b1cb9f479bad3075854340) by [@TheWirv](https://github.com/TheWirv)) -- Don't reconstruct app components https://github.com/facebook/react-native/issues/25040 ([fc962c9b6c](https://github.com/facebook/react-native/commit/fc962c9b6c4bf9f88decbe014ab9a9d5c1cf51bc) by [@Somena1](https://github.com/Somena1)) -- Do NOT skip the first child view in the scroll view group when measuring the lower and upper bounds for snapping. ([61e1b6f86c](https://github.com/facebook/react-native/commit/61e1b6f86cf98d8a74eeb9353143fe0c624fe6e6) by [@ryancat](https://github.com/ryancat)) -- Fix crash when a Switch is initialised with both backgroundColor and thumbColor. ([456cf3db14](https://github.com/facebook/react-native/commit/456cf3db14c443c483d63aa97c88b45ffd25799b) by [@smarki](https://github.com/smarki)) -- Fix devDisabledIn not working with multiple productFlavors ([055ea9c7b7](https://github.com/facebook/react-native/commit/055ea9c7b7dea030ef16da72d1f6ecb5d95ac468) by [@grit96](https://github.com/grit96)) -- Revert `ReactScrollView` to use `Context` instead of `ReactContext` in the constructor to be less restrictive. ([7b77cc637e](https://github.com/facebook/react-native/commit/7b77cc637e1faf4a2b134853f8415f277d0decdc) by [@ryancat](https://github.com/ryancat)) -- Fix onPress event for nested Text in RN Android ([e494e4beb6](https://github.com/facebook/react-native/commit/e494e4beb6a124008fd116178cbc38335bd87809) by [@mdvacca](https://github.com/mdvacca)) -- Fix enableVmCleanup not working for apps with product flavors ([a2b5e4cd82](https://github.com/facebook/react-native/commit/a2b5e4cd825a358419cef1e3823b72215b689686) by [@cortinico](https://github.com/cortinico)) -- Prevent NPE on ThemedReactContext ([f1b5fe1d3e](https://github.com/facebook/react-native/commit/f1b5fe1d3ea49294d8c89accfa27d76a1a97ccea) by [@sshic](https://github.com/sshic)) -- fix: jvm 11 error message from ReactPlugin.kt and react.gradle ([4e947ecb2d](https://github.com/facebook/react-native/commit/4e947ecb2dabfa0226af7f859c828847b4d891c0) by [@nomi9995](https://github.com/nomi9995)) - -#### iOS specific - -- ScrollView: Respect `contentInset` when animating new items with `autoscrollToTopThreshold`, make `automaticallyAdjustKeyboardInsets` work with `autoscrollToTopThreshold` (includes vertical, vertical-inverted, horizontal and horizontal-inverted ScrollViews) ([49a1460a37](https://github.com/facebook/react-native/commit/49a1460a379e3a71358fb38888477ce6ea17e81a) by [@mrousavy](https://github.com/mrousavy)) -- Prevent RCTConvert error for allowed null blob types ([e1b698c5f2](https://github.com/facebook/react-native/commit/e1b698c5f2b1d689fb3940f8c6a3e298d381ea3a) by [@habovh](https://github.com/habovh)) -- Migrate ScreenshotManager from NativeModule to TurboModule ([b13e41d98e](https://github.com/facebook/react-native/commit/b13e41d98e818279d1941f3425707d3c0ce407fc) by [@p-sun](https://github.com/p-sun)) -- Fix usage of cocoapods with --project-directory flag and new arch ([9e7d91f2fc](https://github.com/facebook/react-native/commit/9e7d91f2fc4d576b8fba81304a24e50134da93d6) by [@danilobuerger](https://github.com/danilobuerger)) -- Post RCTContentDidAppearNotification with new arch ([75105e692c](https://github.com/facebook/react-native/commit/75105e692c2be9bd192089a6a6ffde7572ee1ce1) by [@danilobuerger](https://github.com/danilobuerger)) -- Remove absolute paths from pods project ([42b01a32a1](https://github.com/facebook/react-native/commit/42b01a32a137f18ae9fd2f00914f2edb0e107421) by [@danilobuerger](https://github.com/danilobuerger)) -- Respect RCTSetDefaultFontHandler chosen font ([89efa1a0c1](https://github.com/facebook/react-native/commit/89efa1a0c1b633bf9edee66583800ad3fc54ce63) by [@danilobuerger](https://github.com/danilobuerger)) -- Fixed duplicated UUIDs problem during pod install phase. ([f595a4e681](https://github.com/facebook/react-native/commit/f595a4e681e75aaf737b6582f69855d76a1f33dd)) -- Fix `Time.h` patch not being applied when running `pod install --project-directory=ios` ([60cef850bd](https://github.com/facebook/react-native/commit/60cef850bd3fd12c32ee1196bd19a559592d1465) by [@tido64](https://github.com/tido64)) -- Fix WebSocket control frames having payloads longer than 125 bytes ([86db62b7a8](https://github.com/facebook/react-native/commit/86db62b7a8b28ac82dd0a0627a8b6c351875f682) by [@asmeikal](https://github.com/asmeikal)) -- Stop RedBox from appearing for LogBox handled errors ([9d2df5b8ae](https://github.com/facebook/react-native/commit/9d2df5b8ae95b3cfeae26f64bd1d50bd2b0bbae9) by [@liamjones](https://github.com/liamjones)) -- Enable hitSlop to be set using a single number. ([3addafa525](https://github.com/facebook/react-native/commit/3addafa5257ade685216900bebbad8c35e24e124) by [@javache](https://github.com/javache)) -- Fix `__apply_Xcode_12_5_M1_post_install_workaround` failing when one of the Pods has no IPHONEOS_DEPLOYMENT_TARGET set ([9cd4092336](https://github.com/facebook/react-native/commit/9cd40923362ff717a722f8f36c8250a29a5142b7) by [@Yonom](https://github.com/Yonom)) -- This is a quick speculative fix since we know `CFRunLoopPerformBlock` does not push/pop an autorelease pool. ([3fff164dfa](https://github.com/facebook/react-native/commit/3fff164dfa1c97f69b1701e974effc92a94152d6) by [@christophpurrer](https://github.com/christophpurrer)) -- Fixed RCTImageLoaderTests ([1542f83527](https://github.com/facebook/react-native/commit/1542f835273c08776b960929b5aa7cefbd225971) by [@philIip](https://github.com/philIip)) -- Fix Rosetta2 CocoaPods warning on Apple Silicon ([e918362be3](https://github.com/facebook/react-native/commit/e918362be3cb03ae9dee3b8d50a240c599f6723f) by [@oblador](https://github.com/oblador)) -- Fix `pod install --project-directory=ios` failing due to wrong path to `React-Codegen` ([ebb26cf2e4](https://github.com/facebook/react-native/commit/ebb26cf2e420616c8bf01a5148ca4f8419b238d3) by [@tido64](https://github.com/tido64)) - -### Deprecated - -#### Android specific - -- Gradle: Deprecate `reactRoot` in favor of `root` and `reactNativeDir` ([8bc324fd34](https://github.com/facebook/react-native/commit/8bc324fd34337ab159e2e21e213a6c5b06c548da) by [@cortinico](https://github.com/cortinico)) - - -### Removed - -- DeprecatedPropTypes (deep-link) modules removed from React Native. ([23717c6381](https://github.com/facebook/react-native/commit/23717c6381a41b1c5f189376bfa5bc73c7a4da87) by [@yungsters](https://github.com/yungsters)) -- `accessibilityStates` no longer passed through to RCTView. ([1121ed94ab](https://github.com/facebook/react-native/commit/1121ed94ab470be27207b0c8dbae5d19860c08da) by [@luism3861](https://github.com/luism3861)) - -#### iOS specific - -- Remove RCTUIManagerObserver from RCTNativeAnimatedTurboModule ([e9ed115bab](https://github.com/facebook/react-native/commit/e9ed115babbc82968380dae22fa928d4ce3cd6da) by [@p-sun](https://github.com/p-sun)) - -## v0.67.5 - -🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). - -### Fixed - -- Force dependencies resolution to minor series for 0.67 ([9f2acda1b8](https://github.com/facebook/react-native/commit/9f2acda1b807e790b3e7562ce3436b93bcc2ad09) by [@cortinico](https://github.com/cortinico)) - -## v0.67.4 - -### Fixed - -#### Android specific - -- Added a null check to native.value in Switch to fix https://github.com/facebook/react-native/issues/32594 ([8d50bf1133](https://github.com/facebook/react-native/commit/8d50bf113352a6ccdf74c979e1022c6c2ccf6e56) by [@jonathanmos](https://github.com/jonathanmos)) - -## v0.67.3 - -### Fixed - -#### Android specific - -- Text with adjustsFontSizeToFit changes the text layout infinitely ([c1db41f060](https://github.com/facebook/react-native/commit/c1db41f060908e6ab001aaace7c20c610056f59a)) - -#### iOS specific - -- Fix a broken input for the Korean alphabet in TextInput ([1a83dc36ce](https://github.com/facebook/react-native/commit/1a83dc36ce0af33ac7a3c311354fce4bfa5ba1a3) by [@bernard-kms](https://github.com/bernard-kms)) - -## v0.67.2 - -### Fixed - -- Fix error "mockModal is not a function" ([507b05f4c0](https://github.com/facebook/react-native/commit/507b05f4c02b46109f483a2b79c924a775fd7bd3) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) - -#### Android specific - -- Fix potential crash if ReactRootView does not have insets attached. ([6239e2f5ce](https://github.com/facebook/react-native/commit/6239e2f5ce82f7c2e683eb4699b9ce3ff1b58ac5) by [@enahum](https://github.com/enahum)) -- Upgrading OkHttp from 4.9.1 to 4.9.2 to fix CVE-2021-0341. ([e896d21](https://github.com/facebook/react-native/commit/e896d21ced3c0c917c2fc0044d2b93b44df9a081) by [@owjsub](https://github.com/owjsub)) - -#### iOS specific - -- Fix `Time.h` patch not being applied when running `pod install --project-directory=ios` ([60cef850bd](https://github.com/facebook/react-native/commit/60cef850bd3fd12c32ee1196bd19a559592d1465) by [@tido64](https://github.com/tido64)) -- Find-node.sh now respects .nvmrc ([35bcf934b1](https://github.com/facebook/react-native/commit/35bcf934b186e581d100d43e563044300759557f) by [@igrayson](https://github.com/igrayson)) - -## v0.67.1 - -### Fixed - -#### Android specific - -- Do not remove libjscexecutor.so from release builds ([574a773f8f](https://github.com/facebook/react-native/commit/574a773f8f55fe7808fbb672066be8174c64d76d) by [@cortinico](https://github.com/cortinico)) - -#### iOS specific - -- Remove alert's window when call to `hide`. ([a46a99e120](https://github.com/facebook/react-native/commit/a46a99e12039c2b92651af1996489d660e237f1b) by [@asafkorem](https://github.com/asafkorem)) - -## v0.67.0 - -### Added - -#### Android specific -- Add `ACCESS_MEDIA_LOCATION` permission to PermisionsAndroid library. ([79db483568](https://github.com/facebook/react-native/commit/79db4835681f5d0149620ec8e0990411cb882241) by [@Skrilltrax](https://github.com/Skrilltrax)) -- Implement `SnapToAlignment` in `ReactScrollView` ([e774c037bc](https://github.com/facebook/react-native/commit/e774c037bce40a4b48e78d2d0a1085a1e4f5a328)), `ReactScrollViewManager` ([c6e5640e87](https://github.com/facebook/react-native/commit/c6e5640e87e7cb5b514ded2c8d4cbb039bd02c5f)), `ReactHorizontalScrollView` ([b12256394e](https://github.com/facebook/react-native/commit/b12256394e34c375942ca508ef79a8c816317976)), `ReactHorizontalScrollViewManager` ([deec1db9fd](https://github.com/facebook/react-native/commit/deec1db9fdf2848941326ba5bebc11f3592a301e)) and update `ScrollView.js` ([a54cfb9e57](https://github.com/facebook/react-native/commit/a54cfb9e5794f196d3834e19762f3aacf47a177d)) and reach parity with iOS ([04184ef851](https://github.com/facebook/react-native/commit/04184ef851c71141009c523ba59838ae6af19ba5)) by [@mdvacca](https://github.com/mdvacca) -- Show Redbox for C++ errors. ([d6c879edba](https://github.com/facebook/react-native/commit/d6c879edbad068d0f461381875b7fae6db99d18d) by [@sota000](https://github.com/sota000)) -- Added an experimental touch dispatch path ([a2feaeb5f1](https://github.com/facebook/react-native/commit/a2feaeb5f1121a860a9416b5d4e0e96debd45b09) by [@ShikaSD](https://github.com/ShikaSD)) - -#### iOS specific -- Added `cancelButtonTintColor` prop for `ActionSheetIOS` to change only the text color of the cancel button ([01856633a1](https://github.com/facebook/react-native/commit/01856633a1d42ed3b26e7cc93a007d7948e1f76e) by [@nomi9995](https://github.com/nomi9995)) -- Added [`LSApplicationQueriesSchemes`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW14) in info.plist with entries tel, telprompt, http, fb, geo ([b26f277262](https://github.com/facebook/react-native/commit/b26f2772624c863c91fa1ff627b481c92d7562fb) by [@utkarsh-dixit](https://github.com/utkarsh-dixit)) -- Add `UIAccessibilityTraitUpdatesFrequently` to progressBar role ([1a42bd6e97](https://github.com/facebook/react-native/commit/1a42bd6e97ae44a3b38ca552865bac63a6f35da5) by [@jimmy623](https://github.com/jimmy623)) -- Add `asdf-vm` support in `find-node.sh` ([3e7c310b1d](https://github.com/facebook/react-native/commit/3e7c310b1dcf5643920535eea70afa451888792a) by [@pastleo](https://github.com/pastleo)) - - -### Changed -- `ImageBackground` now respects `imageStyle` width and height ([dbd5c3d8e5](https://github.com/facebook/react-native/commit/dbd5c3d8e5e35685be89156194a96cead553a330) by [@Naturalclar](https://github.com/Naturalclar)) -- Rename deprecated `Keyboard.removeEventListener` to `Keyboard.removeListener`. ([8880c09076](https://github.com/facebook/react-native/commit/8880c09076e4727768ace26a74766cbe6f64021c) by [@yungsters](https://github.com/yungsters)) -- Update `Modal`'s mock to not render its children when it is not visible ([ec614c16b3](https://github.com/facebook/react-native/commit/ec614c16b331bf3f793fda5780fa273d181a8492) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) -- Upgraded `react-devtools-core` dependency to 4.19.1 ([356236471a](https://github.com/facebook/react-native/commit/356236471abc6b5b8c139223e15388fd1eecd2d1) by [@jstejada](https://github.com/jstejada)) -- React-native/normalize-color now supports Node.js ([65e58f26e1](https://github.com/facebook/react-native/commit/65e58f26e1fbd06b1ae32e2ab3a2616c8eef08e0) by [@yungsters](https://github.com/yungsters)) -- Updated to Contributor Covenant v2.1 ([19f8d2f7da](https://github.com/facebook/react-native/commit/19f8d2f7da13f4524f31acf7aa10cc0aa91b5da4)) - - -#### Android specific -- Hermes initialization will no longer need an explicit configuration. ([a40f973f58](https://github.com/facebook/react-native/commit/a40f973f58609ca717fac63bc501d5cf93b748ad) by [@Ashoat](https://github.com/Ashoat)) -- Setting `overflow: scroll` in View component style will clip the children in the View container ([93beb83abe](https://github.com/facebook/react-native/commit/93beb83abef42b92db43ee3bb8b156f486a6c00f) by [@ryancat](https://github.com/ryancat)) -- Native views backing `Animated.View` (w/ JavaScript-driven animations) will no longer be flattened; this should be a transparent change. ([4fdbc44ab5](https://github.com/facebook/react-native/commit/4fdbc44ab5945399338e4ed94ea5611098bd2142) by [@yungsters](https://github.com/yungsters)) -- Use new Locale API on Android 11 (API 30)+ ([b7c023a8c1](https://github.com/facebook/react-native/commit/b7c023a8c1122500c6ceb7de2547569b3b9251ba)) -- Changed `react.gradle` `detectCliPath` function logic for `cliPath` case ([ce51b62494](https://github.com/facebook/react-native/commit/ce51b6249449361ee50b8c99a427c28af7ab3531) by [@vitalyiegorov](https://github.com/vitalyiegorov)) -- Remove `"high"` and `"balanced"` as values for `android_hyphenationFrequency` on `Text` ([a0d30b848a](https://github.com/facebook/react-native/commit/a0d30b848a07480d0fccec608a62a505c71f8cac)) -- Bump Gradle version to 7.2, Bump Kotlin version to 1.5.31 ([9ae3367431](https://github.com/facebook/react-native/commit/9ae3367431428748f5486c782199beb4f9c6b477) by [@svbutko](https://github.com/svbutko)) -- Move mavenCentral repo below local paths ([046b02628d](https://github.com/facebook/react-native/commit/046b02628d32eadd6d44160ab79932f6c26b188d) by [@friederbluemle](https://github.com/friederbluemle)) - -#### iOS specific -- Optimized font handling for iOS ([4ac42d88ef](https://github.com/facebook/react-native/commit/4ac42d88ef60ae3fed7319851d47b93e98ac9afa) by [@Adlai-Holler](https://github.com/Adlai-Holler)) -- Remove iOS 11 version check as minimum deployment is iOS 11 ([398595e074](https://github.com/facebook/react-native/commit/398595e07483fa8f45579de4ca1aee9585e20620) by [@ken0nek](https://github.com/ken0nek)) -- Don't hang app for 60s if packager can't be reached, changed to 10s ([c0e04460f5](https://github.com/facebook/react-native/commit/c0e04460f546dfef2623bff367eb8db8fd75fa34) by [@radex](https://github.com/radex)) - -### Removed - -- Removed unnecessary global variable `GLOBAL`. ([a101fc768c](https://github.com/facebook/react-native/commit/a101fc768cedc7ac9754006e5b7292bb7084ab54) by [@rubennorte](https://github.com/rubennorte)) -- Removed unused files: `StaticContainer.react.js`, `ensurePositiveDelayProps.js`, `InteractionMixin.js`, `queryLayoutByID.js` ([64aa1e5ffe](https://github.com/facebook/react-native/commit/64aa1e5ffe5d577c04cabb3692246b956f65597b) by [@ecreeth](https://github.com/ecreeth)) - -#### Android specific - -- Remove `DatePickerAndroid` from react-native. ([7a770526c6](https://github.com/facebook/react-native/commit/7a770526c626e6659a12939f8c61057a688aa623) by [@andresantonioriveros](https://github.com/andresantonioriveros)) - -#### iOS specific - -### Fixed - -- Update metro config language to `blockList` ([7923804c28](https://github.com/facebook/react-native/commit/7923804c28aac731396f0db112cb6c3a9d30c08f) by [@rh389](https://github.com/rh389)) -- Ignores global npm prefix ([6334ac35ac](https://github.com/facebook/react-native/commit/6334ac35ac3cbc2c84b2d46d46ec118bf9bf714d) by [@redreceipt](https://github.com/redreceipt)) -- Support `Animated.ValueXY` when validating `Animated.event`. ([27dd2ecb70](https://github.com/facebook/react-native/commit/27dd2ecb70f1d08787c93a2e18250ffaff328e5f) by [@javache](https://github.com/javache)) -- Add a function `getIgnorePatterns` in `LogBoxData.js` for tests or other usecases. ([a950634424](https://github.com/facebook/react-native/commit/a950634424cddf31c0adb6c9799adf1cc5f83bf0)) - -#### Android specific - -- TextInput Drawable to avoid Null Pointer Exception RuntimeError https://github.com/facebook/react-native/issues/17530 ([254493e1fb](https://github.com/facebook/react-native/commit/254493e1fb0c3a1e279e2c957e83edac6252d041) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Nested Text Android `onPress` does not work with last character ([132d1d00f8](https://github.com/facebook/react-native/commit/132d1d00f885fe5a45d712fd7698db285c22bc4b) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fix non selectable Text in FlatList ([c360b1d92b](https://github.com/facebook/react-native/commit/c360b1d92b69e1d298b390ec88c4d29c1023945a) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Set `textBreakStrategy` default to be `'highQuality'` ([3b2d541989](https://github.com/facebook/react-native/commit/3b2d5419899363d84aea4f5cc3a4c75253dd6406)) -- Fix error handling when loading JSC or Hermes ([d839b24b06](https://github.com/facebook/react-native/commit/d839b24b06d31b4ce91fb459742831b942972f56) by [@iqqmuT](https://github.com/iqqmuT)) -- Fix encoding for gradlew.bat files ([ab2bdee735](https://github.com/facebook/react-native/commit/ab2bdee735cd0d53d3dbfbac5cd31f96eefb7e61) by [@yungsters](https://github.com/yungsters)) -- Fix `hermesFlags` not working with multiple variants ([91adb761cf](https://github.com/facebook/react-native/commit/91adb761cf1583598d4d63ce879fd7e0f4ae793c) by [@grit96](https://github.com/grit96)) -- `ScrollTo` API in ScrollView will check the actual scroll position before setting the scroll state ([1a9e2d5d55](https://github.com/facebook/react-native/commit/1a9e2d5d5589ce5cee92868ea5bccceb6e161eff) by [@ryancat](https://github.com/ryancat)) -- Compute Android Notch in `keyboardDidShow` height calculation API 28+ ([8bef3b1f11](https://github.com/facebook/react-native/commit/8bef3b1f1136ab5c2f2309a3101a7d9626ced1f5) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fix `currentActivity` being null when launching Redbox ([f4fdf4b55e](https://github.com/facebook/react-native/commit/f4fdf4b55e4489c21f4552b4ac01ef253c038b2d)) -- When sending OS intents, always set `"FLAG_ACTIVITY_NEW_TASK"` flag (required by OS). ([04fe3ed80d](https://github.com/facebook/react-native/commit/04fe3ed80d9c201a483a2b477aeebd3d4169fd6d) by [@Krizzu](https://github.com/Krizzu)) -- Fix missing WebView provider crash in ForwardingCookieHandler ([d40cb0e1b0](https://github.com/facebook/react-native/commit/d40cb0e1b0fb233a27b9d476167814d2853acf2a) by [@RodolfoGS](https://github.com/RodolfoGS)) -- Fix `keyboardDismissMode="on-drag"` on Android ([7edf9274cf](https://github.com/facebook/react-native/commit/7edf9274cf6d3398075c19cd1cb020a5d6a346a2) by [@janicduplessis](https://github.com/janicduplessis)) -- Fixed `alignItems: baseline` for elements on Android ([1acf334614](https://github.com/facebook/react-native/commit/1acf33461451834097463f43e70d90bae0f67198)) -- `OnKeyPress` event not fired with numeric keys ([ee3e71f536](https://github.com/facebook/react-native/commit/ee3e71f536127295ba4ea377e618499409a2e9ba) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Exclude unused .so files for reduce android .apk and .aab ([6f126740fa](https://github.com/facebook/react-native/commit/6f126740fa560d7a831979b9f3747baacfb28dba) by [@enniel](https://github.com/enniel)) - -#### iOS specific - -- Fixed an edge case when scroll to item/index is called without animation, the offset position is not updated. This caused the measurement of the position to be wrong. ([55392f65a6](https://github.com/facebook/react-native/commit/55392f65a6addbdd8214b61d4ae286f26d63a94f) by [@ryancat](https://github.com/ryancat)) -- Fixed the issue when moving cursor in multi-line TextInput. ([22801870f0](https://github.com/facebook/react-native/commit/22801870f0613c2544ade1ebc5363e6e2f015c79) by [@xiankuncheng](https://github.com/xiankuncheng)) -- Fix NSInvalidArgumentException for invalid font family names. ([5683932862](https://github.com/facebook/react-native/commit/5683932862ab870e735342342c68e03fb5ca9e09) by [@yungsters](https://github.com/yungsters)) -- Fix Image `defaultSource` not showing on iOS ([900210cacc](https://github.com/facebook/react-native/commit/900210cacc4abca0079e3903781bc223c80c8ac7) by [@cristianoccazinsp](https://github.com/cristianoccazinsp)) -- Warn if Rosetta2 is being used (x86_64 on arm64) ([51bf557948](https://github.com/facebook/react-native/commit/51bf55794899284e1c465d346a3f6ebd8a485da2) by [@barbieri](https://github.com/barbieri)) -- Source map path for schemes containing whitespaces ([f3fe7a0fb5](https://github.com/facebook/react-native/commit/f3fe7a0fb5fc0325fbe062c6df4cbf8b58779189) by [@andersonvom](https://github.com/andersonvom)) -- Fix build error after running `pod install` with `--project-directory=ios` ([ef5ff3e055](https://github.com/facebook/react-native/commit/ef5ff3e055482771cbe866d4961ee2d0a9e00e45) by [@sonicdoe](https://github.com/sonicdoe)) -- Fixed inability to build apps when gflags is installed ([ab8dbdf663](https://github.com/facebook/react-native/commit/ab8dbdf66363f3d65f0dfbcc4ec7c71b1cd69b2a) by [@KDederichs](https://github.com/KDederichs)) - -### Security - -- Avoiding logging root view params outside of dev / debug mode builds ([e612d3a116](https://github.com/facebook/react-native/commit/e612d3a116f39ab354169643bab0d4bb9cfc1a85) by [@sterlingwes](https://github.com/sterlingwes)) - -## v0.66.5 - -🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). - -### Fixed - -- Force dependencies resolution to minor series for 0.66 ([201824c89e](https://github.com/facebook/react-native/commit/201824c89ecebd749ba7e603415edbe6a5b9b73d) by [@cortinico](https://github.com/cortinico)) - -## v0.66.4 - -### Fixed - -#### iOS specific - -- Revert "Fix Deadlock in RCTi18nUtil (iOS)" ([70ddf46](https://github.com/facebook/react-native/commit/70ddf46c8afcd720e188b6d82568eac6ac8125e6) by [@Saadnajmi](https://github.com/Saadnajmi)) -- `apply_Xcode_12_5_M1_post_install_workaround` causing pods targetting iOS 12 and above to fail ([a4a3e67554](https://github.com/facebook/react-native/commit/a4a3e675542827bb281a7ceccc7b8f5533eae29f) by [@Yonom](https://github.com/Yonom)) - -## v0.66.3 - -### Changed - -- Rename deprecated `Keyboard.removeEventListener` to `Keyboard.removeListener`. ([8880c09076](https://github.com/facebook/react-native/commit/8880c09076e4727768ace26a74766cbe6f64021c) by [@yungsters](https://github.com/yungsters)) - -### Fixed - -- Revert changes in Jest preprocessor to fix tests in external projects ([142090a5f3fa7](https://github.com/facebook/react-native/commit/142090a5f3fa7c3ab2ed4c536792e3f26582bd3b) by [@rubennorte](https://github.com/rubennorte)) - -## v0.66.2 - -### Fixed - -- Add a function `getIgnorePatterns` in `LogBoxData.js` for tests or other usecases. ([a950634424](https://github.com/facebook/react-native/commit/a950634424cddf31c0adb6c9799adf1cc5f83bf0)) -- Reintroduce generated codegen files ([7382f556d3](https://github.com/facebook/react-native/commit/7382f556d327d51bd09456efda83edec7e05ecd2) by [@kelset](https://github.com/kelset)) - -#### iOS specific - -- Hide the logbox window explicitly. New behavior in iOS SDK appears to retain UIWindow while visible. ([72ea0e111f](https://github.com/facebook/react-native/commit/72ea0e111fccd99456abf3f974439432145585e3) by [@paddlefish](https://github.com/paddlefish)) - -## v0.66.1 - -### Fixed - -- For Android, general fixes to Appearance API and also fixes AppCompatDelegate.setDefaultNightMode(). For iOS, now works correctly when setting window.overrideUserInterfaceStyle ([25a2c608f7](https://github.com/facebook/react-native/commit/25a2c608f790f42cbc4bb0a90fc06cc7bbbc9b95) by [@mrbrentkelly](https://github.com/mrbrentkelly)) - -#### Android specific - -- Fix Android border positioning regression ([d1a33cd139](https://github.com/facebook/react-native/commit/d1a33cd139fab4565b1fc691f5751c4af99d5849) by [@oblador](https://github.com/oblador)) - -#### iOS specific - -- Fix for unable to find `find-node.sh` in `react-native-xcode.sh` script ([cc59a7cbde](https://github.com/facebook/react-native/commit/cc59a7cbde1c0fc6d6ef059321d23bf287f08218) by [@garethknowles](https://github.com/garethknowles)) - -## v0.66.0 - -### Highlights - -- Hermes 0.9.0 - - This Hermes release is primarily about closing gap between Hermes cut and this React Native release. Among ~400 commits, contains memory and size wins, bugfixes and other progress behind the scenes. See [issue for more details](https://github.com/facebook/hermes/issues/586). -- Allow taps on views outside the bounds of a parent with `overflow: visible` ([e35a963bfb](https://github.com/facebook/react-native/commit/e35a963bfb93bbbdd92f4dd74d14e2ad6df5e14a) by [@hsource](https://github.com/hsource)) -- Fixes for building on Apple Silicon and Xcode 13 ([ac4ddec542](https://github.com/facebook/react-native/commit/ac4ddec542febda744de218dae3a3d34edc7da84) thanks to [@mikehardy](https://github.com/mikehardy)) -- New bluetooth permissions for Android ([2bcc6fac38](https://github.com/facebook/react-native/commit/2bcc6fac3844f0752bc7067517c92a643679575e), [eeb8e58](https://github.com/facebook/react-native/commit/eeb8e5829e183f6b5cd5fd327cf6da03a7db0541) by [@iBotPeaches](https://github.com/iBotPeaches)) - -### Breaking - -- Remove Picker and PickerIOS components - [cddb97ad18](https://github.com/facebook/react-native/commit/cddb97ad18cfdb663dcf015af3c9426d5414e396), [77366cd869](https://github.com/facebook/react-native/commit/77366cd8696cb8ada3f84d7fb4d36a27f7007b06), [ad0ccac0d6](https://github.com/facebook/react-native/commit/ad0ccac0d6471fa5428bf137c3aa0646883e8446) -- Remove StatusBarIOS component ([7ce0f40f5c](https://github.com/facebook/react-native/commit/7ce0f40f5cd8c0928ce720d6d121bcc5963958a2) by [@ecreeth](https://github.com/ecreeth)) - -#### Android specific - -- Updated `autoCompleteType` prop of `TextInput` to `autoComplete` ([27fec9569e](https://github.com/facebook/react-native/commit/27fec9569e08a04e0dbdbd5de063a599ad0416fa) by [@jeswinsimon](https://github.com/jeswinsimon)) - -### Added - -- Add `global.queueMicrotask` ([be189cd819](https://github.com/facebook/react-native/commit/be189cd81905a735f08a8519c62a707658c7fb27) by [@Huxpro](https://github.com/Huxpro)) -- Added data field to `markerPoint` to allow callers to add additional arbitrary string data to logged points ([aa98978302](https://github.com/facebook/react-native/commit/aa9897830293955b7cc77fd818a50e8d736e715d)) -- Adds accessibility actions to Button ([44717152ca](https://github.com/facebook/react-native/commit/44717152cadb18c7aff74e9465fdb70efdb1bf81) by [@dennisurtubia](https://github.com/dennisurtubia)) -- Add accessibilityState prop to Slider component ([35dd86180b](https://github.com/facebook/react-native/commit/35dd86180ba730425b97592ef6e5c4d449caee06) by [@sladyn98](https://github.com/sladyn98)) -- Add support for "togglebutton" `accessibilityRole` ([da899c0cc4](https://github.com/facebook/react-native/commit/da899c0cc4372830e5ca053a096b74fff2a19cb8) by [@kacieb](https://github.com/kacieb)) - -#### Android specific - -- Add INFO, and MENU key event support ([bb33c1050b](https://github.com/facebook/react-native/commit/bb33c1050ba6098a68d70055e33186d9438c4374) by [@havlasme](https://github.com/havlasme)) -- Added all autofill types to TextEdit ([d9e0ea77f0](https://github.com/facebook/react-native/commit/d9e0ea77f0111fd8400c65d68e45d54e2f84287b) by [@safaiyeh](https://github.com/safaiyeh)) -- Add support to URI keyboard type in Android ([1465c8f387](https://github.com/facebook/react-native/commit/1465c8f3874cdee8c325ab4a4916fda0b3e43bdb)) -- Add `MEDIA_STOP`, `MEDIA_NEXT`, and `MEDIA_PREVIOUS` event support to Android TV ([3e2bb331fc](https://github.com/facebook/react-native/commit/3e2bb331fc0974bc870b2e7bd3171e585183ed1b) by [@havlasme](https://github.com/havlasme)) -- Allow configuring ndk build architectures ([d6ed1ff58b](https://github.com/facebook/react-native/commit/d6ed1ff58b2ca4d1c8b45416e56fa1da75633c07) by [@janicduplessis](https://github.com/janicduplessis)) -- Added support for accessibility role of "list" for flatlist and sectioned list ([25a16123a6](https://github.com/facebook/react-native/commit/25a16123a610ae377ced23ef81ed4c03ad7d06d9) by [@anaskhraza](https://github.com/anaskhraza)) -- Support for foreground ripple in Pressable ([0823f299e5](https://github.com/facebook/react-native/commit/0823f299e560efda5c0f344fcec86cf68801f4ab) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) -- Support for ScrollAway native nav bars added to `ReactScrollView` ([0ef5beee85](https://github.com/facebook/react-native/commit/0ef5beee855afa592cc647383ba6a3ceae9cc40a) by [@JoshuaGross](https://github.com/JoshuaGross)) - -#### iOS specific - -- Added new prop "selection" to `TextInputProps` ([8434177722](https://github.com/facebook/react-native/commit/8434177722f70a9325f9a6adf46b5315b1f4ffa4)) -- Support for onRequestClose for iOS Modal component. ([c29ec46b0e](https://github.com/facebook/react-native/commit/c29ec46b0eee99670ce7762898fe3a4810db968b) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) -- Allow `PlatformColor` to return user-defined named asset color ([36c0a7dec1](https://github.com/facebook/react-native/commit/36c0a7dec121bd3a4b92d02c03a24771d3c4cf84) by [@oblador](https://github.com/oblador)) -- Add support for the `UIAccessibilityTraitsTabBar` ([11f8d9c7cd](https://github.com/facebook/react-native/commit/11f8d9c7cd4bae0b1a5e880ea9b2da7447ad76c2) by [@jimmy623](https://github.com/jimmy623)) -- Added "altitudeAngle" property to touch events from Apple Pencil/Stylus devices. ([f1b1ba8963](https://github.com/facebook/react-native/commit/f1b1ba8963ff152d995c3cd132bc0755413bc44f) by [@swittk](https://github.com/swittk)) -- Introduce `RCTInitializing` to allow NativeModules to initialize themselves ([9b45df1fce](https://github.com/facebook/react-native/commit/9b45df1fced066f40034b0a58be6f4caafd5f785) by [@RSNara](https://github.com/RSNara)) -- Introduce `RCTCallableJSModules` API for NativeModules ([ece373d244](https://github.com/facebook/react-native/commit/ece373d24421d96e62dafa9a064b38acd6b71e46) by [@RSNara](https://github.com/RSNara)) -- Attach `RCTBundleManager` to NativeModules ([329f58ee46](https://github.com/facebook/react-native/commit/329f58ee461e7afade36d8c249d3f4930c485312) by [@RSNara](https://github.com/RSNara)) -- Introduce RCTBundleManager for bundleURL access ([4a1bafe591](https://github.com/facebook/react-native/commit/4a1bafe591917482d78be998d45552e2568e3e23) by [@RSNara](https://github.com/RSNara)) - -### Changed - -- Initialized LogBox earlier and centralized access in LogBox module ([8abe737068](https://github.com/facebook/react-native/commit/8abe737068a54a874571c8b5560b2118b1df31ad) by [@rubennorte](https://github.com/rubennorte)) -- ExceptionsManager will no longer report exceptions with `type === 'warn'`. ([883e0d5752](https://github.com/facebook/react-native/commit/883e0d5752b952c829c8d45504d3532f52bb272f) by [@yungsters](https://github.com/yungsters)) -- Disable TouchableOpacity when `accessibilityState.disabled` is set ([ea609defe8](https://github.com/facebook/react-native/commit/ea609defe8462a6beeac4da3aa7a43397ee9a77f) by [@chakrihacker](https://github.com/chakrihacker)) -- Upgrade Babel from 7.12.3 to 7.14.1 ([58a0f9b4e2](https://github.com/facebook/react-native/commit/58a0f9b4e202a921ab0820c79d6a3dd54204da46) by [@MichaReiser](https://github.com/MichaReiser)) -- Upgrade `react-devtools-core` from ~4.6.0 to ^4.13.0 ([9e020ef476](https://github.com/facebook/react-native/commit/9e020ef476e24bb5703fc421225f1a94ae14512b) by [@bvaughn](https://github.com/bvaughn)) -- Update Flipper to 0.99.0 ([41f45a77ad](https://github.com/facebook/react-native/commit/41f45a77ad09b46de328fb2a72775a052dac1e93) by [@swrobel](https://github.com/swrobel)) -- Bump CLI to ^6.0.0 ([c677e196a9](https://github.com/facebook/react-native/commit/c677e196a9c4d6cfdf84d97e4746922bb4ed4823) by [@thymikee](https://github.com/thymikee)) -- Upgrade ESLint TS parser and plugin ([3b751d396b](https://github.com/facebook/react-native/commit/3b751d396ba0acaa1b4c8e1115c79eb45dab403d) by [@wcandillon](https://github.com/wcandillon)) -- Upgrade folly to 2021.06.28.00 and boost to 1.76.0 ([b77948e33b](https://github.com/facebook/react-native/commit/b77948e33bc5e0df422fffca3b4c9253f611d298) by [@Kudo](https://github.com/Kudo)) - -#### Android specific - -- Add BLUETOOTH_ADVERTISE to `PermissionsAndroid` ([2bcc6fac38](https://github.com/facebook/react-native/commit/2bcc6fac3844f0752bc7067517c92a643679575e) by [@iBotPeaches](https://github.com/iBotPeaches)) -- Native ScrollView listeners list maintains weak references to listeners to avoid memory leaks ([b673e352fb](https://github.com/facebook/react-native/commit/b673e352fb0ea44b545edf5a7e8c1b422180838a) by [@dalves](https://github.com/dalves)) -- Rename the "Toggle Inspector" DevMenu item to "Hide/Show Element Inspector" ([e91fb05db7](https://github.com/facebook/react-native/commit/e91fb05db7f576e07114755b9db1eee91c672f25) by [@RSNara](https://github.com/RSNara)) -- Localize "search", "button", and "togglebutton" accessibility roles by using the platform roles ([399285f91c](https://github.com/facebook/react-native/commit/399285f91c2f675dea16fe61a86049ef7fecf35b) by [@kacieb](https://github.com/kacieb)) -- Refactor `AndroidTextInput.AndroidTextInput.color` prop to use SharedColor instead of int ([bc57056cc3](https://github.com/facebook/react-native/commit/bc57056cc3263431d54982426d890ba60b4cadb7) by [@mdvacca](https://github.com/mdvacca)) -- Upgraded `infer-annotation` to 0.18.0. ([b5c94e316c](https://github.com/facebook/react-native/commit/b5c94e316cc9b4ff090d8daa8970bf1becf77959) by [@yungsters](https://github.com/yungsters)) -- Bumped AGP to 4.2.2 ([ae494e7ce1](https://github.com/facebook/react-native/commit/ae494e7ce199cc5d524f791d45ddce51535cdadb) by [@cortinico](https://github.com/cortinico)) -- Upgrade folly to 2021.06.28.00 ([ebe939b18a](https://github.com/facebook/react-native/commit/ebe939b18aa859eb0f7f265222874c292ed771a4) by [@Kudo](https://github.com/Kudo)) -- Bump NDK to 21.4.7075529 ([aa43aab77c](https://github.com/facebook/react-native/commit/aa43aab77c8571632a2b0913c80fbf822dac01bc) by [@dulmandakh](https://github.com/dulmandakh)) - -#### iOS specific - -- ScrollView scrollIndicatorInsets to not automatically add safe area on iOS13+ ([bc1e602e0c](https://github.com/facebook/react-native/commit/bc1e602e0c7922da6bf238675b7bf8b4c3faa493) by [@justinwh](https://github.com/justinwh)) - -### Removed - -- `StyleSheet.create` will no longer do DEV-time validation. ([2e8c0bd7ea](https://github.com/facebook/react-native/commit/2e8c0bd7ea7db1aac183eb7f656772d3cffcb132) by [@yungsters](https://github.com/yungsters)) - -### Fixed - -- Fix `window` not existing in jest setup ([bc1c533833](https://github.com/facebook/react-native/commit/bc1c533833bfe25a22f1abd105b8bcb1babce3b5) by [@timomeh](https://github.com/timomeh)) -- Clamp negative values for `numberOfLines` in component ([3bc883c6c6](https://github.com/facebook/react-native/commit/3bc883c6c60632f6a41df3867368f16f684b3865) by [@ShikaSD](https://github.com/ShikaSD)) -- Add missing `jest/create-cache-key-function` dep root package.json ([9a43eac7a3](https://github.com/facebook/react-native/commit/9a43eac7a32a6ba3164a048960101022a92fcd5a) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix Switch ref forwarding ([1538fa4455](https://github.com/facebook/react-native/commit/1538fa4455fa7095879aceba7f74a519c1337a8b) by [@janicduplessis](https://github.com/janicduplessis)) -- Report fatal errors even if its `type` is "warn". ([e4a4c4d6d7](https://github.com/facebook/react-native/commit/e4a4c4d6d71ab1a747d768e4b518e64e100ddfde) by [@yungsters](https://github.com/yungsters)) -- Parse `accessibilityAction` props into object instead of string ([faaeb778df](https://github.com/facebook/react-native/commit/faaeb778dfe25df67fc00b599d023819c10406e8) by [@ShikaSD](https://github.com/ShikaSD)) -- Avoid downgrading `console.error` when passed warning-like objects. ([0dba0aff18](https://github.com/facebook/react-native/commit/0dba0aff185f4fd46e1146362235e68e52c59556) by [@yungsters](https://github.com/yungsters)) -- Fix natively driven animations not getting reset properly ([129180c77b](https://github.com/facebook/react-native/commit/129180c77b0b99a3acedbeb04ce6ec4667f74cac) by [@tienphaw](https://github.com/tienphaw)) -- Fix compilation errors on Windows. ([6d04a46f74](https://github.com/facebook/react-native/commit/6d04a46f7427b9e107608f8f620fe2a1a84ff42d)) -- Fixed bug parsing hermes call stacks when the file name is empty ([e539e7d0be](https://github.com/facebook/react-native/commit/e539e7d0bed4fef42f458f28d06100ae23f52cb7) by [@MartinSherburn](https://github.com/MartinSherburn)) -- Upgrade dependencies / version of eslint package ([463ec22bb9](https://github.com/facebook/react-native/commit/463ec22bb9f2938164fef6133dfd94d2e428e5b0) by [@mikehardy](https://github.com/mikehardy)) - -#### Android specific - -- Allow taps on views outside the bounds of a parent with `overflow: visible` ([e35a963bfb](https://github.com/facebook/react-native/commit/e35a963bfb93bbbdd92f4dd74d14e2ad6df5e14a) by [@hsource](https://github.com/hsource)) -- Fixed to use correct Android theme color for dark theme ([b3a715f6ea](https://github.com/facebook/react-native/commit/b3a715f6ea3d0faaf6d09e2a49267f2a5fb3fad2) by [@sidverma32](https://github.com/sidverma32)) -- Fixed dynamic behavior of `` on Android ([59021521e7](https://github.com/facebook/react-native/commit/59021521e7aba0f70b91b5c7778ccdd1b30eaae4)) -- Fix Dimensions not updating ([c18a492858](https://github.com/facebook/react-native/commit/c18a492858e94b31e632560ad17499012e688158) by [@jonnyandrew](https://github.com/jonnyandrew)) -- Fix dashed/dotted border-drawing when `borderRadius` is 0 ([3e5998e651](https://github.com/facebook/react-native/commit/3e5998e651eba840603dcb1a9c0be564fc3f868d) by [@IjzerenHein](https://github.com/IjzerenHein)) -- Fix selectionColor doesn't style Android TextInput selection handles ([5819538a08](https://github.com/facebook/react-native/commit/5819538a087f1f48d564e7b4e273fe43dfb026cc) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fix Modal being dismissed incorrectly when pressing escape on a hardware keyboard ([f51773ecde](https://github.com/facebook/react-native/commit/f51773ecdedbac19d25eb20894e532edef2cb304) by [@levibuzolic](https://github.com/levibuzolic)) -- Avoid calling setHint with a null parameter causing cursor to jump to the right ([3560753559](https://github.com/facebook/react-native/commit/356075355908f4901b87ad6ce33c157f01c8e748) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Create slider accessibility delegate in createViewInstance ([91cac20289](https://github.com/facebook/react-native/commit/91cac2028900cd18d17e70f9050cc125ed1eb12e) by [@janicduplessis](https://github.com/janicduplessis)) -- Quickfix individual border style dotted or dashed rendering as solid ([cb0e1d603a](https://github.com/facebook/react-native/commit/cb0e1d603aa4439a4d4804ad2987e4cb1f9bbf90) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Make `mHybridData` thread safe ([7929551623](https://github.com/facebook/react-native/commit/7929551623d4e3fbd849500d795755d0c41fdbbd)) -- Exit early from layout in textview if text layout is null ([8dfc3bcda1](https://github.com/facebook/react-native/commit/8dfc3bcda1e77fc982bc98da20dc129c23d8cc77) by [@ShikaSD](https://github.com/ShikaSD)) -- Fix `NullPointerException` caused by race condition in `ReactInstanceManager.getViewManagerNames` method ([fb386fccdd](https://github.com/facebook/react-native/commit/fb386fccddfe381fd6af5656c13fac802bffd316) by [@mdvacca](https://github.com/mdvacca)) -- Pressable ripple subsequent press coordinates. ([961b00d8c0](https://github.com/facebook/react-native/commit/961b00d8c0117750ce147c0b27c59af93f64b65c) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) -- TouchableNativeFeedback ripple starts on previous touch location. ([d85d72d0d9](https://github.com/facebook/react-native/commit/d85d72d0d9143693f73cef24c8e5bbb4d539a620) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway)) -- Fix Crash in `ViewProps.isLayoutOnly` ([e6b9508f12](https://github.com/facebook/react-native/commit/e6b9508f12ffd732d773ddcf9c2f633b0eca4232) by [@javache](https://github.com/javache)) -- Fixed a crash when updating `snapToOffsets` to a null value ([ba387b91d3](https://github.com/facebook/react-native/commit/ba387b91d3c7c9c1acd4b08f07fcd45629f3edfb) by [@maxoumime](https://github.com/maxoumime)) -- Adding `setAccessible` to `ReactImageManager` to allow screenreader announce Image accessibilityState of "disabled" ([333b46c4b0](https://github.com/facebook/react-native/commit/333b46c4b0ddee286e6d1d4b971fe8554a5c14cb) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fixed Android library builds with react.gradle file ([88f0676ae4](https://github.com/facebook/react-native/commit/88f0676ae49fd629331495101248c8e13423aed2) by [@Legion2](https://github.com/Legion2)) - -#### iOS specific - -- Fix deadlock on `RCTi18nUtil` ([fcead14b0e](https://github.com/facebook/react-native/commit/fcead14b0effe2176a5d08ad50ee71e48528ddbd) by [@Saadnajmi](https://github.com/Saadnajmi)) -- Avoid re-encoding images when uploading local files ([f78526ce3d](https://github.com/facebook/react-native/commit/f78526ce3d4004eb4bf8ca5178ca7e2c1c9abc1a) by [@arthuralee](https://github.com/arthuralee)) -- content is reset when emoji is entered at the max length ([f3b8d4976f](https://github.com/facebook/react-native/commit/f3b8d4976f8608c2cda1f071923f14b6d4538967)) -- Use `actionName` in accessibility event callback ([fed6ad5bad](https://github.com/facebook/react-native/commit/fed6ad5badb4196a1895370fc81c522572cb34b4) by [@ShikaSD](https://github.com/ShikaSD)) - -## v0.65.3 - -🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). - -### Fixed - -- Force dependencies resolution to minor series for 0.65 ([9548eaea74](https://github.com/facebook/react-native/commit/9548eaea74c6ad242c015d1984503c4b7eb19b6f) by [@kelset](https://github.com/kelset)) - -## v0.65.2 - -### Fixed - -- For Android, general fixes to Appearance API and also fixes AppCompatDelegate.setDefaultNightMode(). For iOS, now works correctly when setting window.overrideUserInterfaceStyle ([25a2c608f7](https://github.com/facebook/react-native/commit/25a2c608f790f42cbc4bb0a90fc06cc7bbbc9b95) by [@mrbrentkelly](https://github.com/mrbrentkelly)) - -## v0.65.1 - -### Changed - -- Set `react-test-renderer` to `17.0.2` in the template ([d272880](https://github.com/facebook/react-native/commit/d27288044e94a248982f596e9885d55d066bc72e) by [@@rickhanlonii](https://github.com/@rickhanlonii)) - -### Fixed - -- Resolve `NODE_BINARY` after finding the right path to node ([d75683](https://github.com/facebook/react-native/commit/d75683ac943205d64dd4142cca713ab2356094b8) by [@santiagofm](https://github.com/santiagofm)) - -#### Android specific - -- `ColorProps` with value null should be defaultColor instead of transparent ([842bcb902e](https://github.com/facebook/react-native/commit/842bcb902ed27928255b60cb20524e9318d9bf70) by [@hank121314](https://github.com/hank121314)) -- Android Gradle Plugin 7 compatibility ([06e31c748f](https://github.com/facebook/react-native/commit/06e31c748fe87a866dbaf4d0c2019e76ec00e309) by [@dulmandakh](https://github.com/dulmandakh)) - -## v0.65.0 - -### Highlights - -- Hermes 0.8.1. Please see the highlighted changes from its [0.8.0](https://github.com/facebook/hermes/releases/tag/v0.8.0) and [0.8.1](https://github.com/facebook/hermes/releases/tag/v0.8.1) release notes. -- `react-native-codegen` version `0.0.7` is now needed as a `devDependency` in the `package.json`. - -### Breaking Changes - -#### iOS specific - -- Replace `flipper_post_install` with `react_native_post_install` hook. Will automatically detect if Flipper is enabled. ([42dde12aac](https://github.com/facebook/react-native/commit/42dde12aac81208c4e69da991f4e08b9e62d18f6) by [@grabbou](https://github.com/grabbou)) - -### Added - -- Add `onPressIn` & `onPressOut` props to Text ([1d924549ca](https://github.com/facebook/react-native/commit/1d924549cad75912191005c8f68dd73e15b07183) by [@adrienharnay](https://github.com/adrienharnay)) -- Stabilize `RootTagContext`. And temporarily export both `unstable_RootTagContext` and `RootTagContext` ([9d489354ae](https://github.com/facebook/react-native/commit/9d489354ae373614b20cd91f588eb25743686ee0) by [@nadiia](https://github.com/nadiia)) -- Implement `sendAccessibilityEvent` in the React(Fabric/non-Fabric) renderer ([99b7052248](https://github.com/facebook/react-native/commit/99b7052248202cee172e0b80e7ee3dfb41316746) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Re-added `localeIdentifier` to `I18nManager` constants ([6b91ae73cd](https://github.com/facebook/react-native/commit/6b91ae73cdf096e15a3235ae76276f9d7fb12f7b) by [@acoates-ms](https://github.com/acoates-ms)) -- Add PressabilityPerformanceEventEmitter ([c4c0065b00](https://github.com/facebook/react-native/commit/c4c0065b0009ced0049c5abc4dddd327ac638928) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Added `displayName` to some RN contexts to make them more easy to differentiate when debugging. ([68a476103a](https://github.com/facebook/react-native/commit/68a476103a95be77f4fc7c582e52cc94946de1b4) by [@bvaughn](https://github.com/bvaughn)) -- Add `displayName` to `TouchableHighlight` and `TouchableOpacity` ([c4e40b81c0](https://github.com/facebook/react-native/commit/c4e40b81c01d061c189a7d28a4f56a588c3d1aea) by [@brunohkbx](https://github.com/brunohkbx)) -- Added context to URL's error messages when the feature is not implemented ([452240bafa](https://github.com/facebook/react-native/commit/452240bafa970578144aedaea0223e17863d2d26) by [@Crash--](https://github.com/Crash--)) -- Add a `stickyHeaderHiddenOnScroll` option to keep the sticky header hidden during scrolling down, and only slide in when scrolling up ([ffba25c648](https://github.com/facebook/react-native/commit/ffba25c648152021dd3fb9e79afd8cade7008d05)) -- Added `debugName` parameter to `renderApplication` to use as the display name for the React root tree ([eeb36f4709](https://github.com/facebook/react-native/commit/eeb36f470929c2fdd8e1ed69898a5ba9144b8715) by [@rubennorte](https://github.com/rubennorte)) -- Adding support for `cancelOnBackground` for UserFlow ([0d4985900b](https://github.com/facebook/react-native/commit/0d4985900b52d5def22fce4371c2259ee65368ee) by [@dmitry-voronkevich](https://github.com/dmitry-voronkevich)) -- Introducing RuntimeScheduler module ([eb13baf2a6](https://github.com/facebook/react-native/commit/eb13baf2a687b53dde04b9a336f18629d94f4b79) by [@sammy-SC](https://github.com/sammy-SC)) -- Roll out TurboModule Promise Async Dispatch ([5c4f145e33](https://github.com/facebook/react-native/commit/5c4f145e33d92969f8a86284360a5a2f09308500) by [@RSNara](https://github.com/RSNara)) - -#### Android specific - -- Add `getRecommendedTimeoutMillis` to AccessibilityInfo ([d29a7e7a89](https://github.com/facebook/react-native/commit/d29a7e7a89f4e5e3489e9723979426bb1b6f0674) by [@grgr-dkrk](https://github.com/grgr-dkrk)) -- TalkBack now announces "unselected" when changing `accessibilityState.selected` to false. ([73bc96ecf9](https://github.com/facebook/react-native/commit/73bc96ecf9a16d420533c12e9e1812ffe21c10a2) by [@yungsters](https://github.com/yungsters)) -- Fbjni version bump to 0.0.3 ([24f9f75bf6](https://github.com/facebook/react-native/commit/24f9f75bf66b8f32a117ba9f9dea3c65b35b1e00) by [@IvanKobzarev](https://github.com/IvanKobzarev)) -- Add `onFocus` and `onBlur` for Pressable on Android. ([cab4da7288](https://github.com/facebook/react-native/commit/cab4da728814bf9d3c0cc7c9921e982bfc090730)) -- Introduce API to allow applications to register `TurboModuleManagerDelegates` with `ReactInstanceManager` ([eb7e89e286](https://github.com/facebook/react-native/commit/eb7e89e2864e941b4a21d55a7403a6028e9a26a2) by [@RSNara](https://github.com/RSNara)) -- Added convenience methods to simplify native Event classes and ease migrations ([72d0ddc16f](https://github.com/facebook/react-native/commit/72d0ddc16f2f631003c3486e0a59e50c145ec613) by [@JoshuaGross](https://github.com/JoshuaGross)) - -#### iOS specific - -- High contrast dynamic color options for dark and light mode. ([4b9d9dda27](https://github.com/facebook/react-native/commit/4b9d9dda270acd4e0314f40490c699ffd0f6e30e) by [@birkir](https://github.com/birkir)) -- Adds an ability to retrieve the notifications authorization status from JavaScript side. ([b86e52a9ec](https://github.com/facebook/react-native/commit/b86e52a9ec9ec828388eb4a717a3782a54c7b3d9)) -- Added reset method to `RCTFabricSurface` to help with reloads ([53858ceaa3](https://github.com/facebook/react-native/commit/53858ceaa3beab02726b1bd6e125e506477d445e) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Allow `RCTRootView` to be initialized with a frame ([00bc09c8f7](https://github.com/facebook/react-native/commit/00bc09c8f76879eb1f9a92a6a643191da9355de8) by [@appden](https://github.com/appden)) -- Allow for configuring the `NSURLSessionConfiguration` ([58444c74f5](https://github.com/facebook/react-native/commit/58444c74f5c18b74e88a6c1cd0f059fe434c1a21) by [@hakonk](https://github.com/hakonk)) -- Use react-native-codegen in iOS app template ([e99b8bbb40](https://github.com/facebook/react-native/commit/e99b8bbb404f8cd1f11b6c7998083be530d7b8a4) by [@hramos](https://github.com/hramos)) - -### Changed - -- Bump Flipper + Bump hermes (#31872 by [@Titozzz](https://github.com/Titozzz)) -- Show warning when native module without `addListener` or `removeListeners` is passed to `NativeEventEmitter` ([114be1d217](https://github.com/facebook/react-native/commit/114be1d2170bae2d29da749c07b45acf931e51e2) by [@rubennorte](https://github.com/rubennorte)) -- Disable `accessibilityState` when the `TouchableWithoutFeedback` is `disabled`. ([697164077c](https://github.com/facebook/react-native/commit/697164077c362cfa9a384b0f4e246d6bd9c470ba) by [@carloscuesta](https://github.com/carloscuesta)) -- Upgraded `react-devtools-core dependency` to 4.12.0 ([5a2693d78f](https://github.com/facebook/react-native/commit/5a2693d78f1a886f0aa5b7f86830d3ddb54a57e9) by [@bvaughn](https://github.com/bvaughn)) -- Set disabled `accessibilityState` when `TouchableHighlight` is disabled ([f69e096bb4](https://github.com/facebook/react-native/commit/f69e096bb4df67474351786f674b1bb1e42d3363) by [@Naturalclar](https://github.com/Naturalclar)) -- Add checks and logs to for better error handling ([ea1f9531f0](https://github.com/facebook/react-native/commit/ea1f9531f00b5cd834e03f58cdfa117a93634624)) -- CreateAnimatedComponent: removed deprecated lifecycles usage ([ba61267015](https://github.com/facebook/react-native/commit/ba61267015567bf180dd3272a295dc262b3e2c97) by [@nadiia](https://github.com/nadiia)) -- Hide caret in the `TextInput` during test runs. ([397bfa6ad7](https://github.com/facebook/react-native/commit/397bfa6ad7dff71f4b6d27ac17acc76fe8a6bbb5) by [@nadiia](https://github.com/nadiia)) -- Use `usePressability` hook in TextInput ([c4aa411ee3](https://github.com/facebook/react-native/commit/c4aa411ee374f2320343b900f1f8b24a47b633c9) by [@nadiia](https://github.com/nadiia)) -- `Keyboard` no longer inherits from `NativeEventEmitter`, so it no longer implements `removeAllListeners`, and `removeSubscription`. ([1049835b50](https://github.com/facebook/react-native/commit/1049835b504cece42ee43ac5b554687891da1349) by [@yungsters](https://github.com/yungsters)) -- `AppState` no longer inherits from `NativeEventEmitter`, so it no longer implements `addListener`, `removeAllListeners`, and `removeSubscription`. ([6f22989e92](https://github.com/facebook/react-native/commit/6f22989e920246a2cd611b93e170024d89903027) by [@yungsters](https://github.com/yungsters)) -- `DevSettings` no longer inherits from `NativeEventEmitter` ([70cd569e7e](https://github.com/facebook/react-native/commit/70cd569e7e4cceac81023eae4ea5089cff2f9b59) by [@yungsters](https://github.com/yungsters)) -- LogBox will not initially collapse stack frames if every frame would be collapsed. ([88a41f180c](https://github.com/facebook/react-native/commit/88a41f180c315bc55e05d77ddc3fc671ad8630e6) by [@yungsters](https://github.com/yungsters)) -- Update package name warning of deprecated modules ([34e1b0ef98](https://github.com/facebook/react-native/commit/34e1b0ef981559adc09cd9f994bef9584f1c82b7) by [@Naturalclar](https://github.com/Naturalclar)) -- Update react-native-codegen to 0.0.7 ([cd6c9f3273](https://github.com/facebook/react-native/commit/cd6c9f3273fbe41052c4ec8512d3b1129daf149b) by [@Naturalclar](https://github.com/Naturalclar)) -- Update template devDependencies ([652e3953f4](https://github.com/facebook/react-native/commit/652e3953f48938580e1bf8ea1ba70105997e59d2) by [@Bardiamist](https://github.com/Bardiamist)) -- Don't minify JS bundle by default when using hermes ([1a67dda668](https://github.com/facebook/react-native/commit/1a67dda668c71d961a4bb3b0cdf6aa22c0e5c138) by [@janicduplessis](https://github.com/janicduplessis)) -- Migrate warnings in index.js to point to new lean core repos ([4421a64ac1](https://github.com/facebook/react-native/commit/4421a64ac1ea9df3827fb99194c8576a0750beab) by [@Naturalclar](https://github.com/Naturalclar)) -- Update Flipper to 0.93.0 ([06c33e9abe](https://github.com/facebook/react-native/commit/06c33e9abe6ed51b1c8bba03982ebce2b6da3860) by [@mweststrate](https://github.com/mweststrate)) -- Update Flipper to 0.91.1, fixed iOS build support for i386, `use_flipper!()` will no longer need custom overrides to build with XCode 12.5 ([4246c75d0d](https://github.com/facebook/react-native/commit/4246c75d0d5b9dccbe0fd5ecec66b4cc0331f815) by [@mweststrate](https://github.com/mweststrate)) -- Find node on m1 via homebrew node managers ([4d40b53c12](https://github.com/facebook/react-native/commit/4d40b53c12c8ad52760c63cacde417ee876bdfb1) by [@danilobuerger](https://github.com/danilobuerger)) -- Clean up EventObjectPropertyType ([0e46080847](https://github.com/facebook/react-native/commit/0e46080847595fb7577b18042c932db958bc0959) by [@RSNara](https://github.com/RSNara)) -- `Appearance.addChangeListener` now returns an `EventSubscription`. ([305b4253c2](https://github.com/facebook/react-native/commit/305b4253c2a9ed4d71be33e02cb12b6d570e2fb1) by [@yungsters](https://github.com/yungsters)) -- `Dimensions.addEventListener` now returns an `EventSubscription`. ([c47a03563d](https://github.com/facebook/react-native/commit/c47a03563db72d1580bf87b7729bd22ce6ca63dd) by [@yungsters](https://github.com/yungsters)) -- Updated react-native-community/cli to v6 (hence updating metro to 0.66) ([0d32aef3aa](https://github.com/facebook/react-native/commit/0d32aef3aa9a75b00d99503b8e4f502c52380dea) by [@Titozzz](https://github.com/Titozzz)) -- Reflect Hermes release version from HermesBadge ([c54aeccf1a](https://github.com/facebook/react-native/commit/c54aeccf1a8e16240e400d783dda5ec07fcf3808) by [@Huxpro](https://github.com/Huxpro)) - -#### Android specific - -- Modified `NativeEventEmitter` to also use the passed native module to report subscriptions on Android ([f5502fbda9](https://github.com/facebook/react-native/commit/f5502fbda9fe271ff6e1d0da773a3a8ee206a453) by [@rubennorte](https://github.com/rubennorte)) -- RefreshControl.size prop changed its type to string, the valid values are: 'default' and 'large' ([dd60414578](https://github.com/facebook/react-native/commit/dd604145781ac07c8db8d9100043bd76f6d6e913), [65975dd28d](https://github.com/facebook/react-native/commit/65975dd28de0a7b8b8c4eef6479bf7eee5fcfb93) by [@mdvacca](https://github.com/mdvacca)) -- TouchableNativeFeedback: sync disabled prop with accessibilityState ([88f2356eed](https://github.com/facebook/react-native/commit/88f2356eedf71183d02cde0826c8a0c6910f83dd) by [@kyamashiro](https://github.com/kyamashiro)) -- Rename `hasActiveCatalystInstance` to `hasActiveReactInstance` ([dfa8eb0558](https://github.com/facebook/react-native/commit/dfa8eb0558338f18ea01f294a64d355f6deeff06)) -- Record latest error type in dev support ([423453e105](https://github.com/facebook/react-native/commit/423453e1050c9aedda2df050a5ee6d40e7c82031)) -- Passing accessibility state in button so it can announce disabled in talkback ([5889cbebe3](https://github.com/facebook/react-native/commit/5889cbebe392dd19c6ce0cfd5fa1f725ece1060a) by [@huzaifaaak](https://github.com/huzaifaaak)) -- Fixed issue that causes HorizontalScrollView to shift to the right when a TextInput is selected and keyboard pops up ([b9b23e1ab1](https://github.com/facebook/react-native/commit/b9b23e1ab138189d2a4c22b13ba6ad8f8957579e) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Fixed jumpy RTL horizontal ScrollViews. If you have Android-specific JS hacks for handling RTL in ScrollViews, you probably can/probably want to remove them, because they should be reliable now and require fewer hacks. ([fc032cd8d8](https://github.com/facebook/react-native/commit/fc032cd8d889d828edad3ea4b735205092cf0d40) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Add a new check to avoid calling this method ([2b708560fc](https://github.com/facebook/react-native/commit/2b708560fc002c26f0b09f09cfa451827a3425ac)) -- Clipping subviews has been temporarily disabled in HorizontalScrollView in RTL mode. Minor/negligible perf impact. ([da8ed6b625](https://github.com/facebook/react-native/commit/da8ed6b6252fd53a83f14ab6da7e9b467f12ffe1) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Change StatusBar style handling strategy ([7324b92dc4](https://github.com/facebook/react-native/commit/7324b92dc45679d3b38526378b7d3e78ad082641)) -- Clean listeners during destroy of `ReactContext` ([d79212120b](https://github.com/facebook/react-native/commit/d79212120b7168015d3d0225ef372ed851a230fa) by [@mdvacca](https://github.com/mdvacca)) -- Bump buildToolsVersion to 30.0.2, ([5d01110b53](https://github.com/facebook/react-native/commit/5d01110b5370f884907b6dbdc56773f03518a54d) by [@dulmandakh](https://github.com/dulmandakh)) -- Initial replacement of jcenter with mavenCentral. ([704dd2812f](https://github.com/facebook/react-native/commit/704dd2812f7b8c79971274cc9e4c717e56847ac0) by [@ShikaSD](https://github.com/ShikaSD)) -- Remove developer tool guard for android ([c7d28bca30](https://github.com/facebook/react-native/commit/c7d28bca308c1654c576df9a0328a3116ed65d54)) -- Bump Android compileSdkVersion and targetSdkVersion from 29 to 30 ([55c8833817](https://github.com/facebook/react-native/commit/55c8833817c3e9cf9882a712c8b9946a262df231), [c7efd5b369](https://github.com/facebook/react-native/commit/c7efd5b369aa7605a1017791440735ab72bc9fa8) by [@mdvacca](https://github.com/mdvacca)) -- Upgrade jsc-android to 250230.2.1 ([341f061ce3](https://github.com/facebook/react-native/commit/341f061ce3ae057f3a958654e0ec3a9c4c8211ad) by [@Kudo](https://github.com/Kudo)) -- Bump Gradle to 6.9, Android Gradle Plugin to 4.2.1 ([547b4c92e4](https://github.com/facebook/react-native/commit/547b4c92e4743f5b5816297f48a608ace9de6bb5) by [@dulmandakh](https://github.com/dulmandakh)) -- Bump gradle wrapper to 6.8.3 ([7258afeea3](https://github.com/facebook/react-native/commit/7258afeea38949dc408c0af79924f6f36f7ade84) by [@dulmandakh](https://github.com/dulmandakh)) -- Bumping OkHttp from 4.9.0 to 4.9.1. ([6caec9d91f](https://github.com/facebook/react-native/commit/6caec9d91fe71bcd80d670218d752c4f251bde81) by [@gedeagas](https://github.com/gedeagas)) -- Bumping OkHttp from v3 to v4. ([8207e97f91](https://github.com/facebook/react-native/commit/8207e97f9174a04e319431193c0f63d47a093c44) by [@arazabishov](https://github.com/arazabishov)) -- Update Okhttp to version 3.14.19 ([6bfd89d277](https://github.com/facebook/react-native/commit/6bfd89d27724f2aac602fa2acbf4753950f4152e) by [@LukasFPV](https://github.com/LukasFPV)) -- Bump Fresco to 2.5.0 ([8fa8934011](https://github.com/facebook/react-native/commit/8fa8934011e4d9f1f7a49c8519fcc97f30a5c74b) by [@dulmandakh](https://github.com/dulmandakh)) -- Bump Fresco to 2.3.0 ([280f524b49](https://github.com/facebook/react-native/commit/280f524b491e7a36bb9f9a26e354bb8e125375ed) by [@dulmandakh](https://github.com/dulmandakh)) - -#### iOS specific - -- Give RCTNetworking handler provider block RCTModuleRegistry ([4c5182c1cc](https://github.com/facebook/react-native/commit/4c5182c1cc8bafb15490adf602c87cb5bf289ffd) by [@RSNara](https://github.com/RSNara)) -- Give RCTImageURLLoader's loader/decoder provider blocks RCTModuleRegistry ([af6bcfa3ab](https://github.com/facebook/react-native/commit/af6bcfa3ab0ef6e1b0f669dda6cd7d6a5e8975ba) by [@RSNara](https://github.com/RSNara)) -- Make RCTTurboModule `getTurboModule`: required ([e0b8f5080f](https://github.com/facebook/react-native/commit/e0b8f5080f814ba2a75807ed6d7f2944aab98d7e) by [@RSNara](https://github.com/RSNara)) -- Update React.podspec to require cocoapods >= 1.10.1 ([b50b7e3a19](https://github.com/facebook/react-native/commit/b50b7e3a191dfa95aa122c259e0df8699cbaccae) by [@sunnylqm](https://github.com/sunnylqm)) -- Fix glog pod install with Xcode 12 ([8a5fd8ea95](https://github.com/facebook/react-native/commit/8a5fd8ea95678a0b4423db2cbcbefc1a33595813) by [@dulmandakh](https://github.com/dulmandakh)) -- Only show Dev Menu on shake if RN view is visible ([7186c4de4f](https://github.com/facebook/react-native/commit/7186c4de4fc76e87fa1386f2839f178dd220a02b) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- `progressViewOffset` prop of `RefreshControl` and `VirtualizedList` now works on iOS ([310a6bcf4b](https://github.com/facebook/react-native/commit/310a6bcf4ba7ca162d3ba1c03e0ab07ff41f9ead) by [@davidbiedenbach](https://github.com/davidbiedenbach)) -- Roll out TurboModule block copy ([5275895af5](https://github.com/facebook/react-native/commit/5275895af5136bc278c0c5eb07ae93e395c5b29b) by [@RSNara](https://github.com/RSNara)) -- Add instructions to template/ios/Podfile for enabling hermes ([a326a30e32](https://github.com/facebook/react-native/commit/a326a30e322f6cdff880734aafe965b299febb8d) by [@SConaway](https://github.com/SConaway)) - -### Deprecated - -- `EventEmitter#removeSubscription` is now deprecated. ([cb6cbd12f8](https://github.com/facebook/react-native/commit/cb6cbd12f80152b4ce742f37e2e6eefadf89d927) by [@yungsters](https://github.com/yungsters)) -- It is now deprecated to pass a constructor argument to `EventEmitter(...)`. ([14f7a2b707](https://github.com/facebook/react-native/commit/14f7a2b70754c92804d746959d1ff091bf49af69) by [@yungsters](https://github.com/yungsters)) -- Deprecate `AccessibilityInfo.removeEventListener`. ([003d63d6e5](https://github.com/facebook/react-native/commit/003d63d6e501411f870ff5dbef819ad2aca20974) by [@yungsters](https://github.com/yungsters)) -- Deprecate `Linking.removeEventListener`. Instead, call `remove()` on the subscription returned by `Linking.addEventListener`. ([6d1aca806c](https://github.com/facebook/react-native/commit/6d1aca806cee86ad76de771ed3a1cc62982ebcd7), [035718ba97](https://github.com/facebook/react-native/commit/035718ba97bb44c68f2a4ccdd95e537e3d28690c) by [@yungsters](https://github.com/yungsters)) -- Old Native method to create ScrollEvent has been deprecated and will be removed at some point in the (distant) future ([62f0dee235](https://github.com/facebook/react-native/commit/62f0dee2353b14ce1524dc62de5e1d2f1883a089) by [@JoshuaGross](https://github.com/JoshuaGross)) - -#### Android specific - -- Deprecate `NativeModule.onCatalystInstanceDestroy()` for `NativeModule.invalidate()` ([18c8417290](https://github.com/facebook/react-native/commit/18c8417290823e67e211bde241ae9dde27b72f17) by [@RSNara](https://github.com/RSNara)) -- Mark `hasActiveCatalystInstance()` as Deprecated ([1b50722a7e](https://github.com/facebook/react-native/commit/1b50722a7e84cd8acffd3f0f84d77057e1e0d955)) - -### Removed - -- Stabilize `RootTagContext` ([9b98edcd01](https://github.com/facebook/react-native/commit/9b98edcd0155a4a8a1f71d19e565c485910a6137) by [@nadiia](https://github.com/nadiia)) -- Removed `getNode()` from animated component refs. ([b914153286](https://github.com/facebook/react-native/commit/b914153286ea537d4a57ff934e63e07172c576a0) by [@yungsters](https://github.com/yungsters)) -- Remove legacy context API usage in AppContainer ([17be3a0032](https://github.com/facebook/react-native/commit/17be3a0032c181a100efc7af17b7366a3d636c52) by [@nadiia](https://github.com/nadiia)) -- Removed `AccessibilityInfo.fetch`, use `isScreenReaderEnabled` instead. ([d831134d51](https://github.com/facebook/react-native/commit/d831134d514c5db6be1ee35cc7e9994b777179c1) by [@yungsters](https://github.com/yungsters)) -- Remove unused VR-only props ([95f7c791c5](https://github.com/facebook/react-native/commit/95f7c791c56b527dadbe0b4ec7a1be5af12d7afe) by [@Simek](https://github.com/Simek)) -- Removed `RCTDeviceEventEmitter.sharedSubscribers`. ([3af0c84aa5](https://github.com/facebook/react-native/commit/3af0c84aa5d1633f058ea3e7aef0d125fe33e01d) by [@yungsters](https://github.com/yungsters)) -- Moved `ScrollResponder.Mixin` methods into ScrollView to Remove ScrollResponder.js ([099f67cf8a](https://github.com/facebook/react-native/commit/099f67cf8aa290592092cfa0cb4e938d0543b696) by [@kacieb](https://github.com/kacieb)) -- `NativeEventEmitter` no longer inherits from `EventEmitter`, so it no longer implements `removeListener` and `removeSubscription`. Instead, use the `remove()` method on the subscription object returned by `addListener`. ([d39643b9de](https://github.com/facebook/react-native/commit/d39643b9de11c6b44984166ede34a7f44de76fe5) by [@yungsters](https://github.com/yungsters)) -- `RCTDeviceEventEmitter` no longer throws for `StatusBar`, `Keyboard`, and `AppState` events. However, you are still recommended to use the more appropriate modules for listening to these events. ([c8c975f0d7](https://github.com/facebook/react-native/commit/c8c975f0d7b8a57e9e90373a2be4d630ed9dd65e) by [@yungsters](https://github.com/yungsters)) -- Removed second optional argument of `NativeEventEmitter` constructor ([f5f47879b8](https://github.com/facebook/react-native/commit/f5f47879b8320a9934914cb8ce7a72269840a83a) by [@yungsters](https://github.com/yungsters)) -- Removed warning on Android for `setTimeout` with delays greater than 1 minute. ([480dabd665](https://github.com/facebook/react-native/commit/480dabd66547a60522249eda203a3eb1934b02e5) by [@yungsters](https://github.com/yungsters)) -- Removed `Touchable.TOUCH_TARGET_DEBUG` property. ([ef765d423c](https://github.com/facebook/react-native/commit/ef765d423cb188957a9fb2fd92c62b0efe8a36a6) by [@yungsters](https://github.com/yungsters)) - -#### Android specific - -- Remove okhttp3 proguard rules ([b4c9f13fe7](https://github.com/facebook/react-native/commit/b4c9f13fe794283d76766c1baef87888d174cb1c) by [@doniwinata0309](https://github.com/doniwinata0309)) -- Remove filter pills ([5cf4ab8dd2](https://github.com/facebook/react-native/commit/5cf4ab8dd28b5a336d7af29d295ede51f0d19587) by [@suminkimm](https://github.com/suminkimm)) -- Remove `ReactFragmentActivity` class. ([2798e7172b](https://github.com/facebook/react-native/commit/2798e7172b01b9e2dbe2937d0163f98ab29230cf) by [@dulmandakh](https://github.com/dulmandakh)) -- Remove jcenter ([70da640946](https://github.com/facebook/react-native/commit/70da64094608f5f2e3c554ed719e9aad624e3459) by [@dulmandakh](https://github.com/dulmandakh)) - -#### iOS specific - -- Removed event methods except `addListener` from `Networking` ([a81b7d18fa](https://github.com/facebook/react-native/commit/a81b7d18fa65a727539c6c7ea17f787673d3c889) by [@yungsters](https://github.com/yungsters)) -- Delete deprecated "live reloading" setting ([b512beb0c4](https://github.com/facebook/react-native/commit/b512beb0c497158f9c861fcc16af960655b1feb5) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Remove iOS10/tvOS10 support ([f2c6279ca4](https://github.com/facebook/react-native/commit/f2c6279ca497b34d5a2bfbb6f2d33dc7a7bea02a), [a1d626739d](https://github.com/facebook/react-native/commit/a1d626739d95d6cbbb1be169b93952cdd1465486) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Remove iOS10/tvOS10 support from remaining podfiles ([f0faa7843c](https://github.com/facebook/react-native/commit/f0faa7843c5a0e9041edb6e77fd6631335ab2b12) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Delete RCTTurboModuleManagerDelegate `getTurboModule:initParams` ([c4c34a1237](https://github.com/facebook/react-native/commit/c4c34a1237ec584c667c62358dc577174bf11033) by [@RSNara](https://github.com/RSNara)) - -### Fixed - -- Don't disconnect DevTools WebSocket connection on Cmd+D ([60a18c138c](https://github.com/facebook/react-native/commit/60a18c138c51d3adcfeba7785315fc222cdfeb35) by [@bvaughn](https://github.com/bvaughn)) -- For native components that accept color arrays, invalid elements will now fallback to transparent with a console error. ([bb6cd56fae](https://github.com/facebook/react-native/commit/bb6cd56fae4118f44ae47fd6978710a22f9e1510) by [@yungsters](https://github.com/yungsters)) -- Fixes usage of std::thread in runtime executor ([75d9ba733f](https://github.com/facebook/react-native/commit/75d9ba733f4a041e4320098b52903f69747df02b) by [@asklar](https://github.com/asklar)) -- Fix sticky header not sticking on first render in ScrollView ([921c9ff165](https://github.com/facebook/react-native/commit/921c9ff165d47a73e9978df918b1761b95f9979d) by [@kacieb](https://github.com/kacieb)) -- Fix ScrollView `getInnerViewNode` and `getInnerViewRef` ref methods ([6e36d046a3](https://github.com/facebook/react-native/commit/6e36d046a313c7961cc2f91e0422f4bf29005eb6) by [@vshab](https://github.com/vshab)) -- Fix stalling UI due to a bug in KeyboardAvoidingView ([67309277fe](https://github.com/facebook/react-native/commit/67309277fe588c4dd64fe0c680d1d00d2f3fb2b6) by [@sammy-SC](https://github.com/sammy-SC)) -- Avoid eating clicks/taps into ScrollView when using physical keyboard ([6d2a527984](https://github.com/facebook/react-native/commit/6d2a5279841886a9a14f82057202bf8950c3f917) by [@NickGerleman](https://github.com/NickGerleman)) -- Fix nested FlatList not firing `onScrollDragEnd` and `onMomentum` methods ([46be292f67](https://github.com/facebook/react-native/commit/46be292f671c70aac4ecc178c96e3a2a6a3d16da) by [@kacieb](https://github.com/kacieb)) -- Fix race condition in Debug Inspector shutdown ([d021000b9e](https://github.com/facebook/react-native/commit/d021000b9e358a9379ca5d6208f24757c0c8ce97) by [@MartinSherburn](https://github.com/MartinSherburn)) -- Fixes layout of nodes with `YGDisplayNone` and `YGPositionTypeAbsolute` ([b15f8a30e7](https://github.com/facebook/react-native/commit/b15f8a30e75b54a8de5cc9456aaa07ebe8d8a176) by [@rozele](https://github.com/rozele)) -- Fix changes of View visibilities ([4076293aa1](https://github.com/facebook/react-native/commit/4076293aa1059005704576530d8fe948b85e6a6d) by [@mdvacca](https://github.com/mdvacca)) -- Fix: save connection url as class variable ([8facc865ab](https://github.com/facebook/react-native/commit/8facc865ab2ec032da34f6f755ee8870ee4741aa) by [@sirpy](https://github.com/sirpy)) -- Fix Hermes build on folly version 2021.04.26.00 ([8eceee744e](https://github.com/facebook/react-native/commit/8eceee744ed9fee1eb2402f6b13bb606f6046f62) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Fix disabled handling for Text ([33ff4445dc](https://github.com/facebook/react-native/commit/33ff4445dcf858cd5e6ba899163fd2a76774b641) by [@lunaleaps](https://github.com/lunaleaps)) -- Fix disabled prop not disabling onPress for voice assistant ([1c7d9c8046](https://github.com/facebook/react-native/commit/1c7d9c8046099eab8db4a460bedc0b2c07ed06df) by [@kacieb](https://github.com/kacieb)) -- Fix unsafe cast and detect overflow in MapBuffer. ([e69f1c9f50](https://github.com/facebook/react-native/commit/e69f1c9f50c64bfcaeb684d763f02b9ccadec960)) -- Fix(deps): bump metro to 0.66.2 + dedup ([e40f58272d](https://github.com/facebook/react-native/commit/e40f58272d51a40e7b5fa77c14767ddaf9ecc006) by [@Titozzz](https://github.com/Titozzz)) - -#### Android specific - -- Fixed crash when using style `borderRadius: any` with `backgroundColor: null` ([42b6e6682c](https://github.com/facebook/react-native/commit/42b6e6682ce0fa9ac6eb5c1bf8ef0c224d2d80c0)) -- Fix font weight numeric values ([3827ca6171](https://github.com/facebook/react-native/commit/3827ca61714b699c866e17d58b4697dde86e3d00) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fix wrong ripple color on Switch component ([1b0683533a](https://github.com/facebook/react-native/commit/1b0683533a07aa8875b4d494d8c2a3d18ef69438) by [@rnike](https://github.com/rnike)) -- Fix Selected State does not announce when TextInput Component selected on Android ([7ee2acc6c8](https://github.com/facebook/react-native/commit/7ee2acc6c84c9ea6a51908495a6f14a26f346b29) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fix layout bug in ReactTextView. ([dec1b6ba15](https://github.com/facebook/react-native/commit/dec1b6ba15df8f255d30b696a7c08ef543d1d19c)) -- Fix source build on Windows machines vol. 2 ([c37d49492b](https://github.com/facebook/react-native/commit/c37d49492b20c3815ca10133f971755f659b1b6a)) -- Make NativeModules immediately initializable ([2bf866e401](https://github.com/facebook/react-native/commit/2bf866e4018ea72c1f1c92c806db85378c801fb7) by [@RSNara](https://github.com/RSNara)) -- Restore `android_hyphenationFrequency` on `Text`. ([1433ed6333](https://github.com/facebook/react-native/commit/1433ed6333162189730d6f92cf80f3077ac69120) by [@yungsters](https://github.com/yungsters)) -- Display the `testID` as the `resource-id` for black-box testing frameworks ([381fb395ad](https://github.com/facebook/react-native/commit/381fb395ad9d2d48717a5d082aaedbecdd804554) by [@jdeff](https://github.com/jdeff)) -- Fix support for blobs larger than 64 KB ([f00e348ca7](https://github.com/facebook/react-native/commit/f00e348ca7f031c3577b1335a3163bc3e4eb4b41) by [@tomekzaw](https://github.com/tomekzaw)) -- Fix building React Android on Windows. ([5dc15222b2](https://github.com/facebook/react-native/commit/5dc15222b256e32517df553c5fe7f6f5b7d0d31f)) -- Fix race-condition on the initialization of ReactRootViews ([74a756846f](https://github.com/facebook/react-native/commit/74a756846fdab1ef7d183c4df3069a23fcd0d49e) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific - -- Animated images without loop no longer animate twice ([17aa1e320e](https://github.com/facebook/react-native/commit/17aa1e320e75393d46a54ec0fee8b068eeef142f) by [@comvenger-brandon](https://github.com/comvenger-brandon)) -- Allow PlatformColor to work with border colors ([c974cbff04](https://github.com/facebook/react-native/commit/c974cbff04a8d90ac0f856dbada3fc5a75c75b49) by [@danilobuerger](https://github.com/danilobuerger)) -- RCTSurfaceHostingView default background color is now consistent with RCTRootView ([f31497354b](https://github.com/facebook/react-native/commit/f31497354b72ad51b452a4b8bd3b70de16830025) by [@fkgozali](https://github.com/fkgozali)) -- Invalidate TurboModules with infra-generated method queues on their method queues ([497eb578ab](https://github.com/facebook/react-native/commit/497eb578ab32614744a4ef61d7a6bca0d4251885) by [@RSNara](https://github.com/RSNara)) -- Fix RefreshControl layout when removed from window ([e67811e7a6](https://github.com/facebook/react-native/commit/e67811e7a6df0937ed61d3367ab10fab95b31bfa) by [@janicduplessis](https://github.com/janicduplessis)) -- Tab Accessibility Role had incorrect localization string ([80a10953f9](https://github.com/facebook/react-native/commit/80a10953f9de8cc251e9b8c1e59a173af87febb9) by [@adkenyon](https://github.com/adkenyon)) -- Incorrect ScrollView offset on update ([a4526bcc3f](https://github.com/facebook/react-native/commit/a4526bcc3f89f5b9d3f86c814ade8f55c86e819e) by [@rnike](https://github.com/rnike)) -- Modal's `onDismiss` prop will now be called successfully. ([d85d5d2e19](https://github.com/facebook/react-native/commit/d85d5d2e1974b463318e4c86da29a5ccdd60a977) by [@kkoudev](https://github.com/kkoudev)) -- Fix DatePicker sizing issue ([84d55868e8](https://github.com/facebook/react-native/commit/84d55868e8b4e5a555d324c6162b8e38571524d8) by [@sammy-SC](https://github.com/sammy-SC)) -- First press not working after pull to refresh ([c4950610e4](https://github.com/facebook/react-native/commit/c4950610e40f2019c828bc99e29769cd4089c217) by [@rnike](https://github.com/rnike)) -- Fix Codegen silently failing when Yarn is not installed, or when Yarn v2 is active. ([07e4953514](https://github.com/facebook/react-native/commit/07e4953514636aaadc5915944cc64c12028516f2) by [@ivanmoskalev](https://github.com/ivanmoskalev)) -- Make codegen more reliable on iOS ([12fccdeea3](https://github.com/facebook/react-native/commit/12fccdeea33324b8ddaa3ac0e2dbf81a44ca1eb2) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix crash in RCTCoreModulesClassProvider during quit ([2f62c2892d](https://github.com/facebook/react-native/commit/2f62c2892d9979f80752350d1b949f2770511956) by [@appden](https://github.com/appden)) -- Fix an issue calling stopSurface in bridgeless mode before surface is started ([81096901a8](https://github.com/facebook/react-native/commit/81096901a8a6da75744cef7b663ccea2ff9c4c09)) -- Move hermes to a separate podspec ([0959ff36d1](https://github.com/facebook/react-native/commit/0959ff36d1f3264e117021eb1999d0bdb71377c3) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix cli bundle platform for Mac Catalyst in `react-native-xcode.sh` ([b496a531e0](https://github.com/facebook/react-native/commit/b496a531e0b4b5d828077b0e7dff43dd28fed5eb) by [@robertying](https://github.com/robertying)) -- Fix `prefetchImageWithMetadata` redbox([f27e305056](https://github.com/facebook/react-native/commit/f27e305056152ff9ad7aeb9018bf289d51719eb9) by [@p-sun](https://github.com/p-sun)) -- Roll out RCTNetworking extraneous NativeModule call removal ([0e0d2e84f5](https://github.com/facebook/react-native/commit/0e0d2e84f56ea233e72d980ff6bd9797df250553) by [@RSNara](https://github.com/RSNara)) -- Fix Hermes + no Flipper build on Xcode 12.5 ([b9243e00e3](https://github.com/facebook/react-native/commit/b9243e00e30be057a45af6ed1916af4328c458e4) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Fix(hermes): fixed hermes build on iOS ([59abb5f378](https://github.com/facebook/react-native/commit/59abb5f378e116288cdea2f619de0c128bb0b0eb) by [@Titozzz](https://github.com/Titozzz)) -- Fix builds on Xcode 12.5 ([36b58a824e](https://github.com/facebook/react-native/commit/36b58a824ea20daa22fe7c528a3bf0ff4e6a4cb5) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Fix running React Native project with Xcode 12 in Release on iPhone Simulator ([fdcacd7f76](https://github.com/facebook/react-native/commit/fdcacd7f76ea8ca6dafda32ac431c8adc7bdad00) by [@grabbou](https://github.com/grabbou)) - -## v0.64.4 - -🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). - -### Fixed - -- Add an afterEvaluate to solve AGP 4.1.x configuration resolution ([667f1bd21a](https://github.com/facebook/react-native/commit/667f1bd21abfdda19e56f8bbf0520fddba3102ed) by [@cortinico](https://github.com/cortinico)) -- Force dependencies resolution to minor series for 0.64 ([a6a183ad81](https://github.com/facebook/react-native/commit/a6a183ad8106d67e3befce842138e82fb1e136fd) by [@kelset](https://github.com/kelset)) - -## v0.64.3 - -### Fixed - -- For Android, general fixes to Appearance API and also fixes AppCompatDelegate.setDefaultNightMode(). For iOS, now works correctly when setting window.overrideUserInterfaceStyle ([25a2c608f7](https://github.com/facebook/react-native/commit/25a2c608f790f42cbc4bb0a90fc06cc7bbbc9b95) by [@mrbrentkelly](https://github.com/mrbrentkelly)) - -## v0.64.2 - -### Changed - -- Find-node.sh supports Homebrew on M1 ([502b819049](https://github.com/facebook/react-native/commit/502b81904998b800f2d960bb4a8e244988c72958) by [@dulmandakh](https://github.com/dulmandakh)) -- Refactor UIManagerHelper.getUIManager to return null when there's no UIManager registered ([b0e8c1eac0](https://github.com/facebook/react-native/commit/b0e8c1eac0a9edda12ecfa264209a8b3222afe27) by [@mdvacca](https://github.com/mdvacca)) - -### Fixed - -- Fix ScrollViewStickyHeader to push up header above it ([d754bdefc6](https://github.com/facebook/react-native/commit/d754bdefc68ff757ac2b5a2ffa38d5aad234d484) by [@kacieb](https://github.com/kacieb)) - -#### Android specific - -- Font family is not apply when secureTextEntry is true ([cda77c77dd83cba07e6c2e56e938c3e4f7faf8fc](https://github.com/facebook/react-native/commit/cda77c77dd83cba07e6c2e56e938c3e4f7faf8fc) by [@hank121314](https://github.com/hank121314)) -- Dimension update events are now properly sent following orientation change ([a6a4d3365f17332e367c34357a07a73f97d6ec83](https://github.com/facebook/react-native/commit/a6a4d3365f17332e367c34357a07a73f97d6ec83) by [@ajpaulingalls](https://github.com/ajpaulingalls)) - -## v0.64.1 - -### Fixed - -#### iOS specific - -- Fixes to ensure Xcode 12.5 builds ([cf8a364767](https://github.com/facebook/react-native/commit/cf8a364767df830d7255339741350bb53ab1a68a), [1c4ac48a55](https://github.com/facebook/react-native/commit/1c4ac48a55cf0703f0c8a32cbb07474a2d126f3e) and [76f45d35e7](https://github.com/facebook/react-native/commit/76f45d35e710f84a1cc44c90bc128494bc4280ce) by [@kelset](https://github.com/kelset)) - -### Security - -- Update validateBaseUrl to use latest regex ([33ef82ce6d](https://github.com/facebook/react-native/commit/33ef82ce6dfd31e1f990d438c925a0e52723e16b) by [@FBNeal](https://github.com/FBNeal)) - -## v0.64.0 - -### Breaking - -- Enable `inlineRequires` by default in new projects' `metro.config.js`. Gives a performance benefit but slightly different JS execution order ([959365a902](https://github.com/facebook/react-native/commit/959365a90216ee14d0f8b5d2f4653a1ab4c10d7e) by [@GantMan](https://github.com/GantMan)) -- Minimum supported Node version changed to 12 ([4b92e2e53d](https://github.com/facebook/react-native/commit/4b92e2e53d9c79f5b5858b3eb0d1654da79a4a68) by [@safaiyeh](https://github.com/safaiyeh)) -- Remove deprecated `CameraRoll` API (deprecated in 0.61) ([824d3a9770](https://github.com/facebook/react-native/commit/824d3a977057b336d81237ec3cec3a49a9d5e34d) by [@seanyusa](https://github.com/seanyusa)) -- Remove deprecated `CheckBox` component (deprecated in 0.60) ([dff17effe5](https://github.com/facebook/react-native/commit/dff17effe54dc58dda19fcc81ebacbd8f46e9005) by [@poteto](https://github.com/poteto)) -- Removed `DEPRECATED_sendUpdatedChildFrames` prop from `ScrollView` component (deprecated in 0.47) ([345d0c1abb](https://github.com/facebook/react-native/commit/345d0c1abb1afe937a06982c4328caee57820832) by [@ZHUANGPP](https://github.com/ZHUANGPP)) -- On `Image`, `onLoad` event objects' `source.url` is now renamed to `source.uri`. ([74ab8f6e5a](https://github.com/facebook/react-native/commit/74ab8f6e5a61999f1132351ff52df43c91360a09) by [@yungsters](https://github.com/yungsters)) - -#### Android specific - -- Remove support of Android API levels 16 through 20. The new minSDK version will be 21+ moving forward. ([973198667d](https://github.com/facebook/react-native/commit/973198667d7bbbf3b5d8890fc0a53dc99d0bce18), [25a40cbc61](https://github.com/facebook/react-native/commit/25a40cbc61e6c718d8cdea6d67fd82c6309963b1), [f829722b54](https://github.com/facebook/react-native/commit/f829722b54b34f145c41a95edfa5b522c837f9fc), [b133427778](https://github.com/facebook/react-native/commit/b13342777856bc4024d8489de790e7f90cd6b33b), [9b34aa261c](https://github.com/facebook/react-native/commit/9b34aa261c272d96829c9a7d5b166594b3162f9d), and [79d0a7d711](https://github.com/facebook/react-native/commit/79d0a7d71119122d2a2b9954e6038bbee119b8fa) by [@mdvacca](https://github.com/mdvacca); [49f10fd2e5](https://github.com/facebook/react-native/commit/49f10fd2e526b64294777357ab2fef8880739f26) and [a17ff44adc](https://github.com/facebook/react-native/commit/a17ff44adcf003dd4e4ef2301e1f80b77913f712) by [@JoshuaGross](https://github.com/JoshuaGross); [dd4298a377](https://github.com/facebook/react-native/commit/dd4298a3770eee7f66846ef0cc4c41a628b7bf01) by [@safaiyeh](https://github.com/safaiyeh)) -- Fix ReadableArray null annotations. Possibly breaking change for Kotlin apps. ([d76556543f](https://github.com/facebook/react-native/commit/d76556543f96f4d739be3a708b8f6314bb32cc87) by [@dulmandakh](https://github.com/dulmandakh)) -- On `Image`, `onLoad` and `onError` event objects will no longer have an extra `uri` property. ([74ab8f6e5a](https://github.com/facebook/react-native/commit/74ab8f6e5a61999f1132351ff52df43c91360a09) by [@yungsters](https://github.com/yungsters)) -- Deletes the method PlayTouchSound method from UIManagerModule, this method was moved to the SoundManagerModule class. ([d0c4c5eaf9](https://github.com/facebook/react-native/commit/d0c4c5eaf90430c7004621d1596c5f2a55ad03e0) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific - -- Remove `calculateChildFrames` from `RCTScrollView` ([62aa84a325](https://github.com/facebook/react-native/commit/62aa84a3257bd3c513df3fcb4b4eaa350ecf77bb) by [@PeteTheHeat](https://github.com/PeteTheHeat)) - -### Deprecated - -#### Android specific - -- Deprecated method `UIManagerModule.getUIImplementation`. This method will not be part of the new architecture of React Native. ([fe79abb32c](https://github.com/facebook/react-native/commit/fe79abb32ca3425ff689b7641d9200461ea8166d) by [@mdvacca](https://github.com/mdvacca)) - -### Added - -- Adds the Hermes runtime bytecode version number to the JS bundle requestURL. This allows Metro with Bytecode to work with prebuilt binaries. ([34c405462f](https://github.com/facebook/react-native/commit/34c405462f890afbccdfeaa7804791f7e9bcaa83)) -- TextInput now supports `onPressIn` and `onPressOut`. ([b7b0e23202](https://github.com/facebook/react-native/commit/b7b0e232028723794af4c79fc6366c483ae2350b) by [@yungsters](https://github.com/yungsters)) -- Allow setting a custom performance logger in XMLHttpRequest ([57b10f759e](https://github.com/facebook/react-native/commit/57b10f759efed786b46cfe082367f929aa2925d3) by [@rubennorte](https://github.com/rubennorte)) -- Add mock for `DevSettings` to jest preset ([a50f736bb6](https://github.com/facebook/react-native/commit/a50f736bb6ade9ea9caae45e41ca4b92f6707b17) by [@MarcoScabbiolo](https://github.com/MarcoScabbiolo)) -- Added Inspector overlay support for Pressable ([8ac467c51b](https://github.com/facebook/react-native/commit/8ac467c51b94c82d81930b4802b2978c85539925) by [@yungsters](https://github.com/yungsters)) -- Introduce NativeModulePerfLogger ([0486640571](https://github.com/facebook/react-native/commit/0486640571c89a0ce067c0437655a6b375308bcd) by [@RSNara](https://github.com/RSNara)) -- Add default `titlePlaceholder` in template configuration. ([8ffa180d80](https://github.com/facebook/react-native/commit/8ffa180d80b9c9acb76a0631b5a709d2c0adcd86) by [@Esemesek](https://github.com/Esemesek)) -- Modified `renderApplication` to forward `initialProps` to `WrapperComponent` ([4f5a092bf6](https://github.com/facebook/react-native/commit/4f5a092bf68a0cd825328ce4a1e6bb41a8fad2e3) by [@rubennorte](https://github.com/rubennorte)) -- Add warning to `VirtualizedList` when incorrectly using nested Lists or custom scroll components ([7f2515ece8](https://github.com/facebook/react-native/commit/7f2515ece8833f7a8adba025ef544013f89ae26f) by [@kacieb](https://github.com/kacieb)) -- Add native module for loading split JS bundles in development ([fca3a39da5](https://github.com/facebook/react-native/commit/fca3a39da5f1c31514e8969738e7b2c2d22bc230) by [@makovkastar](https://github.com/makovkastar)) -- Added `listenerCount()` to `DeviceEventEmitter` and `NativeEventEmitter`. ([b11d6ecbb8](https://github.com/facebook/react-native/commit/b11d6ecbb8bb2f0d6f423be6775e587f4e9b1c4d) by [@yungsters](https://github.com/yungsters)) - -#### Android specific - -- Upgrade Hermes to version 0.7 and turn on ES6 Proxy support ([776a415d98](https://github.com/facebook/react-native/commit/776a415d98dffd04b11200812a32204aa1c5e157) and [bb003816a3](https://github.com/facebook/react-native/commit/bb003816a389b8655c53fa34444417c14516459c) by [@Huxpro](https://github.com/Huxpro), [a28dd38909](https://github.com/facebook/react-native/commit/a28dd3890974d699070f08ab43781324411e6f5c) by [@janicduplessis](https://github.com/janicduplessis)) -- Add support for `shadowColor` on API level >= 28 ([cfa4260598](https://github.com/facebook/react-native/commit/cfa42605989eee5a9de42bdb1259fb7f4d9451fb) by [@IjzerenHein](https://github.com/IjzerenHein)) -- Add `android_hyphenationFrequency` prop to Text component ([0fda91ffff](https://github.com/facebook/react-native/commit/0fda91ffffa4972ebe58e3d0b610692a1286eaa1) and [7d8aeb4955](https://github.com/facebook/react-native/commit/7d8aeb4955a4101ca7e8e486f935309c21ab76ff) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Add `accessibilityHint` to TouchableNativeFeedback ([72285d808d](https://github.com/facebook/react-native/commit/72285d808dfce748287a19e2620d58517a5f76e7) by [@CMDadabo](https://github.com/CMDadabo)) -- Adds support for the `onProgress` event on `Image` ([fa0e6f8051](https://github.com/facebook/react-native/commit/fa0e6f8051d2208af467b789a2a9306ec7ddad76) by [@yungsters](https://github.com/yungsters)) -- ScrollView now supports `contentOffset` ([ed29ba13f9](https://github.com/facebook/react-native/commit/ed29ba13f97f240c91fdf6c0ef3fb601046697b9) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Add an explicit NDK version to Android template ([18ffe12203](https://github.com/facebook/react-native/commit/18ffe12203d03b4e960d61d7bb50cd02bba94663) by [@safaiyeh](https://github.com/safaiyeh)) -- Exposed `getFlex` method as part of ReactShadowNode API ([6570f7887b](https://github.com/facebook/react-native/commit/6570f7887b8824705ae09b5653d631428e17bc5f) by [@mdvacca](https://github.com/mdvacca)) -- Add `\*.hprof` files to gitignore ([69ce9c21d4](https://github.com/facebook/react-native/commit/69ce9c21d433a23ffb9934062b46fa64277ee255) by [@enesozturk](https://github.com/enesozturk)) -- Move `DevSettingsActivity` from main to debug ([d8e6c45782](https://github.com/facebook/react-native/commit/d8e6c45782a5c9132bb7ec315fe0b9ba3999e830) by [@invalid-email-address](https://github.com/invalid-email-address)) - -#### iOS specific - -- `PlatformColor`: add missing `clearColor` ([b7167c23fc](https://github.com/facebook/react-native/commit/b7167c23fc052f8d9f8c27a7f4ad9c5cdf51281e) by [@Simek](https://github.com/Simek)) -- Update template to Xcode 12 ([6685aba462](https://github.com/facebook/react-native/commit/6685aba462699c696cb6ac95626b9592deb292fc) by [@janicduplessis](https://github.com/janicduplessis)) -- Add `importantForAccessibility` to `AccessibilityProps` ([fd660fd0c5](https://github.com/facebook/react-native/commit/fd660fd0c50a0acca730bd1ecd427e574bbe81c7) by [@ZHUANGPP](https://github.com/ZHUANGPP)) -- Allow hotkeys to be used without command key ([f2b9ec7981](https://github.com/facebook/react-native/commit/f2b9ec798172db76dfb55f390e1fcea90dd341da) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Add `disableButtonsIndices` option to `ActionSheetIOS` component ([a7c1c5aff2](https://github.com/facebook/react-native/commit/a7c1c5aff24671bba609caeb82092a8de3d3b232) by [@lukewalczak](https://github.com/lukewalczak)) -- Add `showSoftInputOnFocus` to `TextInput` ([d54113d8c4](https://github.com/facebook/react-native/commit/d54113d8c4bcd0e0c7a09acca60819724eb69926) by [@gurs1kh](https://github.com/gurs1kh)) -- Added hostname to loading banner. ([96999339b6](https://github.com/facebook/react-native/commit/96999339b6a7aeabd0cd706ef7736fd91d9ecf80) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Allow iOS `PlatformColor` strings to be ObjC or Swift UIColor selectors ([25793eab56](https://github.com/facebook/react-native/commit/25793eab56217a9961620761ea65ec2fcb97dcb0) by [@tom-un](https://github.com/tom-un)) -- Add Dark Mode support to loading banner ([94c45af136](https://github.com/facebook/react-native/commit/94c45af136f44245b5f2e56bded60c8ebd9b1235) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Allow image loaders to enable/disable image telemetry ([e37708dfb6](https://github.com/facebook/react-native/commit/e37708dfb605dd9ee9f4b2dac5d841d98b7d376c) by [@p-sun](https://github.com/p-sun)) -- Add `RCTDevSplitBundleLoader` native module ([ad879e50bc](https://github.com/facebook/react-native/commit/ad879e50bcd51caca76b1073720f2b63df485ff1) by [@cpojer](https://github.com/cpojer)) - -### Changed - -- Update flipper to 0.75.1 ([3399896ae7](https://github.com/facebook/react-native/commit/3399896ae756719b238e837001077a46508849be) by [@janicduplessis](https://github.com/janicduplessis)) -- Refined Flow type for `Text` component. ([a911efaecd](https://github.com/facebook/react-native/commit/a911efaecd005237816ddb480218eb5388460d16) by [@yungsters](https://github.com/yungsters)) -- Changed type definition of IPerformanceLogger from object to interface ([b90f4d978f](https://github.com/facebook/react-native/commit/b90f4d978fa27e37926d9f4a1d13c9168243798c) by [@rubennorte](https://github.com/rubennorte)) -- Removed `fbjs` dependency from `react-native`. ([54e19a6b7f](https://github.com/facebook/react-native/commit/54e19a6b7f217ffc0611e660f2a6b1a8ad14775b) by [@yungsters](https://github.com/yungsters)) -- Refined `ImageSource` Flow type for array-variant and headers. ([a0dc252dc8](https://github.com/facebook/react-native/commit/a0dc252dc89699f7bd0d733642b98762d0db423a) by [@yungsters](https://github.com/yungsters)) -- Some warnings changed to use `console.warn` without the "Warning:" prefix. ([982272932c](https://github.com/facebook/react-native/commit/982272932cee3be599076bd18b290bc812285533) by [@yungsters](https://github.com/yungsters)) -- Core/Differ: detect and optimize reparenting ([1e4d8d902d](https://github.com/facebook/react-native/commit/1e4d8d902daca8e524ba67fc3c1f4b77698c4d08) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Improve "not a registered callable module" error message ([e27d656ef3](https://github.com/facebook/react-native/commit/e27d656ef370958c864b052123ec05579ac9fc01) by [@vonovak](https://github.com/vonovak)) -- Use `VirtualizedList`'s `onEndReachedThreshold` default value when null is provided ([10b4b9505a](https://github.com/facebook/react-native/commit/10b4b9505a51f8bf3fbc12d296a087b784a9201a) by [@fatalsun](https://github.com/fatalsun)) -- Migrate large amount of modules to flow strict and strict-local ([4409642811](https://github.com/facebook/react-native/commit/4409642811c787052e0baeb92e2679a96002c1e3) by [@rubennorte](https://github.com/rubennorte)) -- Enable exact objects by default in the project template Flow config ([050a7dd019](https://github.com/facebook/react-native/commit/050a7dd019be435b848de0a86030599d83f8791d) by [@rubennorte](https://github.com/rubennorte)) -- Minor fix in Hermes Inspector cli tool help message ([6ffb983f83](https://github.com/facebook/react-native/commit/6ffb983f83afdee5d9290c683c5060d2a959818d)) -- Updated the React Hooks ESLint Plugin in the community ESLint config ([ac87e90fa5](https://github.com/facebook/react-native/commit/ac87e90fa517676440c1adf9575cb48f90de8069) by [@gaearon](https://github.com/gaearon)) -- Don't scroll to `initialScrollIndex` if `contentOffset` is provided to the same `VirtualizedList` ([3346ac7f96](https://github.com/facebook/react-native/commit/3346ac7f96d2fd3f77dca5acb283b28e02ad21fa) by [@markv](https://github.com/markv)) -- Migrated `VirtualizedList` legacy context implementation to `React.Context`. ([7bd694fc6f](https://github.com/facebook/react-native/commit/7bd694fc6f4bb027b6d7ee04034cad41a43e5695) by [@yungsters](https://github.com/yungsters)) -- Changed Flow type of `BackHandler` to be more specific. ([a903d1b86a](https://github.com/facebook/react-native/commit/a903d1b86ab56163abcdcb584f335949ba0c85fc) by [@Naturalclar](https://github.com/Naturalclar)) -- Updated transitive dependency `kind-of` to 6.0.3 to resolve vulnerability ([abde0154ba](https://github.com/facebook/react-native/commit/abde0154ba4247d2c9f1451b5de8b3cba1abd316) by [@TheSavior](https://github.com/TheSavior)) -- Upgrade eslint-config dependencies. ([93019dc190](https://github.com/facebook/react-native/commit/93019dc19072776053a88f9ab595e435b83fead0) by [@wcandillon](https://github.com/wcandillon)) -- Upgrade to Jest 25 ([f248ba1c8b](https://github.com/facebook/react-native/commit/f248ba1c8b15a12a0c590ce8211855cde31defe8) by [@cpojer](https://github.com/cpojer)) -- Use `React.Children.count` for counting children of `TextInput` ([92160f3144](https://github.com/facebook/react-native/commit/92160f3144dcfa510ff14b5f2eb231643f107af9) by [@vonovak](https://github.com/vonovak)) -- Annotate components in QPL logging using ImageAnalyticsTagContext ([60b7a3085c](https://github.com/facebook/react-native/commit/60b7a3085c0d83c126023b98e666ecda6f769454) by [@p-sun](https://github.com/p-sun)) -- Upgrade to React 17 ([24bca492c3](https://github.com/facebook/react-native/commit/24bca492c349ab90d40f9444df0f477145a4c311) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Made promise polyfill conditionalized on Hermes ([0a28b34dac](https://github.com/facebook/react-native/commit/0a28b34dacb91a7e74cd5feec59cf8f8fb0487c9) by [@Huxpro](https://github.com/Huxpro)) -- Flow: Remove type union in PickeriOS/PickerNativeComponent ([3113e47b9b](https://github.com/facebook/react-native/commit/3113e47b9bc92e3b0efb96db776f650848093dfc) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Flow: export ColorValue from StyleSheet instead of StyleSheetTypes ([0a67133124](https://github.com/facebook/react-native/commit/0a6713312467d3f5b5dc993e91db9e7b1aa4fc8c)) -- Forward URL parameters from main bundle to hot reloaded bundles ([b4785e5144](https://github.com/facebook/react-native/commit/b4785e514430dc3ba45ed6d136ec63574be88e26) by [@motiz88](https://github.com/motiz88)) -- Add package name / bundle ID to bundle URL in development ([9b5359133b](https://github.com/facebook/react-native/commit/9b5359133b46b16be200e37dba0b03d82b73b4a0) by [@motiz88](https://github.com/motiz88)) - -#### Android specific - -- Bump Gradle Wrapper to 6.7 ([8988a073b4](https://github.com/facebook/react-native/commit/8988a073b48df0f0cd4a7126edf1a421f4537d58), [5bc67b658e](https://github.com/facebook/react-native/commit/5bc67b658e581e0176deb7ed95b51a5c1cbe65c2), and [3a8559b86c](https://github.com/facebook/react-native/commit/3a8559b86c3c0b0ab6d6c6904c6efd97ab2c7b38) by [@friederbluemle](https://github.com/friederbluemle); [e559aee642](https://github.com/facebook/react-native/commit/e559aee64275126eaa135486e6bf09138be70f4d) and [e9fd93f53f](https://github.com/facebook/react-native/commit/e9fd93f53f8b14f921578cd401b3a6529e4e0c9f) by [@dulmandakh](https://github.com/dulmandakh)) -- Bump Android Gradle Plugin to 4.1.0 ([cf8368f204](https://github.com/facebook/react-native/commit/cf8368f2046ae1ff0f6b02bb6857eeeff8f57d7d) and [553fb8b28d](https://github.com/facebook/react-native/commit/553fb8b28d0ad332d75a944d244832be3390b6ba) by [@friederbluemle](https://github.com/friederbluemle), [dfa9db49e3](https://github.com/facebook/react-native/commit/dfa9db49e34c6f54c04148b877de938bf103a059) by [@dulmandakh](https://github.com/dulmandakh)) -- Bump Okio to 1.17.5 ([1e78e0655d](https://github.com/facebook/react-native/commit/1e78e0655d53ac947f523bcadf9c5339ab07bbb8) by [@dulmandakh](https://github.com/dulmandakh)) -- Make Android versionCodeOverride for new apps using the template human-readable ([e1bf515ae8](https://github.com/facebook/react-native/commit/e1bf515ae8e77fb24f76037d9f22e903799fb637) by [@gedeagas](https://github.com/gedeagas)) -- Bump SoLoader to 0.9.0 ([7465239230](https://github.com/facebook/react-native/commit/7465239230881f453d64364d51272f28614c8653) by [@dulmandakh](https://github.com/dulmandakh)) -- Update Okhttp to version 3.12.12 ([0f6fcb2c27](https://github.com/facebook/react-native/commit/0f6fcb2c2788dc7150f6c3673a8f4f9d8f929441) by [@halaei](https://github.com/halaei)) -- Update Android build tools to 29.0.3 ([e629e94b46](https://github.com/facebook/react-native/commit/e629e94b466ebbd5924b1d4493c026004dad707d) by [@friederbluemle](https://github.com/friederbluemle)) -- ViewCommands on Android now execute earlier, as a perf optimization. ([c6b9cc36da](https://github.com/facebook/react-native/commit/c6b9cc36da4f7d190d05122048aa4ada9c152b73) by [@JoshuaGross](https://github.com/JoshuaGross)) -- Effect of `blurRadius` now more closely matches other platforms. ([64860972be](https://github.com/facebook/react-native/commit/64860972be828fb601acbef11b4c2dbc672dee8a) by [@yungsters](https://github.com/yungsters)) -- Migrate Android tests to Robolectric v4 ([6a78b32878](https://github.com/facebook/react-native/commit/6a78b32878aea1b0dac98ff36378fb9392d4aeb1) by [@jselbo](https://github.com/jselbo), [d373a8d88c](https://github.com/facebook/react-native/commit/d373a8d88c30af910133d97ae973d256c4479929) and [18f7abae07](https://github.com/facebook/react-native/commit/18f7abae07b8ea60c7530a5d9f34541c50f5edd9) by [@fkgozali](https://github.com/fkgozali)) -- Get ripple drawables by id instead of by name ([c8ed2dbbb2](https://github.com/facebook/react-native/commit/c8ed2dbbb287deed05a8782fb8665c1edf45bbac) by [@vonovak](https://github.com/vonovak)) -- `TextInput`: Set `caretHidden` default value to `true` on Xiaomi devices to fix the crash ([b5b4a70410](https://github.com/facebook/react-native/commit/b5b4a7041027fd767850a564b5d80fa4a98ba2a2)) -- Update loading banner text and colors ([6afc984e81](https://github.com/facebook/react-native/commit/6afc984e8187ac91f780f125dad4421576131c83) by [@makovkastar](https://github.com/makovkastar)) -- Declare all attrs used in res targets ([05abbd245c](https://github.com/facebook/react-native/commit/05abbd245c2326b12d24698bb13007a7ce11e586) by [@IanChilds](https://github.com/IanChilds)) - -#### iOS specific - -- Upgraded JSI with a new HERMES_ENABLE_BITCODE flag ([311d4e9ef0](https://github.com/facebook/react-native/commit/311d4e9ef080aa429f840236cc23c013c0ae644c) by [@grabbou](https://github.com/grabbou)) -- Remove main queue execution of constantsToExport in NativeModules ([d7ac21cec5](https://github.com/facebook/react-native/commit/d7ac21cec5492e180fbf3817af7be64ab121cb75) by [@RSNara](https://github.com/RSNara)) -- Updated loading banner messages and color ([3729fe8de0](https://github.com/facebook/react-native/commit/3729fe8de0109c80014f6c20fae8b949b3628de2) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Speed up loading banner animations ([3fb37b4326](https://github.com/facebook/react-native/commit/3fb37b4326090def3aea43bd8189a0df648ccb34) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Shrink loading bar down to not cover safe area. ([f0dfd35108](https://github.com/facebook/react-native/commit/f0dfd35108dd3f092d46b65e77560c35477bf6ba) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Build macOS framework and add CocoaPods podspec ([ffa3d7f638](https://github.com/facebook/react-native/commit/ffa3d7f638c820dc208320193e6ba65667d751eb) by [@alloy](https://github.com/alloy)) -- Set `NSAllowsArbitraryLoads` to `false` by default in template ([7b61a968fd](https://github.com/facebook/react-native/commit/7b61a968fd774a6ca2196a731b6cec4282ab25cc) by [@wddwycc](https://github.com/wddwycc)) - -### Removed - -- `Text.viewConfig` is no longer exported. ([06ce643565](https://github.com/facebook/react-native/commit/06ce64356594a921cd9ae4f71c15dd56dd0e53a3) by [@yungsters](https://github.com/yungsters)) -- Removed `once()` and `removeCurrentListener()` from `DeviceEventEmitter` and `NativeEventEmitter`. ([87a2e29f59](https://github.com/facebook/react-native/commit/87a2e29f5928c2e09ac9a98c54732d5f697d8e61) by [@yungsters](https://github.com/yungsters)) -- Removed tvOS related files from the template ([df03228a61](https://github.com/facebook/react-native/commit/df03228a61881cdfa520fa6d8a9d9cfb6e77fdde) by [@Naturalclar](https://github.com/Naturalclar)) - -#### Android specific - -- Remove undocumented ColorAndroid function ([411c344794](https://github.com/facebook/react-native/commit/411c3447946c18743476e7d613358233464d6f58) by [@tom-un](https://github.com/tom-un)) - -### Fixed - -- Fix handling of very deeply nested data across the bridge ([a8c90e6af4](https://github.com/facebook/react-native/commit/a8c90e6af4a4e5ac115016a3e8977ecff90e99a0) by [@mhorowitz](https://github.com/mhorowitz)) -- Prevent TypeError in TaskQueue when cancelling a started but not resolved promise. ([14042fb76f](https://github.com/facebook/react-native/commit/14042fb76fee3573529d590ec6f8ad216aa0b820) by [@robwalkerco](https://github.com/robwalkerco)) -- Fix typo in `ActionSheetManager` invariant message ([9c353b5ab0](https://github.com/facebook/react-native/commit/9c353b5ab060be9392a7aaf437bba4ffc56d78ca) by [@sweatherall](https://github.com/sweatherall)) -- `TouchableHighlight` now correctly fires `onPress` when pressed for >500ms, when `onLongPress` is not supplied. ([bdf3c79110](https://github.com/facebook/react-native/commit/bdf3c7911007f547101d753903da11ea4ee095f9) by [@yungsters](https://github.com/yungsters)) -- `Pressability` now consistently fires `onPressIn` and `onPressOut`, even without an `onPress`. ([0c392bc405](https://github.com/facebook/react-native/commit/0c392bc4052784de7497bf7b5eaf207b02409877) by [@yungsters](https://github.com/yungsters)) -- Remove extraneous argument for `onResponderGrant` Flow type on `Text`. ([49015b0f5b](https://github.com/facebook/react-native/commit/49015b0f5bda83794b88b17dd3cbd834fa235b72) by [@yungsters](https://github.com/yungsters)) -- Prevent `ScrollView` From Stealing Responder Capture When Using Physical Keyboard ([93e7a7a70d](https://github.com/facebook/react-native/commit/93e7a7a70dc2f41fccd3c1e4cce80d92913c4243) by [@NickGerleman](https://github.com/NickGerleman)) -- Fix failure when debugging code in a browser; was caused by `performanceNow()` function. ([db474a47b7](https://github.com/facebook/react-native/commit/db474a47b70e4fa50f594f4dea8a2f531ca9fc07) by [@zerkella](https://github.com/zerkella)) -- Fix test renderer mocks to use the `displayName` more often. ([4b935ae95f](https://github.com/facebook/react-native/commit/4b935ae95f09e4a1eb1e5ac8089eb258222a0f8b) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Make sure `LogBox` is not included in production bundles ([d3b937f990](https://github.com/facebook/react-native/commit/d3b937f990012a31b8d917e220f4ed2f0a4fd2d3) by [@janicduplessis](https://github.com/janicduplessis)) -- Mark `force` as an optional property of the PressEvent object ([ad2f98df8f](https://github.com/facebook/react-native/commit/ad2f98df8f2ad8aff1dcdc11b187f35b372e3f0e) by [@Simek](https://github.com/Simek)) -- Fix invalid `event` objects from `onPressOut` in certain cases ([2c600b7c5a](https://github.com/facebook/react-native/commit/2c600b7c5a0e79bfc632b39b471e6ba774d7b0b3) by [@yungsters](https://github.com/yungsters)) -- When Hermes debugger is enabled continue to send log messages to the console ([77ef8f881f](https://github.com/facebook/react-native/commit/77ef8f881f2e4067894b412f308e2a80042c946f) by [@MartinSherburn](https://github.com/MartinSherburn)) -- Handle nullish `initialProps` correctly in `renderApplication` ([26c120c632](https://github.com/facebook/react-native/commit/26c120c6329d45e27318d82aaf5a50338bd6fa7d) by [@rubennorte](https://github.com/rubennorte)) -- Fix Flow type of Touchable{Opacity,Bounce,Highlight} being exported as `any` ([de7f69a58e](https://github.com/facebook/react-native/commit/de7f69a58ed4e18887f4b9d4d853293fb136afb7) by [@draperunner](https://github.com/draperunner)) -- Clarified the boundaries in error message of `scrollToIndex` ([78d2b3c813](https://github.com/facebook/react-native/commit/78d2b3c8138f54c2433958b0ad6b9f52ca59115a) by [@sasurau4](https://github.com/sasurau4)) -- Fix jsi cmake include dirs ([f5d00e5a29](https://github.com/facebook/react-native/commit/f5d00e5a2922d35a0b44935592da5700518c422b) by [@ryantrem](https://github.com/ryantrem)) -- Fix race condition in `KeyboardAvoidingView` ([b08fff6f86](https://github.com/facebook/react-native/commit/b08fff6f869e00c20c0dcdf7aca71284c2f276f0) by [@sammy-SC](https://github.com/sammy-SC)) -- Fix clone issue in YogaNodeJNIBase ([2707c17b07](https://github.com/facebook/react-native/commit/2707c17b0727f241d404f4a21090021c27c66f2c) by [@pasqualeanatriello](https://github.com/pasqualeanatriello)) -- Fix "Cannot read property 'getNativeScrollRef' of undefined" in createAnimatedComponent ([629e10e91b](https://github.com/facebook/react-native/commit/629e10e91b728c4251f1ed78a50df62820ce0dc4) by [@sammy-SC](https://github.com/sammy-SC)) - -#### Android specific - -- Fix App Bundle/Release build missing index.android.bundle with gradle plugin 4.1.0/gradle 6.5 ([53f55001af](https://github.com/facebook/react-native/commit/53f55001afbf07494de0df064a92dfdd42f37c98) by [@tomoima525](https://github.com/tomoima525)) -- Do not crash when `ScrollView` `snapToOffsets` array is empty ([d238da71aa](https://github.com/facebook/react-native/commit/d238da71aa8cdd7ce519de617a9a200406da794c) by [@makovkastar](https://github.com/makovkastar)) -- Fixed `TextInput` not being selectable in `removeClippedSubviews` FlatLists ([12a50c0a44](https://github.com/facebook/react-native/commit/12a50c0a442b78d9095398d955bec307cfcb0f69) by [@hsource](https://github.com/hsource)) -- Make nested `Text` components accessible as links ([b352e2da81](https://github.com/facebook/react-native/commit/b352e2da8137452f66717cf1cecb2e72abd727d7) by [@ejanzer](https://github.com/ejanzer)) -- Move selection to the end of the text input on accessibility click ([f0e80ae229](https://github.com/facebook/react-native/commit/f0e80ae2292ebf7ce32666900007845724844fb5) by [@ejanzer](https://github.com/ejanzer)) -- Fix secure text entry setting to always hide text ([f19372361f](https://github.com/facebook/react-native/commit/f19372361f22201a453ff38eb69c5fa052b57474) by [@smeenai](https://github.com/smeenai)) -- Make promise NativeModule methods dispatch to NativeModules thread ([9c35b5b8c4](https://github.com/facebook/react-native/commit/9c35b5b8c4710dfe6a4b689a5565aa78ae5b37d3) by [@RSNara](https://github.com/RSNara)) -- Fix `NoSuchMethodException` when calling `DisplayMetricsHolder.initDisplayMetrics` in Android API level <= 16 (though those Android versions are no longer supported) ([35128f45d1](https://github.com/facebook/react-native/commit/35128f45d1ba97010e437423d14fa5ea0faf5fa3) by [@mdvacca](https://github.com/mdvacca)) -- Fixed error message in `DebugCorePackage.getModule` ([a71f37b951](https://github.com/facebook/react-native/commit/a71f37b951ca49c180b037ea8955851654b09afa) by [@TheWirv](https://github.com/TheWirv)) -- ScrollView, HorizontalScrollView: do not ignore `null` `contentOffset` prop ([9e85b7ad88](https://github.com/facebook/react-native/commit/9e85b7ad889900cd57cd2f82286aa8e034b0a32b) by [@vonovak](https://github.com/vonovak)) -- Picker - fix usage of setNativeSelectedPosition in onSelect ([078e386024](https://github.com/facebook/react-native/commit/078e386024474edc9b464f6c0fd8a1429e922289)) -- Fix intermittent crash of ReactSlider on Android ([32888a8b4a](https://github.com/facebook/react-native/commit/32888a8b4a9d75b9d3f6cc4578ce6a6ccd932407) by [@mdvacca](https://github.com/mdvacca)) -- Use actual constructor when throwing GradleScriptException ([8ef0f1d90b](https://github.com/facebook/react-native/commit/8ef0f1d90bbb2fa98e48ce89281718e5ac79365a)) -- Fix `skewX` transform decomposition ([797367c089](https://github.com/facebook/react-native/commit/797367c0890a38ec51cfaf7bd90b9cc7db0e97c7) by [@wcandillon](https://github.com/wcandillon)) -- Allow passing partial contentOffset to ScrollView on Android ([0348953914](https://github.com/facebook/react-native/commit/03489539146556ec5ba6ba07ac338ce200f5b0f4) by [@janicduplessis](https://github.com/janicduplessis)) -- Check if NativeModules returned from CatalystInstanceImpl.getNativeModule are null before using them. ([9263eb5d38](https://github.com/facebook/react-native/commit/9263eb5d3864a42925b699343db2c09cc8934ed0) by [@RSNara](https://github.com/RSNara)) -- Fix calculating view position within the window in split-screen mode ([b020e7c440](https://github.com/facebook/react-native/commit/b020e7c440f58dabd4cc64b72869f3ae9680ef30) by [@jakubkinst](https://github.com/jakubkinst)) -- Text layout no longer ignores parent bounds ([025be8148a](https://github.com/facebook/react-native/commit/025be8148a9abc533a8ae108e49cfd3f4512c581) by [@yungsters](https://github.com/yungsters)) -- Fixed excessive space in Text view with word-wrapping ([dda7f82261](https://github.com/facebook/react-native/commit/dda7f82261cc5684564e2c67071c13e379985308) by [@yungsters](https://github.com/yungsters)) -- `Pressable`: ripple should be applied even when borderless == false ([44ec762e41](https://github.com/facebook/react-native/commit/44ec762e41029bf43530b1ff9b36ca3512c526e2) by [@vonovak](https://github.com/vonovak)) -- Fix `ReadableNativeMap.getNullableValue` to match signature and return null instead of throwing ([1015194ba1](https://github.com/facebook/react-native/commit/1015194ba1a81eab99000d589914100e4b9ea037) by [@dulmandakh](https://github.com/dulmandakh)) -- `Picker`: set color filter so that the arrow matches the text color ([bb8d0f5732](https://github.com/facebook/react-native/commit/bb8d0f57328a20c942991f2d19d86639a7791924) by [@ejanzer](https://github.com/ejanzer)) -- `Modal`: fix crash when updating props after the activity disappeared ([7abcaafd66](https://github.com/facebook/react-native/commit/7abcaafd6600535825aa8330af7290ba8acea245) by [@mdvacca](https://github.com/mdvacca)) -- Fix crash while measuring ReactSlider in Android API < 21 ([75e6f7961f](https://github.com/facebook/react-native/commit/75e6f7961fb3f6de6afbe79d49c42ad55fba1673) by [@mdvacca](https://github.com/mdvacca)) -- Fix measureLayout function for VirtualTexts ([5c48c94f8c](https://github.com/facebook/react-native/commit/5c48c94f8c0441bc78a007f0ea0c5b2763ff6875) by [@mdvacca](https://github.com/mdvacca)) -- Smoother scrolling in ScrollView, HorizontalScrollView ([10314fe621](https://github.com/facebook/react-native/commit/10314fe621e1649654e83df197adf657e0ca8363) by [@JoshuaGross](https://github.com/JoshuaGross)) - -#### iOS specific - -- Synchronize RCTImageLoader loaders initialization ([edb6fa7979](https://github.com/facebook/react-native/commit/edb6fa79791beb804e450ca4a562a248abf730e5) by [@p-sun](https://github.com/p-sun)) -- Make sure js bundle still exists at bundle-output path ([3a41f69f9c](https://github.com/facebook/react-native/commit/3a41f69f9ce1ab778112c0727a69a753fe36c77a) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix crash in WebSocket module ([748aa13747](https://github.com/facebook/react-native/commit/748aa137472d6080427f74bb686c795b925c7d43) by [@marksinkovics](https://github.com/marksinkovics)) -- Align multi-line `TextInput` `onSubmitEditing` behavior: don't call onSubmitEditing when blurOnSubmit=false ([521b16730d](https://github.com/facebook/react-native/commit/521b16730dd07d80261086c2f33eed2a766d404e) by [@tido64](https://github.com/tido64)) -- Fix passing react native path in Podfile template ([e599d6c5d3](https://github.com/facebook/react-native/commit/e599d6c5d338c1b4d1a0d988e0d9ff83c179fb54) by [@janicduplessis](https://github.com/janicduplessis)) -- Call [RCTEventEmitter stopObserving] on correct method queue ([23717e48af](https://github.com/facebook/react-native/commit/23717e48aff3d7fdaea30c9b8dcdd6cfbb7802d5) by [@appden](https://github.com/appden)) -- Persist Enable Fast Refresh across app launches ([845e9eaafb](https://github.com/facebook/react-native/commit/845e9eaafb08b4ca87a9987e840798e0ba011676) by [@stigi](https://github.com/stigi)) -- Fix xcodebuild warnings in React-Core ([cb719a16cc](https://github.com/facebook/react-native/commit/cb719a16cc496b0cdb09d8d971b5e95cc8863b77)) -- Fix that RCTModalHostView can't be dismissed while being presented ([8933724d7d](https://github.com/facebook/react-native/commit/8933724d7d0f9ec012b2708d8e737f02f03e4a6f) by [@Mi-ZAZ](https://github.com/Mi-ZAZ)) -- Fix "'RCTBlobPlugins.h' file not found" when building iOS ([aaeffdb49a](https://github.com/facebook/react-native/commit/aaeffdb49a8412a98bb52477933fd208d1dcc096) by [@tido64](https://github.com/tido64)) -- Improved text rendering on macOS Catalyst ([694e22de84](https://github.com/facebook/react-native/commit/694e22de847e5f789b7d5ffe472b63aabbd7a5b0) by [@andymatuschak](https://github.com/andymatuschak)) -- Fixed showing Alert while closing a Modal ([f319ff321c](https://github.com/facebook/react-native/commit/f319ff321c4b7c0929b99e3ebe7e1ce1fa50b34c) by [@devon94](https://github.com/devon94)) -- Fix `refreshControl` messes up navigationBar largeTitles ([1b0fb9bead](https://github.com/facebook/react-native/commit/1b0fb9bead4d158d14df5a994423d06716b5e377) by [@yogevbd](https://github.com/yogevbd)) -- When Sec-WebSocket-Protocol header is empty vaulue, IIS server will return error 502. ([fd85b84a86](https://github.com/facebook/react-native/commit/fd85b84a863cea9f33e5b39230b27af53c1307e7) by [@bill2004158](https://github.com/bill2004158)) -- Fix multiline `TextInput` crash when inserting/removing lots of text ([15dda0ab5a](https://github.com/facebook/react-native/commit/15dda0ab5a491dcc83539f9ef32c9896be41074a) by [@tido64](https://github.com/tido64)) -- Group accessible views using the view hierarchy ([e2fd9d4f22](https://github.com/facebook/react-native/commit/e2fd9d4f22cda85c995c38875fc3a2a20a198c4a) by [@p-sun](https://github.com/p-sun)) -- Fix Flow types for StatusBar showHideTransition ([e5a8f4270e](https://github.com/facebook/react-native/commit/e5a8f4270ea71749a5ce6bd7ae198f695edb4307) by [@Simek](https://github.com/Simek)) -- Better error message when missing entry file ([e73208e2ca](https://github.com/facebook/react-native/commit/e73208e2ca59a2cf6a8a9c5e4e5b33afb5131f09) by [@petrbela](https://github.com/petrbela)) -- Fix imports in `RCTUtilsUIOverride.h` ([b7e8f66795](https://github.com/facebook/react-native/commit/b7e8f667953c2bc65c25b00968051c063a684d01) by [@Fanghao](https://github.com/Fanghao)) -- Fix skewX/skewY/perspective/matrix transforms. ([4b956fe5a6](https://github.com/facebook/react-native/commit/4b956fe5a6b3a05b1c2883efc82a95c2524aeb56) by [@wcandillon](https://github.com/wcandillon)) -- Fix module lookup race condition on bridge invalidation. ([8ad810717e](https://github.com/facebook/react-native/commit/8ad810717ee1769aa5ff6c73e0c9bfa8c43a3bac) by [@fkgozali](https://github.com/fkgozali)) -- Fix duration calculation for `RCTUIImageViewAnimated` ([12f8b2598f](https://github.com/facebook/react-native/commit/12f8b2598fa46533ea59834a0225cc9e36b20111)) -- Cap loading banner percentage at 100% ([e27542bb13](https://github.com/facebook/react-native/commit/e27542bb13d1f8f422cd307c4d43148c8bd82bc0) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Delay loading banner message to prevent flashing messages ([2b771b0129](https://github.com/facebook/react-native/commit/2b771b0129f2ef921c7cdb9c952e004f931927c3) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Do not update loading banner message while hiding the banner ([131c497aa2](https://github.com/facebook/react-native/commit/131c497aa2c081f9dfd03e45b25fb7ae388b98bd) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Search en0 through en8 for the Metro Bundler's IP address when generating iOS debug builds ([b2b23a2017](https://github.com/facebook/react-native/commit/b2b23a20170d12f6d8bf2733b93d7f9ab9c6cb15)) -- Migrate `frameInterval` to `preferredFramesPerSecond`, fixing Xcode warnings ([335f3aabe2](https://github.com/facebook/react-native/commit/335f3aabe28ec8f9b96fd695edabf0d5ab0b402a) by [@safaiyeh](https://github.com/safaiyeh)) -- Animated image should animate at the same speed regardless of framerate ([b0d0e51a77](https://github.com/facebook/react-native/commit/b0d0e51a7724dcefe3ce1c2dfb334a731b2a385c) by [@p-sun](https://github.com/p-sun)) -- Fix logging lifecycle when image is scrolled out and immediately back in ([1f95c9b62e](https://github.com/facebook/react-native/commit/1f95c9b62e306fdaf0ef351b02fb79713941259c) by [@p-sun](https://github.com/p-sun)) -- Fix image instrumentation lifecycle on image cancel ([6cba4d2006](https://github.com/facebook/react-native/commit/6cba4d20068ef4ca9b9832e4c5cf71a7e361ddbe) by [@p-sun](https://github.com/p-sun)) -- Break retain cycle in RCTLegacyViewManagerInteropCoordinator ([8f90ce26a5](https://github.com/facebook/react-native/commit/8f90ce26a55f2b1aab42d7c44b0d527321fa8c21) by [@sammy-SC](https://github.com/sammy-SC)) -- Respect port information if available from RCTBundleURLProvider ([7d44959940](https://github.com/facebook/react-native/commit/7d44959940b7f7b03feefde0e9a15382f04dad6d) by [@jimmy623](https://github.com/jimmy623)) -- Remove port from JSLocation when returning packager host ([12543d557f](https://github.com/facebook/react-native/commit/12543d557f00545a719b4dfd76cc0d0adfa37a01) by [@jimmy623](https://github.com/jimmy623)) -- Remove requestToken being nil check from [RCTNetworkTask validateRequestToken] ([ffc90c7f92](https://github.com/facebook/react-native/commit/ffc90c7f92e63e1a53ed107833e3deed492ab435) by [@sammy-SC](https://github.com/sammy-SC)) -- Remove unnecessary packager running check when saved JSLocation is empty ([bbb7bef539](https://github.com/facebook/react-native/commit/bbb7bef539f418bdb452e40987d399c9369df5a2) by [@jimmy623](https://github.com/jimmy623)) -- Check whether packager is running in RCTBundleURLProvider for saved JSLocation ([3d882495d5](https://github.com/facebook/react-native/commit/3d882495d5e4415c2ebb8f4280e18e16025e0736) by [@jimmy623](https://github.com/jimmy623)) -- Fix crash inside RCTRedBox when trying to present same UIViewController twice ([46c77dc296](https://github.com/facebook/react-native/commit/46c77dc296dfab754356cd9346a01dae8d4869f4) by [@sammy-SC](https://github.com/sammy-SC)) -- Fix outdated CocoaPods version requirement in a React.podspec ([8a6ac1fef3](https://github.com/facebook/react-native/commit/8a6ac1fef369071405a3bf14a89924c66f28d192) by [@sunnylqm](https://github.com/sunnylqm)) - -## v0.63.5 - -🚨 **IMPORTANT:** This is an exceptional release on an unsupported version. We recommend you upgrade to one of [the supported versions, listed here](https://github.com/reactwg/react-native-releases#which-versions-are-currently-supported). - -### Fixed - -- Add an afterEvaluate to solve AGP 3.x configuration resolution ([473a36099c](https://github.com/facebook/react-native/commit/473a36099c80de08591e3cb51687f7d531145ee3) by [@cortinico](https://github.com/cortinico)) -- Force dependencies resolution to minor series for 0.63 ([28cc286cc4](https://github.com/facebook/react-native/commit/28cc286cc4d43b9fe5153d779ea3eecf4d72c51e) by [@cortinico](https://github.com/cortinico)) - -## v0.63.4 - -### Changed - -- [Maintenance] Bump detox to xcode 12 compatible version ([ccd4efac90](https://github.com/facebook/react-native/commit/ccd4efac90191e57b1dd6e7fff0da13e5764bcc4) by [@kelset](https://github.com/kelset)) - -#### Android specific - -- Bump SoLoader to 0.9.0 ([7465239230](https://github.com/facebook/react-native/commit/7465239230881f453d64364d51272f28614c8653) by [@dulmandakh](https://github.com/dulmandakh)) -- Update Okhttp to version 3.12.12 ([0f6fcb2c27](https://github.com/facebook/react-native/commit/0f6fcb2c2788dc7150f6c3673a8f4f9d8f929441) by [@halaei](https://github.com/halaei)) -- ScrollView now supports `contentOffset` ([ed29ba13f9](https://github.com/facebook/react-native/commit/ed29ba13f97f240c91fdf6c0ef3fb601046697b9) by [@JoshuaGross](https://github.com/JoshuaGross)) - -### Fixed - -#### Android specific - -- Fix ReadableNativeMap.getNullableValue to match signature ([1015194ba1](https://github.com/facebook/react-native/commit/1015194ba1a81eab99000d589914100e4b9ea037) by [@dulmandakh](https://github.com/dulmandakh)) -- Dimension update events are now properly sent following orientation change ([0e9296b95d](https://github.com/facebook/react-native/commit/0e9296b95da06789121f052e6cd6d7cac808464c) by [@ajpaulingalls](https://github.com/ajpaulingalls)) -- Font family is not apply when secureTextEntry is true. ([00d9deaf6b](https://github.com/facebook/react-native/commit/00d9deaf6ba26c605694d303bb0cb072fceae5a1) by [@hank121314](https://github.com/hank121314)) -- Fix App Bundle/Release build missing index.android.bundle with gradle plugin 4.1.0/gradle 6.5 ([53f55001af](https://github.com/facebook/react-native/commit/53f55001afbf07494de0df064a92dfdd42f37c98) by [@tomoima525](https://github.com/tomoima525)) -- ScrollView, HorizontalScrollView: do not ignore `null` `contentOffset` prop ([9e85b7ad88](https://github.com/facebook/react-native/commit/9e85b7ad889900cd57cd2f82286aa8e034b0a32b) by [@vonovak](https://github.com/vonovak)) -- SkewX transforms ([797367c089](https://github.com/facebook/react-native/commit/797367c0890a38ec51cfaf7bd90b9cc7db0e97c7) by [@wcandillon](https://github.com/wcandillon)) -- Allow passing partial contentOffset to ScrollView on Android ([0348953914](https://github.com/facebook/react-native/commit/03489539146556ec5ba6ba07ac338ce200f5b0f4) by [@janicduplessis](https://github.com/janicduplessis)) -- Set color filter so that the arrow matches the text color ([bb8d0f5732](https://github.com/facebook/react-native/commit/bb8d0f57328a20c942991f2d19d86639a7791924) by [@ejanzer](https://github.com/ejanzer)) - -#### iOS specific - -- A crash in WebSocket module ([748aa13747](https://github.com/facebook/react-native/commit/748aa137472d6080427f74bb686c795b925c7d43) by [@marksinkovics](https://github.com/marksinkovics)) -- Fixed showing Alert while closing a Modal ([f319ff321c](https://github.com/facebook/react-native/commit/f319ff321c4b7c0929b99e3ebe7e1ce1fa50b34c) by [@devon94](https://github.com/devon94)) -- Bug with skewX/skewY/perspective/matrix transforms. ([4b956fe5a6](https://github.com/facebook/react-native/commit/4b956fe5a6b3a05b1c2883efc82a95c2524aeb56) by [@wcandillon](https://github.com/wcandillon)) - -## v0.63.3 - -### Added - -#### iOS specific - -- Ability to set which configuration to enable flipper for when using use_flipper! ([dc2df75426](https://github.com/facebook/react-native/commit/dc2df754267df3909631d81c22b9fcab58dfa241) by [@nicoburns](https://github.com/nicoburns)) - -### Changed - -- Update Flipper to 0.54 ([d8b70b19b3](https://github.com/facebook/react-native/commit/d8b70b19b39ead4dd41895d666d116a43c56474e) by [@mweststrate](https://github.com/mweststrate)) -- Removed default 130ms delay from Pressability and Pressable. ([86ffb9c41e](https://github.com/facebook/react-native/commit/86ffb9c41e033f59599e01b7ad016706b5f62fc8) by [@yungsters](https://github.com/yungsters)) - -### Fixed - -#### Android specific - -- `KeyboardDidHide` wrong `screenY` coordinates with `windowTranslucentStatus=true` ([45954ac5dc](https://github.com/facebook/react-native/commit/45954ac5dccdfe05de7553a0f08c4f0e66e3d62e) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987)) -- Fix Xiaomi TextInput crash in native ([07a597ad18](https://github.com/facebook/react-native/commit/07a597ad185c8c31ac38bdd4d022b0b880d02859)) - -#### iOS specific - -- Prefetch images using a lower download priority ([058eeb43b4](https://github.com/facebook/react-native/commit/058eeb43b489f52183f081fb7232be683002a242) by [@p-sun](https://github.com/p-sun)) -- Fix `RCTImageLoader` not using decoders provided. ([663b5a878b](https://github.com/facebook/react-native/commit/663b5a878be9faafd13b41c222a1bc2ac7bb3a65) by [@sjchmiela](https://github.com/sjchmiela)) -- Support Swift based libraries using Xcode 12’s build system. ([6e08f84719](https://github.com/facebook/react-native/commit/6e08f84719c47985e80123c72686d7a1c89b72ed) by [@alloy](https://github.com/alloy)) -- Fix "main.jsbundle does not exist" issue ([83777cb4fb](https://github.com/facebook/react-native/commit/83777cb4fb5dda89c430b7eff9cd1f28d2577831)) -- Fixed headers in `Image.getSizeWithHeaders`. ([0bcc686c1c](https://github.com/facebook/react-native/commit/0bcc686c1cc90fd44de7a28e2f56ea20fe2f5123) by [@PaitoAnderson](https://github.com/PaitoAnderson)) - -### Security - -- Fix security issues with `@react-native-community/cli` by bumping version ([001eb7cbd6](https://github.com/facebook/react-native/commit/001eb7cbd66c7dc1a302ee2a638c1cfc164538f4) by [@alexbrazier](https://github.com/alexbrazier)) - -## v0.63.2 - -### Fixed - -- Restore Previous Behavior for StyleSheet Validation of Null/Undefined Styles ([e75557b48f](https://github.com/facebook/react-native/commit/e75557b48fbee1d136b8b7d1a78ea8f9b9467479) by [@NickGerleman](https://github.com/NickGerleman)) - -#### Android specific - -- Set LogBox windowTranslucentNavigation to false ([23036b38bc](https://github.com/facebook/react-native/commit/23036b38bc4443c8db4865e5c2b21aca7ab4f92f) by [@Ashoat](https://github.com/Ashoat)) -- Fix unable to run in debug mode on Android API < 21 ([7694b32a88](https://github.com/facebook/react-native/commit/7694b32a88078278457dd8721eb61da9c4ac0f5a) by [@Shywim](https://github.com/Shywim)) - -#### iOS specific - -- Fix image cannot show in iOS 14 ([123423c2a9](https://github.com/facebook/react-native/commit/123423c2a9258c9af25ca9bffe1f10c42a176bf3)) - -## v0.63.1 - -### Added - -- Added `minPressDuration` to `Pressable`. ([4aaf629982](https://github.com/facebook/react-native/commit/4aaf62998247bcfd8ebf369d73290096fde08012) by [@yungsters](https://github.com/yungsters)) -- Support for array buffers in the JavaScriptCore implementation of JSI ([9c32140068](https://github.com/facebook/react-native/commit/9c32140068463739b91874689f741ea9630d8c3b) by [@ryantrem](https://github.com/ryantrem)) - -#### Android specific - -- ProGuard rule for hermes ([449dc37720](https://github.com/facebook/react-native/commit/449dc37720b24d9d88661314424c9f982e70ec3a) by [@radko93](https://github.com/radko93)) - -### Fixed - -- LogBox.ignoreAllLogs() should ignore logs ([f28c7505fa](https://github.com/facebook/react-native/commit/f28c7505fa5b4a7ddf1e9311d38dfcd15e8953a2) by [@rickhanlonii](https://github.com/rickhanlonii)) - -#### Android specific - -- Fix font variant crash on Android < 4.4 ([f23feced42](https://github.com/facebook/react-native/commit/f23feced42abd1d18a12e413bf79a51bead61379) by [@Almouro](https://github.com/Almouro)) -- Fix border-drawing when changing border-radius back to 0` ([7757ad0576](https://github.com/facebook/react-native/commit/7757ad05762284c059807d7d75fd03559e86f2b2) by [@IjzerenHein](https://github.com/IjzerenHein)) -- Fix rounded border-drawing when border-radius is smaller than border-width` ([28dce3665d](https://github.com/facebook/react-native/commit/28dce3665d8a63e902c165c060400486fe6234f4) by [@IjzerenHein](https://github.com/IjzerenHein)) - -#### iOS specific - -- TextInput color has the same default (#000) on iOS whether in light or dark mode ([a2f8b9c36e](https://github.com/facebook/react-native/commit/a2f8b9c36e5eba6bc354a2f53bf8d3ca11297d00) by [@JonnyBurger](https://github.com/JonnyBurger)) -- Fixes TextInput shaking when typing Chinese ([9cdc19a936](https://github.com/facebook/react-native/commit/9cdc19a93669b37c0518bd32263e156ffc9193c7) by [@zhongwuzw](https://github.com/zhongwuzw)) - -## v0.63.0 - -### Breaking - -- The `target` field of events is now a native component, not a react tag ([3b813cade1](https://github.com/facebook/react-native/commit/3b813cade1f5d6f248a39f6bbd983f68c5794fe6) by [@TheSavior](https://github.com/TheSavior)) -- Modal: Remove support for `animated` prop (deprecated in 0.26) ([1e9db7bd6d](https://github.com/facebook/react-native/commit/1e9db7bd6df3055b9b81d23f15a54bb250621a41) by [@TheSavior](https://github.com/TheSavior)) -- Alert: Remove deprecated support for passing callback as fourth argument to `Alert.prompt` (deprecated in 0.59) ([a26d622d04](https://github.com/facebook/react-native/commit/a26d622d04451d6872eed2491e5d3f7d4689824d) by [@TheSavior](https://github.com/TheSavior)) -- Switch: Remove support for `thumbTintColor`, `tintColor`, `onTintColor` props (deprecated in 0.57) ([26912bd979](https://github.com/facebook/react-native/commit/26912bd9798aeb38931466b8ddcd3a48973b0528) by [@TheSavior](https://github.com/TheSavior)) -- Multiple deprecations and breaking changes to `TextInputState`. Use native component refs instead of react tags ([6286270e4c](https://github.com/facebook/react-native/commit/6286270e4cb10b40cfd7c8193e31d965f6815150) by [@TheSavior](https://github.com/TheSavior)) -- Bump supported Node engines to >= 10 ([f0c7178a3a](https://github.com/facebook/react-native/commit/f0c7178a3a24e7694b765946f0d884104c8cfa4c) by [@safaiyeh](https://github.com/safaiyeh)) - -### Deprecated - -- Add deprecation warnings for `Clipboard`, `SegmentedControlIOS`, `ProgressViewIOS`, `ProgressBarAndroid`. These modules have been moved to [react-native-community](https://github.com/react-native-community) libraries. ([f295d7f608](https://github.com/facebook/react-native/commit/f295d7f60843a45bb09fc366e497f512c2bc0046) by [@Naturalclar](https://github.com/Naturalclar)) -- Deprecated `console.disableYellowBox` in favor of `LogBox.ignoreAllLogs`. ([87f1e22434](https://github.com/facebook/react-native/commit/87f1e22434210ad22f526422bbda0413f59786ce) by [@rickhanlonii](https://github.com/rickhanlonii)) - -#### Android specific - -- We are deprecating the method `UIManagerModule.resolveRootTagFromReactTag`, this will not be supported in the next version of RN ([acbf9e18ea](https://github.com/facebook/react-native/commit/acbf9e18ea666b07c1224a324602a41d0a66985e) by [@mdvacca](https://github.com/mdvacca)) -- Add warning message for trying to use `ToolbarAndroid` which has been removed from the core since 0.61. ([6249d14a61](https://github.com/facebook/react-native/commit/6249d14a61723b22deb1336457b4295978471885) by [@Naturalclar](https://github.com/Naturalclar)) - -#### iOS specific - -- Deprecate iOS 9.x support ([58a6a40eac](https://github.com/facebook/react-native/commit/58a6a40eac9afb5c4de78a63418cc48ea97da1a4), [829a2237d2](https://github.com/facebook/react-native/commit/829a2237d270c03c80467eb6c2b5b18c87135a45), [674b591809](https://github.com/facebook/react-native/commit/674b591809cd1275b5f1c4d203c2f0ec52303396) by [@fkgozali](https://github.com/fkgozali), [d1265077d6](https://github.com/facebook/react-native/commit/d1265077d6638bb9219180628caf6ff83f8d6019) by [@sunnylqm](https://github.com/sunnylqm)) - -### Added - -- Implement `nativePerformanceNow` and `performance.now()` ([232517a574](https://github.com/facebook/react-native/commit/232517a5740f5b82cfe8779b3832e9a7a47a8d3d) by [@emilisb](https://github.com/emilisb)) -- Support `PerformanceLogger` stopTimespan updates ([08c338eebf](https://github.com/facebook/react-native/commit/08c338eebf67ef6c8c8fb7e3a91bbf89bbc2bb4c) by [@sahrens](https://github.com/sahrens)) -- Added `PlatformColor` implementations for iOS and Android ([f4de45800f](https://github.com/facebook/react-native/commit/f4de45800f25930a1c70f757d12269d859066d3d) by [@tom-un](https://github.com/tom-un)) -- Stamp React Native Version Into C++ Code ([427ba359e0](https://github.com/facebook/react-native/commit/427ba359e0c9411438286dd137bbca67f9829fde) by [@NickGerleman](https://github.com/NickGerleman)) -- New `` Component to make it easier to create touchable elements ([3212f7dfe8](https://github.com/facebook/react-native/commit/3212f7dfe82d187e27f1410c8c3cb1d9fb9f5094) by [@TheSavior](https://github.com/TheSavior), [bd3868643d](https://github.com/facebook/react-native/commit/bd3868643d29e93610e19312571a9736df2cbdf8) by [@vonovak](https://github.com/vonovak)) -- Export `LogBox` module ([799bf56f6f](https://github.com/facebook/react-native/commit/799bf56f6f6a46b6bd42ac5a824f44bd1412f3b6) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Export `LayoutAnimationConfig` flow type ([f0dafd34fe](https://github.com/facebook/react-native/commit/f0dafd34fedb0d63eb2499b978a52da9e6b71ea1) by [@sahrens](https://github.com/sahrens)) -- Added `react-native-community/eslint-plugin` as a dependency for `react-native-community/eslint-config` ([2c2e35c634](https://github.com/facebook/react-native/commit/2c2e35c634cd936bd7ea7a7fe444058268308224) by [@Naturalclar](https://github.com/Naturalclar)) -- `DEBUG_NETWORK_SEND_DELAY` can be used to simulate slow network. ([4aac019176](https://github.com/facebook/react-native/commit/4aac019176e3359068ac671ed4157a6e3ada481f) by [@sahrens](https://github.com/sahrens)) -- Support for `accessibilityLabel` prop to the `Picker` component ([0a525b6d9d](https://github.com/facebook/react-native/commit/0a525b6d9d2a88dddf24b85a2485b928fca23b16) by [@KevinGVargas](https://github.com/KevinGVargas)) -- Allow `zIndex` to `useNativeDriver` ([6a4e06faa8](https://github.com/facebook/react-native/commit/6a4e06faa8afbcb607fc2696c45c4f3257b6665d) by [@mackenziemance](https://github.com/mackenziemance)) - -#### Android specific - -- Support item background color in Dialog `Picker` ([22eb711c84](https://github.com/facebook/react-native/commit/22eb711c84587ac92da97e486fecaa79424fa925)) -- Add OverrideColorScheme interface and setOverrideColorScheme method to AppearanceModule([45d7df6cf7](https://github.com/facebook/react-native/commit/45d7df6cf7482b9790c97db613055ff5d3e59a87)) -- Allow setting custom ripple radius on `TouchableNativeFeedback` ([7f2a79f40b](https://github.com/facebook/react-native/commit/7f2a79f40b4a4c41344ca90cefe318af607675e0) by [@vonovak](https://github.com/vonovak)) -- Add `resizeMode` prop support on `TextInlineView` ([6871416328](https://github.com/facebook/react-native/commit/68714163280695c3148544b95b05a2c1464dbbba) by [@mdvacca](https://github.com/mdvacca)) -- Added an API for checking if there are busy timers to `TimingModule` ([22764e6cdc](https://github.com/facebook/react-native/commit/22764e6cdcf45ca5930676f6e95f9ab2f82bc78d) by [@ejanzer](https://github.com/ejanzer)) -- Make packager location customizable in dev mode ([3714f3648a](https://github.com/facebook/react-native/commit/3714f3648a8ac51f2bb7f2791e2381551d0209b4)) - -#### iOS specific - -- `UIScene` support for `RCTImageView` ([f332fac163](https://github.com/facebook/react-native/commit/f332fac16346d2f03d056575cc988a0b2bbb48c6) by [@tido64](https://github.com/tido64)) -- Status bar style is now correctly changed in multi-window iPadOS 13 apps if you use `RCTRootViewController` and set `UIViewControllerBasedStatusBarAppearance=YES` ([80e6d672f3](https://github.com/facebook/react-native/commit/80e6d672f32fdc860c73eabcc63763dcab3c6269) by [@radex](https://github.com/radex)) -- Added `userInterfaceStyle` for `ActionSheetIOS` and `Share` to override user interface style on IOS 13 ([0a9cc34dd8](https://github.com/facebook/react-native/commit/0a9cc34dd82a3a7dba576997ebd424b12876dbaa) by [@Arjan-Zuidema](https://github.com/Arjan-Zuidema)) -- Add localized accessibility strings to `ReactCore` pod ([aebf54aee4](https://github.com/facebook/react-native/commit/aebf54aee41cc892198b055a7a546743297412bd) by [@xuelgong](https://github.com/xuelgong)) -- Resolve and reject promise for `PushNotificationIOS.requestPermissions` ([edfdafc7a1](https://github.com/facebook/react-native/commit/edfdafc7a14e88a2660b95cb220c62f29b1b28c0) by [@p-sun](https://github.com/p-sun)) -- Use autolink script in template on iOS ([a35efb9400](https://github.com/facebook/react-native/commit/a35efb94006bfa3f541bf3fc3ab5262740f00525) by [@janicduplessis](https://github.com/janicduplessis)) -- Added `Flipper` to template app ([52cd9cd6fe](https://github.com/facebook/react-native/commit/52cd9cd6fec0866177aa02f7129a8b3d8b2bdbea) by [@safaiyeh](https://github.com/safaiyeh)) -- Add `textColor` and `backgroundColor` props to `SegmentedControl` for iOS >=13 ([e8f577e541](https://github.com/facebook/react-native/commit/e8f577e541815bfd8adebdf14f70c9e4205f8e4e) by [@Naturalclar](https://github.com/Naturalclar)) -- Adds `RCTOverrideAppearancePreference` to the iOS `Appearance` module ([fa65b156d4](https://github.com/facebook/react-native/commit/fa65b156d4109e6a3121484b601358b11cf0d541)) -- Changed iOS LaunchScreen from `xib` to `storyboard` ([33b3a1a145](https://github.com/facebook/react-native/commit/33b3a1a1453ca51690e59b758eeb61a4fa8f35bc) by [@jeswinsimon](https://github.com/jeswinsimon)) - -### Changed - -- Update `react-native-community/eslint-config` to 1.1.0, adding the new color rule ([780f06cd47](https://github.com/facebook/react-native/commit/780f06cd477f34da48646a949bd25dd3f883a9a2) by [@TheSavior](https://github.com/TheSavior)) -- Update community eslint plugin in the eslint config ([b2d10bc602](https://github.com/facebook/react-native/commit/b2d10bc60272fc2318835ff38655a9eb4a2bbed0) by [@Naturalclar](https://github.com/Naturalclar)) -- Upgrade `eslint-config` and `metro-preset` in project template ([ad86a18305](https://github.com/facebook/react-native/commit/ad86a183052e8b25d599eb395aef55412c02ff7b) by [@Naturalclar](https://github.com/Naturalclar)) -- Add ES Lint rules for `DynamicColorIOS()`and `ColorAndroid()` ([602070f44b](https://github.com/facebook/react-native/commit/602070f44b02220aeb036a7b3c26dad5c611b636) by [@tom-un](https://github.com/tom-un)) -- Make `ScrollView` use `forwardRef` ([d2f314af75](https://github.com/facebook/react-native/commit/d2f314af75b63443db23e131aaf93c2d064e4f44) by [@kacieb](https://github.com/kacieb)) -- Upgrade embedded React DevTools backend from v4.0.6 to v4.6.0 ([93ee5b2cc8](https://github.com/facebook/react-native/commit/93ee5b2cc8391bc5cb12ca7cf08ed0e44c74d29a) by [@bvaughn](https://github.com/bvaughn)) -- Updated the React Hooks ESLint Plugin ([6ce3f0a4f7](https://github.com/facebook/react-native/commit/6ce3f0a4f7495adb82e655d037dc4e5af462f955) by [@gaearon](https://github.com/gaearon)) -- Update to React 16.13.1 ([9637d6214a](https://github.com/facebook/react-native/commit/9637d6214a47e58d7fa8252a3de8c057e5cfb101) by [@gaearon](https://github.com/gaearon)) -- Relax `RefreshControl`'s `onRefresh` flow typing ([884c86ae02](https://github.com/facebook/react-native/commit/884c86ae02b0be7ea1e4b258dab39f4c5aee0b9d) by [@vonovak](https://github.com/vonovak)) -- Improved flowtype support for `Animated` ([bdafc55f50](https://github.com/facebook/react-native/commit/bdafc55f50c7d580ee2e643a02cb95d0196f721c) by [@javache](https://github.com/javache)) -- Upgrade `eslint-plugin-relay` to 1.6.0 ([0483404d82](https://github.com/facebook/react-native/commit/0483404d827416b7270e8a42b84e424035127892) by [@kassens](https://github.com/kassens)) -- Upgrade to latest dependencies in package.json template ([82e8239337](https://github.com/facebook/react-native/commit/82e82393377ddcedba01c401a5d79d5bbcdc4dc9) by [@codler](https://github.com/codler)) -- Make JSStringToSTLString 23x faster ([733532e5e9](https://github.com/facebook/react-native/commit/733532e5e95c85b8295b6c66009ca9efd2a77622) by [@radex](https://github.com/radex)) -- Changed property `disableIntervalMomentum` to work with both horizontal and vertical ScrollViews ([6237cfb325](https://github.com/facebook/react-native/commit/6237cfb325e39571ede0054a67d60f2c978d6d58) by [@Shaninnik](https://github.com/Shaninnik)) -- Upgraded to Flow v0.114.0 ([aa78457343](https://github.com/facebook/react-native/commit/aa7845734352eab2bd32f7d6e683d6674fd6680d) by [@mroch](https://github.com/mroch)) -- Updated CLI to the latest version ([ddc33007ad](https://github.com/facebook/react-native/commit/ddc33007ad0b4a0a24966b833e797227b9c56cca) by [@grabbou](https://github.com/grabbou)) -- Upgrade Prettier from 1.17 to 2.0.2. ([cf44650b3f](https://github.com/facebook/react-native/commit/cf44650b3f4f13df8208ceded60ec5c48bd6baf3) by [@bolinfest](https://github.com/bolinfest)) -- Only set dimensions if the window attributes change ([35c6bb9ac0](https://github.com/facebook/react-native/commit/35c6bb9ac0fc452428e85fee72affb4fc29f500c) by [@cpojer](https://github.com/cpojer)) -- Upgrade internal packages to support ESLint >= 6 ([89d04b5e4a](https://github.com/facebook/react-native/commit/89d04b5e4a3fd0b0f77b5a390c0aa62a3804e2bc) by [@Barbiero](https://github.com/Barbiero)) -- Make `JSCRuntime::createValue` faster ([24e0bad8be](https://github.com/facebook/react-native/commit/24e0bad8bea95ef7ddf72e2f00a93ffd47872d5b) by [@radex](https://github.com/radex)) -- Add perf markers in `XMLHttpRequest` ([71b8ececf9](https://github.com/facebook/react-native/commit/71b8ececf9b298fbf99aa27d0e363b533411e93d) by [@sahrens](https://github.com/sahrens)) -- Update SoLoader to 0.8.2 ([0a6f058b6b](https://github.com/facebook/react-native/commit/0a6f058b6bd0493f7eece972b1f73be3606ca8d5) by [@passy](https://github.com/passy)) -- `console.error` calls, and uncaught exceptions are now displayed in the Metro logs as well ([ffb82cb2f0](https://github.com/facebook/react-native/commit/ffb82cb2f052f276a94a004d5acea0ab44f8098c) by [@mweststrate](https://github.com/mweststrate)) -- Upgrade Flipper to 0.37.0 ([17f025bc26](https://github.com/facebook/react-native/commit/17f025bc26da13da795845a3f7daee65563420c0) by [@sunnylqm](https://github.com/sunnylqm)) - -#### Android specific - -- Upgraded to Hermes 0.5.0 ([4305a291a9](https://github.com/facebook/react-native/commit/4305a291a9408ca65847994bbec42f1fbc97071d) by [@willholen](https://github.com/willholen)) -- Internal storage now will be preferred for caching images from `ImageEditor`. ([79efa43428](https://github.com/facebook/react-native/commit/79efa4342852a3e9271a56e3a0fb7c15be664e9a) by [@kitttn](https://github.com/kitttn)) -- Update Gradle Wrapper to 6.2 ([d4d8887b50](https://github.com/facebook/react-native/commit/d4d8887b5018782eeb3f26efa85125e6bbff73e4) by [@friederbluemle](https://github.com/friederbluemle)) -- Upgrade Folly to v2020.01.13.00 ([6e2131b8fa](https://github.com/facebook/react-native/commit/6e2131b8fa85da8b3fb0391803e7fbecba890ffb) by [@Kudo](https://github.com/Kudo)) -- Only update dimensions in `ReactRootView` if they've changed ([cc3e27d484](https://github.com/facebook/react-native/commit/cc3e27d484d3a412f632454b7f1c637b2c271af2) by [@ejanzer](https://github.com/ejanzer)) -- `ReactEditText` extends `AppCompatEditText` ([aaa2765a92](https://github.com/facebook/react-native/commit/aaa2765a920de8234f0def4cae05ca5d6c8c8ac8) by [@dulmandakh](https://github.com/dulmandakh)) -- Make `ReactApplicationContext` nullable as the constructor argument of `ReactContextBaseJavaModule` ([f8d5c5bfd7](https://github.com/facebook/react-native/commit/f8d5c5bfd79be0e20a205a1856bd9946143eeacf) by [@RSNara](https://github.com/RSNara)) -- Update Android Gradle plugin to 3.5.3 ([e1e081b00e](https://github.com/facebook/react-native/commit/e1e081b00e5efb32bce74211c850212eca8a9412) by [@SaeedZhiany](https://github.com/SaeedZhiany)) -- Don't emit dimensions update event on initial load ([383934a06e](https://github.com/facebook/react-native/commit/383934a06e22e8e1a5ee50d121722240259f95d0) by [@ejanzer](https://github.com/ejanzer)) -- Bump Android build-tools to 29.0.2, compileSdk to 29 ([edcbfb9821](https://github.com/facebook/react-native/commit/edcbfb98210d9aaa6bb1d7c64281ae9cfb41cac2) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific - -- Disambiguate autolinking-ios.rb script from CLI’s “autolinking” feature and bring RNTester & template in line. ([4118d79826](https://github.com/facebook/react-native/commit/4118d798265341061105f3a53550db83c66a71cb) by [@alloy](https://github.com/alloy)) -- Updated Flipper iOS integration to be included by default in the `Debug` configuration ([619d5d60df](https://github.com/facebook/react-native/commit/619d5d60dfa94966e7104febec08166c1b5eca49) by [@alloy](https://github.com/alloy)) -- Use Apple unified logging API (os_log) ([f501ed682a](https://github.com/facebook/react-native/commit/f501ed682ae68136d966aee2b0d3cc0f1e8b90cd) by [@LeoNatan](https://github.com/LeoNatan)) -- Upgrade Folly to v2020.01.13.00 ([a27e31c059](https://github.com/facebook/react-native/commit/a27e31c059971b1d554ad6c7c81706f08eafac87) by [@Kudo](https://github.com/Kudo)) -- Remove the `xcshareddata` from .gitignore ([7980615d37](https://github.com/facebook/react-native/commit/7980615d371a7bf607a3787bca91cfde229c41dc) by [@pvinis](https://github.com/pvinis)) -- Add `complete_nullability = True` to compatible libraries ([796a4ea7e3](https://github.com/facebook/react-native/commit/796a4ea7e31ae05b76e59e02ab05f9c955f7c149)) -- Remove the Flipper pod post install step ([44beb2a685](https://github.com/facebook/react-native/commit/44beb2a685b7ceb0311bde7d0d33cb70bb891d30) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) -- Enable Flipper with CocoaPods `:configuration` ([7bb1c4e1b8](https://github.com/facebook/react-native/commit/7bb1c4e1b8715a5c9cb6f9e4e77a6df783481d3d) by [@alloy](https://github.com/alloy)) - -### Removed - -- Remove unused`ImageProp` ([fbd09b1797](https://github.com/facebook/react-native/commit/fbd09b179759cd90f2be5c24caa11bdb483ad8cd) by [@Naturalclar](https://github.com/Naturalclar)) -- Remove leftover `Incremental` component ([e99800267b](https://github.com/facebook/react-native/commit/e99800267b78aa581aff956d47b8be91858628b9) by [@venits](https://github.com/venits)) -- Remove "Debug with Nuclide" option ([011eb4cea5](https://github.com/facebook/react-native/commit/011eb4cea5d482cef54d7659e7436a04e539ff19) by [@rickhanlonii](https://github.com/rickhanlonii)) - -#### Android specific - -- Remove unused Feature Flag: `lazilyLoadViewManagers` ([3963f34980](https://github.com/facebook/react-native/commit/3963f34980f501ef89a945a1d0e76716af84527d) by [@JoshuaGross](https://github.com/JoshuaGross)) -- `PickFirst` options for RNTester and template ([4bb0b4f205](https://github.com/facebook/react-native/commit/4bb0b4f205b1bc9a91150fe1f609f7d7313eb806) by [@passy](https://github.com/passy)) -- Remove Kotlin version from the default template ([ced959bb3d](https://github.com/facebook/react-native/commit/ced959bb3d6abdab30c5e64af9bff6059b111cdd) by [@grabbou](https://github.com/grabbou)) - -#### iOS specific - -- Remove core `RCTConvert` CoreLocation Libraries ([bcf2a716fb](https://github.com/facebook/react-native/commit/bcf2a716fb8b8954d6f7b801a1699eeea9418e73) by [@maschad](https://github.com/maschad)) -- Remove copyright notices from iOS application template ([9c3fa57337](https://github.com/facebook/react-native/commit/9c3fa573379bb4824bbe02b5b5aa1ae3502772d8) by [@alloy](https://github.com/alloy)) -- Remove three properties: `textColor`, `font` and `textAlignment` from `RCTBackedTextInputViewProtocol`, unifying the usage into `defaultTextAttributes`. ([aff6bad27c](https://github.com/facebook/react-native/commit/aff6bad27c6c2232ba8bde17823d0a0db4ac589b) by [@jimmy623](https://github.com/jimmy623)) - -### Fixed - -- Add support to render `` with no fixed size nested within a `` ([dbb7eacb42](https://github.com/facebook/react-native/commit/dbb7eacb429adb4160e740017c212bfd6df0f03a) by [@mdvacca](https://github.com/mdvacca)) -- Fixes bug where `` would crash. ([66601e755f](https://github.com/facebook/react-native/commit/66601e755fcad10698e61d20878d52194ad0e90c) by [@TheSavior](https://github.com/TheSavior)) -- Use new `setTextCursorDrawable` API for Android 10 ([e7a14b803f](https://github.com/facebook/react-native/commit/e7a14b803fdc8840bbcde51d4bfa9cf9a85a8472) by [@sturmen](https://github.com/sturmen)) -- Fix `Animated.Value` initialized with undefined in `ScrollView` ([cf02bd9b76](https://github.com/facebook/react-native/commit/cf02bd9b765e29ed8aa2bbf62661e89c84bb80e5) by [@janicduplessis](https://github.com/janicduplessis)) -- Do not explicitly include `.js` in Library imports ([161b910494](https://github.com/facebook/react-native/commit/161b9104941663dcc0b08a73789c0ff3410fc661) by [@NickGerleman](https://github.com/NickGerleman)) -- Fixed `Pressability` to properly fire `onLongPress`. ([5ca1d8f260](https://github.com/facebook/react-native/commit/5ca1d8f260bfb64111a6ba39f76a0a935829c0f2) by [@yungsters](https://github.com/yungsters)) -- Fixed typo from `inly` to `only` inside `Modal.js` library code. ([686d8a57f8](https://github.com/facebook/react-native/commit/686d8a57f889fe74dc1c66566c80f0ed6d677729) by [@Darking360](https://github.com/Darking360)) -- Fix viewability calculations for nested `VirtualizedLists` inside of a parent list's `FooterComponent` ([074a2fab74](https://github.com/facebook/react-native/commit/074a2fab74754c28cba0ccc51552a246a3046501) by [@logandaniels](https://github.com/logandaniels)) -- Fix android `TextInput` transitions ([0a17a4fe56](https://github.com/facebook/react-native/commit/0a17a4fe56ff2cabc3c7d1cc5b34bd3fdd032e59)) -- Remove JS autoFocus implementation ([0569d4c431](https://github.com/facebook/react-native/commit/0569d4c4315d61d2d8f4ab628a54eb1e1db45dc2) by [@janicduplessis](https://github.com/janicduplessis)) -- Check null values in `shouldAnimate` ([3498b3b96b](https://github.com/facebook/react-native/commit/3498b3b96b2e27c7c7f6407b3673b44540871a31) by [@axe-fb](https://github.com/axe-fb)) -- Fix `AccessibilityInfo.isScreenReaderEnabled` mock in Jest setup ([ec3327b61a](https://github.com/facebook/react-native/commit/ec3327b61ab1be3fd1565c8a35fe56747bd9069f) by [@rubennorte](https://github.com/rubennorte)) -- Fix crash when passing invalid UTF-16 data from JSC into native code ([011cf3f884](https://github.com/facebook/react-native/commit/011cf3f88428ca83552d0b51c7c3a0c47b9728e5) by [@motiz88](https://github.com/motiz88)) -- Make `YGValue.h` compile with Clang on Windows ([014bc95135](https://github.com/facebook/react-native/commit/014bc95135a38d65b991509492c0979cfd153e71) by [@christophpurrer](https://github.com/christophpurrer)) -- Fix documentation comments for HermesJS's `Function::callWithThis` method to accurately reflect how `this` is handled. ([399bda5284](https://github.com/facebook/react-native/commit/399bda52840161bf7d30c09eca061b4378b8f6e4) by [@Kronopath](https://github.com/Kronopath)) -- Fix resolving assets outside of the project root ([7deeec7396](https://github.com/facebook/react-native/commit/7deeec73966d84140492c2a767819977318c4d2d) by [@janicduplessis](https://github.com/janicduplessis)) -- Transform empty responses into empty `Blob`s ([9a8c06b502](https://github.com/facebook/react-native/commit/9a8c06b502c774f7a0bff1bdc064fbfe16ca75be) by [@RSNara](https://github.com/RSNara)) -- Fix validation of event mappings for `AnimatedEvent` ([19362f6116](https://github.com/facebook/react-native/commit/19362f6116bad441c5e23f2bab420af78664b3d3) by [@javache](https://github.com/javache)) -- Fix `NativeJSCHeapCapture` ([7e3a43c23d](https://github.com/facebook/react-native/commit/7e3a43c23d028a4481bc455dd28c391a81ff1a94) by [@RSNara](https://github.com/RSNara)) -- Add `AnimationInterpolation` as possible type for toValue ([26e8870fbf](https://github.com/facebook/react-native/commit/26e8870fbf310f0fb438a86cb2fe260f0bc419b9) by [@nabati](https://github.com/nabati)) -- Fix return type of `StyleSheet.create` ([4e71a30969](https://github.com/facebook/react-native/commit/4e71a30969d74073309d0350be55cadb84ae43ff) by [@jbrown215](https://github.com/jbrown215)) -- Adjust HelloWorld-tvOSTests/Info.plist `CFBundleIdentifier` to use `PRODUCT_BUNDLE_IDENTIFIER` ([98ebc1ea25](https://github.com/facebook/react-native/commit/98ebc1ea25102049ec53288a458ff16ed5b4ada0) by [@MoOx](https://github.com/MoOx)) -- Fix bug where if `Error` global is not callable when building an error, jsi will throw a JS exception back to JS code. #158 ([a195447539](https://github.com/facebook/react-native/commit/a1954475394dc03704a2e093e6fc4b48188640fa) by [@mhorowitz](https://github.com/mhorowitz)) -- Fix stylesheet validation for functions with custom prototype methods. ([f464dad5d4](https://github.com/facebook/react-native/commit/f464dad5d4f0fbf1cb23e21d22907ffddeaf97e4)) -- Fix sporadic issue with `onEndReached` called on load when not needed ([8ddf231306](https://github.com/facebook/react-native/commit/8ddf231306e3bd85be718940d04f11d23b570a62) by [@sahrens](https://github.com/sahrens)) -- Correct argument types of `NativeJSDevSupport.onSuccess` ([b42371da5a](https://github.com/facebook/react-native/commit/b42371da5a41916522b569a66c0a126333cf9cac) by [@RSNara](https://github.com/RSNara)) -- Add `URLSearchParams` and `Headers` to eslint globals ([7a13a1a88f](https://github.com/facebook/react-native/commit/7a13a1a88fdf26dca817b76399f1c86a8a05eccb) by [@sonnyp](https://github.com/sonnyp)) -- Export exception classes with default visibility ([84adc85523](https://github.com/facebook/react-native/commit/84adc85523770ebfee749a020920e0b216cf69f8) by [@appden](https://github.com/appden)) -- Add `URL` to eslint globals. ([ff9def41ff](https://github.com/facebook/react-native/commit/ff9def41ff3e7760d076bf1b899583d4b36cba0d) by [@sonnyp](https://github.com/sonnyp)) -- Plumb through memory allocation profiler feature to Chrome Inspector ([ed3054927c](https://github.com/facebook/react-native/commit/ed3054927c30c8823f78026b9c4cb42fbe4f8b00) by [@jbower-fb](https://github.com/jbower-fb)) -- Better monorepo support when building release apk ([a8e85026cf](https://github.com/facebook/react-native/commit/a8e85026cfa60056b1bcbcd39cde789e4d65f9cb) by [@grabbou](https://github.com/grabbou)) -- `LogBox` - Fix dependency cycle ([6ba2aeefa8](https://github.com/facebook/react-native/commit/6ba2aeefa8dfe031bf1dc46dbea29235aec31d61) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Always update background color and bar style on Android status bar ([9457efa84c](https://github.com/facebook/react-native/commit/9457efa84c872f029027cdcfc3bae4f403715e48)) -- Disable accessibility state changes of the focused view for Android API < 21 ([f2d58483c2](https://github.com/facebook/react-native/commit/f2d58483c2aec689d7065eb68766a5aec7c96e97) by [@mdvacca](https://github.com/mdvacca)) - -#### Android specific - -- Gradle release config ([0d1fb458ab](https://github.com/facebook/react-native/commit/0d1fb458ab8027dcfac5f2fa11e8c16d6853c59c) by [@vdmtrv](https://github.com/vdmtrv)) -- Change how `TextInput` responds to `requestFocus` to fix a11y focus issue ([d4a498aba2](https://github.com/facebook/react-native/commit/d4a498aba2d2843e7a741a31b0c91c6a79a7386c) by [@ejanzer](https://github.com/ejanzer)) -- Fixed style in `TextInputTestCase` ([8c493804f3](https://github.com/facebook/react-native/commit/8c493804f3f7b3ae3761679a978971ab9d71baa0) by [@ejanzer](https://github.com/ejanzer)) -- Fix template instacrash from missing androidx dependency ([a1b14deb3e](https://github.com/facebook/react-native/commit/a1b14deb3e32df797aae99a75743a4d283e5337b) by [@alloy](https://github.com/alloy)) -- Implement native `TextInput` `autoFocus` on Android ([055a41b081](https://github.com/facebook/react-native/commit/055a41b081c5bc9535b071d9b4b7488b92e71803) by [@janicduplessis](https://github.com/janicduplessis)) -- Support for case insensitive `Origin` headers for `Websockets` ([aeaf286c77](https://github.com/facebook/react-native/commit/aeaf286c77b50a95c4961de0d2355caad8ffa396) by [@brunobar79](https://github.com/brunobar79)) -- RNTester Buck Build ([a3cb377645](https://github.com/facebook/react-native/commit/a3cb377645f2ccb7632ded73c230a41025d38f6f) by [@passy](https://github.com/passy)) -- Fix bug in updating dimensions in JS ([bef845ffd5](https://github.com/facebook/react-native/commit/bef845ffd521aa83d779de584ec370f9f88f27f3) by [@ejanzer](https://github.com/ejanzer)) -- Applied missing changes from bumping Gradle wrapper to 6.0.1 ([aa0ef15335](https://github.com/facebook/react-native/commit/aa0ef15335fe27c0c193e3e968789886d82e82ed) by [@SaeedZhiany](https://github.com/SaeedZhiany)) -- Unregister `JSDevSupport` from `DebugCorePackage` ([c20963e11c](https://github.com/facebook/react-native/commit/c20963e11cc1c10f20a2a0a3c209f5b403c9e899) by [@RSNara](https://github.com/RSNara)) -- Make sure `ServerHost` is optional in `NativePlatformConstants.js` ([048f88a33a](https://github.com/facebook/react-native/commit/048f88a33a53ebd4e45865b319c42291f1d6c7f2) by [@RSNara](https://github.com/RSNara)) -- Removed code that would cause accessibility header role to be spoken twice ([7428271995](https://github.com/facebook/react-native/commit/7428271995adf21b2b31b188ed83b785ce1e9189) by [@KevinGVargas](https://github.com/KevinGVargas)) -- Fail silently in `AppStateModule.sendEvent` if `CatalystInstance` is not available ([c4806fada6](https://github.com/facebook/react-native/commit/c4806fada6532894e2242cf31f7145d2992e3a2b) by [@JoshuaGross](https://github.com/JoshuaGross)) -- RN `Picker` - fix types in `AndroidDialogPickerManagerInterface` ([56b0f5cb6b](https://github.com/facebook/react-native/commit/56b0f5cb6ba48ecefc2890152ebe88e3df61a0ea)) -- Fix Hermes debugger being disabled by default ([b8621f5d30](https://github.com/facebook/react-native/commit/b8621f5d303442ab78dc5d745cfc86a941d4737c) by [@willholen](https://github.com/willholen)) - -#### iOS specific - -- Fixed connection of metro reload command to iOS device ([f9df93385e](https://github.com/facebook/react-native/commit/f9df93385eee0e1cd1144a65e05410dfb48b119c) by [@reyalpsirc](https://github.com/reyalpsirc)) -- Remove `RCTDevLoadingView` jank ([faff19a7c6](https://github.com/facebook/react-native/commit/faff19a7c651c740d8d649b86727b63b63562b20) by [@RSNara](https://github.com/RSNara)) -- Fix crash when passing null value in object parameter of bridged method ([15434c7c43](https://github.com/facebook/react-native/commit/15434c7c435928a40b9cd66fe9f5d1bcdea8d954)) -- Get ready for Clang 10 ([8721ee0a6b](https://github.com/facebook/react-native/commit/8721ee0a6b10e5bc8a5a95809aaa7b25dd5a6043) by [@maxovtsin](https://github.com/maxovtsin)) -- Fix `RCTBlobManager` cleanup crash ([91c5ff4a12](https://github.com/facebook/react-native/commit/91c5ff4a12982ccead56c9c038761e9316d01409) by [@RSNara](https://github.com/RSNara)) -- Make Lambda function called in `NativeModule` mutable ([5290047d09](https://github.com/facebook/react-native/commit/5290047d09c0a41c85a1d47a638877c226d9c191) by [@maschad](https://github.com/maschad)) -- Fix crash in `RCTCxxBridge.executeApplicationScript` ([0c2db3256f](https://github.com/facebook/react-native/commit/0c2db3256f6cbb3ec564e0f183a52a439ed33f52) by [@ahimberg](https://github.com/ahimberg)) -- Fix `RCTDevLoadingView` `RedBox` on reload ([fe5ac2c3f9](https://github.com/facebook/react-native/commit/fe5ac2c3f9e47cfb7c5820a755a5d74d47624953) by [@RSNara](https://github.com/RSNara)) -- Fix `Image` component crashing when `uri` is `null` ([06b8b15b0a](https://github.com/facebook/react-native/commit/06b8b15b0af84b6f8b44d200dc25f29eac51181c) by [@mlazari](https://github.com/mlazari)) -- Fix `RCTDevLoadingView` not showing up with `UIScene` ([74b667dbc2](https://github.com/facebook/react-native/commit/74b667dbc2a48183dec0b9c3b5401bc3f9e54e7b) by [@tido64](https://github.com/tido64)) -- Prevent interactive dismissal for non-fullscreen modals ([1e7ed81d16](https://github.com/facebook/react-native/commit/1e7ed81d16dda4188352e0ccdc0f0bd3ad4741f3)) -- Resolve localization warnings in template ([0e4bcaa296](https://github.com/facebook/react-native/commit/0e4bcaa2960a2b1aa42dbe716fc6a35652aa7207) by [@safaiyeh](https://github.com/safaiyeh)) -- Implement `requiresMainQueueSetup` in `RCTDevSettings.mm` ([adf87dd7ed](https://github.com/facebook/react-native/commit/adf87dd7eddcf65a3300e6ac9092838d9c8a3279) by [@logandaniels](https://github.com/logandaniels)) -- Resolve `React-RCTText` Xcode warning ([04fed6508b](https://github.com/facebook/react-native/commit/04fed6508b74b23c954183af3f6121fb344d2138) by [@safaiyeh](https://github.com/safaiyeh)) -- Resolve Xcode warnings from `React-cxxreact`. ([dc6c57ce0d](https://github.com/facebook/react-native/commit/dc6c57ce0d4f5424bfb047c51fee18eac381a98b) by [@safaiyeh](https://github.com/safaiyeh)) -- `RCTReconnectingWebSocket` is reconnecting infinitely when stopped before getting connected ([0d4b0e9417](https://github.com/facebook/react-native/commit/0d4b0e941725657d8e63940428888aaceff505ad)) -- Fix prop name of `passwordRules` in `TextInput` ([3f5c42f357](https://github.com/facebook/react-native/commit/3f5c42f357d58268d0a0fd1bfc639f41feab937c) by [@Naturalclar](https://github.com/Naturalclar)) -- Remove need for Swift file in the user’s project in order to use Flipper ([8f93dedc6a](https://github.com/facebook/react-native/commit/8f93dedc6a5653edd2220c65ccb4ff8736ee060c) by [@alloy](https://github.com/alloy)) -- Clear all held `jsi::Functions` when `jsi::Runtime` is deleted ([9ae95582e7](https://github.com/facebook/react-native/commit/9ae95582e792a3dca4487bdce9080c6d874c7dd7) by [@RSNara](https://github.com/RSNara)) -- Make framework builds work again by making `RCTImageLoader` C++ requirement opt-in ([25571ec452](https://github.com/facebook/react-native/commit/25571ec4522931193b41723d3f80b3bced1fca3b) by [@alloy](https://github.com/alloy)) -- Enable dev keyboard shortcuts on Mac Catalyst ([56dfc86d64](https://github.com/facebook/react-native/commit/56dfc86d64a2a1f2ad05239b6d11aacac73cbac9) by [@charpeni](https://github.com/charpeni)) -- Fix `RCTTextView` layout issue that happens on some font with `leading` attribute not equal to zero, which causes wrong base-alignment layout ([5d08aab526](https://github.com/facebook/react-native/commit/5d08aab526b2702b46ff75ea7e943a33aa6df288)) -- Fix LAN instead of Wi-Fi device bundle configuration ([d1e6f8d3c4](https://github.com/facebook/react-native/commit/d1e6f8d3c4de1fbb4bddd5205cd3b35c572b495b) by [@Oleg-E-Bakharev](https://github.com/Oleg-E-Bakharev)) -- Add autorelease pool for each run loop for JS Thread ([948cbfdacc](https://github.com/facebook/react-native/commit/948cbfdacc42f8d2640e69f61df55f6adb823fcf) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fixed bug in implementation of ``'s `selectOnFocus` prop ([e020576b34](https://github.com/facebook/react-native/commit/e020576b34fb6ca6d3f9fe38916844b78a45c0e3) by [@shergin](https://github.com/shergin)) -- `RCTRedBox` doesn't appear in apps implementing `UISceneDelegate` ([d0a32c2011](https://github.com/facebook/react-native/commit/d0a32c2011ca00991be45ac3fa320f4fc663b2e8) by [@tido64](https://github.com/tido64)) -- Fixes the `InputAccessoryView.backgroundColor` prop’s typing to use `ColorValue`. ([a43fd60e18](https://github.com/facebook/react-native/commit/a43fd60e18aff9ee6bcaf8ec576adb8678d5bcf4) by [@alloy](https://github.com/alloy)) -- Fix `Animated` image crash when `CADisplayLink` target in `RCTWeakProxy` is `nil` ([e5a6655e71](https://github.com/facebook/react-native/commit/e5a6655e71d41a58ce0e51d37aa9fb8792e37dd5) by [@p-sun](https://github.com/p-sun)) - -## v0.62.3 - -### Security - -- Update validateBaseUrl to use latest regex ([33ef82ce6d](https://github.com/facebook/react-native/commit/33ef82ce6dfd31e1f990d438c925a0e52723e16b) by [@FBNeal](https://github.com/FBNeal)) - -### Fixed - -#### iOS specific - -- Change autolink to match requirements for FlipperFolly working with Xcode 12.5 ([c6f4611dcb](https://github.com/facebook/react-native/commit/c6f4611dcbfbb64d5b54e242570e2a1acffcabef) by [@kelset](https://github.com/kelset)) -- Change podfile to rely on the autolink-ios rb file ([c4ea556d64](https://github.com/facebook/react-native/commit/c4ea556d64c7fc146d1412548788c48bbcc0f6bb) by [@kelset](https://github.com/kelset)) -- Update detox to work on Xcode 12 ([158b558e50](https://github.com/facebook/react-native/commit/158b558e500576f434dec09417bb02cc0bc53f7a) by [@kelset](https://github.com/kelset)) - -## v0.62.2 - -### Fixed - -- Fix Appearance module when using Chrome Debugger ([f7b90336be](https://github.com/facebook/react-native/commit/f7b90336be25b78935549aa140131d4d6d133f7b) by [@TheSavior](https://github.com/TheSavior)) -- Fix mock for TextInput ([5a3c6faee9](https://github.com/facebook/react-native/commit/5a3c6faee9c44a2d99b13d113c91dbf98990f8af) by [@SergioEstevao](https://github.com/SergioEstevao)) -- Flow errors from YellowBox and BubblingEventHandler ([a049130f34](https://github.com/facebook/react-native/commit/a049130f34be951c9c67d2a472c7eb7f3d08f070) by [@thymikee](https://github.com/thymikee)) - -#### iOS specific - -- Make Vibration library compatible with TurboModules. ([3904228704](https://github.com/facebook/react-native/commit/390422870466beba571dda04f669380e14055056) by [@brunobar79](https://github.com/brunobar79)) -- Exclude Flipper from iOS Release builds ([e5497ca8f6](https://github.com/facebook/react-native/commit/e5497ca8f6e3b240948fdbeef0ac2a710f25bb56) by [@javiercr](https://github.com/javiercr)) -- Fix crash when enabling Performance Monitor on iOS 13.4 ([e2c417f7cf](https://github.com/facebook/react-native/commit/e2c417f7cf5ae7efa5ea1f9644a51c4c706a983f) by [@IjzerenHein](https://github.com/IjzerenHein)) - -## v0.62.1 - -### Fixed - -- Bump CLI to 4.5.1 to improve DX ([eac56b9749](https://github.com/facebook/react-native/commit/eac56b9749ed624275d4190b5e48b775583acb3f) by [@alloy](https://github.com/alloy)) -- Fix a YellowBox regression in v0.62.0 where the Flipper network inspector causes YellowBox to crash the app due to using base64 images. ([227aa96bb2](https://github.com/facebook/react-native/commit/227aa96bb23b6ff20eebbd8a9335fd172ed6005b) by [@rickhanlonii](https://github.com/rickhanlonii)) - -#### Android specific - -- Add new DoNotStrip class to proguard config ([cfcf5eba43](https://github.com/facebook/react-native/commit/cfcf5eba4317f80ef8902463b7c0b2e1e7b534a7) by [@janicduplessis](https://github.com/janicduplessis)) - -#### iOS specific - -- Fix Performance Monitor in dark appearance ([576ddfb3a8](https://github.com/facebook/react-native/commit/576ddfb3a84a5461679959f0d3f229a000dcea8d) by [@gorhom](https://github.com/gorhom)) -- Inverted ScrollViews scroll to their bottom when the status bar is pressed ([7a4753d76a](https://github.com/facebook/react-native/commit/7a4753d76aab1c52a09f26ec6f7fd43a68da8a97) by [@emilioicai](https://github.com/emilioicai)) -- Revert [previous incomplete fix](https://github.com/facebook/react-native/commit/bd2b7d6c0366b5f19de56b71cb706a0af4b0be43) for [an issue](https://github.com/facebook/react-native/issues/26473) with `Modal`’s `onDismiss` prop. ([27a3248a3b](https://github.com/facebook/react-native/commit/27a3248a3b37410b5ee6dda421ae00fa485b525c) by [@grabbou](https://github.com/grabbou)) -- Fix double call to onEndReached in VirtualizedList ([d3658bc2b6](https://github.com/facebook/react-native/commit/d3658bc2b6437e858d3b3f5688277dedbca779b8) by [@MartinSherburn](https://github.com/MartinSherburn)) - -### Changed - -- Update warning message of deprecated imports ([405200e9a9](https://github.com/facebook/react-native/commit/405200e9a930cded47954f374f2a779ec769cd4c) by [@Naturalclar](https://github.com/Naturalclar)) - -## v0.62.0 - -This major release includes Flipper support by default, improved dark mode support, moving Apple TV to [react-native-tvos](https://github.com/react-native-community/react-native-tvos), and more. See the [blog post](https://reactnative.dev/blog/2020/03/26/version-0.62) for all of the highlights. - -This release comes in the midst of a global pandemic. We’re releasing this version today to respect the work of hundreds of contributors who made this release possible and to prevent the release from falling too far behind master. Please be mindful of the reduced capacity of contributors to help with issues and prepare to delay upgrading if necessary. - -If you're upgrading, manual intervention may be required for your app. Please see the [upgrade-helper](https://react-native-community.github.io/upgrade-helper/) for a detailed breakdown of the changes required and see [this issue](https://github.com/react-native-community/releases/issues/179) for known issues. - -One known issue with workaround is regarding Android builds and [APK size increases](https://github.com/facebook/react-native/issues/28330). - -### Breaking - -- React DevTools v4 integration ([92a3c9da0a](https://github.com/facebook/react-native/commit/92a3c9da0a38870a8bad7c91bdc3ddb494f6e5f2) by [@bvaughn](https://github.com/bvaughn)) -- Remove `TextInput`'s `onTextInput` prop ([3f7e0a2c96](https://github.com/facebook/react-native/commit/3f7e0a2c9601fc186f25bfd794cd0008ac3983ab) by [@shergin](https://github.com/shergin)) -- Remove `TextInput`'s `inputView` prop ([1804e7cbea](https://github.com/facebook/react-native/commit/1804e7cbea707a35046118090966a54031edfae8) by [@TheSavior](https://github.com/TheSavior)) -- Animated: Remove `defaultProps` Parameter ([a70987cee2](https://github.com/facebook/react-native/commit/a70987cee24bcd027b9c4a5aa85dfd6a1aab74b3) by [@yungsters](https://github.com/yungsters)) -- Remove `TextInput`'s `selectionState` prop ([2becdfd404](https://github.com/facebook/react-native/commit/2becdfd4041f7f28138ba3a61c03e17c06dc2e50) by [@yungsters](https://github.com/yungsters)) -- Remove support for `framesToPop` ([8bc02fdd52](https://github.com/facebook/react-native/commit/8bc02fdd52124d0a24d96e4a61d7688328ef1660) [cf4d45ec2b](https://github.com/facebook/react-native/commit/cf4d45ec2bcd301be7793d5840de21ec7d02275b) [a483f802fd](https://github.com/facebook/react-native/commit/a483f802fddfd927f2baa0d95e2b4094d452cddd) by [@motiz88](https://github.com/motiz88)) -- Remove `TimePickerAndroid` ([dbf070c51e](https://github.com/facebook/react-native/commit/dbf070c51ecd14127a8317faa75cb661697b5a6b) by [@cpojer](https://github.com/cpojer)) -- Remove `scrollWithoutAnimationTo` from ScrollView ([c7e89909da](https://github.com/facebook/react-native/commit/c7e89909da70ac5290f9971080eb897567db3e43) by [@TheSavior](https://github.com/TheSavior)) -- Bump CLI to ^4.2.x ([be5088401f](https://github.com/facebook/react-native/commit/be5088401fd8e19d57adda42d275cab437448064) by [@alloy](https://github.com/alloy)) - for details on what v4 of the CLI improves on (like monorepo support), please refer to the [dedicated blog post](https://callstack.com/blog/react-native-cli-3-1-0-and-4-0-0-whats-new/) and the [release notes](https://github.com/react-native-community/cli/releases) -- Remove `accessibilityStates` property ([7b35f427fd](https://github.com/facebook/react-native/commit/7b35f427fd66cb0f36921b992095fe5b3c14d8b9) by [@marcmulcahy](https://github.com/marcmulcahy)) -- Upgraded to Hermes 0.4.0. If you're using ProGuard you will need to add the following rule to `proguard-rules.pro`: `-keep class com.facebook.jni.** { *; }` ([ab3c184555](https://github.com/facebook/react-native/commit/ab3c184555e382b8693cbfcdfe01ba89583ee726) by [@willholen](https://github.com/willholen)) - -#### Android specific - -- Fix setting keyboardType from breaking autoCapitalize ([233fdfc014](https://github.com/facebook/react-native/commit/233fdfc014bb4b919c7624c90e5dac614479076f) by [@safaiyeh](https://github.com/safaiyeh)) -- Limit size of video uploaded from camera roll in android (< 100 MB) ([d21f695edf](https://github.com/facebook/react-native/commit/d21f695edf367166a03af4c6e9376cd498b38665)) -- Remove "Reload on JS change" from RN Android ([478df155e7](https://github.com/facebook/react-native/commit/478df155e70a4ce30219adcac6f0801c4e4d10ec) by [@cpojer](https://github.com/cpojer)) - -### Added - -- Add support for Flipper by default ([multiple commits](https://github.com/facebook/react-native/pulls?q=is%3Apr+Flipper+is%3Aclosed)) -- Add `getNativeScrollRef` method to FlatList component ([bde1d63c85](https://github.com/facebook/react-native/commit/bde1d63c853630609b22c87121c125775dd1f5cb) by [@kacieb](https://github.com/kacieb)) -- Add missing accessibility props on Touchables ([8c0c860e38](https://github.com/facebook/react-native/commit/8c0c860e38f57e18296f689e47dfb4a54088c260) by [@xuelgong](https://github.com/xuelgong)) -- Added missing `console` polyfills in release builds. ([b7ab922bb3](https://github.com/facebook/react-native/commit/b7ab922bb3fd4f9f103e583bed9e9295a9521578) by [@yungsters](https://github.com/yungsters)) -- Platform.select now supports native as an option. ([a6fc0898de](https://github.com/facebook/react-native/commit/a6fc0898de990959d201b9665501deda215e41a4) by [@koke](https://github.com/koke)) -- Export the DevSettings module, add `addMenuItem` method ([cc068b0551](https://github.com/facebook/react-native/commit/cc068b055185e6fb7341bf945f69a74ed3ef4814) by [@janicduplessis](https://github.com/janicduplessis)) -- Expose RCTNetworking as a public 'Networking' API ([42ee5ec934](https://github.com/facebook/react-native/commit/42ee5ec93425c95dee6125a6ff6864ec647636aa) by [@adamchel](https://github.com/adamchel)) -- Add `useColorScheme` hook ([51681e80ab](https://github.com/facebook/react-native/commit/51681e80ab0d1efdaba684b626994b694d53d2a5) by [@hramos](https://github.com/hramos)) -- Add `unstable_enableLogBox` ([dd8e5f468a](https://github.com/facebook/react-native/commit/dd8e5f468a29e299647ffbd0887f53afd24936e3) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Expose Hermes Sampling Profiler ([15ecb60d6d](https://github.com/facebook/react-native/commit/15ecb60d6deb96fcb7b0ef70faccd10594ededa3) by [@axe-fb](https://github.com/axe-fb)) -- Add `error-subclass-name` lint rule ([6611c4b8f4](https://github.com/facebook/react-native/commit/6611c4b8f42520add983cc48fe4e14f7a02cc7cf) by [@motiz88](https://github.com/motiz88)) -- Add `HostComponent` to the public API of React Native ([a446a38aaa](https://github.com/facebook/react-native/commit/a446a38aaab5bea2e279f1958cfd90090bfd7e09) by [@TheSavior](https://github.com/TheSavior)) -- Add `RCTExceptionsManager.reportException` ([9a57145f52](https://github.com/facebook/react-native/commit/9a57145f52a03678da02d5d00cbe11eed3f5a0fc) by [@motiz88](https://github.com/motiz88)) -- Add `accessibilityValue` property ([7df3eea1a7](https://github.com/facebook/react-native/commit/7df3eea1a79f12c2dfff1976d0cef605a83232ec) by [@marcmulcahy](https://github.com/marcmulcahy)) -- Add `Appearance` module to expose the user's current Night theme preference ([17862a78db](https://github.com/facebook/react-native/commit/17862a78db59d60fe316961f9111efc330ba2abd) [63fa3f21c5](https://github.com/facebook/react-native/commit/63fa3f21c5ab308def450bffb22054241a8842ef) by [@hramos](https://github.com/hramos)) -- Add `onSlidingComplete` callbacks when sliders adjusted via a11y. ([c7aa6dc827](https://github.com/facebook/react-native/commit/c7aa6dc8270c0eabc913fe6c617c8131e3f4b3c5) by [@marcmulcahy](https://github.com/marcmulcahy)) - -#### Android specific - -- Implement `adjustsFontSizeToFit` on Android ([2c1913f0b3](https://github.com/facebook/react-native/commit/2c1913f0b3d12147654501f7ee43af1d313655d8) by [@janicduplessis](https://github.com/janicduplessis)) -- Allow overriding `EditText` construction in `ReactTextInputShadowNode` ([a5b5d1a805](https://github.com/facebook/react-native/commit/a5b5d1a805a9c54d325763b432be1cf2c8811dc9) by [@mchowning](https://github.com/mchowning)) -- Add Android support for `fontVariant` prop ([c2c4b43dfe](https://github.com/facebook/react-native/commit/c2c4b43dfe098342a6958a20f6a1d841f7526e48) by [@mcuelenaere](https://github.com/mcuelenaere)) -- Custom entry file on android using `ENTRY_FILE` environment variable ([a0d8740878](https://github.com/facebook/react-native/commit/a0d87408782fcf191988612198493d9130736c72)) -- Added `statusBarTranslucent` prop to Modal component ([c35a419e5d](https://github.com/facebook/react-native/commit/c35a419e5d2eca4fe9cd0939df085088fa88423b) by [@pfulop](https://github.com/pfulop)) -- Add `fadingEdgeLength` prop to FlatList and ScrollView ([51aacd5241](https://github.com/facebook/react-native/commit/51aacd5241c4b4c0b9b1e1b8f9dabac45e5b5291)) -- Support `removeClippedSubviews` for horizontal ScrollViews ([42152a3fa3](https://github.com/facebook/react-native/commit/42152a3fa3f949f5112461753eb44a436355dfb1)) -- Introducing `ReactCallerContextFactory` interface ([9713b63d9a](https://github.com/facebook/react-native/commit/9713b63d9ac1e1ae85accd86b78b351ac6295d01) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific - -- Added web socket support for macOS ([f21fa4ecb7](https://github.com/facebook/react-native/commit/f21fa4ecb73551bdc4c3d70db9fc13e93b19b3a6) by [@andymatuschak](https://github.com/andymatuschak)) -- Added Warning message Linking API with Phones in iOS Simulator ([e1d89fbd9d](https://github.com/facebook/react-native/commit/e1d89fbd9df91679ec36e955a3d0f699c2d5e777) by [@espipj](https://github.com/espipj)) -- Added missing deps for React-CoreModules ([15b2353382](https://github.com/facebook/react-native/commit/15b2353382c46dc5f0130ff44b9deb6a2361e3e5) by [@fkgozali](https://github.com/fkgozali)) -- Expose the `isPackagerRunning` methods on RCTBundleURLProvider ([fe9cba74fa](https://github.com/facebook/react-native/commit/fe9cba74fa6241b4c38a3df9481d3634ebd51bf9) by [@afoxman](https://github.com/afoxman)) -- Add `autoFocus` to TextInput ([6adba409e6](https://github.com/facebook/react-native/commit/6adba409e6256fd2dcc27a4272edcedae89927af) by [@janicduplessis](https://github.com/janicduplessis)) - -### Changed - -- Upgrade metro version to 0.56.3 ([4b487ba500](https://github.com/facebook/react-native/commit/4b487ba50025becb6a83c805b99d45651db6b8c1) by [@EssamEmad](https://github.com/EssamEmad)) -- Upgrade `eslint-plugin-relay` to 1.3.12 ([f0bcfbe9be](https://github.com/facebook/react-native/commit/f0bcfbe9be0eb6a06d096a682717a23e43c39d52) by [@jstejada](https://github.com/jstejada)) -- Upgrade to Flow v0.108.0 ([d34bc5fa64](https://github.com/facebook/react-native/commit/d34bc5fa64a54dfc2e780461ee2997a4b17f8c65) by [@mvitousek](https://github.com/mvitousek)) -- Upgrade metro babel preset ([cef001713f](https://github.com/facebook/react-native/commit/cef001713fc6384353bbcb4d45645ceee44ed1a9) by [@alloy](https://github.com/alloy)) -- TextInput now properly sends native the end selection location on change ([dff490d140](https://github.com/facebook/react-native/commit/dff490d140010913d3209a2f3e987914b9c4eee4) by [@TheSavior](https://github.com/TheSavior)) -- TextInput now uses `forwardRef` allowing it to be used directly by new APIs requiring a host component. ([bbc5c35a61](https://github.com/facebook/react-native/commit/bbc5c35a61cd3af47ccb2dc62430e4b6a4d4e08f) by [@TheSavior](https://github.com/TheSavior)) -- TextInput no longer does an extra round trip to native on focus/blur ([e9b4928311](https://github.com/facebook/react-native/commit/e9b4928311513d3cbbd9d875827694eab6cfa932) by [@TheSavior](https://github.com/TheSavior)) -- Render collapsed JavaScript frames in RedBox ([468d1a2d2e](https://github.com/facebook/react-native/commit/468d1a2d2e6c72d7c6d435ecaad8499997584de6) by [@motiz88](https://github.com/motiz88)) -- Enable `no-useless-escape` lint rule ([90977b0e00](https://github.com/facebook/react-native/commit/90977b0e00acc6b3263502017c27094392e89478) by [@motiz88](https://github.com/motiz88)) -- Update `DevSettings.reload` to accept a reason ([549cac63cb](https://github.com/facebook/react-native/commit/549cac63cb252037f73453c5d4e7ae5f15586607) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Move `react-native-implementation.js` to `index.js` ([e54ecf907e](https://github.com/facebook/react-native/commit/e54ecf907e9f0660d05dc807ec0e67127143ebed) by [@cpojer](https://github.com/cpojer)) -- Delete Long Press Error in Touchable ([9a3d722ccb](https://github.com/facebook/react-native/commit/9a3d722ccb523f227ffd7770a809996e6cfe75d9) by [@yungsters](https://github.com/yungsters)) -- Add Intl to eslint globals. ([f6a62f9ae2](https://github.com/facebook/react-native/commit/f6a62f9ae2278c0f3a1e5c1a6ec3b7cca3421a41)) -- Add WebSocket to eslint globals ([af8ea06bb4](https://github.com/facebook/react-native/commit/af8ea06bb44e84ce51d4ca4e76f0d66bf34323bd) by [@dr2009](https://github.com/dr2009)) -- Change default `accessibilityRole` of Switch component from `button` to `switch` ([36672c3851](https://github.com/facebook/react-native/commit/36672c3851a044a1ab0edcfaa2790c02f7909695) by [@alvinmatias69](https://github.com/alvinmatias69)) - -#### Android specific - -- Bump gradle-download-task to 4.0.2 ([088be260b6](https://github.com/facebook/react-native/commit/088be260b6727ba82167fe58cb1ee4410a6920b2) by [@dulmandakh](https://github.com/dulmandakh)) -- Bump Gradle to 6.0.1 ([701e66bde4](https://github.com/facebook/react-native/commit/701e66bde4ea0e404626c7805e2bcdfa0c129c05) by [@dulmandakh](https://github.com/dulmandakh)) -- Bump Gradle wrapper 5.6.4 ([928f4434b9](https://github.com/facebook/react-native/commit/928f4434b9829c90098b1626b03938d932a9c1f6) by [@friederbluemle](https://github.com/friederbluemle)) -- Bump Soloader to 0.8.0 ([614039834b](https://github.com/facebook/react-native/commit/614039834bf255de096f8b1d168832f81b0cf3fa)) -- Update Android Gradle plugin to 3.5.2 ([b41b5ce8ae](https://github.com/facebook/react-native/commit/b41b5ce8ae2902169ae58860da2c70a9233bea53) by [@friederbluemle](https://github.com/friederbluemle)) -- Improve exception message when JSC loading fails ([65d3167a80](https://github.com/facebook/react-native/commit/65d3167a802b2ca04d4f05ff972c2d51765f1e0d) by [@mhorowitz](https://github.com/mhorowitz)) -- Expose `addCookies` method ([cc845ccfb4](https://github.com/facebook/react-native/commit/cc845ccfb4c0f841b876bca55c5f70efd72be538) by [@safaiyeh](https://github.com/safaiyeh)) -- Migrated from libfb to libfbjni for JNI calls ([9ad5e72b77](https://github.com/facebook/react-native/commit/9ad5e72b77013083f925108870ea6b17f4711a1d) by [@passy](https://github.com/passy)) -- Formatted cpp/h code with clang-format ([d5ba113bb2](https://github.com/facebook/react-native/commit/d5ba113bb2cd839ea38768785e527fbbc9636e41) by [@passy](https://github.com/passy)) -- Switch MainActivity launchMode to singleTask ([7a42596438](https://github.com/facebook/react-native/commit/7a42596438018129d52ff04899ab4ddabd27cdcb) by [@dulmandakh](https://github.com/dulmandakh)) -- Changing method signatures for ImageLoaderModule to accept double for requestId ([641e9657dd](https://github.com/facebook/react-native/commit/641e9657ddab5d1b2676e98d86fd369372281d2c) by [@ejanzer](https://github.com/ejanzer)) -- Use Node's module resolution algorithm to find JSC & Hermes ([fc25f288fe](https://github.com/facebook/react-native/commit/fc25f288fe553cb7e8f04b8ce4b56297b7fa40d5) by [@ide](https://github.com/ide)) -- Add `ACCESS_BACKGROUND_LOCATION` to PermissionsAndroid ([8c099b5f53](https://github.com/facebook/react-native/commit/8c099b5f53405fe0806113ca7ccf0bbe1af92a21) by [@dulmandakh](https://github.com/dulmandakh)) - -#### iOS specific - -- Add `xcscheme` files for iOS template back in. ([a715decd2d](https://github.com/facebook/react-native/commit/a715decd2d3bcdab9537f3246c8398ad9869e94e) by [@pvinis](https://github.com/pvinis)) - -### Deprecated - -- Add deprecation warning to `AccessibilityInfo.fetch` ([523ab83338](https://github.com/facebook/react-native/commit/523ab8333800afbfb169c6fd70ab6611fe07cc2a) by [@TheSavior](https://github.com/TheSavior)) -- Make setting `useNativeDriver` required. Add runtime warning if not specified ([5876052615](https://github.com/facebook/react-native/commit/5876052615f4858ed5fc32fa3da9b64695974238) by [@TheSavior](https://github.com/TheSavior)) -- Refs on an Animated component are now the internal component. The `getNode` call has been deprecated. ([66e72bb4e0](https://github.com/facebook/react-native/commit/66e72bb4e00aafbcb9f450ed5db261d98f99f82a) by [@yungsters](https://github.com/yungsters)) - -#### iOS specific - -- Deprecate `[bridge reload]`, prefer `RCTReloadCommand` ([ffe2306164](https://github.com/facebook/react-native/commit/ffe2306164ed7edfe5ab9d75b5122791037a852a) by [@PeteTheHeat](https://github.com/PeteTheHeat)) - -#### Android specific - -- Deprecate `CallerContext` from `ReactImageManager` ([8accd77c45](https://github.com/facebook/react-native/commit/8accd77c45a4b051bf02904c3485d6a0dcd27631) by [@mdvacca](https://github.com/mdvacca)) - -### Removed - -- Removing experimental `IncrementalPresenter` component ([0ef0d3167e](https://github.com/facebook/react-native/commit/0ef0d3167e291f31ce01ceb729df77cc679d2330) by [@TheSavior](https://github.com/TheSavior)) -- TouchableWithoutFeedback no longer exports Props. Use React.ElementConfig, instead. ([7bcae81299](https://github.com/facebook/react-native/commit/7bcae812997f669de5803cc781dcf3ea65baf0e9) by [@yungsters](https://github.com/yungsters)) -- Remove `Sample` and `CrashyCrash` Modules ([8ec7e0966c](https://github.com/facebook/react-native/commit/8ec7e0966cf83ed29a39aab47c686bc60a124983) by [@RSNara](https://github.com/RSNara)) -- Remove `propTypes` from Animated components. ([86d90c03eb](https://github.com/facebook/react-native/commit/86d90c03ebe39ebc4b2c6dcc0747b4f3a34f5f2f) by [@yungsters](https://github.com/yungsters)) -- Remove `propTypes` from TouchableHighlight. ([7c01172bef](https://github.com/facebook/react-native/commit/7c01172befd07f1d082b18993b87fc880e4b718f) by [@yungsters](https://github.com/yungsters)) -- Remove `propTypes` from TouchableNativeFeedback. ([2185dd298a](https://github.com/facebook/react-native/commit/2185dd298a788c2b713ea17878fd36e06205b4da) by [@yungsters](https://github.com/yungsters)) -- Remove `propTypes` from TouchableOpacity. ([88ae24f719](https://github.com/facebook/react-native/commit/88ae24f719d365b004696aff6461535188ca9f41) by [@yungsters](https://github.com/yungsters)) -- Remove `propTypes` from TouchableWithoutFeedback. ([ebf7d75816](https://github.com/facebook/react-native/commit/ebf7d758164873169937321a4dccc3782359a0d3) by [@yungsters](https://github.com/yungsters)) -- Remove `__skipSetNativeProps_FOR_TESTS_ONLY` from Animated components. ([dcd63078bd](https://github.com/facebook/react-native/commit/dcd63078bdab864830168005b940f638f1e08b23) by [@yungsters](https://github.com/yungsters)) -- Remove Apple TV Props ([548aad4ff1](https://github.com/facebook/react-native/commit/548aad4ff1dfef0d71bdd39aa83ad71e522a2546) by [@yungsters](https://github.com/yungsters)) - -#### Android specific - -- Remove `NativeRunnableDeprecated` ([973253af8a](https://github.com/facebook/react-native/commit/973253af8a47d9ebd137f554054e7a95f8ef2e45) by [@passy](https://github.com/passy)) -- Remove `com.facebook.react.modules.debug.NativeSourceCodeSpec` ([4d9e5f8481](https://github.com/facebook/react-native/commit/4d9e5f8481531000380cf4d3d485fcde1321a37b) by [@RSNara](https://github.com/RSNara)) - -### Fixed - -- Fix `require` cycle warning in ScrollResponder. ([674ac69cee](https://github.com/facebook/react-native/commit/674ac69cee7c1ce6096bee258880e79966322ee0) by [@Naturalclar](https://github.com/Naturalclar)) -- Restore behavior for `underlayColor={null}` in `TouchableHighlight`. ([37d8440a8e](https://github.com/facebook/react-native/commit/37d8440a8e35a53b81914e429502db527790b3cd) by [@yungsters](https://github.com/yungsters)) -- Fix stack traces showing the wrong function name in some cases ([60b4ba16c0](https://github.com/facebook/react-native/commit/60b4ba16c008c23959ebd27ea7215f83878d1343) by [@motiz88](https://github.com/motiz88)) -- Fix `requestAnimationFrame` when focusing input on mount ([5798cf2aa9](https://github.com/facebook/react-native/commit/5798cf2aa9b86bbcb40016aae14eca88fca19fde) by [@janicduplessis](https://github.com/janicduplessis)) -- Reduce overhead of setting up timers in DEV ([75a154b449](https://github.com/facebook/react-native/commit/75a154b4499e44b4ab31ccf28f9eb1dbf21578ac) by [@motiz88](https://github.com/motiz88)) -- Fixed an issue where margin and padding were resolved incorrectly. ([1d683faf1d](https://github.com/facebook/react-native/commit/1d683faf1dc89e4950e7e1f5c5a67f9a7ca1ee24) by [@SidharthGuglani](https://github.com/SidharthGuglani)) -- Fix using width for calculating margin top percent ([0599af2282](https://github.com/facebook/react-native/commit/0599af2282ffbf636604bce1cb4c049201fed393) by [@SidharthGuglani](https://github.com/SidharthGuglani)) -- Don't restore default values in NativeAnimated when components unmount ([686ab49107](https://github.com/facebook/react-native/commit/686ab49107df8ed20d4e810f1366715cd70b4a31) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix eslint-config peer dependency warnings ([1353da5a53](https://github.com/facebook/react-native/commit/1353da5a538d4a6f76fc9530711394cf981034a0) by [@friederbluemle](https://github.com/friederbluemle)) -- Remove style rules from eslint config for prettier options ([e4b62bb139](https://github.com/facebook/react-native/commit/e4b62bb139c258b65a9ebf2a8ee692ea52c3afab) by [@iRoachie](https://github.com/iRoachie)) -- Fix separators displays in wrong places with the inverted list ([dfb4f4af68](https://github.com/facebook/react-native/commit/dfb4f4af68726d2e05f63689a9c74c9bb9a0611b) by [@dy93](https://github.com/dy93)) -- Fix issue where we attempt to connect to React devtools every 2 seconds ([e7f6210d5d](https://github.com/facebook/react-native/commit/e7f6210d5d417c5b6d4ba7f5cf96b40dbf70b9cd) by [@ejanzer](https://github.com/ejanzer)) -- Fix so that early logs don't get dropped by Metro ([4ed05ca241](https://github.com/facebook/react-native/commit/4ed05ca241b791ad629fd154429a4a53c7731556) by [@gaearon](https://github.com/gaearon)) -- Fix to announce accessibility state changes happening in the background ([baa66f63d8](https://github.com/facebook/react-native/commit/baa66f63d8af2b772dea8ff8eda50eba264c3faf) by [@xuelgong](https://github.com/xuelgong)) -- Fix `JSBigString` not compiling on Windows due to Unix-specific headers ([80857f295c](https://github.com/facebook/react-native/commit/80857f295c17e5f8966b3d1c1207d3c4570a1b26) by [@empyrical](https://github.com/empyrical)) -- Fix exception in `scrollResponderScrollNativeHandleToKeyboard` when ref is null ([da8ae011bb](https://github.com/facebook/react-native/commit/da8ae011bbabc8acb7ef7f6903f68dd60aaa1f9d) by [@TheSavior](https://github.com/TheSavior)) -- Fix excessive toggles on the Switch component ([b782934f3f](https://github.com/facebook/react-native/commit/b782934f3f2a80ae7e3872cc7d7a610aa6680ec4) by [@rurikoaraki](https://github.com/rurikoaraki)) -- Fix bare hosts in `URL`. Add missing / between url ([20ab946f34](https://github.com/facebook/react-native/commit/20ab946f34b1d9727ff08c733b2006e84fd79349) by [@jeswinsimon](https://github.com/jeswinsimon)) -- Fix the non-standard usage of `ATOMIC_VAR_INIT` macro from code with systrace enabled ([75a7a52db4](https://github.com/facebook/react-native/commit/75a7a52db496bd3892a367372eea25bf50840fc3)) -- Fix `useWindowDimensions` hook firing continuously after dimensions change ([3b3c95b017](https://github.com/facebook/react-native/commit/3b3c95b0170e60983eb6e89b910d100d08eee141) by [@dulmandakh](https://github.com/dulmandakh)) -- Fix throttling in ScrollView ([4159e20146](https://github.com/facebook/react-native/commit/4159e201462c346c456de1fa869d88a9cce7b6d4) by [@sammy-SC](https://github.com/sammy-SC)) -- Fix `TimingAnimation` rounding error issue ([77b6e26538](https://github.com/facebook/react-native/commit/77b6e2653835af61b186903eae45d67f35351ade) by [@MartinSherburn](https://github.com/MartinSherburn)) -- Fix recycling of Switch ([a261e6dfb2](https://github.com/facebook/react-native/commit/a261e6dfb2680a955943db53c4b0a7bb887bfe22) by [@sammy-SC](https://github.com/sammy-SC)) - -#### Android specific - -- Fix to reset sMatrixDecompositionContext before applying transformations ([bf01dfbc97](https://github.com/facebook/react-native/commit/bf01dfbc97ea8be9d88214ab31809f2f42d6c064) by [@makovkastar](https://github.com/makovkastar)) -- Fix animations in OSS debug builds by modifying `Platform.isTesting()` behavior ([1fbc6a7c17](https://github.com/facebook/react-native/commit/1fbc6a7c178d13421b0b84d6ea01f9174105325f) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Fix Modal not disappearing when reloading ([5ddf00ee1a](https://github.com/facebook/react-native/commit/5ddf00ee1acbf66c7204227c398a58c13e4545cf) by [@sunnylqm](https://github.com/sunnylqm)) -- Fix to support nullable returns NativeModule methods returning Boxed Primitives ([f57b0caaa4](https://github.com/facebook/react-native/commit/f57b0caaa4452c64006c159cd28a1a562b332c21) by [@RSNara](https://github.com/RSNara)) -- Fix crash in TextInput ([6ebd3b046e](https://github.com/facebook/react-native/commit/6ebd3b046e5b71130281f1a7dbe7220eff95d74a) by [@MarcoPolo](https://github.com/MarcoPolo)) -- Fix View.getGlobalVisibleRect() to clip result rect properly when overflow is 'hidden' ([df9abf7983](https://github.com/facebook/react-native/commit/df9abf798351c43253c449fe2c83c2cca0479d80) by [@davidbiedenbach](https://github.com/davidbiedenbach)) -- Fix throwing "Unknown array type" exception ([4b9350061f](https://github.com/facebook/react-native/commit/4b9350061fa3d186fdd3a973e1b46f60a7ac03b9) by [@petterh](https://github.com/petterh)) -- Fix issue with refresh control not working properly on an inverted ScrollView ([0a282c42b4](https://github.com/facebook/react-native/commit/0a282c42b4d1c2316513cd5588a0a92b54db2991) by [@migbot](https://github.com/migbot)) -- Fix to listen to NFC actions for linking url events ([8d8c3d4e1e](https://github.com/facebook/react-native/commit/8d8c3d4e1eb88366074e87385c4d96a46dfdd544) by [@cimitan](https://github.com/cimitan)) -- Fix onPress prop for Touchable Components being called twice on AndroidTV. ([21890e964d](https://github.com/facebook/react-native/commit/21890e964df7674fcf13cefc8cb939441f6eddef) by [@dbarr33](https://github.com/dbarr33)) -- Fix `includeFontPadding` for `TextInput` placeholder ([211ea485cd](https://github.com/facebook/react-native/commit/211ea485cd993ca25d6640be41e54f327ca1629c) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix medium font weights for TextInput on Android ([8b9f790069](https://github.com/facebook/react-native/commit/8b9f7900697b2e4bb72b37ed2e6c3d113185d327) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix close button issue in KeyboardAvoidingView ([f1c6029e48](https://github.com/facebook/react-native/commit/f1c6029e4868084e5a10d81c15ee3cc5e301599a) by [@saxenanickk](https://github.com/saxenanickk)) -- Fix activity recreation on theme change ([83a16b16c9](https://github.com/facebook/react-native/commit/83a16b16c9afa0fe0328ab818470d4fce098876b) by [@Esemesek](https://github.com/Esemesek)) -- Fix ForwardingCookieHandler missing WebView exceptions. ([314eba98b2](https://github.com/facebook/react-native/commit/314eba98b2f2755cb26ed7a268d3fe83a7626efa) by [@siddhantsoni](https://github.com/siddhantsoni)) -- Fix ReactInstanceManagerBuilder.build crashing if SoLoader has not been explicitly initialized ([60e00d9d96](https://github.com/facebook/react-native/commit/60e00d9d96d7b186c1d4c1542caddc1b74eeb3da) by [@petterh](https://github.com/petterh)) -- Fix default accessibility hint not being read. ([f8dff0bcb3](https://github.com/facebook/react-native/commit/f8dff0bcb3147b7a1aa8ac7159952d848e198e29)) -- Fix JS bundle loading progress bar ([7b9d6d19e2](https://github.com/facebook/react-native/commit/7b9d6d19e2c0854aa53587ef68ce715fb7803e2a) by [@makovkastar](https://github.com/makovkastar)) -- Fix Android Q related NaN error - don't try to do math with NaN values ([db5994980d](https://github.com/facebook/react-native/commit/db5994980df136c5cce6cd90348b4bf18180562f)) -- Fix throwing exceptions when the host activity is not FragmentActivity ([7cfabf42b8](https://github.com/facebook/react-native/commit/7cfabf42b816de758d8e52896bbab0c50e3a802a) by [@mganandraj](https://github.com/mganandraj)) -- Fix crash when using `TextInput.FontVariant` prop in Android API level < 26 ([e885ddedb9](https://github.com/facebook/react-native/commit/e885ddedb9b0a025cb8031414dcc4bd22744a0eb) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific - -- Fix support for `onRequestClose` in Modal on iOS 13+ ([8e5fac89bb](https://github.com/facebook/react-native/commit/8e5fac89bbdcc3028bb5d81a358969a235abf991) by [@koke](https://github.com/koke)) -- Fix `Dimensions` module to update on initial split screen ([7a72c35a20](https://github.com/facebook/react-native/commit/7a72c35a20a18c19bf6ab883cb2c53a85bd4c5c0) by [@sahrens](https://github.com/sahrens)) -- Fix spinner visibility on `beginRefreshingProgrammatically` ([e341489521](https://github.com/facebook/react-native/commit/e341489521ad495e68e8aba01ff4dd25a5e4ff3e) by [@nnabinh](https://github.com/nnabinh)) -- Reconnect to debugger websocket after Metro is restarted. ([13992f90e4](https://github.com/facebook/react-native/commit/13992f90e48fc11e0b7217ee6d9413f97c32268a) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Fix Slider not disabling properly if the disabled prop is set. ([fa9ff07017](https://github.com/facebook/react-native/commit/fa9ff07017edbc76595fe2f2d964ee13c5f4088a)) -- Fix apps crashing on iOS 13.x when running timer in the background ([e1d03b4cc0](https://github.com/facebook/react-native/commit/e1d03b4cc00c361e10687eb4a9f902563cd1cbe1) by [@radko93](https://github.com/radko93)) -- Fix TextInput blur when tabbing in iOS simulator. ([a7437710d2](https://github.com/facebook/react-native/commit/a7437710d25adfc9150fc079e4525ed59d5404e2) by [@fat](https://github.com/fat)) -- Fix promised returned by `Share.share(content, options)` not resolving if share dialog dismissed ([7468a6c903](https://github.com/facebook/react-native/commit/7468a6c9033ffe8cc2315a3de3a759b8745fe43d) by [@v-fernandez](https://github.com/v-fernandez)) -- Fix maximum searching depth while measuring layout by removing it. ([2f8328dbb0](https://github.com/facebook/react-native/commit/2f8328dbb0d9813c904c0b888b2b7500cf4a4bce) by [@draws](https://github.com/dratwas)) -- Fix SafeAreaInsets call to not crash on older versions of iOS ([03acf57b76](https://github.com/facebook/react-native/commit/03acf57b767553acbee4ff589055fbd239ffffbb) by [@mmmulani](https://github.com/mmmulani)) -- Fix to retain `cropData` struct arg in ImageEditingManager.cropImage call ([002d3c179d](https://github.com/facebook/react-native/commit/002d3c179dd2515f0a4d894d9b7f70c4e538f728) by [@RSNara](https://github.com/RSNara))) -- Fix bug rendering nested text on iOS13 ([06599b3e59](https://github.com/facebook/react-native/commit/06599b3e594355a1d5062ede049ff3e333285516) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Fix longstanding bug where RCTNullIfNil() can return nil ([79b573511b](https://github.com/facebook/react-native/commit/79b573511bd55e6c82c0044e1930549ccfa8a923) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Fix crash in RCTScrollViewComponentView ([e7ef9921d3](https://github.com/facebook/react-native/commit/e7ef9921d3f91b02cfec4bbfd88b4968434e201c) by [@shergin](https://github.com/shergin)) -- Fix how the amount of free memory is calculated to mimic the logic Apple uses. ([b53d3d80f9](https://github.com/facebook/react-native/commit/b53d3d80f991937915a87ba8515f403551de139e)) -- Fix animated gifs incorrectly looping ([6f2e6f170e](https://github.com/facebook/react-native/commit/6f2e6f170e3ee785d1ba844971447ea24f91185e) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix `tintColor` in SegmentedControlIOS component ([be89e4d928](https://github.com/facebook/react-native/commit/be89e4d928a504de304f5afb19bd3cc15ae3eb7d) by [@sammy-SC](https://github.com/sammy-SC)) - -## v0.61.5 - -This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/151) to improve the quality of the 0.61 release. Thanks to everyone who contributed! - -### Fixes - -#### Android specific - -- Fix bundling assets in monorepo ([a3b0804867](https://github.com/facebook/react-native/commit/a3b08048674e324dbe1f0ca816f35607e9e06a2f) by [@Esemesek](https://github.com/Esemesek)) -- Fix multiple `set-cookie` not aggregated correctly in response headers ([1df8bd4932](https://github.com/facebook/react-native/commit/1df8bd4932f42958c01dccf44cee92b75a6988ed) by **Vincent Cheung**) - -## v0.61.4 - -This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/150) to improve the quality of the 0.61 release. Thanks to everyone who contributed! - -### Fixed - -- Fix build with Hermes on Windows ([81a6b6ed3c](https://github.com/facebook/react-native/commit/81a6b6ed3c54498f6f2148c106846352405949bf) by [@B27](https://github.com/B27)) -- Fix Chrome debugger showing console.logs at incorrect locations ([42ac240bce](https://github.com/facebook/react-native/commit/42ac240bceb104474494c6007df0089baec00f7a) by [@rickhanlonii](https://github.com/rickhanlonii)) - -#### iOS specific - -- Fix bug in iOS 13 when application would be terminated immediately when in background ([d7c9173b07](https://github.com/facebook/react-native/commit/d7c9173b07171164bcadf73855454e90e07b31be) by [@radko93](https://github.com/radko93)) - -## v0.61.3 - -This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/148) to improve the quality of the 0.61 release. Thanks to everyone who contributed! - -### Fixed - -- Fix bug where ScrollView contentInset top set to undefined wouldn't default to 0 ([d576a5bcc0](https://github.com/facebook/react-native/commit/d576a5bcc0e03dd9c4ccd982f723d6e376e5b680) by [TheSavior](https://github.com/TheSavior)) -- Fix TimingAnimation rounding error issue ([bfd01552af](https://github.com/facebook/react-native/commit/bfd01552af6c074a425da2e7cc1a5908faba2644) by [MartinSherburn](https://github.com/MartinSherburn)) - -#### iOS specific - -- Fix selecting videos from library in iOS 13 ([63769518e0](https://github.com/facebook/react-native/commit/63769518e0c7db60eb39bb5f47fe24f4bc664862) by [fatalsun](https://github.com/fatalsun)) -- Fix bug in iOS13 nested text rendering ([7cf43afa8d](https://github.com/facebook/react-native/commit/7cf43afa8d6a03ccb4cfdc09f81891eabe8b8b70) by [PeteTheHeat](https://github.com/PeteTheHeat)) - -#### Android specific - -- Release underlying resources when JS instance is GC'ed on Android try ([9b2374b542](https://github.com/facebook/react-native/commit/9b2374b542f87b7baefcfb4a3eb4f57029069b57) by [janicduplessis](https://github.com/janicduplessis)) - -## v0.61.2 - -This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/146) to improve the quality of the 0.61 release. Thanks to everyone who contributed! - -### Fixed - -#### Android specific - -- Fix elevation issues on Android ([8fd9ab2f54](https://github.com/facebook/react-native/pull/26682) by [@grabbou](https://github.com/grabbou)) - -### Added - -- Use `warnOnce` for excessive number of callbacks error ([0cafa0f5d1](https://github.com/facebook/react-native/commit/0cafa0f5d1e7fa5369b765f4b97f38bf1608230a) by [@janicduplessis](https://github.com/anicduplessis)) -- Include transform in OUTER_PROPS ([b94438](https://github.com/facebook/react-native/commit/b94438) by [@migbot](https://github.com/migbot)) - -#### iOS specific - -- Better iOS13 support in `StatusBar` API ([796b3a1f88](https://github.com/facebook/react-native/commit/796b3a1f8823c87c9a066ea9c51244710dc0b9b5) by [@gaodeng](https://github.com/gaodeng)) - -#### Android specific - -- Improve error message in NativeModuleRegistryBuilder ([113c4e229c](https://github.com/facebook/react-native/commit/113c4e229c374232c46a89afd74df7117a3447c1) by [@vonovak](https://github.com/vonovak)) - -## v0.61.1 - -This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/144) to improve the quality of the 0.60 release. Thanks to everyone who contributed! - -### Fixed - -#### iOS specific - -- Fix ShareSheet crash on iOS 13 ([a4fbb8e75b](https://github.com/facebook/react-native/commit/a4fbb8e75bd9f521037926a68a8b75eaca2eca74) by [@tomtargosz](https://github.com/tomtargosz)) - -#### Android specific - -- Allow again for injecting custom root view via ReactActivityDelegate ([9f0dede1c9](https://github.com/facebook/react-native/commit/9f0dede1c913612e1241432f4cbccdc74d23a1e4) by [@kmagiera](https://github.com/kmagiera)) - -## v0.61.0 - -This is a major release that includes the new reloading experience Fast Refresh. It also removes the React `.xcodeproj`, fixes `use_frameworks!` for CocoaPods support, adds a `useWindowDimensions` hook, and upgrades to React 16.9. - -### Added - -- Add Fast Refresh by default ([17f8e5810f](https://github.com/facebook/react-native/commit/17f8e5810f3260ce1b24c61665883bab8847aabe) by [@gaearon](https://github.com/gaearon)) -- Add `useWindowDimensions` hook to replace most `Dimensions` usage ([103ec2f770](https://github.com/facebook/react-native/commit/103ec2f770dbb785ef4bc26f8662c74edded796a) by [@sahrens](https://github.com/sahrens)) - -#### Android specific - -- Add exception in .gitignore for `debug.keystore` to the android template. ([d55025694b](https://github.com/facebook/react-native/commit/d55025694be8b4ee5d09c8fdc910d42a5f144883) by [@bondehagen](https://github.com/bondehagen)) -- Add jitpack repository to template ([1a92cf9b2a](https://github.com/facebook/react-native/commit/1a92cf9b2afa718a81299b4be5ab6bdff16f4863) by [@iyegoroff](https://github.com/iyegoroff)) - -#### iOS specific - -- Add RCTWeakProxy to properly deallocate RCTUIImageViewAnimated ([947e71a922](https://github.com/facebook/react-native/commit/947e71a922c0db5d3d3780d249d1a8d183534c22) by [@mmmulani](https://github.com/mmmulani)) - -### Changed - -- Use prettyFormat for Metro logging ([abd7faf354](https://github.com/facebook/react-native/commit/abd7faf3547e165abfc52383d3709b9d4d2e9006) by [@cpojer](https://github.com/cpojer)) -- Tweak messages and fix the warning condition ([2a3ac0429b](https://github.com/facebook/react-native/commit/2a3ac0429b0e4c443d185807a39b41fc5a2ab1d2) by [@gaearon](https://github.com/gaearon)) -- Allow jest globals in **mocks** directories ([e78c01375a](https://github.com/facebook/react-native/commit/e78c01375aef88e0bb4029479acac9e85ecaf080) by [@artdent](https://github.com/artdent)) -- Make Animation EndCallback type allow any return value ([306c8d64d9](https://github.com/facebook/react-native/commit/306c8d64d91f87b248f627333de7f24355248088) by [@draperunner](https://github.com/draperunner)) -- create two layout pass reason flexLayout and flexMeasure instead of flex ([6ce985463b](https://github.com/facebook/react-native/commit/6ce985463b2724451baed8b0486b298f969e36e7) by [@SidharthGuglani](https://github.com/SidharthGuglani)) -- Use shorthand for Fragment in App.js ([7cac6a4b6c](https://github.com/facebook/react-native/commit/7cac6a4b6cfa8c1b54db62f2b1510f7c52f4574d) by [@ferdicus](https://github.com/ferdicus)) -- Use eslint-plugin-prettier recommended config ([d2b92fffb1](https://github.com/facebook/react-native/commit/d2b92fffb1d14dd0ec628e9dcdfd76e39f2067ff) by [@Justkant](https://github.com/Justkant)) -- Support string command arguments ([0314305e12](https://github.com/facebook/react-native/commit/0314305e1202e48c74091e15da8574f1b92ce441) by [@TheSavior](https://github.com/TheSavior)) -- chore: Link to CLA wiki and CLA form. ([e2d55d5c5e](https://github.com/facebook/react-native/commit/e2d55d5c5ef40ccae3220dc0e1fca7cf3592c676) by [@JustinTRoss](https://github.com/JustinTRoss)) -- CLI is now ^3.0.0-alpha.1 ([5edd1c674c](https://github.com/facebook/react-native/commit/5edd1c674c911a6c59aaad8ed36ce12fa98787ff) by [@thymikee](https://github.com/thymikee)) -- Flow is now v0.104.0 ([59db059dbd](https://github.com/facebook/react-native/commit/59db059dbddb8101212f3739eecf0db494cfab41) by [@mroch](https://github.com/mroch)) -- React is now at 16.9 ([40e8a5f685](https://github.com/facebook/react-native/commit/40e8a5f685376300aa5365de4557cd395996b9a2), [0ccedf3964](https://github.com/facebook/react-native/commit/0ccedf3964b1ebff43e4631d1e60b3e733096e56) by [@TheSavior](https://github.com/TheSavior)) -- Use Metro for auto-collapsing internal stack frames ([77125a1ac3](https://github.com/facebook/react-native/commit/77125a1ac364a6b7e2382fdc86cc19a3e2eba089) by [@motiz88](https://github.com/motiz88)) -- Move React error message formatting into ExceptionsManager ([2dadb9e2b0](https://github.com/facebook/react-native/commit/2dadb9e2b0ba26223ed83a30af620ce3e62e245f) by [@motiz88](https://github.com/motiz88)) -- Improve VirtualizedList error message ([bef87b648c](https://github.com/facebook/react-native/commit/bef87b648c4bed228f1c5889abe0181a271edf76) by [@vonovak](https://github.com/vonovak)) - -#### Android specific - -- Bump Hermes to v0.2.1 ([811401bcac](https://github.com/facebook/react-native/commit/811401bcac02f3e6e154c7e0f76f9f82eeaa6959) by [@sunnylqm](https://github.com/sunnylqm)) -- Use centralized package for DoNotStrip annotation ([35fc0add2d](https://github.com/facebook/react-native/commit/35fc0add2d3a278bf90257284fe23e03898008de) by [@passy](https://github.com/passy)) - -#### iOS specific - -- Do not override ActivityIndicator color when setting its size ([14b0ed4c5d](https://github.com/facebook/react-native/commit/14b0ed4c5d872cd992f6e1ca072a2c44c8ece25f) by [@cabelitos](https://github.com/cabelitos)) -- fix display problems when image fails to load ([71d7d6883c](https://github.com/facebook/react-native/commit/71d7d6883cb9a3d18666f04a444de7b4a611b304)) -- Renamed yoga podspec to Yoga ([82a8080f07](https://github.com/facebook/react-native/commit/82a8080f0704e83079d0429e4e367f5131052e64) by [@axe-fb](https://github.com/axe-fb)) -- Update loading pre-bundled message ([eb92f8181f](https://github.com/facebook/react-native/commit/eb92f8181f3119bbc69ff7cb5aff2e03d993b8b3) by [@rickhanlonii](https://github.com/rickhanlonii)) - -### Deprecated - -- Deprecate method UIManagerModule.playTouchSound() ([e3ec8dbe15](https://github.com/facebook/react-native/commit/e3ec8dbe15a07e86530e1fd801c27ad8c1023b5c) by [@mdvacca](https://github.com/mdvacca)) -- Deprecate UIManager.measureLayoutRelativeToParent ([e42009b784](https://github.com/facebook/react-native/commit/e42009b7849f1cfd6d6d34e28c564ec5e39680bb) by [@mdvacca](https://github.com/mdvacca)) - -#### Android specific - -- DrawerLayoutAndroid drawerPosition now expects a string, number is deprecated ([305b0a2814](https://github.com/facebook/react-native/commit/305b0a28142414d559d2d08795a5963716dc4b0f) by [@TheSavior](https://github.com/TheSavior)) - -### Removed - -#### Android specific - -- Remove supportLibVersion variable in build.gradle ([fee7f0617e](https://github.com/facebook/react-native/commit/fee7f0617ee6e4f10edf6b8e36da6c5fb00d22ac) by [@ferdicus](https://github.com/ferdicus)) - -#### iOS Specific - -- Remove 's.static_framework = true' requirement for podspec ([ca9e108110](https://github.com/facebook/react-native/commit/ca9e108110e4a3cc39044805f879d9a9cb637c41) by [@jtreanor](https://github.com/jtreanor)) - -### Fixed - -- Add ErrorUtils to eslint globals ([76af5f9163](https://github.com/facebook/react-native/commit/76af5f916303d7906ea522076c965292145a1370) by [@rodineijf](https://github.com/rodineijf)) -- URL: Do not prepend baseUrl if the URL is not a relative URL ([e104204ae0](https://github.com/facebook/react-native/commit/e104204ae083d31e0b9967373ce79f2f1ca8fbb6) by [@jeswinsimon](https://github.com/jeswinsimon)) -- Memory Leak due to JSStringRelease not called ([b8d6ef3726](https://github.com/facebook/react-native/commit/b8d6ef372663fe6d467144abfc5d2c9352dc28d6) by [@sachinservicemax](https://github.com/sachinservicemax)) -- Fixed rotateZ native animation ([f4f08d3c54](https://github.com/facebook/react-native/commit/f4f08d3c549f2af7cd04ef78fe800d3bc12af1f0) by [@Titozzz](https://github.com/Titozzz)) -- Fix indentation in Gradle files ([9b0adb5ad1](https://github.com/facebook/react-native/commit/9b0adb5ad132b8ff37e707a4943411d92b4e58dc) by [@sonicdoe](https://github.com/sonicdoe)) -- Fix handling of failed image downloads ([71d7d6883c](https://github.com/facebook/react-native/commit/71d7d6883cb9a3d18666f04a444de7b4a611b304) by [@sammy-SC](https://github.com/sammy-SC)) -- Fix SectionList scrollToLocation and prevent regressions ([8a82503b54](https://github.com/facebook/react-native/commit/8a82503b54e3c63230a07de99ec082b2dcb54bc7) by [@vonovak](https://github.com/vonovak)) -- [General][internal] Fix incorrect `module.name_mapper` in template .flowconfig ([e6b2cf0418](https://github.com/facebook/react-native/commit/e6b2cf04188fc9647bae4bef4cca5d4dde22a657) by [@MoOx](https://github.com/MoOx)) -- Fall back to `JSON.stringify` in `console.log` if Symbol is unavailable ([179889704b](https://github.com/facebook/react-native/commit/179889704b6f9d56cb990d5b9bba6ee5ea2cd13f) by [@cpojer](https://github.com/cpojer)) -- Pop frames correctly in console.error handler ([3eaf245540](https://github.com/facebook/react-native/commit/3eaf2455402b5ad73c8a059311f0cb213df9dd28) by [@motiz88](https://github.com/motiz88)) -- Add documentation to TextInput's Flow types ([d00f0882fb](https://github.com/facebook/react-native/commit/d00f0882fbdd532f8698d2569bd771ca5843d0f5) by [@empyrical](https://github.com/empyrical)) - -#### Android specific - -- Add missing Hermes include ([1db96a3c46](https://github.com/facebook/react-native/commit/1db96a3c469b872e851553207e5420d54afc731a) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix UIManager.measure to consider scale and rotation transforms ([28d50189f3](https://github.com/facebook/react-native/commit/28d50189f3350e7550bf03ea5bd1363839ee2911) by [@floriancargoet](https://github.com/floriancargoet)) - -#### iOS specific - -- Fixed iOS packager connection ([4ab9da134c](https://github.com/facebook/react-native/commit/4ab9da134c988db832b1a2daa90ce38bf8c419eb) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fixed compatibility with CocoaPods frameworks. ([8131b7bb7b](https://github.com/facebook/react-native/commit/8131b7bb7b4794e0e7003a6e3d34e1ebe4b8b9bc) by [@jtreanor](https://github.com/jtreanor)) -- Don't call sharedApplication in App Extension ([c5ea18f738](https://github.com/facebook/react-native/commit/c5ea18f7389fe821e7a9882e4b1b30b0a1b266f4) by [@zhongwuzw](https://github.com/zhongwuzw)) - -## v0.60.6 - -This is a small patch release with a commit to fix the build break in MSVC to help the users of react-native-windows. ([9833ee7bc1](https://github.com/facebook/react-native/commit/9833ee7bc19982acd6ccaf6ac222bc24a97667a8) by [@acoates-ms](https://github.com/acoates-ms)) - -## v0.60.5 - -This is a patch release that consist of a few commits requested in the [dedicated conversation](https://github.com/react-native-community/releases/issues/130) to improve the quality of the 0.60 release. Thanks to everyone who contributed! - -### Added - -- Added a default Prettier config for new projects ([7254bab0b3](https://github.com/facebook/react-native/commit/7254bab0b3fa129cd238783ab993fbae1102d60a) by [@jpdriver](https://github.com/jpdriver)) - -#### Android specific - -- Add showSoftInputOnFocus to TextInput ([d88e4701fc](https://github.com/facebook/react-native/commit/d88e4701fc46b028861ddcfa3e6ffb141b3ede3d)) - -### Changed - -- Bump CLI to ^2.6.0 ([fafe5ee072](https://github.com/facebook/react-native/commit/fafe5ee0726061e3590b91d3b5cff04e33781f87) by [@thymikee](https://github.com/thymikee)) - -### Fixed - -- Ensure right version of Metro bundler is used ([1bb197afb1](https://github.com/facebook/react-native/commit/1bb197afb191eab134354386700053914f1ac181) by [@kelset](https://github.com/kelset)) - -#### Android specific - -- Fix `ClassNotFound` exception in Android during Release builds ([ffdf3f22c6](https://github.com/facebook/react-native/commit/ffdf3f22c68583fe77517f78dd97bd2e97ff1b9e) by [@thecodrr](https://github.com/thecodrr)) -- Remove unnecessary flag when running JS server ([a162554f5d](https://github.com/facebook/react-native/commit/a162554f5dc36fa0647b5bf52119a62bd20046e3) by [@thecodrr](https://github.com/thecodrr)) -- Correctly set the border radius on android ([b432b8f13b](https://github.com/facebook/react-native/commit/b432b8f13b4871dcafd690e57d37298662712b50) by [@cabelitos](https://github.com/cabelitos)) -- Fix addition of comma at the end of accessibility labels on Android. ([812abfdbba](https://github.com/facebook/react-native/commit/812abfdbba7c27978a5c2b7041fc4a900f3203ae) by [@marcmulcahy](https://github.com/marcmulcahy)) - -#### iOS specific - -- Don't call sharedApplication in App Extension ([c5ea18f738](https://github.com/facebook/react-native/commit/c5ea18f7389fe821e7a9882e4b1b30b0a1b266f4) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Delete fishhook ([46bdb4161c](https://github.com/facebook/react-native/commit/46bdb4161c84b33f1d0612e9c7cdd824462a31fd) by [@mmmulani](https://github.com/mmmulani)) - -You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). - -## v0.60.4 - -This is a patch release that contains two more Hermes related fixes, thanks to the contributors for helping improving the support! - -### Fixed - -#### Android specific - -- Generate correct source map if hermes not enabled ([b1f81be4bc](https://github.com/facebook/react-native/commit/b1f81be4bc21eb9baa39dd7ef97709d9927ad407) by [@HazAT](https://github.com/HazAT)) -- Generate source maps outside of assets/ ([60e75dc1ab](https://github.com/facebook/react-native/commit/60e75dc1ab73b2893ec2e25c0320f32b3cf12b80) by [@motiz88](https://github.com/motiz88)) - -You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). - -## v0.60.3 - -This is a patch release that fixes the binary path to Hermes package, thanks to [@zoontek](https://github.com/zoontek)) for creating the PR! - -You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). - -## v0.60.2 - -This is a patch release that fixes the path to Hermes package. - -You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). - -## v0.60.1 - -This is a patch release that includes the Hermes JavaScript Engine announced at Chain React Conf 2019. - -Check out the documentation to opt-in and give [Hermes a try](https://reactnative.dev/docs/hermes). - -You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/130). - -## v0.60.0 - -This feature release of React Native includes many milestone changes for the platform. Please refer to the [blog post](https://reactnative.dev/blog/2019/07/03/version-60) for selected details. For upgrading users, some of the progress comes with breaking changes; manual intervention may be required for your app. We're also aware that existing CocoaPods integrations using `use_frameworks` are not out-of-the-box compatible with this version, but please consider [various workarounds](https://github.com/facebook/react-native/issues/25349) while we prepare a long-term solution for a future release. If you're interested in helping evaluate our next release (0.61), subscribe to the dedicated issue [here](https://github.com/react-native-community/react-native-releases/issues/130). - -Have you ever considered contributing to React Native itself? Be sure to check out [Contributing to React Native](https://github.com/facebook/react-native/blob/master/CONTRIBUTING.md). - -### Added - -- CLI autolinking support ([5954880875](https://github.com/facebook/react-native/commit/5954880875d8dfb9b7868aa316647f8fe2b3d8c3), [da7d3dfc7d](https://github.com/facebook/react-native/commit/da7d3dfc7d3bd83e7522175a720b30fee4c9b3d3) by [@zhongwuzw](https://github.com/zhongwuzw) and [@hramos](https://github.com/hramos)) -- New Intro screen ([6b393b27e1](https://github.com/facebook/react-native/commit/6b393b27e18e663d39b66fd121ee302bce29d77d), [233fddbe01](https://github.com/facebook/react-native/commit/233fddbe012098dce3719ba066d3dc653e05e6c9), [fe88e9e48c](https://github.com/facebook/react-native/commit/fe88e9e48ce99cb8b9da913051cc36575310018b), [aa926e349b](https://github.com/facebook/react-native/commit/aa926e349b1656b02b8c1a2048cc56b25f9567c1), [a9e8a71e53](https://github.com/facebook/react-native/commit/a9e8a71e531510baf126780cecdcbc64c934f4dd), [ad4a5d9a3e](https://github.com/facebook/react-native/commit/ad4a5d9a3eac9794038e93158d45e7f1ceb9e495), and [0245fd713e](https://github.com/facebook/react-native/commit/0245fd713ea9ff6fe334980f537e2254a9e3126c) by [@cpojer](https://github.com/cpojer), [@eliperkins](https://github.com/eliperkins), [@lucasbento](https://github.com/lucasbento), [@orta](https://github.com/orta), [@adamshurson](https://github.com/adamshurson), [@karanpratapsingh](https://github.com/karanpratapsingh) and [@glauberfc](https://github.com/glauberfc)) -- Add enhanced accessibility actions support ([7fb02bd908](https://github.com/facebook/react-native/commit/7fb02bd90884f0a717e8151d4d30767fe38392c1) by [@xuelgong](https://github.com/xuelgong)) -- Add additional accessibility roles and states ([1aeac1c625](https://github.com/facebook/react-native/commit/1aeac1c62528004d994200664368dc85fba1795d)) -- Add `isReduceMotionEnabled()` plus `reduceMotionChanged` to `AccessibilityInfo` ([0090ab32c2](https://github.com/facebook/react-native/commit/0090ab32c2aeffed76ff58931930fe40a45e6ebc) by [@estevaolucas](https://github.com/estevaolucas)]) -- Add support for cancelling fetch requests with `AbortController` ([h5e36b0c](https://github.com/facebook/react-native/commit/5e36b0c6eb2494cefd11907673aa018831526750) by [@janicduplessis](https://github.com/janicduplessis)) - -#### Android specific - -- Enable views to be nested within **Text**; this brings feature parity to Android, but be aware that it [has some limitations](https://github.com/facebook/react-native/commit/a2a03bc68ba062a96a6971d3791d291f49794dfd) ([5c399a9f74](https://github.com/facebook/react-native/commit/5c399a9f74f22c58c11f75abde32ac7dc269ccc0) by [@rigdern](https://github.com/rigdern)) -- Add a `touchSoundDisabled` prop to **Button**, **Touchable**, and **TouchableWithoutFeedback** ([45e77c8324](https://github.com/facebook/react-native/commit/45e77c8324f7dc2d53109e45a4e0b18cbab6a877) by [@yurykorzun](https://github.com/yurykorzun)) - -#### iOS specific - -- Add `announceForAccessibility` and `announcementFinished` APIs for making screen reader announcements ([cfe003238a](https://github.com/facebook/react-native/commit/cfe003238ab8c5686d185f6ce9e0776eeb4bb729) by [@rigdern](https://github.com/rigdern)) -- Ability to force network requests to use WiFi using the `allowsCellularAccess` property. This can ensure that network requests are sent over WiFi if communicating with a local hardware device and is accomplished by setting a flag. Default behavior of allowing network connections over cellular networks when available is unchanged. ([01c70f2fb9](https://github.com/facebook/react-native/commit/01c70f2fb9e8ac78a4d0cbd016d4de47316fe4d1) and [916186a7e6](https://github.com/facebook/react-native/commit/916186a7e6c43b1a1c68652ab82862bcd8fb1e01) by [@bondparkerbond](https://github.com/bondparkerbond)and [@zhongwuzw](https://github.com/zhongwuzw)) -- `$RN_CACHE_DIR` can now be used to manually specify the iOS build cache directory ([845eee403e](https://github.com/facebook/react-native/commit/845eee403e1cd3cb36935ef142f411f2b5075346) by [@hramos](https://github.com/hramos)) - -### Changed - -- _BREAKING_ Migrated to AndroidX; please see [this thread](https://github.com/react-native-community/discussions-and-proposals/issues/129#issuecomment-503829184) for more details on this change -- Cleanup **RedBox** message and stack output; it's now far easier to understand ([49d26eb0c4](https://github.com/facebook/react-native/commit/49d26eb0c4aeb611c6cb37a568708afa67b48c18) by [@thymikee](https://github.com/thymikee)) -- Add default `scrollEventThrottle` value to **Animated.FlatList** and **Animated.SectionList**; this now behaves consistently with **Animated.ScrollView** ([933e65e245](https://github.com/facebook/react-native/commit/933e65e245b30f7dc5a26aa51881153fb7c3628e) by [@janicduplessis](https://github.com/janicduplessis)) -- Remove invariant on nested sibling **VirtualizedLists** without unique listKey props; they now trigger a **RedBox** ([af5633bcba](https://github.com/facebook/react-native/commit/af5633bcba224f71f035ba4214a93b69723c9b93)) -- **FlatList** and **VirtualizedList**'s default `keyExtractor` now checks `item.id` and `item.key` ([de0d7cfb79](https://github.com/facebook/react-native/commit/de0d7cfb79c7f4011d4b6748b1afc656d33fd5ac) by [@sahrens](https://github.com/sahrens)) -- **SectionList**'s `scrollToLocation` on iOS now counts `itemIndex` like Android; both platforms are now consistent, and the `itemIndex` value 0 now represents scrolling to the first heading ([248a108abf](https://github.com/facebook/react-native/commit/248a108abf206b7ae32208537f0b73a8192a4829) by [@vonovak](https://github.com/vonovak)) -- Slightly speedup core initialization by moving native version check to DEV only ([5bb2277245](https://github.com/facebook/react-native/commit/5bb22772452e49dbcfbf183f6ebeee4576e67947) by [@mmmulani](https://github.com/mmmulani)) -- `react` is now at v16.8.6 ([53cec2dc1f](https://github.com/facebook/react-native/commit/53cec2dc1f1f5d143d0bb9752629b72350ebd112), [ee681b72ce](https://github.com/facebook/react-native/commit/ee681b72ce89539e5764ed59e5dfea4fab04d48c), and [6001acb319](https://github.com/facebook/react-native/commit/6001acb319958242f8d8e2dd40cb91a55b5eab2e) by [@kelset](https://github.com/kelset), [@mdvacca](https://github.com/mdvacca), [@gaearon](https://github.com/gaearon)) -- `react-native-community/cli` is now at v2.0.0 (by [@thymikee](https://github.com/thymikee)) -- `flow` is now at v0.98 ([0e1dfd4369](https://github.com/facebook/react-native/commit/0e1dfd436917a78a09da7b57a0b50397e6a0b6e1) by [@nmote](https://github.com/nmote)) -- `prettier` is now at v1.17.0 ([ff9f8f347d](https://github.com/facebook/react-native/commit/ff9f8f347d71630664dc3da1e8be0425799c0ce0)) -- `metro` packages are now at v0.54.1 ([7ff3874ec0](https://github.com/facebook/react-native/commit/7ff3874ec060bce568537a2238aea2c888e6e13f), [343f0a1d50](https://github.com/facebook/react-native/commit/343f0a1d50662aa37ef0b26d5436b2a0b40fbabb) by [@motiz88](https://github.com/motiz88)) -- Replace patched fetch polyfill with `whatwg-fetch@3.0` ([bccc92dfdd](https://github.com/facebook/react-native/commit/bccc92dfdd2d85933f2a9cb5c8d1773affb7acba) by [@janicduplessis](https://github.com/janicduplessis)) - -#### Android specific - -- Use class canonical name for `PARTIAL_WAKE_LOCK` tag ([88dbb4558c](https://github.com/facebook/react-native/commit/88dbb4558cd10f129f2c31e3b0b872924aba5416) by [@timwangdev](https://github.com/timwangdev)) - -#### iOS specific - -- _BREAKING_: Split React.podspec into separate podspecs for each Xcode project; your libraries will need to update for this change as well to avoid CocoaPods build errors ([2321b3fd7f](https://github.com/facebook/react-native/commit/2321b3fd7f666ce30f5dad4cd2673ddf22972056) by [@fson](https://github.com/fson)) -- Improve handling of native module exceptions; they are now propagated to crash reporting tools with the context and callstack ([629708beda](https://github.com/facebook/react-native/commit/629708bedae65a30e39d234da6b04d6fa101a779) by [@pvinis](https://github.com/pvinis)) -- Switch **Slider** `onSlidingComplete` event to a non-bubbling event on iOS to match Android ([7927437a6d](https://github.com/facebook/react-native/commit/7927437a6d5d63de2424d43d58085291c1067091) by [@rickhanlonii](https://github.com/rickhanlonii)) - -### Deprecated - -- **StatusBar** is no longer deprecated; thank you for the feedback ([a203ebe206](https://github.com/facebook/react-native/commit/a203ebe2062b3c12f85783f46030971f3aa5db1d) by [@cpojer](https://github.com/cpojer)) - -### Removed - -- **NetInfo** has been removed; its replacement is now available via the [react-native-community/netinfo](https://github.com/react-native-community/react-native-netinfo) package ([5a30c2a205](https://github.com/facebook/react-native/commit/5a30c2a2052ba76e88dbf71b5b5c92966591bf26) by [@cpojer](https://github.com/cpojer)) -- **WebView** has been removed; its replacement is now available via the [react-native-community/webview](https://github.com/react-native-community/react-native-webview) package ([](https://github.com/facebook/react-native/commit/6ca438a7f4bd7e6b317f0461aebbd5a7186151ed), [1ca9a95537](https://github.com/facebook/react-native/commit/1ca9a9553763a89c977f756b45486f8b9cedab80), and [954f715b25](https://github.com/facebook/react-native/commit/954f715b25d3c47c35b5a23ae23770a93bc58cee) by [@cpojer](https://github.com/cpojer) and [@thorbenprimke](https://github.com/thorbenprimke)) -- **Geolocation** has been removed; its replacement is now available via the [react-native-community/geolocation](https://github.com/react-native-community/react-native-geolocation) package ([17dbf98884](https://github.com/facebook/react-native/commit/17dbf988845bb7815dbb6182218c8c28d027fb91) and [9834c580af](https://github.com/facebook/react-native/commit/9834c580af654366bf0d38b78cd2694b0a0c477f) by [@cpojer](https://github.com/cpojer) and [@mmmulani](https://github.com/mmmulani)) - -### Fixed - -- Fix `Animated.Value` value after animation if component was re-mounted ([b3f7d53b87](https://github.com/facebook/react-native/commit/b3f7d53b87413abdf302c521114e4d77aa92e07f) by [@michalchudziak](https://github.com/michalchudziak)) -- Consistent reporting native module name on crash on native side ([fdd8fadea8](https://github.com/facebook/react-native/commit/fdd8fadea84f475714a16b6f0ec433f898d09558) and [b79d7db9db](https://github.com/facebook/react-native/commit/b79d7db9dbf588085b29274e507d34438e2e2595) by [@DimitryDushkin](https://github.com/DimitryDushkin)) -- Handle null filenames in symbolicated stack trace gracefully in **ExceptionsManager** ([2e8d39bed7](https://github.com/facebook/react-native/commit/2e8d39bed70e2e5eeddeb2dc98155bf70f9abebd) by [@motiz88](https://github.com/motiz88)) -- Fix HasteImpl platform name regex ([28e0de070d](https://github.com/facebook/react-native/commit/28e0de070d2dae9a486ab5915b6fd76723bd84ef) by [@CaptainNic](https://github.com/CaptainNic)) -- Fix a JS memory leak in Blob handling; this resolves multiple leaks around `fetch` ([05baf62721](https://github.com/facebook/react-native/commit/05baf6272143667694585a14fb59657fdc93c3b1) and [9ef5107d04](https://github.com/facebook/react-native/commit/9ef5107d04da374fc566d8b296572ddd992419f0) by [@janicduplessis](https://github.com/janicduplessis)) -- **SectionList**'s `scrollToLocation` now scrolls to the top of the sticky header as expected ([d376a444e3](https://github.com/facebook/react-native/commit/d376a444e318beabd8ebe9ccb41ffc300e12ea76) by [@danilobuerger](https://github.com/danilobuerger)) - -#### Android specific - -- Fix duplicate resource error in Android build ([962437fafd](https://github.com/facebook/react-native/commit/962437fafd02c936754d1e992479056577cafd05) and [eb534bca58](https://github.com/facebook/react-native/commit/eb534bca58a89ae306010626a8bdae92c23b8784) by [@mikehardy](https://github.com/mikehardy) and [@Dbroqua](https://github.com/Dbroqua)) -- Reorder operations of native view hierarchy ([5f027ec64d](https://github.com/facebook/react-native/commit/5f027ec64d6764fbbb9813fabb373194dec79db7) by [@lunaleaps](https://github.com/lunaleaps)) -- Fix performance regression from new custom fonts implementation ([fd6386a07e](https://github.com/facebook/react-native/commit/fd6386a07eb75a8ec16b1384a3e5827dea520b64) by [@dulmandakh](https://github.com/dulmandakh)) -- Fix internal test case around disabled state of buttons ([70e2ab2ec9](https://github.com/facebook/react-native/commit/70e2ab2ec9a1df60b39987946af18cac8621b3b0)) -- Fix extra call of **PickerAndroid**'s `onValueChange` on initialization; now it is only called when `selectedValue` changes ([82148da667](https://github.com/facebook/react-native/commit/82148da6672e613f34ffb48133cdefc235418dea) by [@a-c-sreedhar-reddy](https://github.com/a-c-sreedhar-reddy)) -- Fix **PickerAndroid** will reset selected value during items update ([310cc38a5a](https://github.com/facebook/react-native/commit/310cc38a5acb79ba0f1cda22913bd1d0cb296034) by [@Kudo](https://github.com/Kudo)) -- Fix unexpected PARTIAL_WAKE_LOCK when no headless tasks registered. ([bdb1d4377e](https://github.com/facebook/react-native/commit/bdb1d4377e47c6cd49ff619134d4860519a3cb0c) by [@timwangdev](https://github.com/timwangdev)) -- Fix calling **TextInput**'s `onKeyPress` method when the user types an emoji ([a5c57b4ed4](https://github.com/facebook/react-native/commit/a5c57b4ed4965ac4bb231399fd145da8095cece3)) -- Fix value of **TextInput**'s `onSelectionChange` start and end arguments by normalizing them ([2ad3bb2e2d](https://github.com/facebook/react-native/commit/2ad3bb2e2d62ffb780bab020f645626a16dd3b4a) by [@uqmessias](https://github.com/uqmessias)) -- In `Linking.getInitialURL` method, use the `InteractionManager` to wait for the current activity to finish initializing ([c802d0b757](https://github.com/facebook/react-native/commit/c802d0b757912358d703d4d8a114073377a905b9) by [@mu29](https://github.com/mu29)) -- Disable delta bundles on the first app run ([e4aff423ac](https://github.com/facebook/react-native/commit/e4aff423ac0421f4af7b9a111e5ad954f489da19) by [@wojteg1337](https://github.com/wojteg1337)) -- In **DatePickerAndroid**, work around Android Nougat bug displaying the wrong the spinner mode ([bb060d6cf8](https://github.com/facebook/react-native/commit/bb060d6cf89500778bba27d1da5925e2623c7a99) by [@luancurti](https://github.com/luancurti)) -- Fix crash in Animated Interpolation when inputMin === inputMax ([7abfd23b90](https://github.com/facebook/react-native/commit/7abfd23b90db08b426c3c91b0cb6d01d161a9b9e) by [@olegbl](https://github.com/olegbl)) -- Fix symbolication for **RedBox** and **YellowBox** when using delta bundling ([a05e9f8e09](https://github.com/facebook/react-native/commit/a05e9f8e094b25cc86ee297477cccafc3be5ef52) by [@motiz88](https://github.com/motiz88)) -- Fix **CameraRoll** crash on mime type guessing ([ebeb893b50](https://github.com/facebook/react-native/commit/ebeb893b50b4aa1ad77bdb203e4f8faed75db43a) by [@Sroka](https://github.com/Sroka)) - -#### iOS specific - -- Call designated initializer for SurfaceHostingProxyRootView ([3c125e867f](https://github.com/facebook/react-native/commit/3c125e867f52efd7f18b2bd8c9a21b246afcd788) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix **RedBox** JS symbolication when adding JS engine tag to the message ([920632cadb](https://github.com/facebook/react-native/commit/920632cadb108ceeacad93e9316e706608df2942) by [@motiz88](https://github.com/motiz88)) -- Fix **TextInput**'s `onSelectionChange` behavior in single line text inputs ([0c11d8d9b4](https://github.com/facebook/react-native/commit/0c11d8d9b4edf7830255f5b016d0ba7ef72ae827) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix accessibility problem with **TextInput** Clear Button ([4e37d37cbf](https://github.com/facebook/react-native/commit/4e37d37cbff27e61659440094a662e00eafd8fc4) by [@shergin](https://github.com/shergin)) -- Fix `renderingMode` not applied to GIF **Image**s ([75380aa329](https://github.com/facebook/react-native/commit/75380aa3296210777dc0be70a722701767276117) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix **ScrollView** `centerContent` not work in some cases ([2cdf9694b5](https://github.com/facebook/react-native/commit/2cdf9694b56e76477dde572eb3dc38be31361eab) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix crash on performance logger ([5d3d3987d8](https://github.com/facebook/react-native/commit/5d3d3987d8a81b84d43dc88808d7f50c7bf11d19) by [@zhigang1992](https://github.com/zhigang1992)) -- Do not run packager in Release mode ([4ea6204111](https://github.com/facebook/react-native/commit/4ea62041118fb031d7540726df2d29185c6b130d) by [@lucasbento](https://github.com/lucasbento)) -- Fix `code` and `reason` arguments being ignored when calling `WebSocket.close` ([0ac2171c54](https://github.com/facebook/react-native/commit/0ac2171c549b389228c4a37ae645eb0d9813b82d) by [@jeanregisser](https://github.com/jeanregisser)) -- Fix return value of `Linking.openURL()` ([4a5d0bdbd7](https://github.com/facebook/react-native/commit/4a5d0bdbd75c433d2f51f160657a0ad91e440272) by [@thib92](https://github.com/thib92)) -- When an accessibilityLabel can't be discerned, return `nil` instead of `@""` ([d4ff5ed258](https://github.com/facebook/react-native/commit/d4ff5ed258b75fe77c5d801af7b097b04fcd3690) by [@sammy-SC](https://github.com/sammy-SC)) -- Fix Xcode build when the project's path contains whitespace ([f0770b6b37](https://github.com/facebook/react-native/commit/f0770b6b370f483fdd729bdba04069cc783353dc)) -- Move accessibility props to UIView+React ([9261035c2b](https://github.com/facebook/react-native/commit/9261035c2bf2fe9522806fb1c535a1835e7acfa2) by [@janicduplessis](https://github.com/janicduplessis)) - -## v0.59.10 - -This is likely the last patch release for version 59 of React Native for the foreseeable future: it contains an important Android side update for the JavaScript Core, to prevent a great number of crashes mostly related to Samsung devices - thanks to [@Kudo](https://github.com/Kudo) for his work on fixing this via [557989a86f](https://github.com/facebook/react-native/commit/557989a86f8730113393ed229927d607a478e524)! - -Thanks everyone who participated in the [discussion](https://github.com/react-native-community/releases/issues/127). - -## v0.59.9 - -This is a patch fix release addressing a couple ScrollView regressions, and "future-proof" RN 59 from crashes caused by upgrading Gradle (now can support up to 5.4.1 & 3.4.0 for the plugin) and Xcode 11 Beta 1. You can upgrade to this version without upgrading your tooling. - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/124) for cherry-picking commits. You can participate to the conversation for the next patch release in the dedicated [issue](https://github.com/react-native-community/react-native-releases/issues/127). - -### Changed - -- If `isInteraction` is not specified in the config, it would always default to `true` which would block interactions like VirtualizedList updates. This is generally not what you want with useNativeDriver since the animation won't be interrupted by JS. If something does end up interfering with an animation and causes frame drops, `isInteraction` can be set manually. ([8f186b84ae](https://github.com/facebook/react-native/commit/8f186b84aeeb2613bf6ae08f20a8547d40179007) by [@sahrens](https://github.com/sahrens)) - -- Update detox to match master ([c6a5c09e2b](https://github.com/facebook/react-native/commit/c6a5c09e2b330891242af5c0b3ed7875f32c189e) by [@kelset](https://github.com/kelset)) - -#### Android specific - -- Bump Gradle to 5.4.1 & Android Gradle plugin to 3.4.0 ([b4017a9923](https://github.com/facebook/react-native/commit/b4017a9923b09fed4b693a8e4cfadd30ce34c88d), [d9f5a9dc16](https://github.com/facebook/react-native/commit/d9f5a9dc16f68cecc995bf8ba64fb726e397fadf), [30348f7899](https://github.com/facebook/react-native/commit/30348f789946dc99f5ccd02c85c8decbdb9ac29b), [6976a93126](https://github.com/facebook/react-native/commit/6976a931266126f249458a099bfaf509f9d81a05) by [@dulmandakh](https://github.com/dulmandakh)) - -### Fixed - -- Fixes wrong time unit of scroll event throttle ([1148c03f6f](https://github.com/facebook/react-native/commit/1148c03f6f51329710e23fba99a6916fff3ba42c) by [@zhongwuzw](https://github.com/zhongwuzw)) - -#### Android specific - -- Fix indexed RAM bundle ([d8fa1206c3](https://github.com/facebook/react-native/commit/d8fa1206c3fecd494b0f6abb63c66488e6ced5e0) by [@dratwas](https://github.com/dratwas)) - -#### iOS specific - -- Fix Xcode 11 Beta 1 builds ([46c7ada535](https://github.com/facebook/react-native/commit/46c7ada535f8d87f325ccbd96c24993dd522165d) by [@ericlewis](https://github.com/ericlewis)) - -## v0.59.8 - -This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points (in particular, check the `KeyboardAvoidingView` change). Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/118) for cherry-picking commits. - -### Fixed - -- Fix regexp on `hasteImpl` ([bcd1e2](https://github.com/facebook/react-native/commit/28e0de070d2dae9a486ab5915b6fd76723bd84ef) by [@CaptainNic](https://github.com/CaptainNic)) -- Fix sparse array handling in `EventEmitter#listeners()` ([f68dc8](https://github.com/facebook/react-native/commit/f68dc8) by [@ide](https://github.com/ide)) -- Fix **VirtualizedList** to call `_updateViewableItems` immediately ([08141e](https://github.com/facebook/react-native/commit/efe6a0f0b56191907e8f13be2aee28fe1dcdf555) by [@sahrens](https://github.com/sahrens)) -- Fix prop overrides of **TouchableWithoutFeedback** ([0c4206](https://github.com/facebook/react-native/commit/68825f9ca5a6c8c70390e8499d9663c5be475639) by [@aleclarson](https://github.com/aleclarson)) -- Fix resolve relative size rendering error in inspector ([4884ab](https://github.com/facebook/react-native/commit/972ee2edbd4e1c4201da1606bf5a4c5add9f0083) by [@gandreadis](https://github.com/gandreadis)) -- Fix **VirtualizedSectionList** by making sure to check array bounds ([54f91d](https://github.com/facebook/react-native/commit/929908f28728c217ab4a16c8596e0957295f4d67) by [@vonovak](https://github.com/vonovak)) -- Update `_scrollAnimatedValue` offset of **ScrollView** ([e0d1b3](https://github.com/facebook/react-native/commit/58c956768af75047b2acdca429a28945a6a8b8c0) by [@miyabi](https://github.com/miyabi)) -- Fix infinite `setState` in **VirtualizedList** ([c40a93](https://github.com/facebook/react-native/commit/88787b5e7a7f6dd9c3b258b9dfb60b93ca5a5cea) by [@sahrens](https://github.com/sahrens)) - -#### iOS specific - -- Fix incorrect opacity behavior for **Text** component ([f71357](https://github.com/facebook/react-native/commit/d99e657e3909ff14cd623d1df7d3d13056fdd851) by [@shergin](https://github.com/shergin)) -- Fix **Text** shadow displays when `text Offset` is `{0,0}` ([17a81b](https://github.com/facebook/react-native/commit/9b63b50ad562c8567336898c7511a9a5198a4d6b) by [@Woodpav](https://github.com/Woodpav)) -- Add convert compatible of **NSString** for bridge message data ([c37e9c](https://github.com/facebook/react-native/commit/ffa3b0d4d601fe6788319a7cfd4185b8e4bf462f) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix nullability warnings in **RCTExceptionsManager** ([2b7d79](https://github.com/facebook/react-native/commit/31850df116fdd1595dddcd7b37a21568e679ffa7) by [@jtreanor](https://github.com/jtreanor)) -- Fix app to reconnect with metro after the bundler is closed and reopened ([c28676](https://github.com/facebook/react-native/commit/62bac80f90cf5a4ab216488b4ede441f0e3f86ba) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Fix throttle below 16ms on **ScrollView** ([39776a](https://github.com/facebook/react-native/commit/c87de765f6a9ebf656c188fa2115a1ba01b7939c) by [@sahrens](https://github.com/sahrens)) - -#### Android specific - -- Fix JS errors during bundle load were reported as `UnknownCppException` ([84e263](https://github.com/facebook/react-native/commit/6f6696fa63dc5f7029cb121c7e0ee98f8d271602)) -- Add logic to catch `MissingWebViewPackageException` ([379874](https://github.com/facebook/react-native/commit/954f715b25d3c47c35b5a23ae23770a93bc58cee) by [@thorbenprimke](https://github.com/thorbenprimke)) -- Revert "[improve RTL](https://github.com/facebook/react-native/commit/b3c74967ca6b20d7bda84c690ae3a99dfe255843)" ([f3801d](https://github.com/facebook/react-native/commit/8d3e16831a93079fc5a855a7b0f8b4be508c6942) by [@thorbenprimke](https://github.com/thorbenprimke)) - -### Added - -- Add listener for non-value animated node ([4a82dc](https://github.com/facebook/react-native/commit/68a5ceef312c7e3ac74d616b960c1cfde46a109d) by [@osdnk](https://github.com/osdnk)) -- Set **ScrollView** throttle by default ([74d740](https://github.com/facebook/react-native/commit/b8c8562ffb424831cc34a18aeb25e5fec0954dd0) by [@sahrens](https://github.com/sahrens)) - -### Changed - -- Make **KeyboardAvoidingView** with `behavior="height"` resize on keyboard close ([7140a7](https://github.com/facebook/react-native/commit/3711ea69375ea420800bac97914aa0d24fc9b1a6) by [@WaldoJeffers](https://github.com/WaldoJeffers)) -- Update network inspector to have smarter scroll stickiness ([57dc37](https://github.com/facebook/react-native/commit/c06473ab464e07edbb4715f58cd13674273bb29b) by [@AlanFoster](https://github.com/AlanFoster)) - -## v0.59.7 - -This patch release was unpublished. - -## v0.59.6 - -This patch release was unpublished. - -## v0.59.5 - -This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/113) for cherry-picking commits. - -### Fixed - -- Remove wrapper around **ListEmptyComponent** ([54af5b](https://github.com/facebook/react-native/commit/46276444508581bac7b9f27edd56ec0c8ec450bc) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky)) - -#### Android specific - -- Enforced thread safety on UIImplementation methods that mutate the shadowNodeRegistry ([f5a318](https://github.com/facebook/react-native/commit/f5a31801a03b61df3d7bc2fc86df7bad272082e2) by [@SudoPlz](https://github.com/sunnylqm)) -- Fixed a `NoSuchKeyException` when parsing JS stack frames without line numbers ([d7bd6c](https://github.com/facebook/react-native/commit/c953e0b4319da0976ece877c09b648a55bc57d9f) by [@Salakar](https://github.com/Salakar)) -- Fixed `mostRecentEventCount` is not updated ([b8aac0](https://github.com/facebook/react-native/commit/60c0a60c508346f7639d32fde0376fabded9f3f0) by [@jainkuniya](https://github.com/jainkuniya)) - -#### iOS specific - -- Pass back correct dimensions for application window in Dimensions module ([72b4cc](https://github.com/facebook/react-native/commit/33b55ccccad56e0b97af294749d728b67b03e658) by [@rdonnelly](https://github.com/rdonnelly)) -- Fixed warning: "RCTImagePickerManager requires main queue setup" ([effb02](https://github.com/facebook/react-native/commit/6508b88cfdccdb2da6bfde05faac4647436ce4e7) by [@scarlac](https://github.com/scarlac)) - -## v0.59.4 - -This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/100) for cherry-picking commits. - -### Changed - -- Make Jest transform @react-native-community packages by default ([7e23c7c565](https://github.com/facebook/react-native/commit/7e23c7c5654818fa076eeb627b709d39130f57f6) by [@thymikee](https://github.com/thymikee)) - -#### iOS specific - -- Add `scrollToOverflowEnabled` prop to **ScrollView** ([6f4239b37c](https://github.com/facebook/react-native/commit/6f4239b37c3059d6cb1fdaf2dcd3b6c962dde471) by [@mysport12](https://github.com/mysport12)) - -### Fixed - -- Fix **Touchable** long-press ([59e50237bf](https://github.com/facebook/react-native/commit/59e50237bff9521d2b78d7576abf4e23d844ac1b) by [@Kida007](https://github.com/Kida007)) - -#### Android specific - -- Fix a crash when setting `underlineColorAndroid` in **TextInput** ([556aa93ed7](https://github.com/facebook/react-native/commit/556aa93ed72d9dc0f18a1c6d7dec3d9c182fee85) by [@sunnylqm](https://github.com/sunnylqm)) - -#### iOS specific - -- Fix universal links not working in iOS 12 / Xcode 10 ([56679ed359](https://github.com/facebook/react-native/commit/56679ed359834c2177c8837d744cc7bf2ceb6b0a) by [@IljaDaderko](https://github.com/IljaDaderko)) -- Fix triangle views ([7a6fe0cda0](https://github.com/facebook/react-native/commit/7a6fe0cda0a1089c1c82fdd5f7f2db940f70feae) by [@zhongwuzw](https://github.com/zhongwuzw)) - -## v0.59.3 - -This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/100) for cherry-picking commits. - -### Changed - -#### Android specific - -- Improve RTL support ([b3c74967ca](https://github.com/facebook/react-native/commit/b3c74967ca6b20d7bda84c690ae3a99dfe255843) by [@dulmandakh](https://github.com/dulmandakh)) - -### Fixed - -- Fix **VirtualizedList**, **SectionList** and **FlatList** behavior on rendering list headers with inverted prop and zero items ([c13f5d48cf](https://github.com/facebook/react-native/commit/c13f5d48cfe3e7c0f6c6d0b745b50a089d6993ef) by [@michalchudziak](https://github.com/michalchudziak)) -- Fix **VirtualizedList** debug mode crash ([02e8e531dd](https://github.com/facebook/react-native/commit/02e8e531ddfd86e9abf7ef47fbf30445afeb37cf)) -- Fix running Metro on Windows ([43d3313788](https://github.com/facebook/react-native/commit/43d3313788a5f0a36abdbfadc000b06b2188fc06) and [9db347fabc](https://github.com/facebook/react-native/commit/9db347fabca19c66f669faf4054c81cc3624be03) by [@aliazizi](https://github.com/aliazizi) and [@nazreinkaram](https://github.com/nazreinkaram)) - -#### Android specific - -- Fix IllegalStateException when invalid URL or headers are passed ([aad4dbbbfe](https://github.com/facebook/react-native/commit/aad4dbbbfe937d1924e5359556979ab067198a58) by [@dryganets](https://github.com/dryganets)) -- Fix IllegalStateException when tapping next on Android Keyboard ([b943db418f](https://github.com/facebook/react-native/commit/b943db418f4f0b9d0865642aaca3e1a2f1529663) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific - -- Show Perf Monitor after reloading JS ([15619c22e5](https://github.com/facebook/react-native/commit/15619c22e57f73dfbed7bbe5fd6d9b3d2a8c9225) by [@usrbowe](https://github.com/usrbowe)) -- Fix **TextInput**'s `maxLength` when inserting characters at begin ([17415938c7](https://github.com/facebook/react-native/commit/17415938c7180a95811db949122b8ad24a442866) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix runtime crash in Xcode 10.2 when using `RCT_EXTERN_MODULE` for swift classes ([ff66600224](https://github.com/facebook/react-native/commit/ff66600224e78fec5d0e902f8a035b78ed31a961)) - -## v0.59.2 - -This is a patch fix release addressing regressions, crashes, and a few developer-experience pain points. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/100) for cherry-picking commits. - -### Fixed - -#### Android specific - -- Crash on pre-26 Android devices when setting **TextInput** content type ([d4aa1e7a52](https://github.com/facebook/react-native/commit/d4aa1e7a52b51fa5d7fc9ded132b7b50170f2190) by [@hramos](https://github.com/hramos)) -- Crash when scroll to index 0 in a **SectionList** ([8fa116cc0e](https://github.com/facebook/react-native/commit/8fa116cc0e1cadbb6cf0734cfde0e0b8060f6b59) by [@danilobuerger](https://github.com/danilobuerger)) -- **Switch**'s `trackColor` being reset when toggled ([7652e31d8c](https://github.com/facebook/react-native/commit/7652e31d8c233c1c831f6597c8a2f7ce3d9c0b6e) and [d6ee448e15](https://github.com/facebook/react-native/commit/d6ee448e15a25a7485482a4702aadb2e396445c7) by [@dulmandakh](https://github.com/dulmandakh) and [@ejanzer](https://github.com/ejanzer)) - -#### iOS specific - -- **ScrollView** offset out of content size ([9c1c5a7455](https://github.com/facebook/react-native/commit/9c1c5a7455d90ec837a9a6141c096de70b798e43) by [@zhongwuzw](https://github.com/zhongwuzw)) -- **RefreshControl** state's race condition ([95d399bc82](https://github.com/facebook/react-native/commit/95d399bc825c5471e08b83eff4b1b1b510e384a0) by [@rostislav-simonik](https://github.com/rostislav-simonik)) -- Start Metro packager from project root ([fe3aebf87b](https://github.com/facebook/react-native/commit/fe3aebf87b4123f8b16cdfcb9e2e774e6e0bf0b6) by [@MatthieuLemoine](https://github.com/MatthieuLemoine)) -- **TextInput**s that are single-line reverting to default text ([e38be82dfa](https://github.com/facebook/react-native/commit/e38be82dfa8b49385b990629318f027de26500cf) by [@PeteTheHeat](https://github.com/PeteTheHeat)) - -### Changed - -#### Android specific - -- Add TLS 1.3 support to all Android versions using Conscrypt; to use this, you must add `implementation('org.conscrypt:conscrypt-android:2.0.0')` to `build.gradle` ([75af15ede4](https://github.com/facebook/react-native/commit/75af15ede44135110e40de75a649d5b15430c590) by [@dulmandakh](https://github.com/dulmandakh)) -- Turn off Metro JS Deltas by default for Android ([845189c17d](https://github.com/facebook/react-native/commit/845189c17de621cc5aa373503220c1c12f649c3c) by [@PeteTheHeat](https://github.com/PeteTheHeat)) - -## v0.59.1 - -This is a small patch release that addresses two critical issues from the 0.59.0 release. - -### Fixed - -#### Android specific - -- Template build gradle error on x86_64 ([4b996da470](https://github.com/facebook/react-native/commit/4b996da470b43f97fd0426b54bda739d7717fb28) by [@grabbou](https://github.com/grabbou)) - -#### iOS specific - -- Build error warning of **Text** module ([d834197746](https://github.com/facebook/react-native/commit/d834197746371b203bd7d7aaabdc2bc581acc867) by [@zhongwuzw](https://github.com/zhongwuzw)) - -## v0.59.0 - -Welcome to release 0.59 of React Native! For highlights of this release, please view the dedicated [blog post](https://reactnative.dev/blog/2019/03/12/releasing-react-native-059). Thanks to those who gave feedback during the [release candidate phase](https://github.com/react-native-community/react-native-releases/issues/79). If you're interested in helping evaluate our next release (0.60), subscribe to the dedicated issue [here](https://github.com/react-native-community/react-native-releases/issues/99). - -### Added - -- Add a Metro configuration to the template with inline require/import options; read more about it [in the blog post](https://reactnative.dev/blog/2019/03/12/releasing-react-native-059) ([ae11993d0f](https://github.com/facebook/react-native/commit/ae11993d0f6c6de661867b5d032d844e91c83c6f) by [@cpojer](https://github.com/cpojer)) - -#### Android specific - -- **Text** and **TextInput** now has prop [maxFontSizeMultiplier](https://reactnative.dev/docs/text#maxfontsizemultiplier) ([4936d284df](https://github.com/facebook/react-native/commit/4936d284df36071047ce776d9e2486c0371f7b97) by [@rigdern](https://github.com/rigdern)) -- **TextInput** now has prop [autoComplete](https://reactnative.dev/docs/textinput#autocomplete) prop ([f15145639d](https://github.com/facebook/react-native/commit/f15145639dab1e8d7a1c79a127b7d45c91d025a8)) -- **CameraRoll**'s `getPhotos` now supports `assetType: "All"` to let users pick from video and photos simultaneously ([54534e79d7](https://github.com/facebook/react-native/commit/54534e79d724ff57572efc43f65100067f35d4c1) by [@kesha-antonov](https://github.com/kesha-antonov)) -- **Text** and **TextInput** now support `textAlign:justify` for android O+ (api level >=26) ([d2153fc58d](https://github.com/facebook/react-native/commit/d2153fc58d825006076a3fce12e0f7eb84479132) by [sunnylqm](https://github.com/sunnylqm)) - -#### iOS specific - -- **TextInput** now has prop `rejectResponderTermination` to enable TextInputs inside Swipeables to function properly ([11df0eae5f](https://github.com/facebook/react-native/commit/11df0eae5ff8f530bfaf56aaf2209ff48f3ed9ac) by [@cmcewen](https://github.com/cmcewen)) -- **ActionSheetIOS** has a new prop `destructiveButtonIndexes` for an `Array` of destructive indexes ([67e7f16944](https://github.com/facebook/react-native/commit/67e7f16944530aa0d1a4d375b0de5efd5c432865) by [@sdg9](https://github.com/sdg9)) -- Add `isEventFromThisApp` to `KeyboardEvent` notifications to disambiguate keyboard events when apps are running side-by-side ([05f35c296d](https://github.com/facebook/react-native/commit/05f35c296d91d946acf4edd94106fbdd0dd69a29) by [@nossbigg](https://github.com/nossbigg)) -- Allow changing the project path in `react-native-xcode.sh` using env var `PROJECT_ROOT` ([9ccde378b6](https://github.com/facebook/react-native/commit/9ccde378b6e6379df61f9d968be6346ca6be7ead) by [@janicduplessis](https://github.com/janicduplessis)) - -### Changed - -- `React` is now at `v16.8.3` ([ccefc700d0](https://github.com/facebook/react-native/commit/ccefc700d0120539eba73747d1d6b65effb0645d) and ([2af13b4477](https://github.com/facebook/react-native/commit/2af13b4477342d3498ab302ceb5297fcbc17e097) by [@cpojer](https://github.com/cpojer) and [@hramos](https://github.com/hramos)) -- `Flow` dependency is now at `v0.92.0` ([5ee738659b](https://github.com/facebook/react-native/commit/5ee738659b4ac7b0e73b9dba09a63091d4571ed9) by [@pakoito](https://github.com/pakoito)) -- `@react-native-community/cli` dependency is at `v1.2.1` ([a252aee2ea](https://github.com/facebook/react-native/commit/a252aee2eabd9eeffb279b9fcf1827093ef4039c) and [5e1504b0fc](https://github.com/facebook/react-native/commit/5e1504b0fca99cad3bfe2339ac0e7862b2315f9c) by [@grabbou](https://github.com/grabbou)) -- Enhance Flow types definitions for **ViewPropTypes** ([7ff9456f2e](https://github.com/facebook/react-native/commit/7ff9456f2e5fd72286f5be52598988707eaef69c) by [@danibonilha](https://github.com/danibonilha)) - -#### Android specific - -- Clarify error message to direct people to `react-native start` rather than `react-native bundle` ([46aaa02274](https://github.com/facebook/react-native/commit/46aaa02274a51ebe2aaa9fca2422dcebf9323475) by [@sunnylqm](https://github.com/sunnylqm)) -- **BREAKING** - removed `OkHttpClientProvider.replaceOkHttpClient` method; please use `OkHttpClientProvider.setOkHttpClientFactory` from 0.54+ ([7cbdd7b6ac](https://github.com/facebook/react-native/commit/7cbdd7b6ac7db2192f7d0193d22326041517a63e) by [@cdlewis](https://github.com/cdlewis)) -- **BREAKING** - remove `ViewHelper`, use `ViewCompat` instead; this may also require changing the `android:theme` to be from `Theme.AppCompat`; read more about it [in the blog post](https://reactnative.dev/blog/2019/03/12/releasing-react-native-059) ([c493cfe708](https://github.com/facebook/react-native/commit/c493cfe7083a6b97b6ec9eb9cb59cf1fdec45458) by [@dulmandakh](https://github.com/dulmandakh)) -- Add nullable annotations to `ReadableMap`, `WritableMap`, `ReadableArray`, `Writable`, `ReactPackage`, and native module interfaces; this may impact Kotlin usage ([b640b6faf7](https://github.com/facebook/react-native/commit/b640b6faf77f7af955e64bd03ae630ce2fb09627), [c93cbdf1b2](https://github.com/facebook/react-native/commit/c93cbdf1b272cfd60124d9ddb4c52b58ca59d319), [7b33d6b0b9](https://github.com/facebook/react-native/commit/7b33d6b0b96578a548e9a7f973eb59ac9236697b), and [84f40da990](https://github.com/facebook/react-native/commit/84f40da990dfd21eb1c21e20f2be0f8b2c5a78e4) by [@dulmandakh](https://github.com/dulmandakh)) -- `Soloader` is now at `v0.6.0` ([07d1075f37](https://github.com/facebook/react-native/commit/07d1075f372bb864ddc62b9c8f613b03becfa568) by [@dulmandakh](https://github.com/dulmandakh)) -- Android Support Library is now at `v28.0.0` ([5bbed43854](https://github.com/facebook/react-native/commit/5bbed43854957a37c4b51f49f30669665a72e7f7) by [@dulmandakh](https://github.com/dulmandakh)) -- `targetSdkVersion` is now at `v28` ([57f444bd8a](https://github.com/facebook/react-native/commit/57f444bd8a175038c367fa1b7d93e2e8ba9de7ed) by [@dulmandakh](https://github.com/dulmandakh)) -- Android Plugin is now at `v3.3.1` ([da5b5d2fa1](https://github.com/facebook/react-native/commit/da5b5d2fa134aa09dda4a620be9fa4d3d419201f) by [@dulmandakh](https://github.com/dulmandakh)) -- Enable Java 8 support ([38eb2a70af](https://github.com/facebook/react-native/commit/38eb2a70afa87c49c1e62754f5ae3cd26e7f59c3) by [@dulmandakh](https://github.com/dulmandakh)) -- Suppress misleading missing permission warnings ([d53dbb0dfb](https://github.com/facebook/react-native/commit/d53dbb0dfb99bdee5cd7eeaaa6f4ae51dcca00c5) by [@dulmandakh](https://github.com/dulmandakh)) -- Add back `buildToolsVersion` to build.gradle ([cf52ab561d](https://github.com/facebook/react-native/commit/cf52ab561d9fa0e4d14de7a8f3324cbc2b25bf92) by [@dulmandakh](https://github.com/dulmandakh)) -- **TimePickerAndroid** has better Flow types definitions ([2ed1bb2e01](https://github.com/facebook/react-native/commit/2ed1bb2e01ab7360d9bf13e4f9e13cb9c9c9d32e) by [@yushimatenjin](https://github.com/yushimatenjin)) -- `ReactActivity`, `ReactSlider`, `ReactTextView`, and `ReactPicker` extends `AppCompatActivity`; updates to `TimePickerDialogModule` and `DatePickerDialogModule` as well ([dda2b82a0a](https://github.com/facebook/react-native/commit/dda2b82a0a49da52b43b50db5a2bda50a216c09b), [3b9604feda](https://github.com/facebook/react-native/commit/3b9604feda8f9e8fe3dd884912ec7d9be67d7f1d), [ba0c3ffd5b](https://github.com/facebook/react-native/commit/ba0c3ffd5b46963a8bb27b40eb396965535cd927), [833429dd63](https://github.com/facebook/react-native/commit/833429dd633b33fff71224a7ce663b60681a7f81), [adc1410572](https://github.com/facebook/react-native/commit/adc14105727f708c990b7a744a0ea270ff0fba13), [c6c5a173bc](https://github.com/facebook/react-native/commit/c6c5a173bce3d8c847931d26eddb295956285438), and [be361d0fc1](https://github.com/facebook/react-native/commit/be361d0fc1930b1679c4226e15c1a5b416b94105) by [@dulmandakh](https://github.com/dulmandakh)) -- Fix lint error/warnings that cause older Android crashes ([d2fc19f4aa](https://github.com/facebook/react-native/commit/d2fc19f4aa94888b7c3d3f4a5fb621bf96a1aff9) by [@dulmandakh](https://github.com/dulmandakh)) -- The error message on getting Android drawable folder suffix now gives more information ([a159a33c02](https://github.com/facebook/react-native/commit/a159a33c02e0c0d7aa245adfd540a066ec065362) by [@BrunoVillanova](https://github.com/BrunoVillanova)) -- `SYSTEM_ALERT_WINDOW` permissions available only in debug builds ([84a2fb0a4a](https://github.com/facebook/react-native/commit/84a2fb0a4a67cd9dc37cf4e5bab814f25181cfb7) by [@dulmandakh](https://github.com/dulmandakh)) -- Add talkback navigation support for links and header ([b9d3743cda](https://github.com/facebook/react-native/commit/b9d3743cda95d1f475dbec8f6d72935941519deb) by [@yangweigbh](https://github.com/yangweigbh)) -- **FlatList** has `removeClippedSubviews` default to `true` on Android ([1a499f43b2](https://github.com/facebook/react-native/commit/1a499f43b2d03cc27dd6c25c8f13a767862afba1) by [@fred2028](https://github.com/fred2028)) - -#### iOS specific - -- Moved iOS build cache directory from `~/.rncache` to `~/Library/Caches/com.facebook.ReactNativeBuild` ([1024dc251e](https://github.com/facebook/react-native/commit/1024dc251e1f4777052b7c41807ea314672bb13a) by [@sryze](https://github.com/sryze)) -- Keyboard API Event flow types have been improved ([7ee13cc84c](https://github.com/facebook/react-native/commit/7ee13cc84c342244d3aa9e485de0e759482287ea) by [@nossbigg](https://github.com/nossbigg)) -- Expose **AsyncLocalStorage** get/set methods to native code ([7b8235a95a](https://github.com/facebook/react-native/commit/7b8235a95ad9519e9735cc1555a8d3aa5bb7c0ee) by [@ejmartin504](https://github.com/ejmartin504)) -- Clear RCTBridge **launchOptions** when bridge is reloaded ([19d04a312b](https://github.com/facebook/react-native/commit/19d04a312bf4221cd26beff6d0da6dd296a28cd0) by [@venik](https://github.com/venik)) - -### Deprecated - -The following deprecations are part of our Lean Core initiative; read more about it [in the blog post](https://reactnative.dev/blog/2019/03/12/releasing-react-native-059). - -- Deprecated [MaskedViewIOS](https://reactnative.dev/docs/maskedviewios) as it has now been moved to [react-native-community/masked-view](https://github.com/react-native-community/react-native-masked-view) ([4ac65f5413](https://github.com/facebook/react-native/commit/4ac65f5413ee59f7546b88a2eae2c4ce6fa8826b) by [@FonDorn](https://github.com/FonDorn)) -- Deprecated [ViewPagerAndroid](https://reactnative.dev/docs/viewpagerandroid) as it has now been moved to [react-native-community/viewpager](https://github.com/react-native-community/react-native-viewpager) ([77300ca91c](https://github.com/facebook/react-native/commit/77300ca91c17d371f6ba04230b8c2e8f5cd99ab8) by [@ferrannp](https://github.com/ferrannp)) -- Deprecated [AsyncStorage](https://reactnative.dev/docs/asyncstorage) as it has now been moved to [react-native-community/asyncstorage](https://github.com/react-native-community/react-native-async-storage) ([ffe37487b2](https://github.com/facebook/react-native/commit/ffe37487b228b77a3697c32767e91f1dd68041d8) by [@Krizzu](https://github.com/Krizzu)) -- Deprecated [Slider](https://reactnative.dev/docs/slider) as it has now been moved to [react-native-community/slider](https://github.com/react-native-community/react-native-slider) ([bf888a7582](https://github.com/facebook/react-native/commit/bf888a7582763a593d8b36874d242653fc0a9575) by [@michalchudziak](https://github.com/michalchudziak)) -- Deprecated [NetInfo](https://reactnative.dev/docs/netinfo) as it has now been moved to [react-native-community/netinfo](https://github.com/react-native-community/react-native-netinfo) ([d9c0dfe353](https://github.com/facebook/react-native/commit/d9c0dfe353eceb91efcec774bab0f65b6792e4fa) by [@matt-oakes](https://github.com/matt-oakes)) -- Deprecated [ImageStore](https://reactnative.dev/docs/imagestore) and directed users to `expo-file-system` and `react-native-fs` ([62599fa8ff](https://github.com/facebook/react-native/commit/62599fa8ff7f308259fe178fa37b7bcf3c1a408c) by [@EvanBacon](https://github.com/EvanBacon)) - -#### iOS specific - -- Replace deprecated `stringByReplacingPercentEscapesUsingEncoding:` with `stringByAddingPercentEncodingWithAllowedCharacters:` ([61ca119650](https://github.com/facebook/react-native/commit/61ca11965046f75e7500e5152c5f2b60df2a2cd5) by [@pvinis](https://github.com/pvinis)) - -### Removed - -- `react-native-git-upgrade` is now officially dead; use `react-native upgrade` instead (which uses [rn-diff-purge](https://github.com/react-native-community/rn-diff-purge) under the covers) ([a6bdacb257](https://github.com/facebook/react-native/commit/a6bdacb2575dcc3be2acec95d8a6db6e2db909c4) by [@cpojer](https://github.com/cpojer)) - -#### iOS specific - -- Remove the previously deprecated **TabBarIOS** ([02697291ff](https://github.com/facebook/react-native/commit/02697291ff41ddfac5b85d886e9cafa0261c8b98) by [@axe-fb](https://github.com/axe-fb)) -- **AlertIOS** is now replaced with **Alert** ([e2bd7db732](https://github.com/facebook/react-native/commit/e2bd7db732602b2c477fe040f2946bd8293df297) by [@wellmonge](https://github.com/wellmonge)) - -### Fixed - -- **KeyboardAvoidingView** now shows the correct height after the keyboard is toggled ([745484c892](https://github.com/facebook/react-native/commit/745484c892e40cfe15ded128f5a589edb28d8f6b) by [@shauns](https://github.com/shauns)) -- Adds fixes for react-native-windows UWP ([dfcbf9729f](https://github.com/facebook/react-native/commit/dfcbf9729fab64c4bd8c00e1d092ec4e9bae717f) by [@rozele](https://github.com/rozele)) -- The `Map` and `Set` polyfills no longer reject non-extensible object keys; also fix hash collision scenario ([90850cace9](https://github.com/facebook/react-native/commit/90850cace9991ed0a02605586ea5c32ce099de65) by [@benjamn](https://github.com/benjamn)) -- Corrected StyleSheet's transformation perspective to match iOS's behavior, regardless of screen density ([4c10f9321c](https://github.com/facebook/react-native/commit/4c10f9321c9d01dbcac4808e7e6674cba12f3aa5) by [@syaau](https://github.com/syaau)) -- Fix `yarn test` in new projects ([5218932b13](https://github.com/facebook/react-native/commit/5218932b13ad0649ff2a57aaf1ec682fe278c47d) by [@Esemesek](https://github.com/Esemesek)) -- Fix issue with `getInspectorDataForViewTag` that caused red screen when toggling inspector ([46f3285a3f](https://github.com/facebook/react-native/commit/46f3285a3f240f9325a548e677a1927402d76bd7) by [@TranLuongTuanAnh](https://github.com/TranLuongTuanAnh)) -- Fix `displayName` for `Image`; this will make tests no longer mistake it as `Component` ([4989123f8c](https://github.com/facebook/react-native/commit/4989123f8cab37c95b020e23b9a925746a3f3677) by [@linnett](https://github.com/linnett)) -- Fix regression of **VirtualizedList** jumpy header ([e4fd9babe0](https://github.com/facebook/react-native/commit/e4fd9babe03d82fcf39ba6a46376f746a8a3e960) by [@danilobuerger](https://github.com/danilobuerger)) -- Set `wait_for_recheck=true` to work around crash in Flow ([ffc9908bef](https://github.com/facebook/react-native/commit/ffc9908bef535ba1392c370ca4e9e4e528c3c4c5) by [@gabelevi](https://github.com/gabelevi)) -- Fix flow typing of **Text** ([10c8352141](https://github.com/facebook/react-native/commit/10c835214160cc5a5726c8dd9f0d42a0275d198b) by [@sahrens](https://github.com/sahrens)) -- Fix `jest` and `jest-junit` to be only development dependencies ([c7b57f1986](https://github.com/facebook/react-native/commit/c7b57f19869f31474c8ee17f7a1ac1551bab1b6e) by [@vovkasm](https://github.com/vovkasm)) -- Fix layout issue with **SwipeableQuickActionButton** ([ad52f52624](https://github.com/facebook/react-native/commit/ad52f526247af6eebadd2ea436b86ff7eb874f27) by [@varungupta85](https://github.com/varungupta85)) - -#### Android specific - -- Fix textTransform when used with other text styles on Android (#22670) ([3a33e75183](https://github.com/facebook/react-native/commit/3a33e75183bf196d61b46e662b4c3f84a5f570bd) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix warnings related to updating to gradle 4.10.1 or higher ([5be50d4820](https://github.com/facebook/react-native/commit/5be50d482082917351b46ee2e339e56e7e34e111) by [@misaku](https://github.com/misaku)) -- Fix issue with use of Android API 28 by adding security config for metro access ([5747094532](https://github.com/facebook/react-native/commit/5747094532bace3fe6b1ebdf55235e53189baa71), [19492b730b](https://github.com/facebook/react-native/commit/19492b730b6779486f83d5ddbaeeb870cb3d5e9c), [3b0b7ce8c3](https://github.com/facebook/react-native/commit/3b0b7ce8c3c3679610c14ca72beb1a9dcf84d930), and [84572c4051](https://github.com/facebook/react-native/commit/84572c4051f11f68ddf0928d2c3df5850ae15491) by [@Salakar](https://github.com/Salakar) and [@dulmandakh](https://github.com/dulmandakh)) -- Fix Inverted Horizontal **ScrollView** ([32cb9ec49c](https://github.com/facebook/react-native/commit/32cb9ec49c801fcebe61486149134ab542d9364b) by [@dmainas](https://github.com/dmainas)) -- Fix crash on **CheckBox** on older Android versions ([58437cd10a](https://github.com/facebook/react-native/commit/58437cd10a667bbcbc16781df855fd7c3d73bf49) by [@vonovak](https://github.com/vonovak)) -- Fix undefined error description in **Image** `onError` callback ([7795a672d3](https://github.com/facebook/react-native/commit/7795a672d3a24a5b50df6ad6d30555d856b557cc) by [@Jyrno42](https://github.com/Jyrno42)) -- Fix Android crash on animating with `useNativeDriver` ([e405e84fc3](https://github.com/facebook/react-native/commit/e405e84fc35923888442df748757787698040010) by [@scisci](https://github.com/scisci)) -- Fix dev settings menu not appearing for certain codebases due to namespace conflicts ([9968d0c203](https://github.com/facebook/react-native/commit/9968d0c2030c1065979db34cc9a244bd52b7b2a5) by [@khaled-cliqz](https://github.com/khaled-cliqz)) -- Fix exception occurring while fading a **TextView** ([f83281e2ce](https://github.com/facebook/react-native/commit/f83281e2ce2aece44b1207844d8a5149d5d2e78d) by [@mdvacca](https://github.com/mdvacca)) -- Fix **StatusBar** overwriting previously set `SystemUiVisibility` flags ([8afa0378cd](https://github.com/facebook/react-native/commit/8afa0378cd09b8fa6c30d759539fc9a680e8cae2) by [@rogerkerse](https://github.com/rogerkerse)) -- Prevent `fetch()` POST requests from appending `charset=utf-8` to `Content-Type` header ([4a807761a4](https://github.com/facebook/react-native/commit/4a807761a4aca9e551ff2cee8ca18a2450fb11ca) and [0d5aebbd9a](https://github.com/facebook/react-native/commit/0d5aebbd9ac92a90ec7ab1426ed92dd22ae8c736) by [@nhunzaker](https://github.com/nhunzaker)) -- Fix issue with **Location** that led to exceptions in two cases ([f32dc63546](https://github.com/facebook/react-native/commit/f32dc635467a2e93371f0cf2e40b07a712349288) by [@mikelambert](https://github.com/mikelambert)) - -#### iOS specific - -- Fix **TextInput** mistakenly capitalizing I's after emojiis ([f307ac7c5e](https://github.com/facebook/react-native/commit/f307ac7c5e3adb9b4c0f8b2e4b8cdc2f980c7733) by [@dchersey](https://github.com/dchersey)) -- Fix **TextView**'s `setAttributedText` for CJK languages on single-line text fields ([e38be82dfa](https://github.com/facebook/react-native/commit/e38be82dfa8b49385b990629318f027de26500cf) by [@mandrigin](https://github.com/mandrigin)) -- Fix RCTImageLoader multi thread crash ([5ed31ce524](https://github.com/facebook/react-native/commit/5ed31ce5240a7392afdc522120edef182e0014ed)) -- Fix removing keys of large values from **AsyncStorage** ([27b4d21564](https://github.com/facebook/react-native/commit/27b4d215641f9397ef415cbb2acfc1275e6110ac) by [@esprehn](https://github.com/esprehn)) -- Fix overscroll behavior on virtualized lists; behavior is now consistent ([4d5f85ed42](https://github.com/facebook/react-native/commit/4d5f85ed426cfb43dc5e63f915e416a47d76b965)) -- Fix **Alert** to not block input focus and blur ([e4364faa3c](https://github.com/facebook/react-native/commit/e4364faa3cab150b82272819fc92086fb4da297e) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix broken JSIexecutor search path ([2aa2401766](https://github.com/facebook/react-native/commit/2aa24017667721ba17a859ca4e13d43e52d86bc5) by [@amccarri](https://github.com/amccarri)) -- Fix potential linker issues when using Xcode project ([9f72e6a5d0](https://github.com/facebook/react-native/commit/9f72e6a5d02d84fe8ed545e0c0904199b9cb3c7a) by [@tyrone-sudeium](https://github.com/tyrone-sudeium)) -- Fix crash when `scrollEnabled` used in singleline textinput ([9ff43abe65](https://github.com/facebook/react-native/commit/9ff43abe653ac5af0e591b369228f0809caad204) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix crash in gif image usage ([d0cd3cae13](https://github.com/facebook/react-native/commit/d0cd3cae13a1b1fff8a2e378b5228d3cdccd695f) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix **geolocation** to not constantly reset accuracy to default of 100 meters ([bbcb97a29a](https://github.com/facebook/react-native/commit/bbcb97a29adc2a3a05728b47d28e28fa78d84df2) by [@omnikron](https://github.com/omnikron)) -- Fix iOS build issue related to missing `DoubleConversion` and `glog` to `cxxreact`, `jsi` and `jsiexecutor` subspecs in `React.podspec` file ([00392ac46b](https://github.com/facebook/react-native/commit/00392ac46b6319dcff2b6df2e5f7bb4ee094612f) by [@alexruperez](https://github.com/alexruperez)) -- Fix "'folly/folly-config.h' file not found" build error when using React via CocoaPods ([5560a47c1d](https://github.com/facebook/react-native/commit/5560a47c1dbc7daab1e4f4aac0667080fdea836a) by [@Salakar](https://github.com/Salakar)) -- Fix image cache to follow [MDN strategy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#Freshness) ([fb8ba3fe95](https://github.com/facebook/react-native/commit/fb8ba3fe959fd2a0c4ef0025fd84f6deffd9d03b) and [fb8ba3fe95](https://github.com/facebook/react-native/commit/fb8ba3fe959fd2a0c4ef0025fd84f6deffd9d03b) by [@zhongwuzw](https://github.com/zhongwuzw)) -- Fix crash due to IllegalArgumentException when creating CookieManage ([cda8171af3](https://github.com/facebook/react-native/commit/cda8171af30815edfa331e07d1bbf605f0926303) by [@mdvacca](https://github.com/mdvacca)) -- Fix cursor placement after toggling `secureTextEntry` cursor spacing ([8ce3c1b43e](https://github.com/facebook/react-native/commit/8ce3c1b43edd47191c8e5ee8432c58f6e93dfca7) by [@ericlewis](https://github.com/facebook/react-native/commits?author=ericlewis)) - -## v0.58.6 - -This release is fairly small, as we approach stable status for [0.59](https://github.com/react-native-community/react-native-releases/issues/79). - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/95) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/97). - -### Fixed - -#### Android specific - -- Fix Inverted Horizontal ScrollView on Android (#23233) ([32cb9ec49c](https://github.com/facebook/react-native/commit/32cb9ec49c801fcebe61486149134ab542d9364b) by [@dmainas](https://github.com/dmainas)) - -#### iOS specific - -- Map TextInput textContentType strings to Objective-C constants (#22611) ([a89fe4165c](https://github.com/facebook/react-native/commit/a89fe4165c2a331a9d88636d89a5a48151ab8660) by [@levibuzolic](https://github.com/levibuzolic)) -- Don't reconnect inspector if connection refused (#22625) ([d9489c4e9c](https://github.com/facebook/react-native/commit/d9489c4e9c646b79025f07635b840e9974be8cd5) by [@msand](https://github.com/msand)) - -## v0.58.5 - -This release resolves a few bugs and includes a few improvements, listed below. - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/86) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/95). - -### Removed - -- Remove fallback cache ([9d60c20cb3](https://github.com/facebook/react-native/commit/9d60c20cb35074e92a90b803d3d6f420f6671635) by [@grabbou](https://github.com/grabbou)) - -### Fixed - -- Fixes capitalized I's when emojis are present after the text being edited. (#21951) ([f307ac7c5e](https://github.com/facebook/react-native/commit/f307ac7c5e3adb9b4c0f8b2e4b8cdc2f980c7733) by [@dchersey](https://github.com/dchersey)) -- Fix broken jsiexecutor search path. (#23274) ([2aa2401766](https://github.com/facebook/react-native/commit/2aa24017667721ba17a859ca4e13d43e52d86bc5) by [@amccarri](https://github.com/amccarri)) -- Fix duplicate symbols linker error in xcodeproj (#23284) ([9f72e6a5d0](https://github.com/facebook/react-native/commit/9f72e6a5d02d84fe8ed545e0c0904199b9cb3c7a) by [@tyrone-sudeium](https://github.com/tyrone-sudeium)) -- apply Network Security Config file (fixes #22375) (part 2 of #23105) (#23135) ([84572c4051](https://github.com/facebook/react-native/commit/84572c4051f11f68ddf0928d2c3df5850ae15491) by [@Salakar](https://github.com/Salakar)) -- Fix crash for web socket in some race conditions (#22439) ([dd209bb789](https://github.com/facebook/react-native/commit/dd209bb7891ed5f05b96a9922c7b0e39bf3ac9e9) by [@zhongwuzw](https://github.com/zhongwuzw)) - -#### iOS specific - -- Don't attempt to load RCTDevLoadingView lazily ([a9dd828c68](https://github.com/facebook/react-native/commit/a9dd828c68338dbf0e55ffa1838bf8ff574f317d) by [@fkgozali](https://github.com/fkgozali)) - -### Security - -#### Android specific - -- improve Android Network Security config (#23429) ([5747094532](https://github.com/facebook/react-native/commit/5747094532bace3fe6b1ebdf55235e53189baa71) by [@dulmandakh](https://github.com/dulmandakh)) - -## v0.58.4 - -This release resolves a few bugs and includes a few improvements, listed below. - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/81) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/86). - -### Added - -#### Android specific - -- Add error description to Image onError callback ([7795a672d3](https://github.com/facebook/react-native/commit/7795a672d3a24a5b50df6ad6d30555d856b557cc) by [@Jyrno42](https://github.com/Jyrno42)) - -### Changed - -#### Android specific - -- bump soloader to `0.6.0` ([07d1075f37](https://github.com/facebook/react-native/commit/07d1075f372bb864ddc62b9c8f613b03becfa568) by [@dulmandakh](https://github.com/dulmandakh)) - -### Removed - -- Remove jest and jest-junit from runtime dependencies (#23276) ([c7b57f1986](https://github.com/facebook/react-native/commit/c7b57f19869f31474c8ee17f7a1ac1551bab1b6e) by [@vovkasm](https://github.com/vovkasm)) - -### Fixed - -#### Android specific - -- Fixes Android crash on animated style with string rotation ([e405e84fc3](https://github.com/facebook/react-native/commit/e405e84fc35923888442df748757787698040010) by [@scisci](https://github.com/scisci)) - -#### iOS specific - -- fix incorrect type which makes animated gifs not loop forever on device (#22987) ([728a35fcf2](https://github.com/facebook/react-native/commit/728a35fcf2a2b0d695a4d7083b266eda486b1392) by [@chrisnojima](https://github.com/chrisnojima)) -- Fixes for running the simulator ([9a8c9596eb](https://github.com/facebook/react-native/commit/9a8c9596ebe41e27d37ba18d6bf09f1c931c1ff2) by [@osunnarvik](https://github.com/osunnarvik)), ([98bcfe00fb](https://github.com/facebook/react-native/commit/98bcfe00fbca066d6914a2680c3647b678caccc5) by [@cpojer](https://github.com/cpojer)) and ([8bddcb6cb0](https://github.com/facebook/react-native/commit/8bddcb6cb0914373a0aeb927f12a6d48ffc5bb84) by [@cpojer](https://github.com/cpojer)) - -## v0.58.3 - -This release resolves a regression in **StatusBar** using [these fixes](https://github.com/facebook/react-native/compare/v0.58.2...v0.58.3). - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/81) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/81). - -## v0.58.2 - -This release fixes an issue caused by a wrongly reverted merge commit, that caused a short timeframe of commits to not actually be in the original 0.58.0. Those commits have been added to the 0.58 changelog below, as many are intertwined with the original work. - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/81) for cherry-picking commits - you can participate in the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/81). - -## v0.58.1 - -There were some regressions with developer tools that prevented `react-native run-ios` from working properly in 0.58.0; this patch fix addresses that. - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/81) for cherry-picking commits - you can participate to the decision process for the next patch release [here](https://github.com/react-native-community/react-native-releases/issues/81). - -## v0.58.0 - -Welcome to first stable release of React Native of 2019! -There are a number of significant changes in this version, and we'd like to especially draw your attention to them: - -- [Modernizing](https://github.com/facebook/react-native/issues/21581) and [strengthening flow types](https://github.com/facebook/react-native/issues/22100) for core components -- Breaking changes to `ScrollView`, `CameraRollView`, and `SwipeableRow` that make it no longer bound to the component instance in certain methods -- Support for mutual TLS in WebKit -- Asset serving from directories besides `/assets` -- Numerous crash fixes and resolutions for unexpected behavior - -Aside from those: - -- if you are an iOS developer, you'll need to manually link `JavaScriptCore.framework` when upgrading; this can be done via Xcode, and following the steps shown [here](https://camo.githubusercontent.com/c09cd42747364b498efa7c82fcb73978ba076eae/687474703a2f2f646f63732e6f6e656d6f62696c6573646b2e616f6c2e636f6d2f696f732d61642d73646b2f616464696e672d6672616d65776f726b732e706e67). - -- Android developers, please note that Android's target SDK 27 is supported. Work is still underway to land target SDK 28 support, and it will come soon. - -Thanks to those who gave feedback during the [release candidate phase](https://github.com/react-native-community/react-native-releases/issues/41). If you're interested in helping evaluate our next release (0.59), subscribe to the dedicated issue [here](https://github.com/react-native-community/react-native-releases/issues/79). - -### Added - -- Add support for `publicPath` to enable serving static assets from different locations ([0b314960aa](https://github.com/facebook/react-native/commit/0b314960aa34c71fc731bac9c1f2b48f3223c5cb) by [@gdborton](https://github.com/gdborton)) -- Add **TouchableBounce** now has a simple `bounce()` function that can be used to trigger a bounce without callbacks ([7fe3f90156](https://github.com/facebook/react-native/commit/7fe3f90156e879fe53665efb5a90ba3a711475fa)) - -#### Android specific - -- Bundler server host can now be set using Android System Properties, making for easier debugging across multiple apps or app installs `adb shell setprop metro.host` ([e02a154787](https://github.com/facebook/react-native/commit/e02a154787274be1da3632cb1412554cbd53928b) by [@stepanhruda](https://github.com/stepanhruda)) -- Native Modules can now reject a promise with an additional `WritableMap` arg for extra properties (`userInfo`). See the interface defined in [`Promise.java`](https://github.com/facebook/react-native/blob/60b3942/ReactAndroid/src/main/java/com/facebook/react/bridge/Promise.java) for available methods. This is accessible in JavaScript as `Error.userInfo`. This is to match iOS's existing `Error.userInfo` behavior. See PR for examples. (#20940 by @Salakar) -- Native Modules now expose a `nativeStackAndroid` property to promises rejected with an Exception/Throwable - making native error stacks available inside Javascript: `Error.nativeStackAndroid`. This is to match iOS's existing `Error.nativeStackIOS` support. See PR for examples. (#20940 by @Salakar) - -#### iOS specific - -- Add `moduleForName: lazilyLoadIfNecessary` to **RCTBridge.h** to lookup modules by name and force load them, plus various improvements to LazyLoading ([d7a0c44590](https://github.com/facebook/react-native/commit/d7a0c44590bcf3fb9d055aeae3391d5bcd7e21be), [6534718a18](https://github.com/facebook/react-native/commit/6534718a1898aa472e255d2aa9a0a6cae305619a), [d7865ebde8](https://github.com/facebook/react-native/commit/d7865ebde879983b355d6f6e64232e4bd264081d), [04ea9762e2](https://github.com/facebook/react-native/commit/04ea9762e2013dcebf9f8a51d8974fa799e41cd5), [1f394fa673](https://github.com/facebook/react-native/commit/1f394fa673a876753fdc9ac2cb86a4d4a58cd8cd), [80f92adf1f](https://github.com/facebook/react-native/commit/80f92adf1f35e74ee6db0b2f445cc851463059cf), and [81b74ec1ed](https://github.com/facebook/react-native/commit/81b74ec1ed3792c0b406c30b0a1c01219a2d6243) by [@dshahidehpour](https://github.com/dshahidehpour), [@fkgozali](https://github.com/fkgozali), and [@mmmulani](https://github.com/mmmulani)) -- Add ability for **WebView** to `setClientAuthenticationCredential` when `useWebKit={true}` for mutual TLS authentication ([8911353c47](https://github.com/facebook/react-native/commit/8911353c47af018f78c1cff59dfab05b975e39ed) and [8911353c47](https://github.com/facebook/react-native/commit/8911353c47af018f78c1cff59dfab05b975e39ed) by [@mjhu](https://github.com/mjhu)) - -### Changed - -- Major improvements to Flow types for Core Components ([499c195eba](https://github.com/facebook/react-native/commit/499c195ebab0f276e3a58baf1e6172c1ba046a9e), [fbc5a4f5e6](https://github.com/facebook/react-native/commit/fbc5a4f5e65e024c10ad43d84f2b2353c9e92461), [f9050e0908](https://github.com/facebook/react-native/commit/f9050e09084cf3700bfc1954f97adf0f60cd8d88), [6476151717](https://github.com/facebook/react-native/commit/6476151717f44d3a90679f0f5293bed62a4f420e), [c03fc4087f](https://github.com/facebook/react-native/commit/c03fc4087ff9ac3ccbd1ab2261a1af329b354d99), [69213eea95](https://github.com/facebook/react-native/commit/69213eea9512c81ed998d240a6f5a3be05346b48), [136dfc8312](https://github.com/facebook/react-native/commit/136dfc831230e5418db02d1202e60d23a95c17b6), [3c0211b61a](https://github.com/facebook/react-native/commit/3c0211b61a1e723c3aaeba42c61b60bc724a3729), [c127000a7d](https://github.com/facebook/react-native/commit/c127000a7d2bb54599c9d80503528c3e8d75fddc), [636e146c4a](https://github.com/facebook/react-native/commit/636e146c4a27990547c81c2d36411d36b2c8e788), [c3dea894bd](https://github.com/facebook/react-native/commit/c3dea894bdb07d0b7ec18ab0388626d0340e6b69), [35a65cd704](https://github.com/facebook/react-native/commit/35a65cd704f2da67cd759c4d91251f8d4964b251), [79274979b7](https://github.com/facebook/react-native/commit/79274979b775e89d5f54a557a34062f873134199), [45c51835d6](https://github.com/facebook/react-native/commit/45c51835d69e111b67b4fcf1af39a13f7df1ee48), [a97d104b44](https://github.com/facebook/react-native/commit/a97d104b44daa068fa3848cc6c3225356f9dc318), [fb4825a2c6](https://github.com/facebook/react-native/commit/fb4825a2c65fba3aa905f7defb7d0c125fff644d), [84c5416617](https://github.com/facebook/react-native/commit/84c541661729dd20ab260c7468e48abbbe82affb), [3649a503cf](https://github.com/facebook/react-native/commit/3649a503cf52feac0386b4a10aab5ef6c4ec5ca0) by [@mottox2](https://github.com/mottox2), [@saitoxu](https://github.com/saitoxu), [@RSNara](https://github.com/RSNara), [@watanabeyu](https://github.com/watanabeyu), [@Tnarita0000](https://github.com/Tnarita0000), [@exced](https://github.com/exced), [@nd-02110114](https://github.com/nd-02110114), [@flowkraD](https://github.com/flowkraD)) -- Many public components were converted to ES6 classes ([ScrollView](https://github.com/facebook/react-native/commit/010e3302b8101287f231254086f3a8788a5a2c3e) by [@thymikee](https://github.com/thymikee), [CameraRollView](https://github.com/facebook/react-native/pull/21619), [SwipeableRow](https://github.com/facebook/react-native/pull/21876/files) and [ProgressBarAndroid](https://github.com/facebook/react-native/pull/21874) by [@exceed](https://github.com/exceed), [ProgressViewIOS](https://github.com/facebook/react-native/pull/21588) by [@empyrical](https://github.com/empyrical), [SegmentedControlIOS](https://github.com/facebook/react-native/pull/21888/files), [ToolbarAndroid](https://github.com/facebook/react-native/pull/21893/files) by [@nd-02110114](https://github.com/nd-02110114) -- Flow dependency is now at `v0.85.0` ([adc8a33fcf](https://github.com/facebook/react-native/commit/adc8a33fcfeb8fc163f48ae4a4bc5aaac98bcb0d) by [@samwgoldman](https://github.com/samwgoldman)) -- metro dependency is now at `v0.49.1` ([f867db366a](https://github.com/facebook/react-native/commit/f867db366aa4f0ead5a20c0d3154ca58be43fc20), [88882951e1](https://github.com/facebook/react-native/commit/88882951e1607b0af6f1772ef13135e037f9c4e3), [31bb551e75](https://github.com/facebook/react-native/commit/31bb551e75bda155b4821381e5497dc423326e3c), [de60e8643a](https://github.com/facebook/react-native/commit/de60e8643ac4e13a7f92175351268dd3c3e768db), and [de60e8643a](https://github.com/facebook/react-native/commit/de60e8643ac4e13a7f92175351268dd3c3e768db) by [@alexkirsz](https://github.com/alexkirsz) and [@rafeca](https://github.com/rafeca)) -- jest dependency is now at `v24.0.0-alpha.6` ([1b4fd64325](https://github.com/facebook/react-native/commit/1b4fd643256817d29163b37101da612867a225a1), [66aba09251](https://github.com/facebook/react-native/commit/66aba092514abd2b278a4fb66c30abffbdd5d5ff), and [06c13b3e06](https://github.com/facebook/react-native/commit/06c13b3e066636b414f5dc19c919dcb138763c71) by [@rafeca](https://github.com/rafeca) and [@rubennorte](https://github.com/rubennorte)) -- fbjs-scripts dependency is now at `v1.0.0` (#21880) ([cdbf719307](https://github.com/facebook/react-native/commit/cdbf719307f41e94a62307ec22463bb562d1c8de) by [@jmheik](https://github.com/jmheik)) -- folly dependency is now at `v2018.10.22.00` ([a316dc6ec3](https://github.com/facebook/react-native/commit/a316dc6ec34655981c0f226186f4fb668e4a01e2), [287934dba9](https://github.com/facebook/react-native/commit/287934dba943cd954164bde8b06f9ba85940b45f), and [a70625abd7](https://github.com/facebook/react-native/commit/a70625abd7bf4fba3dafb8a969a73854b7ddcd42) by [@Kudo](https://github.com/Kudo) and [@radko93](https://github.com/radko93)) -- React is set to `16.6.3` now via sync for revisions 4773fdf...6bf5e85 ([0cb59b5c23](https://github.com/facebook/react-native/commit/0cb59b5c23b76771a30f59cdcedaa3c95c4dd280) and [073ad6a036](https://github.com/facebook/react-native/commit/073ad6a0367c3156e03680c0ab0648feed2bf89c) by [@yungsters](https://github.com/yungsters)) -- Clearer error messages when hot reloading ([c787866d64](https://github.com/facebook/react-native/commit/c787866d644be4c8d30bb17c237a50fdd6e1a82d) by [@alexkirsz](https://github.com/alexkirsz)) -- Allow CxxModules to implement functions which take two callbacks ([8826d8b233](https://github.com/facebook/react-native/commit/8826d8b233c1e3325a575d5012b713c4786e6062) by [@acoates-ms](https://github.com/acoates-ms)) - -#### Breaking Changes 💥 - -- Public methods of components converted to ES6 classes are no longer bound to their component instance. For `ScrollView`, the affected methods are `setNativeProps`, `getScrollResponder`, `getScrollableNode`, `getInnerViewNode`, `scrollTo`, `scrollToEnd`, `scrollWithoutAnimationTo`, and `flashScrollIndicators`. For `CameraRollView`, the affected methods are: `rendererChanged`. For `SwipeableRow`, the affected methods are: `close`. Therefore, it is no longer safe to pass these method by reference as callbacks to functions. Auto-binding methods to component instances was a behaviour of `createReactClass` that we decided to not preserve when switching over to ES6 classes. (you can refer to [this example](https://github.com/react-native-community/react-native-releases/issues/81#issuecomment-459252692)) -- Native Modules in Android now require `@ReactModule` annotations to access `.getNativeModule` method on the `ReactContext`. This is how your updated Native Module should look like: - - ```diff - // CustomModule.java - - // ... - + import com.facebook.react.module.annotations.ReactModule; - - + @ReactModule(name="CustomBridge") - public class CustomModule extends ReactContextBaseJavaModule { - // ... - - @Override - public String getName() { - return "CustomBridge"; - } - - // ... - } - ``` - -#### Android specific - -- Optimize `PlatformConstants.ServerHost`, `PlatformConstants.isTesting`, and `PlatformConstants.androidID` for performance ([2bf0d54f15](https://github.com/facebook/react-native/commit/2bf0d54f155c28244fa60230871b3eed60a20c6d), [339d9d3afb](https://github.com/facebook/react-native/commit/339d9d3afba45bb28073db59e365caea37258891), and [9f9390ddfc](https://github.com/facebook/react-native/commit/9f9390ddfccab706ff2d346fdbd408c1cfc1c312) by [@stepanhruda](https://github.com/stepanhruda), [@fkgozali](https://github.com/fkgozali), and [@axe-fb](https://github.com/axe-fb)) - -#### iOS specific - -- Suppress yellow box about missing export for native modules ([5431607c6d](https://github.com/facebook/react-native/commit/5431607c6d4983e0adccf0192dd4dc4f5dc85443) by [@fkgozali](https://github.com/fkgozali)) - -### Removed - -- Remove `UIManager.measureViewsInRect()` ([d6236796b2](https://github.com/facebook/react-native/commit/d6236796b285e6ad19c53c5308a0ad9c10792a05) by [@shergin](https://github.com/shergin)) - -### Fixed - -- Fix potential UI thread stalling scenario from Yoga JNI bindings ([2a8f6c3028](https://github.com/facebook/react-native/commit/2a8f6c3028feec7fc9a01cbdfad45955c4771bf8) by [@davidaurelio](https://github.com/davidaurelio)) -- Fix crash happening due to race condition around bridge cxx module registry ([188cbb04ad](https://github.com/facebook/react-native/commit/188cbb04ad264aea32ae235b85b61e626b767b83), [188cbb04ad](https://github.com/facebook/react-native/commit/188cbb04ad264aea32ae235b85b61e626b767b83), and [188cbb04ad](https://github.com/facebook/react-native/commit/188cbb04ad264aea32ae235b85b61e626b767b83) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Fix **View** and **Text**'s displayName; show the specific name rather than generic "Component" ([7a914fcef4](https://github.com/facebook/react-native/commit/7a914fcef4ae035221e1f984c104ba20430d6fad) by [@rajivshah3](https://github.com/rajivshah3)) -- Fix `react-native init --help` so that it doesn't return `undefined` ([58732a88b6](https://github.com/facebook/react-native/commit/58732a88b629b40b2d223a76fac46ecee5ae7295) by [@ignacioola](https://github.com/ignacioola)) -- Fix `react-native --sourceExts` ([ce860803a4](https://github.com/facebook/react-native/commit/ce860803a4341c4121a0bb504dc669349ac0db35) by [@elyalvarado](https://github.com/elyalvarado)) -- Fix accidental showing of **Modal** when `visible` prop is undefined or null ([cc13a7367b](https://github.com/facebook/react-native/commit/cc13a7367b08bd766749ddbfaacc25ade1f33a8f) by [@MateusAndrade](https://github.com/MateusAndrade)) -- Fix crash during **VirtualizedList** pagination ([5803772017](https://github.com/facebook/react-native/commit/580377201793314ca643250c1bd7cf1c47d49920)) -- Fix scenario where removing a module with remote debugging and Delta bundles may cause incorrect stack traces ([bea57d871f](https://github.com/facebook/react-native/commit/bea57d871f6b5bed76d1625b3e3f483695bd13e9) by [@alexkirsz](https://github.com/alexkirsz)) -- Fix regression in **StyleSheet** `setStyleAttributePreprocessor` ([04085337bc](https://github.com/facebook/react-native/commit/04085337bc47392922c7911b95b8fdaea98800e8) by [@brentvatne](https://github.com/brentvatne)) -- Fix React Native AsyncMode and DevTools ([aacb06c594](https://github.com/facebook/react-native/commit/aacb06c594dcd4581918035f713a69cf73bf125b) by [@bvaughn](https://github.com/bvaughn)) - -#### Android specific - -- Fix crash when removing root nodes ([b649fa96a0](https://github.com/facebook/react-native/commit/b649fa96a088a9e8ccbf3f979ebfa4a5e28a066f) by [@ayc1](https://github.com/ayc1)) -- Fix various **ReactInstanceManager** deadlocks and race conditions ([df7e8c64ff](https://github.com/facebook/react-native/commit/df7e8c64ff8f5ff739fba2ba5ed6b0610567235e), [df7e8c64ff](https://github.com/facebook/react-native/commit/df7e8c64ff8f5ff739fba2ba5ed6b0610567235e), and [be282b5287](https://github.com/facebook/react-native/commit/be282b5287f7eecf8a3fd14b06ab36454dbba5fe) by [@ayc1](https://github.com/ayc1)) -- Fix IllegalArgumentException when dismissing ReactModalHostView and DialogManager ([e57ad4ee37](https://github.com/facebook/react-native/commit/e57ad4ee37b02cd4c9e10a97d7a1d2b799204d7d) and [38e01a20c3](https://github.com/facebook/react-native/commit/38e01a20c343e60d5f8cd92fb26454e9940565df) by [@mdvacca](https://github.com/mdvacca)) -- Fix incorrect merged asset path with flavor for Android Gradle Plugin 3.2 ([e90319e9fa](https://github.com/facebook/react-native/commit/e90319e9fa18661144ad29faf36efba3750edb32) by [@yatatsu](https://github.com/yatatsu)) -- Fix HTTP connection ontimeout callback ([a508134724](https://github.com/facebook/react-native/commit/a50813472450f51d2ef24b40be99a22beefec33c)) -- Fix websocket properly closing when remote server initiates close ([2e465bca15](https://github.com/facebook/react-native/commit/2e465bca158ae9cfa89448e2a3bb8cc009397ac8) by [@syaau](https://github.com/syaau)) -- Fix compatibility issue for Android 16 device ([5939d078a0](https://github.com/facebook/react-native/commit/5939d078a01edc9f83fce102317540ffbcac17c1), [f22473e9e9](https://github.com/facebook/react-native/commit/f22473e9e9f73605cd27c5e38298bd793478c84d), and [f22473e9e9](https://github.com/facebook/react-native/commit/f22473e9e9f73605cd27c5e38298bd793478c84d) by [@gengjiawen](https://github.com/gengjiawen)) -- Fix issue where `Image.resizeMode` isn't respected while source is loading, resulting in unexpected padding ([673ef39561](https://github.com/facebook/react-native/commit/673ef39561ce6640e447fa40299c263961e4f178) by [@dulmandakh](https://github.com/dulmandakh)) -- Fix Android 28's inverted **ScrollView** so that momentum is in the proper direction ([b971c5beb8](https://github.com/facebook/react-native/commit/b971c5beb8c7f90543ea037194790142f4f57c80) by [@mandrigin](https://github.com/mandrigin)) -- Fix HTTP connection timeout callback to be appropriately called ([a508134724](https://github.com/facebook/react-native/commit/a50813472450f51d2ef24b40be99a22beefec33c)) -- Fix compatibility issue with Android 16 device ([5939d078a0](https://github.com/facebook/react-native/commit/5939d078a01edc9f83fce102317540ffbcac17c1) by [@gengjiawen](https://github.com/gengjiawen)) -- Fix crash when releasing RN views and removing root nodes([83405ff316](https://github.com/facebook/react-native/commit/83405ff3167eaba6fa59ca52c54943221a05ee09) and [b649fa96a0](https://github.com/facebook/react-native/commit/b649fa96a088a9e8ccbf3f979ebfa4a5e28a066f) by [@ayc1](https://github.com/ayc1)) -- Close websocket properly when remote server initiates close ([2e465bca15](https://github.com/facebook/react-native/commit/2e465bca158ae9cfa89448e2a3bb8cc009397ac8) by [@syaau](https://github.com/syaau)) -- Workaround a wrong fling direction for inverted ScrollViews on Android P ([b971c5beb8](https://github.com/facebook/react-native/commit/b971c5beb8c7f90543ea037194790142f4f57c80) by [@mandrigin](https://github.com/mandrigin)) -- Fix **Image** to respect `resizeMode` for `defaultSource` images rather than showing padding while loading ([673ef39561](https://github.com/facebook/react-native/commit/673ef39561ce6640e447fa40299c263961e4f178) by [@dulmandakh](https://github.com/dulmandakh)) - -#### iOS specific - -- Fix case where content of inline views didn't get relaid out ([798517a267](https://github.com/facebook/react-native/commit/798517a267841675956cb52a1c0ae493a913962a) by [@rigdern](https://github.com/rigdern)) -- Fix issue with **ImagePickerIOS**'s inconsistent image when using the front-facing camera ([4aeea4d2dc](https://github.com/facebook/react-native/commit/4aeea4d2dc14cf02dc3766043e2938bf367c6170)) -- Fix race condition and crash around shutdown of the JSC for iOS 11 and earlier ([bf2500e38e](https://github.com/facebook/react-native/commit/bf2500e38ec06d2de501c5a3737e396fe43d1fae) by [@mhorowitz](https://github.com/mhorowitz)) -- Fix crash in **NetInfo**'s \_firstTimeReachability ([eebc8e230a](https://github.com/facebook/react-native/commit/eebc8e230a9f72c3dde34a5cfd59bbffba55e53d) by [@mmmulani](https://github.com/mmmulani)) -- Fix case where inline view is visible even though it should have been truncated ([70826dbafc](https://github.com/facebook/react-native/commit/70826dbafcb00c08e0038c5066e33848141be77b) by [@rigdern](https://github.com/rigdern)) -- Fix crash with **ScrollView** related to content offsets ([585f7b916d](https://github.com/facebook/react-native/commit/585f7b916d63b7b4d22a7347334765ffcd7945e9) by [@shergin](https://github.com/shergin)) -- Fix an issue where **CameraRoll** wasn't showing the front-facing camera consistently during capture and preview ([4aeea4d2dc](https://github.com/facebook/react-native/commit/4aeea4d2dc14cf02dc3766043e2938bf367c6170)) -- Fix case where inline view is visible even though it should have been truncated ([70826dbafc](https://github.com/facebook/react-native/commit/70826dbafcb00c08e0038c5066e33848141be77b) by [@rigdern](https://github.com/rigdern)) - -### Known issues - -It is possible that you'll face an AAPT error regarding missing resources, [here](https://github.com/infinitered/ignite-andross/issues/244) is an example of this error, in this case, you should try to update the build tools versions to `buildToolsVersion = "28.0.2"` in your android/build.gradle file. If you maintain a react-native library which uses native code you should avoid using hardcoded versions of the build tools and use the packaged version numbers, here is an example you can [follow](https://github.com/react-native-community/react-native-linear-gradient/blob/master/android/build.gradle) - -## v0.57.8 - -**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.3"`. - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/71) for cherry-picking commits - you can participate to the decision process for the next release [here](https://github.com/react-native-community/react-native-releases/issues/75). - -### Added - -- Fix: Add displayName to ActivityIndicator (#22417) ([53da585832](https://github.com/facebook/react-native/commit/53da5858326bbddd2df112f86b2c1e935adc3882)) - -### Changed - -- Switch: Improve Accessibility ([0c8db08f51](https://github.com/facebook/react-native/commit/0c8db08f519fdf5162dff1d9a18b58885c4c7d2f) by [@yungsters](https://github.com/yungsters)) -- React sync for revisions 3ff2c7c...6bf5e85 ([073ad6a036](https://github.com/facebook/react-native/commit/073ad6a0367c3156e03680c0ab0648feed2bf89c) by [@yungsters](https://github.com/yungsters)) - -#### iOS specific - -- Extend reason message for `RCTFatalException` (#22532) ([2831d9ef61](https://github.com/facebook/react-native/commit/2831d9ef614280d08699f3134eeaeda84c30234e) by [@zackzachariah](https://github.com/zackzachariah)) - -### Removed - -- Remove trailing slash from origin header if no port is specified (#22290) ([cbe7d41f3f](https://github.com/facebook/react-native/commit/cbe7d41f3f509aaa8b8b0819b0d8ad4996fd7296)) - -### Fixed - -- Fix text alpha bug ([fd78eee11b](https://github.com/facebook/react-native/commit/fd78eee11b71799aa7fa57bbd70d59c6c642c3b3) by [@necolas](https://github.com/necolas)) -- fix possible NPE in StatusBarModule ([0f3be77b7d](https://github.com/facebook/react-native/commit/0f3be77b7d4177c8f94d775bf8ef2a2b68f1e828) by [@mdvacca](https://github.com/mdvacca)) -- Fixes animated gifs incorrectly looping/not stopping on last frame (#21999) ([de759b949e](https://github.com/facebook/react-native/commit/de759b949e4aa4904fd60a2fcbb874a3c857b50c) by [@staufman](https://github.com/staufman)) -- Fix ListEmptyComponent is rendered upside down when using inverted flag. (#21496) ([198eb02697](https://github.com/facebook/react-native/commit/198eb0269781803cc16254916b0477916afbcb0e) by [@hyochans](https://github.com/hyochans)) -- Fix bug in comparison logic of object property (#22348) ([c3b3eb7f73](https://github.com/facebook/react-native/commit/c3b3eb7f73b0fb4035d4b2478bf9827caf746372) by [@vreality64](https://github.com/vreality64)) -- Fix dispatch of OnLayout event for first render ([844e11967d](https://github.com/facebook/react-native/commit/844e11967d9292bd5cfe423d0fd57e34388f2337) by [@mdvacca](https://github.com/mdvacca)) -- KeyboardAvoidingView: Duration cannot be less then 10ms (#21858) ([87b6533937](https://github.com/facebook/react-native/commit/87b65339379362f9db77ae3f5c9fa8934da34b25)) -- default hitSlop values to 0 (#22281) ([f6d3a61677](https://github.com/facebook/react-native/commit/f6d3a6167730cc9253b796b859d8f1f33f821687) by [@Taylor123](https://github.com/Taylor123)) - -#### iOS specific - -- Fixed for supporting mediaPlaybackRequiresUserAction under iOS 10. (#22208) ([c45d290b07](https://github.com/facebook/react-native/commit/c45d290b079f95466ad4054acf7b93c66cabc429) by [@ifsnow](https://github.com/ifsnow)) -- Use main.jsbundle in iOS template for production build (#22531) ([a2ef5b85d8](https://github.com/facebook/react-native/commit/a2ef5b85d8c46cefd5873bf5fc6dddabf1d51d13) by [@radeno](https://github.com/radeno)) -- Use relative path for SCRIPTDIR (#22598) ([0314fca63a](https://github.com/facebook/react-native/commit/0314fca63a035c95864e5b198e1fbd9a5ee1d2a7) by [@sunnylqm](https://github.com/sunnylqm)) -- Fix UIScrollView crash ([585f7b916d](https://github.com/facebook/react-native/commit/585f7b916d63b7b4d22a7347334765ffcd7945e9) by [@shergin](https://github.com/shergin)) -- Avoid using `-[UITextView setAttributedString:]` while user is typing (#19809) ([f77aa4eb45](https://github.com/facebook/react-native/commit/f77aa4eb459b9dcb7f0b558ad3f04e0c507955e9)) - -### Security - -- Bump ws package to 1.1.5 due to vulnerability issues (#21769) ([96ce6f9538](https://github.com/facebook/react-native/commit/96ce6f9538ed3559ffea6040a47b1d6a30546ab9) by [@prog1dev](https://github.com/prog1dev)) - -## v0.57.7 - -**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.1"`. - -This patch release fixes version 0.57.6 about losing focus in `TextInput` because of [ada7089066](https://github.com/facebook/react-native/commit/ada70890663503b65b42bb5f6f98d3df412ecdc4). - -Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/64) for cherry-picking commits. - -## v0.57.6 - -**INFO NOTE**: It's highly recommended that you skip this version and upgrade to 0.57.7. - -**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.1"`. -This patch release fixes a number of crashes, resolves build issues (both for iOS and Android). Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/64) for cherry-picking commits. - -### Added - -#### iOS specific - -- Add iOS 12 textContentType options (#21079) ([644fc57fad](https://github.com/facebook/react-native/commit/644fc57fad4b163e96c3b3d6ec441c7b566d2d43) by [@ultramiraculous](https://github.com/ultramiraculous)) - -### Removed - -- Remove useless additional blur call (#22156) ([ada7089066](https://github.com/facebook/react-native/commit/ada70890663503b65b42bb5f6f98d3df412ecdc4)) - -### Fixed - -- Improving Modal `visible` prop check to handle undefined and null (#22072) ([cc13a7367b](https://github.com/facebook/react-native/commit/cc13a7367b08bd766749ddbfaacc25ade1f33a8f) by [@MateusAndrade](https://github.com/MateusAndrade)) -- Fix crash in nativeInjectHMRUpdate (#22412) ([0b4fd621e3](https://github.com/facebook/react-native/commit/0b4fd621e3ab511510d6852af67183a3581d1aad) by [@vovkasm](https://github.com/vovkasm)) -- Fix IllegalArgumentException when dismissing ReactModalHostView ([e57ad4ee37](https://github.com/facebook/react-native/commit/e57ad4ee37b02cd4c9e10a97d7a1d2b799204d7d) by [@mdvacca](https://github.com/mdvacca)) -- Fix regression in StyleSheet.setStyleAttributePreprocessor (#22262) ([04085337bc](https://github.com/facebook/react-native/commit/04085337bc47392922c7911b95b8fdaea98800e8) by [@brentvatne](https://github.com/brentvatne)) -- Fix React Native AsyncMode and DevTools ([f41383fb6d](https://github.com/facebook/react-native/commit/f41383fb6d6d0858e1b09dda79a74632d7932d07) by [@bvaughn](https://github.com/bvaughn)) -- CxxReact: Silence 'unused lambda capture' warnings in open-source (#22240) ([0c0540965a](https://github.com/facebook/react-native/commit/0c0540965ad9e3cdd9af16f606e141eca8ab2193) by [@empyrical](https://github.com/empyrical)) - -#### Android specific - -- Fixed HTTP connection timeout on Android (#22164) ([a508134724](https://github.com/facebook/react-native/commit/a50813472450f51d2ef24b40be99a22beefec33c)) -- resizeMode applies to Image.defaultSource (#22216) ([673ef39561](https://github.com/facebook/react-native/commit/673ef39561ce6640e447fa40299c263961e4f178) by [@dulmandakh](https://github.com/dulmandakh)) -- Android: Close websocket properly when remote server initiates close (#22248) ([2e465bca15](https://github.com/facebook/react-native/commit/2e465bca158ae9cfa89448e2a3bb8cc009397ac8) by [@syaau](https://github.com/syaau)) -- Workaround a wrong fling direction for inverted ScrollViews on Android P (#21117) ([b971c5beb8](https://github.com/facebook/react-native/commit/b971c5beb8c7f90543ea037194790142f4f57c80) by [@mandrigin](https://github.com/mandrigin)) -- Fix crash when releasing RN views ([83405ff316](https://github.com/facebook/react-native/commit/83405ff3167eaba6fa59ca52c54943221a05ee09) by [@ayc1](https://github.com/ayc1)) - -#### iOS specific - -- iOS: Support inline view truncation (#21456) ([70826dbafc](https://github.com/facebook/react-native/commit/70826dbafcb00c08e0038c5066e33848141be77b) by [@rigdern](https://github.com/rigdern)) -- NetInfo: try to solve crash with releasing \_firstTimeReachability ([eebc8e230a](https://github.com/facebook/react-native/commit/eebc8e230a9f72c3dde34a5cfd59bbffba55e53d) by [@mmmulani](https://github.com/mmmulani)) -- Generate ip.txt before SKIP_BUNDLING check (#20554) ([9c1ea45d38](https://github.com/facebook/react-native/commit/9c1ea45d38a6ec731894443debe8879fa3876ab7) by [@keatongreve](https://github.com/keatongreve)) -- Revert [Performance improvement for loading cached images on iOS ] ([7eeb305933](https://github.com/facebook/react-native/commit/7eeb305933fca695c5a15d675bb10569c3385109) by [@kelset](https://github.com/kelset)) -- Fix inability to remove 'Disabled' state from AccessibilityStates ([5eaa2d29c0](https://github.com/facebook/react-native/commit/5eaa2d29c0c4c633a40f7241408737c754edea84)) - -## v0.57.5 - -**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.1"`. - -This patch release fixes a number of crashes, resolves build issues (both for iOS and Android), and brings React to v16.6.1. Thanks everyone who contributed code or participated in the [discussion](https://github.com/react-native-community/react-native-releases/issues/54) for cherry-picking commits. - -### Changed - -- React is now at v16.6.1 ([8325e09e5c](https://github.com/facebook/react-native/commit/8325e09e5cd8538fded1b5a1b4fff1854e17eb22) and [76c99f20e3](https://github.com/facebook/react-native/commit/76c99f20e39ef1b5fa93487bc8c82e7c6aede5dd) by [@yungsters](https://github.com/yungsters)) - -#### iOS specific - -- Performance improvement for loading cached images ([54f7eb3424](https://github.com/facebook/react-native/commit/54f7eb34243715a1d4bc821ccbadeec12486d22c) and [3a98318c91](https://github.com/facebook/react-native/commit/3a98318c91283a1bba35c0bca93b975d4a550330) by [@esamelson](https://github.com/esamelson) and others) - -### Fixed - -- Fix crash in **VirtualizedList** during pagination ([5803772017](https://github.com/facebook/react-native/commit/580377201793314ca643250c1bd7cf1c47d49920)) -- Fix polyfilling of **regeneratorRuntime** to avoid setting it to undefined in some situations ([2a7e02edf6](https://github.com/facebook/react-native/commit/2a7e02edf64c20410b2f95f35e313279545b40db) by [@rafeca](https://github.com/rafeca)) -- Fix **View**, **Text**, and **ActivityIndicator**'s `displayName` ([7a914fcef4](https://github.com/facebook/react-native/commit/7a914fcef4ae035221e1f984c104ba20430d6fad) and [53da585832](https://github.com/facebook/react-native/commit/53da5858326bbddd2df112f86b2c1e935adc3882) by [@rajivshah3](https://github.com/rajivshah3) and others) -- Fix crash that happens when a component throws an exception that contains a null message ([6debfdf6d6](https://github.com/facebook/react-native/commit/6debfdf6d6172cec2d87fd1e780c3b347d41dc1d) by [@mdvacca](https://github.com/mdvacca)) - -#### Android specific - -- Fix incorrect merged asset path with flavor for Android Gradle Plugin 3.2 ([e90319e9fa](https://github.com/facebook/react-native/commit/e90319e9fa18661144ad29faf36efba3750edb32) by [@yatatsu](https://github.com/yatatsu)) -- Fix crash in **ReadableNativeArray.getType** when size of ReadableNativeArray's length > 512 ([09c78fe968](https://github.com/facebook/react-native/commit/09c78fe968e1bb71108c4058e76ebf70178e5a8b) by [@dryganets](https://github.com/dryganets)) - -#### iOS specific - -- Fix crash in rapid use of **NetInfo.getCurrentConnectivity** ([67afaefa78](https://github.com/facebook/react-native/commit/67afaefa78c314b38249a7e2758e0af38c18f34a) by [@mmmulani](https://github.com/mmmulani)) -- Fix Xcode 10 errors relating to third-party ([277c19c93e](https://github.com/facebook/react-native/commit/277c19c93eacf3e3ce63f71236fd399214d6e6d0) by [@mmccartney](https://github.com/mmccartney)) -- Fix build errors when path to `$NODE_BINARY` contains spaces ([7d4e94edcc](https://github.com/facebook/react-native/commit/7d4e94edccfc2f642fcbd1d6aa00756f02e3a525) by [@sundbry](https://github.com/sundbry)) -- Fix case where content of inline views didn't get relaid out ([798517a267](https://github.com/facebook/react-native/commit/798517a267841675956cb52a1c0ae493a913962a) by [@rigdern](https://github.com/rigdern)) -- Fix **InputAccessoryView**'s safe area when not attached to a **TextInput** ([2191eecf54](https://github.com/facebook/react-native/commit/2191eecf54b5c4bf278dfaf23fec46d44ac9a1f0) by [@janicduplessis](https://github.com/janicduplessis)) - -## v0.57.4 - -**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.0-alpha.8af6728"` (next version, 0.57.5, will update to `16.6.0`, and it will come soon). Also, please check the _Known issues_ section below, especially if you are using Xcode 10. - -Thanks to everyone that contributed to the [discussion](https://github.com/react-native-community/react-native-releases/issues/48) for cherry-picking the commits that landed in this release, and the developers who submitted those commits! - -### Added: new features - -#### Android specific additions - -- Android textTransform style support ([22cf5dc566](https://github.com/facebook/react-native/commit/22cf5dc5660f19b16de3592ccae4c42cc16ace69) by Stephen Cook) - -### Changes: existing functionality that is now different - -- Add deprecation notice to SwipeableListView ([99471f87b9](https://github.com/facebook/react-native/commit/99471f87b944b26bbdaa0fb0881db91c1118b741) by [@TheSavior](https://github.com/TheSavior)) - -#### Android specific changes - -- Consolidate native dependencies versions ([ba608a2db7](https://github.com/facebook/react-native/commit/ba608a2db786a8e983a6e30b31662fac254286c0) by [@dulmandakh](https://github.com/dulmandakh)) -- bump okhttp3 to 3.11 ([10fc548809](https://github.com/facebook/react-native/commit/10fc548809cc08db209ae6696b723341925137d1) by [@dulmandakh](https://github.com/dulmandakh)) -- Android: Send `` metrics in onTextLayout events ([737f93705c](https://github.com/facebook/react-native/commit/737f93705ca8b5d3fdd207f870cf27adcf1e885b) by [@mmmulani](https://github.com/mmmulani)) -- Use TextLegend example in Android as well ([335927db44](https://github.com/facebook/react-native/commit/335927db44fe47e20db4503a1ab5fcf8d62144a8) by [@mmmulani](https://github.com/mmmulani)) - -#### iOS specific changes - -- Bump xcode@1.0.0 ([b9514995a2](https://github.com/facebook/react-native/commit/b9514995a26b4c3f6d555257740457dd4d6cfeae) by [@peat-psuwit](https://github.com/peat-psuwit)) -- Text: send metrics after rendering (iOS) ([737f93705c](https://github.com/facebook/react-native/commit/737f93705ca8b5d3fdd207f870cf27adcf1e885b) by [@mmmulani](https://github.com/mmmulani)) -- Allow specifying iOS version for run-ios with simulator option ([0fab27cbac](https://github.com/facebook/react-native/commit/0fab27cbaca57b90119ab36104af4d0b3052ae30) by [@elyalvarado](https://github.com/elyalvarado)) -- Relax the requirement that lazy module cannot be initialized on the main thread ([dbc864c9cd](https://github.com/facebook/react-native/commit/dbc864c9cd95f9df268d85a642742e84e2360db4) by [@spredolac](https://github.com/spredolac)) - -### Fixed: bugs that have been resolved - -- Fix crashes on invalid regex ([298f14da12](https://github.com/facebook/react-native/commit/298f14da1210460b3e25c6002e8d1aa5f7b4e0ef) by [@RSNara](https://github.com/RSNara)) -- Fix pull to refresh refresh component clipping on Android ([8a3a0ad2d0](https://github.com/facebook/react-native/commit/8a3a0ad2d0f894a3d8c1e403a9336dab17c2dde8) by Andy Huang) -- ListView requestAnimationFrame leak ([70b5eb3aa2](https://github.com/facebook/react-native/commit/70b5eb3aa27822fa11571c3d8d3628ecf03268ab) by [@exced](https://github.com/exced)) - -#### Android specific fixes - -- reverted [Update bad method](https://github.com/facebook/react-native/commit/1592a8d42411d1f91c8ceb738c0533c1cee73f71) -- Fix accessibility role crash ([1f96ff62cf](https://github.com/facebook/react-native/commit/1f96ff62cf786f93c91e6625bf2b819077902251) by Haseeb Saeed) -- Fix accessibilityRole value lookup ([1f96ff62cf](https://github.com/facebook/react-native/commit/1f96ff62cf786f93c91e6625bf2b819077902251) by [@ayc1](https://github.com/ayc1)) -- Fix DynamicFromMap object pool synchronization ([b0d68c0bb9](https://github.com/facebook/react-native/commit/b0d68c0bb971a44dfdf7722682933f1e96e1cd45) by [@haitaoli](https://github.com/haitaoli)) -- Back out "[react-native][pr] Rounded corner rendering fixed on Android N." ([bb407fa1ec](https://github.com/facebook/react-native/commit/bb407fa1ec0bd0367373961fdc0e840150840068) by Jonathan Lee) -- Fix onTextLayout metrics on Android when using alignText ([1c240ae898](https://github.com/facebook/react-native/commit/1c240ae898e26534b8d9a09a334dec02e96faa05) by [@mmmulani](https://github.com/mmmulani)) -- Cleaning up imports in ViewGroupManager ([082a869dae](https://github.com/facebook/react-native/commit/082a869daef3cf602a088d0418c185279052b8c3) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific fixes - -- Fix issue when inserting text at 0 when maxLength is set ([17415938c7](https://github.com/facebook/react-native/commit/17415938c7180a95811db949122b8ad24a442866) by [@ejanzer](https://github.com/ejanzer)) - -### Known issues - -There are a few issues that don't have a finalized solution (as it happens for 0.x projects). In particular: - -- when using Xcode 10 and `react-native init`, your build may fail due to third-party build steps ([#20774](https://github.com/facebook/react-native/issues/20774)). There is a [commit](https://github.com/facebook/react-native/commit/b44c5ae92eb08125d466cf151cb804dabfbbc690) we are planning to cherry pick in a future release that should help - in the meantime, you should be able to run these commands from the project folder to fix the issue (you should need to do it only once per project): - - ```bash - cd node_modules/react-native - scripts/ios-install-third-party.sh - cd third-party/glog-0.3.5/ - ../../scripts/ios-configure-glog.sh - ``` - -- React `16.6.0` works for the most part, aside from the Context API (check [this issue](https://github.com/facebook/react-native/issues/21975)) - and if you are eager to test the new React Hooks you will have to be patient, as they are not production ready and `16.7.alpha` is **not** yet [supported](https://github.com/facebook/react-native/issues/21967) by React Native. - -## v0.57.3 - -**NOTE WELL**: when you upgrade to this version you **NEED** to upgrade `react` and `react-test-renderer` to version `"16.6.0-alpha.8af6728"`. Also, please check the _Known issues_ section below, especially if you are using Xcode 10. - -Thanks to everyone that contributed to the [discussion](https://github.com/react-native-community/react-native-releases/issues/46) for cherry-picking the commits that landed in this release, and the developers who submitted those commits! - -### Added: new features - -- Expose enableBabelRuntime config param externally ([89a358f347](https://github.com/facebook/react-native/commit/89a358f34786198c8a9a2d379588efd57b6a0eec) by [@rafeca](https://github.com/rafeca)) - -#### Android specific additions - -- Add test for InterpolatorType ([b7526b2095](https://github.com/facebook/react-native/commit/b7526b2095e4a5c8641e8264786d1622d6390029) by [@ejanzer](https://github.com/ejanzer)) - -### Changes: existing functionality that is now different - -- React sync for revisions ade5e69...d836010 ([fa6035bda6](https://github.com/facebook/react-native/commit/7142e9b1c5f95e82ceb04798b166318385004147) by [@yungsters](https://github.com/yungsters)) -- React: Bump Canary Version ([8258b6a280](https://github.com/facebook/react-native/commit/8258b6a2801121bebb25272bfcc5d3da1fb5ae39) by [@yungsters](https://github.com/yungsters)) -- FBJS: Upgrade to ^1.0.0 ([ee034596fe](https://github.com/facebook/react-native/commit/ee034596fecfb47ff9e6e1fc30cefb0e970e7d80) by [@yungsters](https://github.com/yungsters)) -- Bump metro@0.48.1 ([bf47589b8b](https://github.com/facebook/react-native/commit/bf47589b8be145750e954d09684370463a616779) by [@rafeca](https://github.com/rafeca)) -- Update to Detox 9 ([15c05988e9](https://github.com/facebook/react-native/commit/15c05988e980118151bdf41ed82ebb8c8e30a0f3) by [@kelset](https://github.com/kelset)) -- Add Deprecation Warning to ListView ([e90f5fa263](https://github.com/facebook/react-native/commit/e90f5fa2630f8a89e15fa57c70ada83e75a20642) by [@TheSavior](https://github.com/TheSavior)) -- Deprecate legacyImplementation of FlatList ([3aa8f09b44](https://github.com/facebook/react-native/commit/3aa8f09b4437eab8b91429b7325f8a6173ffa49a) by [@TheSavior](https://github.com/TheSavior)) - -#### Android specific changes - -- bump Android NDK to r17c ([436cf154bb](https://github.com/facebook/react-native/commit/436cf154bb9cf4fc0bcafd7115d33544ce36b759) by [@dulmandakh](https://github.com/dulmandakh)) -- Resolve protocol http, https when not in lowercase ([d00bdb9bb8](https://github.com/facebook/react-native/commit/d00bdb9bb8b9b11bce900689c7e28cebd2eb0807) by [@hyunjongL](https://github.com/hyunjongL)) -- Normalize scheme for URL on Android ([4b6f02ea75](https://github.com/facebook/react-native/commit/4b6f02ea758a9ab5853a29ebfc054eaa98e6dc53) by [@radeno](https://github.com/radeno)) - -#### iOS specific changes - -- Bump up the buffer size and show a warning if the trace might be truncated ([1fc8a46570](https://github.com/facebook/react-native/commit/1fc8a46570561a32657ffccb0f5a12c6f4d6a3dd) by [@alexeylang](https://github.com/alexeylang)) - -### Fixed: bugs that have been resolved - -- Fix deprecation warning message in Switch ([997f382adc](https://github.com/facebook/react-native/commit/997f382adcc7f82fccd97ac671d13e86aef7171e) by [@radko93](https://github.com/radko93)) - -#### Android specific fixes - -- Fix default accessibility delegate ([fa6035bda6](https://github.com/facebook/react-native/commit/fa6035bda6c606868977179534cb941f26fbdb92) by [@ayc1](https://github.com/ayc1)) -- Fix accessibility role/label ([fa6035bda6](https://github.com/facebook/react-native/commit/fa6035bda6c606868977179534cb941f26fbdb92) by [@ayc1](https://github.com/ayc1)) -- When converting arguments JS->Java, handle integers correctly ([bb9b9a8b9d](https://github.com/facebook/react-native/commit/bb9b9a8b9d5868c7ab5034117b785943496f6405) by [@mhorowitz](https://github.com/mhorowitz)) -- Fix CameraRoll.getPhotos() crash on Android if device has a problematic video asset ([4768bea0cf](https://github.com/facebook/react-native/commit/4768bea0cf288cf9c8097fc498b896610728c645) by [@naxel](https://github.com/naxel)) -- Android ScrollView fix for snapToInterval not snapping to end ([6eeff75849](https://github.com/facebook/react-native/commit/6eeff75849c9b8bf91592c1b7906b4dab8fba518) by [@olegbl](https://github.com/olegbl)) -- Fix for InterpolatorType crash ([01a1004808](https://github.com/facebook/react-native/commit/01a1004808928e29a6d6c698b3b18312fed17a02) by [@ejanzer](https://github.com/ejanzer)) -- Update bad method ([1592a8d424](https://github.com/facebook/react-native/commit/1592a8d42411d1f91c8ceb738c0533c1cee73f71) by [@grabbou](https://github.com/grabbou)) - -#### iOS specific fixes - -- Dealloc first time RCTNetInfo reachability callback ([e7e63fd409](https://github.com/facebook/react-native/commit/e7e63fd4092a81beec482fc48d05f1a048801037) by [@mmmulani](https://github.com/mmmulani)) -- iOS: fix the baseline issue when displaying a mixture of different-language characters ([c1561ab441](https://github.com/facebook/react-native/commit/c1561ab4411854bef96b5d268d38002a013d6d3e) by [@BingBingL](https://github.com/BingBingL)) -- Fix artifacting on RN-drawn borders with asymmetric radii ([9e6522374b](https://github.com/facebook/react-native/commit/9e6522374bc605bb1a92ff02842878ace35e9f3d) by [@jamesreggio](https://github.com/jamesreggio)) -- check isAvailable key on simulator object ([1031872784](https://github.com/facebook/react-native/commit/1031872784e9373082797e5bf5c815816af2105b) by [@antonychan](https://github.com/antonychan)) -- ios-simulator: change default iphone version ([6d09df5b72](https://github.com/facebook/react-native/commit/6d09df5b726ac951417b87a49bc345ebc9142951) by Vitor Capretz) - -### Known issues - -There are a few issues that don't have a finalized solution. In particular, when using Xcode 10 and `react-native init`, your build may fail due to third-party build steps ([#20774](https://github.com/facebook/react-native/issues/20774)). There is an open pull request which we are testing and hope to land soon ([#21458](https://github.com/facebook/react-native/pull/21458)). In the meantime, you can find a workaround here: [https://github.com/facebook/react-native/issues/20774](https://github.com/facebook/react-native/issues/20774). - -## v0.57.2 - -Thanks to everyone that contributed to the [discussion](https://github.com/react-native-community/react-native-releases/issues/45) for cherry-picking the commits that landed in this release, and the developers who submitted those commits! - -### Added: new features - -#### Android specific additions - -- Android subpixel text ([65e4e674fc](https://github.com/facebook/react-native/commit/65e4e674fca7127fd7800ae011cab449561f475b) by [@kevinresol](https://github.com/kevinresol)) - -### Changes: existing functionality that is now different - -- ReactScrollView should account for `overflow: scroll` ([201f2f189f](https://github.com/facebook/react-native/commit/201f2f189f2c41092397e5457eda83b0764ee4cd) by [@mcolotto](https://github.com/mcolotto)) -- bump metro 0.47.0 ([4750f52b34](https://github.com/facebook/react-native/commit/4750f52b34f524cae8ca08fcacec063c0725e4de) by [@rafeca](https://github.com/rafeca)) -- Use babel runtime instead of relying on global babelHelpers and regenerator ([36033bd0ed](https://github.com/facebook/react-native/commit/36033bd0edecd20fe2ae5edd56408bcc134378e7) by [@janicduplessis](https://github.com/janicduplessis)) -- React: Upgrade to react-devtools@^3.4.0 ([25119f95c8](https://github.com/facebook/react-native/commit/25119f95c81039761dd505c216c1e499003c6294) by [@yungsters](https://github.com/yungsters)) -- Change new Date() to Date.now() to save on date allocations ([bbb2d9a5b3](https://github.com/facebook/react-native/commit/bbb2d9a5b358bc0c150fe6ff74c45594c987e949) by [@dulinriley](https://github.com/dulinriley)) -- Make config object read-only ([2c1057062e](https://github.com/facebook/react-native/commit/2c1057062e81f8b43d3f942a35371fb3db841bed) by [@rafeca](https://github.com/rafeca)) -- Cleanup the transformer flow types ([28dedfb6d6](https://github.com/facebook/react-native/commit/28dedfb6d61e64a50d78aa06ee4f744665a54c2a) by [@rafeca](https://github.com/rafeca)) -- bump metro 0.47.1 ([12ab08a5aa](https://github.com/facebook/react-native/commit/12ab08a5aab3e14c9b2fb35454b16708b8ce093d) by [@rafeca](https://github.com/rafeca)) - -#### Android specific changes - -- Android ScrollView support for `overflow: visible` ([4af4da9089](https://github.com/facebook/react-native/commit/4af4da9089e20aa84bc5660bfb37763556442a4e) by [@olegbl](https://github.com/olegbl)) -- Expose a getter for overflow setting in ReactViewGroup ([02ad56f541](https://github.com/facebook/react-native/commit/02ad56f5419675572d684c3cc8a28644f29afffa) by [@kmagiera](https://github.com/kmagiera)) -- Add workaround for Android Gradle Plugin 3.2 change to asset dir ([ff084a4e80](https://github.com/facebook/react-native/commit/ff084a4e8071adb4ff6198b32aa8a7e8e29cca1c) by [@edilaic](https://github.com/edilaic)) - -### Fixed: bugs that have been resolved - -- Fix HEAD request failing with `Invalid response for blob` ([7e9c3f77cc](https://github.com/facebook/react-native/commit/7e9c3f77cce881dbb47af266993da5a2b6e98b5b) by [@anthonyhumphreys](https://github.com/anthonyhumphreys)) -- Check if child view != null before dropping ([af181fb192](https://github.com/facebook/react-native/commit/af181fb192c83e1dd0575c24e38d8814bbf187d6) by [@chrusart](https://github.com/chrusart)) - -#### Android specific fixes - -- Fix event handlers for DPad arrows on Android TV ([4d71b1525d](https://github.com/facebook/react-native/commit/4d71b1525d357a61a1740d6de5c1b97b6527f986) by [@krzysztofciombor](https://github.com/krzysztofciombor)) -- Rounded corner rendering fixed on Android N ([748cf82c97](https://github.com/facebook/react-native/commit/748cf82c974d6cf5d5df64b6e6013211c870530c) by [@dryganets](https://github.com/dryganets)) -- Android: fix cookies lost on Android 5.0 and above ([ea53727e16](https://github.com/facebook/react-native/commit/ea53727e16223d412fcbba49df79cc68b39f5d93) by chenwenyu) -- allow zero offset when shadow radius is nonzero ([97f0e43710](https://github.com/facebook/react-native/commit/97f0e43710a990c30e14d66bf67c7d612377d3f2) by Timothy Kukulski) -- Android ScrollView fix for pagingEnabled ([e0170a9445](https://github.com/facebook/react-native/commit/e0170a944501bb487e899b92363bf5aa64b29299) by [@olegbl](https://github.com/olegbl)) - -### Removed: features that have been removed; these are breaking - -- Remove global babelHelpers and regenerator ([458d56c0a1](https://github.com/facebook/react-native/commit/458d56c0a1ac73c088660830a8bf2db65de7d9a2) by [@janicduplessis](https://github.com/janicduplessis)) -- Remove overflow hidden killswitch ([59aada873e](https://github.com/facebook/react-native/commit/59aada873e13bf0b1f5e3a10cfe9a5a45c28f9fb) by [@ayc1](https://github.com/ayc1)) -- Remove absolute path parameter from transformers ([2e0d5c87e9](https://github.com/facebook/react-native/commit/2e0d5c87e93bb970ef1c8864ca44b47b36d6ae2e) by [@rafeca](https://github.com/rafeca)) - -## v0.57.1 - -We are trying, for 0.57, to approach it as a version with a longer "support", while waiting for some features to land that will allow for [0.58 to be cut](https://github.com/react-native-community/react-native-releases/issues/41). - -Thanks to everyone that contributed to the [discussion](https://github.com/react-native-community/react-native-releases/issues/34) for cherry-picking the commits that landed in this release, and the developers who submitted those commits! - -### Added: new features - -- Expose AllowFileAccess property in WebView ([0c576ef84a](https://github.com/facebook/react-native/commit/0c576ef84a1c7f79b228f205cc687ab1b945bda1) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific additions - -- Expose scrollEnabled as iOS prop for TextInput ([b9c28c236b](https://github.com/facebook/react-native/commit/b9c28c236bc971a5fbc51a3bda09c3980d547b96) by Chun Chen) - -### Changes: existing functionality that is now different - -- Give RNPM the ability to look for plugins in `@Scoped` modules ([4b106be477](https://github.com/facebook/react-native/commit/4b106be47765dd391f7a4cc6cf0e705ae977b90a) by [empyrical](https://github.com/empyrical)) -- Upgrade babel-eslint to 9.0.0 ([44dc283bcd](https://github.com/facebook/react-native/commit/44dc283bcd0a75826d9be86cdc727e32d5697ef2) by [@rafeca](https://github.com/rafeca)) -- bump metro 0.45.6 ([7bac0565e8](https://github.com/facebook/react-native/commit/7bac0565e82981d4a6e2b500d376ba9fa8aba721) by [@rafeca](https://github.com/rafeca)) - -#### iOS specific changes - -- Making RCTIsIPhoneX() return true for the R and Max models ([5e7c3ca005](https://github.com/facebook/react-native/commit/5e7c3ca0057f6084d692e30ae4db863fb20968ff) by [@shergin](https://github.com/shergin)) -- Way to register RCT_MODULE in Plugin2.0 instead of +load ([5c160e5ded](https://github.com/facebook/react-native/commit/5c160e5dedae713c686d88d4b9d4308b596e68a7) by Jeff Thomas) -- Update RCTLinkingManager.h to explicitly state the 'nullability' of parameters ([2271d1f912](https://github.com/facebook/react-native/commit/2271d1f912435eba7da2414ea4665ba8e56c7ad7) by Warren Knox) - -### Fixed: bugs that have been resolved - -- Pass the maxWorkers config param correctly to Metro ([7a69f1aa27](https://github.com/facebook/react-native/commit/7a69f1aa272a9b71755033a80f6f4aa5e9dcbaf6) by [@rafeca](https://github.com/rafeca)) -- Fix ignored --projectRoot/watchFolders arguments (([9fca769e76](https://github.com/facebook/react-native/commit/9fca769e7666df696299b422c140d6509e726ec6) by [@oblador](https://github.com/oblador)) -- Debug only code were leaking into release builds on iOS. (([d1ff0b0cc5](https://github.com/facebook/react-native/commit/d1ff0b0cc51c31cae89689b2ad2f4b35f29531d8) by [@dryganets](https://github.com/dryganets)) - -#### iOS specific fixes - -- Fix RCTNetInfo first time connection status ([e7e63fd409](https://github.com/facebook/react-native/commit/e7e63fd4092a81beec482fc48d05f1a048801037) by [@karanjthakkar](https://github.com/karanjthakkar)) - -### Removed: features that have been removed; these are breaking - -#### iOS specific removals - -- Removing development team from Xcode project ([8103c431c8](https://github.com/facebook/react-native/commit/8103c431c897c02d47cfad1e71bb2e6ddaabbdc0) by [@hramos](https://github.com/hramos)) - -## v0.57.0 - -Welcome to the 0.57 release of React Native! This release addresses a number of issues and has some exciting improvements. We again skipped a monthly release, focused on quality by extending the release candidate phase, and let some upstream packages reach stable for inclusion. - -This release includes [599 commits by 73 different contributors](https://github.com/facebook/react-native/compare/0.56-stable...0.57-stable)! In response to feedback, we've prepared a changelog that contains only user-impacting changes. Please share your input and let us know how we can make this even more useful, and as always [let us know](https://github.com/react-native-community/react-native-releases/issues/34) if you have any feedback on this process. - -### Highlights - -#### New features - -- Accessibility APIs now support accessibility hints, inverted colors, and easier usage of defining the element's role and states; read more at [@ziqichen6's excellent blog post](https://reactnative.dev/blog/2018/08/13/react-native-accessibility-updates) -- On iOS, `WKWebView` can now be used within the `WebView` component; read more at [@rsnara's awesome blog post](https://reactnative.dev/blog/2018/08/27/wkwebview) -- Better support for out-of-tree platforms. For details, please refer to [the discussion](https://github.com/react-native-community/discussions-and-proposals/issues/21) that the community used to get this up and running (there will be a new page in the docs dedicated to it too) - huge props to @empyrical for working on this! - -#### Tooling updates - -- Android tooling has been updated to match newer configuration requirements (SDK 27, gradle 4.4, and support library 27); building with Android plugin 3.2 doesn't work due to the gradle scripts, so **please** stay on Android Studio 3.1 for now -- Support Babel 7 stable landed! Be sure to read [here](https://blogs.msdn.microsoft.com/typescript/2018/08/27/typescript-and-babel-7/) about using TypeScript and check out the [Babel 7 migration guide](https://babeljs.io/docs/en/next/v7-migration) for help migrating. -- Metro has been upgraded (with Babel 7 and better transformer support), and in the next major release we plan on having two new features (ram bundles and inline requires) optional for you all to use - you can read how it will happen [here](https://github.com/react-native-community/discussions-and-proposals/blob/master/core-meetings/2018-09-metro-meeting.md); moreover, if you have a custom packager config, we recommend you read also the "updating to this version" section. -- Flow, React, and related packages have also been updated; this includes [working support](https://github.com/facebook/react-native/commit/5491c3f942430982ce9cb6140ed1733879ed3d1d) for the [React Profiler](https://react.dev/blog/2018/09/10/introducing-the-react-profiler.html). - -#### The Slimmening is happening - -As mentioned a few times in the past, the core team is reviewing the repository to trim it to the base React Native features in order to make the whole ecosystem more maintainable (by using a _divide-et-impera_ approach, the community will move faster and enable pull requests to be reviewed and merged quicker). This change requires extracting some components into their own separate repos and removing old, unused code ([details here](https://github.com/react-native-community/discussions-and-proposals/issues/6)). - -0.57 is **not** directly affected by any changes, but we want you to know that: - -- `WebView` will be moved to its own repo at [react-native-community/react-native-webview](https://github.com/react-native-community/react-native-webview). There is already a base implementation there. Help us out by giving that a try, and expect that `WebView` will be deprecated soon -- `NavigatorIOS` will be **fully** removed from the main codebase starting 0.58.0 (via [this commit](https://github.com/facebook/react-native/commit/0df92afc1caf96100013935d50bdde359b688658)); it is now deprecated - -### Updating to this version - -1. Upgrade the version of React Native in the `package.json` from `0.56.0` to `0.57.0`, and the React version to `16.5` -2. Change the babel-preset dependency from `"babel-preset-react-native": "^5",` to `"metro-react-native-babel-preset": "^0.45.0",`, then change the `.babelrc` configuration to: - - ```JSON - { - "presets": ["module:metro-react-native-babel-preset"] - } - ``` - -3. Ensure that you have all the babel dependencies to version `^7.0.0` (you may also need to add `"babel-core": "7.0.0-bridge.0"` as a yarn resolution to ensure retro-compatibility). The Babel team has released a tool, [babel-upgrade](https://github.com/babel/babel-upgrade), that should help you in this migration. -4. Upgrading android gradle version to 4.4 - 1. In your project's `android/gradle/wrapper/gradle-wrapper.properties` file, change the `distributionUrl` to `https\://services.gradle.org/distributions/gradle-4.4-all.zip` - 2. In `android/build.gradle` file add `google()` right above `jcenter()` in both `buildscript` and `allprojects` repositories. Then change Android build tools to version 3.1.4 `classpath 'com.android.tools.build:gradle:3.1.4'` - 3. In `android/app/build.gradle` file update all your `compile` statements to be `implementation`, e.g. `implementation 'com.facebook.fresco:animated-gif:1.10.0'` - 4. Do note that when running your app from within Android Studio, you may encounter `Missing Byte Code` errors. This is due to [a known issue](https://issuetracker.google.com/issues/72811718) with version 3.1.x of the android tools plugin. You'll need to disable Instant Run to get past this error. -5. If you have a custom packager configuration via `rn-cli.config.js`, you probably need to update it to work with the updated Metro configuration structure (for full detail refer to Metro's [documentation](https://facebook.github.io/metro/docs/en/configuration)); here are some commonly encountered changes to `rn-cli.config.js`: - - ```diff - -const blacklist = require('metro/src/blacklist') - +const blacklist = require('metro-config/src/defaults/blacklist') - - // ... - - module.exports = { - + watchFolders: alternateRoots, - + resolver: { - + blacklistRE: blacklist - + }, - + transformer: { - + babelTransformerPath: require.resolve('./scripts/transformer.js'), - + }, - - getProjectRoots() { - - return [ - - path.resolve(__dirname), - - ].concat(alternateRoots) - - }, - - getBlacklistRE() { - - return blacklist; - - }, - - transformModulePath: require.resolve('./scripts/transformer.js'), - } - ``` - -6. Run `yarn` to ensure that all the new dependencies have been installed - -### Added: new features - -- Add .nvmrc and ensure node version required is compatible with ESLint 5 ([30b9d81087](https://github.com/facebook/react-native/commit/30b9d81087cb86f5fb272d00bfee63a0632009f5) by [@slorber](https://github.com/slorber)) -- Major improvements to accessibility features ([48b3d1322b](https://github.com/facebook/react-native/commit/48b3d1322b884f62eb5aeb36136bcd76c502e42d), [b5b704dc19](https://github.com/facebook/react-native/commit/b5b704dc19b80a1909d66adcd617220a98c7aace), [c36e8b3307](https://github.com/facebook/react-native/commit/c36e8b3307295690cddf74e3a41ca0ac11ac4c6b), [40f6998b67](https://github.com/facebook/react-native/commit/40f6998b6766e8aa3c038a1416e5c62cbafca109), [c1d0ccde0f](https://github.com/facebook/react-native/commit/c1d0ccde0f6f8615fce077ef7ee0867a14ca0fb7), [5eaa2d29c0](https://github.com/facebook/react-native/commit/5eaa2d29c0c4c633a40f7241408737c754edea84), [10b603fdd3](https://github.com/facebook/react-native/commit/10b603fdd34919f72304720c25d1420668a6213a), [d9eeae91a0](https://github.com/facebook/react-native/commit/d9eeae91a08123c3a458704869acd6f637fc4c53), [3cfa7ae698](https://github.com/facebook/react-native/commit/3cfa7ae69847cc3b687930346016b248f2427864), [5acb7211bb](https://github.com/facebook/react-native/commit/5acb7211bb211e0ef48334630ddccbb3f0ffa2da), [5741f77156](https://github.com/facebook/react-native/commit/5741f771562962110e105114a2c65def4baa805b), [d0b86ecb4f](https://github.com/facebook/react-native/commit/d0b86ecb4f33d6b10a99062f050a4d659db4ddfc), [e739143809](https://github.com/facebook/react-native/commit/e7391438093cd5dd5033204cdce62e66509e66e1), [c27b495a89](https://github.com/facebook/react-native/commit/c27b495a89e71ff13959eb4c34605a527514fa1e), [5aa040dfb7](https://github.com/facebook/react-native/commit/5aa040dfb780c09a6efa5d3072232dea775d432f), [03036f79f7](https://github.com/facebook/react-native/commit/03036f79f7b062ae11015b33cca3dd7e4e67dda6), [3bedc78a35](https://github.com/facebook/react-native/commit/3bedc78a35b9efc259299744f4134ac0e880d1ea), [ca01290d8e](https://github.com/facebook/react-native/commit/ca01290d8e8fe73494f317ed9f81d339e65fdea0), [121e2e5ca6](https://github.com/facebook/react-native/commit/121e2e5ca6cdb17051c6d8072072f7f480ac2015), [1bc52267f5](https://github.com/facebook/react-native/commit/1bc52267f504eb02c8744c380fa2de878b0ab79f), [48b3d1322b](https://github.com/facebook/react-native/commit/48b3d1322b884f62eb5aeb36136bcd76c502e42d), [ef3d8b23c3](https://github.com/facebook/react-native/commit/ef3d8b23c35246d4e088d532c41723e06b688f1b), [ef3d8b23c3](https://github.com/facebook/react-native/commit/ef3d8b23c35246d4e088d532c41723e06b688f1b), [50e400128e](https://github.com/facebook/react-native/commit/50e400128eba554af5de4ca267430524e3eff107), and [f39d0923c7](https://github.com/facebook/react-native/commit/f39d0923c78686118a5d268c0e659d2608d28df0) by [@ziqichen6](https://github.com/ziqichen6)) -- Add `YogaNodeProperties` implementation based on `ByteBuffer` ([0c97e75dfe](https://github.com/facebook/react-native/commit/0c97e75dfeec831abb6cb39889309d8299cdce9f) and [23657ccf5b](https://github.com/facebook/react-native/commit/23657ccf5bcab6c511903660b3c617c3b8248f20) by [@davidaurelio](https://github.com/davidaurelio)) -- Add `FlatList` and `SectionList` to Animated exports ([daa7c78055](https://github.com/facebook/react-native/commit/daa7c78055857cd2d9ea650de0c4b0f72d3f2acf) by [@yunyu](https://github.com/yunyu)) -- Adding new styling props to `FlatList`/`VirtualizedList` for `ListHeaderComponent` and `ListFooterComponent` ([a2675ced4e](https://github.com/facebook/react-native/commit/a2675ced4efe0df7745bf38908efa41d4d7a9841)) -- Added more info to Module Registry systraces ([c7fdd2701f](https://github.com/facebook/react-native/commit/c7fdd2701f7edc1a771a04c890da4d742dca6ffb) by [@axe-fb](https://github.com/axe-fb)) -- Added support for out-of-tree platform plugins via a new `haste` field in `package.json`; read more in the [docs entry](https://reactnative.dev/docs/out-of-tree-platforms) ([03476a225e](https://github.com/facebook/react-native/commit/03476a225e012a0285650780430d64fc79674f0f) by [@empyrical](https://github.com/empyrical)) -- Added `snapToOffsets` to `ScrollView` and made a number of fixes to `snapToInterval` as well ([fd744dd56c](https://github.com/facebook/react-native/commit/fd744dd56ca183933a67e8398e1d20da14a31aab) by [@olegbl](https://github.com/olegbl)) - -#### Android specific additions - -- Allow registering custom packager command handlers ([b3ef1c3a56](https://github.com/facebook/react-native/commit/b3ef1c3a5645793ef42d25bb16ef023a743a1f9f) by [@fkgozali](https://github.com/fkgozali)) -- Implement `AccessibilityInfo.setAccessibilityFocus` for Android ([be715ec705](https://github.com/facebook/react-native/commit/be715ec7053a77fa6c9087990a493d17c1155de2) by [@draperunner](https://github.com/draperunner)) -- Add Support for `overflow` style property ([b81c8b51fc](https://github.com/facebook/react-native/commit/b81c8b51fc6fe3c2dece72e3fe500e175613c5d4) and [bbdc12eda7](https://github.com/facebook/react-native/commit/bbdc12eda7dec135799b7f4c41fe678180970dd2)by [@yungsters](https://github.com/yungsters)) - -#### iOS specific additions - -- `WebView` can now use `WKWebView` internally if you pass `useWebKit={true}` ([7062e5bdb5](https://github.com/facebook/react-native/commit/7062e5bdb5582bb21d1ef890965f08cc20d292b7), [1442c265da](https://github.com/facebook/react-native/commit/1442c265da36601114ce184cd5bc322f45dc1b44), [3703927e7e](https://github.com/facebook/react-native/commit/3703927e7e12ffc8922644ea251cd6f7a384570c), [7a6dd9807c](https://github.com/facebook/react-native/commit/7a6dd9807cda45c2d60641864f2d6c8d401e8ae3), [e5f95aba9b](https://github.com/facebook/react-native/commit/e5f95aba9b23376de498456282ad17113ef44cd9), [1741fe9571](https://github.com/facebook/react-native/commit/1741fe95710556f30dc2442aaaae23e31dad4cc0), [90e85a4adc](https://github.com/facebook/react-native/commit/90e85a4adc749666f81034119f281ac54840e7df), [0022354525](https://github.com/facebook/react-native/commit/0022354525eae0a368704da65c9d0f85f33ba5fb), [03b57d9db6](https://github.com/facebook/react-native/commit/03b57d9db6509fa3e715f23c8270caf6ca091acd), [1584108805](https://github.com/facebook/react-native/commit/1584108805ca6c8eff7a77e15c8553028665b53f), [a997c0ac16](https://github.com/facebook/react-native/commit/a997c0ac16d8863333d057269a8b5e28994b84eb), [4ca949b46e](https://github.com/facebook/react-native/commit/4ca949b46ec8fd72b5305daa06fac3ef58a8fa5f), [721763020a](https://github.com/facebook/react-native/commit/721763020a4a7b4b3cad1a9c074ec2e51a8d840b), [1af17f1648](https://github.com/facebook/react-native/commit/1af17f164828b6d6fa0450af46baf945745363e7), [215fa14efc](https://github.com/facebook/react-native/commit/215fa14efc2a817c7e038075163491c8d21526fd), [bacfd92976](https://github.com/facebook/react-native/commit/bacfd9297657569006bab2b1f024ad1f289b1b27), [95801f1eda](https://github.com/facebook/react-native/commit/95801f1eda2d723d9b87760d88fa9f1a1bb33ab1), [b18fddadfe](https://github.com/facebook/react-native/commit/b18fddadfeae5512690a0a059a4fa80c864f43a3), [28b058c341](https://github.com/facebook/react-native/commit/28b058c341690bd35e1d59885762ec29614a3d45), and [78fcf7c559](https://github.com/facebook/react-native/commit/78fcf7c5598ce7f5d0d62110eb34fe5a4b962e71) by [@rsnara](https://github.com/rsnara)) -- Add `accessibilityHint` for iOS ([253b29dbd8](https://github.com/facebook/react-native/commit/253b29dbd8ddb11824866e423c00a4a68bb856f3) by [@draperunner](https://github.com/draperunner)) - -### Changes: existing functionality that is now different - -- _[BREAKING]_ In the CLI, `unbundle` is now `ram-bundle` ([ebf5aeab28](https://github.com/facebook/react-native/commit/ebf5aeab280f2ebc439ec39d25c48fdf1980cf73) by [@jeanlauliac](https://github.com/jeanlauliac)) -- Bump minimum Node version to 8.3 (#20236) ([e64e13fce3](https://github.com/facebook/react-native/commit/e64e13fce394332ce609f0def35fa573f30138e9) by [@hramos](https://github.com/hramos)) -- Updated React ([70913a4623](https://github.com/facebook/react-native/commit/70913a4623c53db8a0db578eec30cad8671f8319), [b7bb25fe4c](https://github.com/facebook/react-native/commit/b7bb25fe4c1bfbedb5b8c75725721cf901dc54b0), and [672528ffde](https://github.com/facebook/react-native/commit/672528ffde3b467ccdfd6b1ce0352f150b20c922) by [@acdlite](https://github.com/acdlite), [@hramos](https://github.com/hramos), and [@yungsters](https://github.com/yungsters)) -- Upgrade Flow to v0.76.0 ([eac34e3021](https://github.com/facebook/react-native/commit/eac34e30215d88b5fe9056f9678275b894032636) by [@gabelevi](https://github.com/gabelevi)) -- Upgrade jest to 23.4.1 ([51cf9eb3e8](https://github.com/facebook/react-native/commit/51cf9eb3e823a13304570b352b81734f069c18c3) by [@rafeca](https://github.com/rafeca)) -- Upgrade babel-eslint to v9.0.0-beta.2 with better support for Flow ([abf1188de2](https://github.com/facebook/react-native/commit/abf1188de225e4b7d36ecbad316af92ca29c85c2) by [@rubennorte](https://github.com/rubennorte)) -- Upgrade ESLint to 5.1.0 ([0f2f0cad41](https://github.com/facebook/react-native/commit/0f2f0cad41f632d1dbb0c676d5edea5db62eb01c) by [@rubennorte](https://github.com/rubennorte)) -- Upgrade Babel to v7.0.0 ([b9d1c832b0](https://github.com/facebook/react-native/commit/b9d1c832b0bb7161bcec48d655e878af609b8350), [724c7498b6](https://github.com/facebook/react-native/commit/724c7498b6f10f6fd03eb217160508001fb1c5b3) by Peter van der Zee, and [bf8e1b4ffa](https://github.com/facebook/react-native/commit/bf8e1b4ffab4958587efdf3ce97e4ebdd887a20c) by [@rubennorte](https://github.com/rubennorte) and [@rafeca](https://github.com/rafeca)) -- Metro is now at v0.45.0 ([169d6839bb](https://github.com/facebook/react-native/commit/169d6839bb32d0149036ab1641d13318c0eb6f9d), [bda84a32d0](https://github.com/facebook/react-native/commit/bda84a32d08d6de3849d6afac4cbbf309837b676), [877212e18c](https://github.com/facebook/react-native/commit/877212e18c86905feda9faa1b2508c0c39396227), [169812f9ce](https://github.com/facebook/react-native/commit/169812f9ce60317dd7320384007879be16278678), [cfeb60c19b](https://github.com/facebook/react-native/commit/cfeb60c19bd23e683f1809f6535439c81e8ed166) by [@CompuIves](https://github.com/CompuIves) and [@rafeca](https://github.com/rafeca)) -- Hide pre-bundled notification when not on dev mode ([edf71005b5](https://github.com/facebook/react-native/commit/edf71005b5a4d7cfb09eae14f5765d30b9c5704e) by [@yancouto](https://github.com/yancouto)) -- Refined `StyleSheet.compose` Flow Type ([50a481d23a](https://github.com/facebook/react-native/commit/50a481d23ae72a434849d2c85007e411b0c2bb1f) by [@yungsters](https://github.com/yungsters)) -- Catch JS bundle load failure and prevent calls to JS after that ([201ba8c69d](https://github.com/facebook/react-native/commit/201ba8c69d2defc284a04acadcd13df001028ada) by [@fkgozali](https://github.com/fkgozali)) -- Use new Metro configuration in react-native cli ([a32620dc3b](https://github.com/facebook/react-native/commit/a32620dc3b7a0ebd53feeaf7794051705d80f49e) and [aaf797ad67](https://github.com/facebook/react-native/commit/aaf797ad67b965f64450b199c554c65ad8dad351) by [@CompuIves](https://github.com/CompuIves)) -- Whitelist `react-native-dom` in haste/cli config defaults ([c4bcca6685](https://github.com/facebook/react-native/commit/c4bcca66853cd231486de61f11cbcec42427b7b2) by [@vincentriemer](https://github.com/vincentriemer)) -- In the CLI, don't override `metro.config.js` settings ([c5297c75cb](https://github.com/facebook/react-native/commit/c5297c75cb6da58a241c8f91b0d2fefbc5835a46) by [@rozele](https://github.com/rozele)) - -#### Breaking Changes - -- Public methods of Image (`blur`, `focus`, `measure`, `measureInWindow`, `measureLayout`, `setNativeProps`) are no longer bound to the image component instance. Therefore, it is unsafe to pass these methods by reference (i.e: as callbacks) to functions. So, things like `setTimeout(this._imgRef.focus, 1000)` will no longer work. Please instead do: `setTimout(() => this._imgRef.focus(), 1000)`. - -#### Android specific changes - -- `Image` source without a uri now returns null ([28c7ccf785](https://github.com/facebook/react-native/commit/28c7ccf785132458fce32c234ce777a6fe475c93) by [@himabindugadupudi](https://github.com/himabindugadupudi)) -- `targetSdkVersion` is 26 ([bfb68c09ee](https://github.com/facebook/react-native/commit/bfb68c09ee88c6e1d91d3b54c01746f9a98c7c6c) by [@dulmandakh](https://github.com/dulmandakh)) -- Upgrade NDK to r17b ([6117a6c720](https://github.com/facebook/react-native/commit/6117a6c7205c969f93d39ba02e0583881572d5fa) by [@dulmandakh](https://github.com/dulmandakh)) -- Upgrade NDK toolchain to 4.9 ([ccdd450b12](https://github.com/facebook/react-native/commit/ccdd450b1284b73bee80a9709c864816cbfc1108) by [@dulmandakh](https://github.com/dulmandakh)) -- Upgrade Android Support Library to version 27.1.1 and set compileSdkVersion to 27; buildToolsVersion comes along for the ride, too ([874cca1ac2](https://github.com/facebook/react-native/commit/874cca1ac258ec224bade999722d7a34c307def0) and [044b399e65](https://github.com/facebook/react-native/commit/044b399e6590d84065a9b186750f77bc9d851aac) by [@dulmandakh](https://github.com/dulmandakh)) -- Upgrade Android gradle plugin to 3.1.4, Gradle wrapper to 4.4 ([6e356895e7](https://github.com/facebook/react-native/commit/6e356895e79fb92640295a14483af1a430732247) and [33d20da41b](https://github.com/facebook/react-native/commit/33d20da41b814a2fb9ba02cbab8b61a819cad95b) by [@gengjiawen](https://github.com/gengjiawen) and [@dulmandakh](https://github.com/dulmandakh)) -- Upgrade to soloader 0.5.1 ([b6f2aad9c0](https://github.com/facebook/react-native/commit/b6f2aad9c0119d11e52978ff3fa9c6f269f04a14) by [@gengjiawen](https://github.com/gengjiawen)) -- Upgrade mockito to 2.19.1 ([3ea803a814](https://github.com/facebook/react-native/commit/3ea803a814f43edb3ec256dd85d778c652ca99d1) by [@dulmandakh](https://github.com/dulmandakh)) -- Upgrade glog to 0.3.5 ([b5fca80605](https://github.com/facebook/react-native/commit/b5fca806059e628edb504cb1bacf62e89ee6f102) by [@dulmandakh](https://github.com/dulmandakh)) - -### Fixed: bugs that have been resolved - -- Fixed builds on Windows machines ([3ac86c366c](https://github.com/facebook/react-native/commit/3ac86c366c91f8d62f0128057019b94a783b4249) by [@rafeca](https://github.com/rafeca)) -- Fixed building tvOS ([1f1ddd0261](https://github.com/facebook/react-native/commit/1f1ddd0261762bdeff3e747250400b208b18839b)) -- Fixed `TextInputState`'s `currentlyFocusedField()` ([b4b594cec1](https://github.com/facebook/react-native/commit/b4b594cec1d91c38faac11a90a787ae692e35296) by [@janicduplessis](https://github.com/janicduplessis)) -- `` fix for jumpy content when `initialScrollIndex` specified ([e0c73633cf](https://github.com/facebook/react-native/commit/e0c73633cfc0a62df9d39991b0df65fa5875609a) by [@rbrosboel](https://github.com/rbrosboel)) -- Fix local-cli assetRegistryPath and middlewares ([f05943de0a](https://github.com/facebook/react-native/commit/f05943de0abfc16da41163c6b91a04ecc8de8e67) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix issue with when all are `flexGrow` and `flexShrink` set to 0 except for one ([90a408ea6f](https://github.com/facebook/react-native/commit/90a408ea6ff7833e33b4058f490073e04460d00b) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) -- Fix react-native CLI's debugger UI path and metro host/port arg usage ([5067540487](https://github.com/facebook/react-native/commit/50675404873c1ffac0deedc51fe745168051148b) by [@Kureev](https://github.com/Kureev)) -- Hotfix to include `react-native-windows` in hasteImpl accepted paths ([54942746d4](https://github.com/facebook/react-native/commit/54942746d4037e1153e14fcfc95e4edc772d296a) by [@rubennorte](https://github.com/rubennorte)) -- Fix some classes of incorrect Flow errors for `Animated` ([db2159d0b3](https://github.com/facebook/react-native/commit/db2159d0b3fd57556383eff68d32d32246dd9081) by [@yunyu](https://github.com/yunyu)) -- Fixed a typo in DockerTests.md ([c1831d50cf](https://github.com/facebook/react-native/commit/c1831d50cfd35b7a7393e50bc71d8389b36021ce) by [@kant](https://github.com/kant)) -- Fix invalid use of destructuring in jest preprocessor ([9d5bd50737](https://github.com/facebook/react-native/commit/9d5bd507372c7b63e59a94383c3e3091d96409de) by [@umairda](https://github.com/umairda)) -- Fixed a CLI crash when using old versions of node ([e61176d650](https://github.com/facebook/react-native/commit/e61176d650e2b5fe51dd6cd4c429ff47a1a9b1dc) by [@keksipurkki](https://github.com/keksipurkki)) - -#### Android specific fixes - -- Fix issue with AsyncStorage not behaving properly on Android 7+ ([1b09bd7fba](https://github.com/facebook/react-native/commit/1b09bd7fba92431d63d2cecb83565491e91db396)) -- Fixed extreme `` slowness ([5017b86b52](https://github.com/facebook/react-native/commit/5017b86b525e3ef6023f0f8a88e6fd1cf98024e0) by [@gnprice](https://github.com/gnprice)) -- Fixed `` placeholder not being completely visible ([84022321c4](https://github.com/facebook/react-native/commit/84022321c437e597660ecd8a773e51bdf8855f4e) and [86f24ccf71](https://github.com/facebook/react-native/commit/86f24ccf71f4c41904838c8c7e13268c300fd745) by [@jainkuniya](https://github.com/jainkuniya)) -- Fix Horizontal ``'s scroll position during layout changes with RTL content ([de573277bf](https://github.com/facebook/react-native/commit/de573277bf64703aefdeb52db2c2524b2c241bab)) -- Fix Horizontal `` overflow issue ([d5465a9a0a](https://github.com/facebook/react-native/commit/d5465a9a0a840f7e759bb8fb6679b01017eb3d05)) -- Fixing crash on SDK 15 on ReactTextInputLocalData ([1bb2bead8b](https://github.com/facebook/react-native/commit/1bb2bead8bef850037c8b72209cd72a442572821)) -- Fix Drawing Rect for ReactScrollView ([6a16bec882](https://github.com/facebook/react-native/commit/6a16bec882cba809bdf9027367b76f6543b6617d) by [@yungsters](https://github.com/yungsters)) -- Fixed NoSuchKeyException Thrown From ReadableNativeMap bysafely unwrapping ReadableMap by defaulting to 0 if key not present ([1a6666a116](https://github.com/facebook/react-native/commit/1a6666a116fd8b9e8637956de2b41a1c315dd470) by [@Bhavik-P](https://github.com/Bhavik-P)) -- Fixed runAndroid to enable the use of a package on port <> 8081 for Windows ([3cd0737fe2](https://github.com/facebook/react-native/commit/3cd0737fe2dce9df29822854bfbfaf2f22346c69) by [@ihenshaw](https://github.com/ihenshaw)) -- Don't crash on upload retry when trying to fetch on a varying quality network ([79fe925f1d](https://github.com/facebook/react-native/commit/79fe925f1daa053d5a5d92a228e5c7beff565ab4) by [@dryganets](https://github.com/dryganets)) - -#### iOS specific fixes - -- Fix `TextInput.clear()` and `TextInput.setNativeProps({text: ''})` to work ([2307ea60d0](https://github.com/facebook/react-native/commit/2307ea60d03edd234511bfe32474c453f30c1693) by [@magicien](https://github.com/magicien)) -- Correct fishhook import in RCTReconnectingWebSocket ([75a0273de2](https://github.com/facebook/react-native/commit/75a0273de21948b0b959263100f09111f738ec35)) -- Change in RCTImagePickerManager to handle crashes if height/width is nil ([82af7c989b](https://github.com/facebook/react-native/commit/82af7c989be42a516f438f162d21f699be297e79) by [@abhi06276](https://github.com/abhi06276)) -- Fix controlled `` on iOS when inputting in Chinese/Japanese ([892212bad2](https://github.com/facebook/react-native/commit/892212bad2daadd373f4be241e4cd9889b0a1005) by [@mmmulani](https://github.com/mmmulani)) -- Fixed `` bug encountered with brownfield apps ([fab5fffbb3](https://github.com/facebook/react-native/commit/fab5fffbb3eb8668c9202dec5e770330d49880b0) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- Fixed missing selection indicator lines on `` ([e592d6f8c7](https://github.com/facebook/react-native/commit/e592d6f8c7b0409ab6f0a2dbf6ebe3cea28c3e79) by [@VSchlattinger](https://github.com/VSchlattinger)) -- Fix crash in RCTImagePicker on iOS ([934c50fbe0](https://github.com/facebook/react-native/commit/934c50fbe07e49391ba27c3469f99bec65e48d39) by [@mmmulani](https://github.com/mmmulani)) -- Fix `undefined_arch` error received when building in Xcode 10 beta ([e131fffb37](https://github.com/facebook/react-native/commit/e131fffb37a545363daf11735a0243165b57f63f) by [@futuun](https://github.com/futuun)) -- Add support for connecting to the Packager when running the iOS app on device when using custom Debug configuration ([079bf3f206](https://github.com/facebook/react-native/commit/079bf3f2067cb268b60e75cd9e1bc51a9c85359c)) -- Fixed RCTAnimation import for integrating with cocoapods ([eef8d47a37](https://github.com/facebook/react-native/commit/eef8d47a37211bf7d4978db75df1fedd9cacbde8) by [@LukeDurrant](https://github.com/LukeDurrant)) - -### Removed: features that have been removed; these are breaking - -- _[BREAKING]_ Removed `ScrollView.propTypes`; use flow or typescript for verifying correct prop usage instead ([5b6ff01764](https://github.com/facebook/react-native/commit/5b6ff01764502c88848867c7e04cab969da384a2) by [@sahrens](https://github.com/sahrens)) - -#### Android specific removals - -- `ReactInstancePackage` is now deprecated; use `@link ReactPackage` or `@link LazyReactPackage` ([b938cd524a](https://github.com/facebook/react-native/commit/b938cd524a20c239a5d67e4a1150cd19e00e45ba) by [@axe-fb](https://github.com/axe-fb)) - -## v0.56.0 - -Welcome to the June 2018 release of React Native! -Over 60 contributors made [821 commits](https://github.com/facebook/react-native/compare/0.55-stable...0.56-stable) since March - and we are extremely grateful to every single one of you. - -As you'll see in a second, this new version has some important **breaking changes** that required a lot of extra efforts to bring to a stable 0.56. This was the main reason behind skipping April and May from the monthly release cycle, but looking forward we are planning on going back to do a rollout every month. - -### Highlights - -#### React Native now uses **Babel 7** - -When upgrading to 0.56, make sure to bump your `babel-preset-react-native` `package.json` dependency to `5.0.2` or newer (but still as _fixed_ value). - -React Native library authors will need to update their libraries to make use of the updated Babel preset as Babel 7 is **not** backwards compatible. - -If you have issues upgrading to Babel 7, please double check the [related documentation](https://new.babeljs.io/docs/en/next/v7-migration.html#versioning-dependencies-blog-2017-12-27-nearing-the-70-releasehtml-peer-dependencies-integrations), in particular the sections related to _Package Renames_ and _Scoped Packages_. - -The [`babel-bridge`](https://github.com/babel/babel-bridge) library may be used if you need to use libraries that have not yet upgraded to Babel 7. You may also enforce the Babel 7 dependency via tools like [yarn resolutions](https://yarnpkg.com/lang/en/docs/selective-version-resolutions/). Overall, you need to ensure all the `@babel/*` deps are fixed at version `7.0.0-beta.47`. - -#### **Node 8** is now the minimum required version - -Trailing commas are now allowed. - -#### **iOS 9** is now the minimum required version - -Any device that can run iOS 8, can upgrade to iOS 9. Developers who support iOS 8 in their apps may continue doing so as this is a Xcode-level setting (`IPHONEOS_DEPLOYMENT_TARGET`). - -#### **Xcode 9** is now the minimum required version - -We recommend using Xcode 9.4 as that is what we use to run our tests. - -#### **Android** projects are now compiled using the _Android 26 SDK_ - -The target API level is left unchanged in this release. - -Starting August 2018, new apps submitted to the Play Store will need to target API 26 as a minimum. You can now opt your project in to use API 26 (or newer) as the target. Please let us know about any issues, as we'd like to finalize support for Android API 26 by the time `0.57.0` is released. - -#### `WebView` will only load http(s) URLs by default - -Geolocation is disabled by default. - -#### Consistently Throw for `` - -Removes a pitfall that people may run into when releasing an app for Android if the bulk of the testing has been performed on iOS only. Nesting a `` within a `` component (e.g. ``) is unsupported on Android, but using this pattern on iOS has not thrown errors in the past. With this release, nesting a `` inside a `` will now throw an error on iOS in order to reduce the parity gap between the platforms. - -#### Flow improvements, migrating away from PropTypes - -Added Flow types for several components. - -We're migrating away from PropTypes and runtime checks and instead relying on **Flow**. You'll notice many improvements related to Flow in this release. - -- Fix project settings warnings on newer Xcode versions, remove unnecessary console logging. -- Modernized `YellowBox`. - Sort warnings by recency, group warnings by format string, present stack traces, show status of loading source maps, support inspecting each occurrence of a warning, and bug fixes. -- Prettier files! -- Lots of bug fixes. - -#### State of React Native - -Heads-up: the Facebook internal team is [currently working on a rewrite of some core architecture pieces](https://reactnative.dev/blog/2018/06/14/state-of-react-native-2018). This is a **work in progress** and we do not expect it to be ready for use in open source quite yet, but we felt the need to let you know what those commits mentioning Fabric are about. - ---- - -### Added: new features - -- Update `babelHelpers` with Babel 7 support ([fbd1beaf66](https://github.com/facebook/react-native/commit/fbd1beaf666be9c09a380784f8c0cd34ba083a6b)) -- `FlatList` is now Strict Mode compliant ([a90d0e3614](https://github.com/facebook/react-native/commit/a90d0e3614c467c33cf85bcbe65be71903d5aecc)) -- Enable `?.` optional chaining operator plugins ([aa6f394c42](https://github.com/facebook/react-native/commit/aa6f394c4236e5a4998c3be8ed61ec1bab950775)) -- Support `flexWrap: 'wrap-reverse'` ([d69e55060f](https://github.com/facebook/react-native/commit/d69e55060fd76d91eccc45905d250a9fce4b2c49)) -- Add prop type `accessibilityTraits` to `Text` ([654435d1ed](https://github.com/facebook/react-native/commit/654435d1ed9e584e65fff601e1fa50591e042664)) -- Add devDependencies support for templates ([c4ab03a18e](https://github.com/facebook/react-native/commit/c4ab03a18e75e6ed55444b5d86f3ceee435b9a78)) -- Add support for springDamping in `SpringInterpolator` ([1dde989919](https://github.com/facebook/react-native/commit/1dde989919d2c272ca7fcaa5c4b2d9ee02c490a0)) - -#### Android specific additions - -- Add support for build.gradle with CRLF for use with `react-native link` ([843cfc3b20](https://github.com/facebook/react-native/commit/843cfc3b202433aad9a236b1b623da7c45e1ac15)) -- add decimal pad to android ([75e49a0637](https://github.com/facebook/react-native/commit/75e49a0637eaa3bd3bb7e445648f084a42d9c8af)) -- Add a way to dismiss PopupMenu elements ([353c070be9](https://github.com/facebook/react-native/commit/353c070be9e9a5528d2098db4df3f0dc02d758a9)) -- Implement `Image.defaultSource` ([b0fa3228a7](https://github.com/facebook/react-native/commit/b0fa3228a77d89d6736da6fcae5dd32f74f3052c)) -- Support Image resizeMode=repeat ([0459e4ffaa](https://github.com/facebook/react-native/commit/0459e4ffaadb161598ce1a5b14c08d49a9257c9c)) -- Yoga: Add back deprecated `getParent` methods for non-breaking API change ([c3c5c3cbce](https://github.com/facebook/react-native/commit/c3c5c3cbce24a31f73ae6339e377ee76ca6401ad)) - -#### iOS specific additions - -- Run tests using Xcode 9.4 and iOS 11.4 ([c55bcd6ea7](https://github.com/facebook/react-native/commit/c55bcd6ea729cdf57fc14a5478b7c2e3f6b2a94d)) -- Add support for Homebrew-installed Node ([0964135a17](https://github.com/facebook/react-native/commit/0964135a178b459e06b44a49a4ecb0dd6c5bec9b)) -- Add textTransform style support ([8621d4b797](https://github.com/facebook/react-native/commit/8621d4b79731e13a0c6e397abd93c193c6219000)) -- Add docs for Swift usage to `RCTBridgeModule.h` ([ca898f4367](https://github.com/facebook/react-native/commit/ca898f4367083e0943603521a41c48dec403e6c9)) - ---- - -### Changes: existing functionality that is now different - -- Upgrade React Native to Babel 7 ([f8d6b97140](https://github.com/facebook/react-native/commit/f8d6b97140cffe8d18b2558f94570c8d1b410d5c)) -- New projects created using `react-native init` will use Babel 7 ([e315ec9891](https://github.com/facebook/react-native/commit/e315ec9891eb0bcb51afb0e797dbd49aa8f9ac71)) -- Restrict `WebView` to only http(s) URLs: ([634e7e11e3](https://github.com/facebook/react-native/commit/634e7e11e3ad39e0b13bf20cc7722c0cfd3c3e28), [23f8f7aecb](https://github.com/facebook/react-native/commit/23f8f7aecb1f21f4f5e44fb9e4a7456ea97935c9)) -- Node 8 is now the minimum required version ([c1e6f27823](https://github.com/facebook/react-native/commit/c1e6f278237e84c8ed26d3d2eb45035f250e2d40)) -- Upgrade React to v16.4.1, sync React Renderer to revision ae14317 ([c749d951ad](https://github.com/facebook/react-native/commit/c749d951ada829c6f6fb76f35e68142e61054433)) -- Update new project template's Flow config to fix `Cannot resolve module X` isse due to removal of `@providesModule` ([843a433e87](https://github.com/facebook/react-native/commit/843a433e87b0ccaa64ab70d07e22bffbabad8045)) -- Upgrade Flow to v0.75 ([3bed272a62](https://github.com/facebook/react-native/commit/3bed272a620ac806a6142327013265ea8138641a), [bc2f12c68c](https://github.com/facebook/react-native/commit/bc2f12c68cf8cfdf8c060354e84392fd9a3645d8), [6264b6932a](https://github.com/facebook/react-native/commit/6264b6932a08e1cefd83c4536ff7839d91938730)) -- Upgrade Flow definitions ([f8b4850425](https://github.com/facebook/react-native/commit/f8b4850425f115c8a23dead7ec0716b61663aed6)) -- Upgrade Prettier to v1.13.6 ([29fb2a8e90](https://github.com/facebook/react-native/commit/29fb2a8e90fa3811f9485d4b89d9dbcfffea93a6), [bc2f12c68c](https://github.com/facebook/react-native/commit/bc2f12c68cf8cfdf8c060354e84392fd9a3645d8)) -- Upgrade Jest to v23.2.0 ([536c937269](https://github.com/facebook/react-native/commit/536c9372692712b12317e657fc3e4263ecc70164), [bc2f12c68c](https://github.com/facebook/react-native/commit/bc2f12c68cf8cfdf8c060354e84392fd9a3645d8)) -- Upgrade Metro to v0.38 ([d081f83a04](https://github.com/facebook/react-native/commit/d081f83a0487ffbc7d19f8edc7532611b359dfc6)) -- Modernized `YellowBox` ([d0219a0301](https://github.com/facebook/react-native/commit/d0219a0301e59e8b0ef75dbd786318d4b4619f4c)) -- Disallow requiring from invariant/warning ([521fb6d041](https://github.com/facebook/react-native/commit/521fb6d041167ec8a8d0e98ac606db1f27f0c5c8)) -- Remove native prop type validation ([8dc3ba0444](https://github.com/facebook/react-native/commit/8dc3ba0444c94d9bbb66295b5af885bff9b9cd34)) -- Add `$FlowFixMe` to invalid prop accesses where Flow wasn't complaining before ([f19ee28e7d](https://github.com/facebook/react-native/commit/f19ee28e7d896aaacf26c6f850230019bdef0d3d)) -- Create Flow props for `Image` ([8bac869f5d](https://github.com/facebook/react-native/commit/8bac869f5d1f2ef42e707d0ec817afc6ac98b3b2)) -- Flow type for `SegmentedControlIOS` ([113f009698](https://github.com/facebook/react-native/commit/113f009698dbd8f1b4c1048d77ff1eb373021083)) -- Flow type for `ProgressViewIOS` ([c87701ba05](https://github.com/facebook/react-native/commit/c87701ba05a8524756e87c089eb92c8f3c81823e)) -- Flow type for `PickerIOS` ([1c66cdc7e8](https://github.com/facebook/react-native/commit/1c66cdc7e8ce8190dfbef76629601497446b2b0a)) -- Flow type for `Switch` ([06052a2330](https://github.com/facebook/react-native/commit/06052a2330fc9c1dd0d56c6bbe5a17703f80c6b9)) -- Flow type for `Slider` ([cbe045a95f](https://github.com/facebook/react-native/commit/cbe045a95f1ca53d99ae521742a93299a53d6136)) -- Flow type for `RefreshControl` ([891dfc3da4](https://github.com/facebook/react-native/commit/891dfc3da4b5825097aedf73ff04e8982c00aeff)) -- Flow type for `ListView` ([4b1ecb6204](https://github.com/facebook/react-native/commit/4b1ecb62045fbb78764d1f51030f2253be705c5c)) -- Flow type for `TextInput` ([c8bcda8150](https://github.com/facebook/react-native/commit/c8bcda8150278fde07331ca6958976b2b3395688)) -- Flow type for `TouchableBounce` ([8454a36b0b](https://github.com/facebook/react-native/commit/8454a36b0bc54cb1e267bc264657cc693607da71)) -- Flow type for `TouchableOpacity` ([44743c07ad](https://github.com/facebook/react-native/commit/44743c07ad672e39668f92a801578906ec92996a)) -- Flow type for `TouchableHighlight` ([f0c18dc820](https://github.com/facebook/react-native/commit/f0c18dc820537892dcc33d5aebbf4f52cf299b95)) -- Flow type for `TouchableWithoutFeedback` ([0b79d1faa2](https://github.com/facebook/react-native/commit/0b79d1faa21eb3c29aeeba08ee0fb2ed62e6cc54)) -- Flow type for `ScrollView` ([b127662279](https://github.com/facebook/react-native/commit/b1276622791d5dbe4199bb075f473908c3e62b31)) -- Flow type for `DatePickerIOS` ([97e572ea6d](https://github.com/facebook/react-native/commit/97e572ea6d7b1fd829ca20f5d5c8ff970d88e68b)) -- Flow type for `KeyboardAvoidingView` ([188b118b60](https://github.com/facebook/react-native/commit/188b118b6075be1614c553596b85d430767f2dbc)) -- Flow type for `ActivityIndicator` ([0b71d1ddb0](https://github.com/facebook/react-native/commit/0b71d1ddb03c036ed118574c105b0af505da19fc)) -- Remove `$FlowFixMe` in `TouchableBounce` ([ffda017850](https://github.com/facebook/react-native/commit/ffda0178509ed92396f15db37a41d3d668ade4e6)) -- Remove `$FlowFixMe` in `ScrollView` ([af6e2eb02d](https://github.com/facebook/react-native/commit/af6e2eb02d3651f869b5436e68e61ef3ab3405a0)) -- Remove `$FlowFixMe` in `ListView` ([af6e2eb02d](https://github.com/facebook/react-native/commit/af6e2eb02d3651f869b5436e68e61ef3ab3405a0)) -- Remove `$FlowFixMe` in `Text` ([6042592cf4](https://github.com/facebook/react-native/commit/6042592cf46787f089e76b661376705380607207)) -- Remove `$FlowFixMe` in `RTLExample` ([206ef54aa4](https://github.com/facebook/react-native/commit/206ef54aa415e3e2bb0d48111104dfc372b97e0f)) -- Remove `$FlowFixMe` in `AppContainer` ([a956551af7](https://github.com/facebook/react-native/commit/a956551af73cf785ee4345e92e71fd5b17c5644e)) -- Remove `$FlowFixMe` in `Slider` ([1615f9d161](https://github.com/facebook/react-native/commit/1615f9d16149c7082ce0e1485aa04a6f2108f7ba)) -- `StyleSheet`: Support animated values for border dimensions ([3e3b10f404](https://github.com/facebook/react-native/commit/3e3b10f4044ada7b523d363afb614720468c217f)) -- Update `react-devtools-core` and `plist` to include security fixes reported by `npm audit` ([3a1d949906](https://github.com/facebook/react-native/commit/3a1d949906acb0c3b44d125d54d0c99305bbbb56)) -- Update `Switch` to ES6 Class ([970caa4552](https://github.com/facebook/react-native/commit/970caa4552d4ba87c1a954391535ff42b00832e7)) -- Update `Slider` to ES6 Class ([5259450c14](https://github.com/facebook/react-native/commit/5259450c143f71c65e157d6b7d3f0e1655eb7aa1)) -- Update `ActivityIndicator` to ES6 Class ([edd7acbb1e](https://github.com/facebook/react-native/commit/edd7acbb1e6fe185600a19cc1cbb38feb16c85ad)) -- Update `RefreshControl` to ES6 Class ([a35a238317](https://github.com/facebook/react-native/commit/a35a23831789030e17f766f72d307ae315be107d)) -- Update `KeyboardAvoidingView` to ES6 Class ([c017dcb0f2](https://github.com/facebook/react-native/commit/c017dcb0f2903b49b2f21cc150226aeb7f5026ee)) -- Update `DatePickerIOS` to ES6 Class ([f8c8231706](https://github.com/facebook/react-native/commit/f8c8231706492b588331354d45b833aa21434e13)) -- Update `Text` to ES6 Class ([ab92c00245](https://github.com/facebook/react-native/commit/ab92c00245c0ce717819ddb0ab8b9204d4c13c34)) -- Replace `context.isInAParentText` w/ `React.createContext` ([e1339bc183](https://github.com/facebook/react-native/commit/e1339bc18303ca5394cd0c9dc97cededb2261581)) -- Cleanup `Text` implementation ([06c05e744d](https://github.com/facebook/react-native/commit/06c05e744d8af9582bde348210f254d76dae48b9)) -- Switch `Text` to `React.forwardRef` ([e708010d18](https://github.com/facebook/react-native/commit/e708010d18f938e2d6b6424cfc9485d8e5dd2800)) -- Switch `View` to `React.forwardRef` ([3e534b9aab](https://github.com/facebook/react-native/commit/3e534b9aab5156adac67762877b2457408fe8934)) -- Update uses of `genMockFunction` and `genMockFn` to `fn` in tests ([390ded871c](https://github.com/facebook/react-native/commit/390ded871cb905d149e9c1f4a082e67a7ec7addb)) -- Make `ViewProps` exact ([65c336f38f](https://github.com/facebook/react-native/commit/65c336f38f4afd43c8b5f81745abf38bd9b8ddbf)) -- Spread `TVViewProps` into `ViewProps` instead of intersection ([bc658d3c44](https://github.com/facebook/react-native/commit/bc658d3c4405676643d952a126295dbc7fc26217)) -- Allow trailing commas ([1e2de71290](https://github.com/facebook/react-native/commit/1e2de712907e5fe0d17648f0ff5c81d4384ca85b)) -- Use `let`/`const` ([8f5ebe5952](https://github.com/facebook/react-native/commit/8f5ebe5952d0675b463137103a82f3fb0c26ae0d)) -- Refactor `MockNativeMethods` in Jest ([5d4c542c58](https://github.com/facebook/react-native/commit/5d4c542c58d84bbe05f76bf01d9efdd9d438572c)) -- Use app name from `app.json` after ejecting ([57774a4a98](https://github.com/facebook/react-native/commit/57774a4a981e2f12cfe9b029447e34f203221b18)) -- Suggest `git apply --reject` for failed upgrades ([4fbd244b9a](https://github.com/facebook/react-native/commit/4fbd244b9a6b62e0efe1b4b5a7ec3de468f020f6)) -- Moved `TouchHistoryMath` from React to React Native ([06085d3836](https://github.com/facebook/react-native/commit/06085d38366373f3135074dc14e2c9871ca4fe29)) -- Refactor `RCTInputAccessoryView` ([c136c54ff0](https://github.com/facebook/react-native/commit/c136c54ff0211e2bf149fab600cd6e295f9d19dd)) -- Don't wrap `ListEmptyComponent` in an extra view ([db061ea8c7](https://github.com/facebook/react-native/commit/db061ea8c7b78d7e9df4a450c9e7a24d9b2382b4)) -- Move `Text` PropTypes to its own file ([cd8128b2ec](https://github.com/facebook/react-native/commit/cd8128b2eccf6898cdf798a1e1be1f7a5762a0d4)) -- Mock `ReactNative.NativeComponent` native methods in Jest ([3e9a371ace](https://github.com/facebook/react-native/commit/3e9a371ace5f25b2eb7a0d30177251f8a0c10ed9)) -- Tightening types for `View` and `VirtualizedList` ([5035af80ec](https://github.com/facebook/react-native/commit/5035af80ecddb44e2a8444780f25f336b760bf32)) -- Make values optional in `ViewPropTypes` ([f1316cab6c](https://github.com/facebook/react-native/commit/f1316cab6c351852ef1da9939d4c8f0244fb8a6f)) -- propTypes are optional for native components ([dbdf43b428](https://github.com/facebook/react-native/commit/dbdf43b428da19a9eba012753904bcf33339ea9a)) -- Rename `Style` to `DangerouslyImpreciseStyle` ([4895c645ea](https://github.com/facebook/react-native/commit/4895c645ea17ff939811f3d5ec6218cd4e31c5fb)) -- _[BREAKING]_ `requireNativeComponent`'s signature has been simplified to only take extraOptions ([820673e707](https://github.com/facebook/react-native/commit/820673e7076b5906ba50e09e40fb9a32cf500c1b), [b549e364e0](https://github.com/facebook/react-native/commit/b549e364e0025e0e1b4005f04a9de2d767006da1), [28d37781c6](https://github.com/facebook/react-native/commit/28d37781c6589574de1113bd12077f6d54053ffb), [1c90a2b47b](https://github.com/facebook/react-native/commit/1c90a2b47b420a4b6aa16a55a344cc08f0eacbe3), and [1ab7d49c2d](https://github.com/facebook/react-native/commit/1ab7d49c2df5673dd214eb8a9b7fd3defb0ff857) by [@yungsters](https://github.com/yungsters)) - -#### Breaking Changes - -- Public methods of Text (`blur`, `focus`, `measure`, `measureInWindow`, `measureLayout`, `setNativeProps`) are no longer bound to the text component instance. It is therefore unsafe to pass these methods by reference (i.e: as callbacks) to functions. So, things like `setTimeout(this._txtRef.focus, 1000)` will no longer work. Please instead do: `setTimeout(() => this._txtRef.focus(), 1000)`. - -### iOS specific changes - -- _[BREAKING]_ WebViews now can only use https; do not use it for `file://` ([634e7e11e3](https://github.com/facebook/react-native/commit/634e7e11e3ad39e0b13bf20cc7722c0cfd3c3e28) by [@mmmulani](https://github.com/mmmulani)) -- iOS 9 is now the minimum required version ([f50df4f5ec](https://github.com/facebook/react-native/commit/f50df4f5eca4b4324ff18a49dcf8be3694482b51)) -- Update podspecs to target iOS 9 ([092103e752](https://github.com/facebook/react-native/commit/092103e7525e58e04346e0a1a16a67ca4f31c2e9)) -- Xcode 9.4 is now used to run tests ([c55bcd6ea7](https://github.com/facebook/react-native/commit/c55bcd6ea729cdf57fc14a5478b7c2e3f6b2a94d)) -- Prevent console logging on iOS 11.3+ within WebSocket ([8125be942b](https://github.com/facebook/react-native/commit/8125be942bd5fd8fe851bad04ae6b9bcb0af4727)) -- Expose `RCTFont` size overrides ([6611fefef7](https://github.com/facebook/react-native/commit/6611fefef7559c4cd3d1824235d263bff210d5e2)) - -### Android specific changes - -- Projects are now compiled using Android SDK 26 ([065c5b6590](https://github.com/facebook/react-native/commit/065c5b6590de18281a8c592a04240751c655c03c)) -- Use Google Maven repo in new Android projects ([6d56a234e3](https://github.com/facebook/react-native/commit/6d56a234e3cf5984335ff2713236260fac977f5f)) -- Upgrade Buck to v2018.03.26.01 ([1324e7b558](https://github.com/facebook/react-native/commit/1324e7b5580db815471172cf6dd140124bd2f11a)) -- Upgrade gradle-plugin to 2.3.3, gradle to 3.5.1, gradle-download-task to 3.4.3 ([699e5eebe8](https://github.com/facebook/react-native/commit/699e5eebe807d1ced660d2d2f39b5679d26925da)) -- Bump NDK APP_PLATFORM to android-16 ([b5dc45420a](https://github.com/facebook/react-native/commit/b5dc45420a0d3aa54d2d2075d7f14ff1835df78a)) -- Bump glog to 0.3.5 (added libc++ support) ([b5fca80605](https://github.com/facebook/react-native/commit/b5fca806059e628edb504cb1bacf62e89ee6f102)) -- `ReactFragmentActivity` deprecated as it's not necessary when targeting API level 14 and above ([77a02c0d83](https://github.com/facebook/react-native/commit/77a02c0d83dbfcd9a5397cf63e1ab2e6c94cfdde)) -- Touchables now play a sound on press ([722f88ca90](https://github.com/facebook/react-native/commit/722f88ca9058c5d902c416b826a7a7ab347326b8)) -- Default `underlineColorAndroid` to transparent ([a3a98eb1c7](https://github.com/facebook/react-native/commit/a3a98eb1c7fa0054a236d45421393874ce8ce558)) -- Disable `WebView` geolocation by default ([23d61b35fb](https://github.com/facebook/react-native/commit/23d61b35fb6fdbfb84f77b6d99ff155a0ff868e6)) -- Ensure cookies with illegal characters are not sent to okhttp ([04028bf216](https://github.com/facebook/react-native/commit/04028bf2169b01f79bd86ecd6b0d8aa5f99599f1)) -- Update app icons to match recent Android releases ([94393f8652](https://github.com/facebook/react-native/commit/94393f8652c414806fc861c214ad36e9ac1b6114)) -- Better error messages for `ReadableNativeMap` ([30d06b4286](https://github.com/facebook/react-native/commit/30d06b42862fc5e8704e109db652d62f86f8eabc)) -- Update Fresco to v1.9.0, okhttp3 to v3.10.0 ([6b07602915](https://github.com/facebook/react-native/commit/6b07602915157f54c39adbf0f9746ac056ad2d13)) -- Add tint color to inline icons ([e8e2a6e410](https://github.com/facebook/react-native/commit/e8e2a6e4102c1ba0ee3d068769e47fa61c160524)) -- Fix antialiasing rounded background ([e4f88c66e3](https://github.com/facebook/react-native/commit/e4f88c66e300505d3c86329dacd84d84e8109837)) -- `react-native link` will now replace '/' by '\_' when linking projects. If you previously linked scoped packages, they will get linked again. ([dbd47592a1](https://github.com/facebook/react-native/commit/dbd47592a18ed09ee6e94c79bed16d63be625af6)) -- New project template now uses project-wide properties ([0a3055d98a](https://github.com/facebook/react-native/commit/0a3055d98a36e49746144e883edc7e20afec4fcb)) - ---- - -### Fixed: bugs that have been resolved - -- `VirtualizedList` now accounts for `ListHeaderComponent` length when calculating offset ([604bcfa4a8](https://github.com/facebook/react-native/commit/604bcfa4a83396c402ba8beaa13f40d05d6e9f5c)) -- Prevent showing a hidden status bar when opening modals ([076b1cea35](https://github.com/facebook/react-native/commit/076b1cea3563cae30e11d63cc100ceaed9082692)) -- Fix crash when reloading while Perf Monitor is enabled ([4fcd9970bd](https://github.com/facebook/react-native/commit/4fcd9970bd2dfb24890bc87e9c82e16dab71ec09)) -- Fixed concurrency issue in remote debugger ([578b0b2a51](https://github.com/facebook/react-native/commit/578b0b2a51fc0c2aba5d27cdd5335396d5351463)) -- Fix `Modal` + `FlatList` scrolling ([45b0907f61](https://github.com/facebook/react-native/commit/45b0907f619f455825f459838615a5a7cc59a204)) -- Fix bug in `RCTNetworking` where not all tasks/handlers were being cleared during invalidation ([b805172034](https://github.com/facebook/react-native/commit/b8051720344f3716e964eaf7cfdd2a91dc703602)) -- Fix keyboard handling with `keyboardShouldPersistTaps: never` ([ffe6c110f7](https://github.com/facebook/react-native/commit/ffe6c110f7ce33460fe0399ccbda16a6adbe90ca)) -- Fix Responder Logic in `Text` ([e2ce22b823](https://github.com/facebook/react-native/commit/e2ce22b823661a7dcf6b70a825921a2910383bd1)) -- Fix `VirtualizedSectionList` lint warnings ([26a1eba1ce](https://github.com/facebook/react-native/commit/26a1eba1cef853b0dab7aad5731699c06d36b781)) -- Fix `VirtualizedSectionList:ItemWithSeparators` ([488a4c7e1c](https://github.com/facebook/react-native/commit/488a4c7e1c86ac5900ff9194106511fbf5a8e3cb)) -- Fix `TextInput`'s initial layout measurements ([c6b4f9f2ce](https://github.com/facebook/react-native/commit/c6b4f9f2ce59bc757d9e211f46294faa03df55c6)) -- Fix `requireNativeComponent` check ([1c90a2b47b](https://github.com/facebook/react-native/commit/1c90a2b47b420a4b6aa16a55a344cc08f0eacbe3)) -- Fix `TextInput` autocapitalization bug ([ff70ecf868](https://github.com/facebook/react-native/commit/ff70ecf868cf12fc66b45dc1496391d0a1e9011f)) -- Add missing events to `ViewPropTypes` ([41a940392c](https://github.com/facebook/react-native/commit/41a940392cea497bc5eb627b24083d0211d1eb89)) -- Add missing Jest mock in `StatusBarManager` ([4a2c560768](https://github.com/facebook/react-native/commit/4a2c560768abb2d8407900fdb2fbe4971ae00a1c)) -- Add Flow declaration for Metro module ([1853e15190](https://github.com/facebook/react-native/commit/1853e1519030caaeeb7f31017d98823aa5696daf)) -- Fix type for `ReactNative.NativeComponent` (1/2) ([de11ba2a5e](https://github.com/facebook/react-native/commit/de11ba2a5ee90929dbc67d914de59bdd2ebc29ca)) -- Fix type for `ReactNative.NativeComponent` (2/2) ([752863629d](https://github.com/facebook/react-native/commit/752863629d63bca6d96a101bfeccc4e7ad3e953e)) -- Move Image PropTypes to new file ([67656991b3](https://github.com/facebook/react-native/commit/67656991b32075e8b4a99c6409b0a131206c6941)) -- Tests: Fix JUnit report location when running Jest ([85fc98d437](https://github.com/facebook/react-native/commit/85fc98d437c08cdec883a73161e120478737ba72)) -- Tests: Fix ReactImagePropertyTest SoLoader failures (#19607) ([a52d84d7e1](https://github.com/facebook/react-native/commit/a52d84d7e1cdb287f2877c4d85f2e9866c248d43)) -- Tests: Fix jest snapshot testing on Windows ([216bce3163](https://github.com/facebook/react-native/commit/216bce31632480ce70cc03b1b2a57ec12440afd7)) -- Fixes "Cannot resolve module" errors in new `react-native init` projects ([843a433e87](https://github.com/facebook/react-native/commit/843a433e87b0ccaa64ab70d07e22bffbabad8045)) -- Haste hotfix for `react-native-windows` ([54942746d4](https://github.com/facebook/react-native/commit/54942746d4037e1153e14fcfc95e4edc772d296a)) - -#### iOS specific fixes - -- Fix undefined_arch error in Xcode 10 beta - e131fff -- Make `react-native run-ios` command play nicely with multiple Xcode versions ([a130239257](https://github.com/facebook/react-native/commit/a1302392577789faab79dad0cb39b147464e0e42)) -- Correct fishhook import ([75a0273de2](https://github.com/facebook/react-native/commit/75a0273de21948b0b959263100f09111f738ec35)) -- Fix bug where a Backspace event was emitted when entering characters after clearing a text in `TextInput` by an empty string ([1ffb2b63be](https://github.com/facebook/react-native/commit/1ffb2b63be4c4af331fece0b4286e5c92b1e575d)) -- Expose `InputAccessoryView` so it can be imported ([80fc415cf1](https://github.com/facebook/react-native/commit/80fc415cf179ffe26d020bc8d6e4451352da94fd)) -- Fix `InputAccessoryView` safe area conformance ([490f22ae72](https://github.com/facebook/react-native/commit/490f22ae72ba43fa9364ce0f6c238744c07ac830)) -- Fix use of C++ syntax in header file ([bfcfe7961d](https://github.com/facebook/react-native/commit/bfcfe7961db0970e2575eafe2f3c9c668bd8940d)) -- Fix install step when running `run-ios` ([0934c1778f](https://github.com/facebook/react-native/commit/0934c1778f0e3c0b691e1a3ca2df1d486eb905dd)) -- Fix `run-ios` not turning on Simulator ([9736ddc061](https://github.com/facebook/react-native/commit/9736ddc061e9c4291df8a3185c7f9d6f73e435c7)) -- Use correct library reference for Fishhook. This fixes the build for the new Xcode build system, on both Xcode 9 and Xcode 10 ([a8b74576da](https://github.com/facebook/react-native/commit/a8b74576da6f1a42fde4e39f97e88c8f45a3a51d)) -- Add missing `onChange` event definition to `DatePickerIOS` ([3b53091869](https://github.com/facebook/react-native/commit/3b53091869b673ea33a4af34242e2227ca944768)) -- Fix crash during Archive phase on Xcode 9.3 ([344c205070](https://github.com/facebook/react-native/commit/344c205070d5ad670c97984dd86ec9ac13c73f81)) -- `RNTesterPods`: Add missing folly include ([128c9343c4](https://github.com/facebook/react-native/commit/128c9343c464f3e7898d6e245f135f8bdf6caa6a)) -- `RNTesterPods`: folly::Optional's `has_value()` to `hasValue()` until folly is upgraded ([128c9343c4](https://github.com/facebook/react-native/commit/128c9343c464f3e7898d6e245f135f8bdf6caa6a)) -- `RNTesterPods`: Fix import for `RCTTestAttributes.h` ([128c9343c4](https://github.com/facebook/react-native/commit/128c9343c464f3e7898d6e245f135f8bdf6caa6a)) -- `RNTesterPods`: Fix `conversions.h` to use namespaced includes ([128c9343c4](https://github.com/facebook/react-native/commit/128c9343c464f3e7898d6e245f135f8bdf6caa6a)) -- Fix or mark enum conversions surfaced by `-Wenum-conversion` ([b8f30db0ae](https://github.com/facebook/react-native/commit/b8f30db0ae21d5f96547702abbf50aefa93b1094)) -- Fix CocoaPods integration without DevSupport subspec ([c09d509c2b](https://github.com/facebook/react-native/commit/c09d509c2b8a5a02701829e1f0ace8081ce64277)) -- Update Yoga to handle being in a Xcode framework project ([cf036dbc7a](https://github.com/facebook/react-native/commit/cf036dbc7af16a8453c115372694dc51e8086fcf)) -- Fix Blob memory leak ([122b3791ed](https://github.com/facebook/react-native/commit/122b3791ede095345f44666691aa9ce5aa7f725a)) -- Avoid double reload event when reloading JS ([7b9b1559a7](https://github.com/facebook/react-native/commit/7b9b1559a7f6719c3c9ad8e894fcdd99ed109afe)) -- Suppress spurious warning about RCTCxxModule ([569061dd83](https://github.com/facebook/react-native/commit/569061dd8384a86cd27719b8b068360d8379f4c3)) - -#### Android specific fixes - -- Fix extreme `TextInput` slowness on Android ([5017b86b52](https://github.com/facebook/react-native/commit/5017b86b525e3ef6023f0f8a88e6fd1cf98024e0)) -- Correct draw path dimensions while doing even border, fixes blurred borders ([c5ca26a0e5](https://github.com/facebook/react-native/commit/c5ca26a0e5c0660196300ee34d6007c63879611f)) -- Don't pass additional arguments to `requireNativeComponent` in `.android.js` files ([a51e8b19cc](https://github.com/facebook/react-native/commit/a51e8b19cc4dc36dee42ac95278b883c06b2e40f)) -- Prevent `RefreshControl` from getting stuck when a parent is scrolled horizontally ([33ffa79a51](https://github.com/facebook/react-native/commit/33ffa79a51d4db9ba69148861f2da304646175cd)) -- Prevent crash due to unsupported ellipsize mode ([85e33aaf90](https://github.com/facebook/react-native/commit/85e33aaf908996e99220bff4a2bdbbdf7c0d12b0)) -- Fix okhttp3 response handling in `DevServerHelper` ([56d48bd9ec](https://github.com/facebook/react-native/commit/56d48bd9ecd2d0f08625259121312531064a09f2)) -- Fix `ReactInstanceManager` unmountApplication to support `ReactRootView` recycling ([4a9b2a7302](https://github.com/facebook/react-native/commit/4a9b2a73021fb547febe1fa193c3effb7ff8da4e)) -- Fix `NullPointerException` when emitting event using `UIManagerModule` ([291c01f4ff](https://github.com/facebook/react-native/commit/291c01f4ffe614760852e36b05d78b42cb4271df)) -- Fix link to Android build guide ([57e7556b8d](https://github.com/facebook/react-native/commit/57e7556b8db61e5fcc3ccea56c1b163b82a091a6)) -- Fix Android open source test failures ([3e0ebc7663](https://github.com/facebook/react-native/commit/3e0ebc76632238f21c60caa92c7a2b5ee8102b71)) -- Fix view indices with LayoutAnimation ([05b75b9ebf](https://github.com/facebook/react-native/commit/05b75b9ebfa3ce6d67b2a3aee446ff0cd515311b)) -- Fix originalNode memory leak ([8102e35271](https://github.com/facebook/react-native/commit/8102e35271ab68e0525a9c60d86a855bbeef9c1a)) -- Fix `ScrollView` with a `TextInput` ([2f1421dec7](https://github.com/facebook/react-native/commit/2f1421dec7cd3a35779caceac108e872033c7d72)) -- Disable onKeyPRess logic when handler not defined ([41975f75d9](https://github.com/facebook/react-native/commit/41975f75d96ef4b606b4618461bf24d5db063b77)) -- fix permission requests on pre-M android ([4e1abdd74d](https://github.com/facebook/react-native/commit/4e1abdd74dc4127a86d62e7750d01d39bb781c08)) - ---- - -### Removed: features that have been removed; these are breaking - -- Deprecate `focusTextInput` and `blurTextInput` ([ce3b7b8204](https://github.com/facebook/react-native/commit/ce3b7b8204dad0fd62a76a0ce66472eca4b25bc8)) -- _[BREAKING]_ `ImageResizeMode` on `Image` is no longer exposed; check your usage of `resizeMode`; the same resize modes exist, but pass them as strings instead ([870775ee73](https://github.com/facebook/react-native/commit/870775ee738e9405c6545500f9a637df9b513a02) by [@TheSavior](https://github.com/TheSavior)) - -#### Android specific removals - -- Remove native extensions ([7c5845a5a2](https://github.com/facebook/react-native/commit/7c5845a5a26592598c9380df078766a680a23f06)) -- Remove Fresco ProGuard rules ([07df36557c](https://github.com/facebook/react-native/commit/07df36557c8cbbaee5e870460162aa725a606ff4)) - -#### iOS specific removals - -- Disallow nesting of `` within `` (e.g. ``) ([6a1b41643a](https://github.com/facebook/react-native/commit/6a1b41643a5f5035c61a96263220d11d3462e8f2) -- Removed deprecated `UIActionSheetDelegate` methods ([5863b564f8](https://github.com/facebook/react-native/commit/5863b564f84b9fe97b256f8cde0f7f2e1db9b641)) - ---- - -### Known issues - -During the RC testing of this version, a few issues that have been opened don't have yet a finalized solution ( [19827](https://github.com/facebook/react-native/issues/19827), [19763](https://github.com/facebook/react-native/issues/19763), [19859](https://github.com/facebook/react-native/issues/19859), [19955](https://github.com/facebook/react-native/issues/19955) ). We are aware of them and we hope that by releasing 0.56.0 the surface of developers interacting to find solutions to them will allow for faster resolution and an even better 0.56.1 release. So please check the already opened issues before submitting new ones. - -If you are using Windows to develop React Native apps, we suggest you keep an eye on [this issue in particular](https://github.com/facebook/react-native/issues/19953) since there have been many reports of issues related to Win 10 and RN 0.56. - -## v0.55.0 - -Welcome to the March 2018 release of React Native ! Over 81 contributors made 247 commits since February. Thanks for another exciting release. - -Here are a few highlights: - -- React Native is now using the MIT license -- Android TV device support - -[![RNAndroidTVDemo](http://img.youtube.com/vi/EzIQErHhY20/0.jpg)](http://www.youtube.com/watch?v=EzIQErHhY20) - -- Animated tracking with native driver - check out the [silky smooth framerate](https://t.co/dE1KST1i3g) -- Lots of Flow improvements -- Bugfixes - -### Added: new features - -- Added support for animated tracking to native driver. Now you can use `useNativeDriver` flag with animations that track other `Animated.Values` ([b48f7e5605](https://github.com/facebook/react-native/commit/b48f7e560545d53db7c906ced51a91c4cce6ee94) by [@kmagiera](https://github.com/kmagiera)) -- There's a new UTFSequence module in the library for common Unicode sequences (Emoji!) ([54870e0c6c](https://github.com/facebook/react-native/commit/54870e0c6ca8611fed775e5ba12a0d6d9b1cdbd7) and [4761d5a83e](https://github.com/facebook/react-native/commit/4761d5a83e707e0ed651f02a9e02fc5d66b1869a) by [@sahrens](https://github.com/sahrens)) -- Added `contextMenuHidden` property for **TextInput** ([2dd2529b3a](https://github.com/facebook/react-native/commit/2dd2529b3ab3ace39136a6e24c09f80ae421a17e) by [@amhinson](https://github.com/amhinson)) -- Add `testOnly_pressed` to **TouchableHighlight** for snapshot tests ([3756d41de1](https://github.com/facebook/react-native/commit/3756d41de1feb167482f01b26f9a5f2563ef8bff) by [@sahrens](https://github.com/sahrens)) - -#### Android specific additions - -- Added support for Android TV devices ([b7bb2e5745](https://github.com/facebook/react-native/commit/b7bb2e5745f2bdbfeeccef8d97d469730942e01c) by [@krzysztofciombor](https://github.com/krzysztofciombor)) -- Implemented style `letterSpacing` for **Text** and **TextInput** ([5898817fc1](https://github.com/facebook/react-native/commit/5898817fc1a66bd317d65ce96520159df2f96045) by [@motiz88](https://github.com/motiz88)) -- Bundle download progress is now shown [d06e143420](https://github.com/facebook/react-native/commit/d06e143420462344ea6fc21c0446db972f747404) by [@janicduplessis](https://github.com/janicduplessis)) -- **AndroidInfoModule** now also returns Android ID ([216c8ec04b](https://github.com/facebook/react-native/commit/216c8ec04b22704f722ecaac4718157af4434a0c) by [@L33tcodex0r](https://github.com/L33tcodex0r)) - -#### iOS specific additions - -- Introducing **InputAccessoryView**, "a component which enables customization of the keyboard input accessory view" ([38197c8230](https://github.com/facebook/react-native/commit/38197c8230657d567170cdaf8ff4bbb4aee732b8), [84ef7bc372](https://github.com/facebook/react-native/commit/84ef7bc372ad870127b3e1fb8c13399fe09ecd4d), and [6d9fe455dc](https://github.com/facebook/react-native/commit/6d9fe455dc815cdce86c00f81c71c9ca0c724964) by [@PeteTheHeat](https://github.com/PeteTheHeat)) -- `base-line` metric exposure for **Text** and **TextInput** ([51b3529f6c](https://github.com/facebook/react-native/commit/51b3529f6c2ca354800c0cf6ecb8eb3115eaa36e), [0dbe18375e](https://github.com/facebook/react-native/commit/0dbe18375ebb712be8bebd3b6592170f90f8b7bc), and [7630a614e4](https://github.com/facebook/react-native/commit/7630a614e4bd56c1a3ac728e1dfafd114340f2b7) by [@shergin](https://github.com/shergin)) -- **DatePickerIOS** now has `initialDate` prop ([446ce49e9b](https://github.com/facebook/react-native/commit/446ce49e9b097d2a5e95b0f17aa23756733c27ec)) -- Expose version via `RCTVersion.h`'s `RCTGetReactNativeVersion()` ([30469ed001](https://github.com/facebook/react-native/commit/30469ed00170a74743d2ba5aadce61aae742715c) by [@LeoNatan](https://github.com/LeoNatan)) -- Allow running multiple simulators simultaneously with `react-native run-ios --simulator ...` ([2ad34075f1](https://github.com/facebook/react-native/commit/2ad34075f1d048bebb08ef30799ac0d081073150) by [@koenpunt](https://github.com/koenpunt)) -- Introduced **RCTSurfaceHostingProxyRootView** for migration to **RCTSurfaceHostingView** ([34b8876ac6](https://github.com/facebook/react-native/commit/34b8876ac6510398e03a03c94f4ffb9aaa7519d3) by [@fkgozali](https://github.com/fkgozali)) -- New UIManager API allowing intercept/delay mounting process ([402ae2f01f](https://github.com/facebook/react-native/commit/402ae2f01fd91051be5b717b0578e18b863854af) and [b90c1cf6c3](https://github.com/facebook/react-native/commit/b90c1cf6c30454859579278be18ac650c66f516b) by [@shergin](https://github.com/shergin)) - -### Changes: existing functionality that is now different - -- React Native has now adopted the MIT license ([1490ab12ef](https://github.com/facebook/react-native/commit/1490ab12ef156bf3201882eeabfcac18a1210352) and [26684cf3ad](https://github.com/facebook/react-native/commit/26684cf3adf4094eb6c405d345a75bf8c7c0bf88) by [@sophiebits](https://github.com/sophiebits)) -- The HelloWorld template now exclude `*.jsbundle` files from Git ([21231084db](https://github.com/facebook/react-native/commit/21231084dbccc8abe7823d4444a7e772c08e3e72) by [@aneophyte](https://github.com/aneophyte)) -- `react-native-git-upgrade` now shows files merged with conflicts in red ([e53a8f7097](https://github.com/facebook/react-native/commit/e53a8f7097965f38d87eade1407661bc63adc68e) by [@alvinthen](https://github.com/alvinthen)) -- `ResolvedAssetSource` type to have all read-only members ([4d0ee37293](https://github.com/facebook/react-native/commit/4d0ee37293b5e21fc3c7a8c6edd72c9ff899df7d) by [@sahrens](https://github.com/sahrens)) -- Flow types improvements ([b6c7e551a9](https://github.com/facebook/react-native/commit/b6c7e551a91c406884cbbe8ee37c0038a1b7f0be), [b98bf1e097](https://github.com/facebook/react-native/commit/b98bf1e09739860d82e37225f1635bba3bc817b3), [80c18395e2](https://github.com/facebook/react-native/commit/80c18395e24760cd12b69592a10037f071255437), [70a3ececc3](https://github.com/facebook/react-native/commit/70a3ececc368a8d0fe4b57b13ac956ad99a637c7), [f7343576fc](https://github.com/facebook/react-native/commit/f7343576fc2ca941b03145d9e97208bcbc8c345b), [a817c64043](https://github.com/facebook/react-native/commit/a817c6404338b7b15aaeac5693ae3635a0a3dde0), [3fd82d3c89](https://github.com/facebook/react-native/commit/3fd82d3c89f2d7e5103b024b54250f2ded970d88), [cd8128b2ec](https://github.com/facebook/react-native/commit/cd8128b2eccf6898cdf798a1e1be1f7a5762a0d4), [5035af80ec](https://github.com/facebook/react-native/commit/5035af80ecddb44e2a8444780f25f336b760bf32), [26734a8473](https://github.com/facebook/react-native/commit/26734a8473ac2f5715f2b7a016f0cc8a15c6f073), [321ba067a8](https://github.com/facebook/react-native/commit/321ba067a8323c80262e51c94a931199d5ff5cd7), [b6b80f6a70](https://github.com/facebook/react-native/commit/b6b80f6a70c6d790c52b58453fefc2cea6cd06fe), [f1316cab6c](https://github.com/facebook/react-native/commit/f1316cab6c351852ef1da9939d4c8f0244fb8a6f), [2520c645f8](https://github.com/facebook/react-native/commit/2520c645f863c299e8dccb844bac3dc6a9d553e0), [214da52fe7](https://github.com/facebook/react-native/commit/214da52fe76c1688d0c1a402b3e6c4d0fc19d882), [dbdf43b428](https://github.com/facebook/react-native/commit/dbdf43b428da19a9eba012753904bcf33339ea9a), [49396aa78d](https://github.com/facebook/react-native/commit/49396aa78d218625c1933fa864acd70853faa9f9), [4895c645ea](https://github.com/facebook/react-native/commit/4895c645ea17ff939811f3d5ec6218cd4e31c5fb), [a3c07c95ef](https://github.com/facebook/react-native/commit/a3c07c95effd891c2bd5f3257efe5b24d85862be), [49ffc9fada](https://github.com/facebook/react-native/commit/49ffc9fada4266c3ba9751c5e8e4c475174c7e6c), and [c129457d3a](https://github.com/facebook/react-native/commit/c129457d3a6622d7c28e8b27829ffc2b0a03c5eb) by [@TheSavior](https://github.com/TheSavior), [@yungsters](https://github.com/yungsters), and [@alex288ms](https://github.com/alex288ms)) -- Better enable cross-platform support of WebSocket.js ([b9be28915c](https://github.com/facebook/react-native/commit/b9be28915cf323eb36f1d7c77821cdf994954074) by [@rozele](https://github.com/rozele)) -- Better error handling in the CLI around making directories ([d2817f48a1](https://github.com/facebook/react-native/commit/d2817f48a1146b469d544ee78015251551d358c3) by [@BridgeAR](https://github.com/BridgeAR)) -- Verify that the component passed to createAnimatedComponent is not functional ([10b642a7af](https://github.com/facebook/react-native/commit/10b642a7af097bd508dab7b5d4723ccb4339d35f) by [@janicduplessis](https://github.com/janicduplessis)) -- Don't truncate in the middle of an emoji ([9c8c597000](https://github.com/facebook/react-native/commit/9c8c5970002d048e8b18088f7c63b39431def50b) by [@Vince0613](https://github.com/Vince0613)) -- Loosen Platform check to allow better code sharing for out-of-tree platforms ([84affbd6a3](https://github.com/facebook/react-native/commit/84affbd6a371dd865a3550b1fde1ebabee921341)) -- In CLI, fix issue with `isInstalled` check for Android and references to unregister ([ec884890b1](https://github.com/facebook/react-native/commit/ec884890b1f40da42e84202e082b4cef2506bbfc) by [@rozele](https://github.com/rozele)) - -#### iOS specific changes - -- tvOS `onPress` magnification animation now works via the `tvParallaxProperties` prop object taking `pressMagnification`, `pressDuration`, and `pressDelay` ([6c353fd7e9](https://github.com/facebook/react-native/commit/6c353fd7e9fd324717951ad62754d817537d7339) by [@JulienKode](https://github.com/JulienKode)) - -### Fixed: bugs that have been resolved - -- In **TouchableOpacity**, trigger animation on `opacity` upon change in `disabled` prop ([9366ce416f](https://github.com/facebook/react-native/commit/9366ce416fbf015e4795987d39a65199b1b335c2) by [@maxkomarychev](https://github.com/maxkomarychev)) -- Fixed an issue encountered when using `react-native-vector-icons` ([a759a44358](https://github.com/facebook/react-native/commit/a759a44358711180b37cf4ad25f28af47e3de298) and [54dc11a5fb](https://github.com/facebook/react-native/commit/54dc11a5fbafaccc9c0a781f1151225909717597) by [@jeanlauliac](https://github.com/jeanlauliac) and [@t4deu](https://github.com/t4deu))) -- Add missing mock for Jest for `removeEventListener` method ([59c7b2cfac](https://github.com/facebook/react-native/commit/59c7b2cfac534a79ff2461af5fd2034b280812a3) by [@MoOx](https://github.com/MoOx)) -- Fix main size calculation from the aspect ratio ([f751c3460e](https://github.com/facebook/react-native/commit/f751c3460e5dc48c1f1a2d72a56173285899de21)) -- Fix crash in Subscribable due to uglify-es ([b57a78c3de](https://github.com/facebook/react-native/commit/b57a78c3def50eda11e57542be0e5233a62d173b) by [@iMagdy](https://github.com/iMagdy)) -- Update `node-notifier` dependency to fix memory leak ([860fcd458a](https://github.com/facebook/react-native/commit/860fcd458a1873ebcf977be01670be5912ae7104) by [@rickhanlonii](https://github.com/rickhanlonii)) -- Fix issues with pollParams and link ([ca8ce83cc3](https://github.com/facebook/react-native/commit/ca8ce83cc3c38751604afce5a3e2f0473d9cba91) by [@grabbou](https://github.com/grabbou)) - -#### iOS specific fixes - -- DevLoadingView now supports the iPhone X screen shape ([47b36d3ff0](https://github.com/facebook/react-native/commit/47b36d3ff0dbb99fd3fc98f6e981a38084dd4d2c) by [@mrtnrst](https://github.com/mrtnrst)) -- Added bounds check to prevent ScrollView from scrolling to an offset which is out of bounds of the ScrollView ([16c9e5b715](https://github.com/facebook/react-native/commit/16c9e5b71500135a631480035af6cd2de3dafdc9) by [@siddhantsoni](https://github.com/siddhantsoni)) -- **NetInfo** `isConnected` works again ([dbafc29e60](https://github.com/facebook/react-native/commit/dbafc29e60aba1d5b24c2b0d321834c40e0b9bca) by [@alburdette619](https://github.com/alburdette619)) -- In **AlertIOS**, fix duplicate var name declaration ([6893a26bfb](https://github.com/facebook/react-native/commit/6893a26bfb06a2d8ad9d23a572f4d9143305d905)) -- Permit `react-native run-ios --device [id]` by passing port when running on device ([f8fee0a631](https://github.com/facebook/react-native/commit/f8fee0a631d77313d7cb5e65a3dd04a5a8ba3d03) by [@jozan](https://github.com/jozan)) -- Fixed issue with `run-ios` where `Entry, ":CFBundleIdentifier", Does Not Exist` was being received ([5447ca6707](https://github.com/facebook/react-native/commit/5447ca67076a110e2b0df03b014f53d1df4646ab) by [@blackneck](https://github.com/blackneck)) -- Fixed problem in Text measurement on iOS ([a534672e13](https://github.com/facebook/react-native/commit/a534672e132136e7bbd17c94a7f4e67149bcc67a) by [@shergin](https://github.com/shergin)) -- Fix crash when reloading in tvOS ([3a3d884df2](https://github.com/facebook/react-native/commit/3a3d884df253dbc1c02ffef33e99c4a91ea8751b) by [@dlowder-salesforce](https://github.com/dlowder-salesforce)) -- Fixed a bug with positioning of nested views inside **Text** ([7d20de412b](https://github.com/facebook/react-native/commit/7d20de412b37a35951e615d98509573dc1a24bcb) by [@shergin](https://github.com/shergin)) -- Fix blob response parsing for empty body ([f5207ba9c7](https://github.com/facebook/react-native/commit/f5207ba9c764f33ef83fa897f6014d67193be0e2) by [@janicduplessis](https://github.com/janicduplessis)) -- Fix tvOS react-native init release build ([3002c4eb98](https://github.com/facebook/react-native/commit/3002c4eb981d439f0ea304556d8dbd4ffd62a80b) by [@dlowder-salesforce](https://github.com/dlowder-salesforce) -- Fix RedBox from bridge reload due is not re-registering its root view ([2e51fa5f5d](https://github.com/facebook/react-native/commit/2e51fa5f5d4f229329ae457ab1a77ba5bcea0448) by [@fkgozali](https://github.com/fkgozali)) - -#### Android specific fixes - -- Fix: incorrect line-height calculation ([74e54cbcc4](https://github.com/facebook/react-native/commit/74e54cbcc408a8bbdd70f47cc8728d30cdc0d299) by [@strindhaug](https://github.com/strindhaug)) -- Fix crashes with TextInput introduced in 0.53 ([b60a727adb](https://github.com/facebook/react-native/commit/b60a727adbcfa785e3d1b13bf069b766216e60f8) by [@joshyhargreaves](https://github.com/joshyhargreaves)) -- Update ReactAndroid build script to support gradle 2.3.0 ([d8bb990abc](https://github.com/facebook/react-native/commit/d8bb990abc226e778e2f32c2de3c6661c0aa64e5)) -- Allow "unexpected URL" exception to be caught on Android when using fetch ([da84eba318](https://github.com/facebook/react-native/commit/da84eba318ae69fea28f40418178bdeb35c4a99b) by [@jcurtis](https://github.com/jcurtis)) -- Fix `onLayout` prop for **TextInput** ([8a073c1d8b](https://github.com/facebook/react-native/commit/8a073c1d8b89305a9a2561a7c33740919730f408) by [@rozele](https://github.com/rozele)) -- Fix ViewPager when using native navigation ([a1295e1707](https://github.com/facebook/react-native/commit/a1295e1707a856b9cd5c3129320d386aa9166310) by [@ruiaraujo](https://github.com/ruiaraujo)) -- Fix localization crash in **DevSettingsActivity** ([427e464bb9](https://github.com/facebook/react-native/commit/427e464bb95e4e0ecc7455e71b5d477014618200) by [@ayc1](https://github.com/ayc1)) -- Fix pinch crash in touch-responsive views ([67c3ad4e6a](https://github.com/facebook/react-native/commit/67c3ad4e6a1847cbac43115b01f72cc5c8932a61) by [@tobycox](https://github.com/tobycox)) -- Fix IllegalStateException thrown in looped timing native animation ([ef9d1fba23](https://github.com/facebook/react-native/commit/ef9d1fba237c08a158c8f32e823f229921e7c052) by [@kmagiera](https://github.com/kmagiera)) -- Workaround android-only js module resolution issue ([c20e0f94fe](https://github.com/facebook/react-native/commit/c20e0f94feb42a71633212114b42c62494fd4ff0) by [@fkgozali](https://github.com/fkgozali)) -- Fix ReadableNativeMap.toHashMap() for nested maps and arrays ([15fa2250fd](https://github.com/facebook/react-native/commit/15fa2250fdd0865ce1d0c6ac13b817e7b2c7757a) by [@esamelson](https://github.com/esamelson)) -- Fix Android Sanity Buck version check ([e0573225d5](https://github.com/facebook/react-native/commit/e0573225d5fe28e5ad61690eda3060289bdbf3a4) by [@hramos](https://github.com/hramos)) -- Fixes the connection to Firestore by following whatwg.org's XMLHttpRequest send() method ([d52569c4a1](https://github.com/facebook/react-native/commit/d52569c4a1b6bd19792e4bda23e3a8c3ac4ad8df) by [@samsafay](https://github.com/samsafay)) -- `invertStickyHeaders` can now be set from **SectionList** or **FlatList** ([dd479a9377](https://github.com/facebook/react-native/commit/dd479a93772c3a52561fc32ee84b25ce822a30fa) by [@dannycochran](https://github.com/dannycochran)) - -### Removed: features that have been removed; these are breaking - -- Removed various types ([b58e377961](https://github.com/facebook/react-native/commit/b58e377961ddd278bfa36df0e15953f976875de6), [ee26d9bcb0](https://github.com/facebook/react-native/commit/ee26d9bcb0719246efa51af404aa7805404675cc), [d89517d60a](https://github.com/facebook/react-native/commit/d89517d60a8a6cabc9013b603fa3f63a1face6a2), [852084ad45](https://github.com/facebook/react-native/commit/852084ad454565bb856e85f09e098f1a4a0771a6) by [@TheSavior](https://github.com/TheSavior)) -- Deleted `Systrace.swizzleJSON()` ([3e141cb6c9](https://github.com/facebook/react-native/commit/3e141cb6c957143e998bf2926b8fe1aabccbce2d) by [@yungsters](https://github.com/yungsters)) - -#### Android specific removals - -- `ReactInstanceManager#registerAdditionalPackages` has been removed; Create UIManager interface and extract common classes in uimanager/common ([6b45fb2cb1](https://github.com/facebook/react-native/commit/6b45fb2cb1ca44fa7375bc7696bf90a68a85df3c) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific removals - -- Remove callFunctionSync experimental APIs ([19a4a7d3cb](https://github.com/facebook/react-native/commit/19a4a7d3cb6d00780ccbbbd7b0062896f64ab24d) by [@danzimm](https://github.com/danzimm)) - -## v0.54.0 - -Welcome to the February 2018 release of React Native! This release includes work done by the React Native team and the community in January, and there are some big changes here after the holidays. Thanks for 270 commits from 87 contributors, you all are great! Here are a few highlights from the release: - -- Long awaited **Blob** changes: upload, download, fetch locally, and more -- Sticky headers now work on inverted Lists -- Update to the newest React, which deprecated some lifecycle methods and added new ones – expect Yellowbox until React Native is updated -- `Space-evenly` is now there (sorry for the confusion with 0.52's release notes) -- A lot of under-the-covers work on Yoga, iOS's **Text** and **TextInput**, and a ton of other areas -- Multiple crash fixes - -The changelog is arranged by the customary added, removed, changed, and fixed plus internal; the changes are also organized by platform. - -### Added - -- ✨ **Blob**s now can be: made from Strings, loaded by File using a FileReader API, uploaded and downloaded via `XMLHttpRequest#fetch`, and fetched on files to a local blob consistently ([be56a3efee](https://github.com/facebook/react-native/commit/be56a3efeefefa6dca816ca5149a3dabfa5164e2) and [854c2330eb](https://github.com/facebook/react-native/commit/854c2330ebe748eb0508bb788685232b6cff0022) by [@satya164](https://github.com/satya164) and [@fkgozali](https://github.com/fkgozali)) -- Dynamic node_module dependencies are now supported ([b5e19adc02](https://github.com/facebook/react-native/commit/b5e19adc02a3293cd3fdbe54cc45adc78f94d325) by [@jeanlauliac](https://github.com/jeanlauliac)) -- Support sticky headers for inverted Lists with `invertStickyHeaders` ([ecaca80d42](https://github.com/facebook/react-native/commit/ecaca80d42b686e4cf91aa4bb0c8fce69eba18bb) by [@janicduplessis](https://github.com/janicduplessis)) -- `space-evenly` is now supported (sorry for the confusion with 0.52 notes) ([b1cdb7d553](https://github.com/facebook/react-native/commit/b1cdb7d553146160f99319f9dbe4083b18db60e4) by [@gedeagas](https://github.com/gedeagas)) -- Platform plugins can participate in RNConfig, `link`, and `unlink` – keep an eye on [react-native-window's use of it](https://github.com/Microsoft/react-native-windows/pull/1601)! ([a40bfa730e](https://github.com/facebook/react-native/commit/a40bfa730e05c68da49e6f217ae0f161dcc7ba98) by [@rozele](https://github.com/rozele)) -- Add `minify` flag to react-native bundle command ([3f969cb1db](https://github.com/facebook/react-native/commit/3f969cb1db3a39dd8a4fd622abbb7e4270a84216) by [@tomduncalf](https://github.com/tomduncalf)) - -#### VR Specific Additions - -- Added **ScrollView** support ([6fa039dab0](https://github.com/facebook/react-native/commit/6fa039dab0b9f738a3cb464aeca378c6210a5747) by [@MartinSherburn](https://github.com/MartinSherburn)) - -#### Android Specific Additions - -- Bundle download progress is now shown like iOS ([d06e143420](https://github.com/facebook/react-native/commit/d06e143420462344ea6fc21c0446db972f747404) by [@janicduplessis](https://github.com/janicduplessis)) -- Add back ability to customise OkHttp client ([22efd95be1](https://github.com/facebook/react-native/commit/22efd95be1f0b236eeaaa8a8e6d01e89771c9543) by [@cdlewis](https://github.com/cdlewis)) - -#### iOS specific additions - -- **ScrollView** now supports smooth bi-directional content loading and takes new prop `maintainVisibleContentPosition` ([cae7179c94](https://github.com/facebook/react-native/commit/cae7179c9459f12b1cb5e1a1d998a9dc45f927dc) and [65184ec6b0](https://github.com/facebook/react-native/commit/65184ec6b0ef2d136c0db239d65e0624efac8a2d) by [@sahrens](https://github.com/sahrens)) -- Allow substituting a default font handler ([a9c684a0ff](https://github.com/facebook/react-native/commit/a9c684a0ff45852087310d5218062acfdab673f7) by [@mmmulani](https://github.com/mmmulani)) -- Add `accessibilityElementsHidden` prop ([31288161e1](https://github.com/facebook/react-native/commit/31288161e188723456fdb336c494f3c8a3f5b0a8) by [@aputinski](https://github.com/aputinski)) -- Add EXTRA_PACKAGER_ARGS extensibility point on `scripts/react-native-xcode.sh` (PR rev [0d4ff1b7ea](https://github.com/facebook/react-native/commit/0d4ff1b7ea768cceca0405c665e322c0d6b5ba20) by [@brunolemos](https://github.com/brunolemos) with landing assists [b8c86b8dec](https://github.com/facebook/react-native/commit/b8c86b8deced01027b609959576ffcf5d2d0f520) and [0d4ff1b7ea](https://github.com/facebook/react-native/commit/0d4ff1b7ea768cceca0405c665e322c0d6b5ba20)) - -### Removed - -- Remove internal `utf8` utility - use the **utf8** package now instead ([431670f908](https://github.com/facebook/react-native/commit/431670f90860936c24260d36fc73e0c5fbf4e02a) by [@mathiasbynens](https://github.com/mathiasbynens)) - -#### iOS specific removals - -- Removed outdated assertion in RCTShadowView related to breaking change in Yoga ([e3ff3cf6cb](https://github.com/facebook/react-native/commit/e3ff3cf6cbc137e315eff6ac8aed43954b3668eb) by [@shergin](https://github.com/shergin)) - -#### Android specific removals - -- Fix an issue when swapping to and from the `visible-password` or `phone-pad` keyboard types. ([164f6b6afd](https://github.com/facebook/react-native/commit/164f6b6afd7e0050d63134fcdc65ec6969ab03a0) by [@BrandonWilliamsCS](https://github.com/BrandonWilliamsCS)) -- Remove redundant config in AndroidManifest.xml ([d7a9ca2893](https://github.com/facebook/react-native/commit/d7a9ca2893fb240c25d1cd1e0778f6b93b1e3ded) by [@gengjiawen](https://github.com/gengjiawen)) - -#### iOS specific removals - -- Delete RCTBatchedBridge ([816d417189](https://github.com/facebook/react-native/commit/816d41718998868f276d83b0c21e17d11ad392a2) by [@mhorowitz](https://github.com/mhorowitz)) - -### Changed - -- Docs clarifications ([7abffc3f8c](https://github.com/facebook/react-native/commit/7abffc3f8ce69fab5bbb4147f9b8bcb85a7d2c38) by [@IgorGanapolsky](https://github.com/IgorGanapolsky)) - -#### iOS Specific Changes - -- ⚡️ **Text** and **TextInput** have been re-implemented from the ground up for performance, flexibility, and reduced technical debt ([2716f53220](https://github.com/facebook/react-native/commit/2716f53220f947c690d5f627286aad51313256a0), [74963eb945](https://github.com/facebook/react-native/commit/74963eb945438a6fd269b5764a6cb251c86deda8), [d7fa81f181](https://github.com/facebook/react-native/commit/d7fa81f18110f0dc0f310a5c066d9a30020ca830), [74963eb945](https://github.com/facebook/react-native/commit/74963eb945438a6fd269b5764a6cb251c86deda8), [6c4ef287ad](https://github.com/facebook/react-native/commit/6c4ef287ad95eb14475a9f512487e5d05949309a), [ebc98840e9](https://github.com/facebook/react-native/commit/ebc98840e93c336e8c9e4a93c78e6ca03591f0ec), [d7fa81f181](https://github.com/facebook/react-native/commit/d7fa81f18110f0dc0f310a5c066d9a30020ca830), [7d1ec7a3dc](https://github.com/facebook/react-native/commit/7d1ec7a3dc66654b13a8e9cb3ddf912e92506f55), [52648326e6](https://github.com/facebook/react-native/commit/52648326e6ac4470eeffc0a56d91bc487bc1eae4), [6bb8617f3a](https://github.com/facebook/react-native/commit/6bb8617f3a2f3f80f89eb00595a621aec35aca83), [5dbb3c586c](https://github.com/facebook/react-native/commit/5dbb3c586c9e8483aa7e6f1edd35ffb12bd4305d), [7e7d00aebe](https://github.com/facebook/react-native/commit/7e7d00aebefd2416f948066c65c739581c6e3f54), [46fd864348](https://github.com/facebook/react-native/commit/46fd8643485b21147c780d22ee8cf751b2dc8750), [9dfa2e7f3c](https://github.com/facebook/react-native/commit/9dfa2e7f3cfa5009f6c54382e90681d99a9c3cb8), [8a882fe6d6](https://github.com/facebook/react-native/commit/8a882fe6d6bb35776551eb8b0cd6892f41cab492), and [0f9fc4b295](https://github.com/facebook/react-native/commit/0f9fc4b2953d52fa1754e786dc5c74bfecbeaaca) by [@shergin](https://github.com/shergin) and [@hovox](https://github.com/hovox)) -- **Image**'s `resizeMode="center"` is now documented and has an example present ([be7037fd8e](https://github.com/facebook/react-native/commit/be7037fd8e1c4b92646caf7a70b9d6d28ef2c30a) by [@motiz88](https://github.com/motiz88)) -- Geolocation API no longer timeouts when `skipPermissionRequests: true` ([5c17db8352](https://github.com/facebook/react-native/commit/5c17db8352abfd94f094deb9b550284ec17f1fcd) by [@ngandhy](https://github.com/ngandhy)) -- Rounding pixels is now done with an algorithm from Yoga rather than React Native, reducing debt and improving performance ([ceb1d1ca5b](https://github.com/facebook/react-native/commit/ceb1d1ca5bc7c04b9d9ad16dcd9583f05b0ef498) and [114c258045](https://github.com/facebook/react-native/commit/114c258045ccca3a4433de206c7983b42d14c03b) by [@shergin](https://github.com/shergin)) - -#### Android specific changes - -- Numerous refactors around bundle handling and the `DevServerHelper` ([644123aa6f](https://github.com/facebook/react-native/commit/644123aa6fc6132125f56b485e5ab3b16f28f666), [e756251413](https://github.com/facebook/react-native/commit/e7562514130f614a9f138c0b855bfe4516150add), [6e44356c9b](https://github.com/facebook/react-native/commit/6e44356c9bb364195280aafc69aae48cdcb2ab84), [1019bda930](https://github.com/facebook/react-native/commit/1019bda930fa4c26fc0006efa023ee2c586705c6), [06d8f96a64](https://github.com/facebook/react-native/commit/06d8f96a64f00a003e34b0c1e93033893173ccc8), [f88c9d6382](https://github.com/facebook/react-native/commit/f88c9d63828e975a9792969e27accd851ead3e86), and [108f9664bf](https://github.com/facebook/react-native/commit/108f9664bffd1a4e0a7b2c2da3dc3810f1b29de2) by [@davidaurelio](https://github.com/davidaurelio)) - -### Fixed - -- Fix JS debugger issues related to CORS ([29f8354c19](https://github.com/facebook/react-native/commit/29f8354c1946a6325e9020b9ef5ee4ccdf0fa51f) by [@njbmartin](https://github.com/njbmartin)) -- Keep the `.gitignore`d files during the `react-native-git-upgrade` process ([7492860ffb](https://github.com/facebook/react-native/commit/7492860ffb3a010ff2273abf45c7414c098bdc37) by [@ncuillery](https://github.com/ncuillery)) -- Fix re-render case on SwipeableRow ([a580a44b0d](https://github.com/facebook/react-native/commit/a580a44b0d51ca7f33a4394b0a22d1c7d2234190)) -- Fix display of syntax error messages when HMR is enabled ([2b80cdf1bb](https://github.com/facebook/react-native/commit/2b80cdf1bba3b756915117139474440c203cbd8d) by [@ide](https://github.com/ide)) -- Add fixtures to metro blacklist in order to let build succeed ([54dc11a5fb](https://github.com/facebook/react-native/commit/54dc11a5fbafaccc9c0a781f1151225909717597) by [@t4deu](https://github.com/t4deu)) - -#### Android specific fixes - -- Don't crash when using decimal `Animated.modulo` values with `useNativeDriver: true` ([6c38972327](https://github.com/facebook/react-native/commit/6c389723274712bc52d6642cc6c1907b5523726d) by [@motiz88](https://github.com/motiz88)) -- Don't crash when receiving unknown websocket IDs ([1a790f8703](https://github.com/facebook/react-native/commit/1a790f8703d44c2322000dbf40a55678ca8a436a) by [@sunweiyang](https://github.com/sunweiyang)) -- Dont crash when `NativeModules.UIManager.showPopupMenu` method calls error callback ([0c18ec5b9c](https://github.com/facebook/react-native/commit/0c18ec5b9c64613dbdcd4be9f80e470e9532483d) by [@dryganets](https://github.com/dryganets)) -- Maintain cursor position when **TextInput**'s `secureTextEntry` changes ([09b43e479e](https://github.com/facebook/react-native/commit/09b43e479e97dfe31910503190b5d081c78e4ea2) by [@jainkuniya](https://github.com/jainkuniya)) -- Race condition fix in Dialogs module ([d5e3f081c6](https://github.com/facebook/react-native/commit/d5e3f081c6b41697533775d378969fcf554c7290) by [@dryganets](https://github.com/dryganets)) -- Fix NPE in Android Switch during measure ([7b1915e74d](https://github.com/facebook/react-native/commit/7b1915e74daa82d0a94e90ff266e9271bc43f4d8) by [@4ndroidev](https://github.com/4ndroidev)) -- Fix initialScrollIndex ([ef596dec49](https://github.com/facebook/react-native/commit/ef596dec49975dd4f8860ad8adcd29dd23e04c14) by [@olegbl](https://github.com/olegbl)) -- Fix redbox style ([f363dfe766](https://github.com/facebook/react-native/commit/f363dfe766244c8fc10eab3d2c4acdd8fc4b576b) by [@ayc1](https://github.com/ayc1)) -- Fix crash due to mishandling of UTF-8 in progressive download. ([9024f56bda](https://github.com/facebook/react-native/commit/9024f56bda4186fbade7bbd1e61f8e0252585c02) by [@dryganets](https://github.com/dryganets)) -- Fix crash because ClassCastException fix: getText() returns CharSequence not Spanned ([46cc4907e3](https://github.com/facebook/react-native/commit/46cc4907e3e49f5c7b1ac0a1088866f2958f43a1) by [@dryganets](https://github.com/dryganets)) -- Fix and re-enable "view flattening" optimizations ([877f1cde2e](https://github.com/facebook/react-native/commit/877f1cde2ebe8f304d6fd0855fc4a874d1d5ee27) by [@mdvacca](https://github.com/mdvacca)) - -#### iOS specific fixes - -- Fix Crash when **CameraRoll** is getting assets from iCloud and no filename is provided ([2ae24361c5](https://github.com/facebook/react-native/commit/2ae24361c5e0fc4aed9a321123bba8ca416a35ff) by [@pentarex](https://github.com/pentarex)) -- Fix Xcode Archive task failing if project path contains whitespace ([8aa568e867](https://github.com/facebook/react-native/commit/8aa568e867bbbe7e23ded3651f23581ff2753323) by [@jevakallio](https://github.com/jevakallio)) -- `react-native link` has been fixed to correctly link iOS and tvOS targets ([a63fd378a4](https://github.com/facebook/react-native/commit/a63fd378a47173cc9f750e9980f18dc12dd7ea51) by [@dlowder-salesforce](https://github.com/dlowder-salesforce)) -- `GLog` fix on case sensitive APFS macOS ([2fef1bafc8](https://github.com/facebook/react-native/commit/2fef1bafc8bee33432486212caf4fef5c659dd37) by [@hovox](https://github.com/hovox)) -- Fixed issue where you cannot launch tvOS app on Apple TV simulator ([afd988f85a](https://github.com/facebook/react-native/commit/afd988f85a8cf0980b5844cb88c1803e41502d03)) - -### Internal work - -- A **massive** amount of Yoga optimizations, cleanups, refactors, and test fixes ([62d01006a1](https://github.com/facebook/react-native/commit/62d01006a125517c8991fa93979aaec6ccc18823), [1475fc4856](https://github.com/facebook/react-native/commit/1475fc4856d366f8ec2027374971ed5aefcdeafa), [9daa17458a](https://github.com/facebook/react-native/commit/9daa17458a5f4ab8ead4d7c29de331f08b1a4a46), [d4517ddb9f](https://github.com/facebook/react-native/commit/d4517ddb9f2ad6d6175cbe6a8be2b819e4aa2c29), [ca91f0e3ac](https://github.com/facebook/react-native/commit/ca91f0e3ac55cb1e7a0fa2399d594a47de80a100), [34b7ec82b5](https://github.com/facebook/react-native/commit/34b7ec82b5d22efbdaa8b74b930d3c4da87414ec), [fda861a889](https://github.com/facebook/react-native/commit/fda861a88914a008b94c12078c9e579a99929643), [9f7cedbe14](https://github.com/facebook/react-native/commit/9f7cedbe14321d24b7aee1ba969b3d23d5c9d204), [ac1c8c265e](https://github.com/facebook/react-native/commit/ac1c8c265e6030c52434f99e882639c67c8c175d), [fcf2c7cf61](https://github.com/facebook/react-native/commit/fcf2c7cf61ca454f10d398d57b78b5b29ed05ae2), [2b27f1aa19](https://github.com/facebook/react-native/commit/2b27f1aa1964eba749876100be1f3ac4c085fa8f), [210ae5b95a](https://github.com/facebook/react-native/commit/210ae5b95a9c94194e95a21fdb93f88ddfdc5ce2), [82088580ab](https://github.com/facebook/react-native/commit/82088580ab17417a51386722f98b83d6cad0a6a0), [7f94bff89a](https://github.com/facebook/react-native/commit/7f94bff89a09547e76b50ae4c96ec59de73a153a), [bd7bf94af9](https://github.com/facebook/react-native/commit/bd7bf94af9ddfc9221ac3f6f62821b7e53e9b0ea), [2fe65b032e](https://github.com/facebook/react-native/commit/2fe65b032e9ec3faf3cef31290372b9face2d3f1), [9658d9f82b](https://github.com/facebook/react-native/commit/9658d9f82ba536c2f39937d61b3954e3dcc6a54e), [ee5c91c031](https://github.com/facebook/react-native/commit/ee5c91c0317b0defbb8da21f7e6d8d3ac8967381), [64d530ba07](https://github.com/facebook/react-native/commit/64d530ba0785af21555d48ddc9e7d561af37db4c), [400a29e151](https://github.com/facebook/react-native/commit/400a29e15134f5264cc55b239bd2a18a107911dd), [f75e21f1ca](https://github.com/facebook/react-native/commit/f75e21f1caf9117ae3eda31c23e286116ebf586c), [528bbacf6b](https://github.com/facebook/react-native/commit/528bbacf6b8a5a62faf4db5bfc8dfe063f0b82a3), [be8e7c6e65](https://github.com/facebook/react-native/commit/be8e7c6e65724d4915862098238506172dbe9657), [d0f7d4d107](https://github.com/facebook/react-native/commit/d0f7d4d107a90fdfbf795d842f4bd4a81290ec62), [4b4959a21c](https://github.com/facebook/react-native/commit/4b4959a21cb1e9e356eab51bfba0f16b76e8ec7f), [fdef3784f0](https://github.com/facebook/react-native/commit/fdef3784f00e8c3233a30aa2e35aaaadaa867489), [831a1bb4b1](https://github.com/facebook/react-native/commit/831a1bb4b1cc201b53685874a9dbdd6c3c1615ad), [2a22d998f8](https://github.com/facebook/react-native/commit/2a22d998f8a7f896db6c0708ba92ed9c9082ee7c), [9f57dedc17](https://github.com/facebook/react-native/commit/9f57dedc1712733ce4a490121138a97917fd3a52), and [ff2658c3de](https://github.com/facebook/react-native/commit/ff2658c3de111ef745d9582c6863ab0d6c90f960) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar), [@passy](https://github.com/passy), [@ryu2](https://github.com/ryu2), and others) -- 🚧 Lifecycle methods were renamed to be consistent with [React RFC6](https://github.com/reactjs/rfcs/blob/master/text/0006-static-lifecycle-methods.md) – note that there are Yellowbox warnings right now because of this, it's work-in-progress ([6f007e8957](https://github.com/facebook/react-native/commit/6f007e8957c9bf5652b0184cba65f385050a8236) by [@bvaughn](https://github.com/bvaughn)) -- Some autogenerated mystery string files were added ([c7846c4bfb](https://github.com/facebook/react-native/commit/c7846c4bfb5b944714d95382210f83c83da1ac52), [bb6fceac27](https://github.com/facebook/react-native/commit/bb6fceac274422102b347ec7aedb36efd9b701cd), [8bd00a2361](https://github.com/facebook/react-native/commit/8bd00a2361bb39f1bda58a260b7ffd278a05d79d), [faa9519021](https://github.com/facebook/react-native/commit/faa951902161201846f20a4dc55950e8f96cb0ff), [f49f7932d5](https://github.com/facebook/react-native/commit/f49f7932d581fe1f9569fb460196801528cfb591)) -- Improvements to the cli's implementation ([1673c570f9](https://github.com/facebook/react-native/commit/1673c570f984d86e88a3b6b44eb78f4848eb0515), [752427b7b8](https://github.com/facebook/react-native/commit/752427b7b8221bbb8304a158b2dad12b26afd7a5), and [619a8c9f29](https://github.com/facebook/react-native/commit/619a8c9f298356db68f8cd7e5d25e5bcf48bab05) by [@arcanis](https://github.com/arcanis), [@voideanvalue](https://github.com/voideanvalue), and [@rozele](https://github.com/rozele)) -- Measure touch events from nearest "root view" ([a70fdac5bd](https://github.com/facebook/react-native/commit/a70fdac5bdd4500b4ca3074dac26d414bd931fb9) by [@mmmulani](https://github.com/mmmulani)) -- Allow to attach the HMR server to an external http server ([8c6b816caa](https://github.com/facebook/react-native/commit/8c6b816caa908845471460f453f9d761bfba3f3d) by [@rafeca](https://github.com/rafeca)) -- Split folly/Memory out from headers-only targets in Buck ([b8e79a7e8b](https://github.com/facebook/react-native/commit/b8e79a7e8be1f3db1482a849352fda6e23c1c78a) by [@mzlee](https://github.com/mzlee)) -- Code cleanup of **ReactHorizontalScrollView** in Android ([71ec85f24c](https://github.com/facebook/react-native/commit/71ec85f24c3a1007a9e1f036a140cce43b38019f) by [@mdvacca](https://github.com/mdvacca)) -- Always create a debugger websocket connection when in iOS dev builds ([fa334ce464](https://github.com/facebook/react-native/commit/fa334ce464da39625f4e4fbfee259e9dcea31abc) by [@bnham](https://github.com/bnham)) -- Make the React Native HMR client extend from the generic metro HMR client ([9a19867798](https://github.com/facebook/react-native/commit/9a198677989930971912b98487ec68d162636411) by [@rafeca](https://github.com/rafeca)) -- Removed use of xip.io ([40a8434bde](https://github.com/facebook/react-native/commit/40a8434bde855ecae42408ec1240622152432de7) by [@jvranish](https://github.com/jvranish)) -- Fix Buck dependencies ([cec2e80fc2](https://github.com/facebook/react-native/commit/cec2e80fc251e4ea45ce1e446323716a3792390d), [4f6c157250](https://github.com/facebook/react-native/commit/4f6c157250676f07619af2a935bddd8301b50caa) by [@swolchok](https://github.com/swolchok)) -- Fix permissions on test script ([42c410ac84](https://github.com/facebook/react-native/commit/42c410ac84619a3d12a4619e59a0a526a3ebdca9) by [@mzlee](https://github.com/mzlee)) -- Better handling exception in loadScript() ([3fbf7856d9](https://github.com/facebook/react-native/commit/3fbf7856d9acb0909357d6b315388471a6b5a69c)) -- Fix ESLint upgrade "parsing error" ([9d214967d2](https://github.com/facebook/react-native/commit/9d214967d2c8184ce26addec150e392e3b519fcd) by [@zertosh](https://github.com/zertosh)) -- Fixing 🤡 in RCTSurfaceRootShadowView ([5fba82deff](https://github.com/facebook/react-native/commit/5fba82deffde731176e3e118193c212f5d2c2bca) by [@shergin](https://github.com/shergin)) -- Handle invalidation error in RCTObjcExecutor ([493f3e8da5](https://github.com/facebook/react-native/commit/493f3e8da5a112e1b33bfb3e9f51e7a2bd7edc7a) by [@fromcelticpark](https://github.com/fromcelticpark)) -- Check for nullptr when accessing isInspectable method ([70d23e82ad](https://github.com/facebook/react-native/commit/70d23e82ad21a4cfde1ce7c3b1c00fe7c7d5adbd) by [@fromcelticpark](https://github.com/fromcelticpark)) -- Introduce new Fabric API in RNAndroid ([2d35bde101](https://github.com/facebook/react-native/commit/2d35bde10130167018791c1b2fe4fece27cefddc) by [@mdvacca](https://github.com/mdvacca)) -- Fixing Prepack model for latest global.nativeExtensions changes. ([01a58d182a](https://github.com/facebook/react-native/commit/01a58d182abd19c9e089ec38b08ffd4b45e2076c) by [@NTillmann](https://github.com/NTillmann)) -- General code cleanup: unused code and configurations ([e233646d09](https://github.com/facebook/react-native/commit/e233646d095a272091b07c29fa87b206831ad6e3) and [e7010348d8](https://github.com/facebook/react-native/commit/e7010348d8b2f703fcc057c2914bd45ca6238f98) by [@bvaughn](https://github.com/bvaughn) and others) -- Add support for finding multiple views with NativeIds using a single listener to Android ([f5efc460ad](https://github.com/facebook/react-native/commit/f5efc460ad30cc60a62edd540c3b0f45c67bcda3) by [@axe-fb](https://github.com/axe-fb)) -- Add CountingOutputStream ([a5e135aed6](https://github.com/facebook/react-native/commit/a5e135aed6941772c663adffd67729f7a5026d08) by [@hramos](https://github.com/hramos)) -- Changes from Prettier ([b815eb59be](https://github.com/facebook/react-native/commit/b815eb59bef7bed9825027adc676b8d09db463c6), [e758cb7f39](https://github.com/facebook/react-native/commit/e758cb7f397b37b5621a4e0afcabc1c74443bc06), [bf9cabb03c](https://github.com/facebook/react-native/commit/bf9cabb03c7245930c270a19816545eae1b9007d), and [a5af841d25](https://github.com/facebook/react-native/commit/a5af841d259b6b29d95a9fb346a0ffce9c6efbfe) by [@shergin](https://github.com/shergin)) -- Typos in code ([8ffc16c6e7](https://github.com/facebook/react-native/commit/8ffc16c6e7d25dd434ca3fc7f9ffd6d5917f7bcd) by [@ss18](https://github.com/ss18)) -- Support for inherited events in view managers ([2afe7d4765](https://github.com/facebook/react-native/commit/2afe7d4765ffc0d0c71d233211edd1d21972040e) by [@shergin](https://github.com/shergin)) -- Flow types changes ([3fc33bb54f](https://github.com/facebook/react-native/commit/3fc33bb54fc5dcf7ef696fe245addc320f85a269), [e485cde187](https://github.com/facebook/react-native/commit/e485cde187e4cd92bc821e58047b149a789dd713), [83ed9d170b](https://github.com/facebook/react-native/commit/83ed9d170b8fd750a345fc608ec69db2fe3ca9b2), [52ffa5d13e](https://github.com/facebook/react-native/commit/52ffa5d13ef6fe2752bc8f838dc1c2dfe651bb64), [d37cdd97ae](https://github.com/facebook/react-native/commit/d37cdd97aee4c1bac864cb28b686f2d1a128128e), [6e7fb01c02](https://github.com/facebook/react-native/commit/6e7fb01c02f3e91777c8292389c09a15d24cf800), [d99ba70c49](https://github.com/facebook/react-native/commit/d99ba70c492d3cd15ef6aded3f8712976d251f88), [bcfbdf4fbe](https://github.com/facebook/react-native/commit/bcfbdf4fbec1a05da151a2255f44a87b651965d6), and [a1c479fb3b](https://github.com/facebook/react-native/commit/a1c479fb3be674511131b46f856bc9b197a38cda) by [@alexeylang](https://github.com/alexeylang), [@sahrens](https://github.com/sahrens), [@yungsters](https://github.com/yungsters), and [@zjj010104](https://github.com/zjj010104)) -- Give IInspector a virtual destructor for correct InspectorImpl destruction ([2a3c37f424](https://github.com/facebook/react-native/commit/2a3c37f424a4d1b9f4c5a2960a1cbe3517eac007) by [@toulouse](https://github.com/toulouse)) -- Migrated `SourceCode` and `DeviceInfoModule` out of Native Modules ([47fe52380a](https://github.com/facebook/react-native/commit/47fe52380a232a1c364e21f71e2644a5a3348366) and [429fcc8cab](https://github.com/facebook/react-native/commit/429fcc8cab3ca877275d7deb1040fdff17a414c7)) -- Jest config change as part of bringing back support for the `assetPlugin` option in Metro ([af6450c660](https://github.com/facebook/react-native/commit/af6450c660d3055d9c5c70d200471541a1ce7e12) by [@ide](https://github.com/ide)) -- Nested virtualized lists should receive recordInteration events ([ae2d5b1e68](https://github.com/facebook/react-native/commit/ae2d5b1e68a2207c27ef2f1b533f86c86d6d849b)) -- Upgrade connect dependency ([709ede799c](https://github.com/facebook/react-native/commit/709ede799cc9820acadaf22aa84f0fe6dd2be319) by [@rafeca](https://github.com/rafeca)) -- xplat/js: asyncRequire: redirect async modules to control modules ([5e11b8870a](https://github.com/facebook/react-native/commit/5e11b8870aa855a56cfafa6575aed5e33b272065) by [@jeanlauliac](https://github.com/jeanlauliac)) -- More progress towards split bundle support ([1a1a956831](https://github.com/facebook/react-native/commit/1a1a956831aec93a4fe2c6e2f63f558271fb466b) and [9e34cbda9d](https://github.com/facebook/react-native/commit/9e34cbda9de8f7350cfb02c884fbef2da18e0e3a) by [@fromcelticpark](https://github.com/fromcelticpark)) -- Implement bundle sync status ([88980f2ef7](https://github.com/facebook/react-native/commit/88980f2ef7331aa630ff19e54427cdc3b7510869)) -- Various improvements to RCTSurface and RCTShadowView ([7d9e902d72](https://github.com/facebook/react-native/commit/7d9e902d72e240f54ea01225cc3272698ff70014), [06ebaf2205](https://github.com/facebook/react-native/commit/06ebaf2205f979b6e6595ec7985447a07d25c4d4), [6882132421](https://github.com/facebook/react-native/commit/688213242130536c5d4db8b9aa17dc418372aadf), and [193a2bd4cd](https://github.com/facebook/react-native/commit/193a2bd4cdffbbc79b69c067b31420663dc9b03a) by [@shergin](https://github.com/shergin)) -- Progress towards experimental ReactFabric and FabricUIManager ([b1e5c01483](https://github.com/facebook/react-native/commit/b1e5c01483a69b181c75d242231077cb2f96e846), [fa0ac92b2c](https://github.com/facebook/react-native/commit/fa0ac92b2c9cfc302314ff18325a96354bb1f432), [94dac23583](https://github.com/facebook/react-native/commit/94dac23583dc6b693475769c196c4b51954e74f1) by [@fkgozali](https://github.com/fkgozali)) -- (almost) kill fbjsc ([702b7e877e](https://github.com/facebook/react-native/commit/702b7e877e09afede0dcdc7f8c680be63e942153) by [@michalgr](https://github.com/michalgr)) -- Refactored bridge ReadableNativeMap and ReadableNativeArray to add centralized accesses ([7891805d22](https://github.com/facebook/react-native/commit/7891805d22e3fdc821961ff0ccc5c450c3d625c8), [28be33ac34](https://github.com/facebook/react-native/commit/28be33ac34d9214ffd452f88a4d19468683a6a0d), and [5649aed6d3](https://github.com/facebook/react-native/commit/5649aed6d3223ec49c42416f242249eb0c4fd890)) -- Removed unused core from Image.android.js ([ce3146a6f3](https://github.com/facebook/react-native/commit/ce3146a6f3162141c7dc06d2c91ec291d3756a92) by [@shergin](https://github.com/shergin)) -- Capture StackOverflowExceptions triggered when drawing a ReactViewGroup or ReactRootView and log more debugging information for it ([1aac962378](https://github.com/facebook/react-native/commit/1aac9623789e3d2a428b51ae699d4c340b3afb99) and [4d3519cc6a](https://github.com/facebook/react-native/commit/4d3519cc6af5bb33c6f21d9392b82379780d79dc) by [@mdvacca](https://github.com/mdvacca)) -- `babel-preset-react-native`: only require plugins once ([df6c48cf36](https://github.com/facebook/react-native/commit/df6c48cf36d39a75a6196462d661ce75c6aef104) by [@davidaurelio](https://github.com/davidaurelio)) -- Report module id as string and as double, in case of invalid values are passed to nativeRequire ([8f358a2088](https://github.com/facebook/react-native/commit/8f358a20881b61cf3256fa1e404b86d5f104932d) by [@fromcelticpark](https://github.com/fromcelticpark)) -- More work moving build configurations to Skylark ([d3db764f38](https://github.com/facebook/react-native/commit/d3db764f383fc588a87e0d1e4267b310d6188bc8), [869866cc5c](https://github.com/facebook/react-native/commit/869866cc5c639d8c0257c776368381987a7f7159), [a8c95d2417](https://github.com/facebook/react-native/commit/a8c95d241757fefaa06ff49193975f7c103a6418), and [79a63d040f](https://github.com/facebook/react-native/commit/79a63d040f1346a0e320104fb35da405502aae19) by [@mzlee](https://github.com/mzlee), [@ttsugriy](https://github.com/ttsugriy), and others) -- `[RCTShadowView isHidden]` was removed ([c19bc79688](https://github.com/facebook/react-native/commit/c19bc7968855e85758df9e1a47dc2a52e69668ed) by [@shergin](https://github.com/shergin)) -- Remove unused `packagerInstance` option and rename it to `server` ([bbbc18c4ee](https://github.com/facebook/react-native/commit/bbbc18c4ee9b13a5aeca10edcb29694db3f15769)) -- The blog has moved to [react-native-website](https://github.com/facebook/react-native-website/tree/master/website/blog) ([e16d67340e](https://github.com/facebook/react-native/commit/e16d67340e0ad1724afeee78f9d820177abbd8b6) by [@hramos](https://github.com/hramos)) -- Remove SoLoaderShim, use SoLoader ([fc6dd78935](https://github.com/facebook/react-native/commit/fc6dd78935a41106aa6a44058c1abb7d0ba0fa24) by [@foghina](https://github.com/foghina)) -- Removed broken link for 'Getting Help' in the README ([b3a306a667](https://github.com/facebook/react-native/commit/b3a306a66709a0ab0ff29151a38eaa3f8f845c1f) by [@rickydam](https://github.com/rickydam)) -- Changed to use boost-for-react-native cocoapod, which speeds up `pod install` a ton; this was in 0.53 originally but had to be re-added ([d40db3a715](https://github.com/facebook/react-native/commit/d40db3a715afaf1cde4a5e231e96e46b2808bbef) by [@CFKevinRef](https://github.com/CFKevinRef)) -- Remove fbobjc's RN copy ([af0c863570](https://github.com/facebook/react-native/commit/af0c8635709b8014c68ce88ebb1e9e94ec56768a)) -- Measure time to create **ReactInstanceManager** ([6224ef5301](https://github.com/facebook/react-native/commit/6224ef5301d67266b28c77e5e46816f319122f38) by [@alexeylang](https://github.com/alexeylang)) -- Upgrade create-react-class to v15.6.3 ([74f386633d](https://github.com/facebook/react-native/commit/74f386633d5e123b2ea73b4773d0ee7d83832fb5) by [@bvaughn](https://github.com/bvaughn)) -- Upgrade react-devtools to v3.1.0 ([8235a49a33](https://github.com/facebook/react-native/commit/8235a49a33cc8e84cd4ba1cc15bc09eed6712b4c) by [@bvaughn](https://github.com/bvaughn)) -- Upgrade flow to v0.65.0 ([7aba456b04](https://github.com/facebook/react-native/commit/7aba456b04ff6a4e4721bcf1064f22a8a87f90c7) and [298f3bb69a](https://github.com/facebook/react-native/commit/298f3bb69abecdcd83adb64e043a2974bd52b1ab) by [@avikchaudhuri](https://github.com/avikchaudhuri) and [@mroch](https://github.com/mroch)) -- Upgrade Jest to v22.2.1 ([46f4d3e1bc](https://github.com/facebook/react-native/commit/46f4d3e1bc9340009c53f366ebd98600c485c993) and [24e521c063](https://github.com/facebook/react-native/commit/24e521c063035e470587bb279976a955ff03717a) by [@mjesun](https://github.com/mjesun)) -- Upgrade ESLint to v4.17.0 (plus update related deps) ([bba19e846e](https://github.com/facebook/react-native/commit/bba19e846e377241826475906f642264409a3990) by [@zertosh](https://github.com/zertosh)) -- Upgrade React to v16.3.0-alpha.1 ([03d7b2aa0e](https://github.com/facebook/react-native/commit/03d7b2aa0e7f239c78b6fe3a96c0ddf3de00a58b) and [5e80d95e03](https://github.com/facebook/react-native/commit/5e80d95e034259af8c41b50756a623756cc81a77) by [@grabbou](https://github.com/grabbou) and [@hramos](https://github.com/hramos)) -- Synced React and ReactFabric render ([c7ed03a95c](https://github.com/facebook/react-native/commit/c7ed03a95c8c372c7631c11e0778cf9753afdabc), [13829751b1](https://github.com/facebook/react-native/commit/13829751b11330f8e1400c5c70c59c49ac2f091f), and [d676746f14](https://github.com/facebook/react-native/commit/d676746f14fb6d714d2576871655b13c005480e7) by [@bvaughn](https://github.com/bvaughn)) -- Upgrade metro to v0.26.0 ([9e6f3b8aff](https://github.com/facebook/react-native/commit/9e6f3b8aff7572f5e9008a2641c70846da0817bb), [ce50f25d22](https://github.com/facebook/react-native/commit/ce50f25d22d56f24bdb7d80a3f9a279863d5dc2a), [e9b83e608e](https://github.com/facebook/react-native/commit/e9b83e608e8487ef8fcbfc956a52bfa7ee1d727f), [2fe7483c36](https://github.com/facebook/react-native/commit/2fe7483c36b10146f737f0a84799c2eb01aaba79), [0f96ebd93b](https://github.com/facebook/react-native/commit/0f96ebd93b634ec3fb0e6036a4960bb4af167e7b), [0de470ec19](https://github.com/facebook/react-native/commit/0de470ec19f2b9f3f4f3ab3dd4322c0f0ece2868), [e8893a021f](https://github.com/facebook/react-native/commit/e8893a021f60ffeea27443998b1716e9a1963d64), and [b1d8af48ae](https://github.com/facebook/react-native/commit/b1d8af48ae251f57bdcd55f89d8fc62aa9eca872) by [@rafeca](https://github.com/rafeca) and [@grabbou](https://github.com/grabbou)) -- Add Context to Redbox report api ([e3c27f585a](https://github.com/facebook/react-native/commit/e3c27f585aaeb685e86250f45fc790c06932af0d) by [@ayc1](https://github.com/ayc1)) -- GitHub bot commands have been disabled in the short term ([b973fe45bd](https://github.com/facebook/react-native/commit/b973fe45bdbc84e12fd0a3afbd6fdd327bcb9d02) by [@hramos](https://github.com/hramos)) -- Various CI configuration changes ([17bd6c8e84](https://github.com/facebook/react-native/commit/17bd6c8e84d9f5d42767a6f42a9a2cf812aa778b), [51b6749c07](https://github.com/facebook/react-native/commit/51b6749c075bb87a340096a0dc06cd6cf9a19907), [a2f3ba864e](https://github.com/facebook/react-native/commit/a2f3ba864ed17ca32e71f15724a8ebf2b1e640c1), [2ef9b7f2da](https://github.com/facebook/react-native/commit/2ef9b7f2da5b875ac1a4fee0ade3cc16ad96772a), [40b17926bb](https://github.com/facebook/react-native/commit/40b17926bb2c724f1580b2eb0c30a37f5d48030a), [613afbab7f](https://github.com/facebook/react-native/commit/613afbab7f30748ba767b055f23d0d294562805f), [da8bec9f8b](https://github.com/facebook/react-native/commit/da8bec9f8b62b46e58e0e98413aa915ece05b71b), [fa11faecb6](https://github.com/facebook/react-native/commit/fa11faecb69f385a5c0aba60f4039612e46b87f3), [f50af7f8a4](https://github.com/facebook/react-native/commit/f50af7f8a48e9cae2cb512962870d5692da5aaf2), [9227ba73ab](https://github.com/facebook/react-native/commit/9227ba73ab8c2b8b8ce4086b5f4667a8a55cdcfa), [365a4d4b43](https://github.com/facebook/react-native/commit/365a4d4b4315d4ca7a0e1236012b763d7e5bb1fd), [b58d848d9c](https://github.com/facebook/react-native/commit/b58d848d9cf78d755fe38392e26826ed481175cd), [c8e98bbaf5](https://github.com/facebook/react-native/commit/c8e98bbaf58b7a7f866e831982355b78dfa43b9d), [f5975a97ad](https://github.com/facebook/react-native/commit/f5975a97adcf3ae9c2988d7e267947a84ab60cee), and [605a6e4031](https://github.com/facebook/react-native/commit/605a6e4031fc9b63edbb9120ffacf7b045dc9db8) by [@hramos](https://github.com/hramos), [@grabbou](https://github.com/grabbou), and [@dryganets](https://github.com/dryganets)) -- Restore copyright header ([4f883bd0bc](https://github.com/facebook/react-native/commit/4f883bd0bcdc015e2cf70bcc29bbe05fd5b8a40b) by [@hramos](https://github.com/hramos)) -- Trim docs that are already present in the open source docs site ([28d60b68ad](https://github.com/facebook/react-native/commit/28d60b68ad7bc5b7ebda6b720981feacd3bde337) by [@hramos](https://github.com/hramos)) -- Fix obsolete instructions about editing docs ([2f46712074](https://github.com/facebook/react-native/commit/2f46712074d187f5456723499e6885bf0941cfbc) by [@ExplodingCabbage](https://github.com/ExplodingCabbage)) -- Fix links to beginner friendly issues ([c355a34de1](https://github.com/facebook/react-native/commit/c355a34de107befd26bc495272b91c11957f3fd0) by [@hotchemi](https://github.com/hotchemi)) -- Typos in comments and log messages ([d2c569795c](https://github.com/facebook/react-native/commit/d2c569795ca07b6b7c0227cfc6d0b3bf5dd23b99) by [@ss18](https://github.com/ss18)) -- Don't run the Danger CI tool through Flow ([1ea3065feb](https://github.com/facebook/react-native/commit/1ea3065feb265bef738bd53e835567d595266725) by [@hramos](https://github.com/hramos)) -- Namespace custom ESLint rules through eslint-plugin-lint ([488b6825c5](https://github.com/facebook/react-native/commit/488b6825c5fb4ec68a8b7315559c4d34e012de12) by [@zertosh](https://github.com/zertosh)) - -- ... and now we're at 0.54 🎉 ([67e67ec83c](https://github.com/facebook/react-native/commit/67e67ec83ce83d4a1a38bc29dd52bf5c28723752), [21dd3dd296](https://github.com/facebook/react-native/commit/21dd3dd296989f4de2d4e9b1ba0df88ea2d32413), [49e35bd939](https://github.com/facebook/react-native/commit/49e35bd9399716a2734e824bab14faf1683cdfdd), [829f675b8b](https://github.com/facebook/react-native/commit/829f675b8b4abae696151e404552af515a2da1ce), and [294d95a236](https://github.com/facebook/react-native/commit/294d95a23687b2e3155fe4ae1bc5e4a649e6b014) by [@grabbou](https://github.com/grabbou) and [@hramos](https://github.com/hramos)) - -## v0.53.0 - -Welcome to the January 2018 release of React Native. The CLI now supports `--port` for both platforms, a few components were made to support consistent props across both platforms, and various fixes were made. There was a lot of under-the-cover work done with more test improvements and dependency updates. 118 commits were made by 43 contributors 🎉. - -### Added - -- ✨ **Keyboard** events now include `easing` and `duration` ([4d33080f0f](https://github.com/facebook/react-native/commit/4d33080f0fa7b2eb7b0e9ff7bbd50c222f461786) by [@sahrens](https://github.com/sahrens)) - -#### iOS exclusive additions - -- `react-native run-ios` now supports the `--port` argument for metro ([33d710e8c5](https://github.com/facebook/react-native/commit/33d710e8c58ef1dc69816a59ac1cf390894e7cb9)) - -#### Android exclusive additions - -- On Android, **ScrollView** now takes `snapToInterval` like iOS ([ddd65f1ba9](https://github.com/facebook/react-native/commit/ddd65f1ba9cca945313d116c1dcf75f3a0556099) and [b2848a54b0](https://github.com/facebook/react-native/commit/b2848a54b05470b3e258c935dd33b8c11a31b3c3) ) -- On Android, **TextInput** now takes `onKeyPress` like iOS ([c9ff0bc212](https://github.com/facebook/react-native/commit/c9ff0bc212b680232f7379fba7b9332927075c3c) by [@joshyhargreaves](https://github.com/joshyhargreaves)) - -### Changed - -- ⬆️ Metro to v0.24.2 ([2e008bc464](https://github.com/facebook/react-native/commit/2e008bc464f94df013794d3da6e9d4e4722151a0) and [0b5e8b4852](https://github.com/facebook/react-native/commit/0b5e8b485229957086d416c307f07c75a4139ffa) by [@rafeca](https://github.com/rafeca)) -- ⬆️ Flow to v0.63 ([6b95c4fb14](https://github.com/facebook/react-native/commit/6b95c4fb142a7015b2afca50cc19eec0b8913d8c) by [@gabelevi](https://github.com/gabelevi)) -- ⬆️ Danger to v2.0 ([b750e3b21b](https://github.com/facebook/react-native/commit/b750e3b21bc5c135773e8de53c5663bdf6266951) by [@hramos](https://github.com/hramos)) -- ⬆️ Jest to v22.0.0 ([4803419dc8](https://github.com/facebook/react-native/commit/4803419dc8406b6892f20cdfb448a01c16ad4338) by [@mjesun](https://github.com/mjesun)) -- 💄 Bundler is now called Metro Bundler in the terminal ([654d7595fe](https://github.com/facebook/react-native/commit/654d7595fe5766667c015307129e75d8986482e1) by [@edcs](https://github.com/edcs)) -- 📝 Update getting started url on Android CLI ([6661633390](https://github.com/facebook/react-native/commit/6661633390276f707faa60509b2805a83929e747)) -- 🐳 Dockerfile uses newest Android SDK, Buck, and new Docker tags have been pushed ([4fbfbe6bb0](https://github.com/facebook/react-native/commit/4fbfbe6bb0e0eaaf12ec713888bf2c6a347f0f96) and [c547f783c4](https://github.com/facebook/react-native/commit/c547f783c440019a4a87ba55b668b3af5ff8fc91) by [@hramos](https://github.com/hramos)) -- 📝 Update repo docs to use HTTPS ([33a2e533b7](https://github.com/facebook/react-native/commit/33a2e533b76d35c1b9fb32e926f7c2c27cb616e9) by [@him2him2](https://github.com/him2him2)) -- 🎨 Make **ScrollResponder** follow code style ([45e6fcdba0](https://github.com/facebook/react-native/commit/45e6fcdba089900555faa63fe8e37b4bd4a7700a) by [@TheSavior](https://github.com/TheSavior)) -- **VirtualizedList** now requires a windowSize greater than 0 ([3559e42c55](https://github.com/facebook/react-native/commit/3559e42c55366bacd9bb5178ecab64f95e9a8ea7)) -- react-devtools works with emulator and real devices now without needing to tweak the devServer value ([fa574c6092](https://github.com/facebook/react-native/commit/fa574c60920588e29d7b642e547e240ac8655e66) by [@jhen0409](https://github.com/jhen0409)) -- 📝 Clarify use of Flow props types in react-native-cli's template project ([9b147a53d1](https://github.com/facebook/react-native/commit/9b147a53d1ab1e14d7ef5b436f1e140a28a5d6a3) by [@hramos](https://github.com/hramos)) -- 📝 Add docs for `isInspectable` ([59c7967627](https://github.com/facebook/react-native/commit/59c79676277abaaaf61388309429c77164c3de4b) by [@bnham](https://github.com/bnham)) -- ✅ More Flow improvements (**Text**, **SectionList**, and others) ([f71f4e7906](https://github.com/facebook/react-native/commit/f71f4e7906648766e1a5b630abbad8935daef955), [632f1202ab](https://github.com/facebook/react-native/commit/632f1202ab3f9dd300a53f096bc15325e0d8f6c1), and [a8391bde7d](https://github.com/facebook/react-native/commit/a8391bde7d757d01521a6d12170fb9090c17a6a0) by [@yungsters](https://github.com/yungsters), [@samwgoldman](https://github.com/samwgoldman), and others) -- Various code cleanup to satisfy linting errors and standards ([b0319f3293](https://github.com/facebook/react-native/commit/b0319f3293b553c105b813dd12bff7d55940e60b), [dd4611721d](https://github.com/facebook/react-native/commit/dd4611721d0ad49ceaf4514df1b47cf2753b9ae6), and [7f58189605](https://github.com/facebook/react-native/commit/7f5818960596a2a18b7d427fd23d46396c05bee5) by [@ayc1](https://github.com/ayc1), [@grabbou](https://github.com/grabbou), and [@ide](https://github.com/ide)) - -#### iOS exclusive changes - -- 🔥⚡️ iOS UI Manager cleanup and optimizations ([0ec1017660](https://github.com/facebook/react-native/commit/0ec1017660602d6b3ae84b4d7a444cbd49ba0d53), [0ae4c47daa](https://github.com/facebook/react-native/commit/0ae4c47daa6280d2931d8bbf89612b2f1cb106d4), [2679f3efb6](https://github.com/facebook/react-native/commit/2679f3efb69bc7b0db1840b4ea59ebe791a54dd2),and [d9e5b313bb](https://github.com/facebook/react-native/commit/d9e5b313bb63a1ec0d402a96539c6df29bc72c42) by [@shergin](https://github.com/shergin)) -- If the inspector tries to handle a wrapped event but there is no connection, log a warning rather than a Redbox ([30da2622e2](https://github.com/facebook/react-native/commit/30da2622e222c338421508ce6e5663155fc874ef) by [@bnham](https://github.com/bnham)) -- Various under-the-covers changes around the bridge, RCTShadowView, RCTSurface, and a few others ([c3139d798a](https://github.com/facebook/react-native/commit/c3139d798af633bb81bf0da6df05b3c0beb0ced4), [2789ba016b](https://github.com/facebook/react-native/commit/2789ba016bfddace1407473769e933795333cfab), [b8e60a3ca3](https://github.com/facebook/react-native/commit/b8e60a3ca3314d79e9c38ee8c7995df81a27624c), [099b28006b](https://github.com/facebook/react-native/commit/099b28006b59abb11eae1f27424566b280860b0d), [b263560c73](https://github.com/facebook/react-native/commit/b263560c73af5559fdc3bba411f16c588abbffef), [19a9c5e41d](https://github.com/facebook/react-native/commit/19a9c5e41da0aa6ee28a54772edcb92daa498561), [d3b41e0da3](https://github.com/facebook/react-native/commit/d3b41e0da37c08ab0637d9f70d612e50b6f5e63c), [b2a251948f](https://github.com/facebook/react-native/commit/b2a251948f3309d2b1d0d533fb2fa74d2f8a10b8), [870bc4807a](https://github.com/facebook/react-native/commit/870bc4807a8c3f90498cf4c2ed3c030cb7b43ef9), [176a578238](https://github.com/facebook/react-native/commit/176a578238566ad857c0911e127669f1ee82107d), [c491b22233](https://github.com/facebook/react-native/commit/c491b2223313676bd4900de7a8c70a10051fa9f0), [c75612219e](https://github.com/facebook/react-native/commit/c75612219ef0c99d1ddca0aadf354f20de27608c), and[c01a171ed8](https://github.com/facebook/react-native/commit/c01a171ed881fb91a972ed475011f85697a29341) by [@shergin](https://github.com/shergin)) -- Changed to use _boost-for-react-native_ cocoapod, which speeds up `pod install` a ton ([d40db3a715](https://github.com/facebook/react-native/commit/d40db3a715afaf1cde4a5e231e96e46b2808bbef) by [@CFKevinRef](https://github.com/CFKevinRef)) - -#### Android exclusive changes - -- Include scroll momentum info when there are scroll events from Android ([c49d249fd7](https://github.com/facebook/react-native/commit/c49d249fd7c274f02e6018892992bcd273d6a465) by [@wwalser](https://github.com/wwalser)) -- Yoga's mkfile for Android now uses wildcard instead of manual file addition ([d89901fa60](https://github.com/facebook/react-native/commit/d89901fa6002802dc9d744bfe3e5e712d6a411a1) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) - -### Removed - -- **TextInput** no longer has the `autoGrow` prop, since this is platform-default behavior now ([dabb78b127](https://github.com/facebook/react-native/commit/dabb78b1278d922e18b2a84059460689da12578b) by [@shergin](https://github.com/shergin)) - -#### iOS exclusive removals - -- Updates to the bridge in order to enable future rendering optimizations ([d2dc451407](https://github.com/facebook/react-native/commit/d2dc4514077ae868f85d45ccdcc7c69df7b7648b) by [@shergin](https://github.com/shergin)) - -### Fixed - -- Do not set `minify=true` when calculating the list of dependencies for the CLI ([4a1bb8fe8d](https://github.com/facebook/react-native/commit/4a1bb8fe8dfd36ea207c0683d683bb8b22a282a5) by [@rafeca](https://github.com/rafeca)) -- 👷 Update CODEOWNERS now that the docs are in a separate repository ([85ff264445](https://github.com/facebook/react-native/commit/85ff264445aa4b9cf0b91aaca5764bb56caba997) by [@hramos](https://github.com/hramos)) -- Fixed a broken link in react-native-git-upgrade's readme ([bbedf2da9a](https://github.com/facebook/react-native/commit/bbedf2da9a3a091eeb687d43029f7d2450cf2612) by [@Taym95](https://github.com/Taym95)) -- 🤡 Do not use Node 8.x specific Stream.final for FS mocks ([4216cdef13](https://github.com/facebook/react-native/commit/4216cdef13c9ed47b9c746b39a0ddfdaf846d495) by [@hramos](https://github.com/hramos)) -- Fix virtualized cell keys for list headers and footers ([a010a0cebd](https://github.com/facebook/react-native/commit/a010a0cebd4afc0d88336c2c265a5d9dbb19918f)) -- Fix warnings of casting and null pointer handling in Yoga ([a8d4666651](https://github.com/facebook/react-native/commit/a8d46666518944a178e85c179da8047234c2d8fb) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) -- Fix broken buck failures on master ([4e767013ed](https://github.com/facebook/react-native/commit/4e767013ed73fb89f69f2e59626d6dcf3bb77684) by [@hramos](https://github.com/hramos)) -- **RefreshControl** appears correctly when expected on initial render of a **FlatList** again ([ed5872e2cc](https://github.com/facebook/react-native/commit/ed5872e2cca955ee407e87e37e13c7fed182199a) by [@vonovak](https://github.com/vonovak)) -- Fixed JS debugger CORS issue ([29f8354c19](https://github.com/facebook/react-native/commit/29f8354c1946a6325e9020b9ef5ee4ccdf0fa51f) by [@njbmartin](https://github.com/njbmartin)) - -#### Android exclusive fixes - -- Fix position of dev loading view on Android API < 20 ([7ff6657985](https://github.com/facebook/react-native/commit/7ff6657985a09bd2572615d16403fba3af709859) by [@kmagiera](https://github.com/kmagiera)) -- Fix Modal not disappearing when navigating from inside a Modal to another activity ([e5c2a66897](https://github.com/facebook/react-native/commit/e5c2a66897b9c562c549e63adcf70783ea34c418) - -#### iOS exclusive fixes - -- Fix regression introduced where layout wouldn't occur in some situations ([46be5bf71c](https://github.com/facebook/react-native/commit/46be5bf71c78d33cda5cb496c475dcfb8e229346) by [@shergin](https://github.com/shergin)) -- Fixed double initial prop applying for newly created views ([0ec1017660](https://github.com/facebook/react-native/commit/0ec1017660602d6b3ae84b4d7a444cbd49ba0d53) by [@shergin](https://github.com/shergin)) -- tvOS build now works again ([3bd89867d6](https://github.com/facebook/react-native/commit/3bd89867d6f23547f07b9b3a569d5a62971004f6) by [@dlowder-salesforce](https://github.com/dlowder-salesforce)) - -### Other - -Below is a list of the remaining, low-level changes that made it into this release of React Native. - -- Remove "prepareReact" call from the bridge ([80f9e1f7de](https://github.com/facebook/react-native/commit/80f9e1f7de407ea417cecb04b3ba20b05696b478) and [56a42e57d0](https://github.com/facebook/react-native/commit/56a42e57d05ff609e8fce35dcb5e9db7938db801) by [@fromcelticpark](https://github.com/fromcelticpark)) -- Add explicit componentControllerClass to CKComponent for RCTSurface ([ab972708a8](https://github.com/facebook/react-native/commit/ab972708a8dcc9b37c19843f2fe134928a7c7a3f)) -- Changes to RCTShadowView to increase RCTSurface performance ([f96f9c5fd6](https://github.com/facebook/react-native/commit/f96f9c5fd692000f561e87cba68642ef7daf43e7) by [@shergin](https://github.com/shergin)) -- Designated methods to control dirty propagation ([af226ef949](https://github.com/facebook/react-native/commit/af226ef949f3a21ef68a6e6b9fbd4cc06fa05152) by [@shergin](https://github.com/shergin)) -- Add missing tvOS header ([49cbca7464](https://github.com/facebook/react-native/commit/49cbca7464e27c34105122459ae29cc3b1247513) by [@grabbou](https://github.com/grabbou)) -- On Android, seperate logic to initialize JS from starting the app ([4996b9aeb4](https://github.com/facebook/react-native/commit/4996b9aeb4127892b7579b45927dec14833b8b4d) by [@axe-fb](https://github.com/axe-fb)) -- ♻️ JS linting was cleaned up: removed unused libs, strengthened the rules, removed unneeded rules, prevent disabled tests, and more ([2815ada238](https://github.com/facebook/react-native/commit/2815ada23872fc28dc8dd5a9833962cb73f452eb), [183c316f4c](https://github.com/facebook/react-native/commit/183c316f4c869804b88cffe40614c84ac0a472d0), [9c67e749d8](https://github.com/facebook/react-native/commit/9c67e749d8f63cf14ece201ec19eee4676f96a85), [79902f99b8](https://github.com/facebook/react-native/commit/79902f99b81f538042b38a857182c2e5adbfd006), [9a36872f0c](https://github.com/facebook/react-native/commit/9a36872f0c7ba03a92fabf65e4d659d6861ea786), [67a3c42d1a](https://github.com/facebook/react-native/commit/67a3c42d1a29b6fa1375f7445d1c9b4429939bae), [b826596700](https://github.com/facebook/react-native/commit/b82659670041d0e472f68c0a14b3ef5b962db09b), [a1a0a69546](https://github.com/facebook/react-native/commit/a1a0a6954635141ce6c167816b67674aa5c31062), and [11a495cb32](https://github.com/facebook/react-native/commit/11a495cb3235ebbc2ad890e92ec612fd5316bffb) by [@TheSavior](https://github.com/TheSavior)) -- 👷 Separate JS lint and flow checks from tests ([5ea5683d01](https://github.com/facebook/react-native/commit/5ea5683d01487b49c814fca6e11a818b9a777239) by [@hramos](https://github.com/hramos)) -- 👷 Fix Buck in build config to enable CI ([796122d8f3](https://github.com/facebook/react-native/commit/796122d8f3b825c0bf0c138c662f3477f8bab123), [7c3a61f3b6](https://github.com/facebook/react-native/commit/7c3a61f3b610e219fd798eccd330deb9a2471253), [82b123e744](https://github.com/facebook/react-native/commit/82b123e744b87cc59c96b4e82af9ed03981b4f42) by [@grabbou](https://github.com/grabbou)) -- ♻️ Various refactoring within the YGNode implementation ([28968e2c0b](https://github.com/facebook/react-native/commit/28968e2c0ba23db9af12b47681f165d29d0f132d), [0a9e652bdd](https://github.com/facebook/react-native/commit/0a9e652bdd031d53d712e2e9610fb608bfa54ff1), [6627d7723c](https://github.com/facebook/react-native/commit/6627d7723c2df244ccc8a462bd98499cc11da2e2), and [d85da86dc7](https://github.com/facebook/react-native/commit/d85da86dc7c7833e71099c6a621547bc3cec8d4f), [a163f70f87](https://github.com/facebook/react-native/commit/a163f70f875dff4428eebd989bfaf28dda6551bf) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) -- Fix ReactLegacy and delete RCTViewControllerProtocol ([a0ff8c7706](https://github.com/facebook/react-native/commit/a0ff8c7706fc37bdce78c9ec51da320f78d16a24) by [@javache](https://github.com/javache)) -- Define internal FB macro for OSS builds; remove some unused definitions ([077c3ab349](https://github.com/facebook/react-native/commit/077c3ab34952f4b442abdd7a47ab54ca4bd0ba2e) and ([a6a66c5b39](https://github.com/facebook/react-native/commit/a6a66c5b3943443e4016f32407e4a4f8d707e387) by [@ttsugriy](https://github.com/ttsugriy)) -- RNTester: Relax Bridge Release Check ([e3c6f38773](https://github.com/facebook/react-native/commit/e3c6f38773d0b578794726033d4fabbfa48d1c7b) by [@yungsters](https://github.com/yungsters)) -- Remove embeddedBundleURL from the asset resolver ([489b98bf10](https://github.com/facebook/react-native/commit/489b98bf1006818ba985e93478a088c0e1e1aae7)) -- Do not set FB_ASSERTION_ENABLED ([4cdbb77c33](https://github.com/facebook/react-native/commit/4cdbb77c3363e120877ff66f39cdcf51d668df7d) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) -- JSBigString to MAP_PRIVATE not MAP_SHARED ([f9f40cd3e4](https://github.com/facebook/react-native/commit/f9f40cd3e486314cd75bda8722147f2f0f5b8fe1)) -- Fixed black ARTSurfaceView ([5c8481e836](https://github.com/facebook/react-native/commit/5c8481e83646b9cae482a803c878fb007f370035) by [@shergin](https://github.com/shergin)) -- Kill orphaned marker end in JSCExecutor ([6ad1f0957a](https://github.com/facebook/react-native/commit/6ad1f0957a020cb57b177ab015c17aa883e1f0ad) by [@michalgr](https://github.com/michalgr)) -- Make YGNode as c++ struct with properties exposed through accessors ([f1055bcac8](https://github.com/facebook/react-native/commit/f1055bcac8b580c40f9646687e7a950fb6864c74) by [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) -- 🔖 ...and now we're at 0.53.0-rc.0 🎁 ([0b996577e3](https://github.com/facebook/react-native/commit/0b996577e321d439aa6ede4c7400ea76efb7816a) by [@grabbou](https://github.com/grabbou)) - -## v0.52.0 - -> This changelog has been prepared by Ryan Turner (@turnrye) - thank you for -> your time and making such a detailed changelog 🔥🔥 - -This release had a lot of work around the bundler and packager, a ton of -bugfixes, and updates to many of React Native's dependencies. Lots of -under-the-hood work was done as well to improve the layout engine. Happy new -year! - -> If you would like to help us with the next release changelog, please contact -> @grabbou - -### Added - -- Prettier has a config and an npm script; try it out with `npm run prettier` - ([164591218f](https://github.com/facebook/react-native/commit/164591218f5fab7d386e057e0d51b9c1fe30b0a9) by - [@janicduplessis](https://github.com/janicduplessis)) -- **Debug JS in Nuclide** is now an option in the dev menu 🐜 - ([7c7108a1e8](https://github.com/facebook/react-native/commit/7c7108a1e8e9354d8aeb2f0ff712561d8aa19408) and - [de424cc291](https://github.com/facebook/react-native/commit/de424cc291523a8f4e3d33059b725d5b85f31611)) -- Introducing **PlatformOS** – it looks a lot like **Platform**, but with a - simplified API - ([5ee27ff755](https://github.com/facebook/react-native/commit/5ee27ff7552a5707a6e6bdb3f23e7378f978a2f7) by - [@brishin](https://github.com/brishin)) -- New experimental _RCTSurface_: measure and layout a UI in a thread-safe and - synchronous manner - ([be6976d6fa](https://github.com/facebook/react-native/commit/be6976d6faa333311405bd6184300bbd8da6cbca), - [7df58e23a3](https://github.com/facebook/react-native/commit/7df58e23a3a265b0df0edc753cc79a153fec90d8), - [e75bd87a76](https://github.com/facebook/react-native/commit/e75bd87a76726a9b075061ef76156705b3c1e872), - [aa83b5a0ca](https://github.com/facebook/react-native/commit/aa83b5a0ca30736b2800833bcc6149dcbe8436fa), - [081f7d14ad](https://github.com/facebook/react-native/commit/081f7d14aded077a7627404e5e2d48163a5707ad), - [da17b237e1](https://github.com/facebook/react-native/commit/da17b237e15e20adf20d6b917349d6389efb17fd), - [e9e0cd7ab8](https://github.com/facebook/react-native/commit/e9e0cd7ab86c98bcd3201e306e96532685d8de1d), - [43b2509320](https://github.com/facebook/react-native/commit/43b25093202472c5af07d4f393d831e4d1484b07), - [ba6075120a](https://github.com/facebook/react-native/commit/ba6075120af9c0086b449aafa7420913fa58f746), - [d71d28f094](https://github.com/facebook/react-native/commit/d71d28f09495a1e2802db169e2d0cd1ec5bd5973), - [4d37cf0fbc](https://github.com/facebook/react-native/commit/4d37cf0fbcc529ad75eb4a04a185036a887e42c2), and - [d021dd25da](https://github.com/facebook/react-native/commit/d021dd25da92d84c62c9a77049bb798e3b891447) by - [@maicki](https://github.com/maicki) and - [@shergin](https://github.com/shergin)) -- Experimental **SwipeableRow**'s datasource now has a `getLastRowID` method - ([d79e245d19](https://github.com/facebook/react-native/commit/d79e245d19f7f246322bc657b407198b15cb1b98)) -- [React Native monthly - #5](https://reactnative.dev/blog/2017/11/06/react-native-monthly-5.html) - was added ([3c5a55ddc2](https://github.com/facebook/react-native/commit/3c5a55ddc21197cfa013dc6222e398138759b5d3) - by [@tenodi](https://github.com/tenodi)) - -#### iOS Specific - -- **DatePickerIOS** now takes **locale** 🌍 - ([fd9c3618fc](https://github.com/facebook/react-native/commit/fd9c3618fcd3dc80f9abf3da779627704c7350e4) by - [@RobertPaul01](https://github.com/RobertPaul01)) -- **CameraRoll** can now **deletePhotos** 📸 - ([554e873f58](https://github.com/facebook/react-native/commit/554e873f585ea05ce1e9fe4ff71173c47b3c259c) by - [@fxfactorial](https://github.com/fxfactorial)) -- There's now an API to specify a different directory for iOS image assets - ([8f9b291224](https://github.com/facebook/react-native/commit/8f9b291224d1ca57a5f90200ec4687abb4706f4b)) -- Support for [custom accessibility - actions](https://developer.apple.com/documentation/uikit/uiaccessibilitycustomaction) - on iOS ([36ad813899](https://github.com/facebook/react-native/commit/36ad8138997c195b8728906ceb51bd31338b6a24) by - [@ericdavmsft](https://github.com/ericdavmsft)) - -### Deprecated - -- Ignore YellowBox warnings with `YellowBox.ignoreWarnings([...])` rather than - `console.ignoredYellowBox = [...]` - ([26038f50bb](https://github.com/facebook/react-native/commit/26038f50bb003eec3770e2b66d428fbb739f1ce2) by - [@wli](https://github.com/wli)) - -### Changed - -- Metro-bundler is now metro, and it's v0.24.1; there were some performance - increases at the cost of a few breaking changes; improved tests of the bundler - too ([0bbd9f042a](https://github.com/facebook/react-native/commit/0bbd9f042a8ad7c7be094bd7636ca767c6f7b231), - [a2fd3fcef8](https://github.com/facebook/react-native/commit/a2fd3fcef84e916b36ef7753dff69b7c1b307890), - [503b4521a6](https://github.com/facebook/react-native/commit/503b4521a6ce6bb2282631df616440fa71416d25), - [654fed46f4](https://github.com/facebook/react-native/commit/654fed46f49b5002096ff55c2e8523af48b22c24), - [0091496891](https://github.com/facebook/react-native/commit/009149689119e180415f8138b2827366768fc1d3), - [aba148f733](https://github.com/facebook/react-native/commit/aba148f733e85a88d4be07b3b8ca37c43cf6a51e), - [3d5dc872a4](https://github.com/facebook/react-native/commit/3d5dc872a4eefa1557554b3b338227959d166370), - [48019a0c2a](https://github.com/facebook/react-native/commit/48019a0c2a9a45d51a4faab1d5bef52949f4b5c5), - [ecec4319c4](https://github.com/facebook/react-native/commit/ecec4319c4fda9bebc90216d5340442b2a5725df), - [f4d627c8fa](https://github.com/facebook/react-native/commit/f4d627c8faeb034eac8053fd253f17e42b85f2f2), - [f871d25eb4](https://github.com/facebook/react-native/commit/f871d25eb48dca224bb3796aa9cb5d714292662f), - [a7b231a327](https://github.com/facebook/react-native/commit/a7b231a3278e4fc2d7e4269ce106f22712f2e5a8), - [830b431453](https://github.com/facebook/react-native/commit/830b43145381e6e322569450affddba73f7dc2d1), - [29dafa1a86](https://github.com/facebook/react-native/commit/29dafa1a8644f7a537499074df334bab8da4ad00), - [7a5d5a4035](https://github.com/facebook/react-native/commit/7a5d5a40357bedfb24a01ff1160481656fda9554), - [4cd685a1e0](https://github.com/facebook/react-native/commit/4cd685a1e0a2ae07df02702dbf4702e407773df5), - [d326c86051](https://github.com/facebook/react-native/commit/d326c860519c5165c6e86fb4f3ce378ed055157c), - [231c7a0304](https://github.com/facebook/react-native/commit/231c7a03043b9fb3c4bf81251ad099bab0ba05c2), - [7d969a05de](https://github.com/facebook/react-native/commit/7d969a05de6a45543bc31a3b982828865bc57cdb), - [ae517307e7](https://github.com/facebook/react-native/commit/ae517307e76d977f813e5b880f3b7f42a20f461d), - [f587f8d51d](https://github.com/facebook/react-native/commit/f587f8d51dc57e6b9eb66edfbe58ee520a6cc568), - [fbf0aed3ac](https://github.com/facebook/react-native/commit/fbf0aed3acc056b5fd069af75fcae14246439a48), - [e9393f694d](https://github.com/facebook/react-native/commit/e9393f694d8f0d0190a3576fd65a65f747f8cce2), and - [968c88d141](https://github.com/facebook/react-native/commit/968c88d1410eac5b793345bacce6052f518fda8f) by - [@cpojer](https://github.com/cpojer), [@hramos](https://github.com/hramos), - [@jeanlauliac](https://github.com/jeanlauliac), and - [@rafeca](https://github.com/rafeca) - ) -- React is now v16.2.0, and it took react-test-renderer along with it; [now with - more - fragments!](https://react.dev/blog/2017/11/28/react-v16.2.0-fragment-support.html) - 🎉 ([c7f37074ac](https://github.com/facebook/react-native/commit/c7f37074ac89f7e568ca26a6bad3bdb02812c39f) and - [cd938d731c](https://github.com/facebook/react-native/commit/cd938d731c7531a683c050cd829a543d145e3dc1) by - [@bvaughn](https://github.com/bvaughn)) -- Jest is now v21.3.0-beta.13 - ([16bbd908e7](https://github.com/facebook/react-native/commit/16bbd908e72577e7d109397916323a0eeffce8d4) and - [ec2ea58e57](https://github.com/facebook/react-native/commit/ec2ea58e57872bfa077d9c9a5e1e8b253c6b37b3) by - [@mjesun](https://github.com/mjesun)) -- Flow is now v0.61.0, and there were a ton of Flow fixes/coverage improvements - made ([914ae93336](https://github.com/facebook/react-native/commit/914ae9333678df4888e3c72898991c8430625cce), - [eb0d6470e5](https://github.com/facebook/react-native/commit/eb0d6470e54663538610a70ab0bae9847eb33673), - [c8e72bb8b8](https://github.com/facebook/react-native/commit/c8e72bb8b8317bcdcb4fe2ff85978c7db70f4461), - [2d4bedba0f](https://github.com/facebook/react-native/commit/2d4bedba0f6a8f2cfe597a1044822eb635d5e243), - [e0202e459f](https://github.com/facebook/react-native/commit/e0202e459fd0181db551d0025ef562d7998186b0), - [2be3ae1ff2](https://github.com/facebook/react-native/commit/2be3ae1ff2441c0ee3f2b9255c23dc49ada852fe), - [22a1419900](https://github.com/facebook/react-native/commit/22a14199000ea994f24f6fe387ea26647af3c128), - [6ae0b344e5](https://github.com/facebook/react-native/commit/6ae0b344e5c221657287d1fc1511be520a6f6e58), - [76a2ca4c9c](https://github.com/facebook/react-native/commit/76a2ca4c9c09c9bdf922154c28040138a44ae672), - [3259353fce](https://github.com/facebook/react-native/commit/3259353fcec0dd9ea66de750a694c226f99f483d), - [e6c1fb7212](https://github.com/facebook/react-native/commit/e6c1fb72128fb13436028c2df9cdccf6ccfccb67), - [61d046be3c](https://github.com/facebook/react-native/commit/61d046be3c9b00f6a4d4f492d558a961a6d4210f), - [820cfa1f3b](https://github.com/facebook/react-native/commit/820cfa1f3b79406e47cb873773cadafefe0effb1), - [240039c6f2](https://github.com/facebook/react-native/commit/240039c6f2d8db700ebc15404b0acc2a49068249), - [343c5a97a0](https://github.com/facebook/react-native/commit/343c5a97a013669745cf3938728539001d3076e6), - [5f8d8e90c2](https://github.com/facebook/react-native/commit/5f8d8e90c2c43127b8a5d2fc5d18f16185c7a67e), and - [da047966e4](https://github.com/facebook/react-native/commit/da047966e4c2064a48e02ff74830c99808d8194b) by - [@Ashoat](https://github.com/Ashoat), - [@calebmer](https://github.com/calebmer), - [@cdlewis](https://github.com/cdlewis), - [@deecewan](https://github.com/deecewan), - [@grabbou](https://github.com/grabbou), - [@jamesisaac](https://github.com/jamesisaac), - [@mroch](https://github.com/mroch), [@nmn](https://github.com/nmn), - [@nmote](https://github.com/nmote), [@sahrens](https://github.com/sahrens), - [@samwgoldman](https://github.com/samwgoldman), - [@TheSavior](https://github.com/TheSavior), and others) -- react-devtools-core is now v3.0.0 - ([a7d46ea970](https://github.com/facebook/react-native/commit/a7d46ea97012bdcc644e3397bbf60bd3cb37e9eb) by - [@rsnara](https://github.com/rsnara)) -- Split out docs to [their own - repo](https://github.com/facebook/react-native-website/tree/master/docs) (and - a few formatting fixes along the journey) 👋 - ([2d86618e7e](https://github.com/facebook/react-native/commit/2d86618e7ef477cdfc2ed510c7bc05d41dbfe972), - [64d80b13db](https://github.com/facebook/react-native/commit/64d80b13db3dd28bb5d93cbedf511ae8f91e2127), - [3362da421c](https://github.com/facebook/react-native/commit/3362da421ce919fc6f4f1bda29b59e2e3bfe02de), - [75123c614b](https://github.com/facebook/react-native/commit/75123c614bb5a61c383cdc247230b3a76c76e14d), and - [79e24ede40](https://github.com/facebook/react-native/commit/79e24ede40b2508aaa77b8ff3876d3dbf4cfe6d8) by - [@hramos](https://github.com/hramos)). -- **TouchableHighlight** now has a default delayPressOut value of 100; it was - also refactored a bit for style - ([9a31fa5fd6](https://github.com/facebook/react-native/commit/9a31fa5fd62fa101b2a76c69b56248d7f5ba9876) by - [@sahrens](https://github.com/sahrens)) -- When in a dev build, more robustly validate arguments for native methods - ([ea2e2c54cb](https://github.com/facebook/react-native/commit/ea2e2c54cb4d1a99b41aaa98eaf51696d34770dd) by - [@mhorowitz](https://github.com/mhorowitz)) -- On integration tests, report _all_ errors - ([3bcb912786](https://github.com/facebook/react-native/commit/3bcb9127866ef60b3697553e98a3ae279d02290a) by - [@sahrens](https://github.com/sahrens)) -- Yoga has less technical debt, thanks to replacing _YGNodeList_ with vectors - ([b08a912f11](https://github.com/facebook/react-native/commit/b08a912f11c729f3fe76700c6614f9e6165ae1a1) by - [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) -- Yoga is now cpp, compiled as _c++1y_ - ([d7ab9496bc](https://github.com/facebook/react-native/commit/d7ab9496bc95f7b720fd6db1ed503af1c461e84d) by - [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar)) -- Bundle segments are handled better and used more - ([681278947e](https://github.com/facebook/react-native/commit/681278947eb4039a1d7a65f1edfeef25ae055a4f), - [a47431ed74](https://github.com/facebook/react-native/commit/a47431ed74f0b7b2a03ca48e84f2243d08ef3bdd), - [963c61d4d5](https://github.com/facebook/react-native/commit/963c61d4d546c94b689281ca1f5105ad050e10ff), - [b9f21dc2be](https://github.com/facebook/react-native/commit/b9f21dc2be14cd51543e6b2d1e63a861e5f433d1), - [f1258181ee](https://github.com/facebook/react-native/commit/f1258181eec84f73651d2fabd0d23764b8990ff8), and - [1988ba1d79](https://github.com/facebook/react-native/commit/1988ba1d7967dca04376e7e631e8910e5e79a6a7) by - [@fromcelticpark](https://github.com/fromcelticpark) and - [@jeanlauliac](https://github.com/jeanlauliac)) -- _packager-worker-for-buck_ has better tests - ([7fd5aa84a1](https://github.com/facebook/react-native/commit/7fd5aa84a1ef1744d01e7e877183b1f004216d00) by - [@jeanlauliac](https://github.com/jeanlauliac)) -- _RCTUIManager_ has less technical debt - ([46be5bf71c](https://github.com/facebook/react-native/commit/46be5bf71c78d33cda5cb496c475dcfb8e229346), - [60dc9bed00](https://github.com/facebook/react-native/commit/60dc9bed00cc13652752bf84f83c920ce66d5e39), and - [21714fe197](https://github.com/facebook/react-native/commit/21714fe1979ccbd62d665f383625f4ece8cf888e) by - [@shergin](https://github.com/shergin)) -- Numerous bridge changes, especially around URL resolution - ([e7bd0f056b](https://github.com/facebook/react-native/commit/e7bd0f056bf4edca1f0529d6eed03bbaaaca586a), - [260e6d2355](https://github.com/facebook/react-native/commit/260e6d23554a8e7f1743263894c9ca9a0cfbf01e), - [4894ac430d](https://github.com/facebook/react-native/commit/4894ac430d6df1118ce48f644fd8cf5bfce6344f), - [b983de9c54](https://github.com/facebook/react-native/commit/b983de9c5460e24c95a9a67f02695cd1c5f31bc5), - [b0193b098c](https://github.com/facebook/react-native/commit/b0193b098cdbd915bba90e1ab0b695ba44346f44), - [ae5ef653cb](https://github.com/facebook/react-native/commit/ae5ef653cbc4c03fe5edb5d4b0002e38cbb6f458), and - [1d6ce2311f](https://github.com/facebook/react-native/commit/1d6ce2311f6a51821b33c5473414d70c8bd34425) by - [@fromcelticpark](https://github.com/fromcelticpark) and others) -- Various cleanup and refactoring - ([053776338e](https://github.com/facebook/react-native/commit/053776338ea44c31f3671cb4502853da0c88e55a), - [0984f29a32](https://github.com/facebook/react-native/commit/0984f29a320ce7e40e8bc2a6c78b080908fa1384), - [6c70975689](https://github.com/facebook/react-native/commit/6c70975689d0f0839e6c2db9a9a25c3023f5be7b), - [d950dc6a21](https://github.com/facebook/react-native/commit/d950dc6a21c5cc1e736993b2ecc16abae086389e), - [70c359000a](https://github.com/facebook/react-native/commit/70c359000a2df091c3939f4c19db6024af992d43), - [cfa2bbf2f6](https://github.com/facebook/react-native/commit/cfa2bbf2f692d0bc5600d7e369a9a91272930ca6), and - [850efa8650](https://github.com/facebook/react-native/commit/850efa86508b19d800ff8cbdc725402c006db1a2) by - [@bnham](https://github.com/bnham), - [@priteshrnandgaonkar](https://github.com/priteshrnandgaonkar), and others) -- Jest preprocessing now uses the AST from metro - ([2ae255a6ea](https://github.com/facebook/react-native/commit/2ae255a6eaf820992bdf19799bb4403f3bbdcd5b) and - [d5b59517c2](https://github.com/facebook/react-native/commit/d5b59517c274874d7ce21e5c26d28b42ae389723) by - [@rafeca](https://github.com/rafeca)) -- `renderApplication()` now supports async initial render - ([1b22d49ae8](https://github.com/facebook/react-native/commit/1b22d49ae8945680dee4fd01e3fbb78b1e443e01) by - [@bvaughn](https://github.com/bvaughn)) -- Welcome [@lwinkyawmyat](https://github.com/lwinkyawmyat) to the React Native - GitHub Issue Task Force - ([4ebe76d559](https://github.com/facebook/react-native/commit/4ebe76d5598621160ffcf3ea8bc87c3ad1c1a2f8) by - [@lwinkyawmyat](https://github.com/lwinkyawmyat)) - -#### Android exclusive changes - -- Native components on Android register lazily rather than via ViewManager - ([1b71e03932](https://github.com/facebook/react-native/commit/1b71e03932f44e212b297b2c1e02100b6de74b93)) -- Android debug overlays (like **RedBox**, dev menu, loading) are no longer are - system overlays; they're now part of the _currentActivity_ - ([d19afc73f5](https://github.com/facebook/react-native/commit/d19afc73f5048f81656d0b4424232ce6d69a6368) by - [@kmagiera](https://github.com/kmagiera)) - -#### iOS exclusive changes - -- Improve iOS's _accessibilityLabel_ performance by up to 20% 📈 - ([19b0a65c5e](https://github.com/facebook/react-native/commit/19b0a65c5ecc4f41fea98a1e752785d6dbb6ea05) by - [@chendo](https://github.com/chendo)) - -### Fixed - -- Fix `backgroundColor` on **TouchableHighlight** - ([5a1171ebfa](https://github.com/facebook/react-native/commit/5a1171ebfaaedd9c7d5f1bfcf306049c3671a733) by - [@sahrens](https://github.com/sahrens)) -- Various corrections in messages, comments, and docblocks - ([58c3bc4901](https://github.com/facebook/react-native/commit/58c3bc490143b8d7831a00289e2565f49f5389ef), - [354e1cb508](https://github.com/facebook/react-native/commit/354e1cb5088a43fd4116504a34a65ca53c4de71b), - [58edf024a1](https://github.com/facebook/react-native/commit/58edf024a1ed3a71ef04f124546ee97496b6502f), - [b9e7006cc6](https://github.com/facebook/react-native/commit/b9e7006cc6dc2b0801ea0c776ba00cdea2204151), - [d2f0abdf4e](https://github.com/facebook/react-native/commit/d2f0abdf4ea94fbb3e2a5c7fb53ff5d1cf6abede), - [94cd9f5591](https://github.com/facebook/react-native/commit/94cd9f55915973355cdb63276b71f90df10281db), - [8547b7e111](https://github.com/facebook/react-native/commit/8547b7e11163d545b7b99d4bdd063ef71129d62c), - [44c16499fd](https://github.com/facebook/react-native/commit/44c16499fdc4665298f6c88b9ffee626fa1fc969), - [c91d87213e](https://github.com/facebook/react-native/commit/c91d87213e6862019b9ef7df7c38551bd6d659fd), - [85503a0612](https://github.com/facebook/react-native/commit/85503a0612b0c74b4d204e8748e9ed7010d838e4), and - [5b83dbe25a](https://github.com/facebook/react-native/commit/5b83dbe25af151d183009006b1fe323b2658d025) by - [@behrends](https://github.com/behrends), - [@bvaughn](https://github.com/bvaughn), - [@charpeni](https://github.com/charpeni), - [@dsandmark](https://github.com/dsandmark), - [@gusgard](https://github.com/gusgard), - [@nkabrown](https://github.com/nkabrown), - [@petterh](https://github.com/petterh), [@solon](https://github.com/solon), - [@swashcap](https://github.com/swashcap), and others) -- Various dev doc and project doc fixes for correctness and completeness - ([92c0980540](https://github.com/facebook/react-native/commit/92c0980540dde0053bad05fae6414cf8275a71b1), - [3c9092acf3](https://github.com/facebook/react-native/commit/3c9092acf39ecdb7c137a3cb0d4282694e95cbf5), - [e906525e84](https://github.com/facebook/react-native/commit/e906525e84f69a98de4d06ed1ec4c43d8589e350), - [60828566a7](https://github.com/facebook/react-native/commit/60828566a759dc579dbae1d76a8426e1e479166e), - [c49b97c4ef](https://github.com/facebook/react-native/commit/c49b97c4ef65a6351af437ef28033cb31ea0446f), - [45ed142596](https://github.com/facebook/react-native/commit/45ed14259677cff4cbd133e705ec4f0ec84bc216), - [cb6ec7c321](https://github.com/facebook/react-native/commit/cb6ec7c32141ef5bdde837d7f9d71b7adb83b751), - [9ec9567390](https://github.com/facebook/react-native/commit/9ec95673909beac7798f589e0e9821b4225f8fa9), - [e5a4ea97d9](https://github.com/facebook/react-native/commit/e5a4ea97d9e1b13509a3f36d0b469a6a88a90dc4), - [c544c0d2dc](https://github.com/facebook/react-native/commit/c544c0d2dca1d0e9f0b2a5565e03676ad71a36f5), - [33d5e5bd5a](https://github.com/facebook/react-native/commit/33d5e5bd5a5365ab712a2b9d33f33cbec305e128), - [95dac8db60](https://github.com/facebook/react-native/commit/95dac8db601ba48fe03da52e1adbdef0cac23546), - [6e1db1f1ee](https://github.com/facebook/react-native/commit/6e1db1f1ee263c3a8b68c3e1584e79ae86d5be86), - [e11d496e9d](https://github.com/facebook/react-native/commit/e11d496e9d907abb5bf58a8300c5a8f85aa03bbb), - [6da897945f](https://github.com/facebook/react-native/commit/6da897945f823728dbc82dd9f01c672354b1e76d), - [0ff576081b](https://github.com/facebook/react-native/commit/0ff576081b156ea26c4e7886f7266f3e4d8e3d5e), - [1ee64ccb8a](https://github.com/facebook/react-native/commit/1ee64ccb8a257210be3a74fb9b0adc83f2a8bb2b), - [3aa38564f7](https://github.com/facebook/react-native/commit/3aa38564f7b91c8588c8484140bc4221d50d55e0), - [6b26971a56](https://github.com/facebook/react-native/commit/6b26971a56fdd919d11cc338893d0b7a3f7a45ba), and - [de3976a486](https://github.com/facebook/react-native/commit/de3976a48655a248a2417fcf2d3a511be02e1996) by - [@adrianomelo](https://github.com/adrianomelo), - [@blargity](https://github.com/blargity), - [@charpeni](https://github.com/charpeni), - [@garlic-rice-with-butter](https://github.com/garlic-rice-with-butter), - [@gwmccull](https://github.com/gwmccull), - [@harikrishnanp](https://github.com/harikrishnanp), - [@hramos](https://github.com/hramos), - [@johnthewilson](https://github.com/johnthewilson), - [@jsdario](https://github.com/jsdario), [@kelset](https://github.com/kelset), - [@patrickkempff](https://github.com/patrickkempff), - [@ryanml](https://github.com/ryanml), - [@tiagomoraismorgado88](https://github.com/tiagomoraismorgado88), - [@timwangdev](https://github.com/timwangdev), and others) -- Stop `RCTRefreshControl` from jumping around - ([2e1707d0e6](https://github.com/facebook/react-native/commit/2e1707d0e600a30057511390dd87c18c00f19a59) by - [@sophiebits](https://github.com/sophiebits)) -- Fix a race condition in the animation module - ([515eb0e801](https://github.com/facebook/react-native/commit/515eb0e8012a7a8f085a8e410c6c694011fd8c1d) by - [@mhorowitz](https://github.com/mhorowitz)) -- Fix Windows local-cli's to not wrongfully identify as globally installed - ([ca106043fc](https://github.com/facebook/react-native/commit/ca106043fc655a1c51332aedf9b001a512269550) by - [@sballew](https://github.com/sballew)) -- Fix Jest mocks for **NetInfo**, **Dimensions**, and **ScrollView** modules - ([7fb3a9229d](https://github.com/facebook/react-native/commit/7fb3a9229df52bd45076470d059f245a8147cd2a), - [11a2a35c63](https://github.com/facebook/react-native/commit/11a2a35c63ae68de46482f5cd25271f8b0fb5ad4), and - [0c8a3e4f79](https://github.com/facebook/react-native/commit/0c8a3e4f797563c99e988ec2f42ec2a618a8b196) by - [@alvaromb](https://github.com/alvaromb), - [@timwangdev](https://github.com/timwangdev), and - [@uk-ar](https://github.com/uk-ar)) -- packager-worker-for-buck: `transformCommand`: add missing test - ([73a01be9bc](https://github.com/facebook/react-native/commit/73a01be9bcd9059f3172987fd30d8b6dc0125759) by - [@jeanlauliac](https://github.com/jeanlauliac)) -- Fixed issue where CLI wasn't following the config value for postMinifyProcess - when its running with `dev=false` - ([6d92046c56](https://github.com/facebook/react-native/commit/6d92046c56794a6a62bc07598545a23a7b53cdc0) by - [@rafeca](https://github.com/rafeca)) -- Fix asset resolver url handling - ([28d5d6baf1](https://github.com/facebook/react-native/commit/28d5d6baf1e6ac52e8672a653f56c3898e4e11d2) by - [@fkgozali](https://github.com/fkgozali)) -- Fix crash when destroying catalyst - ([f1015664e9](https://github.com/facebook/react-native/commit/f1015664e92f02c33417a591a2438db7c0cd3811)) -- You can now `justifyContent` while you're `minWidth`ing and `marginLeft`ing; - before the justification wasn't honored - ([f5becebc07](https://github.com/facebook/react-native/commit/f5becebc0710d5bb875bb9c0a2d3809a00f62605) by - [@woehrl01](https://github.com/woehrl01)) -- `marginLeft: auto` and `alignItem: stretch` now play nicely together; before - the width and height ended up incorrect - ([5f99b1a55f](https://github.com/facebook/react-native/commit/5f99b1a55f4002c105a7005cabf720aad422b628) by - [@woehrl01](https://github.com/woehrl01)) -- Fix assertion preventing YGNodeLayoutGet\* with YGEdgeEnd - ([a383b8ca05](https://github.com/facebook/react-native/commit/a383b8ca0545ba3704a51a78972107119f5683c0) by - [@justjake](https://github.com/justjake)) -- Fix shrinking in non-strech alignments - ([1d62848535](https://github.com/facebook/react-native/commit/1d6284853514be4da2b68d45732386eb81cc4253) by - [@woehrl01](https://github.com/woehrl01)) -- Correctly calculate min/max percentage constraints - ([4fdaf2de98](https://github.com/facebook/react-native/commit/4fdaf2de989c039a62681cc1f7a8407ec32b593e) by - [@woehrl01](https://github.com/woehrl01)) -- When running `react-native-git-upgrade`, don't execute git's hooks - ([0182086350](https://github.com/facebook/react-native/commit/018208635069311c1a7c7776c6f359f7ded45362) by - [@adrienthiery](https://github.com/adrienthiery)) -- When running `react-native-git-upgrade` and failing with a signal, return that - to the terminal - ([b9a5862f67](https://github.com/facebook/react-native/commit/b9a5862f670f52d48f1d3789c3f08ec139368da4) by - [@mateusz-](https://github.com/mateusz-)) -- In **KeyboardAvoidingView**, don't mistakenly try to layout when a hardware - keyboard changes - ([ad4450ac13](https://github.com/facebook/react-native/commit/ad4450ac1364710f052a927ceda7ae353440f682) by - [@koenpunt](https://github.com/koenpunt)) -- Don't endlessly collect websockets when not connected to the packager (dev - memory leak) - ([1e1e491246](https://github.com/facebook/react-native/commit/1e1e49124678f447d980bb22891d25db60fa83b3) by - [@mmmulani](https://github.com/mmmulani)) -- Fixed a bug in the sample project random `selection` prop that made it - not-so-random - ([766f020e68](https://github.com/facebook/react-native/commit/766f020e68abfc121ea6a9f92e0640368d69dae7) by - [@rozele](https://github.com/rozele)) - -#### Android exclusive fixes - -- Explicitly `#define isnan __builtin_isnan` for Android _clang-5_ to mimic - **gcc**'s default behavior - ([f8fe6b0c70](https://github.com/facebook/react-native/commit/f8fe6b0c70d1b7b626d05d9675c16b2f89339e8c)) -- Correctly update **NetInfo** on Android even if connection types change while - the app is in the background - ([e6f542d620](https://github.com/facebook/react-native/commit/e6f542d62037e9830c0ae5749a32874c44cf2334) by - [@berickson1](https://github.com/berickson1)) -- Direction-aware borders now work with Android APIs >= 17 - ([7170543e80](https://github.com/facebook/react-native/commit/7170543e8012250b7643a960b54cce7fd6d3a1e9) by - [@rsnara](https://github.com/rsnara)) -- Don't throw _BadTokenException_ and _IllegalArgmentException_ when showing or - dismissing Modal on Android - ([e57a43b97a](https://github.com/facebook/react-native/commit/e57a43b97ad24dc5b993753a45aa575b2a757b4f)) -- Fix Android crash when blurRadius is between 0 and 1 - ([dc01eff72d](https://github.com/facebook/react-native/commit/dc01eff72d23e1dd3f7ecf30859992ee3bf7c664) by - [@jamesreggio](https://github.com/jamesreggio)) -- Fix `borderRadius` with Android API level < 18 - ([5aa1fb3ff3](https://github.com/facebook/react-native/commit/5aa1fb3ff326a429e33a443576da866f2a63c20c) and - [ca7fe72c31](https://github.com/facebook/react-native/commit/ca7fe72c31fd7c7cbe4734118019f5808235560e) by - [@rsnara](https://github.com/rsnara)) -- Make Android `lineHeight` behavior match iOS's 📏 - ([3f1b021506](https://github.com/facebook/react-native/commit/3f1b0215060e4c27c286359cc90f3b2189956c4e)) -- Fixed autoscroll to cursor on Android **TextInput** - ([0bef872f3f](https://github.com/facebook/react-native/commit/0bef872f3fc8b1cd78c574d03eacc886bef4e239) by - [@shergin](https://github.com/shergin)) -- Fix logging unpacking time on Android when it happens concurrently with eager - unpacking ([028b64bcd3](https://github.com/facebook/react-native/commit/028b64bcd36c1c8dd76c0de95eeff80cf660aa23) - by [@alexeylang](https://github.com/alexeylang)) -- Prevent an Android crash when **TextInput** has `selectionColor` defined but - there is no drawable cursor - ([1e18d907bf](https://github.com/facebook/react-native/commit/1e18d907bfb8cc5f4f2e1a1ede0dd98aec40ab11) by - [@gpeal](https://github.com/gpeal)) - -#### iOS exclusive fixes - -- Don't have Xcode warnings for _YGDefaultLog_ in newly created projects - ([72e762d4bc](https://github.com/facebook/react-native/commit/72e762d4bca8d00cc2c73c390a654ae6143731bd) by - [@woehrl01](https://github.com/woehrl01)) -- iOS _RCTEventEmitter_ uses a `double` for count, not _NSInteger_ - ([eaa84997ce](https://github.com/facebook/react-native/commit/eaa84997cedc8dc4d46308e2217d2b094a51ed02)) -- Fix `isNuclideDebuggingAvailable` on iOS - ([59c3e33f63](https://github.com/facebook/react-native/commit/59c3e33f637d11e33204e8a912e98459ffad7fab)) -- iOS ScrollView is now rendered correctly with RefreshControl - ([75d62bf0a8](https://github.com/facebook/react-native/commit/75d62bf0a802b91a979d03ef497e84c3179e7767) by - [@vonovak](https://github.com/vonovak)) -- Fix a crash when keyboard is visible and bridge reload happens on iOS - ([d9c658566a](https://github.com/facebook/react-native/commit/d9c658566a14ce8767d87435264997aa18dd08e4) by - [@fromcelticpark](https://github.com/fromcelticpark)) -- **RedBox** now appears beneath the status bar on iOS - ([33cefc1760](https://github.com/facebook/react-native/commit/33cefc176096e03a4b3c3130a70abfabe9d40f38) by - [@adamjernst](https://github.com/adamjernst)) -- Fractional border widths on iOS are now the right size, honoring insets - ([15179f1798](https://github.com/facebook/react-native/commit/15179f1798b277c1836441fcf7f3b7f0bd5a4636) by - [@Nikita2k](https://github.com/Nikita2k)) -- Implement `requiresMainQueueSetup` in _RCTTVNavigationEventEmitter_ to satisfy - Xcode warning - ([ee3532b5c2](https://github.com/facebook/react-native/commit/ee3532b5c266d5ee7fb12920cb611a41b1daf750) by - [@charpeni](https://github.com/charpeni)) -- Support the iPhone X in the sample project's header - ([ad4b124aa1](https://github.com/facebook/react-native/commit/ad4b124aa117483b4a0ec9dfa145b8e9a17f06c6) by - [@vincentriemer](https://github.com/vincentriemer)) -- `testID` works on **TabBarItem** on iOS - ([e19d9dec9b](https://github.com/facebook/react-native/commit/e19d9dec9b3b257b5db3dc77ed8b95b93570f1e3)) -- On iOS, don't error on the first live-reload of large codebases because of too - little wait time - ([b6f1a6085f](https://github.com/facebook/react-native/commit/b6f1a6085f7470c16ae8850e7da8f4f9ae5c23ee) by - [@lelandrichardson](https://github.com/lelandrichardson)) -- Prevent iOS crash on receiving bad unicode in _XMLHTTPRequest_ - ([1c04ceeb4b](https://github.com/facebook/react-native/commit/1c04ceeb4ba954eee7ab34fc5b6c660d9772d9f6) by - [@cdlewis](https://github.com/cdlewis)) -- Define `pod_target_xcconfig` for PrivateDatabase - ([38b96cd7bb](https://github.com/facebook/react-native/commit/38b96cd7bb391f64066a6c91daa4173db1f33445) by - [@ide](https://github.com/ide)) -- Fixed podspec include/excludes around tvOS - ([ba1d7e92e4](https://github.com/facebook/react-native/commit/ba1d7e92e4f251b90a96be192214b5015cf6244e) by - [@yygene](https://github.com/yygene)) -- Don't spam the logs for iOS when receiving `ECONNREFUSED` on connecting to - packager ([b1701ccaef](https://github.com/facebook/react-native/commit/b1701ccaefa0c8cbb6d820b2ad07e0d911027d7c) - and [ff3dc2ed19](https://github.com/facebook/react-native/commit/ff3dc2ed19cdd4137ae8092599b16c09d4e2c711) by - [@adamjernst](https://github.com/adamjernst)) -- Don't crash Systrace when debugging JS remotely on iOS - ([e8eec24706](https://github.com/facebook/react-native/commit/e8eec24706e792314ee574bbf7f7c0066c4f3a7a) by - [@alexeylang](https://github.com/alexeylang)) - -### Removed - -- Removing `reactBridgeDidFinishTransaction` from _RCTScrollView_ - ([a255204e3e](https://github.com/facebook/react-native/commit/a255204e3e7fddefd2d7b0de224101768757ca7a) by - [@shergin](https://github.com/shergin)) -- Removing inherited background color optimization from _RCTText_ to reduce code - complexity – please give feedback if you find performance differences! - ([8c8944c10f](https://github.com/facebook/react-native/commit/8c8944c10fb7dc30ea99657225f25ea438cf6e14) by - [@shergin](https://github.com/shergin)) - -### Other - -Below is a list of the remaining, low-level changes that made it into this -release of React Native. - -- Foundational work for a new justifyContent value **space-evenly** - ([1050e0b476](https://github.com/facebook/react-native/commit/1050e0b47611602b758f73d99f51a1dd5ceabade) by - [@woehrl01](https://github.com/woehrl01)) -- Add Systrace-based telemetry to Hermes GC - ([05e862d48d](https://github.com/facebook/react-native/commit/05e862d48d363a8af765b2f0283569419dbd2e5c)) -- Unify Systrace native hook argument passing - ([52e3ae9063](https://github.com/facebook/react-native/commit/52e3ae9063705bac53bad99ffe23976c29c8f1b2) by - [@amnn](https://github.com/amnn)) -- Use different symbols for SystraceSection depending on `WITH_FBYSTRACE` - ([03956c4ecf](https://github.com/facebook/react-native/commit/03956c4ecfda381396336f725ea1c12d913df17d)) -- Don't set global.performance to undefined if it was initialized already - ([dfebcb70a5](https://github.com/facebook/react-native/commit/dfebcb70a5c948db94d1cd580bbcaa0aaa702349) by - [@alexeylang](https://github.com/alexeylang)) -- Autofixes for migrating to Buck's source-only ABI feature - ([801cbdb047](https://github.com/facebook/react-native/commit/801cbdb04788403cee022dec688136540da36fc5) by - [@jkeljo](https://github.com/jkeljo)) -- Add remote API to uninstall the global error handler in RN - ([1d16923063](https://github.com/facebook/react-native/commit/1d16923063940606dda89de94a83cbdf5f98e1f1)) -- Add _RCTLibraryPathForURL_ in _RCTUtil_ - ([2fecbf6171](https://github.com/facebook/react-native/commit/2fecbf61711f610124fc2453a79120932024f613)) -- Fix sections that come from React Fiber - ([1f40c95076](https://github.com/facebook/react-native/commit/1f40c95076297258a4194fd9c1b5af7002187c99) by - [@alexeylang](https://github.com/alexeylang)) -- Fix boolean conversion in sync RN method calls. - ([dd888d3346](https://github.com/facebook/react-native/commit/dd888d3346ef9477eae2cd2d29cef867467cb503)) -- Fix `embeddedBundleURL` update situation - ([d1fc8ef3a3](https://github.com/facebook/react-native/commit/d1fc8ef3a3cb3590b9cff4d1b3cc5d440b52ec8c)) -- Remove `android_react_native_perf.use_separate_ui_bg_thread` experiment. - ([4f886a29a1](https://github.com/facebook/react-native/commit/4f886a29a1234c967deae2354bbc5092e0e6595e)) -- ScrollView related files were moved to dedicated folder - ([098a63a1ce](https://github.com/facebook/react-native/commit/098a63a1cee1196a2f3eb5135eeb8fe59e7e8272) by - [@shergin](https://github.com/shergin)) -- move page registration logic in to jsinspector - ([bef7967f9a](https://github.com/facebook/react-native/commit/bef7967f9a485dc136d2cb32f552b2199ae3e2b8) by - [@bnham](https://github.com/bnham)) -- Type global hooks as function pointers - ([eca51eb46a](https://github.com/facebook/react-native/commit/eca51eb46a47112c8933d0a3b932f59008cadc78) by - [@johnislarry](https://github.com/johnislarry)) -- `std::string` to `const char*` - ([b952365ba6](https://github.com/facebook/react-native/commit/b952365ba6bd86f0e80a24aedec1f447cb3ec566) by - [@johnislarry](https://github.com/johnislarry)) -- Allow extending props supported by native animations - ([71751e9cc7](https://github.com/facebook/react-native/commit/71751e9cc7c67306ca038c5b254e6e81fe0aff1b) by - [@andrewimm](https://github.com/andrewimm)) -- Meyers singleton jsc error extractor - ([434f432d5d](https://github.com/facebook/react-native/commit/434f432d5d5ea2756c1adac8b1c36e82e60a2b13) by - [@johnislarry](https://github.com/johnislarry)) -- Do not overwrite the same text in **TextInput** - ([29f3f55298](https://github.com/facebook/react-native/commit/29f3f5529827579101f0d8bd6afe72f1cb0caeca)) -- Renaming _uiManagerWillFlushUIBlocks_ -> _uiManagerWillPerformMounting_ - ([0a8721c340](https://github.com/facebook/react-native/commit/0a8721c340480a972bb597cacdbddd9eb2015716) by - [@shergin](https://github.com/shergin)) -- Skylarkify flags macros. - ([ed2bfcb35a](https://github.com/facebook/react-native/commit/ed2bfcb35a2756eb700882ab8e21b6b273efa80a) by - [@ttsugriy](https://github.com/ttsugriy)) -- Skylarkify `config_utils_defs` macros. - ([88f6f69152](https://github.com/facebook/react-native/commit/88f6f69152e4b68609f28e80ee70705969529af8) by - [@ttsugriy](https://github.com/ttsugriy)) -- Round size geometry for Button and RichText components. - ([4034febb7e](https://github.com/facebook/react-native/commit/4034febb7ef9d9daa894a75b038226af74026163) by - [@iaroslav-pavlov](https://github.com/iaroslav-pavlov) -- Temporarily patched Map/Set non-extensible check into RN dev renderer - ([a99f0d6100](https://github.com/facebook/react-native/commit/a99f0d6100c9779f5f6df6008af54c06113355f6) by - [@bvaughn](https://github.com/bvaughn)) -- Run buildifier over all BUCK files - ([d674d48a7b](https://github.com/facebook/react-native/commit/d674d48a7b9b71169af59ceb886529371c26a2e5) by - [@zertosh](https://github.com/zertosh)) -- Pass `scriptURL` to _RCTTestRunner_ - ([266ab7a006](https://github.com/facebook/react-native/commit/266ab7a0061c11c4da7ccde9e0d461c0d7331563)) -- Make _RCTNativeModule::invokeInner_ explicitely return `folly::none` in case - of error ([0ac5a5230c](https://github.com/facebook/react-native/commit/0ac5a5230c4b5dd44db6a8dd7bb7752aff64d71c) - by [@fromcelticpark](https://github.com/fromcelticpark)) -- Make _RCTPackagerConnection_ a singleton - ([9180d4eb82](https://github.com/facebook/react-native/commit/9180d4eb82fb70a0fd396b15660c2ac6770183c9) by - [@adamjernst](https://github.com/adamjernst)) -- Register split segment paths with _RAMBundleRegistry_ - ([cff0d8e0e5](https://github.com/facebook/react-native/commit/cff0d8e0e599d1ab21b36779b41fbb26512874aa) by - [@fromcelticpark](https://github.com/fromcelticpark)) -- check if listener is still in the set before calling `onHostResume` - ([ad89ea7b50](https://github.com/facebook/react-native/commit/ad89ea7b5046c2cf9ca1cba88c387eb1db8dc042)) -- export _SeparatorsObj_ type for re-use in **ListItem**s etc. - ([c6fe101cdc](https://github.com/facebook/react-native/commit/c6fe101cdcc0b8d640a86108d8a76f7292b5f799) by - [@sahrens](https://github.com/sahrens)) -- Do not mark node as dirty if, new and old values are undefined - ([41da6e3128](https://github.com/facebook/react-native/commit/41da6e31284d46bb1dd2053c3c3100c075ace019) by - [@woehrl01](https://github.com/woehrl01)) -- Remove _RAMBundleRegistry_ subclasses - ([6ecae73fe5](https://github.com/facebook/react-native/commit/6ecae73fe5915863c27ac7e407f5b151fd0c5fc3) by - [@fromcelticpark](https://github.com/fromcelticpark)) -- Fix `minimumViewTime` in _ViewabilityHelper_ - ([d19d137cc1](https://github.com/facebook/react-native/commit/d19d137cc18f10957b5ac64ac727d15fde57f018)) - -[0.56]: https://github.com/facebook/react-native/compare/0.55-stable...0.56-stable -[0.55]: https://github.com/facebook/react-native/compare/0.54-stable...0.55-stable -[0.54]: https://github.com/facebook/react-native/compare/0.53-stable...0.54-stable -[0.53]: https://github.com/facebook/react-native/compare/0.52-stable...0.53-stable -[0.52.0]: https://github.com/facebook/react-native/compare/0.51-stable...0.52-stable diff --git a/ECOSYSTEM.md b/ECOSYSTEM.md index 4adef0816a8ae2..257e675119b865 100644 --- a/ECOSYSTEM.md +++ b/ECOSYSTEM.md @@ -14,12 +14,19 @@ Partners are companies that are significantly invested in React Native and demon Partners think of React Native as a product; they understand the trade offs that the project makes as well as future plans and goals. Together we shape the vision for React Native to make it the best way to build applications. -Baseline responsibilities of partners include: -* Attending monthly meeting -* Contributing to the release process. Examples include being a [community releaser](https://reactnative.dev/contributing/release-roles-responsibilities#release-role-2-community-releaser), testing new releases, technical support for release issues. -* Engage on the core contributor Discord +### Application process +To become a React Native partner, an existing partner needs to refer and champion your application. Partners will undergo a 3 month incubating period, after which Partners will vote to convert to full membership. -Our current partners and other areas of ownership: +Partnership is not a status symbol, it is a commitment to invest significant resources into improving React Native. + +Maintaining partner status requires consistently meeting the baseline responsibilities, including: +* Attending monthly meeting. +* Contributing to the release process. +* Engaging in the core contributor Discord. + +Examples of contributing to the release include being a [community releaser](https://reactnative.dev/contributing/release-roles-responsibilities#release-role-2-community-releaser), testing new releases, and technical support for release issues. + +### Current partners: * **[Coinbase](https://www.coinbase.com/):** Publishes [posts](https://blog.coinbase.com/tagged/react-native) advocating React Native usage. Supports `@react-native-community/datetimepicker` and other community modules to migrate to the new architecture. Supports releases in testing and feedback. * **[Callstack](https://callstack.com/):** Maintains the [React Native CLI](https://github.com/react-native-community/react-native-cli) and [other community libraries](https://github.com/callstack), organizes [React Native EU](https://react-native.eu/) and hosts [The React Native Show podcast](https://www.callstack.com/podcast-react-native-show) * **[Expo](https://expo.dev/):** Builds [Expo Go and SDK](https://github.com/expo/expo), [Snack](https://snack.expo.dev/), and [Expo Application Services](https://expo.dev/eas). Maintains [React Native Directory](https://reactnative.directory/), stewards [React Navigation](https://reactnavigation.org/) along with other partners. @@ -30,7 +37,11 @@ Our current partners and other areas of ownership: * **[Software Mansion](https://swmansion.com/):** Maintain core infrastructure including JSC, Animated, and other popular third-party plugins and organizes [App.js Conf](https://appjs.co/) * **[Wix.com](https://wix.engineering/open-source):** Maintains a variety of React Native open source projects ([see all](https://github.com/orgs/wix/repositories?q=react-native)), including: [Detox](https://wix.github.io/Detox/) end-to-end testing library for React Native apps, [RN UILib](https://wix.github.io/react-native-ui-lib/), [RN Navigation](https://wix.github.io/react-native-navigation/), [RN Calendars](https://wix.github.io/react-native-calendars/) and [RN Notifications](https://github.com/wix/react-native-notifications). -This list may fluctuate in response to newcomers who meet our partner definition. In terms of open source work, pull requests from partners are commonly prioritized. When you are contributing to React Native, you'll most likely meet somebody who works at one of the partner companies and who is a core contributor: +### Incubating partners: +* **[Expensify](https://expensify.com/):** Developing [Expensify Chat](https://github.com/Expensify/App), an open-source React Native app built by the community, while [sponsoring dependencies](https://github.com/orgs/Expensify/sponsoring), conferences, and New Architecture advancements. +* **[Sentry](https://sentry.io/for/react-native/):** Develops Error and Performance Monitoring [SDK for React Native](https://github.com/getsentry/sentry-react-native) and [New Architecture Turbo Modules Mixed Stack Traces](https://github.com/reactwg/react-native-new-architecture/discussions/122). + +When you are contributing to React Native, you'll most likely meet somebody who works at one of the partner companies and who is a core contributor. ## Core Contributors diff --git a/README.md b/README.md index 28ae98f546a027..a99a5c75c20e3f 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ React Native is developed and supported by many companies and individual core co ## 📋 Requirements -React Native apps may target iOS 12.4 and Android 5.0 (API 21) or newer. You may use Windows, macOS, or Linux as your development operating system, though building and running iOS apps is limited to macOS. Tools like [Expo](https://expo.dev) can be used to work around this. +React Native apps may target iOS 13.4 and Android 5.0 (API 21) or newer. You may use Windows, macOS, or Linux as your development operating system, though building and running iOS apps is limited to macOS. Tools like [Expo](https://expo.dev) can be used to work around this. ## 🎉 Building your first React Native app diff --git a/build.gradle.kts b/build.gradle.kts index 1c3ebaccc359de..c5b21e74cb5016 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,8 @@ plugins { id("io.github.gradle-nexus.publish-plugin") version "1.1.0" - id("com.android.library") version "7.4.2" apply false - id("com.android.application") version "7.4.2" apply false + id("com.android.library") version "8.0.2" apply false + id("com.android.application") version "8.0.2" apply false id("de.undercouch.download") version "5.0.1" apply false kotlin("android") version "1.8.0" apply false } @@ -30,7 +30,7 @@ version = group = "com.facebook.react" val ndkPath by extra(System.getenv("ANDROID_NDK")) -val ndkVersion by extra(System.getenv("ANDROID_NDK_VERSION")) +val ndkVersion by extra(System.getenv("ANDROID_NDK_VERSION") ?: "23.1.7779620") val sonatypeUsername = findProperty("SONATYPE_USERNAME")?.toString() val sonatypePassword = findProperty("SONATYPE_PASSWORD")?.toString() @@ -99,6 +99,8 @@ 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 CircleCI is using it via workspace. + dependsOn( + ":packages:react-native:ReactAndroid:flipper-integration:publishAllPublicationsToMavenTempLocalRepository") dependsOn( ":packages:react-native:ReactAndroid:hermes-engine:publishAllPublicationsToMavenTempLocalRepository") } @@ -107,5 +109,6 @@ tasks.register("publishAllToSonatype") { description = "Publish all the artifacts to Sonatype (Maven Central or Snapshot repository)" dependsOn(":packages:react-native:ReactAndroid:publishToSonatype") dependsOn(":packages:react-native:ReactAndroid:external-artifacts:publishToSonatype") + dependsOn(":packages:react-native:ReactAndroid:flipper-integration:publishToSonatype") dependsOn(":packages:react-native:ReactAndroid:hermes-engine:publishToSonatype") } diff --git a/flow-typed/npm/ansi-regex_v5.x.x.js b/flow-typed/npm/ansi-regex_v5.x.x.js new file mode 100644 index 00000000000000..150902f4a12e6c --- /dev/null +++ b/flow-typed/npm/ansi-regex_v5.x.x.js @@ -0,0 +1,14 @@ +/** + * @flow strict + * @format + */ + +declare module 'ansi-regex' { + declare export type Options = { + /** + * Match only the first ANSI escape. + */ + +onlyFirst?: boolean, + }; + declare export default function ansiRegex(options?: Options): RegExp; +} diff --git a/flow-typed/npm/babel-traverse_v7.x.x.js b/flow-typed/npm/babel-traverse_v7.x.x.js new file mode 100644 index 00000000000000..146ee86677719f --- /dev/null +++ b/flow-typed/npm/babel-traverse_v7.x.x.js @@ -0,0 +1,1891 @@ +/** + * 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 + * @format + * @oncall react_native + */ + +// The sections between BEGIN GENERATED and END GENERATED are generated +// by the updateBabelTraverseTypes.js script. You can update the sections with +// node ./xplat/js/tools/metro/scripts/updateBabelTraverseTypes.js path/to/this/file + +'use strict'; + +declare module '@babel/traverse' { + declare export type TraverseOptions = { + ...Visitor, + scope?: Scope, + noScope?: boolean, + }; + + declare export interface HubInterface { + getCode(): ?string; + getScope(): ?Scope; + addHelper(name: string): {}; + buildError( + node: BabelNode, + msg: string, + Error: Class, + ): TError; + } + + declare export class Hub implements HubInterface { + constructor(): Hub; + getCode(): ?string; + getScope(): ?Scope; + addHelper(name: string): {}; + buildError( + node: BabelNode, + msg: string, + Error: Class, + ): TError; + } + + declare export interface TraversalContext { + parentPath: NodePath<>; + scope: Scope; + state: any; + opts: any; + queue: ?Array>; + + constructor( + scope: Scope, + opts: TraverseOptions, + state: any, + parentPath: NodePath<>, + ): TraversalContext; + + shouldVisit(node: BabelNode): boolean; + create( + node: BabelNode, + obj: Array, + key: string, + listKey: string, + ): NodePath<>; + maybeQueue(path: NodePath<>, notPriority?: boolean): void; + visitMultiple( + container: Array, + parent: BabelNode, + listKey: string, + ): boolean; + visitSingle(node: BabelNode, key: string): boolean; + visitQueue(queue: Array>): boolean; + visit(node: BabelNode, key: string): boolean; + } + + declare export class Scope { + static globals: Array; + static conextVariables: Array; + + constructor(path: NodePath<>): Scope; + path: NodePath<>; + block: BabelNode; + +labels: Map>; + +parentBlock: BabelNode; + +parent: Scope; + +hub: HubInterface; + bindings?: {[name: string]: Binding}; + references?: {[name: string]: boolean}; + globals?: {[name: string]: BabelNode}; + uids?: {[name: string]: boolean}; + data?: {[key: string]: any}; + inited: boolean; + + /** Traverse node with current scope and path. */ + traverse( + node: BabelNode | Array, + opts: $ReadOnly>, + state: S, + ): void; + + /** Generate a unique identifier and add it to the current scope. */ + generateDeclaredUidIdentifier(name?: string): BabelNodeIdentifier; + + /** Generate a unique identifier. */ + generateUidIdentifier(name?: string): BabelNodeIdentifier; + + /** Generate a unique `_id1` binding. */ + generateUid(name?: string): string; + + generateUidBasedOnNode(node: BabelNode, defaultName?: string): string; + + /** Generate a unique identifier based on a node. */ + generateUidIdentifierBasedOnNode( + parent: BabelNode, + defaultName?: string, + ): BabelNodeIdentifier; + + /** + * Determine whether evaluating the specific input `node` is a consequenceless reference. ie. + * evaluating it wont result in potentially arbitrary code from being ran. The following are + * whitelisted and determined not to cause side effects: + * + * - `this` expressions + * - `super` expressions + * - Bound identifiers + */ + isStatic(node: BabelNode): boolean; + + /** Possibly generate a memoised identifier if it is not static and has consequences. */ + maybeGenerateMemoised( + node: BabelNode, + dontPush?: boolean, + ): BabelNodeIdentifier; + + checkBlockScopedCollisions( + local: BabelNode, + kind: string, + name: string, + id: {}, + ): void; + + rename(oldName: string, newName?: string, block?: BabelNode): void; + + dump(): void; + + toArray( + node: BabelNode, + i?: number | boolean, + allowArrayLike?: boolean, + ): BabelNode; + + hasLabel(name: string): boolean; + + getLabel(name: string): NodePath<>; + + registerLabel(path: NodePath<>): void; + + registerDeclaration(path: NodePath<>): void; + + buildUndefinedNode(): BabelNode; + + registerConstantViolation(path: NodePath<>): void; + + registerBinding( + kind: BindingKind, + path: NodePath<>, + bindingPath?: NodePath<>, + ): void; + + addGlobal(node: BabelNode): void; + + hasUid(name: string): boolean; + + hasGlobal(name: string): boolean; + + hasReference(name: string): boolean; + + isPure(node: BabelNode, constantsOnly?: boolean): boolean; + + /** + * Set some arbitrary data on the current scope. + */ + setData(key: string, val: any): any; + + /** + * Recursively walk up scope tree looking for the data `key`. + */ + getData(key: string): any; + + /** + * Recursively walk up scope tree looking for the data `key` and if it exists, + * remove it. + */ + removeData(key: string): void; + + init(): void; + + crawl(): void; + + push(opts: { + id: BabelNodeLVal, + init?: BabelNodeExpression, + unique?: boolean, + _blockHoist?: ?number, + kind?: 'var' | 'let', + }): void; + + getProgramParent(): Scope; + + getFunctionParent(): Scope | null; + + getBlockParent(): Scope; + + /** Walks the scope tree and gathers **all** bindings. */ + getAllBindings(): {[name: string]: Binding}; + + getAllBindingsOfKind(...kind: Array): { + [name: string]: Binding, + }; + + bindingIdentifierEquals(name: string, node: BabelNode): boolean; + + getBinding(name: string): Binding | void; + + getOwnBinding(name: string): Binding | void; + + getBindingIdentifier(name: string): BabelNodeIdentifier | void; + + getOwnBindingIdentifier(name: string): BabelNodeIdentifier | void; + + hasOwnBinding(name: string): boolean; + + hasBinding(name: string, noGlobals?: boolean): boolean; + + parentHasBinding(name: string, noGlobals?: boolean): boolean; + + /** Move a binding of `name` to another `scope`. */ + moveBindingTo(name: string, scope: Scope): void; + + removeOwnBinding(name: string): void; + + removeBinding(name: string): void; + } + + declare export type BindingKind = + | 'var' + | 'let' + | 'const' + | 'module' + | 'hoisted' + | 'unknown'; + + declare export class Binding { + constructor(opts: { + identifier: BabelNodeIdentifier, + scope: Scope, + path: NodePath<>, + kind: BindingKind, + }): Binding; + identifier: BabelNodeIdentifier; + scope: Scope; + path: NodePath<>; + kind: BindingKind; + referenced: boolean; + references: number; + referencePaths: Array>; + constant: boolean; + constantViolations: Array>; + hasDeoptedValue: boolean; + hasValue: boolean; + value: any; + + deoptValue(): void; + + setValue(value: any): void; + + clearValue(): void; + + /** + * Register a constant violation with the provided `path`. + */ + reassign(path: NodePath<>): void; + + /** + * Increment the amount of references to this binding. + */ + reference(path: NodePath<>): void; + + dereference(): void; + } + + declare function getNodePathType(node: BabelNode): NodePath<>; + declare function getNodePathType(nodes: Array): Array>; + + declare type Opts = {...}; + + declare export class NodePath<+TNode: BabelNode = BabelNode> { + parent: BabelNode; + hub: HubInterface; + contexts: Array; + data: {[key: string]: mixed} | null; + shouldSkip: boolean; + shouldStop: boolean; + removed: boolean; + state: mixed; + +opts: $ReadOnly> | null; + skipKeys: null | {[key: string]: boolean}; + parentPath: ?NodePath<>; + context: TraversalContext; + container: null | {...} | Array<{...}>; + listKey: null | string; + key: null | string; + + /* Declaring node as readonly isn't entirely correct since the node can be + * changed by e.g. calling replaceWith. However, this is needed to reasonably + * work with `NodePath`, e.g. that passing `NodePath` to a + * `NodePath works. + */ + +node: TNode; + + parentKey: string; + scope: Scope; + type: null | BabelNode['type']; + inList: boolean; + typeAnnotation?: BabelNodeTypeAnnotation; + + constructor(hub: HubInterface, parent: BabelNode): NodePath; + + static get({ + hub: HubInterface, + parentPath: ?NodePath<>, + parent: BabelNode, + container: null | {...} | Array<{...}>, + listKey: null | string, + key: null | string, + }): NodePath<>; + + getScope(scope: Scope): Scope; + + setData(key: string, val: TVal): TVal; + getData(key: string, def?: TVal): TVal; + + buildCodeFrameError( + msg: string, + Error?: Class, + ): TError; + + traverse( + visitor: $ReadOnly>, + state: TState, + ): void; + + set(key: string, node: BabelNode): void; + getPathLocation(): string; + + debug(message: string): void; + + toString(): string; + + // _ancestry + /** + * Starting at the parent path of the current `NodePath` and going up the + * tree, return the first `NodePath` that causes the provided `callback` + * to return a truthy value, or `null` if the `callback` never returns a + * truthy value. + */ + findParent(callback: (path: NodePath<>) => boolean): NodePath<> | null; + + /** + * Starting at current `NodePath` and going up the tree, return the first + * `NodePath` that causes the provided `callback` to return a truthy value, + * or `null` if the `callback` never returns a truthy value. + */ + find(callback: (path: NodePath<>) => boolean): NodePath<> | null; + + /** + * Get the parent function of the current path. + */ + getFunctionParent(): NodePath | null; + + /** + * Walk up the tree until we hit a parent node path in a list. + */ + getStatementParent(): NodePath; + + /** + * Get the deepest common ancestor and then from it, get the earliest relationship path + * to that ancestor. + * + * Earliest is defined as being "before" all the other nodes in terms of list container + * position and visiting key. + */ + getEarliestCommonAncestorFrom( + paths: $ReadOnlyArray>, + ): NodePath<>; + + /** + * Get the earliest path in the tree where the provided `paths` intersect. + * + * TODO: Possible optimisation target. + */ + getDeepestCommonAncestorFrom( + paths: $ReadOnlyArray>, + filter?: ( + lastCommon: BabelNode, + lastCommonIndex: number, + ancestries: Array>, + ) => NodePath<>, + ): NodePath<>; + + /** + * Build an array of node paths containing the entire ancestry of the current node path. + * + * NOTE: The current node path is included in this. + */ + getAncestry(): Array>; + + /** + * A helper to find if `this` path is an ancestor of @param maybeDescendant + */ + isAncestor(maybeDescendant: NodePath<>): boolean; + + /** + * A helper to find if `this` path is a descendant of @param maybeAncestor + */ + isDescendant(maybeAncestor: NodePath<>): boolean; + + inType(...candidateTypes: Array): boolean; + + // _inference + + /** + * Infer the type of the current `NodePath`. + */ + getTypeAnnotation(): BabelNodeTypeAnnotation; + + isBaseType(baseName: string, soft?: boolean): boolean; + couldBeBaseType( + name: + | 'string' + | 'number' + | 'boolean' + | 'any' + | 'mixed' + | 'empty' + | 'void', + ): boolean; + baseTypeStrictlyMatches(right: NodePath<>): ?boolean; + isGenericType(genericName: string): boolean; + + // _replacement + + /** + * Replace a node with an array of multiple. This method performs the following steps: + * + * - Inherit the comments of first provided node with that of the current node. + * - Insert the provided nodes after the current node. + * - Remove the current node. + */ + replaceWithMultiple(node: Array): Array>; + + /** + * Parse a string as an expression and replace the current node with the result. + * + * NOTE: This is typically not a good idea to use. Building source strings when + * transforming ASTs is an antipattern and SHOULD NOT be encouraged. Even if it's + * easier to use, your transforms will be extremely brittle. + */ + replaceWithSourceString(replacement: string): Array>; + + /** + * Replace the current node with another. + */ + replaceWith(replacement: BabelNode | NodePath<>): Array>; + + /** + * This method takes an array of statements nodes and then explodes it + * into expressions. This method retains completion records which is + * extremely important to retain original semantics. + */ + replaceExpressionWithStatement( + nodes: Array, + ): Array>; + + replaceInline(nodes: BabelNode | Array): Array>; + + // _evaluation + + /** + * Walk the input `node` and statically evaluate if it's truthy. + * + * Returning `true` when we're sure that the expression will evaluate to a + * truthy value, `false` if we're sure that it will evaluate to a falsy + * value and `undefined` if we aren't sure. Because of this please do not + * rely on coercion when using this method and check with === if it's false. + * + * For example do: + * + * if (t.evaluateTruthy(node) === false) falsyLogic(); + * + * **AND NOT** + * + * if (!t.evaluateTruthy(node)) falsyLogic(); + * + */ + evaluateTruthy(): boolean | void; + + /** + * Walk the input `node` and statically evaluate it. + * + * Returns an object in the form `{ confident, value }`. `confident` indicates + * whether or not we had to drop out of evaluating the expression because of + * hitting an unknown node that we couldn't confidently find the value of. + * + * Example: + * + * t.evaluate(parse("5 + 5")) // { confident: true, value: 10 } + * t.evaluate(parse("!true")) // { confident: true, value: false } + * t.evaluate(parse("foo + foo")) // { confident: false, value: undefined } + * + */ + evaluate(): + | {confident: true, value: any, deopt: null} + | {confident: false, value: void, deopt: NodePath<>}; + + // conversion + toComputedKey(): BabelNode; + + ensureBlock(): BabelNode; + + /** + * Given an arbitrary function, process its content as if it were an arrow function, moving references + * to "this", "arguments", "super", and such into the function's parent scope. This method is useful if + * you have wrapped some set of items in an IIFE or other function, but want "this", "arguments", and super" + * to continue behaving as expected. + */ + unwrapFunctionEnvironment(): void; + + /** + * Convert a given arrow function into a normal ES5 function expression. + */ + arrowFunctionToExpression(options?: { + allowInsertArrow?: boolean, + specCompliant?: boolean, + }): void; + + // introspection + + /** + * Match the current node if it matches the provided `pattern`. + * + * For example, given the match `React.createClass` it would match the + * parsed nodes of `React.createClass` and `React["createClass"]`. + */ + matchesPattern(pattern: string, allowPartial?: boolean): boolean; + + /** + * Check whether we have the input `key`. If the `key` references an array then we check + * if the array has any items, otherwise we just check if it's falsy. + */ + has(key: $Keys): boolean; + + isStatic(): boolean; + + /** + * Alias of `has`. + */ + is(key: $Keys): boolean; + + /** + * Opposite of `has`. + */ + isnt(key: $Keys): boolean; + + /** + * Check whether the path node `key` strict equals `value`. + */ + equals(key: $Keys, value: any): boolean; + + /** + * Check the type against our stored internal type of the node. This is handy when a node has + * been removed yet we still internally know the type and need it to calculate node replacement. + */ + isNodeType(type: BabelNode['type']): boolean; + + /** + * This checks whether or not we're in one of the following positions: + * + * for (KEY in right); + * for (KEY;;); + * + * This is because these spots allow VariableDeclarations AND normal expressions so we need + * to tell the path replacement that it's ok to replace this with an expression. + */ + canHaveVariableDeclarationOrExpression(): boolean; + + /** + * This checks whether we are swapping an arrow function's body between an + * expression and a block statement (or vice versa). + * + * This is because arrow functions may implicitly return an expression, which + * is the same as containing a block statement. + */ + canSwapBetweenExpressionAndStatement(replacement: BabelNode): boolean; + + /** + * Check whether the current path references a completion record + */ + isCompletionRecord(allowInsideFunction?: boolean): boolean; + + /** + * Check whether or not the current `key` allows either a single statement or block statement + * so we can explode it if necessary. + */ + isStatementOrBlock(): boolean; + + /** + * Check if the currently assigned path references the `importName` of `moduleSource`. + */ + referencesImport(moduleSource: string, importName?: string): boolean; + + /** + * Get the source code associated with this node. + */ + getSource(): string; + + willIMaybeExecuteBefore(target: NodePath<>): boolean; + + /** + * Resolve a "pointer" `NodePath` to it's absolute path. + */ + resolve(dangerous?: boolean, resolved?: Array>): NodePath<>; + + isConstantExpression(): boolean; + + isInStrictMode(): boolean; + + // context + call(key: string): boolean; + + isBlacklisted(): boolean; + + visit(): boolean; + + skip(): boolean; + + skipKey(key: string): boolean; + + stop(): void; + + setScope(): void; + + setContext(context: TraversalContext): NodePath; + + /** + * Here we resync the node paths `key` and `container`. If they've changed according + * to what we have stored internally then we attempt to resync by crawling and looking + * for the new values. + */ + resync(): void; + + popContext(): void; + + pushContext(context: TraversalContext): void; + + setup( + parentPath: NodePath<>, + container: ?{...} | ?Array<{...}>, + listKey: string, + key: string, + ): void; + + setKey(key: string): void; + + requeue(pathToQueue?: NodePath<>): void; + + // removal + remove(): void; + + // modification + + /** + * Insert the provided nodes before the current one. + */ + insertBefore(nodes: BabelNode | Array): Array>; + + /** + * Insert the provided nodes after the current one. When inserting nodes after an + * expression, ensure that the completion record is correct by pushing the current node. + */ + insertAfter(nodes: BabelNode | Array): Array>; + + /** + * Update all sibling node paths after `fromIndex` by `incrementBy`. + */ + updateSiblingKeys(fromIndex: number, incrementBy: number): void; + + unshiftContainer( + listKey: string, + nodes: BabelNode | Array, + ): Array>; + + pushContainer( + listKey: string, + nodes: BabelNode | Array, + ): Array>; + + /** + * Hoist the current node to the highest scope possible and return a UID + * referencing it. + */ + hoist(scope?: Scope): ?NodePath<>; + + // family + getOpposite(): ?NodePath<>; + + getCompletionRecords(): Array>; + + getSibling(key: string): NodePath<>; + + getPrevSibling(): NodePath<>; + + getNextSibling(): NodePath<>; + + getAllNextSiblings(): Array>; + + getAllPrevSiblings(): Array>; + + get>( + key: TKey, + context?: boolean | TraversalContext, + ): $Call; + + get( + key: string, + context?: boolean | TraversalContext, + ): NodePath<> | Array>; + + getBindingIdentifiers(duplicates?: void | false): { + [key: string]: BabelNodeIdentifier, + }; + + getBindingIdentifiers(duplicates: true): { + [key: string]: Array, + }; + + getOuterBindingIdentifiers(duplicates: true): { + [key: string]: Array, + }; + getOuterBindingIdentifiers(duplicates?: false): { + [key: string]: BabelNodeIdentifier, + }; + getOuterBindingIdentifiers(duplicates: boolean): { + [key: string]: BabelNodeIdentifier | Array, + }; + + getBindingIdentifierPaths( + duplicates?: void | false, + outerOnly?: boolean, + ): {[key: string]: NodePath}; + + getBindingIdentifierPaths( + duplicates: true, + outerOnly?: boolean, + ): {[key: string]: Array>}; + + getOuterBindingIdentifierPaths(duplicates?: void | false): { + [key: string]: NodePath, + }; + + getOuterBindingIdentifierPaths(duplicates: true): { + [key: string]: Array>, + }; + + // comments + shareCommentsWithSiblings(): void; + + addComment( + type: 'leading' | 'inner' | 'trailing', + content: string, + line?: boolean, + ): void; + + addComments( + type: 'leading' | 'inner' | 'trailing', + comments: Array, + ): void; + + // This section is automatically generated. Don't edit by hand. + // See the comment at the top of the file on how to update the definitions. + // BEGIN GENERATED NODE PATH METHODS + isAnyTypeAnnotation(opts?: Opts): boolean; + isArgumentPlaceholder(opts?: Opts): boolean; + isArrayExpression(opts?: Opts): boolean; + isArrayPattern(opts?: Opts): boolean; + isArrayTypeAnnotation(opts?: Opts): boolean; + isArrowFunctionExpression(opts?: Opts): boolean; + isAssignmentExpression(opts?: Opts): boolean; + isAssignmentPattern(opts?: Opts): boolean; + isAwaitExpression(opts?: Opts): boolean; + isBigIntLiteral(opts?: Opts): boolean; + isBinary(opts?: Opts): boolean; + isBinaryExpression(opts?: Opts): boolean; + isBindExpression(opts?: Opts): boolean; + isBindingIdentifier(opts?: Opts): boolean; + isBlock(opts?: Opts): boolean; + isBlockParent(opts?: Opts): boolean; + isBlockScoped(opts?: Opts): boolean; + isBlockStatement(opts?: Opts): boolean; + isBooleanLiteral(opts?: Opts): boolean; + isBooleanLiteralTypeAnnotation(opts?: Opts): boolean; + isBooleanTypeAnnotation(opts?: Opts): boolean; + isBreakStatement(opts?: Opts): boolean; + isCallExpression(opts?: Opts): boolean; + isCatchClause(opts?: Opts): boolean; + isClass(opts?: Opts): boolean; + isClassBody(opts?: Opts): boolean; + isClassDeclaration(opts?: Opts): boolean; + isClassExpression(opts?: Opts): boolean; + isClassImplements(opts?: Opts): boolean; + isClassMethod(opts?: Opts): boolean; + isClassPrivateMethod(opts?: Opts): boolean; + isClassPrivateProperty(opts?: Opts): boolean; + isClassProperty(opts?: Opts): boolean; + isCompletionStatement(opts?: Opts): boolean; + isConditional(opts?: Opts): boolean; + isConditionalExpression(opts?: Opts): boolean; + isContinueStatement(opts?: Opts): boolean; + isDebuggerStatement(opts?: Opts): boolean; + isDecimalLiteral(opts?: Opts): boolean; + isDeclaration(opts?: Opts): boolean; + isDeclareClass(opts?: Opts): boolean; + isDeclareExportAllDeclaration(opts?: Opts): boolean; + isDeclareExportDeclaration(opts?: Opts): boolean; + isDeclareFunction(opts?: Opts): boolean; + isDeclareInterface(opts?: Opts): boolean; + isDeclareModule(opts?: Opts): boolean; + isDeclareModuleExports(opts?: Opts): boolean; + isDeclareOpaqueType(opts?: Opts): boolean; + isDeclareTypeAlias(opts?: Opts): boolean; + isDeclareVariable(opts?: Opts): boolean; + isDeclaredPredicate(opts?: Opts): boolean; + isDecorator(opts?: Opts): boolean; + isDirective(opts?: Opts): boolean; + isDirectiveLiteral(opts?: Opts): boolean; + isDoExpression(opts?: Opts): boolean; + isDoWhileStatement(opts?: Opts): boolean; + isEmptyStatement(opts?: Opts): boolean; + isEmptyTypeAnnotation(opts?: Opts): boolean; + isEnumBody(opts?: Opts): boolean; + isEnumBooleanBody(opts?: Opts): boolean; + isEnumBooleanMember(opts?: Opts): boolean; + isEnumDeclaration(opts?: Opts): boolean; + isEnumDefaultedMember(opts?: Opts): boolean; + isEnumMember(opts?: Opts): boolean; + isEnumNumberBody(opts?: Opts): boolean; + isEnumNumberMember(opts?: Opts): boolean; + isEnumStringBody(opts?: Opts): boolean; + isEnumStringMember(opts?: Opts): boolean; + isEnumSymbolBody(opts?: Opts): boolean; + isExistentialTypeParam(opts?: Opts): boolean; + isExistsTypeAnnotation(opts?: Opts): boolean; + isExportAllDeclaration(opts?: Opts): boolean; + isExportDeclaration(opts?: Opts): boolean; + isExportDefaultDeclaration(opts?: Opts): boolean; + isExportDefaultSpecifier(opts?: Opts): boolean; + isExportNamedDeclaration(opts?: Opts): boolean; + isExportNamespaceSpecifier(opts?: Opts): boolean; + isExportSpecifier(opts?: Opts): boolean; + isExpression(opts?: Opts): boolean; + isExpressionStatement(opts?: Opts): boolean; + isExpressionWrapper(opts?: Opts): boolean; + isFile(opts?: Opts): boolean; + isFlow(opts?: Opts): boolean; + isFlowBaseAnnotation(opts?: Opts): boolean; + isFlowDeclaration(opts?: Opts): boolean; + isFlowPredicate(opts?: Opts): boolean; + isFlowType(opts?: Opts): boolean; + isFor(opts?: Opts): boolean; + isForAwaitStatement(opts?: Opts): boolean; + isForInStatement(opts?: Opts): boolean; + isForOfStatement(opts?: Opts): boolean; + isForStatement(opts?: Opts): boolean; + isForXStatement(opts?: Opts): boolean; + isFunction(opts?: Opts): boolean; + isFunctionDeclaration(opts?: Opts): boolean; + isFunctionExpression(opts?: Opts): boolean; + isFunctionParent(opts?: Opts): boolean; + isFunctionTypeAnnotation(opts?: Opts): boolean; + isFunctionTypeParam(opts?: Opts): boolean; + isGenerated(opts?: Opts): boolean; + isGenericTypeAnnotation(opts?: Opts): boolean; + isIdentifier(opts?: Opts): boolean; + isIfStatement(opts?: Opts): boolean; + isImmutable(opts?: Opts): boolean; + isImport(opts?: Opts): boolean; + isImportAttribute(opts?: Opts): boolean; + isImportDeclaration(opts?: Opts): boolean; + isImportDefaultSpecifier(opts?: Opts): boolean; + isImportNamespaceSpecifier(opts?: Opts): boolean; + isImportSpecifier(opts?: Opts): boolean; + isIndexedAccessType(opts?: Opts): boolean; + isInferredPredicate(opts?: Opts): boolean; + isInterfaceDeclaration(opts?: Opts): boolean; + isInterfaceExtends(opts?: Opts): boolean; + isInterfaceTypeAnnotation(opts?: Opts): boolean; + isInterpreterDirective(opts?: Opts): boolean; + isIntersectionTypeAnnotation(opts?: Opts): boolean; + isJSX(opts?: Opts): boolean; + isJSXAttribute(opts?: Opts): boolean; + isJSXClosingElement(opts?: Opts): boolean; + isJSXClosingFragment(opts?: Opts): boolean; + isJSXElement(opts?: Opts): boolean; + isJSXEmptyExpression(opts?: Opts): boolean; + isJSXExpressionContainer(opts?: Opts): boolean; + isJSXFragment(opts?: Opts): boolean; + isJSXIdentifier(opts?: Opts): boolean; + isJSXMemberExpression(opts?: Opts): boolean; + isJSXNamespacedName(opts?: Opts): boolean; + isJSXOpeningElement(opts?: Opts): boolean; + isJSXOpeningFragment(opts?: Opts): boolean; + isJSXSpreadAttribute(opts?: Opts): boolean; + isJSXSpreadChild(opts?: Opts): boolean; + isJSXText(opts?: Opts): boolean; + isLVal(opts?: Opts): boolean; + isLabeledStatement(opts?: Opts): boolean; + isLiteral(opts?: Opts): boolean; + isLogicalExpression(opts?: Opts): boolean; + isLoop(opts?: Opts): boolean; + isMemberExpression(opts?: Opts): boolean; + isMetaProperty(opts?: Opts): boolean; + isMethod(opts?: Opts): boolean; + isMixedTypeAnnotation(opts?: Opts): boolean; + isModuleDeclaration(opts?: Opts): boolean; + isModuleExpression(opts?: Opts): boolean; + isModuleSpecifier(opts?: Opts): boolean; + isNewExpression(opts?: Opts): boolean; + isNoop(opts?: Opts): boolean; + isNullLiteral(opts?: Opts): boolean; + isNullLiteralTypeAnnotation(opts?: Opts): boolean; + isNullableTypeAnnotation(opts?: Opts): boolean; + isNumberLiteral(opts?: Opts): boolean; + isNumberLiteralTypeAnnotation(opts?: Opts): boolean; + isNumberTypeAnnotation(opts?: Opts): boolean; + isNumericLiteral(opts?: Opts): boolean; + isNumericLiteralTypeAnnotation(opts?: Opts): boolean; + isObjectExpression(opts?: Opts): boolean; + isObjectMember(opts?: Opts): boolean; + isObjectMethod(opts?: Opts): boolean; + isObjectPattern(opts?: Opts): boolean; + isObjectProperty(opts?: Opts): boolean; + isObjectTypeAnnotation(opts?: Opts): boolean; + isObjectTypeCallProperty(opts?: Opts): boolean; + isObjectTypeIndexer(opts?: Opts): boolean; + isObjectTypeInternalSlot(opts?: Opts): boolean; + isObjectTypeProperty(opts?: Opts): boolean; + isObjectTypeSpreadProperty(opts?: Opts): boolean; + isOpaqueType(opts?: Opts): boolean; + isOptionalCallExpression(opts?: Opts): boolean; + isOptionalIndexedAccessType(opts?: Opts): boolean; + isOptionalMemberExpression(opts?: Opts): boolean; + isParenthesizedExpression(opts?: Opts): boolean; + isPattern(opts?: Opts): boolean; + isPatternLike(opts?: Opts): boolean; + isPipelineBareFunction(opts?: Opts): boolean; + isPipelinePrimaryTopicReference(opts?: Opts): boolean; + isPipelineTopicExpression(opts?: Opts): boolean; + isPlaceholder(opts?: Opts): boolean; + isPrivate(opts?: Opts): boolean; + isPrivateName(opts?: Opts): boolean; + isProgram(opts?: Opts): boolean; + isProperty(opts?: Opts): boolean; + isPure(opts?: Opts): boolean; + isPureish(opts?: Opts): boolean; + isQualifiedTypeIdentifier(opts?: Opts): boolean; + isRecordExpression(opts?: Opts): boolean; + isReferenced(opts?: Opts): boolean; + isReferencedIdentifier(opts?: Opts): boolean; + isReferencedMemberExpression(opts?: Opts): boolean; + isRegExpLiteral(opts?: Opts): boolean; + isRegexLiteral(opts?: Opts): boolean; + isRestElement(opts?: Opts): boolean; + isRestProperty(opts?: Opts): boolean; + isReturnStatement(opts?: Opts): boolean; + isScopable(opts?: Opts): boolean; + isScope(opts?: Opts): boolean; + isSequenceExpression(opts?: Opts): boolean; + isSpreadElement(opts?: Opts): boolean; + isSpreadProperty(opts?: Opts): boolean; + isStatement(opts?: Opts): boolean; + isStaticBlock(opts?: Opts): boolean; + isStringLiteral(opts?: Opts): boolean; + isStringLiteralTypeAnnotation(opts?: Opts): boolean; + isStringTypeAnnotation(opts?: Opts): boolean; + isSuper(opts?: Opts): boolean; + isSwitchCase(opts?: Opts): boolean; + isSwitchStatement(opts?: Opts): boolean; + isSymbolTypeAnnotation(opts?: Opts): boolean; + isTSAnyKeyword(opts?: Opts): boolean; + isTSArrayType(opts?: Opts): boolean; + isTSAsExpression(opts?: Opts): boolean; + isTSBaseType(opts?: Opts): boolean; + isTSBigIntKeyword(opts?: Opts): boolean; + isTSBooleanKeyword(opts?: Opts): boolean; + isTSCallSignatureDeclaration(opts?: Opts): boolean; + isTSConditionalType(opts?: Opts): boolean; + isTSConstructSignatureDeclaration(opts?: Opts): boolean; + isTSConstructorType(opts?: Opts): boolean; + isTSDeclareFunction(opts?: Opts): boolean; + isTSDeclareMethod(opts?: Opts): boolean; + isTSEntityName(opts?: Opts): boolean; + isTSEnumDeclaration(opts?: Opts): boolean; + isTSEnumMember(opts?: Opts): boolean; + isTSExportAssignment(opts?: Opts): boolean; + isTSExpressionWithTypeArguments(opts?: Opts): boolean; + isTSExternalModuleReference(opts?: Opts): boolean; + isTSFunctionType(opts?: Opts): boolean; + isTSImportEqualsDeclaration(opts?: Opts): boolean; + isTSImportType(opts?: Opts): boolean; + isTSIndexSignature(opts?: Opts): boolean; + isTSIndexedAccessType(opts?: Opts): boolean; + isTSInferType(opts?: Opts): boolean; + isTSInterfaceBody(opts?: Opts): boolean; + isTSInterfaceDeclaration(opts?: Opts): boolean; + isTSIntersectionType(opts?: Opts): boolean; + isTSIntrinsicKeyword(opts?: Opts): boolean; + isTSLiteralType(opts?: Opts): boolean; + isTSMappedType(opts?: Opts): boolean; + isTSMethodSignature(opts?: Opts): boolean; + isTSModuleBlock(opts?: Opts): boolean; + isTSModuleDeclaration(opts?: Opts): boolean; + isTSNamedTupleMember(opts?: Opts): boolean; + isTSNamespaceExportDeclaration(opts?: Opts): boolean; + isTSNeverKeyword(opts?: Opts): boolean; + isTSNonNullExpression(opts?: Opts): boolean; + isTSNullKeyword(opts?: Opts): boolean; + isTSNumberKeyword(opts?: Opts): boolean; + isTSObjectKeyword(opts?: Opts): boolean; + isTSOptionalType(opts?: Opts): boolean; + isTSParameterProperty(opts?: Opts): boolean; + isTSParenthesizedType(opts?: Opts): boolean; + isTSPropertySignature(opts?: Opts): boolean; + isTSQualifiedName(opts?: Opts): boolean; + isTSRestType(opts?: Opts): boolean; + isTSStringKeyword(opts?: Opts): boolean; + isTSSymbolKeyword(opts?: Opts): boolean; + isTSThisType(opts?: Opts): boolean; + isTSTupleType(opts?: Opts): boolean; + isTSType(opts?: Opts): boolean; + isTSTypeAliasDeclaration(opts?: Opts): boolean; + isTSTypeAnnotation(opts?: Opts): boolean; + isTSTypeAssertion(opts?: Opts): boolean; + isTSTypeElement(opts?: Opts): boolean; + isTSTypeLiteral(opts?: Opts): boolean; + isTSTypeOperator(opts?: Opts): boolean; + isTSTypeParameter(opts?: Opts): boolean; + isTSTypeParameterDeclaration(opts?: Opts): boolean; + isTSTypeParameterInstantiation(opts?: Opts): boolean; + isTSTypePredicate(opts?: Opts): boolean; + isTSTypeQuery(opts?: Opts): boolean; + isTSTypeReference(opts?: Opts): boolean; + isTSUndefinedKeyword(opts?: Opts): boolean; + isTSUnionType(opts?: Opts): boolean; + isTSUnknownKeyword(opts?: Opts): boolean; + isTSVoidKeyword(opts?: Opts): boolean; + isTaggedTemplateExpression(opts?: Opts): boolean; + isTemplateElement(opts?: Opts): boolean; + isTemplateLiteral(opts?: Opts): boolean; + isTerminatorless(opts?: Opts): boolean; + isThisExpression(opts?: Opts): boolean; + isThisTypeAnnotation(opts?: Opts): boolean; + isThrowStatement(opts?: Opts): boolean; + isTryStatement(opts?: Opts): boolean; + isTupleExpression(opts?: Opts): boolean; + isTupleTypeAnnotation(opts?: Opts): boolean; + isTypeAlias(opts?: Opts): boolean; + isTypeAnnotation(opts?: Opts): boolean; + isTypeCastExpression(opts?: Opts): boolean; + isTypeParameter(opts?: Opts): boolean; + isTypeParameterDeclaration(opts?: Opts): boolean; + isTypeParameterInstantiation(opts?: Opts): boolean; + isTypeofTypeAnnotation(opts?: Opts): boolean; + isUnaryExpression(opts?: Opts): boolean; + isUnaryLike(opts?: Opts): boolean; + isUnionTypeAnnotation(opts?: Opts): boolean; + isUpdateExpression(opts?: Opts): boolean; + isUser(opts?: Opts): boolean; + isUserWhitespacable(opts?: Opts): boolean; + isV8IntrinsicIdentifier(opts?: Opts): boolean; + isVar(opts?: Opts): boolean; + isVariableDeclaration(opts?: Opts): boolean; + isVariableDeclarator(opts?: Opts): boolean; + isVariance(opts?: Opts): boolean; + isVoidTypeAnnotation(opts?: Opts): boolean; + isWhile(opts?: Opts): boolean; + isWhileStatement(opts?: Opts): boolean; + isWithStatement(opts?: Opts): boolean; + isYieldExpression(opts?: Opts): boolean; + assertAnyTypeAnnotation(opts?: Opts): void; + assertArgumentPlaceholder(opts?: Opts): void; + assertArrayExpression(opts?: Opts): void; + assertArrayPattern(opts?: Opts): void; + assertArrayTypeAnnotation(opts?: Opts): void; + assertArrowFunctionExpression(opts?: Opts): void; + assertAssignmentExpression(opts?: Opts): void; + assertAssignmentPattern(opts?: Opts): void; + assertAwaitExpression(opts?: Opts): void; + assertBigIntLiteral(opts?: Opts): void; + assertBinary(opts?: Opts): void; + assertBinaryExpression(opts?: Opts): void; + assertBindExpression(opts?: Opts): void; + assertBindingIdentifier(opts?: Opts): void; + assertBlock(opts?: Opts): void; + assertBlockParent(opts?: Opts): void; + assertBlockScoped(opts?: Opts): void; + assertBlockStatement(opts?: Opts): void; + assertBooleanLiteral(opts?: Opts): void; + assertBooleanLiteralTypeAnnotation(opts?: Opts): void; + assertBooleanTypeAnnotation(opts?: Opts): void; + assertBreakStatement(opts?: Opts): void; + assertCallExpression(opts?: Opts): void; + assertCatchClause(opts?: Opts): void; + assertClass(opts?: Opts): void; + assertClassBody(opts?: Opts): void; + assertClassDeclaration(opts?: Opts): void; + assertClassExpression(opts?: Opts): void; + assertClassImplements(opts?: Opts): void; + assertClassMethod(opts?: Opts): void; + assertClassPrivateMethod(opts?: Opts): void; + assertClassPrivateProperty(opts?: Opts): void; + assertClassProperty(opts?: Opts): void; + assertCompletionStatement(opts?: Opts): void; + assertConditional(opts?: Opts): void; + assertConditionalExpression(opts?: Opts): void; + assertContinueStatement(opts?: Opts): void; + assertDebuggerStatement(opts?: Opts): void; + assertDecimalLiteral(opts?: Opts): void; + assertDeclaration(opts?: Opts): void; + assertDeclareClass(opts?: Opts): void; + assertDeclareExportAllDeclaration(opts?: Opts): void; + assertDeclareExportDeclaration(opts?: Opts): void; + assertDeclareFunction(opts?: Opts): void; + assertDeclareInterface(opts?: Opts): void; + assertDeclareModule(opts?: Opts): void; + assertDeclareModuleExports(opts?: Opts): void; + assertDeclareOpaqueType(opts?: Opts): void; + assertDeclareTypeAlias(opts?: Opts): void; + assertDeclareVariable(opts?: Opts): void; + assertDeclaredPredicate(opts?: Opts): void; + assertDecorator(opts?: Opts): void; + assertDirective(opts?: Opts): void; + assertDirectiveLiteral(opts?: Opts): void; + assertDoExpression(opts?: Opts): void; + assertDoWhileStatement(opts?: Opts): void; + assertEmptyStatement(opts?: Opts): void; + assertEmptyTypeAnnotation(opts?: Opts): void; + assertEnumBody(opts?: Opts): void; + assertEnumBooleanBody(opts?: Opts): void; + assertEnumBooleanMember(opts?: Opts): void; + assertEnumDeclaration(opts?: Opts): void; + assertEnumDefaultedMember(opts?: Opts): void; + assertEnumMember(opts?: Opts): void; + assertEnumNumberBody(opts?: Opts): void; + assertEnumNumberMember(opts?: Opts): void; + assertEnumStringBody(opts?: Opts): void; + assertEnumStringMember(opts?: Opts): void; + assertEnumSymbolBody(opts?: Opts): void; + assertExistentialTypeParam(opts?: Opts): void; + assertExistsTypeAnnotation(opts?: Opts): void; + assertExportAllDeclaration(opts?: Opts): void; + assertExportDeclaration(opts?: Opts): void; + assertExportDefaultDeclaration(opts?: Opts): void; + assertExportDefaultSpecifier(opts?: Opts): void; + assertExportNamedDeclaration(opts?: Opts): void; + assertExportNamespaceSpecifier(opts?: Opts): void; + assertExportSpecifier(opts?: Opts): void; + assertExpression(opts?: Opts): void; + assertExpressionStatement(opts?: Opts): void; + assertExpressionWrapper(opts?: Opts): void; + assertFile(opts?: Opts): void; + assertFlow(opts?: Opts): void; + assertFlowBaseAnnotation(opts?: Opts): void; + assertFlowDeclaration(opts?: Opts): void; + assertFlowPredicate(opts?: Opts): void; + assertFlowType(opts?: Opts): void; + assertFor(opts?: Opts): void; + assertForAwaitStatement(opts?: Opts): void; + assertForInStatement(opts?: Opts): void; + assertForOfStatement(opts?: Opts): void; + assertForStatement(opts?: Opts): void; + assertForXStatement(opts?: Opts): void; + assertFunction(opts?: Opts): void; + assertFunctionDeclaration(opts?: Opts): void; + assertFunctionExpression(opts?: Opts): void; + assertFunctionParent(opts?: Opts): void; + assertFunctionTypeAnnotation(opts?: Opts): void; + assertFunctionTypeParam(opts?: Opts): void; + assertGenerated(opts?: Opts): void; + assertGenericTypeAnnotation(opts?: Opts): void; + assertIdentifier(opts?: Opts): void; + assertIfStatement(opts?: Opts): void; + assertImmutable(opts?: Opts): void; + assertImport(opts?: Opts): void; + assertImportAttribute(opts?: Opts): void; + assertImportDeclaration(opts?: Opts): void; + assertImportDefaultSpecifier(opts?: Opts): void; + assertImportNamespaceSpecifier(opts?: Opts): void; + assertImportSpecifier(opts?: Opts): void; + assertIndexedAccessType(opts?: Opts): void; + assertInferredPredicate(opts?: Opts): void; + assertInterfaceDeclaration(opts?: Opts): void; + assertInterfaceExtends(opts?: Opts): void; + assertInterfaceTypeAnnotation(opts?: Opts): void; + assertInterpreterDirective(opts?: Opts): void; + assertIntersectionTypeAnnotation(opts?: Opts): void; + assertJSX(opts?: Opts): void; + assertJSXAttribute(opts?: Opts): void; + assertJSXClosingElement(opts?: Opts): void; + assertJSXClosingFragment(opts?: Opts): void; + assertJSXElement(opts?: Opts): void; + assertJSXEmptyExpression(opts?: Opts): void; + assertJSXExpressionContainer(opts?: Opts): void; + assertJSXFragment(opts?: Opts): void; + assertJSXIdentifier(opts?: Opts): void; + assertJSXMemberExpression(opts?: Opts): void; + assertJSXNamespacedName(opts?: Opts): void; + assertJSXOpeningElement(opts?: Opts): void; + assertJSXOpeningFragment(opts?: Opts): void; + assertJSXSpreadAttribute(opts?: Opts): void; + assertJSXSpreadChild(opts?: Opts): void; + assertJSXText(opts?: Opts): void; + assertLVal(opts?: Opts): void; + assertLabeledStatement(opts?: Opts): void; + assertLiteral(opts?: Opts): void; + assertLogicalExpression(opts?: Opts): void; + assertLoop(opts?: Opts): void; + assertMemberExpression(opts?: Opts): void; + assertMetaProperty(opts?: Opts): void; + assertMethod(opts?: Opts): void; + assertMixedTypeAnnotation(opts?: Opts): void; + assertModuleDeclaration(opts?: Opts): void; + assertModuleExpression(opts?: Opts): void; + assertModuleSpecifier(opts?: Opts): void; + assertNewExpression(opts?: Opts): void; + assertNoop(opts?: Opts): void; + assertNullLiteral(opts?: Opts): void; + assertNullLiteralTypeAnnotation(opts?: Opts): void; + assertNullableTypeAnnotation(opts?: Opts): void; + assertNumberLiteral(opts?: Opts): void; + assertNumberLiteralTypeAnnotation(opts?: Opts): void; + assertNumberTypeAnnotation(opts?: Opts): void; + assertNumericLiteral(opts?: Opts): void; + assertNumericLiteralTypeAnnotation(opts?: Opts): void; + assertObjectExpression(opts?: Opts): void; + assertObjectMember(opts?: Opts): void; + assertObjectMethod(opts?: Opts): void; + assertObjectPattern(opts?: Opts): void; + assertObjectProperty(opts?: Opts): void; + assertObjectTypeAnnotation(opts?: Opts): void; + assertObjectTypeCallProperty(opts?: Opts): void; + assertObjectTypeIndexer(opts?: Opts): void; + assertObjectTypeInternalSlot(opts?: Opts): void; + assertObjectTypeProperty(opts?: Opts): void; + assertObjectTypeSpreadProperty(opts?: Opts): void; + assertOpaqueType(opts?: Opts): void; + assertOptionalCallExpression(opts?: Opts): void; + assertOptionalIndexedAccessType(opts?: Opts): void; + assertOptionalMemberExpression(opts?: Opts): void; + assertParenthesizedExpression(opts?: Opts): void; + assertPattern(opts?: Opts): void; + assertPatternLike(opts?: Opts): void; + assertPipelineBareFunction(opts?: Opts): void; + assertPipelinePrimaryTopicReference(opts?: Opts): void; + assertPipelineTopicExpression(opts?: Opts): void; + assertPlaceholder(opts?: Opts): void; + assertPrivate(opts?: Opts): void; + assertPrivateName(opts?: Opts): void; + assertProgram(opts?: Opts): void; + assertProperty(opts?: Opts): void; + assertPure(opts?: Opts): void; + assertPureish(opts?: Opts): void; + assertQualifiedTypeIdentifier(opts?: Opts): void; + assertRecordExpression(opts?: Opts): void; + assertReferenced(opts?: Opts): void; + assertReferencedIdentifier(opts?: Opts): void; + assertReferencedMemberExpression(opts?: Opts): void; + assertRegExpLiteral(opts?: Opts): void; + assertRegexLiteral(opts?: Opts): void; + assertRestElement(opts?: Opts): void; + assertRestProperty(opts?: Opts): void; + assertReturnStatement(opts?: Opts): void; + assertScopable(opts?: Opts): void; + assertScope(opts?: Opts): void; + assertSequenceExpression(opts?: Opts): void; + assertSpreadElement(opts?: Opts): void; + assertSpreadProperty(opts?: Opts): void; + assertStatement(opts?: Opts): void; + assertStaticBlock(opts?: Opts): void; + assertStringLiteral(opts?: Opts): void; + assertStringLiteralTypeAnnotation(opts?: Opts): void; + assertStringTypeAnnotation(opts?: Opts): void; + assertSuper(opts?: Opts): void; + assertSwitchCase(opts?: Opts): void; + assertSwitchStatement(opts?: Opts): void; + assertSymbolTypeAnnotation(opts?: Opts): void; + assertTSAnyKeyword(opts?: Opts): void; + assertTSArrayType(opts?: Opts): void; + assertTSAsExpression(opts?: Opts): void; + assertTSBaseType(opts?: Opts): void; + assertTSBigIntKeyword(opts?: Opts): void; + assertTSBooleanKeyword(opts?: Opts): void; + assertTSCallSignatureDeclaration(opts?: Opts): void; + assertTSConditionalType(opts?: Opts): void; + assertTSConstructSignatureDeclaration(opts?: Opts): void; + assertTSConstructorType(opts?: Opts): void; + assertTSDeclareFunction(opts?: Opts): void; + assertTSDeclareMethod(opts?: Opts): void; + assertTSEntityName(opts?: Opts): void; + assertTSEnumDeclaration(opts?: Opts): void; + assertTSEnumMember(opts?: Opts): void; + assertTSExportAssignment(opts?: Opts): void; + assertTSExpressionWithTypeArguments(opts?: Opts): void; + assertTSExternalModuleReference(opts?: Opts): void; + assertTSFunctionType(opts?: Opts): void; + assertTSImportEqualsDeclaration(opts?: Opts): void; + assertTSImportType(opts?: Opts): void; + assertTSIndexSignature(opts?: Opts): void; + assertTSIndexedAccessType(opts?: Opts): void; + assertTSInferType(opts?: Opts): void; + assertTSInterfaceBody(opts?: Opts): void; + assertTSInterfaceDeclaration(opts?: Opts): void; + assertTSIntersectionType(opts?: Opts): void; + assertTSIntrinsicKeyword(opts?: Opts): void; + assertTSLiteralType(opts?: Opts): void; + assertTSMappedType(opts?: Opts): void; + assertTSMethodSignature(opts?: Opts): void; + assertTSModuleBlock(opts?: Opts): void; + assertTSModuleDeclaration(opts?: Opts): void; + assertTSNamedTupleMember(opts?: Opts): void; + assertTSNamespaceExportDeclaration(opts?: Opts): void; + assertTSNeverKeyword(opts?: Opts): void; + assertTSNonNullExpression(opts?: Opts): void; + assertTSNullKeyword(opts?: Opts): void; + assertTSNumberKeyword(opts?: Opts): void; + assertTSObjectKeyword(opts?: Opts): void; + assertTSOptionalType(opts?: Opts): void; + assertTSParameterProperty(opts?: Opts): void; + assertTSParenthesizedType(opts?: Opts): void; + assertTSPropertySignature(opts?: Opts): void; + assertTSQualifiedName(opts?: Opts): void; + assertTSRestType(opts?: Opts): void; + assertTSStringKeyword(opts?: Opts): void; + assertTSSymbolKeyword(opts?: Opts): void; + assertTSThisType(opts?: Opts): void; + assertTSTupleType(opts?: Opts): void; + assertTSType(opts?: Opts): void; + assertTSTypeAliasDeclaration(opts?: Opts): void; + assertTSTypeAnnotation(opts?: Opts): void; + assertTSTypeAssertion(opts?: Opts): void; + assertTSTypeElement(opts?: Opts): void; + assertTSTypeLiteral(opts?: Opts): void; + assertTSTypeOperator(opts?: Opts): void; + assertTSTypeParameter(opts?: Opts): void; + assertTSTypeParameterDeclaration(opts?: Opts): void; + assertTSTypeParameterInstantiation(opts?: Opts): void; + assertTSTypePredicate(opts?: Opts): void; + assertTSTypeQuery(opts?: Opts): void; + assertTSTypeReference(opts?: Opts): void; + assertTSUndefinedKeyword(opts?: Opts): void; + assertTSUnionType(opts?: Opts): void; + assertTSUnknownKeyword(opts?: Opts): void; + assertTSVoidKeyword(opts?: Opts): void; + assertTaggedTemplateExpression(opts?: Opts): void; + assertTemplateElement(opts?: Opts): void; + assertTemplateLiteral(opts?: Opts): void; + assertTerminatorless(opts?: Opts): void; + assertThisExpression(opts?: Opts): void; + assertThisTypeAnnotation(opts?: Opts): void; + assertThrowStatement(opts?: Opts): void; + assertTryStatement(opts?: Opts): void; + assertTupleExpression(opts?: Opts): void; + assertTupleTypeAnnotation(opts?: Opts): void; + assertTypeAlias(opts?: Opts): void; + assertTypeAnnotation(opts?: Opts): void; + assertTypeCastExpression(opts?: Opts): void; + assertTypeParameter(opts?: Opts): void; + assertTypeParameterDeclaration(opts?: Opts): void; + assertTypeParameterInstantiation(opts?: Opts): void; + assertTypeofTypeAnnotation(opts?: Opts): void; + assertUnaryExpression(opts?: Opts): void; + assertUnaryLike(opts?: Opts): void; + assertUnionTypeAnnotation(opts?: Opts): void; + assertUpdateExpression(opts?: Opts): void; + assertUser(opts?: Opts): void; + assertUserWhitespacable(opts?: Opts): void; + assertV8IntrinsicIdentifier(opts?: Opts): void; + assertVar(opts?: Opts): void; + assertVariableDeclaration(opts?: Opts): void; + assertVariableDeclarator(opts?: Opts): void; + assertVariance(opts?: Opts): void; + assertVoidTypeAnnotation(opts?: Opts): void; + assertWhile(opts?: Opts): void; + assertWhileStatement(opts?: Opts): void; + assertWithStatement(opts?: Opts): void; + assertYieldExpression(opts?: Opts): void; + // END GENERATED NODE PATH METHODS + } + + declare export type VisitNodeFunction<-TNode: BabelNode, TState> = ( + path: NodePath, + state: TState, + ) => void; + + declare export type VisitNodeObject<-TNode: BabelNode, TState> = Partial<{ + enter(path: NodePath, state: TState): void, + exit(path: NodePath, state: TState): void, + }>; + + declare export type VisitNode<-TNode: BabelNode, TState> = + | VisitNodeFunction + | VisitNodeObject; + + declare export type Visitor = $ReadOnly<{ + enter?: VisitNodeFunction, + exit?: VisitNodeFunction, + + // This section is automatically generated. Don't edit by hand. + // See the comment at the top of the file on how to update the definitions. + // BEGIN GENERATED VISITOR METHODS + AnyTypeAnnotation?: VisitNode, + ArgumentPlaceholder?: VisitNode, + ArrayExpression?: VisitNode, + ArrayPattern?: VisitNode, + ArrayTypeAnnotation?: VisitNode, + ArrowFunctionExpression?: VisitNode< + BabelNodeArrowFunctionExpression, + TState, + >, + AssignmentExpression?: VisitNode, + AssignmentPattern?: VisitNode, + AwaitExpression?: VisitNode, + BigIntLiteral?: VisitNode, + Binary?: VisitNode, + BinaryExpression?: VisitNode, + BindExpression?: VisitNode, + BindingIdentifier?: VisitNode, + Block?: VisitNode, + BlockParent?: VisitNode, + BlockScoped?: VisitNode, + BlockStatement?: VisitNode, + BooleanLiteral?: VisitNode, + BooleanLiteralTypeAnnotation?: VisitNode< + BabelNodeBooleanLiteralTypeAnnotation, + TState, + >, + BooleanTypeAnnotation?: VisitNode, + BreakStatement?: VisitNode, + CallExpression?: VisitNode, + CatchClause?: VisitNode, + Class?: VisitNode, + ClassBody?: VisitNode, + ClassDeclaration?: VisitNode, + ClassExpression?: VisitNode, + ClassImplements?: VisitNode, + ClassMethod?: VisitNode, + ClassPrivateMethod?: VisitNode, + ClassPrivateProperty?: VisitNode, + ClassProperty?: VisitNode, + CompletionStatement?: VisitNode, + Conditional?: VisitNode, + ConditionalExpression?: VisitNode, + ContinueStatement?: VisitNode, + DebuggerStatement?: VisitNode, + DecimalLiteral?: VisitNode, + Declaration?: VisitNode, + DeclareClass?: VisitNode, + DeclareExportAllDeclaration?: VisitNode< + BabelNodeDeclareExportAllDeclaration, + TState, + >, + DeclareExportDeclaration?: VisitNode< + BabelNodeDeclareExportDeclaration, + TState, + >, + DeclareFunction?: VisitNode, + DeclareInterface?: VisitNode, + DeclareModule?: VisitNode, + DeclareModuleExports?: VisitNode, + DeclareOpaqueType?: VisitNode, + DeclareTypeAlias?: VisitNode, + DeclareVariable?: VisitNode, + DeclaredPredicate?: VisitNode, + Decorator?: VisitNode, + Directive?: VisitNode, + DirectiveLiteral?: VisitNode, + DoExpression?: VisitNode, + DoWhileStatement?: VisitNode, + EmptyStatement?: VisitNode, + EmptyTypeAnnotation?: VisitNode, + EnumBody?: VisitNode, + EnumBooleanBody?: VisitNode, + EnumBooleanMember?: VisitNode, + EnumDeclaration?: VisitNode, + EnumDefaultedMember?: VisitNode, + EnumMember?: VisitNode, + EnumNumberBody?: VisitNode, + EnumNumberMember?: VisitNode, + EnumStringBody?: VisitNode, + EnumStringMember?: VisitNode, + EnumSymbolBody?: VisitNode, + ExistentialTypeParam?: VisitNode, + ExistsTypeAnnotation?: VisitNode, + ExportAllDeclaration?: VisitNode, + ExportDeclaration?: VisitNode, + ExportDefaultDeclaration?: VisitNode< + BabelNodeExportDefaultDeclaration, + TState, + >, + ExportDefaultSpecifier?: VisitNode, + ExportNamedDeclaration?: VisitNode, + ExportNamespaceSpecifier?: VisitNode< + BabelNodeExportNamespaceSpecifier, + TState, + >, + ExportSpecifier?: VisitNode, + Expression?: VisitNode, + ExpressionStatement?: VisitNode, + ExpressionWrapper?: VisitNode, + Flow?: VisitNode, + FlowBaseAnnotation?: VisitNode, + FlowDeclaration?: VisitNode, + FlowPredicate?: VisitNode, + FlowType?: VisitNode, + For?: VisitNode, + ForAwaitStatement?: VisitNode, + ForInStatement?: VisitNode, + ForOfStatement?: VisitNode, + ForStatement?: VisitNode, + ForXStatement?: VisitNode, + Function?: VisitNode, + FunctionDeclaration?: VisitNode, + FunctionExpression?: VisitNode, + FunctionParent?: VisitNode, + FunctionTypeAnnotation?: VisitNode, + FunctionTypeParam?: VisitNode, + Generated?: VisitNode, + GenericTypeAnnotation?: VisitNode, + Identifier?: VisitNode, + IfStatement?: VisitNode, + Immutable?: VisitNode, + Import?: VisitNode, + ImportAttribute?: VisitNode, + ImportDeclaration?: VisitNode, + ImportDefaultSpecifier?: VisitNode, + ImportNamespaceSpecifier?: VisitNode< + BabelNodeImportNamespaceSpecifier, + TState, + >, + ImportSpecifier?: VisitNode, + IndexedAccessType?: VisitNode, + InferredPredicate?: VisitNode, + InterfaceDeclaration?: VisitNode, + InterfaceExtends?: VisitNode, + InterfaceTypeAnnotation?: VisitNode< + BabelNodeInterfaceTypeAnnotation, + TState, + >, + InterpreterDirective?: VisitNode, + IntersectionTypeAnnotation?: VisitNode< + BabelNodeIntersectionTypeAnnotation, + TState, + >, + JSX?: VisitNode, + JSXAttribute?: VisitNode, + JSXClosingElement?: VisitNode, + JSXClosingFragment?: VisitNode, + JSXElement?: VisitNode, + JSXEmptyExpression?: VisitNode, + JSXExpressionContainer?: VisitNode, + JSXFragment?: VisitNode, + JSXIdentifier?: VisitNode, + JSXMemberExpression?: VisitNode, + JSXNamespacedName?: VisitNode, + JSXOpeningElement?: VisitNode, + JSXOpeningFragment?: VisitNode, + JSXSpreadAttribute?: VisitNode, + JSXSpreadChild?: VisitNode, + JSXText?: VisitNode, + LVal?: VisitNode, + LabeledStatement?: VisitNode, + Literal?: VisitNode, + LogicalExpression?: VisitNode, + Loop?: VisitNode, + MemberExpression?: VisitNode, + MetaProperty?: VisitNode, + Method?: VisitNode, + MixedTypeAnnotation?: VisitNode, + ModuleDeclaration?: VisitNode, + ModuleExpression?: VisitNode, + ModuleSpecifier?: VisitNode, + NewExpression?: VisitNode, + Noop?: VisitNode, + NullLiteral?: VisitNode, + NullLiteralTypeAnnotation?: VisitNode< + BabelNodeNullLiteralTypeAnnotation, + TState, + >, + NullableTypeAnnotation?: VisitNode, + NumberLiteral?: VisitNode, + NumberLiteralTypeAnnotation?: VisitNode< + BabelNodeNumberLiteralTypeAnnotation, + TState, + >, + NumberTypeAnnotation?: VisitNode, + NumericLiteral?: VisitNode, + NumericLiteralTypeAnnotation?: VisitNode, + ObjectExpression?: VisitNode, + ObjectMember?: VisitNode, + ObjectMethod?: VisitNode, + ObjectPattern?: VisitNode, + ObjectProperty?: VisitNode, + ObjectTypeAnnotation?: VisitNode, + ObjectTypeCallProperty?: VisitNode, + ObjectTypeIndexer?: VisitNode, + ObjectTypeInternalSlot?: VisitNode, + ObjectTypeProperty?: VisitNode, + ObjectTypeSpreadProperty?: VisitNode< + BabelNodeObjectTypeSpreadProperty, + TState, + >, + OpaqueType?: VisitNode, + OptionalCallExpression?: VisitNode, + OptionalIndexedAccessType?: VisitNode< + BabelNodeOptionalIndexedAccessType, + TState, + >, + OptionalMemberExpression?: VisitNode< + BabelNodeOptionalMemberExpression, + TState, + >, + ParenthesizedExpression?: VisitNode< + BabelNodeParenthesizedExpression, + TState, + >, + Pattern?: VisitNode, + PatternLike?: VisitNode, + PipelineBareFunction?: VisitNode, + PipelinePrimaryTopicReference?: VisitNode< + BabelNodePipelinePrimaryTopicReference, + TState, + >, + PipelineTopicExpression?: VisitNode< + BabelNodePipelineTopicExpression, + TState, + >, + Placeholder?: VisitNode, + Private?: VisitNode, + PrivateName?: VisitNode, + Program?: VisitNode, + Property?: VisitNode, + Pure?: VisitNode, + Pureish?: VisitNode, + QualifiedTypeIdentifier?: VisitNode< + BabelNodeQualifiedTypeIdentifier, + TState, + >, + RecordExpression?: VisitNode, + Referenced?: VisitNode, + ReferencedIdentifier?: VisitNode, + ReferencedMemberExpression?: VisitNode, + RegExpLiteral?: VisitNode, + RegexLiteral?: VisitNode, + RestElement?: VisitNode, + RestProperty?: VisitNode, + ReturnStatement?: VisitNode, + Scopable?: VisitNode, + Scope?: VisitNode, + SequenceExpression?: VisitNode, + SpreadElement?: VisitNode, + SpreadProperty?: VisitNode, + Statement?: VisitNode, + StaticBlock?: VisitNode, + StringLiteral?: VisitNode, + StringLiteralTypeAnnotation?: VisitNode< + BabelNodeStringLiteralTypeAnnotation, + TState, + >, + StringTypeAnnotation?: VisitNode, + Super?: VisitNode, + SwitchCase?: VisitNode, + SwitchStatement?: VisitNode, + SymbolTypeAnnotation?: VisitNode, + TSAnyKeyword?: VisitNode, + TSArrayType?: VisitNode, + TSAsExpression?: VisitNode, + TSBaseType?: VisitNode, + TSBigIntKeyword?: VisitNode, + TSBooleanKeyword?: VisitNode, + TSCallSignatureDeclaration?: VisitNode< + BabelNodeTSCallSignatureDeclaration, + TState, + >, + TSConditionalType?: VisitNode, + TSConstructSignatureDeclaration?: VisitNode< + BabelNodeTSConstructSignatureDeclaration, + TState, + >, + TSConstructorType?: VisitNode, + TSDeclareFunction?: VisitNode, + TSDeclareMethod?: VisitNode, + TSEntityName?: VisitNode, + TSEnumDeclaration?: VisitNode, + TSEnumMember?: VisitNode, + TSExportAssignment?: VisitNode, + TSExpressionWithTypeArguments?: VisitNode< + BabelNodeTSExpressionWithTypeArguments, + TState, + >, + TSExternalModuleReference?: VisitNode< + BabelNodeTSExternalModuleReference, + TState, + >, + TSFunctionType?: VisitNode, + TSImportEqualsDeclaration?: VisitNode< + BabelNodeTSImportEqualsDeclaration, + TState, + >, + TSImportType?: VisitNode, + TSIndexSignature?: VisitNode, + TSIndexedAccessType?: VisitNode, + TSInferType?: VisitNode, + TSInterfaceBody?: VisitNode, + TSInterfaceDeclaration?: VisitNode, + TSIntersectionType?: VisitNode, + TSIntrinsicKeyword?: VisitNode, + TSLiteralType?: VisitNode, + TSMappedType?: VisitNode, + TSMethodSignature?: VisitNode, + TSModuleBlock?: VisitNode, + TSModuleDeclaration?: VisitNode, + TSNamedTupleMember?: VisitNode, + TSNamespaceExportDeclaration?: VisitNode< + BabelNodeTSNamespaceExportDeclaration, + TState, + >, + TSNeverKeyword?: VisitNode, + TSNonNullExpression?: VisitNode, + TSNullKeyword?: VisitNode, + TSNumberKeyword?: VisitNode, + TSObjectKeyword?: VisitNode, + TSOptionalType?: VisitNode, + TSParameterProperty?: VisitNode, + TSParenthesizedType?: VisitNode, + TSPropertySignature?: VisitNode, + TSQualifiedName?: VisitNode, + TSRestType?: VisitNode, + TSStringKeyword?: VisitNode, + TSSymbolKeyword?: VisitNode, + TSThisType?: VisitNode, + TSTupleType?: VisitNode, + TSType?: VisitNode, + TSTypeAliasDeclaration?: VisitNode, + TSTypeAnnotation?: VisitNode, + TSTypeAssertion?: VisitNode, + TSTypeElement?: VisitNode, + TSTypeLiteral?: VisitNode, + TSTypeOperator?: VisitNode, + TSTypeParameter?: VisitNode, + TSTypeParameterDeclaration?: VisitNode< + BabelNodeTSTypeParameterDeclaration, + TState, + >, + TSTypeParameterInstantiation?: VisitNode< + BabelNodeTSTypeParameterInstantiation, + TState, + >, + TSTypePredicate?: VisitNode, + TSTypeQuery?: VisitNode, + TSTypeReference?: VisitNode, + TSUndefinedKeyword?: VisitNode, + TSUnionType?: VisitNode, + TSUnknownKeyword?: VisitNode, + TSVoidKeyword?: VisitNode, + TaggedTemplateExpression?: VisitNode< + BabelNodeTaggedTemplateExpression, + TState, + >, + TemplateElement?: VisitNode, + TemplateLiteral?: VisitNode, + Terminatorless?: VisitNode, + ThisExpression?: VisitNode, + ThisTypeAnnotation?: VisitNode, + ThrowStatement?: VisitNode, + TryStatement?: VisitNode, + TupleExpression?: VisitNode, + TupleTypeAnnotation?: VisitNode, + TypeAlias?: VisitNode, + TypeAnnotation?: VisitNode, + TypeCastExpression?: VisitNode, + TypeParameter?: VisitNode, + TypeParameterDeclaration?: VisitNode< + BabelNodeTypeParameterDeclaration, + TState, + >, + TypeParameterInstantiation?: VisitNode< + BabelNodeTypeParameterInstantiation, + TState, + >, + TypeofTypeAnnotation?: VisitNode, + UnaryExpression?: VisitNode, + UnaryLike?: VisitNode, + UnionTypeAnnotation?: VisitNode, + UpdateExpression?: VisitNode, + User?: VisitNode, + UserWhitespacable?: VisitNode, + V8IntrinsicIdentifier?: VisitNode, + Var?: VisitNode, + VariableDeclaration?: VisitNode, + VariableDeclarator?: VisitNode, + Variance?: VisitNode, + VoidTypeAnnotation?: VisitNode, + While?: VisitNode, + WhileStatement?: VisitNode, + WithStatement?: VisitNode, + YieldExpression?: VisitNode, + // END GENERATED VISITOR METHODS + }>; + + declare type Visitors = { + explode(visitor: Visitor): Visitor, + verify(visitor: Visitor): void, + merge( + visitors: Array<$ReadOnly>>, + states: Array, + wrapper?: ?Function, + ): Array>, + }; + + declare export var visitors: Visitors; + + declare export type Cache = { + path: $ReadOnlyWeakMap, + scope: $ReadOnlyWeakMap, + clear(): void, + clearPath(): void, + clearScope(): void, + }; + + declare export type Traverse = { + ( + parent?: BabelNode | Array, + opts?: $ReadOnly>, + scope?: ?Scope, + state: TState, + parentPath?: ?NodePath, + ): void, + + +cache: Cache, + +visitors: Visitors, + +verify: Visitors['verify'], + +explode: Visitors['explode'], + + cheap( + node: BabelNode, + enter: (node: BabelNode, opts: TOptions) => void, + ): void, + + node( + node: BabelNode, + opts: $ReadOnly>, + scope: Scope, + state: TState, + parentPath: NodePath<>, + skipKeys?: {[key: string]: boolean}, + ): void, + + clearNode(node: BabelNode, opts?: {...}): void, + removeProperties(tree: BabelNode, opts?: {...}): BabelNode, + hasType( + tree: BabelNode, + type: BabelNode['type'], + blacklistTypes: Array, + ): boolean, + }; + + declare export default Traverse; +} diff --git a/flow-typed/npm/babel-types_v7.x.x.js b/flow-typed/npm/babel-types_v7.x.x.js new file mode 100644 index 00000000000000..339c7e6c7394ee --- /dev/null +++ b/flow-typed/npm/babel-types_v7.x.x.js @@ -0,0 +1,4014 @@ +/** + * 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. + * @generated + * See xplat/js/tools/metro/scripts/updateBabelTypesFlowTypes.js. + * @flow strict + */ + +declare type BabelNodeBaseComment = { + value: string; + start: number; + end: number; + loc: BabelNodeSourceLocation; +}; + +declare type BabelNodeCommentBlock = { + ...BabelNodeBaseComment; + type: "CommentBlock"; +}; + +declare type BabelNodeCommentLine ={ + ...BabelNodeBaseComment, + type: "CommentLine"; +}; + +declare type BabelNodeComment = BabelNodeCommentBlock | BabelNodeCommentLine; + +declare type BabelNodeSourceLocation = { + start: { + line: number; + column: number; + }; + + end: { + line: number; + column: number; + }; +}; + + +declare type BabelNodeArrayExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ArrayExpression"; + elements?: Array; +}; + +declare type BabelNodeAssignmentExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "AssignmentExpression"; + operator: string; + left: BabelNodeLVal; + right: BabelNodeExpression; +}; + +declare type BabelNodeBinaryExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "BinaryExpression"; + operator: "+" | "-" | "/" | "%" | "*" | "**" | "&" | "|" | ">>" | ">>>" | "<<" | "^" | "==" | "===" | "!=" | "!==" | "in" | "instanceof" | ">" | "<" | ">=" | "<="; + left: BabelNodeExpression | BabelNodePrivateName; + right: BabelNodeExpression; +}; + +declare type BabelNodeInterpreterDirective = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "InterpreterDirective"; + value: string; +}; + +declare type BabelNodeDirective = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Directive"; + value: BabelNodeDirectiveLiteral; +}; + +declare type BabelNodeDirectiveLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DirectiveLiteral"; + value: string; +}; + +declare type BabelNodeBlockStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "BlockStatement"; + body: Array; + directives?: Array; +}; + +declare type BabelNodeBreakStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "BreakStatement"; + label?: BabelNodeIdentifier; +}; + +declare type BabelNodeCallExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "CallExpression"; + callee: BabelNodeExpression | BabelNodeV8IntrinsicIdentifier; + arguments: Array; + optional?: true | false; + typeArguments?: BabelNodeTypeParameterInstantiation; + typeParameters?: BabelNodeTSTypeParameterInstantiation; +}; + +declare type BabelNodeCatchClause = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "CatchClause"; + param?: BabelNodeIdentifier | BabelNodeArrayPattern | BabelNodeObjectPattern; + body: BabelNodeBlockStatement; +}; + +declare type BabelNodeConditionalExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ConditionalExpression"; + test: BabelNodeExpression; + consequent: BabelNodeExpression; + alternate: BabelNodeExpression; +}; + +declare type BabelNodeContinueStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ContinueStatement"; + label?: BabelNodeIdentifier; +}; + +declare type BabelNodeDebuggerStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DebuggerStatement"; +}; + +declare type BabelNodeDoWhileStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DoWhileStatement"; + test: BabelNodeExpression; + body: BabelNodeStatement; +}; + +declare type BabelNodeEmptyStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EmptyStatement"; +}; + +declare type BabelNodeExpressionStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ExpressionStatement"; + expression: BabelNodeExpression; +}; + +declare type BabelNodeFile = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "File"; + program: BabelNodeProgram; + comments?: Array; + tokens?: Array; +}; + +declare type BabelNodeForInStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ForInStatement"; + left: BabelNodeVariableDeclaration | BabelNodeLVal; + right: BabelNodeExpression; + body: BabelNodeStatement; +}; + +declare type BabelNodeForStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ForStatement"; + init?: BabelNodeVariableDeclaration | BabelNodeExpression; + test?: BabelNodeExpression; + update?: BabelNodeExpression; + body: BabelNodeStatement; +}; + +declare type BabelNodeFunctionDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "FunctionDeclaration"; + id?: BabelNodeIdentifier; + params: Array; + body: BabelNodeBlockStatement; + generator?: boolean; + async?: boolean; + declare?: boolean; + returnType?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; + typeParameters?: BabelNodeTypeParameterDeclaration | BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; +}; + +declare type BabelNodeFunctionExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "FunctionExpression"; + id?: BabelNodeIdentifier; + params: Array; + body: BabelNodeBlockStatement; + generator?: boolean; + async?: boolean; + returnType?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; + typeParameters?: BabelNodeTypeParameterDeclaration | BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; +}; + +declare type BabelNodeIdentifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Identifier"; + name: string; + decorators?: Array; + optional?: boolean; + typeAnnotation?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; +}; + +declare type BabelNodeIfStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "IfStatement"; + test: BabelNodeExpression; + consequent: BabelNodeStatement; + alternate?: BabelNodeStatement; +}; + +declare type BabelNodeLabeledStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "LabeledStatement"; + label: BabelNodeIdentifier; + body: BabelNodeStatement; +}; + +declare type BabelNodeStringLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "StringLiteral"; + value: string; +}; + +declare type BabelNodeNumericLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "NumericLiteral"; + value: number; +}; + +declare type BabelNodeNullLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "NullLiteral"; +}; + +declare type BabelNodeBooleanLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "BooleanLiteral"; + value: boolean; +}; + +declare type BabelNodeRegExpLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "RegExpLiteral"; + pattern: string; + flags?: string; +}; + +declare type BabelNodeLogicalExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "LogicalExpression"; + operator: "||" | "&&" | "??"; + left: BabelNodeExpression; + right: BabelNodeExpression; +}; + +declare type BabelNodeMemberExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "MemberExpression"; + object: BabelNodeExpression; + property: BabelNodeExpression | BabelNodeIdentifier | BabelNodePrivateName; + computed?: boolean; + optional?: true | false; +}; + +declare type BabelNodeNewExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "NewExpression"; + callee: BabelNodeExpression | BabelNodeV8IntrinsicIdentifier; + arguments: Array; + optional?: true | false; + typeArguments?: BabelNodeTypeParameterInstantiation; + typeParameters?: BabelNodeTSTypeParameterInstantiation; +}; + +declare type BabelNodeProgram = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Program"; + body: Array; + directives?: Array; + sourceType?: "script" | "module"; + interpreter?: BabelNodeInterpreterDirective; + sourceFile: string; +}; + +declare type BabelNodeObjectExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectExpression"; + properties: Array; +}; + +declare type BabelNodeObjectMethod = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectMethod"; + kind?: "method" | "get" | "set"; + key: BabelNodeExpression | BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral; + params: Array; + body: BabelNodeBlockStatement; + computed?: boolean; + generator?: boolean; + async?: boolean; + decorators?: Array; + returnType?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; + typeParameters?: BabelNodeTypeParameterDeclaration | BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; +}; + +declare type BabelNodeObjectProperty = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectProperty"; + key: BabelNodeExpression | BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral; + value: BabelNodeExpression | BabelNodePatternLike; + computed?: boolean; + shorthand?: boolean; + decorators?: Array; +}; + +declare type BabelNodeRestElement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "RestElement"; + argument: BabelNodeLVal; + decorators?: Array; + typeAnnotation?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; +}; + +declare type BabelNodeReturnStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ReturnStatement"; + argument?: BabelNodeExpression; +}; + +declare type BabelNodeSequenceExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "SequenceExpression"; + expressions: Array; +}; + +declare type BabelNodeParenthesizedExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ParenthesizedExpression"; + expression: BabelNodeExpression; +}; + +declare type BabelNodeSwitchCase = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "SwitchCase"; + test?: BabelNodeExpression; + consequent: Array; +}; + +declare type BabelNodeSwitchStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "SwitchStatement"; + discriminant: BabelNodeExpression; + cases: Array; +}; + +declare type BabelNodeThisExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ThisExpression"; +}; + +declare type BabelNodeThrowStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ThrowStatement"; + argument: BabelNodeExpression; +}; + +declare type BabelNodeTryStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TryStatement"; + block: BabelNodeBlockStatement; + handler?: BabelNodeCatchClause; + finalizer?: BabelNodeBlockStatement; +}; + +declare type BabelNodeUnaryExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "UnaryExpression"; + operator: "void" | "throw" | "delete" | "!" | "+" | "-" | "~" | "typeof"; + argument: BabelNodeExpression; + prefix?: boolean; +}; + +declare type BabelNodeUpdateExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "UpdateExpression"; + operator: "++" | "--"; + argument: BabelNodeExpression; + prefix?: boolean; +}; + +declare type BabelNodeVariableDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "VariableDeclaration"; + kind: "var" | "let" | "const"; + declarations: Array; + declare?: boolean; +}; + +declare type BabelNodeVariableDeclarator = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "VariableDeclarator"; + id: BabelNodeLVal; + init?: BabelNodeExpression; + definite?: boolean; +}; + +declare type BabelNodeWhileStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "WhileStatement"; + test: BabelNodeExpression; + body: BabelNodeStatement; +}; + +declare type BabelNodeWithStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "WithStatement"; + object: BabelNodeExpression; + body: BabelNodeStatement; +}; + +declare type BabelNodeAssignmentPattern = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "AssignmentPattern"; + left: BabelNodeIdentifier | BabelNodeObjectPattern | BabelNodeArrayPattern | BabelNodeMemberExpression; + right: BabelNodeExpression; + decorators?: Array; + typeAnnotation?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; +}; + +declare type BabelNodeArrayPattern = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ArrayPattern"; + elements: Array; + decorators?: Array; + typeAnnotation?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; +}; + +declare type BabelNodeArrowFunctionExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ArrowFunctionExpression"; + params: Array; + body: BabelNodeBlockStatement | BabelNodeExpression; + async?: boolean; + expression: boolean; + generator?: boolean; + returnType?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; + typeParameters?: BabelNodeTypeParameterDeclaration | BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; +}; + +declare type BabelNodeClassBody = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ClassBody"; + body: Array; +}; + +declare type BabelNodeClassExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ClassExpression"; + id?: BabelNodeIdentifier; + superClass?: BabelNodeExpression; + body: BabelNodeClassBody; + decorators?: Array; + implements?: Array; + mixins?: BabelNodeInterfaceExtends; + superTypeParameters?: BabelNodeTypeParameterInstantiation | BabelNodeTSTypeParameterInstantiation; + typeParameters?: BabelNodeTypeParameterDeclaration | BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; +}; + +declare type BabelNodeClassDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ClassDeclaration"; + id: BabelNodeIdentifier; + superClass?: BabelNodeExpression; + body: BabelNodeClassBody; + decorators?: Array; + abstract?: boolean; + declare?: boolean; + implements?: Array; + mixins?: BabelNodeInterfaceExtends; + superTypeParameters?: BabelNodeTypeParameterInstantiation | BabelNodeTSTypeParameterInstantiation; + typeParameters?: BabelNodeTypeParameterDeclaration | BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; +}; + +declare type BabelNodeExportAllDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ExportAllDeclaration"; + source: BabelNodeStringLiteral; + assertions?: Array; + exportKind?: "type" | "value"; +}; + +declare type BabelNodeExportDefaultDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ExportDefaultDeclaration"; + declaration: BabelNodeFunctionDeclaration | BabelNodeTSDeclareFunction | BabelNodeClassDeclaration | BabelNodeExpression; +}; + +declare type BabelNodeExportNamedDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ExportNamedDeclaration"; + declaration?: BabelNodeDeclaration; + specifiers?: Array; + source?: BabelNodeStringLiteral; + assertions?: Array; + exportKind?: "type" | "value"; +}; + +declare type BabelNodeExportSpecifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ExportSpecifier"; + local: BabelNodeIdentifier; + exported: BabelNodeIdentifier | BabelNodeStringLiteral; +}; + +declare type BabelNodeForOfStatement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ForOfStatement"; + left: BabelNodeVariableDeclaration | BabelNodeLVal; + right: BabelNodeExpression; + body: BabelNodeStatement; + await?: boolean; +}; + +declare type BabelNodeImportDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ImportDeclaration"; + specifiers: Array; + source: BabelNodeStringLiteral; + assertions?: Array; + importKind?: "type" | "typeof" | "value"; +}; + +declare type BabelNodeImportDefaultSpecifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ImportDefaultSpecifier"; + local: BabelNodeIdentifier; +}; + +declare type BabelNodeImportNamespaceSpecifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ImportNamespaceSpecifier"; + local: BabelNodeIdentifier; +}; + +declare type BabelNodeImportSpecifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ImportSpecifier"; + local: BabelNodeIdentifier; + imported: BabelNodeIdentifier | BabelNodeStringLiteral; + importKind?: "type" | "typeof"; +}; + +declare type BabelNodeMetaProperty = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "MetaProperty"; + meta: BabelNodeIdentifier; + property: BabelNodeIdentifier; +}; + +declare type BabelNodeClassMethod = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ClassMethod"; + kind?: "get" | "set" | "method" | "constructor"; + key: BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeExpression; + params: Array; + body: BabelNodeBlockStatement; + computed?: boolean; + static?: boolean; + generator?: boolean; + async?: boolean; + abstract?: boolean; + access?: "public" | "private" | "protected"; + accessibility?: "public" | "private" | "protected"; + decorators?: Array; + optional?: boolean; + override?: boolean; + returnType?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; + typeParameters?: BabelNodeTypeParameterDeclaration | BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; +}; + +declare type BabelNodeObjectPattern = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectPattern"; + properties: Array; + decorators?: Array; + typeAnnotation?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; +}; + +declare type BabelNodeSpreadElement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "SpreadElement"; + argument: BabelNodeExpression; +}; + +declare type BabelNodeSuper = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Super"; +}; + +declare type BabelNodeTaggedTemplateExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TaggedTemplateExpression"; + tag: BabelNodeExpression; + quasi: BabelNodeTemplateLiteral; + typeParameters?: BabelNodeTypeParameterInstantiation | BabelNodeTSTypeParameterInstantiation; +}; + +declare type BabelNodeTemplateElement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TemplateElement"; + value: { raw: string, cooked?: string }; + tail?: boolean; +}; + +declare type BabelNodeTemplateLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TemplateLiteral"; + quasis: Array; + expressions: Array; +}; + +declare type BabelNodeYieldExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "YieldExpression"; + argument?: BabelNodeExpression; + delegate?: boolean; +}; + +declare type BabelNodeAwaitExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "AwaitExpression"; + argument: BabelNodeExpression; +}; + +declare type BabelNodeImport = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Import"; +}; + +declare type BabelNodeBigIntLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "BigIntLiteral"; + value: string; +}; + +declare type BabelNodeExportNamespaceSpecifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ExportNamespaceSpecifier"; + exported: BabelNodeIdentifier; +}; + +declare type BabelNodeOptionalMemberExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "OptionalMemberExpression"; + object: BabelNodeExpression; + property: BabelNodeExpression | BabelNodeIdentifier; + computed?: boolean; + optional: boolean; +}; + +declare type BabelNodeOptionalCallExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "OptionalCallExpression"; + callee: BabelNodeExpression; + arguments: Array; + optional: boolean; + typeArguments?: BabelNodeTypeParameterInstantiation; + typeParameters?: BabelNodeTSTypeParameterInstantiation; +}; + +declare type BabelNodeAnyTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "AnyTypeAnnotation"; +}; + +declare type BabelNodeArrayTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ArrayTypeAnnotation"; + elementType: BabelNodeFlowType; +}; + +declare type BabelNodeBooleanTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "BooleanTypeAnnotation"; +}; + +declare type BabelNodeBooleanLiteralTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "BooleanLiteralTypeAnnotation"; + value: boolean; +}; + +declare type BabelNodeNullLiteralTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "NullLiteralTypeAnnotation"; +}; + +declare type BabelNodeClassImplements = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ClassImplements"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTypeParameterInstantiation; +}; + +declare type BabelNodeDeclareClass = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareClass"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTypeParameterDeclaration; + extends?: Array; + body: BabelNodeObjectTypeAnnotation; + implements?: Array; + mixins?: Array; +}; + +declare type BabelNodeDeclareFunction = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareFunction"; + id: BabelNodeIdentifier; + predicate?: BabelNodeDeclaredPredicate; +}; + +declare type BabelNodeDeclareInterface = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareInterface"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTypeParameterDeclaration; + extends?: Array; + body: BabelNodeObjectTypeAnnotation; + implements?: Array; + mixins?: Array; +}; + +declare type BabelNodeDeclareModule = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareModule"; + id: BabelNodeIdentifier | BabelNodeStringLiteral; + body: BabelNodeBlockStatement; + kind?: "CommonJS" | "ES"; +}; + +declare type BabelNodeDeclareModuleExports = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareModuleExports"; + typeAnnotation: BabelNodeTypeAnnotation; +}; + +declare type BabelNodeDeclareTypeAlias = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareTypeAlias"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTypeParameterDeclaration; + right: BabelNodeFlowType; +}; + +declare type BabelNodeDeclareOpaqueType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareOpaqueType"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTypeParameterDeclaration; + supertype?: BabelNodeFlowType; +}; + +declare type BabelNodeDeclareVariable = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareVariable"; + id: BabelNodeIdentifier; +}; + +declare type BabelNodeDeclareExportDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareExportDeclaration"; + declaration?: BabelNodeFlow; + specifiers?: Array; + source?: BabelNodeStringLiteral; + default?: boolean; +}; + +declare type BabelNodeDeclareExportAllDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclareExportAllDeclaration"; + source: BabelNodeStringLiteral; + exportKind?: "type" | "value"; +}; + +declare type BabelNodeDeclaredPredicate = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DeclaredPredicate"; + value: BabelNodeFlow; +}; + +declare type BabelNodeExistsTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ExistsTypeAnnotation"; +}; + +declare type BabelNodeFunctionTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "FunctionTypeAnnotation"; + typeParameters?: BabelNodeTypeParameterDeclaration; + params: Array; + rest?: BabelNodeFunctionTypeParam; + returnType: BabelNodeFlowType; + this?: BabelNodeFunctionTypeParam; +}; + +declare type BabelNodeFunctionTypeParam = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "FunctionTypeParam"; + name?: BabelNodeIdentifier; + typeAnnotation: BabelNodeFlowType; + optional?: boolean; +}; + +declare type BabelNodeGenericTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "GenericTypeAnnotation"; + id: BabelNodeIdentifier | BabelNodeQualifiedTypeIdentifier; + typeParameters?: BabelNodeTypeParameterInstantiation; +}; + +declare type BabelNodeInferredPredicate = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "InferredPredicate"; +}; + +declare type BabelNodeInterfaceExtends = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "InterfaceExtends"; + id: BabelNodeIdentifier | BabelNodeQualifiedTypeIdentifier; + typeParameters?: BabelNodeTypeParameterInstantiation; +}; + +declare type BabelNodeInterfaceDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "InterfaceDeclaration"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTypeParameterDeclaration; + extends?: Array; + body: BabelNodeObjectTypeAnnotation; + implements?: Array; + mixins?: Array; +}; + +declare type BabelNodeInterfaceTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "InterfaceTypeAnnotation"; + extends?: Array; + body: BabelNodeObjectTypeAnnotation; +}; + +declare type BabelNodeIntersectionTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "IntersectionTypeAnnotation"; + types: Array; +}; + +declare type BabelNodeMixedTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "MixedTypeAnnotation"; +}; + +declare type BabelNodeEmptyTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EmptyTypeAnnotation"; +}; + +declare type BabelNodeNullableTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "NullableTypeAnnotation"; + typeAnnotation: BabelNodeFlowType; +}; + +declare type BabelNodeNumberLiteralTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "NumberLiteralTypeAnnotation"; + value: number; +}; + +declare type BabelNodeNumberTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "NumberTypeAnnotation"; +}; + +declare type BabelNodeObjectTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectTypeAnnotation"; + properties: Array; + indexers?: Array; + callProperties?: Array; + internalSlots?: Array; + exact?: boolean; + inexact?: boolean; +}; + +declare type BabelNodeObjectTypeInternalSlot = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectTypeInternalSlot"; + id: BabelNodeIdentifier; + value: BabelNodeFlowType; + optional: boolean; + static: boolean; + method: boolean; +}; + +declare type BabelNodeObjectTypeCallProperty = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectTypeCallProperty"; + value: BabelNodeFlowType; + static: boolean; +}; + +declare type BabelNodeObjectTypeIndexer = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectTypeIndexer"; + id?: BabelNodeIdentifier; + key: BabelNodeFlowType; + value: BabelNodeFlowType; + variance?: BabelNodeVariance; + static: boolean; +}; + +declare type BabelNodeObjectTypeProperty = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectTypeProperty"; + key: BabelNodeIdentifier | BabelNodeStringLiteral; + value: BabelNodeFlowType; + variance?: BabelNodeVariance; + kind: "init" | "get" | "set"; + method: boolean; + optional: boolean; + proto: boolean; + static: boolean; +}; + +declare type BabelNodeObjectTypeSpreadProperty = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ObjectTypeSpreadProperty"; + argument: BabelNodeFlowType; +}; + +declare type BabelNodeOpaqueType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "OpaqueType"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTypeParameterDeclaration; + supertype?: BabelNodeFlowType; + impltype: BabelNodeFlowType; +}; + +declare type BabelNodeQualifiedTypeIdentifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "QualifiedTypeIdentifier"; + id: BabelNodeIdentifier; + qualification: BabelNodeIdentifier | BabelNodeQualifiedTypeIdentifier; +}; + +declare type BabelNodeStringLiteralTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "StringLiteralTypeAnnotation"; + value: string; +}; + +declare type BabelNodeStringTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "StringTypeAnnotation"; +}; + +declare type BabelNodeSymbolTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "SymbolTypeAnnotation"; +}; + +declare type BabelNodeThisTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ThisTypeAnnotation"; +}; + +declare type BabelNodeTupleTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TupleTypeAnnotation"; + types: Array; +}; + +declare type BabelNodeTypeofTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TypeofTypeAnnotation"; + argument: BabelNodeFlowType; +}; + +declare type BabelNodeTypeAlias = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TypeAlias"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTypeParameterDeclaration; + right: BabelNodeFlowType; +}; + +declare type BabelNodeTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TypeAnnotation"; + typeAnnotation: BabelNodeFlowType; +}; + +declare type BabelNodeTypeCastExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TypeCastExpression"; + expression: BabelNodeExpression; + typeAnnotation: BabelNodeTypeAnnotation; +}; + +declare type BabelNodeTypeParameter = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TypeParameter"; + bound?: BabelNodeTypeAnnotation; + default?: BabelNodeFlowType; + variance?: BabelNodeVariance; + name: string; +}; + +declare type BabelNodeTypeParameterDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TypeParameterDeclaration"; + params: Array; +}; + +declare type BabelNodeTypeParameterInstantiation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TypeParameterInstantiation"; + params: Array; +}; + +declare type BabelNodeUnionTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "UnionTypeAnnotation"; + types: Array; +}; + +declare type BabelNodeVariance = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Variance"; + kind: "minus" | "plus"; +}; + +declare type BabelNodeVoidTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "VoidTypeAnnotation"; +}; + +declare type BabelNodeEnumDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumDeclaration"; + id: BabelNodeIdentifier; + body: BabelNodeEnumBooleanBody | BabelNodeEnumNumberBody | BabelNodeEnumStringBody | BabelNodeEnumSymbolBody; +}; + +declare type BabelNodeEnumBooleanBody = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumBooleanBody"; + members: Array; + explicitType: boolean; + hasUnknownMembers: boolean; +}; + +declare type BabelNodeEnumNumberBody = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumNumberBody"; + members: Array; + explicitType: boolean; + hasUnknownMembers: boolean; +}; + +declare type BabelNodeEnumStringBody = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumStringBody"; + members: Array; + explicitType: boolean; + hasUnknownMembers: boolean; +}; + +declare type BabelNodeEnumSymbolBody = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumSymbolBody"; + members: Array; + hasUnknownMembers: boolean; +}; + +declare type BabelNodeEnumBooleanMember = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumBooleanMember"; + id: BabelNodeIdentifier; + init: BabelNodeBooleanLiteral; +}; + +declare type BabelNodeEnumNumberMember = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumNumberMember"; + id: BabelNodeIdentifier; + init: BabelNodeNumericLiteral; +}; + +declare type BabelNodeEnumStringMember = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumStringMember"; + id: BabelNodeIdentifier; + init: BabelNodeStringLiteral; +}; + +declare type BabelNodeEnumDefaultedMember = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "EnumDefaultedMember"; + id: BabelNodeIdentifier; +}; + +declare type BabelNodeIndexedAccessType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "IndexedAccessType"; + objectType: BabelNodeFlowType; + indexType: BabelNodeFlowType; +}; + +declare type BabelNodeOptionalIndexedAccessType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "OptionalIndexedAccessType"; + objectType: BabelNodeFlowType; + indexType: BabelNodeFlowType; + optional: boolean; +}; + +declare type BabelNodeJSXAttribute = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXAttribute"; + name: BabelNodeJSXIdentifier | BabelNodeJSXNamespacedName; + value?: BabelNodeJSXElement | BabelNodeJSXFragment | BabelNodeStringLiteral | BabelNodeJSXExpressionContainer; +}; + +declare type BabelNodeJSXClosingElement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXClosingElement"; + name: BabelNodeJSXIdentifier | BabelNodeJSXMemberExpression | BabelNodeJSXNamespacedName; +}; + +declare type BabelNodeJSXElement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXElement"; + openingElement: BabelNodeJSXOpeningElement; + closingElement?: BabelNodeJSXClosingElement; + children: Array; + selfClosing?: boolean; +}; + +declare type BabelNodeJSXEmptyExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXEmptyExpression"; +}; + +declare type BabelNodeJSXExpressionContainer = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXExpressionContainer"; + expression: BabelNodeExpression | BabelNodeJSXEmptyExpression; +}; + +declare type BabelNodeJSXSpreadChild = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXSpreadChild"; + expression: BabelNodeExpression; +}; + +declare type BabelNodeJSXIdentifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXIdentifier"; + name: string; +}; + +declare type BabelNodeJSXMemberExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXMemberExpression"; + object: BabelNodeJSXMemberExpression | BabelNodeJSXIdentifier; + property: BabelNodeJSXIdentifier; +}; + +declare type BabelNodeJSXNamespacedName = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXNamespacedName"; + namespace: BabelNodeJSXIdentifier; + name: BabelNodeJSXIdentifier; +}; + +declare type BabelNodeJSXOpeningElement = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXOpeningElement"; + name: BabelNodeJSXIdentifier | BabelNodeJSXMemberExpression | BabelNodeJSXNamespacedName; + attributes: Array; + selfClosing?: boolean; + typeParameters?: BabelNodeTypeParameterInstantiation | BabelNodeTSTypeParameterInstantiation; +}; + +declare type BabelNodeJSXSpreadAttribute = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXSpreadAttribute"; + argument: BabelNodeExpression; +}; + +declare type BabelNodeJSXText = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXText"; + value: string; +}; + +declare type BabelNodeJSXFragment = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXFragment"; + openingFragment: BabelNodeJSXOpeningFragment; + closingFragment: BabelNodeJSXClosingFragment; + children: Array; +}; + +declare type BabelNodeJSXOpeningFragment = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXOpeningFragment"; +}; + +declare type BabelNodeJSXClosingFragment = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "JSXClosingFragment"; +}; + +declare type BabelNodeNoop = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Noop"; +}; + +declare type BabelNodePlaceholder = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Placeholder"; + expectedNode: "Identifier" | "StringLiteral" | "Expression" | "Statement" | "Declaration" | "BlockStatement" | "ClassBody" | "Pattern"; + name: BabelNodeIdentifier; +}; + +declare type BabelNodeV8IntrinsicIdentifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "V8IntrinsicIdentifier"; + name: string; +}; + +declare type BabelNodeArgumentPlaceholder = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ArgumentPlaceholder"; +}; + +declare type BabelNodeBindExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "BindExpression"; + object: BabelNodeExpression; + callee: BabelNodeExpression; +}; + +declare type BabelNodeClassProperty = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ClassProperty"; + key: BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeExpression; + value?: BabelNodeExpression; + typeAnnotation?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; + decorators?: Array; + computed?: boolean; + static?: boolean; + abstract?: boolean; + accessibility?: "public" | "private" | "protected"; + declare?: boolean; + definite?: boolean; + optional?: boolean; + override?: boolean; + readonly?: boolean; +}; + +declare type BabelNodePipelineTopicExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "PipelineTopicExpression"; + expression: BabelNodeExpression; +}; + +declare type BabelNodePipelineBareFunction = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "PipelineBareFunction"; + callee: BabelNodeExpression; +}; + +declare type BabelNodePipelinePrimaryTopicReference = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "PipelinePrimaryTopicReference"; +}; + +declare type BabelNodeClassPrivateProperty = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ClassPrivateProperty"; + key: BabelNodePrivateName; + value?: BabelNodeExpression; + decorators?: Array; + static: any; + typeAnnotation?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; +}; + +declare type BabelNodeClassPrivateMethod = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ClassPrivateMethod"; + kind?: "get" | "set" | "method" | "constructor"; + key: BabelNodePrivateName; + params: Array; + body: BabelNodeBlockStatement; + static?: boolean; + abstract?: boolean; + access?: "public" | "private" | "protected"; + accessibility?: "public" | "private" | "protected"; + async?: boolean; + computed?: boolean; + decorators?: Array; + generator?: boolean; + optional?: boolean; + override?: boolean; + returnType?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop; + typeParameters?: BabelNodeTypeParameterDeclaration | BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; +}; + +declare type BabelNodeImportAttribute = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ImportAttribute"; + key: BabelNodeIdentifier | BabelNodeStringLiteral; + value: BabelNodeStringLiteral; +}; + +declare type BabelNodeDecorator = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "Decorator"; + expression: BabelNodeExpression; +}; + +declare type BabelNodeDoExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DoExpression"; + body: BabelNodeBlockStatement; + async?: boolean; +}; + +declare type BabelNodeExportDefaultSpecifier = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ExportDefaultSpecifier"; + exported: BabelNodeIdentifier; +}; + +declare type BabelNodePrivateName = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "PrivateName"; + id: BabelNodeIdentifier; +}; + +declare type BabelNodeRecordExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "RecordExpression"; + properties: Array; +}; + +declare type BabelNodeTupleExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TupleExpression"; + elements?: Array; +}; + +declare type BabelNodeDecimalLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "DecimalLiteral"; + value: string; +}; + +declare type BabelNodeStaticBlock = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "StaticBlock"; + body: Array; +}; + +declare type BabelNodeModuleExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "ModuleExpression"; + body: BabelNodeProgram; +}; + +declare type BabelNodeTSParameterProperty = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSParameterProperty"; + parameter: BabelNodeIdentifier | BabelNodeAssignmentPattern; + accessibility?: "public" | "private" | "protected"; + readonly?: boolean; +}; + +declare type BabelNodeTSDeclareFunction = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSDeclareFunction"; + id?: BabelNodeIdentifier; + typeParameters?: BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; + params: Array; + returnType?: BabelNodeTSTypeAnnotation | BabelNodeNoop; + async?: boolean; + declare?: boolean; + generator?: boolean; +}; + +declare type BabelNodeTSDeclareMethod = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSDeclareMethod"; + decorators?: Array; + key: BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeExpression; + typeParameters?: BabelNodeTSTypeParameterDeclaration | BabelNodeNoop; + params: Array; + returnType?: BabelNodeTSTypeAnnotation | BabelNodeNoop; + abstract?: boolean; + access?: "public" | "private" | "protected"; + accessibility?: "public" | "private" | "protected"; + async?: boolean; + computed?: boolean; + generator?: boolean; + kind?: "get" | "set" | "method" | "constructor"; + optional?: boolean; + override?: boolean; + static?: boolean; +}; + +declare type BabelNodeTSQualifiedName = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSQualifiedName"; + left: BabelNodeTSEntityName; + right: BabelNodeIdentifier; +}; + +declare type BabelNodeTSCallSignatureDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSCallSignatureDeclaration"; + typeParameters?: BabelNodeTSTypeParameterDeclaration; + parameters: Array; + typeAnnotation?: BabelNodeTSTypeAnnotation; +}; + +declare type BabelNodeTSConstructSignatureDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSConstructSignatureDeclaration"; + typeParameters?: BabelNodeTSTypeParameterDeclaration; + parameters: Array; + typeAnnotation?: BabelNodeTSTypeAnnotation; +}; + +declare type BabelNodeTSPropertySignature = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSPropertySignature"; + key: BabelNodeExpression; + typeAnnotation?: BabelNodeTSTypeAnnotation; + initializer?: BabelNodeExpression; + computed?: boolean; + optional?: boolean; + readonly?: boolean; +}; + +declare type BabelNodeTSMethodSignature = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSMethodSignature"; + key: BabelNodeExpression; + typeParameters?: BabelNodeTSTypeParameterDeclaration; + parameters: Array; + typeAnnotation?: BabelNodeTSTypeAnnotation; + computed?: boolean; + kind: "method" | "get" | "set"; + optional?: boolean; +}; + +declare type BabelNodeTSIndexSignature = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSIndexSignature"; + parameters: Array; + typeAnnotation?: BabelNodeTSTypeAnnotation; + readonly?: boolean; + static?: boolean; +}; + +declare type BabelNodeTSAnyKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSAnyKeyword"; +}; + +declare type BabelNodeTSBooleanKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSBooleanKeyword"; +}; + +declare type BabelNodeTSBigIntKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSBigIntKeyword"; +}; + +declare type BabelNodeTSIntrinsicKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSIntrinsicKeyword"; +}; + +declare type BabelNodeTSNeverKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSNeverKeyword"; +}; + +declare type BabelNodeTSNullKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSNullKeyword"; +}; + +declare type BabelNodeTSNumberKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSNumberKeyword"; +}; + +declare type BabelNodeTSObjectKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSObjectKeyword"; +}; + +declare type BabelNodeTSStringKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSStringKeyword"; +}; + +declare type BabelNodeTSSymbolKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSSymbolKeyword"; +}; + +declare type BabelNodeTSUndefinedKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSUndefinedKeyword"; +}; + +declare type BabelNodeTSUnknownKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSUnknownKeyword"; +}; + +declare type BabelNodeTSVoidKeyword = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSVoidKeyword"; +}; + +declare type BabelNodeTSThisType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSThisType"; +}; + +declare type BabelNodeTSFunctionType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSFunctionType"; + typeParameters?: BabelNodeTSTypeParameterDeclaration; + parameters: Array; + typeAnnotation?: BabelNodeTSTypeAnnotation; +}; + +declare type BabelNodeTSConstructorType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSConstructorType"; + typeParameters?: BabelNodeTSTypeParameterDeclaration; + parameters: Array; + typeAnnotation?: BabelNodeTSTypeAnnotation; + abstract?: boolean; +}; + +declare type BabelNodeTSTypeReference = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeReference"; + typeName: BabelNodeTSEntityName; + typeParameters?: BabelNodeTSTypeParameterInstantiation; +}; + +declare type BabelNodeTSTypePredicate = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypePredicate"; + parameterName: BabelNodeIdentifier | BabelNodeTSThisType; + typeAnnotation?: BabelNodeTSTypeAnnotation; + asserts?: boolean; +}; + +declare type BabelNodeTSTypeQuery = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeQuery"; + exprName: BabelNodeTSEntityName | BabelNodeTSImportType; +}; + +declare type BabelNodeTSTypeLiteral = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeLiteral"; + members: Array; +}; + +declare type BabelNodeTSArrayType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSArrayType"; + elementType: BabelNodeTSType; +}; + +declare type BabelNodeTSTupleType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTupleType"; + elementTypes: Array; +}; + +declare type BabelNodeTSOptionalType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSOptionalType"; + typeAnnotation: BabelNodeTSType; +}; + +declare type BabelNodeTSRestType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSRestType"; + typeAnnotation: BabelNodeTSType; +}; + +declare type BabelNodeTSNamedTupleMember = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSNamedTupleMember"; + label: BabelNodeIdentifier; + elementType: BabelNodeTSType; + optional?: boolean; +}; + +declare type BabelNodeTSUnionType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSUnionType"; + types: Array; +}; + +declare type BabelNodeTSIntersectionType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSIntersectionType"; + types: Array; +}; + +declare type BabelNodeTSConditionalType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSConditionalType"; + checkType: BabelNodeTSType; + extendsType: BabelNodeTSType; + trueType: BabelNodeTSType; + falseType: BabelNodeTSType; +}; + +declare type BabelNodeTSInferType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSInferType"; + typeParameter: BabelNodeTSTypeParameter; +}; + +declare type BabelNodeTSParenthesizedType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSParenthesizedType"; + typeAnnotation: BabelNodeTSType; +}; + +declare type BabelNodeTSTypeOperator = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeOperator"; + typeAnnotation: BabelNodeTSType; + operator: string; +}; + +declare type BabelNodeTSIndexedAccessType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSIndexedAccessType"; + objectType: BabelNodeTSType; + indexType: BabelNodeTSType; +}; + +declare type BabelNodeTSMappedType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSMappedType"; + typeParameter: BabelNodeTSTypeParameter; + typeAnnotation?: BabelNodeTSType; + nameType?: BabelNodeTSType; + optional?: boolean; + readonly?: boolean; +}; + +declare type BabelNodeTSLiteralType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSLiteralType"; + literal: BabelNodeNumericLiteral | BabelNodeStringLiteral | BabelNodeBooleanLiteral | BabelNodeBigIntLiteral; +}; + +declare type BabelNodeTSExpressionWithTypeArguments = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSExpressionWithTypeArguments"; + expression: BabelNodeTSEntityName; + typeParameters?: BabelNodeTSTypeParameterInstantiation; +}; + +declare type BabelNodeTSInterfaceDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSInterfaceDeclaration"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTSTypeParameterDeclaration; + extends?: Array; + body: BabelNodeTSInterfaceBody; + declare?: boolean; +}; + +declare type BabelNodeTSInterfaceBody = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSInterfaceBody"; + body: Array; +}; + +declare type BabelNodeTSTypeAliasDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeAliasDeclaration"; + id: BabelNodeIdentifier; + typeParameters?: BabelNodeTSTypeParameterDeclaration; + typeAnnotation: BabelNodeTSType; + declare?: boolean; +}; + +declare type BabelNodeTSAsExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSAsExpression"; + expression: BabelNodeExpression; + typeAnnotation: BabelNodeTSType; +}; + +declare type BabelNodeTSTypeAssertion = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeAssertion"; + typeAnnotation: BabelNodeTSType; + expression: BabelNodeExpression; +}; + +declare type BabelNodeTSEnumDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSEnumDeclaration"; + id: BabelNodeIdentifier; + members: Array; + const?: boolean; + declare?: boolean; + initializer?: BabelNodeExpression; +}; + +declare type BabelNodeTSEnumMember = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSEnumMember"; + id: BabelNodeIdentifier | BabelNodeStringLiteral; + initializer?: BabelNodeExpression; +}; + +declare type BabelNodeTSModuleDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSModuleDeclaration"; + id: BabelNodeIdentifier | BabelNodeStringLiteral; + body: BabelNodeTSModuleBlock | BabelNodeTSModuleDeclaration; + declare?: boolean; + global?: boolean; +}; + +declare type BabelNodeTSModuleBlock = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSModuleBlock"; + body: Array; +}; + +declare type BabelNodeTSImportType = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSImportType"; + argument: BabelNodeStringLiteral; + qualifier?: BabelNodeTSEntityName; + typeParameters?: BabelNodeTSTypeParameterInstantiation; +}; + +declare type BabelNodeTSImportEqualsDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSImportEqualsDeclaration"; + id: BabelNodeIdentifier; + moduleReference: BabelNodeTSEntityName | BabelNodeTSExternalModuleReference; + isExport: boolean; +}; + +declare type BabelNodeTSExternalModuleReference = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSExternalModuleReference"; + expression: BabelNodeStringLiteral; +}; + +declare type BabelNodeTSNonNullExpression = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSNonNullExpression"; + expression: BabelNodeExpression; +}; + +declare type BabelNodeTSExportAssignment = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSExportAssignment"; + expression: BabelNodeExpression; +}; + +declare type BabelNodeTSNamespaceExportDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSNamespaceExportDeclaration"; + id: BabelNodeIdentifier; +}; + +declare type BabelNodeTSTypeAnnotation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeAnnotation"; + typeAnnotation: BabelNodeTSType; +}; + +declare type BabelNodeTSTypeParameterInstantiation = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeParameterInstantiation"; + params: Array; +}; + +declare type BabelNodeTSTypeParameterDeclaration = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeParameterDeclaration"; + params: Array; +}; + +declare type BabelNodeTSTypeParameter = { + leadingComments?: Array; + innerComments?: Array; + trailingComments?: Array; + start: ?number; + end: ?number; + loc: ?BabelNodeSourceLocation, + type: "TSTypeParameter"; + constraint?: BabelNodeTSType; + default?: BabelNodeTSType; + name: string; +}; + +declare type BabelNode = BabelNodeArrayExpression | BabelNodeAssignmentExpression | BabelNodeBinaryExpression | BabelNodeInterpreterDirective | BabelNodeDirective | BabelNodeDirectiveLiteral | BabelNodeBlockStatement | BabelNodeBreakStatement | BabelNodeCallExpression | BabelNodeCatchClause | BabelNodeConditionalExpression | BabelNodeContinueStatement | BabelNodeDebuggerStatement | BabelNodeDoWhileStatement | BabelNodeEmptyStatement | BabelNodeExpressionStatement | BabelNodeFile | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeIdentifier | BabelNodeIfStatement | BabelNodeLabeledStatement | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeNullLiteral | BabelNodeBooleanLiteral | BabelNodeRegExpLiteral | BabelNodeLogicalExpression | BabelNodeMemberExpression | BabelNodeNewExpression | BabelNodeProgram | BabelNodeObjectExpression | BabelNodeObjectMethod | BabelNodeObjectProperty | BabelNodeRestElement | BabelNodeReturnStatement | BabelNodeSequenceExpression | BabelNodeParenthesizedExpression | BabelNodeSwitchCase | BabelNodeSwitchStatement | BabelNodeThisExpression | BabelNodeThrowStatement | BabelNodeTryStatement | BabelNodeUnaryExpression | BabelNodeUpdateExpression | BabelNodeVariableDeclaration | BabelNodeVariableDeclarator | BabelNodeWhileStatement | BabelNodeWithStatement | BabelNodeAssignmentPattern | BabelNodeArrayPattern | BabelNodeArrowFunctionExpression | BabelNodeClassBody | BabelNodeClassExpression | BabelNodeClassDeclaration | BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeExportSpecifier | BabelNodeForOfStatement | BabelNodeImportDeclaration | BabelNodeImportDefaultSpecifier | BabelNodeImportNamespaceSpecifier | BabelNodeImportSpecifier | BabelNodeMetaProperty | BabelNodeClassMethod | BabelNodeObjectPattern | BabelNodeSpreadElement | BabelNodeSuper | BabelNodeTaggedTemplateExpression | BabelNodeTemplateElement | BabelNodeTemplateLiteral | BabelNodeYieldExpression | BabelNodeAwaitExpression | BabelNodeImport | BabelNodeBigIntLiteral | BabelNodeExportNamespaceSpecifier | BabelNodeOptionalMemberExpression | BabelNodeOptionalCallExpression | BabelNodeAnyTypeAnnotation | BabelNodeArrayTypeAnnotation | BabelNodeBooleanTypeAnnotation | BabelNodeBooleanLiteralTypeAnnotation | BabelNodeNullLiteralTypeAnnotation | BabelNodeClassImplements | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeDeclaredPredicate | BabelNodeExistsTypeAnnotation | BabelNodeFunctionTypeAnnotation | BabelNodeFunctionTypeParam | BabelNodeGenericTypeAnnotation | BabelNodeInferredPredicate | BabelNodeInterfaceExtends | BabelNodeInterfaceDeclaration | BabelNodeInterfaceTypeAnnotation | BabelNodeIntersectionTypeAnnotation | BabelNodeMixedTypeAnnotation | BabelNodeEmptyTypeAnnotation | BabelNodeNullableTypeAnnotation | BabelNodeNumberLiteralTypeAnnotation | BabelNodeNumberTypeAnnotation | BabelNodeObjectTypeAnnotation | BabelNodeObjectTypeInternalSlot | BabelNodeObjectTypeCallProperty | BabelNodeObjectTypeIndexer | BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty | BabelNodeOpaqueType | BabelNodeQualifiedTypeIdentifier | BabelNodeStringLiteralTypeAnnotation | BabelNodeStringTypeAnnotation | BabelNodeSymbolTypeAnnotation | BabelNodeThisTypeAnnotation | BabelNodeTupleTypeAnnotation | BabelNodeTypeofTypeAnnotation | BabelNodeTypeAlias | BabelNodeTypeAnnotation | BabelNodeTypeCastExpression | BabelNodeTypeParameter | BabelNodeTypeParameterDeclaration | BabelNodeTypeParameterInstantiation | BabelNodeUnionTypeAnnotation | BabelNodeVariance | BabelNodeVoidTypeAnnotation | BabelNodeEnumDeclaration | BabelNodeEnumBooleanBody | BabelNodeEnumNumberBody | BabelNodeEnumStringBody | BabelNodeEnumSymbolBody | BabelNodeEnumBooleanMember | BabelNodeEnumNumberMember | BabelNodeEnumStringMember | BabelNodeEnumDefaultedMember | BabelNodeIndexedAccessType | BabelNodeOptionalIndexedAccessType | BabelNodeJSXAttribute | BabelNodeJSXClosingElement | BabelNodeJSXElement | BabelNodeJSXEmptyExpression | BabelNodeJSXExpressionContainer | BabelNodeJSXSpreadChild | BabelNodeJSXIdentifier | BabelNodeJSXMemberExpression | BabelNodeJSXNamespacedName | BabelNodeJSXOpeningElement | BabelNodeJSXSpreadAttribute | BabelNodeJSXText | BabelNodeJSXFragment | BabelNodeJSXOpeningFragment | BabelNodeJSXClosingFragment | BabelNodeNoop | BabelNodePlaceholder | BabelNodeV8IntrinsicIdentifier | BabelNodeArgumentPlaceholder | BabelNodeBindExpression | BabelNodeClassProperty | BabelNodePipelineTopicExpression | BabelNodePipelineBareFunction | BabelNodePipelinePrimaryTopicReference | BabelNodeClassPrivateProperty | BabelNodeClassPrivateMethod | BabelNodeImportAttribute | BabelNodeDecorator | BabelNodeDoExpression | BabelNodeExportDefaultSpecifier | BabelNodePrivateName | BabelNodeRecordExpression | BabelNodeTupleExpression | BabelNodeDecimalLiteral | BabelNodeStaticBlock | BabelNodeModuleExpression | BabelNodeTSParameterProperty | BabelNodeTSDeclareFunction | BabelNodeTSDeclareMethod | BabelNodeTSQualifiedName | BabelNodeTSCallSignatureDeclaration | BabelNodeTSConstructSignatureDeclaration | BabelNodeTSPropertySignature | BabelNodeTSMethodSignature | BabelNodeTSIndexSignature | BabelNodeTSAnyKeyword | BabelNodeTSBooleanKeyword | BabelNodeTSBigIntKeyword | BabelNodeTSIntrinsicKeyword | BabelNodeTSNeverKeyword | BabelNodeTSNullKeyword | BabelNodeTSNumberKeyword | BabelNodeTSObjectKeyword | BabelNodeTSStringKeyword | BabelNodeTSSymbolKeyword | BabelNodeTSUndefinedKeyword | BabelNodeTSUnknownKeyword | BabelNodeTSVoidKeyword | BabelNodeTSThisType | BabelNodeTSFunctionType | BabelNodeTSConstructorType | BabelNodeTSTypeReference | BabelNodeTSTypePredicate | BabelNodeTSTypeQuery | BabelNodeTSTypeLiteral | BabelNodeTSArrayType | BabelNodeTSTupleType | BabelNodeTSOptionalType | BabelNodeTSRestType | BabelNodeTSNamedTupleMember | BabelNodeTSUnionType | BabelNodeTSIntersectionType | BabelNodeTSConditionalType | BabelNodeTSInferType | BabelNodeTSParenthesizedType | BabelNodeTSTypeOperator | BabelNodeTSIndexedAccessType | BabelNodeTSMappedType | BabelNodeTSLiteralType | BabelNodeTSExpressionWithTypeArguments | BabelNodeTSInterfaceDeclaration | BabelNodeTSInterfaceBody | BabelNodeTSTypeAliasDeclaration | BabelNodeTSAsExpression | BabelNodeTSTypeAssertion | BabelNodeTSEnumDeclaration | BabelNodeTSEnumMember | BabelNodeTSModuleDeclaration | BabelNodeTSModuleBlock | BabelNodeTSImportType | BabelNodeTSImportEqualsDeclaration | BabelNodeTSExternalModuleReference | BabelNodeTSNonNullExpression | BabelNodeTSExportAssignment | BabelNodeTSNamespaceExportDeclaration | BabelNodeTSTypeAnnotation | BabelNodeTSTypeParameterInstantiation | BabelNodeTSTypeParameterDeclaration | BabelNodeTSTypeParameter; +declare type BabelNodeExpression = BabelNodeArrayExpression | BabelNodeAssignmentExpression | BabelNodeBinaryExpression | BabelNodeCallExpression | BabelNodeConditionalExpression | BabelNodeFunctionExpression | BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeNullLiteral | BabelNodeBooleanLiteral | BabelNodeRegExpLiteral | BabelNodeLogicalExpression | BabelNodeMemberExpression | BabelNodeNewExpression | BabelNodeObjectExpression | BabelNodeSequenceExpression | BabelNodeParenthesizedExpression | BabelNodeThisExpression | BabelNodeUnaryExpression | BabelNodeUpdateExpression | BabelNodeArrowFunctionExpression | BabelNodeClassExpression | BabelNodeMetaProperty | BabelNodeSuper | BabelNodeTaggedTemplateExpression | BabelNodeTemplateLiteral | BabelNodeYieldExpression | BabelNodeAwaitExpression | BabelNodeImport | BabelNodeBigIntLiteral | BabelNodeOptionalMemberExpression | BabelNodeOptionalCallExpression | BabelNodeTypeCastExpression | BabelNodeJSXElement | BabelNodeJSXFragment | BabelNodeBindExpression | BabelNodePipelinePrimaryTopicReference | BabelNodeDoExpression | BabelNodeRecordExpression | BabelNodeTupleExpression | BabelNodeDecimalLiteral | BabelNodeModuleExpression | BabelNodeTSAsExpression | BabelNodeTSTypeAssertion | BabelNodeTSNonNullExpression; +declare type BabelNodeBinary = BabelNodeBinaryExpression | BabelNodeLogicalExpression; +declare type BabelNodeScopable = BabelNodeBlockStatement | BabelNodeCatchClause | BabelNodeDoWhileStatement | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeProgram | BabelNodeObjectMethod | BabelNodeSwitchStatement | BabelNodeWhileStatement | BabelNodeArrowFunctionExpression | BabelNodeClassExpression | BabelNodeClassDeclaration | BabelNodeForOfStatement | BabelNodeClassMethod | BabelNodeClassPrivateMethod | BabelNodeStaticBlock | BabelNodeTSModuleBlock; +declare type BabelNodeBlockParent = BabelNodeBlockStatement | BabelNodeCatchClause | BabelNodeDoWhileStatement | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeProgram | BabelNodeObjectMethod | BabelNodeSwitchStatement | BabelNodeWhileStatement | BabelNodeArrowFunctionExpression | BabelNodeForOfStatement | BabelNodeClassMethod | BabelNodeClassPrivateMethod | BabelNodeStaticBlock | BabelNodeTSModuleBlock; +declare type BabelNodeBlock = BabelNodeBlockStatement | BabelNodeProgram | BabelNodeTSModuleBlock; +declare type BabelNodeStatement = BabelNodeBlockStatement | BabelNodeBreakStatement | BabelNodeContinueStatement | BabelNodeDebuggerStatement | BabelNodeDoWhileStatement | BabelNodeEmptyStatement | BabelNodeExpressionStatement | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeFunctionDeclaration | BabelNodeIfStatement | BabelNodeLabeledStatement | BabelNodeReturnStatement | BabelNodeSwitchStatement | BabelNodeThrowStatement | BabelNodeTryStatement | BabelNodeVariableDeclaration | BabelNodeWhileStatement | BabelNodeWithStatement | BabelNodeClassDeclaration | BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeForOfStatement | BabelNodeImportDeclaration | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeOpaqueType | BabelNodeTypeAlias | BabelNodeEnumDeclaration | BabelNodeTSDeclareFunction | BabelNodeTSInterfaceDeclaration | BabelNodeTSTypeAliasDeclaration | BabelNodeTSEnumDeclaration | BabelNodeTSModuleDeclaration | BabelNodeTSImportEqualsDeclaration | BabelNodeTSExportAssignment | BabelNodeTSNamespaceExportDeclaration; +declare type BabelNodeTerminatorless = BabelNodeBreakStatement | BabelNodeContinueStatement | BabelNodeReturnStatement | BabelNodeThrowStatement | BabelNodeYieldExpression | BabelNodeAwaitExpression; +declare type BabelNodeCompletionStatement = BabelNodeBreakStatement | BabelNodeContinueStatement | BabelNodeReturnStatement | BabelNodeThrowStatement; +declare type BabelNodeConditional = BabelNodeConditionalExpression | BabelNodeIfStatement; +declare type BabelNodeLoop = BabelNodeDoWhileStatement | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeWhileStatement | BabelNodeForOfStatement; +declare type BabelNodeWhile = BabelNodeDoWhileStatement | BabelNodeWhileStatement; +declare type BabelNodeExpressionWrapper = BabelNodeExpressionStatement | BabelNodeParenthesizedExpression | BabelNodeTypeCastExpression; +declare type BabelNodeFor = BabelNodeForInStatement | BabelNodeForStatement | BabelNodeForOfStatement; +declare type BabelNodeForXStatement = BabelNodeForInStatement | BabelNodeForOfStatement; +declare type BabelNodeFunction = BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeObjectMethod | BabelNodeArrowFunctionExpression | BabelNodeClassMethod | BabelNodeClassPrivateMethod; +declare type BabelNodeFunctionParent = BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeObjectMethod | BabelNodeArrowFunctionExpression | BabelNodeClassMethod | BabelNodeClassPrivateMethod; +declare type BabelNodePureish = BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeNullLiteral | BabelNodeBooleanLiteral | BabelNodeRegExpLiteral | BabelNodeArrowFunctionExpression | BabelNodeBigIntLiteral | BabelNodeDecimalLiteral; +declare type BabelNodeDeclaration = BabelNodeFunctionDeclaration | BabelNodeVariableDeclaration | BabelNodeClassDeclaration | BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeImportDeclaration | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeOpaqueType | BabelNodeTypeAlias | BabelNodeEnumDeclaration | BabelNodeTSDeclareFunction | BabelNodeTSInterfaceDeclaration | BabelNodeTSTypeAliasDeclaration | BabelNodeTSEnumDeclaration | BabelNodeTSModuleDeclaration; +declare type BabelNodePatternLike = BabelNodeIdentifier | BabelNodeRestElement | BabelNodeAssignmentPattern | BabelNodeArrayPattern | BabelNodeObjectPattern; +declare type BabelNodeLVal = BabelNodeIdentifier | BabelNodeMemberExpression | BabelNodeRestElement | BabelNodeAssignmentPattern | BabelNodeArrayPattern | BabelNodeObjectPattern | BabelNodeTSParameterProperty; +declare type BabelNodeTSEntityName = BabelNodeIdentifier | BabelNodeTSQualifiedName; +declare type BabelNodeLiteral = BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeNullLiteral | BabelNodeBooleanLiteral | BabelNodeRegExpLiteral | BabelNodeTemplateLiteral | BabelNodeBigIntLiteral | BabelNodeDecimalLiteral; +declare type BabelNodeImmutable = BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeNullLiteral | BabelNodeBooleanLiteral | BabelNodeBigIntLiteral | BabelNodeJSXAttribute | BabelNodeJSXClosingElement | BabelNodeJSXElement | BabelNodeJSXExpressionContainer | BabelNodeJSXSpreadChild | BabelNodeJSXOpeningElement | BabelNodeJSXText | BabelNodeJSXFragment | BabelNodeJSXOpeningFragment | BabelNodeJSXClosingFragment | BabelNodeDecimalLiteral; +declare type BabelNodeUserWhitespacable = BabelNodeObjectMethod | BabelNodeObjectProperty | BabelNodeObjectTypeInternalSlot | BabelNodeObjectTypeCallProperty | BabelNodeObjectTypeIndexer | BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty; +declare type BabelNodeMethod = BabelNodeObjectMethod | BabelNodeClassMethod | BabelNodeClassPrivateMethod; +declare type BabelNodeObjectMember = BabelNodeObjectMethod | BabelNodeObjectProperty; +declare type BabelNodeProperty = BabelNodeObjectProperty | BabelNodeClassProperty | BabelNodeClassPrivateProperty; +declare type BabelNodeUnaryLike = BabelNodeUnaryExpression | BabelNodeSpreadElement; +declare type BabelNodePattern = BabelNodeAssignmentPattern | BabelNodeArrayPattern | BabelNodeObjectPattern; +declare type BabelNodeClass = BabelNodeClassExpression | BabelNodeClassDeclaration; +declare type BabelNodeModuleDeclaration = BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeImportDeclaration; +declare type BabelNodeExportDeclaration = BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration; +declare type BabelNodeModuleSpecifier = BabelNodeExportSpecifier | BabelNodeImportDefaultSpecifier | BabelNodeImportNamespaceSpecifier | BabelNodeImportSpecifier | BabelNodeExportNamespaceSpecifier | BabelNodeExportDefaultSpecifier; +declare type BabelNodeFlow = BabelNodeAnyTypeAnnotation | BabelNodeArrayTypeAnnotation | BabelNodeBooleanTypeAnnotation | BabelNodeBooleanLiteralTypeAnnotation | BabelNodeNullLiteralTypeAnnotation | BabelNodeClassImplements | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeDeclaredPredicate | BabelNodeExistsTypeAnnotation | BabelNodeFunctionTypeAnnotation | BabelNodeFunctionTypeParam | BabelNodeGenericTypeAnnotation | BabelNodeInferredPredicate | BabelNodeInterfaceExtends | BabelNodeInterfaceDeclaration | BabelNodeInterfaceTypeAnnotation | BabelNodeIntersectionTypeAnnotation | BabelNodeMixedTypeAnnotation | BabelNodeEmptyTypeAnnotation | BabelNodeNullableTypeAnnotation | BabelNodeNumberLiteralTypeAnnotation | BabelNodeNumberTypeAnnotation | BabelNodeObjectTypeAnnotation | BabelNodeObjectTypeInternalSlot | BabelNodeObjectTypeCallProperty | BabelNodeObjectTypeIndexer | BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty | BabelNodeOpaqueType | BabelNodeQualifiedTypeIdentifier | BabelNodeStringLiteralTypeAnnotation | BabelNodeStringTypeAnnotation | BabelNodeSymbolTypeAnnotation | BabelNodeThisTypeAnnotation | BabelNodeTupleTypeAnnotation | BabelNodeTypeofTypeAnnotation | BabelNodeTypeAlias | BabelNodeTypeAnnotation | BabelNodeTypeCastExpression | BabelNodeTypeParameter | BabelNodeTypeParameterDeclaration | BabelNodeTypeParameterInstantiation | BabelNodeUnionTypeAnnotation | BabelNodeVariance | BabelNodeVoidTypeAnnotation | BabelNodeIndexedAccessType | BabelNodeOptionalIndexedAccessType; +declare type BabelNodeFlowType = BabelNodeAnyTypeAnnotation | BabelNodeArrayTypeAnnotation | BabelNodeBooleanTypeAnnotation | BabelNodeBooleanLiteralTypeAnnotation | BabelNodeNullLiteralTypeAnnotation | BabelNodeExistsTypeAnnotation | BabelNodeFunctionTypeAnnotation | BabelNodeGenericTypeAnnotation | BabelNodeInterfaceTypeAnnotation | BabelNodeIntersectionTypeAnnotation | BabelNodeMixedTypeAnnotation | BabelNodeEmptyTypeAnnotation | BabelNodeNullableTypeAnnotation | BabelNodeNumberLiteralTypeAnnotation | BabelNodeNumberTypeAnnotation | BabelNodeObjectTypeAnnotation | BabelNodeStringLiteralTypeAnnotation | BabelNodeStringTypeAnnotation | BabelNodeSymbolTypeAnnotation | BabelNodeThisTypeAnnotation | BabelNodeTupleTypeAnnotation | BabelNodeTypeofTypeAnnotation | BabelNodeUnionTypeAnnotation | BabelNodeVoidTypeAnnotation | BabelNodeIndexedAccessType | BabelNodeOptionalIndexedAccessType; +declare type BabelNodeFlowBaseAnnotation = BabelNodeAnyTypeAnnotation | BabelNodeBooleanTypeAnnotation | BabelNodeNullLiteralTypeAnnotation | BabelNodeMixedTypeAnnotation | BabelNodeEmptyTypeAnnotation | BabelNodeNumberTypeAnnotation | BabelNodeStringTypeAnnotation | BabelNodeSymbolTypeAnnotation | BabelNodeThisTypeAnnotation | BabelNodeVoidTypeAnnotation; +declare type BabelNodeFlowDeclaration = BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeOpaqueType | BabelNodeTypeAlias; +declare type BabelNodeFlowPredicate = BabelNodeDeclaredPredicate | BabelNodeInferredPredicate; +declare type BabelNodeEnumBody = BabelNodeEnumBooleanBody | BabelNodeEnumNumberBody | BabelNodeEnumStringBody | BabelNodeEnumSymbolBody; +declare type BabelNodeEnumMember = BabelNodeEnumBooleanMember | BabelNodeEnumNumberMember | BabelNodeEnumStringMember | BabelNodeEnumDefaultedMember; +declare type BabelNodeJSX = BabelNodeJSXAttribute | BabelNodeJSXClosingElement | BabelNodeJSXElement | BabelNodeJSXEmptyExpression | BabelNodeJSXExpressionContainer | BabelNodeJSXSpreadChild | BabelNodeJSXIdentifier | BabelNodeJSXMemberExpression | BabelNodeJSXNamespacedName | BabelNodeJSXOpeningElement | BabelNodeJSXSpreadAttribute | BabelNodeJSXText | BabelNodeJSXFragment | BabelNodeJSXOpeningFragment | BabelNodeJSXClosingFragment; +declare type BabelNodePrivate = BabelNodeClassPrivateProperty | BabelNodeClassPrivateMethod | BabelNodePrivateName; +declare type BabelNodeTSTypeElement = BabelNodeTSCallSignatureDeclaration | BabelNodeTSConstructSignatureDeclaration | BabelNodeTSPropertySignature | BabelNodeTSMethodSignature | BabelNodeTSIndexSignature; +declare type BabelNodeTSType = BabelNodeTSAnyKeyword | BabelNodeTSBooleanKeyword | BabelNodeTSBigIntKeyword | BabelNodeTSIntrinsicKeyword | BabelNodeTSNeverKeyword | BabelNodeTSNullKeyword | BabelNodeTSNumberKeyword | BabelNodeTSObjectKeyword | BabelNodeTSStringKeyword | BabelNodeTSSymbolKeyword | BabelNodeTSUndefinedKeyword | BabelNodeTSUnknownKeyword | BabelNodeTSVoidKeyword | BabelNodeTSThisType | BabelNodeTSFunctionType | BabelNodeTSConstructorType | BabelNodeTSTypeReference | BabelNodeTSTypePredicate | BabelNodeTSTypeQuery | BabelNodeTSTypeLiteral | BabelNodeTSArrayType | BabelNodeTSTupleType | BabelNodeTSOptionalType | BabelNodeTSRestType | BabelNodeTSUnionType | BabelNodeTSIntersectionType | BabelNodeTSConditionalType | BabelNodeTSInferType | BabelNodeTSParenthesizedType | BabelNodeTSTypeOperator | BabelNodeTSIndexedAccessType | BabelNodeTSMappedType | BabelNodeTSLiteralType | BabelNodeTSExpressionWithTypeArguments | BabelNodeTSImportType; +declare type BabelNodeTSBaseType = BabelNodeTSAnyKeyword | BabelNodeTSBooleanKeyword | BabelNodeTSBigIntKeyword | BabelNodeTSIntrinsicKeyword | BabelNodeTSNeverKeyword | BabelNodeTSNullKeyword | BabelNodeTSNumberKeyword | BabelNodeTSObjectKeyword | BabelNodeTSStringKeyword | BabelNodeTSSymbolKeyword | BabelNodeTSUndefinedKeyword | BabelNodeTSUnknownKeyword | BabelNodeTSVoidKeyword | BabelNodeTSThisType | BabelNodeTSLiteralType; + +declare module "@babel/types" { + declare export function arrayExpression(elements?: Array): BabelNodeArrayExpression; + declare export function assignmentExpression(operator: string, left: BabelNodeLVal, right: BabelNodeExpression): BabelNodeAssignmentExpression; + declare export function binaryExpression(operator: "+" | "-" | "/" | "%" | "*" | "**" | "&" | "|" | ">>" | ">>>" | "<<" | "^" | "==" | "===" | "!=" | "!==" | "in" | "instanceof" | ">" | "<" | ">=" | "<=", left: BabelNodeExpression | BabelNodePrivateName, right: BabelNodeExpression): BabelNodeBinaryExpression; + declare export function interpreterDirective(value: string): BabelNodeInterpreterDirective; + declare export function directive(value: BabelNodeDirectiveLiteral): BabelNodeDirective; + declare export function directiveLiteral(value: string): BabelNodeDirectiveLiteral; + declare export function blockStatement(body: Array, directives?: Array): BabelNodeBlockStatement; + declare export function breakStatement(label?: BabelNodeIdentifier): BabelNodeBreakStatement; + declare export function callExpression(callee: BabelNodeExpression | BabelNodeV8IntrinsicIdentifier, _arguments: Array): BabelNodeCallExpression; + declare export function catchClause(param?: BabelNodeIdentifier | BabelNodeArrayPattern | BabelNodeObjectPattern, body: BabelNodeBlockStatement): BabelNodeCatchClause; + declare export function conditionalExpression(test: BabelNodeExpression, consequent: BabelNodeExpression, alternate: BabelNodeExpression): BabelNodeConditionalExpression; + declare export function continueStatement(label?: BabelNodeIdentifier): BabelNodeContinueStatement; + declare export function debuggerStatement(): BabelNodeDebuggerStatement; + declare export function doWhileStatement(test: BabelNodeExpression, body: BabelNodeStatement): BabelNodeDoWhileStatement; + declare export function emptyStatement(): BabelNodeEmptyStatement; + declare export function expressionStatement(expression: BabelNodeExpression): BabelNodeExpressionStatement; + declare export function file(program: BabelNodeProgram, comments?: Array, tokens?: Array): BabelNodeFile; + declare export function forInStatement(left: BabelNodeVariableDeclaration | BabelNodeLVal, right: BabelNodeExpression, body: BabelNodeStatement): BabelNodeForInStatement; + declare export function forStatement(init?: BabelNodeVariableDeclaration | BabelNodeExpression, test?: BabelNodeExpression, update?: BabelNodeExpression, body: BabelNodeStatement): BabelNodeForStatement; + declare export function functionDeclaration(id?: BabelNodeIdentifier, params: Array, body: BabelNodeBlockStatement, generator?: boolean, async?: boolean): BabelNodeFunctionDeclaration; + declare export function functionExpression(id?: BabelNodeIdentifier, params: Array, body: BabelNodeBlockStatement, generator?: boolean, async?: boolean): BabelNodeFunctionExpression; + declare export function identifier(name: string): BabelNodeIdentifier; + declare export function ifStatement(test: BabelNodeExpression, consequent: BabelNodeStatement, alternate?: BabelNodeStatement): BabelNodeIfStatement; + declare export function labeledStatement(label: BabelNodeIdentifier, body: BabelNodeStatement): BabelNodeLabeledStatement; + declare export function stringLiteral(value: string): BabelNodeStringLiteral; + declare export function numericLiteral(value: number): BabelNodeNumericLiteral; + declare export function nullLiteral(): BabelNodeNullLiteral; + declare export function booleanLiteral(value: boolean): BabelNodeBooleanLiteral; + declare export function regExpLiteral(pattern: string, flags?: string): BabelNodeRegExpLiteral; + declare export function logicalExpression(operator: "||" | "&&" | "??", left: BabelNodeExpression, right: BabelNodeExpression): BabelNodeLogicalExpression; + declare export function memberExpression(object: BabelNodeExpression, property: BabelNodeExpression | BabelNodeIdentifier | BabelNodePrivateName, computed?: boolean, optional?: true | false): BabelNodeMemberExpression; + declare export function newExpression(callee: BabelNodeExpression | BabelNodeV8IntrinsicIdentifier, _arguments: Array): BabelNodeNewExpression; + declare export function program(body: Array, directives?: Array, sourceType?: "script" | "module", interpreter?: BabelNodeInterpreterDirective): BabelNodeProgram; + declare export function objectExpression(properties: Array): BabelNodeObjectExpression; + declare export function objectMethod(kind?: "method" | "get" | "set", key: BabelNodeExpression | BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral, params: Array, body: BabelNodeBlockStatement, computed?: boolean, generator?: boolean, async?: boolean): BabelNodeObjectMethod; + declare export function objectProperty(key: BabelNodeExpression | BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral, value: BabelNodeExpression | BabelNodePatternLike, computed?: boolean, shorthand?: boolean, decorators?: Array): BabelNodeObjectProperty; + declare export function restElement(argument: BabelNodeLVal): BabelNodeRestElement; + declare export function returnStatement(argument?: BabelNodeExpression): BabelNodeReturnStatement; + declare export function sequenceExpression(expressions: Array): BabelNodeSequenceExpression; + declare export function parenthesizedExpression(expression: BabelNodeExpression): BabelNodeParenthesizedExpression; + declare export function switchCase(test?: BabelNodeExpression, consequent: Array): BabelNodeSwitchCase; + declare export function switchStatement(discriminant: BabelNodeExpression, cases: Array): BabelNodeSwitchStatement; + declare export function thisExpression(): BabelNodeThisExpression; + declare export function throwStatement(argument: BabelNodeExpression): BabelNodeThrowStatement; + declare export function tryStatement(block: BabelNodeBlockStatement, handler?: BabelNodeCatchClause, finalizer?: BabelNodeBlockStatement): BabelNodeTryStatement; + declare export function unaryExpression(operator: "void" | "throw" | "delete" | "!" | "+" | "-" | "~" | "typeof", argument: BabelNodeExpression, prefix?: boolean): BabelNodeUnaryExpression; + declare export function updateExpression(operator: "++" | "--", argument: BabelNodeExpression, prefix?: boolean): BabelNodeUpdateExpression; + declare export function variableDeclaration(kind: "var" | "let" | "const", declarations: Array): BabelNodeVariableDeclaration; + declare export function variableDeclarator(id: BabelNodeLVal, init?: BabelNodeExpression): BabelNodeVariableDeclarator; + declare export function whileStatement(test: BabelNodeExpression, body: BabelNodeStatement): BabelNodeWhileStatement; + declare export function withStatement(object: BabelNodeExpression, body: BabelNodeStatement): BabelNodeWithStatement; + declare export function assignmentPattern(left: BabelNodeIdentifier | BabelNodeObjectPattern | BabelNodeArrayPattern | BabelNodeMemberExpression, right: BabelNodeExpression): BabelNodeAssignmentPattern; + declare export function arrayPattern(elements: Array): BabelNodeArrayPattern; + declare export function arrowFunctionExpression(params: Array, body: BabelNodeBlockStatement | BabelNodeExpression, async?: boolean): BabelNodeArrowFunctionExpression; + declare export function classBody(body: Array): BabelNodeClassBody; + declare export function classExpression(id?: BabelNodeIdentifier, superClass?: BabelNodeExpression, body: BabelNodeClassBody, decorators?: Array): BabelNodeClassExpression; + declare export function classDeclaration(id: BabelNodeIdentifier, superClass?: BabelNodeExpression, body: BabelNodeClassBody, decorators?: Array): BabelNodeClassDeclaration; + declare export function exportAllDeclaration(source: BabelNodeStringLiteral): BabelNodeExportAllDeclaration; + declare export function exportDefaultDeclaration(declaration: BabelNodeFunctionDeclaration | BabelNodeTSDeclareFunction | BabelNodeClassDeclaration | BabelNodeExpression): BabelNodeExportDefaultDeclaration; + declare export function exportNamedDeclaration(declaration?: BabelNodeDeclaration, specifiers?: Array, source?: BabelNodeStringLiteral): BabelNodeExportNamedDeclaration; + declare export function exportSpecifier(local: BabelNodeIdentifier, exported: BabelNodeIdentifier | BabelNodeStringLiteral): BabelNodeExportSpecifier; + declare export function forOfStatement(left: BabelNodeVariableDeclaration | BabelNodeLVal, right: BabelNodeExpression, body: BabelNodeStatement, _await?: boolean): BabelNodeForOfStatement; + declare export function importDeclaration(specifiers: Array, source: BabelNodeStringLiteral): BabelNodeImportDeclaration; + declare export function importDefaultSpecifier(local: BabelNodeIdentifier): BabelNodeImportDefaultSpecifier; + declare export function importNamespaceSpecifier(local: BabelNodeIdentifier): BabelNodeImportNamespaceSpecifier; + declare export function importSpecifier(local: BabelNodeIdentifier, imported: BabelNodeIdentifier | BabelNodeStringLiteral): BabelNodeImportSpecifier; + declare export function metaProperty(meta: BabelNodeIdentifier, property: BabelNodeIdentifier): BabelNodeMetaProperty; + declare export function classMethod(kind?: "get" | "set" | "method" | "constructor", key: BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeExpression, params: Array, body: BabelNodeBlockStatement, computed?: boolean, _static?: boolean, generator?: boolean, async?: boolean): BabelNodeClassMethod; + declare export function objectPattern(properties: Array): BabelNodeObjectPattern; + declare export function spreadElement(argument: BabelNodeExpression): BabelNodeSpreadElement; + declare var _super: () => BabelNodeSuper; + declare export { _super as super } + declare export function taggedTemplateExpression(tag: BabelNodeExpression, quasi: BabelNodeTemplateLiteral): BabelNodeTaggedTemplateExpression; + declare export function templateElement(value: { raw: string, cooked?: string }, tail?: boolean): BabelNodeTemplateElement; + declare export function templateLiteral(quasis: Array, expressions: Array): BabelNodeTemplateLiteral; + declare export function yieldExpression(argument?: BabelNodeExpression, delegate?: boolean): BabelNodeYieldExpression; + declare export function awaitExpression(argument: BabelNodeExpression): BabelNodeAwaitExpression; + declare var _import: () => BabelNodeImport; + declare export { _import as import } + declare export function bigIntLiteral(value: string): BabelNodeBigIntLiteral; + declare export function exportNamespaceSpecifier(exported: BabelNodeIdentifier): BabelNodeExportNamespaceSpecifier; + declare export function optionalMemberExpression(object: BabelNodeExpression, property: BabelNodeExpression | BabelNodeIdentifier, computed?: boolean, optional: boolean): BabelNodeOptionalMemberExpression; + declare export function optionalCallExpression(callee: BabelNodeExpression, _arguments: Array, optional: boolean): BabelNodeOptionalCallExpression; + declare export function anyTypeAnnotation(): BabelNodeAnyTypeAnnotation; + declare export function arrayTypeAnnotation(elementType: BabelNodeFlowType): BabelNodeArrayTypeAnnotation; + declare export function booleanTypeAnnotation(): BabelNodeBooleanTypeAnnotation; + declare export function booleanLiteralTypeAnnotation(value: boolean): BabelNodeBooleanLiteralTypeAnnotation; + declare export function nullLiteralTypeAnnotation(): BabelNodeNullLiteralTypeAnnotation; + declare export function classImplements(id: BabelNodeIdentifier, typeParameters?: BabelNodeTypeParameterInstantiation): BabelNodeClassImplements; + declare export function declareClass(id: BabelNodeIdentifier, typeParameters?: BabelNodeTypeParameterDeclaration, _extends?: Array, body: BabelNodeObjectTypeAnnotation): BabelNodeDeclareClass; + declare export function declareFunction(id: BabelNodeIdentifier): BabelNodeDeclareFunction; + declare export function declareInterface(id: BabelNodeIdentifier, typeParameters?: BabelNodeTypeParameterDeclaration, _extends?: Array, body: BabelNodeObjectTypeAnnotation): BabelNodeDeclareInterface; + declare export function declareModule(id: BabelNodeIdentifier | BabelNodeStringLiteral, body: BabelNodeBlockStatement, kind?: "CommonJS" | "ES"): BabelNodeDeclareModule; + declare export function declareModuleExports(typeAnnotation: BabelNodeTypeAnnotation): BabelNodeDeclareModuleExports; + declare export function declareTypeAlias(id: BabelNodeIdentifier, typeParameters?: BabelNodeTypeParameterDeclaration, right: BabelNodeFlowType): BabelNodeDeclareTypeAlias; + declare export function declareOpaqueType(id: BabelNodeIdentifier, typeParameters?: BabelNodeTypeParameterDeclaration, supertype?: BabelNodeFlowType): BabelNodeDeclareOpaqueType; + declare export function declareVariable(id: BabelNodeIdentifier): BabelNodeDeclareVariable; + declare export function declareExportDeclaration(declaration?: BabelNodeFlow, specifiers?: Array, source?: BabelNodeStringLiteral): BabelNodeDeclareExportDeclaration; + declare export function declareExportAllDeclaration(source: BabelNodeStringLiteral): BabelNodeDeclareExportAllDeclaration; + declare export function declaredPredicate(value: BabelNodeFlow): BabelNodeDeclaredPredicate; + declare export function existsTypeAnnotation(): BabelNodeExistsTypeAnnotation; + declare export function functionTypeAnnotation(typeParameters?: BabelNodeTypeParameterDeclaration, params: Array, rest?: BabelNodeFunctionTypeParam, returnType: BabelNodeFlowType): BabelNodeFunctionTypeAnnotation; + declare export function functionTypeParam(name?: BabelNodeIdentifier, typeAnnotation: BabelNodeFlowType): BabelNodeFunctionTypeParam; + declare export function genericTypeAnnotation(id: BabelNodeIdentifier | BabelNodeQualifiedTypeIdentifier, typeParameters?: BabelNodeTypeParameterInstantiation): BabelNodeGenericTypeAnnotation; + declare export function inferredPredicate(): BabelNodeInferredPredicate; + declare export function interfaceExtends(id: BabelNodeIdentifier | BabelNodeQualifiedTypeIdentifier, typeParameters?: BabelNodeTypeParameterInstantiation): BabelNodeInterfaceExtends; + declare export function interfaceDeclaration(id: BabelNodeIdentifier, typeParameters?: BabelNodeTypeParameterDeclaration, _extends?: Array, body: BabelNodeObjectTypeAnnotation): BabelNodeInterfaceDeclaration; + declare export function interfaceTypeAnnotation(_extends?: Array, body: BabelNodeObjectTypeAnnotation): BabelNodeInterfaceTypeAnnotation; + declare export function intersectionTypeAnnotation(types: Array): BabelNodeIntersectionTypeAnnotation; + declare export function mixedTypeAnnotation(): BabelNodeMixedTypeAnnotation; + declare export function emptyTypeAnnotation(): BabelNodeEmptyTypeAnnotation; + declare export function nullableTypeAnnotation(typeAnnotation: BabelNodeFlowType): BabelNodeNullableTypeAnnotation; + declare export function numberLiteralTypeAnnotation(value: number): BabelNodeNumberLiteralTypeAnnotation; + declare export function numberTypeAnnotation(): BabelNodeNumberTypeAnnotation; + declare export function objectTypeAnnotation(properties: Array, indexers?: Array, callProperties?: Array, internalSlots?: Array, exact?: boolean): BabelNodeObjectTypeAnnotation; + declare export function objectTypeInternalSlot(id: BabelNodeIdentifier, value: BabelNodeFlowType, optional: boolean, _static: boolean, method: boolean): BabelNodeObjectTypeInternalSlot; + declare export function objectTypeCallProperty(value: BabelNodeFlowType): BabelNodeObjectTypeCallProperty; + declare export function objectTypeIndexer(id?: BabelNodeIdentifier, key: BabelNodeFlowType, value: BabelNodeFlowType, variance?: BabelNodeVariance): BabelNodeObjectTypeIndexer; + declare export function objectTypeProperty(key: BabelNodeIdentifier | BabelNodeStringLiteral, value: BabelNodeFlowType, variance?: BabelNodeVariance): BabelNodeObjectTypeProperty; + declare export function objectTypeSpreadProperty(argument: BabelNodeFlowType): BabelNodeObjectTypeSpreadProperty; + declare export function opaqueType(id: BabelNodeIdentifier, typeParameters?: BabelNodeTypeParameterDeclaration, supertype?: BabelNodeFlowType, impltype: BabelNodeFlowType): BabelNodeOpaqueType; + declare export function qualifiedTypeIdentifier(id: BabelNodeIdentifier, qualification: BabelNodeIdentifier | BabelNodeQualifiedTypeIdentifier): BabelNodeQualifiedTypeIdentifier; + declare export function stringLiteralTypeAnnotation(value: string): BabelNodeStringLiteralTypeAnnotation; + declare export function stringTypeAnnotation(): BabelNodeStringTypeAnnotation; + declare export function symbolTypeAnnotation(): BabelNodeSymbolTypeAnnotation; + declare export function thisTypeAnnotation(): BabelNodeThisTypeAnnotation; + declare export function tupleTypeAnnotation(types: Array): BabelNodeTupleTypeAnnotation; + declare export function typeofTypeAnnotation(argument: BabelNodeFlowType): BabelNodeTypeofTypeAnnotation; + declare export function typeAlias(id: BabelNodeIdentifier, typeParameters?: BabelNodeTypeParameterDeclaration, right: BabelNodeFlowType): BabelNodeTypeAlias; + declare export function typeAnnotation(typeAnnotation: BabelNodeFlowType): BabelNodeTypeAnnotation; + declare export function typeCastExpression(expression: BabelNodeExpression, typeAnnotation: BabelNodeTypeAnnotation): BabelNodeTypeCastExpression; + declare export function typeParameter(bound?: BabelNodeTypeAnnotation, _default?: BabelNodeFlowType, variance?: BabelNodeVariance): BabelNodeTypeParameter; + declare export function typeParameterDeclaration(params: Array): BabelNodeTypeParameterDeclaration; + declare export function typeParameterInstantiation(params: Array): BabelNodeTypeParameterInstantiation; + declare export function unionTypeAnnotation(types: Array): BabelNodeUnionTypeAnnotation; + declare export function variance(kind: "minus" | "plus"): BabelNodeVariance; + declare export function voidTypeAnnotation(): BabelNodeVoidTypeAnnotation; + declare export function enumDeclaration(id: BabelNodeIdentifier, body: BabelNodeEnumBooleanBody | BabelNodeEnumNumberBody | BabelNodeEnumStringBody | BabelNodeEnumSymbolBody): BabelNodeEnumDeclaration; + declare export function enumBooleanBody(members: Array): BabelNodeEnumBooleanBody; + declare export function enumNumberBody(members: Array): BabelNodeEnumNumberBody; + declare export function enumStringBody(members: Array): BabelNodeEnumStringBody; + declare export function enumSymbolBody(members: Array): BabelNodeEnumSymbolBody; + declare export function enumBooleanMember(id: BabelNodeIdentifier): BabelNodeEnumBooleanMember; + declare export function enumNumberMember(id: BabelNodeIdentifier, init: BabelNodeNumericLiteral): BabelNodeEnumNumberMember; + declare export function enumStringMember(id: BabelNodeIdentifier, init: BabelNodeStringLiteral): BabelNodeEnumStringMember; + declare export function enumDefaultedMember(id: BabelNodeIdentifier): BabelNodeEnumDefaultedMember; + declare export function indexedAccessType(objectType: BabelNodeFlowType, indexType: BabelNodeFlowType): BabelNodeIndexedAccessType; + declare export function optionalIndexedAccessType(objectType: BabelNodeFlowType, indexType: BabelNodeFlowType): BabelNodeOptionalIndexedAccessType; + declare export function jsxAttribute(name: BabelNodeJSXIdentifier | BabelNodeJSXNamespacedName, value?: BabelNodeJSXElement | BabelNodeJSXFragment | BabelNodeStringLiteral | BabelNodeJSXExpressionContainer): BabelNodeJSXAttribute; + declare export function jsxClosingElement(name: BabelNodeJSXIdentifier | BabelNodeJSXMemberExpression | BabelNodeJSXNamespacedName): BabelNodeJSXClosingElement; + declare export function jsxElement(openingElement: BabelNodeJSXOpeningElement, closingElement?: BabelNodeJSXClosingElement, children: Array, selfClosing?: boolean): BabelNodeJSXElement; + declare export function jsxEmptyExpression(): BabelNodeJSXEmptyExpression; + declare export function jsxExpressionContainer(expression: BabelNodeExpression | BabelNodeJSXEmptyExpression): BabelNodeJSXExpressionContainer; + declare export function jsxSpreadChild(expression: BabelNodeExpression): BabelNodeJSXSpreadChild; + declare export function jsxIdentifier(name: string): BabelNodeJSXIdentifier; + declare export function jsxMemberExpression(object: BabelNodeJSXMemberExpression | BabelNodeJSXIdentifier, property: BabelNodeJSXIdentifier): BabelNodeJSXMemberExpression; + declare export function jsxNamespacedName(namespace: BabelNodeJSXIdentifier, name: BabelNodeJSXIdentifier): BabelNodeJSXNamespacedName; + declare export function jsxOpeningElement(name: BabelNodeJSXIdentifier | BabelNodeJSXMemberExpression | BabelNodeJSXNamespacedName, attributes: Array, selfClosing?: boolean): BabelNodeJSXOpeningElement; + declare export function jsxSpreadAttribute(argument: BabelNodeExpression): BabelNodeJSXSpreadAttribute; + declare export function jsxText(value: string): BabelNodeJSXText; + declare export function jsxFragment(openingFragment: BabelNodeJSXOpeningFragment, closingFragment: BabelNodeJSXClosingFragment, children: Array): BabelNodeJSXFragment; + declare export function jsxOpeningFragment(): BabelNodeJSXOpeningFragment; + declare export function jsxClosingFragment(): BabelNodeJSXClosingFragment; + declare export function noop(): BabelNodeNoop; + declare export function placeholder(expectedNode: "Identifier" | "StringLiteral" | "Expression" | "Statement" | "Declaration" | "BlockStatement" | "ClassBody" | "Pattern", name: BabelNodeIdentifier): BabelNodePlaceholder; + declare export function v8IntrinsicIdentifier(name: string): BabelNodeV8IntrinsicIdentifier; + declare export function argumentPlaceholder(): BabelNodeArgumentPlaceholder; + declare export function bindExpression(object: BabelNodeExpression, callee: BabelNodeExpression): BabelNodeBindExpression; + declare export function classProperty(key: BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeExpression, value?: BabelNodeExpression, typeAnnotation?: BabelNodeTypeAnnotation | BabelNodeTSTypeAnnotation | BabelNodeNoop, decorators?: Array, computed?: boolean, _static?: boolean): BabelNodeClassProperty; + declare export function pipelineTopicExpression(expression: BabelNodeExpression): BabelNodePipelineTopicExpression; + declare export function pipelineBareFunction(callee: BabelNodeExpression): BabelNodePipelineBareFunction; + declare export function pipelinePrimaryTopicReference(): BabelNodePipelinePrimaryTopicReference; + declare export function classPrivateProperty(key: BabelNodePrivateName, value?: BabelNodeExpression, decorators?: Array, _static: any): BabelNodeClassPrivateProperty; + declare export function classPrivateMethod(kind?: "get" | "set" | "method" | "constructor", key: BabelNodePrivateName, params: Array, body: BabelNodeBlockStatement, _static?: boolean): BabelNodeClassPrivateMethod; + declare export function importAttribute(key: BabelNodeIdentifier | BabelNodeStringLiteral, value: BabelNodeStringLiteral): BabelNodeImportAttribute; + declare export function decorator(expression: BabelNodeExpression): BabelNodeDecorator; + declare export function doExpression(body: BabelNodeBlockStatement, async?: boolean): BabelNodeDoExpression; + declare export function exportDefaultSpecifier(exported: BabelNodeIdentifier): BabelNodeExportDefaultSpecifier; + declare export function privateName(id: BabelNodeIdentifier): BabelNodePrivateName; + declare export function recordExpression(properties: Array): BabelNodeRecordExpression; + declare export function tupleExpression(elements?: Array): BabelNodeTupleExpression; + declare export function decimalLiteral(value: string): BabelNodeDecimalLiteral; + declare export function staticBlock(body: Array): BabelNodeStaticBlock; + declare export function moduleExpression(body: BabelNodeProgram): BabelNodeModuleExpression; + declare export function tsParameterProperty(parameter: BabelNodeIdentifier | BabelNodeAssignmentPattern): BabelNodeTSParameterProperty; + declare export function tsDeclareFunction(id?: BabelNodeIdentifier, typeParameters?: BabelNodeTSTypeParameterDeclaration | BabelNodeNoop, params: Array, returnType?: BabelNodeTSTypeAnnotation | BabelNodeNoop): BabelNodeTSDeclareFunction; + declare export function tsDeclareMethod(decorators?: Array, key: BabelNodeIdentifier | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeExpression, typeParameters?: BabelNodeTSTypeParameterDeclaration | BabelNodeNoop, params: Array, returnType?: BabelNodeTSTypeAnnotation | BabelNodeNoop): BabelNodeTSDeclareMethod; + declare export function tsQualifiedName(left: BabelNodeTSEntityName, right: BabelNodeIdentifier): BabelNodeTSQualifiedName; + declare export function tsCallSignatureDeclaration(typeParameters?: BabelNodeTSTypeParameterDeclaration, parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSCallSignatureDeclaration; + declare export function tsConstructSignatureDeclaration(typeParameters?: BabelNodeTSTypeParameterDeclaration, parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSConstructSignatureDeclaration; + declare export function tsPropertySignature(key: BabelNodeExpression, typeAnnotation?: BabelNodeTSTypeAnnotation, initializer?: BabelNodeExpression): BabelNodeTSPropertySignature; + declare export function tsMethodSignature(key: BabelNodeExpression, typeParameters?: BabelNodeTSTypeParameterDeclaration, parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSMethodSignature; + declare export function tsIndexSignature(parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSIndexSignature; + declare export function tsAnyKeyword(): BabelNodeTSAnyKeyword; + declare export function tsBooleanKeyword(): BabelNodeTSBooleanKeyword; + declare export function tsBigIntKeyword(): BabelNodeTSBigIntKeyword; + declare export function tsIntrinsicKeyword(): BabelNodeTSIntrinsicKeyword; + declare export function tsNeverKeyword(): BabelNodeTSNeverKeyword; + declare export function tsNullKeyword(): BabelNodeTSNullKeyword; + declare export function tsNumberKeyword(): BabelNodeTSNumberKeyword; + declare export function tsObjectKeyword(): BabelNodeTSObjectKeyword; + declare export function tsStringKeyword(): BabelNodeTSStringKeyword; + declare export function tsSymbolKeyword(): BabelNodeTSSymbolKeyword; + declare export function tsUndefinedKeyword(): BabelNodeTSUndefinedKeyword; + declare export function tsUnknownKeyword(): BabelNodeTSUnknownKeyword; + declare export function tsVoidKeyword(): BabelNodeTSVoidKeyword; + declare export function tsThisType(): BabelNodeTSThisType; + declare export function tsFunctionType(typeParameters?: BabelNodeTSTypeParameterDeclaration, parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSFunctionType; + declare export function tsConstructorType(typeParameters?: BabelNodeTSTypeParameterDeclaration, parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSConstructorType; + declare export function tsTypeReference(typeName: BabelNodeTSEntityName, typeParameters?: BabelNodeTSTypeParameterInstantiation): BabelNodeTSTypeReference; + declare export function tsTypePredicate(parameterName: BabelNodeIdentifier | BabelNodeTSThisType, typeAnnotation?: BabelNodeTSTypeAnnotation, asserts?: boolean): BabelNodeTSTypePredicate; + declare export function tsTypeQuery(exprName: BabelNodeTSEntityName | BabelNodeTSImportType): BabelNodeTSTypeQuery; + declare export function tsTypeLiteral(members: Array): BabelNodeTSTypeLiteral; + declare export function tsArrayType(elementType: BabelNodeTSType): BabelNodeTSArrayType; + declare export function tsTupleType(elementTypes: Array): BabelNodeTSTupleType; + declare export function tsOptionalType(typeAnnotation: BabelNodeTSType): BabelNodeTSOptionalType; + declare export function tsRestType(typeAnnotation: BabelNodeTSType): BabelNodeTSRestType; + declare export function tsNamedTupleMember(label: BabelNodeIdentifier, elementType: BabelNodeTSType, optional?: boolean): BabelNodeTSNamedTupleMember; + declare export function tsUnionType(types: Array): BabelNodeTSUnionType; + declare export function tsIntersectionType(types: Array): BabelNodeTSIntersectionType; + declare export function tsConditionalType(checkType: BabelNodeTSType, extendsType: BabelNodeTSType, trueType: BabelNodeTSType, falseType: BabelNodeTSType): BabelNodeTSConditionalType; + declare export function tsInferType(typeParameter: BabelNodeTSTypeParameter): BabelNodeTSInferType; + declare export function tsParenthesizedType(typeAnnotation: BabelNodeTSType): BabelNodeTSParenthesizedType; + declare export function tsTypeOperator(typeAnnotation: BabelNodeTSType): BabelNodeTSTypeOperator; + declare export function tsIndexedAccessType(objectType: BabelNodeTSType, indexType: BabelNodeTSType): BabelNodeTSIndexedAccessType; + declare export function tsMappedType(typeParameter: BabelNodeTSTypeParameter, typeAnnotation?: BabelNodeTSType, nameType?: BabelNodeTSType): BabelNodeTSMappedType; + declare export function tsLiteralType(literal: BabelNodeNumericLiteral | BabelNodeStringLiteral | BabelNodeBooleanLiteral | BabelNodeBigIntLiteral): BabelNodeTSLiteralType; + declare export function tsExpressionWithTypeArguments(expression: BabelNodeTSEntityName, typeParameters?: BabelNodeTSTypeParameterInstantiation): BabelNodeTSExpressionWithTypeArguments; + declare export function tsInterfaceDeclaration(id: BabelNodeIdentifier, typeParameters?: BabelNodeTSTypeParameterDeclaration, _extends?: Array, body: BabelNodeTSInterfaceBody): BabelNodeTSInterfaceDeclaration; + declare export function tsInterfaceBody(body: Array): BabelNodeTSInterfaceBody; + declare export function tsTypeAliasDeclaration(id: BabelNodeIdentifier, typeParameters?: BabelNodeTSTypeParameterDeclaration, typeAnnotation: BabelNodeTSType): BabelNodeTSTypeAliasDeclaration; + declare export function tsAsExpression(expression: BabelNodeExpression, typeAnnotation: BabelNodeTSType): BabelNodeTSAsExpression; + declare export function tsTypeAssertion(typeAnnotation: BabelNodeTSType, expression: BabelNodeExpression): BabelNodeTSTypeAssertion; + declare export function tsEnumDeclaration(id: BabelNodeIdentifier, members: Array): BabelNodeTSEnumDeclaration; + declare export function tsEnumMember(id: BabelNodeIdentifier | BabelNodeStringLiteral, initializer?: BabelNodeExpression): BabelNodeTSEnumMember; + declare export function tsModuleDeclaration(id: BabelNodeIdentifier | BabelNodeStringLiteral, body: BabelNodeTSModuleBlock | BabelNodeTSModuleDeclaration): BabelNodeTSModuleDeclaration; + declare export function tsModuleBlock(body: Array): BabelNodeTSModuleBlock; + declare export function tsImportType(argument: BabelNodeStringLiteral, qualifier?: BabelNodeTSEntityName, typeParameters?: BabelNodeTSTypeParameterInstantiation): BabelNodeTSImportType; + declare export function tsImportEqualsDeclaration(id: BabelNodeIdentifier, moduleReference: BabelNodeTSEntityName | BabelNodeTSExternalModuleReference): BabelNodeTSImportEqualsDeclaration; + declare export function tsExternalModuleReference(expression: BabelNodeStringLiteral): BabelNodeTSExternalModuleReference; + declare export function tsNonNullExpression(expression: BabelNodeExpression): BabelNodeTSNonNullExpression; + declare export function tsExportAssignment(expression: BabelNodeExpression): BabelNodeTSExportAssignment; + declare export function tsNamespaceExportDeclaration(id: BabelNodeIdentifier): BabelNodeTSNamespaceExportDeclaration; + declare export function tsTypeAnnotation(typeAnnotation: BabelNodeTSType): BabelNodeTSTypeAnnotation; + declare export function tsTypeParameterInstantiation(params: Array): BabelNodeTSTypeParameterInstantiation; + declare export function tsTypeParameterDeclaration(params: Array): BabelNodeTSTypeParameterDeclaration; + declare export function tsTypeParameter(constraint?: BabelNodeTSType, _default?: BabelNodeTSType, name: string): BabelNodeTSTypeParameter; + declare export function isArrayExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArrayExpression'); + declare export function isAssignmentExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'AssignmentExpression'); + declare export function isBinaryExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BinaryExpression'); + declare export function isInterpreterDirective(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InterpreterDirective'); + declare export function isDirective(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Directive'); + declare export function isDirectiveLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DirectiveLiteral'); + declare export function isBlockStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BlockStatement'); + declare export function isBreakStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BreakStatement'); + declare export function isCallExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'CallExpression'); + declare export function isCatchClause(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'CatchClause'); + declare export function isConditionalExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ConditionalExpression'); + declare export function isContinueStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ContinueStatement'); + declare export function isDebuggerStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DebuggerStatement'); + declare export function isDoWhileStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DoWhileStatement'); + declare export function isEmptyStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EmptyStatement'); + declare export function isExpressionStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExpressionStatement'); + declare export function isFile(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'File'); + declare export function isForInStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ForInStatement'); + declare export function isForStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ForStatement'); + declare export function isFunctionDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'FunctionDeclaration'); + declare export function isFunctionExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'FunctionExpression'); + declare export function isIdentifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Identifier'); + declare export function isIfStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'IfStatement'); + declare export function isLabeledStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'LabeledStatement'); + declare export function isStringLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'StringLiteral'); + declare export function isNumericLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NumericLiteral'); + declare export function isNullLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NullLiteral'); + declare export function isBooleanLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BooleanLiteral'); + declare export function isRegExpLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RegExpLiteral'); + declare export function isLogicalExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'LogicalExpression'); + declare export function isMemberExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'MemberExpression'); + declare export function isNewExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NewExpression'); + declare export function isProgram(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Program'); + declare export function isObjectExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectExpression'); + declare export function isObjectMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectMethod'); + declare export function isObjectProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectProperty'); + declare export function isRestElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RestElement'); + declare export function isReturnStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ReturnStatement'); + declare export function isSequenceExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SequenceExpression'); + declare export function isParenthesizedExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ParenthesizedExpression'); + declare export function isSwitchCase(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SwitchCase'); + declare export function isSwitchStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SwitchStatement'); + declare export function isThisExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ThisExpression'); + declare export function isThrowStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ThrowStatement'); + declare export function isTryStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TryStatement'); + declare export function isUnaryExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'UnaryExpression'); + declare export function isUpdateExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'UpdateExpression'); + declare export function isVariableDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'VariableDeclaration'); + declare export function isVariableDeclarator(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'VariableDeclarator'); + declare export function isWhileStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'WhileStatement'); + declare export function isWithStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'WithStatement'); + declare export function isAssignmentPattern(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'AssignmentPattern'); + declare export function isArrayPattern(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArrayPattern'); + declare export function isArrowFunctionExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArrowFunctionExpression'); + declare export function isClassBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassBody'); + declare export function isClassExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassExpression'); + declare export function isClassDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassDeclaration'); + declare export function isExportAllDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportAllDeclaration'); + declare export function isExportDefaultDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportDefaultDeclaration'); + declare export function isExportNamedDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportNamedDeclaration'); + declare export function isExportSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportSpecifier'); + declare export function isForOfStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ForOfStatement'); + declare export function isImportDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportDeclaration'); + declare export function isImportDefaultSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportDefaultSpecifier'); + declare export function isImportNamespaceSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportNamespaceSpecifier'); + declare export function isImportSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportSpecifier'); + declare export function isMetaProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'MetaProperty'); + declare export function isClassMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassMethod'); + declare export function isObjectPattern(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectPattern'); + declare export function isSpreadElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SpreadElement'); + declare export function isSuper(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Super'); + declare export function isTaggedTemplateExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TaggedTemplateExpression'); + declare export function isTemplateElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TemplateElement'); + declare export function isTemplateLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TemplateLiteral'); + declare export function isYieldExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'YieldExpression'); + declare export function isAwaitExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'AwaitExpression'); + declare export function isImport(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Import'); + declare export function isBigIntLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BigIntLiteral'); + declare export function isExportNamespaceSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportNamespaceSpecifier'); + declare export function isOptionalMemberExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'OptionalMemberExpression'); + declare export function isOptionalCallExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'OptionalCallExpression'); + declare export function isAnyTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'AnyTypeAnnotation'); + declare export function isArrayTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArrayTypeAnnotation'); + declare export function isBooleanTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BooleanTypeAnnotation'); + declare export function isBooleanLiteralTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BooleanLiteralTypeAnnotation'); + declare export function isNullLiteralTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NullLiteralTypeAnnotation'); + declare export function isClassImplements(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassImplements'); + declare export function isDeclareClass(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareClass'); + declare export function isDeclareFunction(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareFunction'); + declare export function isDeclareInterface(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareInterface'); + declare export function isDeclareModule(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareModule'); + declare export function isDeclareModuleExports(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareModuleExports'); + declare export function isDeclareTypeAlias(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareTypeAlias'); + declare export function isDeclareOpaqueType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareOpaqueType'); + declare export function isDeclareVariable(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareVariable'); + declare export function isDeclareExportDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareExportDeclaration'); + declare export function isDeclareExportAllDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclareExportAllDeclaration'); + declare export function isDeclaredPredicate(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DeclaredPredicate'); + declare export function isExistsTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExistsTypeAnnotation'); + declare export function isFunctionTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'FunctionTypeAnnotation'); + declare export function isFunctionTypeParam(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'FunctionTypeParam'); + declare export function isGenericTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'GenericTypeAnnotation'); + declare export function isInferredPredicate(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InferredPredicate'); + declare export function isInterfaceExtends(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InterfaceExtends'); + declare export function isInterfaceDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InterfaceDeclaration'); + declare export function isInterfaceTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'InterfaceTypeAnnotation'); + declare export function isIntersectionTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'IntersectionTypeAnnotation'); + declare export function isMixedTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'MixedTypeAnnotation'); + declare export function isEmptyTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EmptyTypeAnnotation'); + declare export function isNullableTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NullableTypeAnnotation'); + declare export function isNumberLiteralTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NumberLiteralTypeAnnotation'); + declare export function isNumberTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NumberTypeAnnotation'); + declare export function isObjectTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeAnnotation'); + declare export function isObjectTypeInternalSlot(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeInternalSlot'); + declare export function isObjectTypeCallProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeCallProperty'); + declare export function isObjectTypeIndexer(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeIndexer'); + declare export function isObjectTypeProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeProperty'); + declare export function isObjectTypeSpreadProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ObjectTypeSpreadProperty'); + declare export function isOpaqueType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'OpaqueType'); + declare export function isQualifiedTypeIdentifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'QualifiedTypeIdentifier'); + declare export function isStringLiteralTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'StringLiteralTypeAnnotation'); + declare export function isStringTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'StringTypeAnnotation'); + declare export function isSymbolTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SymbolTypeAnnotation'); + declare export function isThisTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ThisTypeAnnotation'); + declare export function isTupleTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TupleTypeAnnotation'); + declare export function isTypeofTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeofTypeAnnotation'); + declare export function isTypeAlias(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeAlias'); + declare export function isTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeAnnotation'); + declare export function isTypeCastExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeCastExpression'); + declare export function isTypeParameter(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeParameter'); + declare export function isTypeParameterDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeParameterDeclaration'); + declare export function isTypeParameterInstantiation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TypeParameterInstantiation'); + declare export function isUnionTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'UnionTypeAnnotation'); + declare export function isVariance(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Variance'); + declare export function isVoidTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'VoidTypeAnnotation'); + declare export function isEnumDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumDeclaration'); + declare export function isEnumBooleanBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumBooleanBody'); + declare export function isEnumNumberBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumNumberBody'); + declare export function isEnumStringBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumStringBody'); + declare export function isEnumSymbolBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumSymbolBody'); + declare export function isEnumBooleanMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumBooleanMember'); + declare export function isEnumNumberMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumNumberMember'); + declare export function isEnumStringMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumStringMember'); + declare export function isEnumDefaultedMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'EnumDefaultedMember'); + declare export function isIndexedAccessType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'IndexedAccessType'); + declare export function isOptionalIndexedAccessType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'OptionalIndexedAccessType'); + declare export function isJSXAttribute(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXAttribute'); + declare export function isJSXClosingElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXClosingElement'); + declare export function isJSXElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXElement'); + declare export function isJSXEmptyExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXEmptyExpression'); + declare export function isJSXExpressionContainer(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXExpressionContainer'); + declare export function isJSXSpreadChild(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXSpreadChild'); + declare export function isJSXIdentifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXIdentifier'); + declare export function isJSXMemberExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXMemberExpression'); + declare export function isJSXNamespacedName(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXNamespacedName'); + declare export function isJSXOpeningElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXOpeningElement'); + declare export function isJSXSpreadAttribute(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXSpreadAttribute'); + declare export function isJSXText(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXText'); + declare export function isJSXFragment(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXFragment'); + declare export function isJSXOpeningFragment(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXOpeningFragment'); + declare export function isJSXClosingFragment(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'JSXClosingFragment'); + declare export function isNoop(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Noop'); + declare export function isPlaceholder(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Placeholder'); + declare export function isV8IntrinsicIdentifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'V8IntrinsicIdentifier'); + declare export function isArgumentPlaceholder(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ArgumentPlaceholder'); + declare export function isBindExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'BindExpression'); + declare export function isClassProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassProperty'); + declare export function isPipelineTopicExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'PipelineTopicExpression'); + declare export function isPipelineBareFunction(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'PipelineBareFunction'); + declare export function isPipelinePrimaryTopicReference(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'PipelinePrimaryTopicReference'); + declare export function isClassPrivateProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassPrivateProperty'); + declare export function isClassPrivateMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ClassPrivateMethod'); + declare export function isImportAttribute(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ImportAttribute'); + declare export function isDecorator(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'Decorator'); + declare export function isDoExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DoExpression'); + declare export function isExportDefaultSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ExportDefaultSpecifier'); + declare export function isPrivateName(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'PrivateName'); + declare export function isRecordExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RecordExpression'); + declare export function isTupleExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TupleExpression'); + declare export function isDecimalLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'DecimalLiteral'); + declare export function isStaticBlock(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'StaticBlock'); + declare export function isModuleExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'ModuleExpression'); + declare export function isTSParameterProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSParameterProperty'); + declare export function isTSDeclareFunction(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSDeclareFunction'); + declare export function isTSDeclareMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSDeclareMethod'); + declare export function isTSQualifiedName(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSQualifiedName'); + declare export function isTSCallSignatureDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSCallSignatureDeclaration'); + declare export function isTSConstructSignatureDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSConstructSignatureDeclaration'); + declare export function isTSPropertySignature(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSPropertySignature'); + declare export function isTSMethodSignature(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSMethodSignature'); + declare export function isTSIndexSignature(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSIndexSignature'); + declare export function isTSAnyKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSAnyKeyword'); + declare export function isTSBooleanKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSBooleanKeyword'); + declare export function isTSBigIntKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSBigIntKeyword'); + declare export function isTSIntrinsicKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSIntrinsicKeyword'); + declare export function isTSNeverKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNeverKeyword'); + declare export function isTSNullKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNullKeyword'); + declare export function isTSNumberKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNumberKeyword'); + declare export function isTSObjectKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSObjectKeyword'); + declare export function isTSStringKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSStringKeyword'); + declare export function isTSSymbolKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSSymbolKeyword'); + declare export function isTSUndefinedKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSUndefinedKeyword'); + declare export function isTSUnknownKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSUnknownKeyword'); + declare export function isTSVoidKeyword(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSVoidKeyword'); + declare export function isTSThisType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSThisType'); + declare export function isTSFunctionType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSFunctionType'); + declare export function isTSConstructorType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSConstructorType'); + declare export function isTSTypeReference(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeReference'); + declare export function isTSTypePredicate(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypePredicate'); + declare export function isTSTypeQuery(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeQuery'); + declare export function isTSTypeLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeLiteral'); + declare export function isTSArrayType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSArrayType'); + declare export function isTSTupleType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTupleType'); + declare export function isTSOptionalType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSOptionalType'); + declare export function isTSRestType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSRestType'); + declare export function isTSNamedTupleMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNamedTupleMember'); + declare export function isTSUnionType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSUnionType'); + declare export function isTSIntersectionType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSIntersectionType'); + declare export function isTSConditionalType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSConditionalType'); + declare export function isTSInferType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSInferType'); + declare export function isTSParenthesizedType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSParenthesizedType'); + declare export function isTSTypeOperator(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeOperator'); + declare export function isTSIndexedAccessType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSIndexedAccessType'); + declare export function isTSMappedType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSMappedType'); + declare export function isTSLiteralType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSLiteralType'); + declare export function isTSExpressionWithTypeArguments(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSExpressionWithTypeArguments'); + declare export function isTSInterfaceDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSInterfaceDeclaration'); + declare export function isTSInterfaceBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSInterfaceBody'); + declare export function isTSTypeAliasDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeAliasDeclaration'); + declare export function isTSAsExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSAsExpression'); + declare export function isTSTypeAssertion(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeAssertion'); + declare export function isTSEnumDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSEnumDeclaration'); + declare export function isTSEnumMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSEnumMember'); + declare export function isTSModuleDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSModuleDeclaration'); + declare export function isTSModuleBlock(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSModuleBlock'); + declare export function isTSImportType(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSImportType'); + declare export function isTSImportEqualsDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSImportEqualsDeclaration'); + declare export function isTSExternalModuleReference(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSExternalModuleReference'); + declare export function isTSNonNullExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNonNullExpression'); + declare export function isTSExportAssignment(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSExportAssignment'); + declare export function isTSNamespaceExportDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSNamespaceExportDeclaration'); + declare export function isTSTypeAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeAnnotation'); + declare export function isTSTypeParameterInstantiation(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeParameterInstantiation'); + declare export function isTSTypeParameterDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeParameterDeclaration'); + declare export function isTSTypeParameter(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'TSTypeParameter'); + declare export function isExpression(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ArrayExpression' || node.type === 'AssignmentExpression' || node.type === 'BinaryExpression' || node.type === 'CallExpression' || node.type === 'ConditionalExpression' || node.type === 'FunctionExpression' || node.type === 'Identifier' || node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'RegExpLiteral' || node.type === 'LogicalExpression' || node.type === 'MemberExpression' || node.type === 'NewExpression' || node.type === 'ObjectExpression' || node.type === 'SequenceExpression' || node.type === 'ParenthesizedExpression' || node.type === 'ThisExpression' || node.type === 'UnaryExpression' || node.type === 'UpdateExpression' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassExpression' || node.type === 'MetaProperty' || node.type === 'Super' || node.type === 'TaggedTemplateExpression' || node.type === 'TemplateLiteral' || node.type === 'YieldExpression' || node.type === 'AwaitExpression' || node.type === 'Import' || node.type === 'BigIntLiteral' || node.type === 'OptionalMemberExpression' || node.type === 'OptionalCallExpression' || node.type === 'TypeCastExpression' || node.type === 'JSXElement' || node.type === 'JSXFragment' || node.type === 'BindExpression' || node.type === 'PipelinePrimaryTopicReference' || node.type === 'DoExpression' || node.type === 'RecordExpression' || node.type === 'TupleExpression' || node.type === 'DecimalLiteral' || node.type === 'ModuleExpression' || node.type === 'TSAsExpression' || node.type === 'TSTypeAssertion' || node.type === 'TSNonNullExpression')); + declare export function isBinary(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BinaryExpression' || node.type === 'LogicalExpression')); + declare export function isScopable(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BlockStatement' || node.type === 'CatchClause' || node.type === 'DoWhileStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'Program' || node.type === 'ObjectMethod' || node.type === 'SwitchStatement' || node.type === 'WhileStatement' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassExpression' || node.type === 'ClassDeclaration' || node.type === 'ForOfStatement' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod' || node.type === 'StaticBlock' || node.type === 'TSModuleBlock')); + declare export function isBlockParent(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BlockStatement' || node.type === 'CatchClause' || node.type === 'DoWhileStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'Program' || node.type === 'ObjectMethod' || node.type === 'SwitchStatement' || node.type === 'WhileStatement' || node.type === 'ArrowFunctionExpression' || node.type === 'ForOfStatement' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod' || node.type === 'StaticBlock' || node.type === 'TSModuleBlock')); + declare export function isBlock(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BlockStatement' || node.type === 'Program' || node.type === 'TSModuleBlock')); + declare export function isStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BlockStatement' || node.type === 'BreakStatement' || node.type === 'ContinueStatement' || node.type === 'DebuggerStatement' || node.type === 'DoWhileStatement' || node.type === 'EmptyStatement' || node.type === 'ExpressionStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'IfStatement' || node.type === 'LabeledStatement' || node.type === 'ReturnStatement' || node.type === 'SwitchStatement' || node.type === 'ThrowStatement' || node.type === 'TryStatement' || node.type === 'VariableDeclaration' || node.type === 'WhileStatement' || node.type === 'WithStatement' || node.type === 'ClassDeclaration' || node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration' || node.type === 'ForOfStatement' || node.type === 'ImportDeclaration' || node.type === 'DeclareClass' || node.type === 'DeclareFunction' || node.type === 'DeclareInterface' || node.type === 'DeclareModule' || node.type === 'DeclareModuleExports' || node.type === 'DeclareTypeAlias' || node.type === 'DeclareOpaqueType' || node.type === 'DeclareVariable' || node.type === 'DeclareExportDeclaration' || node.type === 'DeclareExportAllDeclaration' || node.type === 'InterfaceDeclaration' || node.type === 'OpaqueType' || node.type === 'TypeAlias' || node.type === 'EnumDeclaration' || node.type === 'TSDeclareFunction' || node.type === 'TSInterfaceDeclaration' || node.type === 'TSTypeAliasDeclaration' || node.type === 'TSEnumDeclaration' || node.type === 'TSModuleDeclaration' || node.type === 'TSImportEqualsDeclaration' || node.type === 'TSExportAssignment' || node.type === 'TSNamespaceExportDeclaration')); + declare export function isTerminatorless(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BreakStatement' || node.type === 'ContinueStatement' || node.type === 'ReturnStatement' || node.type === 'ThrowStatement' || node.type === 'YieldExpression' || node.type === 'AwaitExpression')); + declare export function isCompletionStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'BreakStatement' || node.type === 'ContinueStatement' || node.type === 'ReturnStatement' || node.type === 'ThrowStatement')); + declare export function isConditional(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ConditionalExpression' || node.type === 'IfStatement')); + declare export function isLoop(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'DoWhileStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'WhileStatement' || node.type === 'ForOfStatement')); + declare export function isWhile(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'DoWhileStatement' || node.type === 'WhileStatement')); + declare export function isExpressionWrapper(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ExpressionStatement' || node.type === 'ParenthesizedExpression' || node.type === 'TypeCastExpression')); + declare export function isFor(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'ForOfStatement')); + declare export function isForXStatement(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ForInStatement' || node.type === 'ForOfStatement')); + declare export function isFunction(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ObjectMethod' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod')); + declare export function isFunctionParent(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ObjectMethod' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod')); + declare export function isPureish(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'RegExpLiteral' || node.type === 'ArrowFunctionExpression' || node.type === 'BigIntLiteral' || node.type === 'DecimalLiteral')); + declare export function isDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'FunctionDeclaration' || node.type === 'VariableDeclaration' || node.type === 'ClassDeclaration' || node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration' || node.type === 'ImportDeclaration' || node.type === 'DeclareClass' || node.type === 'DeclareFunction' || node.type === 'DeclareInterface' || node.type === 'DeclareModule' || node.type === 'DeclareModuleExports' || node.type === 'DeclareTypeAlias' || node.type === 'DeclareOpaqueType' || node.type === 'DeclareVariable' || node.type === 'DeclareExportDeclaration' || node.type === 'DeclareExportAllDeclaration' || node.type === 'InterfaceDeclaration' || node.type === 'OpaqueType' || node.type === 'TypeAlias' || node.type === 'EnumDeclaration' || node.type === 'TSDeclareFunction' || node.type === 'TSInterfaceDeclaration' || node.type === 'TSTypeAliasDeclaration' || node.type === 'TSEnumDeclaration' || node.type === 'TSModuleDeclaration')); + declare export function isPatternLike(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'Identifier' || node.type === 'RestElement' || node.type === 'AssignmentPattern' || node.type === 'ArrayPattern' || node.type === 'ObjectPattern')); + declare export function isLVal(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'Identifier' || node.type === 'MemberExpression' || node.type === 'RestElement' || node.type === 'AssignmentPattern' || node.type === 'ArrayPattern' || node.type === 'ObjectPattern' || node.type === 'TSParameterProperty')); + declare export function isTSEntityName(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'Identifier' || node.type === 'TSQualifiedName')); + declare export function isLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'RegExpLiteral' || node.type === 'TemplateLiteral' || node.type === 'BigIntLiteral' || node.type === 'DecimalLiteral')); + declare export function isImmutable(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'StringLiteral' || node.type === 'NumericLiteral' || node.type === 'NullLiteral' || node.type === 'BooleanLiteral' || node.type === 'BigIntLiteral' || node.type === 'JSXAttribute' || node.type === 'JSXClosingElement' || node.type === 'JSXElement' || node.type === 'JSXExpressionContainer' || node.type === 'JSXSpreadChild' || node.type === 'JSXOpeningElement' || node.type === 'JSXText' || node.type === 'JSXFragment' || node.type === 'JSXOpeningFragment' || node.type === 'JSXClosingFragment' || node.type === 'DecimalLiteral')); + declare export function isUserWhitespacable(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ObjectMethod' || node.type === 'ObjectProperty' || node.type === 'ObjectTypeInternalSlot' || node.type === 'ObjectTypeCallProperty' || node.type === 'ObjectTypeIndexer' || node.type === 'ObjectTypeProperty' || node.type === 'ObjectTypeSpreadProperty')); + declare export function isMethod(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ObjectMethod' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod')); + declare export function isObjectMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ObjectMethod' || node.type === 'ObjectProperty')); + declare export function isProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ObjectProperty' || node.type === 'ClassProperty' || node.type === 'ClassPrivateProperty')); + declare export function isUnaryLike(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'UnaryExpression' || node.type === 'SpreadElement')); + declare export function isPattern(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'AssignmentPattern' || node.type === 'ArrayPattern' || node.type === 'ObjectPattern')); + declare export function isClass(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ClassExpression' || node.type === 'ClassDeclaration')); + declare export function isModuleDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration' || node.type === 'ImportDeclaration')); + declare export function isExportDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ExportAllDeclaration' || node.type === 'ExportDefaultDeclaration' || node.type === 'ExportNamedDeclaration')); + declare export function isModuleSpecifier(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ExportSpecifier' || node.type === 'ImportDefaultSpecifier' || node.type === 'ImportNamespaceSpecifier' || node.type === 'ImportSpecifier' || node.type === 'ExportNamespaceSpecifier' || node.type === 'ExportDefaultSpecifier')); + declare export function isFlow(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'AnyTypeAnnotation' || node.type === 'ArrayTypeAnnotation' || node.type === 'BooleanTypeAnnotation' || node.type === 'BooleanLiteralTypeAnnotation' || node.type === 'NullLiteralTypeAnnotation' || node.type === 'ClassImplements' || node.type === 'DeclareClass' || node.type === 'DeclareFunction' || node.type === 'DeclareInterface' || node.type === 'DeclareModule' || node.type === 'DeclareModuleExports' || node.type === 'DeclareTypeAlias' || node.type === 'DeclareOpaqueType' || node.type === 'DeclareVariable' || node.type === 'DeclareExportDeclaration' || node.type === 'DeclareExportAllDeclaration' || node.type === 'DeclaredPredicate' || node.type === 'ExistsTypeAnnotation' || node.type === 'FunctionTypeAnnotation' || node.type === 'FunctionTypeParam' || node.type === 'GenericTypeAnnotation' || node.type === 'InferredPredicate' || node.type === 'InterfaceExtends' || node.type === 'InterfaceDeclaration' || node.type === 'InterfaceTypeAnnotation' || node.type === 'IntersectionTypeAnnotation' || node.type === 'MixedTypeAnnotation' || node.type === 'EmptyTypeAnnotation' || node.type === 'NullableTypeAnnotation' || node.type === 'NumberLiteralTypeAnnotation' || node.type === 'NumberTypeAnnotation' || node.type === 'ObjectTypeAnnotation' || node.type === 'ObjectTypeInternalSlot' || node.type === 'ObjectTypeCallProperty' || node.type === 'ObjectTypeIndexer' || node.type === 'ObjectTypeProperty' || node.type === 'ObjectTypeSpreadProperty' || node.type === 'OpaqueType' || node.type === 'QualifiedTypeIdentifier' || node.type === 'StringLiteralTypeAnnotation' || node.type === 'StringTypeAnnotation' || node.type === 'SymbolTypeAnnotation' || node.type === 'ThisTypeAnnotation' || node.type === 'TupleTypeAnnotation' || node.type === 'TypeofTypeAnnotation' || node.type === 'TypeAlias' || node.type === 'TypeAnnotation' || node.type === 'TypeCastExpression' || node.type === 'TypeParameter' || node.type === 'TypeParameterDeclaration' || node.type === 'TypeParameterInstantiation' || node.type === 'UnionTypeAnnotation' || node.type === 'Variance' || node.type === 'VoidTypeAnnotation' || node.type === 'IndexedAccessType' || node.type === 'OptionalIndexedAccessType')); + declare export function isFlowType(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'AnyTypeAnnotation' || node.type === 'ArrayTypeAnnotation' || node.type === 'BooleanTypeAnnotation' || node.type === 'BooleanLiteralTypeAnnotation' || node.type === 'NullLiteralTypeAnnotation' || node.type === 'ExistsTypeAnnotation' || node.type === 'FunctionTypeAnnotation' || node.type === 'GenericTypeAnnotation' || node.type === 'InterfaceTypeAnnotation' || node.type === 'IntersectionTypeAnnotation' || node.type === 'MixedTypeAnnotation' || node.type === 'EmptyTypeAnnotation' || node.type === 'NullableTypeAnnotation' || node.type === 'NumberLiteralTypeAnnotation' || node.type === 'NumberTypeAnnotation' || node.type === 'ObjectTypeAnnotation' || node.type === 'StringLiteralTypeAnnotation' || node.type === 'StringTypeAnnotation' || node.type === 'SymbolTypeAnnotation' || node.type === 'ThisTypeAnnotation' || node.type === 'TupleTypeAnnotation' || node.type === 'TypeofTypeAnnotation' || node.type === 'UnionTypeAnnotation' || node.type === 'VoidTypeAnnotation' || node.type === 'IndexedAccessType' || node.type === 'OptionalIndexedAccessType')); + declare export function isFlowBaseAnnotation(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'AnyTypeAnnotation' || node.type === 'BooleanTypeAnnotation' || node.type === 'NullLiteralTypeAnnotation' || node.type === 'MixedTypeAnnotation' || node.type === 'EmptyTypeAnnotation' || node.type === 'NumberTypeAnnotation' || node.type === 'StringTypeAnnotation' || node.type === 'SymbolTypeAnnotation' || node.type === 'ThisTypeAnnotation' || node.type === 'VoidTypeAnnotation')); + declare export function isFlowDeclaration(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'DeclareClass' || node.type === 'DeclareFunction' || node.type === 'DeclareInterface' || node.type === 'DeclareModule' || node.type === 'DeclareModuleExports' || node.type === 'DeclareTypeAlias' || node.type === 'DeclareOpaqueType' || node.type === 'DeclareVariable' || node.type === 'DeclareExportDeclaration' || node.type === 'DeclareExportAllDeclaration' || node.type === 'InterfaceDeclaration' || node.type === 'OpaqueType' || node.type === 'TypeAlias')); + declare export function isFlowPredicate(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'DeclaredPredicate' || node.type === 'InferredPredicate')); + declare export function isEnumBody(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'EnumBooleanBody' || node.type === 'EnumNumberBody' || node.type === 'EnumStringBody' || node.type === 'EnumSymbolBody')); + declare export function isEnumMember(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'EnumBooleanMember' || node.type === 'EnumNumberMember' || node.type === 'EnumStringMember' || node.type === 'EnumDefaultedMember')); + declare export function isJSX(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'JSXAttribute' || node.type === 'JSXClosingElement' || node.type === 'JSXElement' || node.type === 'JSXEmptyExpression' || node.type === 'JSXExpressionContainer' || node.type === 'JSXSpreadChild' || node.type === 'JSXIdentifier' || node.type === 'JSXMemberExpression' || node.type === 'JSXNamespacedName' || node.type === 'JSXOpeningElement' || node.type === 'JSXSpreadAttribute' || node.type === 'JSXText' || node.type === 'JSXFragment' || node.type === 'JSXOpeningFragment' || node.type === 'JSXClosingFragment')); + declare export function isPrivate(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'ClassPrivateProperty' || node.type === 'ClassPrivateMethod' || node.type === 'PrivateName')); + declare export function isTSTypeElement(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'TSCallSignatureDeclaration' || node.type === 'TSConstructSignatureDeclaration' || node.type === 'TSPropertySignature' || node.type === 'TSMethodSignature' || node.type === 'TSIndexSignature')); + declare export function isTSType(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'TSAnyKeyword' || node.type === 'TSBooleanKeyword' || node.type === 'TSBigIntKeyword' || node.type === 'TSIntrinsicKeyword' || node.type === 'TSNeverKeyword' || node.type === 'TSNullKeyword' || node.type === 'TSNumberKeyword' || node.type === 'TSObjectKeyword' || node.type === 'TSStringKeyword' || node.type === 'TSSymbolKeyword' || node.type === 'TSUndefinedKeyword' || node.type === 'TSUnknownKeyword' || node.type === 'TSVoidKeyword' || node.type === 'TSThisType' || node.type === 'TSFunctionType' || node.type === 'TSConstructorType' || node.type === 'TSTypeReference' || node.type === 'TSTypePredicate' || node.type === 'TSTypeQuery' || node.type === 'TSTypeLiteral' || node.type === 'TSArrayType' || node.type === 'TSTupleType' || node.type === 'TSOptionalType' || node.type === 'TSRestType' || node.type === 'TSUnionType' || node.type === 'TSIntersectionType' || node.type === 'TSConditionalType' || node.type === 'TSInferType' || node.type === 'TSParenthesizedType' || node.type === 'TSTypeOperator' || node.type === 'TSIndexedAccessType' || node.type === 'TSMappedType' || node.type === 'TSLiteralType' || node.type === 'TSExpressionWithTypeArguments' || node.type === 'TSImportType')); + declare export function isTSBaseType(node: ?Object, opts?: ?Object): boolean %checks (node != null && (node.type === 'TSAnyKeyword' || node.type === 'TSBooleanKeyword' || node.type === 'TSBigIntKeyword' || node.type === 'TSIntrinsicKeyword' || node.type === 'TSNeverKeyword' || node.type === 'TSNullKeyword' || node.type === 'TSNumberKeyword' || node.type === 'TSObjectKeyword' || node.type === 'TSStringKeyword' || node.type === 'TSSymbolKeyword' || node.type === 'TSUndefinedKeyword' || node.type === 'TSUnknownKeyword' || node.type === 'TSVoidKeyword' || node.type === 'TSThisType' || node.type === 'TSLiteralType')); + declare export function isNumberLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'NumericLiteral'); + declare export function isRegexLiteral(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RegExpLiteral'); + declare export function isRestProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'RestElement'); + declare export function isSpreadProperty(node: ?Object, opts?: ?Object): boolean %checks (node != null && node.type === 'SpreadElement'); + declare export function createTypeAnnotationBasedOnTypeof(type: 'string' | 'number' | 'undefined' | 'boolean' | 'function' | 'object' | 'symbol'): BabelNodeTypeAnnotation + declare export function createUnionTypeAnnotation(types: Array): BabelNodeUnionTypeAnnotation + declare export function createFlowUnionType(types: Array): BabelNodeUnionTypeAnnotation + declare export function buildChildren(node: { children: Array }): Array + declare export function clone(n: T): T; + declare export function cloneDeep(n: T): T; + declare export function cloneDeepWithoutLoc(n: T): T; + declare export function cloneNode(n: T, deep?: boolean, withoutLoc?: boolean): T; + declare export function cloneWithoutLoc(n: T): T; + declare type CommentTypeShorthand = 'leading' | 'inner' | 'trailing' + declare export function addComment(node: T, type: CommentTypeShorthand, content: string, line?: boolean): T + declare export function addComments(node: T, type: CommentTypeShorthand, comments: Array): T + declare export function inheritInnerComments(node: Node, parent: Node): void + declare export function inheritLeadingComments(node: Node, parent: Node): void + declare export function inheritsComments(node: T, parent: Node): void + declare export function inheritTrailingComments(node: Node, parent: Node): void + declare export function removeComments(node: T): T + declare export function ensureBlock(node: BabelNode, key: string): BabelNodeBlockStatement + declare export function toBindingIdentifierName(name?: ?string): string + declare export function toBlock(node: BabelNodeStatement | BabelNodeExpression, parent?: BabelNodeFunction | null): BabelNodeBlockStatement + declare export function toComputedKey(node: BabelNodeMethod | BabelNodeProperty, key?: BabelNodeExpression | BabelNodeIdentifier): BabelNodeExpression + declare export function toExpression(node: BabelNodeExpressionStatement | BabelNodeExpression | BabelNodeClass | BabelNodeFunction): BabelNodeExpression + declare export function toIdentifier(name?: ?string): string + declare export function toKeyAlias(node: BabelNodeMethod | BabelNodeProperty, key?: BabelNode): string + declare export function toStatement(node: BabelNodeStatement | BabelNodeClass | BabelNodeFunction | BabelNodeAssignmentExpression, ignore?: boolean): BabelNodeStatement | void + declare export function valueToNode(value: any): BabelNodeExpression + declare export function removeTypeDuplicates(types: Array): Array + declare export function appendToMemberExpression(member: BabelNodeMemberExpression, append: BabelNode, computed?: boolean): BabelNodeMemberExpression + declare export function inherits(child: T, parent: BabelNode | null | void): T + declare export function prependToMemberExpression(member: BabelNodeMemberExpression, prepend: BabelNodeExpression): BabelNodeMemberExpression + declare export function removeProperties(n: T, opts: ?{}): void; + declare export function removePropertiesDeep(n: T, opts: ?{}): T; + declare export function getBindingIdentifiers(node: BabelNode, duplicates: boolean, outerOnly?: boolean): { [key: string]: BabelNodeIdentifier | Array } + declare export function getOuterBindingIdentifiers(node: Node, duplicates: boolean): { [key: string]: BabelNodeIdentifier | Array } + declare export type TraversalAncestors = Array<{ + node: BabelNode, + key: string, + index?: number, + }>; + declare export type TraversalHandler = (BabelNode, TraversalAncestors, T) => void; + declare export type TraversalHandlers = { + enter?: TraversalHandler, + exit?: TraversalHandler, + }; + declare export function traverse(n: BabelNode, TraversalHandler | TraversalHandlers, state?: T): void; + declare export function traverseFast(n: Node, h: TraversalHandler, state?: T): void; + declare export function shallowEqual(actual: Object, expected: Object): boolean + declare export function buildMatchMemberExpression(match: string, allowPartial?: boolean): (?BabelNode) => boolean + declare export function is(type: string, n: BabelNode, opts: Object): boolean; + declare export function isBinding(node: BabelNode, parent: BabelNode, grandparent?: BabelNode): boolean + declare export function isBlockScoped(node: BabelNode): boolean + declare export function isLet(node: BabelNode): boolean %checks (node.type === 'VariableDeclaration') + declare export function isNode(node: ?Object): boolean + declare export function isNodesEquivalent(a: any, b: any): boolean + declare export function isPlaceholderType(placeholderType: string, targetType: string): boolean + declare export function isReferenced(node: BabelNode, parent: BabelNode, grandparent?: BabelNode): boolean + declare export function isScope(node: BabelNode, parent: BabelNode): boolean %checks (node.type === 'BlockStatement' || node.type === 'CatchClause' || node.type === 'DoWhileStatement' || node.type === 'ForInStatement' || node.type === 'ForStatement' || node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'Program' || node.type === 'ObjectMethod' || node.type === 'SwitchStatement' || node.type === 'WhileStatement' || node.type === 'ArrowFunctionExpression' || node.type === 'ClassExpression' || node.type === 'ClassDeclaration' || node.type === 'ForOfStatement' || node.type === 'ClassMethod' || node.type === 'ClassPrivateMethod' || node.type === 'TSModuleBlock') + declare export function isSpecifierDefault(specifier: BabelNodeModuleSpecifier): boolean + declare export function isType(nodetype: ?string, targetType: string): boolean + declare export function isValidES3Identifier(name: string): boolean + declare export function isValidES3Identifier(name: string): boolean + declare export function isValidIdentifier(name: string): boolean + declare export function isVar(node: BabelNode): boolean %checks (node.type === 'VariableDeclaration') + declare export function matchesPattern(node: ?BabelNode, match: string | Array, allowPartial?: boolean): boolean + declare export function validate(n: BabelNode, key: string, value: mixed): void; + declare export type Node = BabelNode; + declare export type CommentBlock = BabelNodeCommentBlock; + declare export type CommentLine = BabelNodeCommentLine; + declare export type Comment = BabelNodeComment; + declare export type SourceLocation = BabelNodeSourceLocation; + declare export type ArrayExpression = BabelNodeArrayExpression; + declare export type AssignmentExpression = BabelNodeAssignmentExpression; + declare export type BinaryExpression = BabelNodeBinaryExpression; + declare export type InterpreterDirective = BabelNodeInterpreterDirective; + declare export type Directive = BabelNodeDirective; + declare export type DirectiveLiteral = BabelNodeDirectiveLiteral; + declare export type BlockStatement = BabelNodeBlockStatement; + declare export type BreakStatement = BabelNodeBreakStatement; + declare export type CallExpression = BabelNodeCallExpression; + declare export type CatchClause = BabelNodeCatchClause; + declare export type ConditionalExpression = BabelNodeConditionalExpression; + declare export type ContinueStatement = BabelNodeContinueStatement; + declare export type DebuggerStatement = BabelNodeDebuggerStatement; + declare export type DoWhileStatement = BabelNodeDoWhileStatement; + declare export type EmptyStatement = BabelNodeEmptyStatement; + declare export type ExpressionStatement = BabelNodeExpressionStatement; + declare export type File = BabelNodeFile; + declare export type ForInStatement = BabelNodeForInStatement; + declare export type ForStatement = BabelNodeForStatement; + declare export type FunctionDeclaration = BabelNodeFunctionDeclaration; + declare export type FunctionExpression = BabelNodeFunctionExpression; + declare export type Identifier = BabelNodeIdentifier; + declare export type IfStatement = BabelNodeIfStatement; + declare export type LabeledStatement = BabelNodeLabeledStatement; + declare export type StringLiteral = BabelNodeStringLiteral; + declare export type NumericLiteral = BabelNodeNumericLiteral; + declare export type NullLiteral = BabelNodeNullLiteral; + declare export type BooleanLiteral = BabelNodeBooleanLiteral; + declare export type RegExpLiteral = BabelNodeRegExpLiteral; + declare export type LogicalExpression = BabelNodeLogicalExpression; + declare export type MemberExpression = BabelNodeMemberExpression; + declare export type NewExpression = BabelNodeNewExpression; + declare export type Program = BabelNodeProgram; + declare export type ObjectExpression = BabelNodeObjectExpression; + declare export type ObjectMethod = BabelNodeObjectMethod; + declare export type ObjectProperty = BabelNodeObjectProperty; + declare export type RestElement = BabelNodeRestElement; + declare export type ReturnStatement = BabelNodeReturnStatement; + declare export type SequenceExpression = BabelNodeSequenceExpression; + declare export type ParenthesizedExpression = BabelNodeParenthesizedExpression; + declare export type SwitchCase = BabelNodeSwitchCase; + declare export type SwitchStatement = BabelNodeSwitchStatement; + declare export type ThisExpression = BabelNodeThisExpression; + declare export type ThrowStatement = BabelNodeThrowStatement; + declare export type TryStatement = BabelNodeTryStatement; + declare export type UnaryExpression = BabelNodeUnaryExpression; + declare export type UpdateExpression = BabelNodeUpdateExpression; + declare export type VariableDeclaration = BabelNodeVariableDeclaration; + declare export type VariableDeclarator = BabelNodeVariableDeclarator; + declare export type WhileStatement = BabelNodeWhileStatement; + declare export type WithStatement = BabelNodeWithStatement; + declare export type AssignmentPattern = BabelNodeAssignmentPattern; + declare export type ArrayPattern = BabelNodeArrayPattern; + declare export type ArrowFunctionExpression = BabelNodeArrowFunctionExpression; + declare export type ClassBody = BabelNodeClassBody; + declare export type ClassExpression = BabelNodeClassExpression; + declare export type ClassDeclaration = BabelNodeClassDeclaration; + declare export type ExportAllDeclaration = BabelNodeExportAllDeclaration; + declare export type ExportDefaultDeclaration = BabelNodeExportDefaultDeclaration; + declare export type ExportNamedDeclaration = BabelNodeExportNamedDeclaration; + declare export type ExportSpecifier = BabelNodeExportSpecifier; + declare export type ForOfStatement = BabelNodeForOfStatement; + declare export type ImportDeclaration = BabelNodeImportDeclaration; + declare export type ImportDefaultSpecifier = BabelNodeImportDefaultSpecifier; + declare export type ImportNamespaceSpecifier = BabelNodeImportNamespaceSpecifier; + declare export type ImportSpecifier = BabelNodeImportSpecifier; + declare export type MetaProperty = BabelNodeMetaProperty; + declare export type ClassMethod = BabelNodeClassMethod; + declare export type ObjectPattern = BabelNodeObjectPattern; + declare export type SpreadElement = BabelNodeSpreadElement; + declare export type Super = BabelNodeSuper; + declare export type TaggedTemplateExpression = BabelNodeTaggedTemplateExpression; + declare export type TemplateElement = BabelNodeTemplateElement; + declare export type TemplateLiteral = BabelNodeTemplateLiteral; + declare export type YieldExpression = BabelNodeYieldExpression; + declare export type AwaitExpression = BabelNodeAwaitExpression; + declare export type Import = BabelNodeImport; + declare export type BigIntLiteral = BabelNodeBigIntLiteral; + declare export type ExportNamespaceSpecifier = BabelNodeExportNamespaceSpecifier; + declare export type OptionalMemberExpression = BabelNodeOptionalMemberExpression; + declare export type OptionalCallExpression = BabelNodeOptionalCallExpression; + declare export type AnyTypeAnnotation = BabelNodeAnyTypeAnnotation; + declare export type ArrayTypeAnnotation = BabelNodeArrayTypeAnnotation; + declare export type BooleanTypeAnnotation = BabelNodeBooleanTypeAnnotation; + declare export type BooleanLiteralTypeAnnotation = BabelNodeBooleanLiteralTypeAnnotation; + declare export type NullLiteralTypeAnnotation = BabelNodeNullLiteralTypeAnnotation; + declare export type ClassImplements = BabelNodeClassImplements; + declare export type DeclareClass = BabelNodeDeclareClass; + declare export type DeclareFunction = BabelNodeDeclareFunction; + declare export type DeclareInterface = BabelNodeDeclareInterface; + declare export type DeclareModule = BabelNodeDeclareModule; + declare export type DeclareModuleExports = BabelNodeDeclareModuleExports; + declare export type DeclareTypeAlias = BabelNodeDeclareTypeAlias; + declare export type DeclareOpaqueType = BabelNodeDeclareOpaqueType; + declare export type DeclareVariable = BabelNodeDeclareVariable; + declare export type DeclareExportDeclaration = BabelNodeDeclareExportDeclaration; + declare export type DeclareExportAllDeclaration = BabelNodeDeclareExportAllDeclaration; + declare export type DeclaredPredicate = BabelNodeDeclaredPredicate; + declare export type ExistsTypeAnnotation = BabelNodeExistsTypeAnnotation; + declare export type FunctionTypeAnnotation = BabelNodeFunctionTypeAnnotation; + declare export type FunctionTypeParam = BabelNodeFunctionTypeParam; + declare export type GenericTypeAnnotation = BabelNodeGenericTypeAnnotation; + declare export type InferredPredicate = BabelNodeInferredPredicate; + declare export type InterfaceExtends = BabelNodeInterfaceExtends; + declare export type InterfaceDeclaration = BabelNodeInterfaceDeclaration; + declare export type InterfaceTypeAnnotation = BabelNodeInterfaceTypeAnnotation; + declare export type IntersectionTypeAnnotation = BabelNodeIntersectionTypeAnnotation; + declare export type MixedTypeAnnotation = BabelNodeMixedTypeAnnotation; + declare export type EmptyTypeAnnotation = BabelNodeEmptyTypeAnnotation; + declare export type NullableTypeAnnotation = BabelNodeNullableTypeAnnotation; + declare export type NumberLiteralTypeAnnotation = BabelNodeNumberLiteralTypeAnnotation; + declare export type NumberTypeAnnotation = BabelNodeNumberTypeAnnotation; + declare export type ObjectTypeAnnotation = BabelNodeObjectTypeAnnotation; + declare export type ObjectTypeInternalSlot = BabelNodeObjectTypeInternalSlot; + declare export type ObjectTypeCallProperty = BabelNodeObjectTypeCallProperty; + declare export type ObjectTypeIndexer = BabelNodeObjectTypeIndexer; + declare export type ObjectTypeProperty = BabelNodeObjectTypeProperty; + declare export type ObjectTypeSpreadProperty = BabelNodeObjectTypeSpreadProperty; + declare export type OpaqueType = BabelNodeOpaqueType; + declare export type QualifiedTypeIdentifier = BabelNodeQualifiedTypeIdentifier; + declare export type StringLiteralTypeAnnotation = BabelNodeStringLiteralTypeAnnotation; + declare export type StringTypeAnnotation = BabelNodeStringTypeAnnotation; + declare export type SymbolTypeAnnotation = BabelNodeSymbolTypeAnnotation; + declare export type ThisTypeAnnotation = BabelNodeThisTypeAnnotation; + declare export type TupleTypeAnnotation = BabelNodeTupleTypeAnnotation; + declare export type TypeofTypeAnnotation = BabelNodeTypeofTypeAnnotation; + declare export type TypeAlias = BabelNodeTypeAlias; + declare export type TypeAnnotation = BabelNodeTypeAnnotation; + declare export type TypeCastExpression = BabelNodeTypeCastExpression; + declare export type TypeParameter = BabelNodeTypeParameter; + declare export type TypeParameterDeclaration = BabelNodeTypeParameterDeclaration; + declare export type TypeParameterInstantiation = BabelNodeTypeParameterInstantiation; + declare export type UnionTypeAnnotation = BabelNodeUnionTypeAnnotation; + declare export type Variance = BabelNodeVariance; + declare export type VoidTypeAnnotation = BabelNodeVoidTypeAnnotation; + declare export type EnumDeclaration = BabelNodeEnumDeclaration; + declare export type EnumBooleanBody = BabelNodeEnumBooleanBody; + declare export type EnumNumberBody = BabelNodeEnumNumberBody; + declare export type EnumStringBody = BabelNodeEnumStringBody; + declare export type EnumSymbolBody = BabelNodeEnumSymbolBody; + declare export type EnumBooleanMember = BabelNodeEnumBooleanMember; + declare export type EnumNumberMember = BabelNodeEnumNumberMember; + declare export type EnumStringMember = BabelNodeEnumStringMember; + declare export type EnumDefaultedMember = BabelNodeEnumDefaultedMember; + declare export type IndexedAccessType = BabelNodeIndexedAccessType; + declare export type OptionalIndexedAccessType = BabelNodeOptionalIndexedAccessType; + declare export type JSXAttribute = BabelNodeJSXAttribute; + declare export type JSXClosingElement = BabelNodeJSXClosingElement; + declare export type JSXElement = BabelNodeJSXElement; + declare export type JSXEmptyExpression = BabelNodeJSXEmptyExpression; + declare export type JSXExpressionContainer = BabelNodeJSXExpressionContainer; + declare export type JSXSpreadChild = BabelNodeJSXSpreadChild; + declare export type JSXIdentifier = BabelNodeJSXIdentifier; + declare export type JSXMemberExpression = BabelNodeJSXMemberExpression; + declare export type JSXNamespacedName = BabelNodeJSXNamespacedName; + declare export type JSXOpeningElement = BabelNodeJSXOpeningElement; + declare export type JSXSpreadAttribute = BabelNodeJSXSpreadAttribute; + declare export type JSXText = BabelNodeJSXText; + declare export type JSXFragment = BabelNodeJSXFragment; + declare export type JSXOpeningFragment = BabelNodeJSXOpeningFragment; + declare export type JSXClosingFragment = BabelNodeJSXClosingFragment; + declare export type Noop = BabelNodeNoop; + declare export type Placeholder = BabelNodePlaceholder; + declare export type V8IntrinsicIdentifier = BabelNodeV8IntrinsicIdentifier; + declare export type ArgumentPlaceholder = BabelNodeArgumentPlaceholder; + declare export type BindExpression = BabelNodeBindExpression; + declare export type ClassProperty = BabelNodeClassProperty; + declare export type PipelineTopicExpression = BabelNodePipelineTopicExpression; + declare export type PipelineBareFunction = BabelNodePipelineBareFunction; + declare export type PipelinePrimaryTopicReference = BabelNodePipelinePrimaryTopicReference; + declare export type ClassPrivateProperty = BabelNodeClassPrivateProperty; + declare export type ClassPrivateMethod = BabelNodeClassPrivateMethod; + declare export type ImportAttribute = BabelNodeImportAttribute; + declare export type Decorator = BabelNodeDecorator; + declare export type DoExpression = BabelNodeDoExpression; + declare export type ExportDefaultSpecifier = BabelNodeExportDefaultSpecifier; + declare export type PrivateName = BabelNodePrivateName; + declare export type RecordExpression = BabelNodeRecordExpression; + declare export type TupleExpression = BabelNodeTupleExpression; + declare export type DecimalLiteral = BabelNodeDecimalLiteral; + declare export type StaticBlock = BabelNodeStaticBlock; + declare export type ModuleExpression = BabelNodeModuleExpression; + declare export type TSParameterProperty = BabelNodeTSParameterProperty; + declare export type TSDeclareFunction = BabelNodeTSDeclareFunction; + declare export type TSDeclareMethod = BabelNodeTSDeclareMethod; + declare export type TSQualifiedName = BabelNodeTSQualifiedName; + declare export type TSCallSignatureDeclaration = BabelNodeTSCallSignatureDeclaration; + declare export type TSConstructSignatureDeclaration = BabelNodeTSConstructSignatureDeclaration; + declare export type TSPropertySignature = BabelNodeTSPropertySignature; + declare export type TSMethodSignature = BabelNodeTSMethodSignature; + declare export type TSIndexSignature = BabelNodeTSIndexSignature; + declare export type TSAnyKeyword = BabelNodeTSAnyKeyword; + declare export type TSBooleanKeyword = BabelNodeTSBooleanKeyword; + declare export type TSBigIntKeyword = BabelNodeTSBigIntKeyword; + declare export type TSIntrinsicKeyword = BabelNodeTSIntrinsicKeyword; + declare export type TSNeverKeyword = BabelNodeTSNeverKeyword; + declare export type TSNullKeyword = BabelNodeTSNullKeyword; + declare export type TSNumberKeyword = BabelNodeTSNumberKeyword; + declare export type TSObjectKeyword = BabelNodeTSObjectKeyword; + declare export type TSStringKeyword = BabelNodeTSStringKeyword; + declare export type TSSymbolKeyword = BabelNodeTSSymbolKeyword; + declare export type TSUndefinedKeyword = BabelNodeTSUndefinedKeyword; + declare export type TSUnknownKeyword = BabelNodeTSUnknownKeyword; + declare export type TSVoidKeyword = BabelNodeTSVoidKeyword; + declare export type TSThisType = BabelNodeTSThisType; + declare export type TSFunctionType = BabelNodeTSFunctionType; + declare export type TSConstructorType = BabelNodeTSConstructorType; + declare export type TSTypeReference = BabelNodeTSTypeReference; + declare export type TSTypePredicate = BabelNodeTSTypePredicate; + declare export type TSTypeQuery = BabelNodeTSTypeQuery; + declare export type TSTypeLiteral = BabelNodeTSTypeLiteral; + declare export type TSArrayType = BabelNodeTSArrayType; + declare export type TSTupleType = BabelNodeTSTupleType; + declare export type TSOptionalType = BabelNodeTSOptionalType; + declare export type TSRestType = BabelNodeTSRestType; + declare export type TSNamedTupleMember = BabelNodeTSNamedTupleMember; + declare export type TSUnionType = BabelNodeTSUnionType; + declare export type TSIntersectionType = BabelNodeTSIntersectionType; + declare export type TSConditionalType = BabelNodeTSConditionalType; + declare export type TSInferType = BabelNodeTSInferType; + declare export type TSParenthesizedType = BabelNodeTSParenthesizedType; + declare export type TSTypeOperator = BabelNodeTSTypeOperator; + declare export type TSIndexedAccessType = BabelNodeTSIndexedAccessType; + declare export type TSMappedType = BabelNodeTSMappedType; + declare export type TSLiteralType = BabelNodeTSLiteralType; + declare export type TSExpressionWithTypeArguments = BabelNodeTSExpressionWithTypeArguments; + declare export type TSInterfaceDeclaration = BabelNodeTSInterfaceDeclaration; + declare export type TSInterfaceBody = BabelNodeTSInterfaceBody; + declare export type TSTypeAliasDeclaration = BabelNodeTSTypeAliasDeclaration; + declare export type TSAsExpression = BabelNodeTSAsExpression; + declare export type TSTypeAssertion = BabelNodeTSTypeAssertion; + declare export type TSEnumDeclaration = BabelNodeTSEnumDeclaration; + declare export type TSEnumMember = BabelNodeTSEnumMember; + declare export type TSModuleDeclaration = BabelNodeTSModuleDeclaration; + declare export type TSModuleBlock = BabelNodeTSModuleBlock; + declare export type TSImportType = BabelNodeTSImportType; + declare export type TSImportEqualsDeclaration = BabelNodeTSImportEqualsDeclaration; + declare export type TSExternalModuleReference = BabelNodeTSExternalModuleReference; + declare export type TSNonNullExpression = BabelNodeTSNonNullExpression; + declare export type TSExportAssignment = BabelNodeTSExportAssignment; + declare export type TSNamespaceExportDeclaration = BabelNodeTSNamespaceExportDeclaration; + declare export type TSTypeAnnotation = BabelNodeTSTypeAnnotation; + declare export type TSTypeParameterInstantiation = BabelNodeTSTypeParameterInstantiation; + declare export type TSTypeParameterDeclaration = BabelNodeTSTypeParameterDeclaration; + declare export type TSTypeParameter = BabelNodeTSTypeParameter; + declare export type Expression = BabelNodeExpression; + declare export type Binary = BabelNodeBinary; + declare export type Scopable = BabelNodeScopable; + declare export type BlockParent = BabelNodeBlockParent; + declare export type Block = BabelNodeBlock; + declare export type Statement = BabelNodeStatement; + declare export type Terminatorless = BabelNodeTerminatorless; + declare export type CompletionStatement = BabelNodeCompletionStatement; + declare export type Conditional = BabelNodeConditional; + declare export type Loop = BabelNodeLoop; + declare export type While = BabelNodeWhile; + declare export type ExpressionWrapper = BabelNodeExpressionWrapper; + declare export type For = BabelNodeFor; + declare export type ForXStatement = BabelNodeForXStatement; + declare export type Function = BabelNodeFunction; + declare export type FunctionParent = BabelNodeFunctionParent; + declare export type Pureish = BabelNodePureish; + declare export type Declaration = BabelNodeDeclaration; + declare export type PatternLike = BabelNodePatternLike; + declare export type LVal = BabelNodeLVal; + declare export type TSEntityName = BabelNodeTSEntityName; + declare export type Literal = BabelNodeLiteral; + declare export type Immutable = BabelNodeImmutable; + declare export type UserWhitespacable = BabelNodeUserWhitespacable; + declare export type Method = BabelNodeMethod; + declare export type ObjectMember = BabelNodeObjectMember; + declare export type Property = BabelNodeProperty; + declare export type UnaryLike = BabelNodeUnaryLike; + declare export type Pattern = BabelNodePattern; + declare export type Class = BabelNodeClass; + declare export type ModuleDeclaration = BabelNodeModuleDeclaration; + declare export type ExportDeclaration = BabelNodeExportDeclaration; + declare export type ModuleSpecifier = BabelNodeModuleSpecifier; + declare export type Flow = BabelNodeFlow; + declare export type FlowType = BabelNodeFlowType; + declare export type FlowBaseAnnotation = BabelNodeFlowBaseAnnotation; + declare export type FlowDeclaration = BabelNodeFlowDeclaration; + declare export type FlowPredicate = BabelNodeFlowPredicate; + declare export type EnumBody = BabelNodeEnumBody; + declare export type EnumMember = BabelNodeEnumMember; + declare export type JSX = BabelNodeJSX; + declare export type Private = BabelNodePrivate; + declare export type TSTypeElement = BabelNodeTSTypeElement; + declare export type TSType = BabelNodeTSType; + declare export type TSBaseType = BabelNodeTSBaseType; +} diff --git a/flow-typed/npm/babel_v7.x.x.js b/flow-typed/npm/babel_v7.x.x.js new file mode 100644 index 00000000000000..c0d9d133dd81c3 --- /dev/null +++ b/flow-typed/npm/babel_v7.x.x.js @@ -0,0 +1,1328 @@ +/** + * 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 + * @format + */ + +'use strict'; + +type _BabelSourceMap = $ReadOnly<{ + file?: string, + mappings: string, + names: Array, + sourceRoot?: string, + sources: Array, + sourcesContent?: Array, + version: number, +}>; + +type _BabelSourceMapSegment = { + generated: {column: number, line: number, ...}, + name?: ?string, + original?: {column: number, line: number, ...}, + source?: ?string, + ... +}; + +export type BabelSourceLocation = $ReadOnly<{ + start: $ReadOnly<{line: number, column: number}>, + end: $ReadOnly<{line: number, column: number}>, +}>; + +declare module '@babel/parser' { + // See https://github.com/babel/babel/blob/master/packages/babel-parser/typings/babel-parser.d.ts + declare export type ParserPlugin = + | 'asyncGenerators' + | 'bigInt' + | 'classPrivateMethods' + | 'classPrivateProperties' + | 'classProperties' + | 'decorators' + | 'decorators-legacy' + | 'doExpressions' + | 'dynamicImport' + | 'estree' + | 'exportDefaultFrom' + | 'exportNamespaceFrom' // deprecated + | 'flow' + | 'flowComments' + | 'functionBind' + | 'functionSent' + | 'importMeta' + | 'jsx' + | 'logicalAssignment' + | 'moduleAttributes' + | 'nullishCoalescingOperator' + | 'numericSeparator' + | 'objectRestSpread' + | 'optionalCatchBinding' + | 'optionalChaining' + | 'partialApplication' + | 'pipelineOperator' + | 'placeholders' + | 'privateIn' + | 'throwExpressions' + | 'topLevelAwait' + | 'typescript' + | 'v8intrinsic' + | ParserPluginWithOptions; + + declare export type ParserPluginWithOptions = + | ['decorators', DecoratorsPluginOptions] + | ['pipelineOperator', PipelineOperatorPluginOptions] + | ['flow', FlowPluginOptions]; + + declare type DecoratorsPluginOptions = { + decoratorsBeforeExport?: boolean, + }; + + declare type PipelineOperatorPluginOptions = { + proposal: 'minimal' | 'smart', + }; + + declare type FlowPluginOptions = { + all?: boolean, + enums?: boolean, + }; + + declare export type ParserOptions = { + /** + * By default, import and export declarations can only appear at a program's top level. + * Setting this option to true allows them anywhere where a statement is allowed. + * @default false + */ + allowImportExportEverywhere?: boolean, + + /** + * By default, await use is only allowed inside of an async function or, when the topLevelAwait plugin is enabled, in the top-level scope of modules. + * Set this to true to also accept it in the top-level scope of scripts. + * @default false + */ + allowAwaitOutsideFunction?: boolean, + + /** + * By default, a return statement at the top level raises an error. Set this to true to accept such code. + * @default false + */ + allowReturnOutsideFunction?: boolean, + + /** + * By default, super use is not allowed outside of class and object methods. Set this to true to accept such code. + * @default false + */ + allowSuperOutsideMethod?: boolean, + + /** + * By default, exporting an identifier that was not declared in the current module scope will raise an error. + * While this behavior is required by the ECMAScript modules specification, + * Babel's parser cannot anticipate transforms later in the plugin pipeline that might insert the appropriate declarations, + * so it is sometimes important to set this option to true to prevent the parser from prematurely complaining about undeclared exports that will be added later. + * @default false + */ + allowUndeclaredExports?: boolean, + + /** + * By default, the parser sets extra.parenthesized on the expression nodes. + * When this option is set to true, ParenthesizedExpression AST nodes are created instead. + * @default false + */ + createParenthesizedExpressions?: boolean, + + /** + * By default, Babel always throws an error when it finds some invalid code. + * When this option is set to true, it will store the parsing error and try to continue parsing the invalid input file. + * The resulting AST will have an errors property representing an array of all the parsing errors. + * Note that even when this option is enabled, @babel/parser could throw for unrecoverable errors. + * @default false + */ + errorRecovery?: boolean, + + /** + * Array containing the plugins that you want to enable. + */ + plugins?: Array, + + /** + * Indicate the mode the code should be parsed in. Can be one of "script", "module", or "unambiguous". + * Defaults to "script". "unambiguous" will make @babel/parser attempt to guess, based on the presence of ES6 import or export statements. + * Files with ES6 imports and exports are considered "module" and are otherwise "script". + * @default 'script' + */ + sourceType?: 'script' | 'module' | 'unambiguous', + + /** + * Correlate output AST nodes with their source filename. + * Useful when generating code and source maps from the ASTs of multiple input files. + */ + sourceFilename?: string, + + /** + * By default, the first line of code parsed is treated as line 1. + * You can provide a line number to alternatively start with. Useful for integration with other source tools. + * @default 1 + */ + startLine?: number, + + /** + * By default, ECMAScript code is parsed as strict only if a "use strict"; directive is present or if the parsed file is an ECMAScript module. + * Set this option to true to always parse files in strict mode. + * @default false + */ + strictMode?: boolean, + + /** + * Adds a range property to each node: [node.start, node.end] + * @default false + */ + ranges?: boolean, + + /** + * Adds all parsed tokens to a tokens property on the File node + * default false + */ + tokens?: boolean, + }; + + /** + * Parse the provided code as an entire ECMAScript program. + */ + declare export function parse( + input: string, + options?: ParserOptions, + ): BabelNodeFile; + + /** + * Parse the provided code as a single expression. + */ + declare export function parseExpression( + input: string, + options?: ParserOptions, + ): BabelNodeExpression; + + declare type TokenOptions = { + keyword?: string, + beforeExpr?: boolean, + startsExpr?: boolean, + rightAssociative?: boolean, + isLoop?: boolean, + isAssign?: boolean, + prefix?: boolean, + postfix?: boolean, + binop?: ?number, + }; + + declare class TokenType { + label: string; + keyword: ?string; + beforeExpr: boolean; + startsExpr: boolean; + rightAssociative: boolean; + isLoop: boolean; + isAssign: boolean; + prefix: boolean; + postfix: boolean; + binop: ?number; + updateContext: ?(prevType: TokenType) => void; + + constructor(label: string, conf?: TokenOptions): TokenType; + } + + declare export var tokTypes: {[name: string]: TokenType}; +} + +declare module '@babel/core' { + import type {Visitor, Scope, Hub, NodePath} from '@babel/traverse'; + import type {ParserOptions} from '@babel/parser'; + import typeof {tokTypes as TokTypes} from '@babel/parser'; + import type {Options as GeneratorOptions} from '@babel/generator'; + import typeof Template from '@babel/template'; + import typeof Traverse from '@babel/traverse'; + import typeof * as Types from '@babel/types'; + + declare export var version: string; + declare export var tokTypes: TokTypes; + + declare type ImportSpecifier = + | { + kind: 'named', + imported: string, + local: string, + } + | { + kind: 'namespace', + local: string, + }; + + declare type ExportSpecifier = + | { + kind: 'local', + name: string, + exported: string, + } + | { + kind: 'external', + local: string, + exported: string, + source: string | null, + } + | { + kind: 'external-namespace', + exported: string, + source: string | null, + } + | { + kind: 'external-all', + source: string | null, + }; + + declare export type BabelFileModulesMetadata = { + imports: Array<{ + source: string, + imported: Array, + specifiers: Array, + }>, + exports: { + exported: Array, + specifiers: Array, + }, + }; + + declare export type BabelFileMetadata = { + usedHelpers?: Array, + marked?: Array<{ + type: string, + message: string, + loc: BabelNodeSourceLocation, + }>, + modules?: BabelFileModulesMetadata, + ... + }; + + declare class Store { + constructor(): Store; + setDynamic(key: string, fn: () => mixed): void; + set(key: string, val: mixed): void; + get(key: string): mixed; + } + + declare export class File extends Store { + static helpers: Array; + + opts: BabelCoreOptions; + pluginPasses: Array>; + parserOpts: ParserOptions; + dynamicImportTypes: {...}; + dynamicImportIds: {...}; + dynamicImports: Array<{...}>; + declarations: {...}; + usedHelpers: {...}; + code: string; + shebang: string; + ast: BabelNode | {}; + scope: Scope; + hub: Hub; + path: NodePath<> | null; + metadata: BabelFileMetadata; + + constructor( + options: BabelCoreOptions, + input: $ReadOnly<{ast: BabelNode, code: string, inputMap: any}>, + ): File; + + getMetadata(): void; + + getModuleName(): ?string; + + resolveModuleSource(source: string): string; + + addImport( + source: string, + imported: string, + name?: string, + ): BabelNodeIdentifier; + + addHelper(name: string): BabelNodeIdentifier; + + addTemplateObject( + helperName: string, + strings: Array<{...}>, + raw: BabelNodeArrayExpression, + ): BabelNodeIdentifier; + + buildCodeFrameError( + node: BabelNode, + msg: string, + Class, + ): TError; + + mergeSourceMap(map: _BabelSourceMap): _BabelSourceMap; + + parse(code: string): BabelNode; + + addAst(ast: BabelNode): void; + + transform(): TransformResult<>; + + wrap(code: string, callback: () => mixed): TransformResult<>; + + addCode(code: string): void; + + parseCode(): void; + + parseInputSourceMap(code: string): string; + + parseShebang(): void; + + makeResult(TransformResult): TransformResult; + + generate(): TransformResult<>; + } + + declare export type MatchPattern = + | string + | RegExp + | (( + filename: string | void, + context: {caller: {name: string} | void}, + envName: string, + dirname: string, + ) => boolean); + + declare export type PluginObj = { + name?: string, + inherits?: mixed, + maniuplateOptions?: ( + opts: BabelCoreOptions, + parserOpts: ParserOptions, + ) => void, + // this is a PluginPass + pre?: (file: File) => void, + visitor: Visitor, + // this is a PluginPass + post?: (file: File) => void, + }; + + // Represents a plugin or presets at a given location in a config object. + // At this point these have been resolved to a specific object or function, + // but have not yet been executed to call functions with options. + declare export type UnloadedDescriptor = { + name: string | void, + value: PluginObj | (() => PluginObj), + options: EntryOptions, + dirname: string, + alias: string, + ownPass?: boolean, + file?: { + request: string, + resolved: string, + } | void, + }; + + declare export class ConfigItem { + +value: PluginObj | (() => PluginObj); + +options: EntryOptions; + +dirname: string; + +name: string | void; + +file: { + +request: string, + +resolved: string, + } | void; + + constructor(descriptor: UnloadedDescriptor): ConfigItem; + } + + declare export type EntryTarget = string | {...} | Function; + declare export type EntryOptions = {...} | false | void; + declare export type PluginEntry = + | EntryTarget + | ConfigItem + | [EntryTarget] + | [EntryTarget, EntryOptions] + | [EntryTarget, EntryOptions, string | void]; + + declare export type Plugins = Array; + declare export type PresetEntry = PluginEntry; + declare export type Presets = Array; + + // See https://babeljs.io/docs/en/next/options#code-generator-options + declare export type BabelCoreOptions = {| + // Primary options + + /** + * The working directory that all paths in the programmatic options will be resolved relative to. + * default process.cwd() + */ + cwd?: string, + + caller?: { + name: string, + supportsStaticESM?: boolean, + supportsDynamicImport?: boolean, + supportsTopLevelAwait?: boolean, + supportsExportNamespaceFrom?: boolean, + ... + }, + + /** + * The filename associated with the code currently being compiled, if there is one. + * The filename is optional, but not all of Babel's functionality is available when the filename is unknown, because a subset of options rely on the filename for their functionality. + * + * The three primary cases users could run into are: + * - The filename is exposed to plugins. Some plugins may require the presence of the filename. + * - Options like "test", "exclude", and "ignore" require the filename for string/RegExp matching. + * - .babelrc.json files are loaded relative to the file being compiled. If this option is omitted, Babel will behave as if babelrc: false has been set. + */ + filename?: string, + + /** + * Used as the default value for Babel's sourceFileName option, and used as part of generation of filenames for the AMD / UMD / SystemJS module transforms. + * @default path.relative(opts.cwd, opts.filename) (if opts.filename was passed) + */ + filenameRelative?: string, + + /** + * Babel's default return value includes code and map properties with the resulting generated code. + * In some contexts where multiple calls to Babel are being made, + * it can be helpful to disable code generation and instead use ast: true to get the AST directly in order to avoid doing unnecessary work. + * @default true + */ + code?: boolean, + + /** + * Babel's default is to generate a string and a sourcemap, but in some contexts it can be useful to get the AST itself. + * The primary use case for this would be a chain of multiple transform passes. + * @default false + */ + ast?: boolean, + + /** + * By default babel.transformFromAst will clone the input AST to avoid mutations. + * Specifying cloneInputAst: false can improve parsing performance if the input AST is not used elsewhere. + */ + cloneInputAst?: boolean, + + // Config Loading options + + /** + * The initial path that will be processed based on the "rootMode" to determine the conceptual root folder for the current Babel project. + * This is used in two primary cases: + * + * - The base directory when checking for the default "configFile" value + * - The default value for "babelrcRoots". + * @default opts.cwd + */ + root?: string, + + /** + * This option, combined with the "root" value, defines how Babel chooses its project root. + * The different modes define different ways that Babel can process the "root" value to get the final project root. + * - "root" - Passes the "root" value through as unchanged. + * - "upward" - Walks upward from the "root" directory, looking for a directory containing a babel.config.json file, + * and throws an error if a babel.config.json is not found. + * - "upward-optional" - Walk upward from the "root" directory, looking for a directory containing a babel.config.json file, + * and falls back to "root" if a babel.config.json is not found. + * + * "root" is the default mode because it avoids the risk that Babel will accidentally load a babel.config.json + * that is entirely outside of the current project folder. If you use "upward-optional", + * be aware that it will walk up the directory structure all the way to the filesystem root, + * and it is always possible that someone will have a forgotten babel.config.json in their home directory, + * which could cause unexpected errors in your builds. + * + * Users with monorepo project structures that run builds/tests on a per-package basis may well want to use "upward" + * since monorepos often have a babel.config.json in the project root. + * Running Babel in a monorepo subdirectory without "upward", + * will cause Babel to skip loading any babel.config.json files in the project root, + * which can lead to unexpected errors and compilation failure. + * @default "root" + */ + rootMode?: 'root' | 'upward' | 'upward-optional', + + /** + * The current active environment used during configuration loading. + * This value is used as the key when resolving "env" configs, and is also available inside configuration functions, + * plugins, and presets, via the api.env() function. + * @default process.env.BABEL_ENV || process.env.NODE_ENV || "development" + */ + envName?: string, + + /** + * Defaults to searching for a default babel.config.json file, but can be passed the path of any JS or JSON5 config file. + * + * NOTE: This option does not affect loading of .babelrc.json files, so while it may be tempting to do configFile: "./foo/.babelrc.json", + * it is not recommended. If the given .babelrc.json is loaded via the standard file-relative logic, + * you'll end up loading the same config file twice, merging it with itself. + * If you are linking a specific config file, it is recommended to stick with a naming scheme that is independent of the "babelrc" name. + * + * @default path.resolve(opts.root, "babel.config.json"), if exists, false otherwise + */ + configFile?: string | boolean, + + /** + * true will enable searching for configuration files relative to the "filename" provided to Babel. + * A babelrc value passed in the programmatic options will override one set within a configuration file. + * + * Note: .babelrc.json files are only loaded if the current "filename" is inside of a package that matches one of the "babelrcRoots" packages. + * + * @default true as long as the filename option has been specified + */ + babelrc?: boolean, + + /** + * By default, Babel will only search for .babelrc.json files within the "root" package + * because otherwise Babel cannot know if a given .babelrc.json is meant to be loaded, + * or if it's "plugins" and "presets" have even been installed, since the file being compiled could be inside node_modules, + * or have been symlinked into the project. + * + * This option allows users to provide a list of other packages that should be considered "root" packages + * when considering whether to load .babelrc.json files. + * + * @default opts.root + */ + babelrcRoots?: boolean | MatchPattern | Array, + + // Plugin and Preset options + + /** + * An array of plugins to activate when processing this file. + * For more information on how individual entries interact, especially when used across multiple nested "env" and "overrides" configs, + * see merging. + * + * Note: The option also allows Plugin instances from Babel itself, but using these directly is not recommended. + * If you need to create a persistent representation of a plugin or preset, you should use babel.createConfigItem(). + * + * @default [] + */ + plugins?: Plugins, + + /** + * An array of presets to activate when processing this file. + * For more information on how individual entries interact, + * especially when used across multiple nested "env" and "overrides" configs, see merging. + * + * Note: The format of presets is identical to plugins, + * except for the fact that name normalization expects "preset-" instead of "plugin-", and presets cannot be instances of Plugin. + * + * @default [] + */ + presets?: Presets, + + /** + * Instructs Babel to run each of the presets in the presets array as an independent pass. + * This option tends to introduce a lot of confusion around the exact ordering of plugins, + * but can be useful if you absolutely need to run a set of operations as independent compilation passes. + * + * Note: This option may be removed in future Babel versions as we add better support for defining ordering between plugins. + * + * @default false + * @deprecated + */ + passPerPreset?: boolean, + + // Output targets + + /** + * Describes the environments you support/target for your project. + * When no targets are specified: Babel will assume you are targeting the oldest browsers possible. For example, @babel/preset-env will transform all ES2015-ES2020 code to be ES5 compatible. + */ + targets?: + | string + | Array + | {[env: string]: string} + | { + esmodules?: boolean, + node?: string | 'current' | true, + safari?: string | 'tp', + browsers?: string | Array, + }, + + /** + * Toggles whether or not browserslist config sources are used, + * which includes searching for any browserslist files or referencing the browserslist key inside package.json. + * This is useful for projects that use a browserslist config for files that won't be compiled with Babel. + * + * If a string is specified, it must represent the path of a browserslist configuration file. + * Relative paths are resolved relative to the configuration file which specifies this option, + * or to cwd when it's passed as part of the programmatic options. + */ + browserslistConfigFile?: boolean | string, + + /** + * The Browserslist environment to use. + * + * @see https://github.com/browserslist/browserslist#configuring-for-different-environments + */ + browserslistEnv?: string | void, + + // Config Merging options + + /** + * Configs may "extend" other configuration files. + * Config fields in the current config will be merged on top of the extended file's configuration. + */ + extends?: string, + + /** + * Placement: May not be nested inside of another env block. + * + * Allows for entire nested configuration options that will only be enabled if the envKey matches the envName option. + * + * Note: env[envKey] options will be merged on top of the options specified in the root object. + */ + env?: {[envKey: string]: BabelCoreOptions}, + + /** + * Placement: May not be nested inside of another overrides object, or within an env block. + * + * Allows users to provide an array of options that will be merged into the current configuration one at a time. + * This feature is best used alongside the "test"/"include"/"exclude" options to provide conditions for which an override should apply. + * For example: + * + * ``` + * overrides: [{ + * test: "./vendor/large.min.js", + * compact: true, + * }], + * ``` + * + * could be used to enable the compact option for one specific file that is known to be large and minified, + * and tell Babel not to bother trying to print the file nicely. + */ + overrides?: Array, + + /** + * If all patterns fail to match, the current configuration object is considered inactive and is ignored during config processing. + * This option is most useful when used within an overrides option object, but it's allowed anywhere. + * + * Note: These toggles do not affect the programmatic and config-loading options in earlier sections, + * since they are taken into account long before the configuration that is prepared for merging. + */ + test?: MatchPattern | Array, + + /** + * This option is a synonym for "test". + */ + include?: MatchPattern | Array, + + /** + * If any of patterns match, the current configuration object is considered inactive and is ignored during config processing. + * This option is most useful when used within an overrides option object, but it's allowed anywhere. + * + * Note: These toggles do not affect the programmatic and config-loading options in earlier sections, + * since they are taken into account long before the configuration that is prepared for merging. + */ + exclude?: MatchPattern | Array, + + /** + * If any of the patterns match, Babel will immediately stop all processing of the current build. + * For example, a user may want to do something like: `ignore: ['./lib']` to explicitly disable Babel compilation of files inside the lib directory. + * + * Note: This option disables all Babel processing of a file. While that has its uses, + * it is also worth considering the "exclude" option as a less aggressive alternative. + */ + ignore?: MatchPattern | Array, + + /** + * If all of the patterns fail to match, Babel will immediately stop all processing of the current build. + * For example, a user may want to do something like `only: ['./src']` to explicitly enable Babel compilation of files inside the src directory while disabling everything else. + * + * Note: This option disables all Babel processing of a file. While that has its uses, + * it is also worth considering the "test"/"include" options as a less aggressive alternative. + */ + only?: MatchPattern | Array, + + // Source Map options + + /** + * true will attempt to load an input sourcemap from the file itself, if it contains a //# sourceMappingURL=... comment. + * If no map is found, or the map fails to load and parse, it will be silently discarded. + * + * If an object is provided, it will be treated as the source map object itself. + * + * @default true + */ + inputSourceMap?: boolean | _BabelSourceMap, + + /** + * - true to generate a sourcemap for the code and include it in the result object. + * - "inline" to generate a sourcemap and append it as a data URL to the end of the code, but not include it in the result object. + * - "both" is the same as inline, but will include the map in the result object. + * + * @babel/cli overloads some of these to also affect how maps are written to disk: + * - true will write the map to a .map file on disk + * - "inline" will write the file directly, so it will have a data: containing the map + * - "both" will write the file with a data: URL and also a .map. + * + * Note: These options are bit weird, so it may make the most sense to just use true and handle the rest in your own code, depending on your use case. + * + * @default true + */ + sourceMaps?: boolean | 'inline' | 'both', + + /** + * This is an synonym for sourceMaps. Using sourceMaps is recommended. + */ + sourceMap?: boolean, + + /** + * The name to use for the file inside the source map object. + * @default path.basename(opts.filenameRelative) when available, or "unknown" + */ + sourceFileName?: string, + + /** + * The sourceRoot fields to set in the generated source map, if one is desired. + */ + sourceRoot?: string, + + // Misc options + + /** + * - "script" - Parse the file using the ECMAScript Script grammar. No import/export statements allowed, and files are not in strict mode. + * - "module" - Parse the file using the ECMAScript Module grammar. Files are automatically strict, and import/export statements are allowed. + * - "unambiguous" - Consider the file a "module" if import/export statements are present, or else consider it a "script". + * + * unambiguous can be quite useful in contexts where the type is unknown, + * but it can lead to false matches because it's perfectly valid to have a module file that does not use import/export statements. + * + * This option is important because the type of the current file affects both parsing of input files, + * and certain transforms that may wish to add import/require usage to the current file. + * + * For instance, @babel/plugin-transform-runtime relies on the type of the current document to decide whether to insert an import declaration, + * or a require() call. @babel/preset-env also does the same for its "useBuiltIns" option. + * Since Babel defaults to treating files are ES modules, generally these plugins/presets will insert import statements. + * Setting the correct sourceType can be important because having the wrong type + * can lead to cases where Babel would insert import statements into files that are meant to be CommonJS files. + * This can be particularly important in projects where compilation of node_modules dependencies is being performed, + * because inserting an import statements can cause Webpack and other tooling to see a file as an ES module, + * breaking what would otherwise be a functional CommonJS file. + * + * Note: This option will not affect parsing of .mjs files, as they are currently hard-coded to always parse as "module" files. + * + * @default 'module' + */ + sourceType?: 'script' | 'module' | 'unambiguous', + + /** + * Highlight tokens in code snippets in Babel's error messages to make them easier to read. + * + * @default true + */ + highlightCode?: boolean, + + /** + * Set assumptions that Babel can make in order to produce smaller output + * @see https://babel.dev/assumptions + */ + assumptions?: {[assumption: string]: boolean}, + + /** + * Allows users to add a wrapper on each visitor in order to inspect the visitor process as Babel executes the plugins. + * + * - key is a simple opaque string that represents the plugin being executed. + * - nodeType is the type of AST node currently being visited. + * - fn is the visitor function itself. + * + * Users can return a replacement function that should call the original function after performing whatever logging + * and analysis they wish to do. + */ + wrapPluginVisitorMethod?: ( + key: string, + nodeType: BabelNode['type'], + fn: Function, + ) => Function, + + /** + * An opaque object containing options to pass through to the parser being used. + */ + parserOpts?: ParserOptions, + + /** + * An opaque object containing options to pass through to the code generator being used. + */ + generatorOpts?: GeneratorOptions, + + // Code Generator options + + /** + * Optional string to add as a block comment at the start of the output file + */ + auxiliaryCommentBefore?: string, + + /** + * Optional string to add as a block comment at the end of the output file + */ + auxiliaryCommentAfter?: string, + + /** + * Function that takes a comment (as a string) and returns true if the comment should be included in the output. + * By default, comments are included if opts.comments is true or if opts.minified is false and the comment contains @preserve or @license + */ + shouldPrintComment?: (comment: string) => boolean, + + /** + * Attempt to use the same line numbers in the output code as in the source code (helps preserve stack traces) + * @default false + */ + retainLines?: boolean, + + /** + * Should comments be included in output + * @default true + */ + comments?: boolean, + + /** + * Set to true to avoid adding whitespace for formatting + * @default opts.minified + */ + compact?: boolean | 'auto', + + /** + * Should the output be minified + * @default false + */ + minified?: boolean, + + // AMD / UMD / SystemJS module options + + /** + * Enables module ID generation. + * + * @default !!opts.moduleId + */ + moduleIds?: boolean, + + /** + * A hard-coded ID to use for the module. Cannot be used alongside getModuleId. + */ + moduleId?: string, + + /** + * Given the babel-generated module name, return the name to use. Returning a falsy value will use the original name. + */ + getModuleId?: (name: string) => string, + + /** + * A root path to include on generated module names. + */ + moduleRoot?: string, + |}; + + declare export type TransformResult = {| + metadata: T, + options: BabelCoreOptions, + code: string, + map: _BabelSourceMap | null, + ast: BabelNodeFile | null, + ignored?: boolean, + |}; + + declare type TransformCallback = + | ((Error, null) => mixed) + | ((null, TransformResult | null) => mixed); + + /** + * Transforms the passed in code. Calling a callback with an object with the generated code, source map, and AST. + */ + declare export function transform( + code: string, + options: ?BabelCoreOptions, + callback: TransformCallback, + ): void; + + /*** + * Transforms the passed in code. Returning an object with the generated code, source map, and AST. + */ + declare export function transformSync( + code: string, + options?: BabelCoreOptions, + ): TransformResult; + + /** + * Transforms the passed in code. Returning an promise for an object with the generated code, source map, and AST. + */ + declare export function transformAsync( + code: string, + options?: BabelCoreOptions, + ): Promise>; + + /** + * Asynchronously transforms the entire contents of a file. + */ + declare export function transformFile( + filename: string, + options?: BabelCoreOptions, + callback: TransformCallback, + ): void; + + /** + * Synchronous version of babel.transformFile. Returns the transformed contents of the filename. + */ + declare export function transformFileSync( + filename: string, + options?: BabelCoreOptions, + ): TransformResult; + + /** + * Promise version of babel.transformFile. Returns a promise for the transformed contents of the filename. + */ + declare export function transformFileAsync( + filename: string, + options?: BabelCoreOptions, + ): Promise>; + + /** + * Given an AST, transform it. + */ + declare export function transformFromAst( + ast: BabelNodeFile | BabelNodeProgram, + code?: string, + options?: BabelCoreOptions, + callback: TransformCallback, + ): void; + + /** + * Given an AST, transform it. + */ + declare export function transformFromAstSync( + ast: BabelNodeFile | BabelNodeProgram, + code?: string, + options?: BabelCoreOptions, + ): TransformResult; + + /** + * Given an AST, transform it. + */ + declare export function transformFromAstAsync( + ast: BabelNodeFile | BabelNodeProgram, + code?: string, + options?: BabelCoreOptions, + ): Promise>; + + /** + * Given some code, parse it using Babel's standard behavior. Referenced presets and plugins will be loaded such that optional syntax plugins are automatically enabled. + */ + declare export function parse( + code: string, + options?: BabelCoreOptions, + callback: ((error: Error) => void) | ((void, BabelNodeFile) => void), + ): void; + + declare export function parseSync( + code: string, + options?: BabelCoreOptions, + ): BabelNodeFile; + + declare export function parseAsync( + code: string, + options?: BabelCoreOptions, + ): Promise; + + declare export var template: Template; + declare export var traverse: Traverse; + declare export var types: Types; + declare export var DEFAULT_EXTENSIONS: $ReadOnlyArray; + + declare export function buildExternalHelpers( + whitelist?: Array, + outputType?: 'global' | 'module' | 'umd' | 'var', + ): string; + + declare export function getEnv(defaultValue?: string): string; + + declare export function resolvePlugin( + name: string, + dirname: string, + ): string | null; + + declare export function resolvePreset( + name: string, + dirname: string, + ): string | null; + + declare export function createConfigItem( + value: + | EntryTarget + | [EntryTarget, EntryOptions] + | [EntryTarget, EntryOptions, string | void], + options: ?{ + dirname?: string, + type?: 'preset' | 'plugin', + }, + ): ConfigItem; + + declare export type ResolvedConfig = { + options: BabelCoreOptions, + passes: Array | (() => PluginObj)>>, + }; + + declare export function loadOptions( + options?: mixed, + callback: + | ((error: Error, null) => mixed) + | ((null, config: ResolvedConfig | null) => mixed), + ): void; + declare export function loadOptionsSync( + options?: mixed, + ): ResolvedConfig | null; + declare export function loadOptionsAsync( + options?: mixed, + ): Promise; + + // For now + declare type ValidatedOptions = BabelCoreOptions; + + declare class PartialConfig { + +options: $ReadOnly; + +babelrc: string | void; + +babelignore: string | void; + +config: string | void; + + constructor(options: ValidatedOptions): PartialConfig; + + hasFilesystemConfig(): boolean; + } + + declare export function loadPartialConfig( + options?: mixed, + callback: + | ((error: Error, null) => mixed) + | ((null, config: PartialConfig | null) => mixed), + ): void; + declare export function loadPartialConfigSync( + options?: mixed, + ): PartialConfig | null; + declare export function loadPartialConfigAsync( + options?: mixed, + ): Promise; +} + +declare module '@babel/generator' { + declare export type BabelSourceMapSegment = _BabelSourceMapSegment; + + declare export type GeneratorResult = { + code: string, + map: ?_BabelSourceMap, + rawMappings: ?Array, + }; + + declare export class CodeGenerator { + constructor(ast: BabelNode, opts: {...}, code: string): CodeGenerator; + + generate(): GeneratorResult; + } + + declare export type Options = { + /** + * Optional string to add as a block comment at the start of the output file + */ + auxiliaryCommentBefore?: string, + + /** + * Optional string to add as a block comment at the end of the output file + */ + auxiliaryCommentAfter?: string, + + /** + * Function that takes a comment (as a string) and returns true if the comment should be included in the output. + * By default, comments are included if opts.comments is true or if opts.minified is false and the comment contains @preserve or @license + */ + shouldPrintComment?: (comment: string) => boolean, + + /** + * Attempt to use the same line numbers in the output code as in the source code (helps preserve stack traces) + * @default false + */ + retainLines?: boolean, + + /** + * Retain parens around function expressions (could be used to change engine parsing behavior) + * @default false + */ + retainFunctionParens?: boolean, + + /** + * Should comments be included in output + * @default true + */ + comments?: boolean, + + /** + * Set to true to avoid adding whitespace for formatting + * @default opts.minified + */ + compact?: boolean | 'auto', + + /** + * Should the output be minified + * @default false + */ + minified?: boolean, + + /** + * Set to true to reduce whitespace (but not as much as opts.compact) + * @default false + */ + concise?: boolean, + + /** + * Used in warning messages + */ + filename?: string, + + /** + * Set to true to run jsesc with "json": true to print "\u00A9" vs. "©"; + * @default false + */ + jsonCompatibleStrings?: boolean, + + /** + * Use jsesc to process literals. jsesc is applied to numbers only if jsescOption.numbers is present. + * You can customize jsesc by passing options to it. + */ + jsecsOption?: {...}, + + decoratorsBeforeExport?: boolean, + recordAndTupleSyntaxType?: mixed, + + /** + * Enable generating source maps + * @default false + */ + sourceMaps?: boolean, + + /** + * A root for all relative URLs in the source map + */ + sourceRoot?: string, + + /** + * The filename for the source code (i.e. the code in the code argument). This will only be used if code is a string. + */ + sourceFileName?: string, + /** + * The filename of the generated code that the source map will be associated with + */ + sourceMapTarget?: string, + }; + + declare export default ( + ast: BabelNode, + options?: Options, + code?: string | {[string]: string, ...}, + ) => GeneratorResult; + + declare export default ( + ast: BabelNode, + options?: Options, + code?: string | {|[filename: string]: string|}, + ) => GeneratorResult; +} + +declare module '@babel/template' { + import type {Node, Statement, Expression, Program} from '@babel/types'; + + declare export type PublicOpts = { + /** + * A set of placeholder names to automatically accept, ignoring the given + * pattern entirely. + * + * This option can be used when using %%foo%% style placeholders. + */ + placeholderWhitelist?: ?Set, + + /** + * A pattern to search for when looking for Identifier and StringLiteral + * nodes that can be replaced. + * + * 'false' will disable placeholder searching entirely, leaving only the + * 'placeholderWhitelist' value to find replacements. + * + * Defaults to /^[_$A-Z0-9]+$/. + * + * This option can be used when using %%foo%% style placeholders. + */ + placeholderPattern?: ?(RegExp | false), + + /** + * 'true' to pass through comments from the template into the resulting AST, + * or 'false' to automatically discard comments. Defaults to 'false'. + */ + preserveComments?: ?boolean, + + /** + * 'true' to use %%foo%% style placeholders, 'false' to use legacy placeholders + * described by placeholderPattern or placeholderWhitelist. + * When it is not set, it behaves as 'true' if there are syntactic placeholders, + * otherwise as 'false'. + */ + syntacticPlaceholders?: ?boolean, + }; + + declare export type PublicReplacements = + | {[string]: ?BabelNode} + | Array; + + declare export type TemplateBuilder = { + // Build a new builder, merging the given options with the previous ones. + (opts: PublicOpts): TemplateBuilder, + + // Building from a string produces an AST builder function by default. + (tpl: string, opts: ?PublicOpts): (?PublicReplacements) => T, + + // Building from a template literal produces an AST builder function by default. + (tpl: Array, ...args: Array): (?PublicReplacements) => T, + + // Allow users to explicitly create templates that produce ASTs, skipping + // the need for an intermediate function. + ast: { + (tpl: string, opts: ?PublicOpts): T, + (tpl: Array, ...args: Array): T, + }, + }; + + declare export type smart = TemplateBuilder>; + declare export type expression = TemplateBuilder; + declare export type statement = TemplateBuilder; + declare export type statements = TemplateBuilder>; + declare export type program = TemplateBuilder; + + declare export type DefaultTemplateBuilder = { + smart: smart, + statement: statement, + statements: statements, + expression: expression, + program: program, + + // The call signatures are missing if I spread the `TemplateBuilder` type for whatever reason + // Copy paste the definition in here solves the problem. + + // Build a new builder, merging the given options with the previous ones. + (opts: PublicOpts): TemplateBuilder>, + + // Building from a string produces an AST builder function by default. + ( + tpl: string, + opts: ?PublicOpts, + ): (?PublicReplacements) => Statement | Array, + + // Building from a template literal produces an AST builder function by default. + ( + tpl: Array, + ...args: Array + ): (?PublicReplacements) => Statement | Array, + + // Allow users to explicitly create templates that produce ASTs, skipping + // the need for an intermediate function. + ast: { + (tpl: string, opts: ?PublicOpts): Statement | Array, + (tpl: Array, ...args: Array): Statement | Array, + }, + }; + + declare export default DefaultTemplateBuilder; +} diff --git a/flow-typed/npm/chrome-launcher_v0.15.x.js b/flow-typed/npm/chrome-launcher_v0.15.x.js new file mode 100644 index 00000000000000..a0826994e9ab53 --- /dev/null +++ b/flow-typed/npm/chrome-launcher_v0.15.x.js @@ -0,0 +1,49 @@ +/** + * 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 + * @oncall react_native + */ + +declare module 'chrome-launcher' { + import typeof fs from 'fs'; + import typeof childProcess from 'child_process'; + import type {ChildProcess} from 'child_process'; + + declare export type Options = { + startingUrl?: string, + chromeFlags?: Array, + prefs?: mixed, + port?: number, + handleSIGINT?: boolean, + chromePath?: string, + userDataDir?: string | boolean, + logLevel?: 'verbose' | 'info' | 'error' | 'warn' | 'silent', + ignoreDefaultFlags?: boolean, + connectionPollInterval?: number, + maxConnectionRetries?: number, + envVars?: {[key: string]: ?string}, + }; + + declare export type LaunchedChrome = { + pid: number, + port: number, + process: ChildProcess, + kill: () => void, + }; + + declare export type ModuleOverrides = { + fs?: fs, + spawn?: childProcess['spawn'], + }; + + declare class Launcher { + launch(options: Options): Promise; + } + + declare module.exports: Launcher; +} diff --git a/flow-typed/npm/connect_v3.x.x.js b/flow-typed/npm/connect_v3.x.x.js new file mode 100644 index 00000000000000..08cda352be4e47 --- /dev/null +++ b/flow-typed/npm/connect_v3.x.x.js @@ -0,0 +1,50 @@ +/** + * 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 + * @oncall react_native + */ + +declare module 'connect' { + import type http from 'http'; + + declare export type ServerHandle = HandleFunction | http.Server; + + declare type NextFunction = (err?: mixed) => void; + + declare export type NextHandleFunction = ( + req: IncomingMessage, + res: http.ServerResponse, + next: NextFunction, + ) => void | Promise; + declare export type HandleFunction = NextHandleFunction; + + declare export interface IncomingMessage extends http.IncomingMessage { + originalUrl?: http.IncomingMessage['url']; + } + + declare export interface Server extends events$EventEmitter { + (req: IncomingMessage, res: http.ServerResponse): void; + + use(fn: HandleFunction): Server; + use(route: string, fn: HandleFunction): Server; + + listen( + port: number, + hostname?: string, + backlog?: number, + callback?: Function, + ): http.Server; + listen(port: number, hostname?: string, callback?: Function): http.Server; + listen(path: string, callback?: Function): http.Server; + listen(handle: any, listeningListener?: Function): http.Server; + } + + declare type createServer = () => Server; + + declare module.exports: createServer; +} diff --git a/flow-typed/npm/node-fetch_v2.x.x.js b/flow-typed/npm/node-fetch_v2.x.x.js new file mode 100644 index 00000000000000..9b715a7596bb89 --- /dev/null +++ b/flow-typed/npm/node-fetch_v2.x.x.js @@ -0,0 +1,189 @@ +/** + * 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 + * @oncall react_native + */ + +// Modified from flow-typed repo: +// https://github.com/flow-typed/flow-typed/blob/master/definitions/npm/node-fetch_v2.x.x/flow_v0.104.x-/node-fetch_v2.x.x.js + +declare module 'node-fetch' { + import type http from 'http'; + import type https from 'https'; + import type {Readable} from 'stream'; + + declare type AbortSignal = { + +aborted: boolean, + +onabort: (event?: {...}) => void, + + +addEventListener: (name: string, cb: () => mixed) => void, + +removeEventListener: (name: string, cb: () => mixed) => void, + +dispatchEvent: (event: {...}) => void, + ... + }; + + declare class Request mixins Body { + constructor( + input: string | {href: string, ...} | Request, + init?: RequestInit, + ): this; + context: RequestContext; + headers: Headers; + method: string; + redirect: RequestRedirect; + referrer: string; + url: string; + + // node-fetch extensions + agent: http.Agent | https.Agent; + compress: boolean; + counter: number; + follow: number; + hostname: string; + port: number; + protocol: string; + size: number; + timeout: number; + } + + declare type HeaderObject = {[index: string]: string | number, ...}; + + declare type RequestInit = {| + body?: BodyInit, + headers?: HeaderObject | null, + method?: string, + redirect?: RequestRedirect, + signal?: AbortSignal | null, + + // node-fetch extensions + agent?: (URL => http.Agent | https.Agent) | http.Agent | https.Agent | null, + compress?: boolean, + follow?: number, + size?: number, + timeout?: number, + |}; + + declare interface FetchError extends Error { + // cannot set name due to incompatible extend error + // name: 'FetchError'; + type: string; + code: ?number; + errno: ?number; + } + + declare interface AbortError extends Error { + // cannot set name due to incompatible extend error + // name: 'AbortError'; + type: 'aborted'; + } + + declare type RequestContext = + | 'audio' + | 'beacon' + | 'cspreport' + | 'download' + | 'embed' + | 'eventsource' + | 'favicon' + | 'fetch' + | 'font' + | 'form' + | 'frame' + | 'hyperlink' + | 'iframe' + | 'image' + | 'imageset' + | 'import' + | 'internal' + | 'location' + | 'manifest' + | 'object' + | 'ping' + | 'plugin' + | 'prefetch' + | 'script' + | 'serviceworker' + | 'sharedworker' + | 'subresource' + | 'style' + | 'track' + | 'video' + | 'worker' + | 'xmlhttprequest' + | 'xslt'; + declare type RequestRedirect = 'error' | 'follow' | 'manual'; + + declare class Headers { + append(name: string, value: string): void; + delete(name: string): void; + forEach(callback: (value: string, name: string) => void): void; + get(name: string): string; + getAll(name: string): Array; + has(name: string): boolean; + raw(): {[k: string]: string[], ...}; + set(name: string, value: string): void; + entries(): Iterator<[string, string]>; + keys(): Iterator; + values(): Iterator; + @@iterator(): Iterator<[string, string]>; + } + + declare class Body { + buffer(): Promise; + json(): Promise; + json(): Promise; + text(): Promise; + body: stream$Readable; + bodyUsed: boolean; + } + + declare class Response mixins Body { + constructor(body?: BodyInit, init?: ResponseInit): this; + clone(): Response; + error(): Response; + redirect(url: string, status: number): Response; + headers: Headers; + ok: boolean; + status: number; + statusText: string; + size: number; + timeout: number; + type: ResponseType; + url: string; + } + + declare type ResponseType = + | 'basic' + | 'cors' + | 'default' + | 'error' + | 'opaque' + | 'opaqueredirect'; + + declare interface ResponseInit { + headers?: HeaderInit; + status: number; + statusText?: string; + } + + declare type HeaderInit = Headers | Array; + declare type BodyInit = + | string + | null + | Buffer + | Blob + | Readable + | URLSearchParams; + + declare function fetch( + url: string | URL | Request, + init?: RequestInit, + ): Promise; + + declare module.exports: typeof fetch; +} diff --git a/flow-typed/npm/temp-dir_2.x.x.js b/flow-typed/npm/temp-dir_2.x.x.js new file mode 100644 index 00000000000000..23b41d09bb8a8a --- /dev/null +++ b/flow-typed/npm/temp-dir_2.x.x.js @@ -0,0 +1,14 @@ +/** + * 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 + * @oncall react_native + */ + +declare module 'temp-dir' { + declare module.exports: string; +} diff --git a/flow-typed/npm/yargs_v17.x.x.js b/flow-typed/npm/yargs_v17.x.x.js index 65f3d61507c803..ea049a3ba5b355 100644 --- a/flow-typed/npm/yargs_v17.x.x.js +++ b/flow-typed/npm/yargs_v17.x.x.js @@ -191,7 +191,7 @@ declare module "yargs" { exitProcess(enable: boolean): this; - fail(fn: (failureMessage: string, err: Error, yargs: Yargs) => mixed): this; + fail(fn: false | (failureMessage: string, err: Error, yargs: Yargs) => mixed): this; getCompletion( args: Array, diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e..033e24c4cdf41a 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a21c6ebe28b660..c747538fb38b53 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cbb43e393..fcb6fca147c0cd 100755 --- a/gradlew +++ b/gradlew @@ -130,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. diff --git a/jest/preprocessor.js b/jest/preprocessor.js index b971b4260c769f..88dd2a114f93e1 100644 --- a/jest/preprocessor.js +++ b/jest/preprocessor.js @@ -28,17 +28,6 @@ const nodeFiles = /[\\/]metro(?:-[^/]*)[\\/]/; // hook. This is used below to configure babelTransformSync under Jest. const {only: _, ...nodeBabelOptions} = metroBabelRegister.config([]); -// Register Babel to allow the transformer itself to be loaded from source. -if (process.env.FBSOURCE_ENV) { - // Internal: Use `@fb-scripts/babel-register` to re-use internal - // registration, rather than potentially clobbering it and conflicting with - // other Jest projects running in the same process. - // This package should *NOT* be a dependency of `@react-native/monorepo`. - // $FlowIgnore[cannot-resolve-module] - require('@fb-scripts/babel-register'); -} else { - metroBabelRegister([nodeFiles]); -} const transformer = require('metro-react-native-babel-transformer'); module.exports = { @@ -61,6 +50,7 @@ module.exports = { enableBabelRuntime: false, experimentalImportSupport: false, globalPrefix: '', + hermesParser: true, hot: false, inlineRequires: true, minify: false, diff --git a/package.json b/package.json index 2f86089c27f280..329f754b4d76be 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "prettier": "prettier --write \"./**/*.{js,md,yml,ts,tsx}\"", "format-check": "prettier --list-different \"./**/*.{js,md,yml,ts,tsx}\"", "update-lock": "npx yarn-deduplicate", - "docker-setup-android": "docker pull reactnativecommunity/react-native-android:8.0", + "docker-setup-android": "docker pull reactnativecommunity/react-native-android:9.0", "docker-build-android": "docker build -t reactnativeci/android -f .circleci/Dockerfiles/Dockerfile.android .", "test-android-run-instrumentation": "docker run --cap-add=SYS_ADMIN -it reactnativeci/android bash .circleci/Dockerfiles/scripts/run-android-docker-instrumentation-tests.sh", "test-android-run-unit": "docker run --cap-add=SYS_ADMIN -it reactnativeci/android bash .circleci/Dockerfiles/scripts/run-android-docker-unit-tests.sh", @@ -41,8 +41,7 @@ "test-ios": "./scripts/objc-test.sh test", "test-typescript": "dtslint packages/react-native/types", "test-typescript-offline": "dtslint --localTs node_modules/typescript/lib packages/react-native/types", - "bump-all-updated-packages": "node ./scripts/monorepo/bump-all-updated-packages", - "align-package-versions": "node -e \"require('./scripts/monorepo/align-package-versions')()\"" + "bump-all-updated-packages": "node ./scripts/monorepo/bump-all-updated-packages" }, "workspaces": [ "packages/*" @@ -78,19 +77,19 @@ "eslint-plugin-react-native": "^4.0.0", "eslint-plugin-redundant-undefined": "^0.4.0", "eslint-plugin-relay": "^1.8.3", - "flow-bin": "^0.209.0", - "hermes-eslint": "0.12.0", + "flow-bin": "^0.213.1", + "hermes-eslint": "0.14.0", "inquirer": "^7.1.0", "jest": "^29.2.1", "jest-junit": "^10.0.0", "jscodeshift": "^0.14.0", - "metro-babel-register": "0.76.2", - "metro-memory-fs": "0.76.2", - "metro-react-native-babel-transformer": "0.76.2", + "metro-babel-register": "0.77.0", + "metro-memory-fs": "0.77.0", + "metro-react-native-babel-transformer": "0.77.0", "mkdirp": "^0.5.1", "mock-fs": "^5.1.4", "prettier": "2.8.8", - "prettier-plugin-hermes-parser": "0.12.1", + "prettier-plugin-hermes-parser": "0.14.0", "react": "18.2.0", "react-test-renderer": "18.2.0", "shelljs": "^0.8.5", diff --git a/packages/assets/package.json b/packages/assets/package.json index cd55b751e227b2..c8e5100a2cc468 100644 --- a/packages/assets/package.json +++ b/packages/assets/package.json @@ -12,6 +12,6 @@ "keywords": ["assets", "registry", "react-native", "support"], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" } } diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index 3e3edcdb4ba5c6..3d85ab95eba721 100644 --- a/packages/babel-plugin-codegen/package.json +++ b/packages/babel-plugin-codegen/package.json @@ -12,7 +12,7 @@ "keywords": ["babel", "plugin", "codegen", "react-native", "native-modules", "view-manager"], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" }, "files": [ "index.js" diff --git a/packages/dev-middleware/.babelrc b/packages/dev-middleware/.babelrc new file mode 100644 index 00000000000000..e6ab061db791df --- /dev/null +++ b/packages/dev-middleware/.babelrc @@ -0,0 +1,13 @@ +{ + "presets": [ + "@babel/preset-flow", + [ + "@babel/preset-env", + { + "targets": { + "node": "16" + } + } + ] + ] +} diff --git a/packages/dev-middleware/.gitignore b/packages/dev-middleware/.gitignore new file mode 100644 index 00000000000000..40d93a0332c96d --- /dev/null +++ b/packages/dev-middleware/.gitignore @@ -0,0 +1,5 @@ +# Dependencies +/node_modules + +# Build output +/dist diff --git a/packages/dev-middleware/README.md b/packages/dev-middleware/README.md new file mode 100644 index 00000000000000..0f4ee2b43241df --- /dev/null +++ b/packages/dev-middleware/README.md @@ -0,0 +1,11 @@ +# @react-native/dev-middleware + +![https://img.shields.io/npm/v/@react-native/dev-middleware?color=brightgreen&label=npm%20package](https://www.npmjs.com/package/@react-native/dev-middleware) + +Dev server middleware supporting core React Native development features. This package is preconfigured in all React Native projects. + +## Endpoints + +### `/open-debugger` + +Open the JavaScript debugger for a given CDP target (direct Hermes debugging). diff --git a/packages/dev-middleware/index.js.flow b/packages/dev-middleware/index.js.flow new file mode 100644 index 00000000000000..5bccccabb8fbbf --- /dev/null +++ b/packages/dev-middleware/index.js.flow @@ -0,0 +1,12 @@ +/** + * 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 + * @oncall react_native + */ + +export * from './src'; diff --git a/packages/dev-middleware/package.json b/packages/dev-middleware/package.json new file mode 100644 index 00000000000000..5fc0b5b79bc12e --- /dev/null +++ b/packages/dev-middleware/package.json @@ -0,0 +1,43 @@ +{ + "name": "@react-native/dev-middleware", + "version": "0.73.0", + "description": "Dev server middleware for React Native", + "keywords": [ + "react-native", + "tools" + ], + "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/dev-middleware#readme", + "bugs": "https://github.com/facebook/react-native/issues", + "repository": { + "type": "git", + "url": "https://github.com/facebook/react-native.git", + "directory": "packages/dev-middleware" + }, + "license": "MIT", + "exports": "./dist/index.js", + "files": [ + "dist" + ], + "scripts": { + "build": "yarn clean && babel src --out-dir dist", + "dev": "babel src --out-dir dist --source-maps --watch", + "clean": "rimraf dist", + "prepare": "yarn build" + }, + "dependencies": { + "chrome-launcher": "^0.15.2", + "connect": "^3.6.5", + "node-fetch": "^2.2.0", + "temp-dir": "^2.0.0" + }, + "devDependencies": { + "@babel/cli": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/preset-env": "^7.20.0", + "@babel/preset-flow": "^7.20.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=18" + } +} diff --git a/packages/dev-middleware/src/createDevMiddleware.js b/packages/dev-middleware/src/createDevMiddleware.js new file mode 100644 index 00000000000000..982f87bc54faa5 --- /dev/null +++ b/packages/dev-middleware/src/createDevMiddleware.js @@ -0,0 +1,31 @@ +/** + * 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 + * @oncall react_native + */ + +import type {NextHandleFunction} from 'connect'; +import type {Logger} from './types/Logger'; + +import connect from 'connect'; +import openDebuggerMiddleware from './middleware/openDebuggerMiddleware'; + +type Options = $ReadOnly<{ + logger?: Logger, +}>; + +export default function createDevMiddleware({logger}: Options = {}): { + middleware: NextHandleFunction, +} { + const middleware = connect().use( + '/open-debugger', + openDebuggerMiddleware({logger}), + ); + + return {middleware}; +} diff --git a/packages/dev-middleware/src/index.js b/packages/dev-middleware/src/index.js new file mode 100644 index 00000000000000..26f17c2499d50d --- /dev/null +++ b/packages/dev-middleware/src/index.js @@ -0,0 +1,12 @@ +/** + * 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 + * @oncall react_native + */ + +export {default as createDevMiddleware} from './createDevMiddleware'; diff --git a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js new file mode 100644 index 00000000000000..89f0fef9efd96c --- /dev/null +++ b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js @@ -0,0 +1,87 @@ +/** + * 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 + * @oncall react_native + */ + +import type {LaunchedChrome} from 'chrome-launcher'; +import type {NextHandleFunction} from 'connect'; +import type {IncomingMessage, ServerResponse} from 'http'; +import type {Logger} from '../types/Logger'; + +import url from 'url'; +import getDevServerUrl from '../utils/getDevServerUrl'; +import launchChromeDevTools from '../utils/launchChromeDevTools'; +import queryInspectorTargets from '../utils/queryInspectorTargets'; + +const debuggerInstances = new Map(); + +type Options = $ReadOnly<{ + logger?: Logger, +}>; + +/** + * Open the JavaScript debugger for a given CDP target (direct Hermes debugging). + * + * Currently supports Hermes targets, opening debugger websocket URL in Chrome + * DevTools. + * + * @see https://chromedevtools.github.io/devtools-protocol/ + */ +export default function openDebuggerMiddleware({ + logger, +}: Options): NextHandleFunction { + return async ( + req: IncomingMessage, + res: ServerResponse, + next: (err?: Error) => void, + ) => { + if (req.method === 'POST') { + const {query} = url.parse(req.url, true); + const {appId} = query; + + if (typeof appId !== 'string') { + res.writeHead(400); + res.end(); + return; + } + + const targets = await queryInspectorTargets(getDevServerUrl(req)); + const target = targets.find(_target => _target.description === appId); + + if (!target) { + res.writeHead(404); + res.end('Unable to find Chrome DevTools inspector target'); + logger?.warn( + 'No compatible apps connected. JavaScript debugging can only be used with the Hermes engine.', + ); + return; + } + + try { + logger?.info('Launching JS debugger...'); + debuggerInstances.get(appId)?.kill(); + debuggerInstances.set( + appId, + await launchChromeDevTools(target.webSocketDebuggerUrl), + ); + res.end(); + return; + } catch (e) { + logger?.error( + 'Error launching JS debugger: ' + e.message ?? 'Unknown error', + ); + res.writeHead(500); + res.end(); + return; + } + } + + next(); + }; +} diff --git a/packages/dev-middleware/src/types/Logger.js b/packages/dev-middleware/src/types/Logger.js new file mode 100644 index 00000000000000..6bd30b9a93cbc9 --- /dev/null +++ b/packages/dev-middleware/src/types/Logger.js @@ -0,0 +1,17 @@ +/** + * 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 + * @oncall react_native + */ + +export type Logger = $ReadOnly<{ + error: (...message: Array) => void, + info: (...message: Array) => void, + warn: (...message: Array) => void, + ... +}>; diff --git a/packages/dev-middleware/src/utils/getDevServerUrl.js b/packages/dev-middleware/src/utils/getDevServerUrl.js new file mode 100644 index 00000000000000..370bfe2e4ea945 --- /dev/null +++ b/packages/dev-middleware/src/utils/getDevServerUrl.js @@ -0,0 +1,32 @@ +/** + * 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 + * @oncall react_native + */ + +import type {IncomingMessage} from 'http'; + +import net from 'net'; +import {TLSSocket} from 'tls'; + +/** + * Get the base URL to address the current development server. + */ +export default function getDevServerUrl(req: IncomingMessage): string { + const scheme = + req.socket instanceof TLSSocket && req.socket.encrypted === true + ? 'https' + : 'http'; + const {localAddress, localPort} = req.socket; + const address = + localAddress && net.isIPv6(localAddress) + ? `[${localAddress}]` + : localAddress; + + return `${scheme}:${address}:${localPort}`; +} diff --git a/packages/dev-middleware/src/utils/launchChromeDevTools.js b/packages/dev-middleware/src/utils/launchChromeDevTools.js new file mode 100644 index 00000000000000..9da4844a40405e --- /dev/null +++ b/packages/dev-middleware/src/utils/launchChromeDevTools.js @@ -0,0 +1,38 @@ +/** + * 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 + * @oncall react_native + */ + +import type {LaunchedChrome} from 'chrome-launcher'; + +import launchDebuggerAppWindow from './launchDebuggerAppWindow'; + +/** + * The Chrome DevTools frontend revision to use. This should be set to the + * latest version known to be compatible with Hermes. + * + * Revision should be the full identifier from: + * https://chromium.googlesource.com/chromium/src.git + */ +const DEVTOOLS_FRONTEND_REV = 'd9568d04d7dd79269c5a655d7ada69650c5a8336'; // Chrome 100.0.4896.75 + +/** + * Attempt to launch Chrome DevTools on the host machine for a given CDP target. + */ +export default async function launchChromeDevTools( + webSocketDebuggerUrl: string, +): Promise { + const urlBase = `https://chrome-devtools-frontend.appspot.com/serve_rev/@${DEVTOOLS_FRONTEND_REV}/devtools_app.html`; + const ws = webSocketDebuggerUrl.replace(/^ws:\/\//, ''); + + return launchDebuggerAppWindow( + `${urlBase}?panel=console&ws=${encodeURIComponent(ws)}`, + 'open-debugger', + ); +} diff --git a/packages/dev-middleware/src/utils/launchDebuggerAppWindow.js b/packages/dev-middleware/src/utils/launchDebuggerAppWindow.js new file mode 100644 index 00000000000000..a2ae765ba367ed --- /dev/null +++ b/packages/dev-middleware/src/utils/launchDebuggerAppWindow.js @@ -0,0 +1,56 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict + * @format + * @oncall react_native + */ + +import type {LaunchedChrome} from 'chrome-launcher'; +import {promises as fs} from 'fs'; +import path from 'path'; +import osTempDir from 'temp-dir'; + +const ChromeLauncher = require('chrome-launcher'); + +/** + * Attempt to open a debugger frontend URL as a Google Chrome app window. + */ +export default async function launchDebuggerAppWindow( + url: string, + /** + * Used to construct the temp browser dir to preserve settings such as window + * position. + */ + intent: 'open-debugger', +): Promise { + const browserType = 'chrome'; + const userDataDir = await createTempDir( + `react-native-${intent}-${browserType}`, + ); + + try { + return ChromeLauncher.launch({ + chromeFlags: [ + `--app=${url}`, + `--user-data-dir=${userDataDir}`, + '--window-size=1200,600', + ], + }); + } catch (e) { + throw new Error( + 'Unable to find a browser on the host to open the debugger. Supported browsers: Google Chrome', + ); + } +} + +async function createTempDir(dirName: string): Promise { + const tempDir = path.join(osTempDir, dirName); + + await fs.mkdir(tempDir, {recursive: true}); + + return tempDir; +} diff --git a/packages/dev-middleware/src/utils/queryInspectorTargets.js b/packages/dev-middleware/src/utils/queryInspectorTargets.js new file mode 100644 index 00000000000000..3aa0f7244318ac --- /dev/null +++ b/packages/dev-middleware/src/utils/queryInspectorTargets.js @@ -0,0 +1,40 @@ +/** + * 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 + * @oncall react_native + */ + +import fetch from 'node-fetch'; + +type ReactNativeCDPTarget = { + id: string, + description: string, + title: string, + type: string, + devtoolsFrontendUrl: string, + webSocketDebuggerUrl: string, + vm: string, + deviceName?: string, +}; + +/** + * Get the list of available debug targets from the React Native dev server. + * + * @see https://chromedevtools.github.io/devtools-protocol/ + */ +export default async function queryInspectorTargets( + devServerUrl: string, +): Promise { + const res = await fetch(`${devServerUrl}/json/list`); + const apps = (await res.json(): Array); + + // Only use targets with better reloading support + return apps.filter( + app => app.title === 'React Native Experimental (Improved Chrome Reloads)', + ); +} diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index d32e774fadc947..659c6ef7dec6bd 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -16,7 +16,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" }, "main": "index.js", "dependencies": { diff --git a/packages/eslint-plugin-react-native/package.json b/packages/eslint-plugin-react-native/package.json index becda76cc32ffc..3b098f81572810 100644 --- a/packages/eslint-plugin-react-native/package.json +++ b/packages/eslint-plugin-react-native/package.json @@ -12,7 +12,7 @@ "keywords": ["eslint", "rules", "eslint-config", "react-native"], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" }, "main": "index.js" } diff --git a/packages/eslint-plugin-specs/package.json b/packages/eslint-plugin-specs/package.json index 8950f82a0ff850..3c5c534e2359ee 100644 --- a/packages/eslint-plugin-specs/package.json +++ b/packages/eslint-plugin-specs/package.json @@ -12,7 +12,7 @@ "keywords": ["eslint", "rules", "react-native", "native-modules", "components", "specs"], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" }, "main": "index.js", "scripts": { diff --git a/packages/hermes-inspector-msggen/package.json b/packages/hermes-inspector-msggen/package.json index bc4611a469301d..d15616cec61f9b 100644 --- a/packages/hermes-inspector-msggen/package.json +++ b/packages/hermes-inspector-msggen/package.json @@ -13,7 +13,7 @@ "msggen": "./bin/index.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "scripts": { "flow": "flow", diff --git a/packages/metro-config/index.js b/packages/metro-config/index.js index e88df579040627..8829d8c194098c 100644 --- a/packages/metro-config/index.js +++ b/packages/metro-config/index.js @@ -8,26 +8,30 @@ * @noformat */ -/*:: import type {MetroConfig} from 'metro-config'; */ +/*:: import type {ConfigT} from 'metro-config'; */ -const {mergeConfig} = require('metro-config'); +const {getDefaultConfig: getBaseConfig, mergeConfig} = require('metro-config'); const INTERNAL_CALLSITES_REGEX = new RegExp( [ - '/Libraries/Renderer/implementations/.+\\.js$', '/Libraries/BatchedBridge/MessageQueue\\.js$', - '/Libraries/YellowBox/.+\\.js$', + '/Libraries/Core/.+\\.js$', '/Libraries/LogBox/.+\\.js$', - '/Libraries/Core/Timers/.+\\.js$', - '/Libraries/WebSocket/.+\\.js$', + '/Libraries/Network/.+\\.js$', + '/Libraries/Pressability/.+\\.js$', + '/Libraries/Renderer/implementations/.+\\.js$', + '/Libraries/Utilities/.+\\.js$', '/Libraries/vendor/.+\\.js$', - '/node_modules/react-devtools-core/.+\\.js$', - '/node_modules/react-refresh/.+\\.js$', - '/node_modules/scheduler/.+\\.js$', + '/Libraries/WebSocket/.+\\.js$', + '/Libraries/YellowBox/.+\\.js$', + '/metro-runtime/.+\\.js$', + '/node_modules/@babel/runtime/.+\\.js$', '/node_modules/event-target-shim/.+\\.js$', '/node_modules/invariant/.+\\.js$', + '/node_modules/react-devtools-core/.+\\.js$', '/node_modules/react-native/index.js$', - '/metro-runtime/.+\\.js$', + '/node_modules/react-refresh/.+\\.js$', + '/node_modules/scheduler/.+\\.js$', '^\\[native code\\]$', ].join('|'), ); @@ -37,14 +41,18 @@ const INTERNAL_CALLSITES_REGEX = new RegExp( */ function getDefaultConfig( projectRoot /*: string */ -) /*: MetroConfig */ { - return { +) /*: ConfigT */ { + const config = { resolver: { resolverMainFields: ['react-native', 'browser', 'main'], platforms: ['android', 'ios'], unstable_conditionNames: ['require', 'import', 'react-native'], }, serializer: { + // Note: This option is overridden in cli-plugin-metro (getOverrideConfig) + getModulesRunBeforeMainModule: () => [ + require.resolve('react-native/Libraries/Core/InitializeCore'), + ], getPolyfills: () => require('@react-native/js-polyfills')(), }, server: { @@ -76,6 +84,14 @@ function getDefaultConfig( }, watchFolders: [], }; + + // Set global hook so that the CLI can detect when this config has been loaded + global.__REACT_NATIVE_METRO_CONFIG_LOADED = true; + + return mergeConfig( + getBaseConfig.getDefaultValues(projectRoot), + config, + ); } module.exports = {getDefaultConfig, mergeConfig}; diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index e86d78e60321ab..a3d3b8e1e1f9f4 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -12,13 +12,13 @@ "keywords": ["metro", "config", "react-native"], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" }, "exports": "./index.js", "dependencies": { "@react-native/js-polyfills": "^0.73.0", - "metro-config": "0.76.2", - "metro-react-native-babel-transformer": "0.76.2", - "metro-runtime": "0.76.2" + "metro-config": "0.77.0", + "metro-react-native-babel-transformer": "0.77.0", + "metro-runtime": "0.77.0" } } diff --git a/packages/normalize-color/package.json b/packages/normalize-color/package.json index 079c3fe4dabea3..ab3fa6fd89f26a 100644 --- a/packages/normalize-color/package.json +++ b/packages/normalize-color/package.json @@ -12,6 +12,6 @@ "keywords": ["color", "normalization", "normalize-colors", "react-native"], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" } } diff --git a/packages/polyfills/package.json b/packages/polyfills/package.json index de11f640d1be8f..8cefc9909f6b1d 100644 --- a/packages/polyfills/package.json +++ b/packages/polyfills/package.json @@ -12,6 +12,6 @@ "keywords": ["polyfill", "polyfills", "js", "js-polyfills", "react-native"], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" } } diff --git a/packages/react-native-bots/package.json b/packages/react-native-bots/package.json index 5a86115c8a9696..40dfe8c2c18ee0 100644 --- a/packages/react-native-bots/package.json +++ b/packages/react-native-bots/package.json @@ -11,7 +11,7 @@ }, "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-bots#readme", "engines": { - "node": ">=16" + "node": ">=18" }, "devDependencies": { "@rnx-kit/rn-changelog-generator": "^0.4.0", diff --git a/packages/react-native-codegen-typescript-test/package.json b/packages/react-native-codegen-typescript-test/package.json index 5c9daf3bb3e0d2..0d8b84f4e5df70 100644 --- a/packages/react-native-codegen-typescript-test/package.json +++ b/packages/react-native-codegen-typescript-test/package.json @@ -10,7 +10,7 @@ }, "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-typescript-test", "engines": { - "node": ">=16" + "node": ">=18" }, "scripts": { "build": "yarn clean && node scripts/build.js --verbose && tsc", diff --git a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap index e7d50c7f5c1f9c..817b6366da190a 100644 --- a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap @@ -37,9 +37,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeArrayTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeArrayTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -98,9 +100,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeBooleanTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeBooleanTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -151,9 +155,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeCallbackTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeCallbackTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -434,9 +440,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"NativeEnumTurboModule\\"; + protected: NativeEnumTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"NativeEnumTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeEnumTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -523,9 +531,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeNullableTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeNullableTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -608,9 +618,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeNumberTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeNumberTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -664,9 +676,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -740,9 +754,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeOptionalObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeOptionalObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -832,9 +848,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"NativePartialAnnotationTurboModule\\"; + protected: NativePartialAnnotationTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"NativePartialAnnotationTurboModule\\", jsInvoker), + : TurboModule(std::string{NativePartialAnnotationTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -901,9 +919,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativePromiseTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativePromiseTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1002,9 +1022,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1191,9 +1213,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleArrays\\"; + protected: NativeSampleTurboModuleArraysCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleArrays\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleArraysCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1380,9 +1404,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleNullable\\"; + protected: NativeSampleTurboModuleNullableCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleNullable\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleNullableCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1571,9 +1597,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleNullableAndOptional\\"; + protected: NativeSampleTurboModuleNullableAndOptionalCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleNullableAndOptional\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleNullableAndOptionalCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1762,9 +1790,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleOptional\\"; + protected: NativeSampleTurboModuleOptionalCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleOptional\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleOptionalCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1903,9 +1933,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeStringTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeStringTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1980,9 +2012,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeArrayTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeArrayTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2041,9 +2075,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeBooleanTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeBooleanTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2094,9 +2130,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeCallbackTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeCallbackTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2377,9 +2415,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"NativeEnumTurboModule\\"; + protected: NativeEnumTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"NativeEnumTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeEnumTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2466,9 +2506,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeNullableTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeNullableTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2551,9 +2593,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeNumberTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeNumberTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2607,9 +2651,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2683,9 +2729,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeOptionalObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeOptionalObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2775,9 +2823,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"NativePartialAnnotationTurboModule\\"; + protected: NativePartialAnnotationTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"NativePartialAnnotationTurboModule\\", jsInvoker), + : TurboModule(std::string{NativePartialAnnotationTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2844,9 +2894,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativePromiseTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativePromiseTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -2945,9 +2997,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -3134,9 +3188,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleArrays\\"; + protected: NativeSampleTurboModuleArraysCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleArrays\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleArraysCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -3323,9 +3379,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleNullable\\"; + protected: NativeSampleTurboModuleNullableCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleNullable\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleNullableCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -3514,9 +3572,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleNullableAndOptional\\"; + protected: NativeSampleTurboModuleNullableAndOptionalCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleNullableAndOptional\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleNullableAndOptionalCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -3705,9 +3765,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleOptional\\"; + protected: NativeSampleTurboModuleOptionalCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleOptional\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleOptionalCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -3846,9 +3908,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeStringTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeStringTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index 5028fea863a207..45f23b160b78d6 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -18,7 +18,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" }, "scripts": { "build": "yarn clean && node scripts/build.js --verbose", diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index e4d8f53b5b5d60..114e4ce17005d4 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -74,9 +74,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = "${moduleName}"; + protected: ${hasteModuleName}CxxSpec(std::shared_ptr jsInvoker) - : TurboModule("${moduleName}", jsInvoker), + : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap index be1d454013a153..f050f49e42cc07 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap @@ -36,9 +36,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -104,9 +106,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -349,9 +353,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModuleCxx\\"; + protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModuleCxx\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -450,9 +456,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -580,9 +588,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"AliasTurboModule\\"; + protected: AliasTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"AliasTurboModule\\", jsInvoker), + : TurboModule(std::string{AliasTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -897,9 +907,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"CameraRollManager\\"; + protected: NativeCameraRollManagerCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"CameraRollManager\\", jsInvoker), + : TurboModule(std::string{NativeCameraRollManagerCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1118,9 +1130,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"ExceptionsManager\\"; + protected: NativeExceptionsManagerCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"ExceptionsManager\\", jsInvoker), + : TurboModule(std::string{NativeExceptionsManagerCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1319,9 +1333,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1492,9 +1508,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule\\"; + protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: @@ -1537,9 +1555,11 @@ public: return delegate_.get(rt, propName); } + static constexpr std::string_view kModuleName = \\"SampleTurboModule2\\"; + protected: NativeSampleTurboModule2CxxSpec(std::shared_ptr jsInvoker) - : TurboModule(\\"SampleTurboModule2\\", jsInvoker), + : TurboModule(std::string{NativeSampleTurboModule2CxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} private: diff --git a/packages/react-native-codegen/src/parsers/flow/components/componentsUtils.js b/packages/react-native-codegen/src/parsers/flow/components/componentsUtils.js index 0f840ae969a99f..222175272b7b79 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/componentsUtils.js +++ b/packages/react-native-codegen/src/parsers/flow/components/componentsUtils.js @@ -11,6 +11,7 @@ 'use strict'; const {getValueFromTypes} = require('../utils.js'); +const {verifyPropNotAlreadyDefined} = require('../../parsers-commons'); import type {TypeDeclarationMap, PropAST, ASTNode} from '../../utils'; import type {BuildSchemaFN, Parser} from '../../parser'; @@ -206,17 +207,6 @@ function flattenProperties( .filter(Boolean); } -function verifyPropNotAlreadyDefined( - props: $ReadOnlyArray, - needleProp: PropAST, -) { - const propName = needleProp.key.name; - const foundProp = props.some(prop => prop.key.name === propName); - if (foundProp) { - throw new Error(`A prop was already defined with the name ${propName}`); - } -} - function getTypeAnnotation<+T>( name: string, annotation: $FlowFixMe | ASTNode, diff --git a/packages/react-native-codegen/src/parsers/parsers-commons.js b/packages/react-native-codegen/src/parsers/parsers-commons.js index 9629c5121d371b..b837ef50ff68f8 100644 --- a/packages/react-native-codegen/src/parsers/parsers-commons.js +++ b/packages/react-native-codegen/src/parsers/parsers-commons.js @@ -1072,6 +1072,17 @@ function buildPropertiesForEvent( return getPropertyType(name, optional, typeAnnotation, parser); } +function verifyPropNotAlreadyDefined( + props: $ReadOnlyArray, + needleProp: PropAST, +) { + const propName = needleProp.key.name; + const foundProp = props.some(prop => prop.key.name === propName); + if (foundProp) { + throw new Error(`A prop was already defined with the name ${propName}`); + } +} + module.exports = { wrapModuleSchema, unwrapNullable, @@ -1099,4 +1110,5 @@ module.exports = { handleGenericTypeAnnotation, getTypeResolutionStatus, buildPropertiesForEvent, + verifyPropNotAlreadyDefined, }; diff --git a/packages/react-native-codegen/src/parsers/typescript/components/componentsUtils.js b/packages/react-native-codegen/src/parsers/typescript/components/componentsUtils.js index bbcbd279e893ad..ecbc70299dcc39 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/componentsUtils.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/componentsUtils.js @@ -13,6 +13,7 @@ const { parseTopLevelType, flattenIntersectionType, } = require('../parseTopLevelType'); +const {verifyPropNotAlreadyDefined} = require('../../parsers-commons'); import type {TypeDeclarationMap, PropAST, ASTNode} from '../../utils'; import type {BuildSchemaFN, Parser} from '../../parser'; @@ -453,17 +454,6 @@ function getSchemaInfo( }; } -function verifyPropNotAlreadyDefined( - props: $ReadOnlyArray, - needleProp: PropAST, -) { - const propName = needleProp.key.name; - const foundProp = props.some(prop => prop.key.name === propName); - if (foundProp) { - throw new Error(`A prop was already defined with the name ${propName}`); - } -} - function flattenProperties( typeDefinition: $ReadOnlyArray, types: TypeDeclarationMap, diff --git a/packages/react-native-gradle-plugin/build.gradle.kts b/packages/react-native-gradle-plugin/build.gradle.kts index 33f4dc589d42f9..b8813324b1ad77 100644 --- a/packages/react-native-gradle-plugin/build.gradle.kts +++ b/packages/react-native-gradle-plugin/build.gradle.kts @@ -37,7 +37,7 @@ dependencies { // The KGP/AGP version is defined by React Native Gradle plugin. // Therefore we specify an implementation dep rather than a compileOnly. implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0") - implementation("com.android.tools.build:gradle:7.4.2") + implementation("com.android.tools.build:gradle:8.0.2") implementation("com.google.code.gson:gson:2.8.9") implementation("com.google.guava:guava:31.0.1-jre") @@ -55,11 +55,14 @@ dependencies { } java { + // We intentionally don't build for Java 17 as users will see a cryptic bytecode version + // error first. Instead we produce a Java 11-compatible Gradle Plugin, so that AGP can print their + // nice message showing that JDK 11 (or 17) is required first sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } -kotlin { jvmToolchain(11) } +kotlin { jvmToolchain(17) } tasks.withType { kotlinOptions { diff --git a/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.jar b/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e..033e24c4cdf41a 100644 Binary files a/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.jar and b/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.jar differ diff --git a/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.properties b/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.properties index a21c6ebe28b660..c747538fb38b53 100644 --- a/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.properties +++ b/packages/react-native-gradle-plugin/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/packages/react-native-gradle-plugin/gradlew b/packages/react-native-gradle-plugin/gradlew index aeb74cbb43e393..fcb6fca147c0cd 100755 --- a/packages/react-native-gradle-plugin/gradlew +++ b/packages/react-native-gradle-plugin/gradlew @@ -130,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. diff --git a/packages/react-native-gradle-plugin/package.json b/packages/react-native-gradle-plugin/package.json index f5eb0fd73a30eb..a1b8f3a2ce7559 100644 --- a/packages/react-native-gradle-plugin/package.json +++ b/packages/react-native-gradle-plugin/package.json @@ -12,7 +12,7 @@ "keywords": ["gradle", "plugin", "react-native"], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" }, "scripts": { "build": "./gradlew build", diff --git a/packages/react-native-gradle-plugin/settings.gradle.kts b/packages/react-native-gradle-plugin/settings.gradle.kts index 8daf82d475afec..8a0ecaa26f44ce 100644 --- a/packages/react-native-gradle-plugin/settings.gradle.kts +++ b/packages/react-native-gradle-plugin/settings.gradle.kts @@ -13,4 +13,6 @@ pluginManagement { } } +plugins { id("org.gradle.toolchains.foojay-resolver-convention").version("0.5.0") } + rootProject.name = "react-native-gradle-plugin" diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt index 709f1097142425..ff0de04b4c7cd7 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt @@ -86,13 +86,13 @@ class ReactPlugin : Plugin { private fun checkJvmVersion(project: Project) { val jvmVersion = Jvm.current()?.javaVersion?.majorVersion - if ((jvmVersion?.toIntOrNull() ?: 0) <= 8) { + if ((jvmVersion?.toIntOrNull() ?: 0) <= 16) { project.logger.error( """ ******************************************************************************** - ERROR: requires JDK11 or higher. + ERROR: requires JDK17 or higher. Incompatible major version detected: '$jvmVersion' ******************************************************************************** diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt index 3bf008535f7e02..3e9f8fc5e7a2ff 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt @@ -21,6 +21,7 @@ internal object AgpConfiguratorUtils { val action = Action { project.extensions.getByType(AndroidComponentsExtension::class.java).finalizeDsl { ext -> + ext.buildFeatures.buildConfig = true ext.defaultConfig.buildConfigField( "boolean", "IS_NEW_ARCHITECTURE_ENABLED", project.isNewArchEnabled.toString()) ext.defaultConfig.buildConfigField( diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt index 7c34ce80d1ac75..a82696e93b46f1 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt @@ -45,7 +45,8 @@ internal object DependencyUtils { /** * This method takes care of configuring the resolution strategy for both the app and all the 3rd * party libraries which are auto-linked. Specifically it takes care of: - * - Forcing the react-android/hermes-android version to the one specified in the package.json + * - Forcing the react-android/hermes-android/flipper-integration version to the one specified in + * the package.json * - Substituting `react-native` with `react-android` and `hermes-engine` with `hermes-android`. */ fun configureDependencies( @@ -68,6 +69,7 @@ internal object DependencyUtils { configuration.resolutionStrategy.force( "${groupString}:react-android:${versionString}", "${groupString}:hermes-android:${versionString}", + "${groupString}:flipper-integration:${versionString}", ) } } diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/JdkConfiguratorUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/JdkConfiguratorUtils.kt index b54ea52404f226..0d557148eb885e 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/JdkConfiguratorUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/JdkConfiguratorUtils.kt @@ -19,28 +19,33 @@ internal object JdkConfiguratorUtils { /** * Function that takes care of configuring the JDK toolchain for all the projects projects. As we * do decide the JDK version based on the AGP version that RNGP brings over, here we can safely - * configure the toolchain to 11. + * configure the toolchain to 17. */ fun configureJavaToolChains(input: Project) { + // Check at the app level if react.internal.disableJavaVersionAlignment is set. if (input.hasProperty(INTERNAL_DISABLE_JAVA_VERSION_ALIGNMENT)) { return } input.rootProject.allprojects { project -> + // Allows every single module to set react.internal.disableJavaVersionAlignment also. + if (project.hasProperty(INTERNAL_DISABLE_JAVA_VERSION_ALIGNMENT)) { + return@allprojects + } val action = Action { project.extensions.getByType(AndroidComponentsExtension::class.java).finalizeDsl { ext -> - ext.compileOptions.sourceCompatibility = JavaVersion.VERSION_11 - ext.compileOptions.targetCompatibility = JavaVersion.VERSION_11 + ext.compileOptions.sourceCompatibility = JavaVersion.VERSION_17 + ext.compileOptions.targetCompatibility = JavaVersion.VERSION_17 } } project.pluginManager.withPlugin("com.android.application", action) project.pluginManager.withPlugin("com.android.library", action) project.pluginManager.withPlugin("org.jetbrains.kotlin.android") { - project.extensions.getByType(KotlinTopLevelExtension::class.java).jvmToolchain(11) + project.extensions.getByType(KotlinTopLevelExtension::class.java).jvmToolchain(17) } project.pluginManager.withPlugin("org.jetbrains.kotlin.jvm") { - project.extensions.getByType(KotlinTopLevelExtension::class.java).jvmToolchain(11) + project.extensions.getByType(KotlinTopLevelExtension::class.java).jvmToolchain(17) } } } diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt index 28a33b85f8fc3f..5c3faa99417721 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt @@ -78,7 +78,7 @@ internal object NdkConfiguratorUtils { ) { if (!project.isNewArchEnabled) { // For Old Arch, we set a pickFirst only on libraries that we know are - // clashing with our direct dependencies (FBJNI, Flipper and Hermes). + // clashing with our direct dependencies (mainly FBJNI and Hermes). variant.packaging.jniLibs.pickFirsts.addAll( listOf( "**/libfbjni.so", diff --git a/packages/react-native/Libraries/Animated/Animated.js b/packages/react-native/Libraries/Animated/Animated.js index ec17ef764543ee..a9df993ad2981c 100644 --- a/packages/react-native/Libraries/Animated/Animated.js +++ b/packages/react-native/Libraries/Animated/Animated.js @@ -21,7 +21,7 @@ import Platform from '../Utilities/Platform'; import AnimatedImplementation from './AnimatedImplementation'; import AnimatedMock from './AnimatedMock'; -const Animated = ((Platform.isTesting +const Animated = ((Platform.isDisableAnimations ? AnimatedMock : AnimatedImplementation): typeof AnimatedImplementation); diff --git a/packages/react-native/Libraries/Animated/animations/Animation.js b/packages/react-native/Libraries/Animated/animations/Animation.js index ad956cd79d9d6d..d8e955f9fda49b 100644 --- a/packages/react-native/Libraries/Animated/animations/Animation.js +++ b/packages/react-native/Libraries/Animated/animations/Animation.js @@ -14,8 +14,11 @@ import type {PlatformConfig} from '../AnimatedPlatformConfig'; import type AnimatedNode from '../nodes/AnimatedNode'; import type AnimatedValue from '../nodes/AnimatedValue'; +import Platform from '../../Utilities/Platform'; import NativeAnimatedHelper from '../NativeAnimatedHelper'; +import AnimatedColor from '../nodes/AnimatedColor'; import AnimatedProps from '../nodes/AnimatedProps'; +import AnimatedValueXY from '../nodes/AnimatedValueXY'; export type EndResult = {finished: boolean, value?: number, ...}; export type EndCallback = (result: EndResult) => void; @@ -75,6 +78,20 @@ export default class Animation { return result; } + // Vectorized animations (animations on AnimatedValueXY, AnimatedColor nodes) + // are split into multiple animations for each component that execute in parallel. + // Calling update() on AnimatedProps when each animation completes results in + // potential flickering as all animations that are part of the vectorized animation + // may not have completed yet. For example, only the animation for the red channel of + // an animating color may have been completed, resulting in a temporary red color + // being rendered. So, for now, ignore AnimatedProps that use a vectorized animation. + if ( + Platform.OS === 'ios' && + (node instanceof AnimatedValueXY || node instanceof AnimatedColor) + ) { + return result; + } + for (const child of node.__getChildren()) { result.push(...this.__findAnimatedPropsNodes(child)); } diff --git a/packages/react-native/Libraries/Animated/useAnimatedProps.js b/packages/react-native/Libraries/Animated/useAnimatedProps.js index bf3a6d140c97f9..2d87e367d81c46 100644 --- a/packages/react-native/Libraries/Animated/useAnimatedProps.js +++ b/packages/react-native/Libraries/Animated/useAnimatedProps.js @@ -11,6 +11,7 @@ 'use strict'; import {isPublicInstance as isFabricPublicInstance} from '../ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstanceUtils'; +import ReactNativeFeatureFlags from '../ReactNative/ReactNativeFeatureFlags'; import useRefEffect from '../Utilities/useRefEffect'; import {AnimatedEvent} from './AnimatedEvent'; import NativeAnimatedHelper from './NativeAnimatedHelper'; @@ -45,6 +46,8 @@ export default function useAnimatedProps( () => new AnimatedProps(props, () => onUpdateRef.current?.()), [props], ); + const useNativePropsInFabric = + ReactNativeFeatureFlags.shouldUseSetNativePropsInFabric(); useAnimatedPropsLifecycle(node); // TODO: This "effect" does three things: @@ -74,7 +77,7 @@ export default function useAnimatedProps( process.env.NODE_ENV === 'test' || typeof instance !== 'object' || typeof instance?.setNativeProps !== 'function' || - isFabricInstance(instance) + (isFabricInstance(instance) && !useNativePropsInFabric) ) { // Schedule an update for this component to update `reducedProps`, // but do not compute it immediately. If a parent also updated, we @@ -106,7 +109,7 @@ export default function useAnimatedProps( } }; }, - [props, node], + [props, node, useNativePropsInFabric], ); const callbackRef = useRefEffect(refEffect); diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h index 52763c21c4b7e9..0c84edf4b93487 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h @@ -5,10 +5,10 @@ * LICENSE file in the root directory of this source tree. */ -#import -#import #import +@class RCTBridge; +@protocol RCTBridgeDelegate; @protocol RCTComponentViewProtocol; @class RCTSurfacePresenterBridgeAdapter; @@ -132,6 +132,14 @@ /// @return: `true` if the Fabric Renderer is enabled. Otherwise, it returns `false`. - (BOOL)fabricEnabled; +/// This method controls whether React Native's new initialization layer is enabled. +/// +/// @return: `true` if the new initialization layer is enabled. Otherwise returns `false`. +- (BOOL)bridgelessEnabled; + +/// Return the bundle URL for the main bundle. +- (NSURL *)getBundleURL; + #endif @end diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm index ecc438ca4a4f7a..b299ac72b15738 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm @@ -8,28 +8,41 @@ #import "RCTAppDelegate.h" #import #import "RCTAppSetupUtils.h" +#import "RCTLegacyInteropComponents.h" #if RCT_NEW_ARCH_ENABLED #import +#import #import #import #import +#import #import #import +#import #import #import +#import +#if USE_HERMES +#import +#else +#import +#endif +#import +#import #import +#import #import #import #import -#import "RCTLegacyInteropComponents.h" static NSString *const kRNConcurrentRoot = @"concurrentRoot"; @interface RCTAppDelegate () < RCTTurboModuleManagerDelegate, RCTCxxBridgeDelegate, - RCTComponentViewFactoryComponentProvider> { + RCTComponentViewFactoryComponentProvider, + RCTContextContainerHandling> { std::shared_ptr _reactNativeConfig; facebook::react::ContextContainer::Shared _contextContainer; std::shared_ptr _runtimeScheduler; @@ -38,7 +51,11 @@ @interface RCTAppDelegate () < #endif -@implementation RCTAppDelegate +@implementation RCTAppDelegate { +#if RCT_NEW_ARCH_ENABLED + RCTHost *_reactHost; +#endif +} #if RCT_NEW_ARCH_ENABLED - (instancetype)init @@ -55,26 +72,44 @@ - (instancetype)init - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { BOOL enableTM = NO; + BOOL enableBridgeless = NO; #if RCT_NEW_ARCH_ENABLED enableTM = self.turboModuleEnabled; + enableBridgeless = self.bridgelessEnabled; #endif + RCTAppSetupPrepareApp(application, enableTM); - if (!self.bridge) { - self.bridge = [self createBridgeWithDelegate:self launchOptions:launchOptions]; - } + UIView *rootView; + + if (enableBridgeless) { #if RCT_NEW_ARCH_ENABLED - self.bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:self.bridge - contextContainer:_contextContainer]; - self.bridge.surfacePresenter = self.bridgeAdapter.surfacePresenter; + [self createReactHost]; + RCTFabricSurface *surface = [_reactHost createSurfaceWithModuleName:self.moduleName + initialProperties:launchOptions]; - [self unstable_registerLegacyComponents]; - [RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self; -#endif + RCTSurfaceHostingProxyRootView *surfaceHostingProxyRootView = [[RCTSurfaceHostingProxyRootView alloc] + initWithSurface:surface + sizeMeasureMode:RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightExact + moduleRegistry:[_reactHost getModuleRegistry]]; - NSDictionary *initProps = [self prepareInitialProps]; - UIView *rootView = [self createRootViewWithBridge:self.bridge moduleName:self.moduleName initProps:initProps]; + rootView = (RCTRootView *)surfaceHostingProxyRootView; +#endif + } else { + if (!self.bridge) { + self.bridge = [self createBridgeWithDelegate:self launchOptions:launchOptions]; + } +#if RCT_NEW_ARCH_ENABLED + self.bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:self.bridge + contextContainer:_contextContainer]; + self.bridge.surfacePresenter = self.bridgeAdapter.surfacePresenter; + [self unstable_registerLegacyComponents]; + [RCTComponentViewFactory currentComponentViewFactory].thirdPartyFabricComponentsProvider = self; +#endif + NSDictionary *initProps = [self prepareInitialProps]; + rootView = [self createRootViewWithBridge:self.bridge moduleName:self.moduleName initProps:initProps]; + } self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIViewController *rootViewController = [self createRootViewController]; [self setRootView:rootView toRootViewController:rootViewController]; @@ -198,6 +233,11 @@ - (BOOL)fabricEnabled return YES; } +- (BOOL)bridgelessEnabled +{ + return YES; +} + #pragma mark - New Arch Utilities - (void)unstable_registerLegacyComponents @@ -207,6 +247,43 @@ - (void)unstable_registerLegacyComponents } } +- (void)createReactHost +{ + __weak __typeof(self) weakSelf = self; + _reactHost = [[RCTHost alloc] initWithBundleURL:[self getBundleURL] + hostDelegate:nil + turboModuleManagerDelegate:self + jsEngineProvider:^std::shared_ptr() { + return [weakSelf createJSEngineInstance]; + }]; + [_reactHost setBundleURLProvider:^NSURL *() { + return [weakSelf getBundleURL]; + }]; + [_reactHost setContextContainerHandler:self]; + [_reactHost start]; +} + +- (std::shared_ptr)createJSEngineInstance +{ +#if USE_HERMES + return std::make_shared(_reactNativeConfig, nullptr); +#else + return std::make_shared(); +#endif +} + +- (void)didCreateContextContainer:(std::shared_ptr)contextContainer +{ + contextContainer->insert("ReactNativeConfig", _reactNativeConfig); +} + +- (NSURL *)getBundleURL +{ + [NSException raise:@"RCTAppDelegate::getBundleURL not implemented" + format:@"Subclasses must implement a valid getBundleURL method"]; + return nullptr; +} + #endif @end diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm index 99484c42092635..a416e90b907c07 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm @@ -10,13 +10,13 @@ #if RCT_NEW_ARCH_ENABLED // Turbo Module #import +#import #import #import #import #import #import #import -#import #import // Fabric @@ -83,7 +83,7 @@ void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled) if (moduleClass == RCTImageLoader.class) { return [[moduleClass alloc] initWithRedirectDelegate:nil loadersProvider:^NSArray> *(RCTModuleRegistry *moduleRegistry) { - return @[ [RCTLocalAssetImageLoader new] ]; + return @[ [RCTBundleAssetImageLoader new] ]; } decodersProvider:^NSArray> *(RCTModuleRegistry *moduleRegistry) { return @[ [RCTGIFImageDecoder new] ]; diff --git a/packages/react-native/Libraries/AppDelegate/RCTLegacyInteropComponents.mm b/packages/react-native/Libraries/AppDelegate/RCTLegacyInteropComponents.mm index 549e41a9b91b5f..a330712cae3a7c 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTLegacyInteropComponents.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTLegacyInteropComponents.mm @@ -1,4 +1,3 @@ - /* * Copyright (c) Meta Platforms, Inc. and affiliates. * @@ -12,7 +11,7 @@ @implementation RCTLegacyInteropComponents + (NSArray *)legacyInteropComponents { - return @[ @"RNTMyLegacyNativeView" ]; + return @[ @"RNTMyLegacyNativeView", @"RNTMyNativeView" ]; } @end diff --git a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec index c22ba9279aeb76..56b015046553db 100644 --- a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec +++ b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec @@ -20,16 +20,17 @@ folly_flags = ' -DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1' folly_compiler_flags = folly_flags + ' ' + '-Wno-comma -Wno-shorten-64-to-32' is_new_arch_enabled = ENV["RCT_NEW_ARCH_ENABLED"] == "1" +use_hermes = ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == '1' +use_frameworks = ENV['USE_FRAMEWORKS'] != nil + new_arch_enabled_flag = (is_new_arch_enabled ? " -DRCT_NEW_ARCH_ENABLED" : "") is_fabric_enabled = is_new_arch_enabled || ENV["RCT_FABRIC_ENABLED"] fabric_flag = (is_fabric_enabled ? " -DRN_FABRIC_ENABLED" : "") -other_cflags = "$(inherited)" + folly_flags + new_arch_enabled_flag + fabric_flag - -use_hermes = ENV['USE_HERMES'] == '1' -use_frameworks = ENV['USE_FRAMEWORKS'] != nil +hermes_flag = (use_hermes ? " -DUSE_HERMES" : "") +other_cflags = "$(inherited)" + folly_flags + new_arch_enabled_flag + fabric_flag + hermes_flag header_search_paths = [ - "$(PODS_TARGET_SRCROOT)/ReactCommon", + "$(PODS_TARGET_SRCROOT)/../../ReactCommon", "$(PODS_ROOT)/Headers/Private/React-Core", "$(PODS_ROOT)/boost", "$(PODS_ROOT)/DoubleConversion", @@ -47,9 +48,13 @@ header_search_paths = [ "$(PODS_CONFIGURATION_BUILD_DIR)/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", "$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", "$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "$(PODS_CONFIGURATION_BUILD_DIR)/React-BridgelessApple/React_BridgelessApple.framework/Headers", + "$(PODS_CONFIGURATION_BUILD_DIR)/React-BridgelessCore/React_BridgelessCore.framework/Headers", "$(PODS_CONFIGURATION_BUILD_DIR)/React-RCTFabric/RCTFabric.framework/Headers/", + "$(PODS_CONFIGURATION_BUILD_DIR)/React-utils/React_utils.framework/Headers/", "$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers/", - "${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers/" + "$(PODS_CONFIGURATION_BUILD_DIR)/React-runtimescheduler/React_runtimescheduler.framework/Headers/", + "$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers/", ] : []).map{|p| "\"#{p}\""}.join(" ") Pod::Spec.new do |s| @@ -73,6 +78,8 @@ Pod::Spec.new do |s| } s.user_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/Headers/Private/React-Core\""} + use_hermes = ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" + s.dependency "React-Core" s.dependency "RCT-Folly" s.dependency "RCTRequired" @@ -82,8 +89,17 @@ Pod::Spec.new do |s| s.dependency "React-RCTImage" s.dependency "React-NativeModulesApple" s.dependency "React-CoreModules" + s.dependency "React-nativeconfig" - if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" + if is_new_arch_enabled + s.dependency "React-BridgelessCore" + s.dependency "React-BridgelessApple" + if use_hermes + s.dependency "React-BridgelessHermes" + end + end + + if use_hermes s.dependency "React-hermes" else s.dependency "React-jsc" @@ -93,8 +109,9 @@ Pod::Spec.new do |s| s.dependency "React-Fabric" s.dependency "React-RCTFabric" s.dependency "React-graphics" - s.dependency "React-debug" s.dependency "React-utils" + s.dependency "React-debug" + s.dependency "React-rendererdebug" s.script_phases = { :name => "Generate Legacy Components Interop", diff --git a/packages/react-native/Libraries/Blob/Blob.js b/packages/react-native/Libraries/Blob/Blob.js index a75fb1b3688a16..886e257336411f 100644 --- a/packages/react-native/Libraries/Blob/Blob.js +++ b/packages/react-native/Libraries/Blob/Blob.js @@ -81,7 +81,7 @@ class Blob { return this._data; } - slice(start?: number, end?: number): Blob { + slice(start?: number, end?: number, contentType: string = ''): Blob { const BlobManager = require('./BlobManager'); let {offset, size} = this.data; @@ -109,6 +109,7 @@ class Blob { blobId: this.data.blobId, offset, size, + type: contentType, /* Since `blob.slice()` creates a new view onto the same binary * data as the original blob, we should re-use the same collector * object so that the underlying resource gets deallocated when diff --git a/packages/react-native/Libraries/Blob/RCTBlobPlugins.h b/packages/react-native/Libraries/Blob/RCTBlobPlugins.h index d1fc8cfdae1008..84e3e322d526d0 100644 --- a/packages/react-native/Libraries/Blob/RCTBlobPlugins.h +++ b/packages/react-native/Libraries/Blob/RCTBlobPlugins.h @@ -29,8 +29,8 @@ extern "C" { Class RCTBlobClassProvider(const char *name); // Lookup functions -Class RCTFileReaderModuleCls(void) __attribute__((used)); Class RCTBlobManagerCls(void) __attribute__((used)); +Class RCTFileReaderModuleCls(void) __attribute__((used)); #ifdef __cplusplus } diff --git a/packages/react-native/Libraries/Blob/RCTBlobPlugins.mm b/packages/react-native/Libraries/Blob/RCTBlobPlugins.mm index db0dcd82559652..3d0b4bf8aaddbc 100644 --- a/packages/react-native/Libraries/Blob/RCTBlobPlugins.mm +++ b/packages/react-native/Libraries/Blob/RCTBlobPlugins.mm @@ -19,8 +19,8 @@ Class RCTBlobClassProvider(const char *name) { // Intentionally leak to avoid crashing after static destructors are run. static const auto sCoreModuleClassMap = new const std::unordered_map{ - {"FileReaderModule", RCTFileReaderModuleCls}, {"BlobModule", RCTBlobManagerCls}, + {"FileReaderModule", RCTFileReaderModuleCls}, }; auto p = sCoreModuleClassMap->find(name); diff --git a/packages/react-native/Libraries/Blob/__tests__/Blob-test.js b/packages/react-native/Libraries/Blob/__tests__/Blob-test.js index e5308c0d2c5811..303fe1d9fb66bc 100644 --- a/packages/react-native/Libraries/Blob/__tests__/Blob-test.js +++ b/packages/react-native/Libraries/Blob/__tests__/Blob-test.js @@ -78,6 +78,18 @@ describe('Blob', function () { expect(sliceC.size).toBe(Math.min(blob.data.size, 34569) - 34543); }); + it('should slice a blob and sets a contentType', () => { + const blob = new Blob(); + + blob.data.size = 34546; + + const slice = blob.slice(0, 2354, 'text/plain'); + + expect(slice.data.offset).toBe(0); + expect(slice.size).toBe(2354); + expect(slice.type).toBe('text/plain'); + }); + it('should close a blob', () => { const blob = new Blob(); diff --git a/packages/react-native/Libraries/Components/ScrollView/ScrollViewNativeComponent.js b/packages/react-native/Libraries/Components/ScrollView/ScrollViewNativeComponent.js index 2ba1886f478863..69ebcef0d56971 100644 --- a/packages/react-native/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +++ b/packages/react-native/Libraries/Components/ScrollView/ScrollViewNativeComponent.js @@ -86,6 +86,7 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = process: require('../../StyleSheet/processColor').default, }, pointerEvents: true, + isInvertedVirtualizedList: true, }, } : { diff --git a/packages/react-native/Libraries/Components/ScrollView/ScrollViewNativeComponentType.js b/packages/react-native/Libraries/Components/ScrollView/ScrollViewNativeComponentType.js index b1b2df5d84e370..f5a9632ee11999 100644 --- a/packages/react-native/Libraries/Components/ScrollView/ScrollViewNativeComponentType.js +++ b/packages/react-native/Libraries/Components/ScrollView/ScrollViewNativeComponentType.js @@ -41,6 +41,7 @@ export type ScrollViewNativeProps = $ReadOnly<{ endFillColor?: ?ColorValue, fadingEdgeLength?: ?number, indicatorStyle?: ?('default' | 'black' | 'white'), + isInvertedVirtualizedList?: ?boolean, keyboardDismissMode?: ?('none' | 'on-drag' | 'interactive'), maintainVisibleContentPosition?: ?$ReadOnly<{ minIndexForVisible: number, diff --git a/packages/react-native/Libraries/Components/ScrollView/ScrollViewViewConfig.js b/packages/react-native/Libraries/Components/ScrollView/ScrollViewViewConfig.js index 450b56657ec89a..55ba7b7abb0e88 100644 --- a/packages/react-native/Libraries/Components/ScrollView/ScrollViewViewConfig.js +++ b/packages/react-native/Libraries/Components/ScrollView/ScrollViewViewConfig.js @@ -46,6 +46,7 @@ const ScrollViewViewConfig = { fadingEdgeLength: true, indicatorStyle: true, inverted: true, + isInvertedVirtualizedList: true, keyboardDismissMode: true, maintainVisibleContentPosition: true, maximumZoomScale: true, diff --git a/packages/react-native/Libraries/Components/TextInput/TextInput.d.ts b/packages/react-native/Libraries/Components/TextInput/TextInput.d.ts index 566bcf8f3cfa02..3cc3114ef82928 100644 --- a/packages/react-native/Libraries/Components/TextInput/TextInput.d.ts +++ b/packages/react-native/Libraries/Components/TextInput/TextInput.d.ts @@ -205,13 +205,6 @@ export interface TextInputIOSProps { * Give the keyboard and the system information about the expected * semantic meaning for the content that users enter. * - * For iOS 11+ you can set `textContentType` to `username` or `password` to - * enable autofill of login details from the device keychain. - * - * For iOS 12+ `newPassword` can be used to indicate a new password input the - * user may want to save in the keychain, and `oneTimeCode` can be used to indicate - * that a field can be autofilled by a code arriving in an SMS. - * * To disable autofill, set textContentType to `none`. * * Possible values for `textContentType` are: @@ -223,6 +216,15 @@ export interface TextInputIOSProps { * - `'addressState'` * - `'countryName'` * - `'creditCardNumber'` + * - `'creditCardExpiration'` (iOS 17+) + * - `'creditCardExpirationMonth'` (iOS 17+) + * - `'creditCardExpirationYear'` (iOS 17+) + * - `'creditCardSecurityCode'` (iOS 17+) + * - `'creditCardType'` (iOS 17+) + * - `'creditCardName'` (iOS 17+) + * - `'creditCardGivenName'` (iOS 17+) + * - `'creditCardMiddleName'` (iOS 17+) + * - `'creditCardFamilyName'` (iOS 17+) * - `'emailAddress'` * - `'familyName'` * - `'fullStreetAddress'` @@ -244,6 +246,10 @@ export interface TextInputIOSProps { * - `'password'` * - `'newPassword'` * - `'oneTimeCode'` + * - `'birthdate'` (iOS 17+) + * - `'birthdateDay'` (iOS 17+) + * - `'birthdateMonth'` (iOS 17+) + * - `'birthdateYear'` (iOS 17+) * */ textContentType?: @@ -254,6 +260,15 @@ export interface TextInputIOSProps { | 'addressState' | 'countryName' | 'creditCardNumber' + | 'creditCardExpiration' + | 'creditCardExpirationMonth' + | 'creditCardExpirationYear' + | 'creditCardSecurityCode' + | 'creditCardType' + | 'creditCardName' + | 'creditCardGivenName' + | 'creditCardMiddleName' + | 'creditCardFamilyName' | 'emailAddress' | 'familyName' | 'fullStreetAddress' @@ -275,6 +290,10 @@ export interface TextInputIOSProps { | 'password' | 'newPassword' | 'oneTimeCode' + | 'birthdate' + | 'birthdateDay' + | 'birthdateMonth' + | 'birthdateYear' | undefined; /** @@ -569,6 +588,11 @@ export interface TextInputProps | 'cc-exp-month' | 'cc-exp-year' | 'cc-number' + | 'cc-name' + | 'cc-given-name' + | 'cc-middle-name' + | 'cc-family-name' + | 'cc-type' | 'country' | 'current-password' | 'email' diff --git a/packages/react-native/Libraries/Components/TextInput/TextInput.flow.js b/packages/react-native/Libraries/Components/TextInput/TextInput.flow.js index 59c54b8451570e..2b800d3257c599 100644 --- a/packages/react-native/Libraries/Components/TextInput/TextInput.flow.js +++ b/packages/react-native/Libraries/Components/TextInput/TextInput.flow.js @@ -162,6 +162,15 @@ export type TextContentType = | 'addressState' | 'countryName' | 'creditCardNumber' + | 'creditCardExpiration' + | 'creditCardExpirationMonth' + | 'creditCardExpirationYear' + | 'creditCardSecurityCode' + | 'creditCardType' + | 'creditCardName' + | 'creditCardGivenName' + | 'creditCardMiddleName' + | 'creditCardFamilyName' | 'emailAddress' | 'familyName' | 'fullStreetAddress' @@ -182,7 +191,11 @@ export type TextContentType = | 'username' | 'password' | 'newPassword' - | 'oneTimeCode'; + | 'oneTimeCode' + | 'birthdate' + | 'birthdateDay' + | 'birthdateMonth' + | 'birthdateYear'; export type enterKeyHintType = | 'enter' @@ -418,7 +431,16 @@ export type Props = $ReadOnly<{| * - `additional-name` * - `address-line1` * - `address-line2` + * - `birthdate-day` (iOS 17+) + * - `birthdate-full` (iOS 17+) + * - `birthdate-month` (iOS 17+) + * - `birthdate-year` (iOS 17+) * - `cc-number` + * - `cc-csc` (iOS 17+) + * - `cc-exp` (iOS 17+) + * - `cc-exp-day` (iOS 17+) + * - `cc-exp-month` (iOS 17+) + * - `cc-exp-year` (iOS 17+) * - `country` * - `current-password` * - `email` @@ -437,6 +459,11 @@ export type Props = $ReadOnly<{| * * The following values work on iOS only: * + * - `cc-name` (iOS 17+) + * - `cc-given-name` (iOS 17+) + * - `cc-middle-name` (iOS 17+) + * - `cc-family-name` (iOS 17+) + * - `cc-type` (iOS 17+) * - `nickname` * - `organization` * - `organization-title` @@ -444,15 +471,6 @@ export type Props = $ReadOnly<{| * * The following values work on Android only: * - * - `birthdate-day` - * - `birthdate-full` - * - `birthdate-month` - * - `birthdate-year` - * - `cc-csc` - * - `cc-exp` - * - `cc-exp-day` - * - `cc-exp-month` - * - `cc-exp-year` * - `gender` * - `name-family` * - `name-given` @@ -488,6 +506,11 @@ export type Props = $ReadOnly<{| | 'cc-exp-month' | 'cc-exp-year' | 'cc-number' + | 'cc-name' + | 'cc-given-name' + | 'cc-middle-name' + | 'cc-family-name' + | 'cc-type' | 'country' | 'current-password' | 'email' diff --git a/packages/react-native/Libraries/Components/TextInput/TextInput.js b/packages/react-native/Libraries/Components/TextInput/TextInput.js index 02180771ab350b..281106fafbbd5e 100644 --- a/packages/react-native/Libraries/Components/TextInput/TextInput.js +++ b/packages/react-native/Libraries/Components/TextInput/TextInput.js @@ -200,6 +200,15 @@ export type TextContentType = | 'addressState' | 'countryName' | 'creditCardNumber' + | 'creditCardExpiration' + | 'creditCardExpirationMonth' + | 'creditCardExpirationYear' + | 'creditCardSecurityCode' + | 'creditCardType' + | 'creditCardName' + | 'creditCardGivenName' + | 'creditCardMiddleName' + | 'creditCardFamilyName' | 'emailAddress' | 'familyName' | 'fullStreetAddress' @@ -220,7 +229,11 @@ export type TextContentType = | 'username' | 'password' | 'newPassword' - | 'oneTimeCode'; + | 'oneTimeCode' + | 'birthdate' + | 'birthdateDay' + | 'birthdateMonth' + | 'birthdateYear'; export type enterKeyHintType = // Cross Platform @@ -475,7 +488,16 @@ export type Props = $ReadOnly<{| * - `additional-name` * - `address-line1` * - `address-line2` + * - `birthdate-day` (iOS 17+) + * - `birthdate-full` (iOS 17+) + * - `birthdate-month` (iOS 17+) + * - `birthdate-year` (iOS 17+) * - `cc-number` + * - `cc-csc` (iOS 17+) + * - `cc-exp` (iOS 17+) + * - `cc-exp-day` (iOS 17+) + * - `cc-exp-month` (iOS 17+) + * - `cc-exp-year` (iOS 17+) * - `country` * - `current-password` * - `email` @@ -494,6 +516,11 @@ export type Props = $ReadOnly<{| * * The following values work on iOS only: * + * - `cc-name` (iOS 17+) + * - `cc-given-name` (iOS 17+) + * - `cc-middle-name` (iOS 17+) + * - `cc-family-name` (iOS 17+) + * - `cc-type` (iOS 17+) * - `nickname` * - `organization` * - `organization-title` @@ -501,15 +528,6 @@ export type Props = $ReadOnly<{| * * The following values work on Android only: * - * - `birthdate-day` - * - `birthdate-full` - * - `birthdate-month` - * - `birthdate-year` - * - `cc-csc` - * - `cc-exp` - * - `cc-exp-day` - * - `cc-exp-month` - * - `cc-exp-year` * - `gender` * - `name-family` * - `name-given` @@ -545,6 +563,11 @@ export type Props = $ReadOnly<{| | 'cc-exp-month' | 'cc-exp-year' | 'cc-number' + | 'cc-name' + | 'cc-given-name' + | 'cc-middle-name' + | 'cc-family-name' + | 'cc-type' | 'country' | 'current-password' | 'email' @@ -1585,7 +1608,20 @@ const autoCompleteWebToAutoCompleteAndroidMap = { const autoCompleteWebToTextContentTypeMap = { 'address-line1': 'streetAddressLine1', 'address-line2': 'streetAddressLine2', + bday: 'birthdate', + 'bday-day': 'birthdateDay', + 'bday-month': 'birthdateMonth', + 'bday-year': 'birthdateYear', + 'cc-csc': 'creditCardSecurityCode', + 'cc-exp-month': 'creditCardExpirationMonth', + 'cc-exp-year': 'creditCardExpirationYear', + 'cc-exp': 'creditCardExpiration', + 'cc-given-name': 'creditCardGivenName', + 'cc-additional-name': 'creditCardMiddleName', + 'cc-family-name': 'creditCardFamilyName', + 'cc-name': 'creditCardName', 'cc-number': 'creditCardNumber', + 'cc-type': 'creditCardType', 'current-password': 'password', country: 'countryName', email: 'emailAddress', diff --git a/packages/react-native/Libraries/Components/Touchable/TouchableBounce.js b/packages/react-native/Libraries/Components/Touchable/TouchableBounce.js index 5a8d97e85c0f86..4fcbe801e16051 100644 --- a/packages/react-native/Libraries/Components/Touchable/TouchableBounce.js +++ b/packages/react-native/Libraries/Components/Touchable/TouchableBounce.js @@ -181,7 +181,7 @@ class TouchableBounce extends React.Component { accessibilityElementsHidden={ this.props['aria-hidden'] ?? this.props.accessibilityElementsHidden } - nativeID={this.props.nativeID} + nativeID={this.props.id ?? this.props.nativeID} testID={this.props.testID} hitSlop={this.props.hitSlop} focusable={ diff --git a/packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js b/packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js index c937344451ce69..998a7d02f3b45a 100644 --- a/packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js +++ b/packages/react-native/Libraries/Components/Touchable/TouchableHighlight.js @@ -344,7 +344,7 @@ class TouchableHighlight extends React.Component { focusable={ this.props.focusable !== false && this.props.onPress !== undefined } - nativeID={this.props.nativeID} + nativeID={this.props.id ?? this.props.nativeID} testID={this.props.testID} ref={this.props.hostRef} {...eventHandlersWithoutBlurAndFocus}> diff --git a/packages/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.js b/packages/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.js index 2571ddd0b7ab3a..5c5aa5a31daf30 100644 --- a/packages/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.js +++ b/packages/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.js @@ -322,7 +322,7 @@ class TouchableNativeFeedback extends React.Component { this.props.focusable !== false && this.props.onPress !== undefined && !this.props.disabled, - nativeID: this.props.nativeID, + nativeID: this.props.id ?? this.props.nativeID, nextFocusDown: this.props.nextFocusDown, nextFocusForward: this.props.nextFocusForward, nextFocusLeft: this.props.nextFocusLeft, diff --git a/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js b/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js index 02dc8abd365bfc..eff9b2bed40001 100644 --- a/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js +++ b/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js @@ -275,7 +275,7 @@ class TouchableOpacity extends React.Component { this.props['aria-hidden'] ?? this.props.accessibilityElementsHidden } style={[this.props.style, {opacity: this.state.anim}]} - nativeID={this.props.nativeID} + nativeID={this.props.id ?? this.props.nativeID} testID={this.props.testID} onLayout={this.props.onLayout} nextFocusDown={this.props.nextFocusDown} diff --git a/packages/react-native/Libraries/Components/View/View.js b/packages/react-native/Libraries/Components/View/View.js index a10c06231fbfa7..d9814254743da9 100644 --- a/packages/react-native/Libraries/Components/View/View.js +++ b/packages/react-native/Libraries/Components/View/View.js @@ -12,7 +12,6 @@ import type {ViewProps} from './ViewPropTypes'; import flattenStyle from '../../StyleSheet/flattenStyle'; import TextAncestor from '../../Text/TextAncestor'; -import {getAccessibilityRoleFromRole} from '../../Utilities/AcessibilityMapping'; import ViewNativeComponent from './ViewNativeComponent'; import * as React from 'react'; @@ -35,7 +34,6 @@ const View: React.AbstractComponent< accessibilityLabel, accessibilityLabelledBy, accessibilityLiveRegion, - accessibilityRole, accessibilityState, accessibilityValue, 'aria-busy': ariaBusy, @@ -56,7 +54,6 @@ const View: React.AbstractComponent< importantForAccessibility, nativeID, pointerEvents, - role, tabIndex, ...otherProps }: ViewProps, @@ -113,9 +110,6 @@ const View: React.AbstractComponent< accessibilityLabel={ariaLabel ?? accessibilityLabel} focusable={tabIndex !== undefined ? !tabIndex : focusable} accessibilityState={_accessibilityState} - accessibilityRole={ - role ? getAccessibilityRoleFromRole(role) : accessibilityRole - } accessibilityElementsHidden={ariaHidden ?? accessibilityElementsHidden} accessibilityLabelledBy={_accessibilityLabelledBy} accessibilityValue={_accessibilityValue} diff --git a/packages/react-native/Libraries/Components/View/ViewPropTypes.js b/packages/react-native/Libraries/Components/View/ViewPropTypes.js index 1a37bd3206b286..501eb311a7ceeb 100644 --- a/packages/react-native/Libraries/Components/View/ViewPropTypes.js +++ b/packages/react-native/Libraries/Components/View/ViewPropTypes.js @@ -105,6 +105,10 @@ type PointerEventProps = $ReadOnly<{| onPointerOverCapture?: ?(e: PointerEvent) => void, onPointerOut?: ?(e: PointerEvent) => void, onPointerOutCapture?: ?(e: PointerEvent) => void, + onGotPointerCapture?: ?(e: PointerEvent) => void, + onGotPointerCaptureCapture?: ?(e: PointerEvent) => void, + onLostPointerCapture?: ?(e: PointerEvent) => void, + onLostPointerCaptureCapture?: ?(e: PointerEvent) => void, |}>; type FocusEventProps = $ReadOnly<{| @@ -160,8 +164,8 @@ type GestureResponderEventProps = $ReadOnly<{| * `View.props.onResponderGrant: (event) => {}`, where `event` is a synthetic * touch event as described above. * - * PanResponder includes a note `// TODO: t7467124 investigate if this can be removed` that - * should help fixing this return type. + * Return true from this callback to prevent any other native components from + * becoming responder until this responder terminates (Android-only). * * See https://reactnative.dev/docs/view#onrespondergrant */ @@ -565,7 +569,7 @@ export type ViewProps = $ReadOnly<{| collapsable?: ?boolean, /** - * Used to locate this view from native classes. + * Used to locate this view from native classes. Has precedence over `nativeID` prop. * * > This disables the 'layout-only view removal' optimization for this view! * diff --git a/packages/react-native/Libraries/Components/View/__tests__/View-test.js b/packages/react-native/Libraries/Components/View/__tests__/View-test.js index 66fac79f4ab4e2..18649af87ee377 100644 --- a/packages/react-native/Libraries/Components/View/__tests__/View-test.js +++ b/packages/react-native/Libraries/Components/View/__tests__/View-test.js @@ -160,6 +160,7 @@ describe('View compat with web', () => { aria-setsize={5} aria-sort="ascending" importantForAccessibility="no-hide-descendants" + role="main" /> `); }); diff --git a/packages/react-native/Libraries/Core/ExceptionsManager.js b/packages/react-native/Libraries/Core/ExceptionsManager.js index d1de23cfa023f6..78252549622736 100644 --- a/packages/react-native/Libraries/Core/ExceptionsManager.js +++ b/packages/react-native/Libraries/Core/ExceptionsManager.js @@ -78,6 +78,19 @@ function reportException( message = e.jsEngine == null ? message : `${message}, js engine: ${e.jsEngine}`; + // $FlowFixMe[unclear-type] + const extraData: Object = { + // $FlowFixMe[incompatible-use] we can't define a type with a Symbol-keyed field in flow + ...e[decoratedExtraDataKey], + jsEngine: e.jsEngine, + rawStack: e.stack, + }; + if (e.cause != null && typeof e.cause === 'object') { + extraData.stackSymbols = e.cause.stackSymbols; + extraData.stackReturnAddresses = e.cause.stackReturnAddresses; + extraData.stackElements = e.cause.stackElements; + } + const data = preprocessException({ message, originalMessage: message === originalMessage ? null : originalMessage, @@ -87,12 +100,7 @@ function reportException( stack, id: currentExceptionID, isFatal, - extraData: { - // $FlowFixMe[incompatible-use] we can't define a type with a Symbol-keyed field in flow - ...e[decoratedExtraDataKey], - jsEngine: e.jsEngine, - rawStack: e.stack, - }, + extraData, }); if (reportToConsole) { diff --git a/packages/react-native/Libraries/Core/ExtendedError.js b/packages/react-native/Libraries/Core/ExtendedError.js index 2ff43c88a9c9e7..7ce700eb119699 100644 --- a/packages/react-native/Libraries/Core/ExtendedError.js +++ b/packages/react-native/Libraries/Core/ExtendedError.js @@ -18,4 +18,16 @@ export type ExtendedError = Error & // Note: A field keyed by the Symbol ExceptionsManager.decoratedExtraDataKey is also read from ExtendedErrors. // This field isn't documented in the types as Flow does not support this usecase, but it's effectively: // [decoratedExtraDataKey]?: {[string]: mixed}, + + // Included for native errors + cause?: { + name: string, + message: string, + // $FlowFixMe[unclear-type] + stackElements?: $ReadOnlyArray, + // $FlowFixMe[unclear-type] + stackSymbols?: $ReadOnlyArray, + // $FlowFixMe[unclear-type] + stackReturnAddresses?: $ReadOnlyArray, + }, }; diff --git a/packages/react-native/Libraries/Core/setUpIntersectionObserver.js b/packages/react-native/Libraries/Core/setUpIntersectionObserver.js new file mode 100644 index 00000000000000..84fecbc0b56361 --- /dev/null +++ b/packages/react-native/Libraries/Core/setUpIntersectionObserver.js @@ -0,0 +1,16 @@ +/** + * 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 + */ + +import {polyfillGlobal} from '../Utilities/PolyfillFunctions'; + +polyfillGlobal( + 'IntersectionObserver', + () => require('../IntersectionObserver/IntersectionObserver').default, +); diff --git a/packages/react-native/Libraries/Core/setUpMutationObserver.js b/packages/react-native/Libraries/Core/setUpMutationObserver.js new file mode 100644 index 00000000000000..6e34a2e5882bdd --- /dev/null +++ b/packages/react-native/Libraries/Core/setUpMutationObserver.js @@ -0,0 +1,16 @@ +/** + * 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 + */ + +import {polyfillGlobal} from '../Utilities/PolyfillFunctions'; + +polyfillGlobal( + 'MutationObserver', + () => require('../MutationObserver/MutationObserver').default, +); diff --git a/packages/react-native/Libraries/Core/setUpPerformance.js b/packages/react-native/Libraries/Core/setUpPerformance.js index c5f25890cdcf72..6ed3fce86e501c 100644 --- a/packages/react-native/Libraries/Core/setUpPerformance.js +++ b/packages/react-native/Libraries/Core/setUpPerformance.js @@ -19,18 +19,11 @@ if (NativePerformance) { } else { if (!global.performance) { // $FlowExpectedError[cannot-write] - global.performance = ({}: {now?: () => number}); - } - - /** - * Returns a double, measured in milliseconds. - * https://developer.mozilla.org/en-US/docs/Web/API/Performance/now - */ - if (typeof global.performance.now !== 'function') { - // $FlowExpectedError[cannot-write] - global.performance.now = function () { - const performanceNow = global.nativePerformanceNow || Date.now; - return performanceNow(); - }; + global.performance = ({ + now: function () { + const performanceNow = global.nativePerformanceNow || Date.now; + return performanceNow(); + }, + }: {now?: () => number}); } } diff --git a/packages/react-native/Libraries/Image/ImageBackground.js b/packages/react-native/Libraries/Image/ImageBackground.js index 7a51378ce4491a..b0ce97df3a582a 100644 --- a/packages/react-native/Libraries/Image/ImageBackground.js +++ b/packages/react-native/Libraries/Image/ImageBackground.js @@ -84,6 +84,7 @@ class ImageBackground extends React.Component { importantForAccessibility={importantForAccessibility} style={style} ref={this._captureRef}> + {/* $FlowFixMe[incompatible-use] */} +#import -@interface RCTSurfaceHostingComponentController : CKComponentController +@interface RCTBundleAssetImageLoader : NSObject @end diff --git a/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.mm b/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.mm new file mode 100644 index 00000000000000..f412e9b74c1058 --- /dev/null +++ b/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.mm @@ -0,0 +1,83 @@ +/* + * 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. + */ + +#import + +#import +#import + +#import +#import + +#import "RCTImagePlugins.h" + +@interface RCTBundleAssetImageLoader () +@end + +@implementation RCTBundleAssetImageLoader + +RCT_EXPORT_MODULE() + +- (BOOL)canLoadImageURL:(NSURL *)requestURL +{ + return RCTIsBundleAssetURL(requestURL); +} + +- (BOOL)requiresScheduling +{ + // Don't schedule this loader on the URL queue so we can load the + // local assets synchronously to avoid flickers. + return NO; +} + +- (BOOL)shouldCacheLoadedImages +{ + // UIImage imageNamed handles the caching automatically so we don't want + // to add it to the image cache. + return NO; +} + +- (nullable RCTImageLoaderCancellationBlock)loadImageForURL:(NSURL *)imageURL + size:(CGSize)size + scale:(CGFloat)scale + resizeMode:(RCTResizeMode)resizeMode + progressHandler:(RCTImageLoaderProgressBlock)progressHandler + partialLoadHandler:(RCTImageLoaderPartialLoadBlock)partialLoadHandler + completionHandler:(RCTImageLoaderCompletionBlock)completionHandler +{ + UIImage *image = RCTImageFromLocalAssetURL(imageURL); + if (image) { + if (progressHandler) { + progressHandler(1, 1); + } + completionHandler(nil, image); + } else { + NSString *message = [NSString stringWithFormat:@"Could not find image %@", imageURL]; + RCTLogWarn(@"%@", message); + completionHandler(RCTErrorWithMessage(message), nil); + } + + return nil; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params +{ + return nullptr; +} + +- (float)loaderPriority +{ + return 1; +} + +@end + +Class RCTBundleAssetImageLoaderCls(void) +{ + return RCTBundleAssetImageLoader.class; +} diff --git a/packages/react-native/Libraries/Image/RCTDisplayWeakRefreshable.m b/packages/react-native/Libraries/Image/RCTDisplayWeakRefreshable.mm similarity index 100% rename from packages/react-native/Libraries/Image/RCTDisplayWeakRefreshable.m rename to packages/react-native/Libraries/Image/RCTDisplayWeakRefreshable.mm diff --git a/packages/react-native/Libraries/Image/RCTImageBlurUtils.m b/packages/react-native/Libraries/Image/RCTImageBlurUtils.mm similarity index 100% rename from packages/react-native/Libraries/Image/RCTImageBlurUtils.m rename to packages/react-native/Libraries/Image/RCTImageBlurUtils.mm diff --git a/packages/react-native/Libraries/Image/RCTImageCache.m b/packages/react-native/Libraries/Image/RCTImageCache.mm similarity index 100% rename from packages/react-native/Libraries/Image/RCTImageCache.m rename to packages/react-native/Libraries/Image/RCTImageCache.mm diff --git a/packages/react-native/Libraries/Image/RCTImageShadowView.m b/packages/react-native/Libraries/Image/RCTImageShadowView.mm similarity index 100% rename from packages/react-native/Libraries/Image/RCTImageShadowView.m rename to packages/react-native/Libraries/Image/RCTImageShadowView.mm diff --git a/packages/react-native/Libraries/Image/RCTImageUtils.m b/packages/react-native/Libraries/Image/RCTImageUtils.mm similarity index 97% rename from packages/react-native/Libraries/Image/RCTImageUtils.m rename to packages/react-native/Libraries/Image/RCTImageUtils.mm index a55c81fb41f45c..38fbd6bad434af 100644 --- a/packages/react-native/Libraries/Image/RCTImageUtils.m +++ b/packages/react-native/Libraries/Image/RCTImageUtils.mm @@ -212,7 +212,7 @@ BOOL RCTUpscalingRequired( // Calculate aspect ratios if needed (don't bother if resizeMode == stretch) CGFloat aspect = 0.0, targetAspect = 0.0; - if (resizeMode != UIViewContentModeScaleToFill) { + if (resizeMode != RCTResizeModeStretch) { aspect = sourceSize.width / sourceSize.height; targetAspect = destSize.width / destSize.height; if (aspect == targetAspect) { @@ -267,8 +267,8 @@ BOOL RCTUpscalingRequired( CFRelease(sourceRef); return nil; } - NSNumber *width = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth); - NSNumber *height = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight); + NSNumber *width = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth); + NSNumber *height = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight); CGSize sourceSize = {width.doubleValue, height.doubleValue}; CFRelease(imageProperties); @@ -281,7 +281,7 @@ BOOL RCTUpscalingRequired( destScale = RCTScreenScale(); } - if (resizeMode == UIViewContentModeScaleToFill) { + if (resizeMode == RCTResizeModeStretch) { // Decoder cannot change aspect ratio, so RCTResizeModeStretch is equivalent // to RCTResizeModeCover for our purposes resizeMode = RCTResizeModeCover; diff --git a/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.h b/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.h index 453accef355c48..c7d3465b82704f 100644 --- a/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.h +++ b/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.h @@ -7,6 +7,7 @@ #import -@interface RCTLocalAssetImageLoader : NSObject +__deprecated_msg("Use RCTBundleAssetImageLoader instead") @interface RCTLocalAssetImageLoader + : NSObject @end diff --git a/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.mm b/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.mm index a79b4666b1850d..8f6e1b5c0d1fae 100644 --- a/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.mm +++ b/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.mm @@ -24,7 +24,7 @@ @implementation RCTLocalAssetImageLoader - (BOOL)canLoadImageURL:(NSURL *)requestURL { - return RCTIsLocalAssetURL(requestURL); + return RCTIsBundleAssetURL(requestURL); } - (BOOL)requiresScheduling @@ -70,6 +70,11 @@ - (nullable RCTImageLoaderCancellationBlock)loadImageForURL:(NSURL *)imageURL return nullptr; } +- (float)loaderPriority +{ + return 0; +} + @end Class RCTLocalAssetImageLoaderCls(void) diff --git a/packages/react-native/Libraries/Image/RCTResizeMode.m b/packages/react-native/Libraries/Image/RCTResizeMode.mm similarity index 100% rename from packages/react-native/Libraries/Image/RCTResizeMode.m rename to packages/react-native/Libraries/Image/RCTResizeMode.mm diff --git a/packages/react-native/Libraries/Image/RCTUIImageViewAnimated.m b/packages/react-native/Libraries/Image/RCTUIImageViewAnimated.mm similarity index 100% rename from packages/react-native/Libraries/Image/RCTUIImageViewAnimated.m rename to packages/react-native/Libraries/Image/RCTUIImageViewAnimated.mm diff --git a/packages/react-native/Libraries/Image/React-RCTImage.podspec b/packages/react-native/Libraries/Image/React-RCTImage.podspec index f6a91baaf99c27..e53162bee2e5b6 100644 --- a/packages/react-native/Libraries/Image/React-RCTImage.podspec +++ b/packages/react-native/Libraries/Image/React-RCTImage.podspec @@ -51,6 +51,7 @@ Pod::Spec.new do |s| "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", "HEADER_SEARCH_PATHS" => header_search_paths.join(' ') } + s.framework = ["Accelerate", "UIKit"] s.dependency "RCT-Folly", folly_version s.dependency "React-Codegen", version diff --git a/packages/react-native/Libraries/Interaction/PanResponder.js b/packages/react-native/Libraries/Interaction/PanResponder.js index e64011e7873a6b..71bec342048681 100644 --- a/packages/react-native/Libraries/Interaction/PanResponder.js +++ b/packages/react-native/Libraries/Interaction/PanResponder.js @@ -574,9 +574,6 @@ function clearInteractionHandle( } } -export type PanResponderInstance = $Call< - $PropertyType, - PanResponderConfig, ->; +export type PanResponderInstance = ReturnType<(typeof PanResponder)['create']>; export default PanResponder; diff --git a/packages/react-native/Libraries/IntersectionObserver/IntersectionObserver.js b/packages/react-native/Libraries/IntersectionObserver/IntersectionObserver.js new file mode 100644 index 00000000000000..23d2c158569c0b --- /dev/null +++ b/packages/react-native/Libraries/IntersectionObserver/IntersectionObserver.js @@ -0,0 +1,252 @@ +/** + * 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 + */ + +// flowlint unsafe-getters-setters:off + +import type IntersectionObserverEntry from './IntersectionObserverEntry'; +import type {IntersectionObserverId} from './IntersectionObserverManager'; + +import ReactNativeElement from '../DOM/Nodes/ReactNativeElement'; +import * as IntersectionObserverManager from './IntersectionObserverManager'; + +export type IntersectionObserverCallback = ( + entries: Array, + observer: IntersectionObserver, +) => mixed; + +type IntersectionObserverInit = { + // root?: ReactNativeElement, // This option exists on the Web but it's not currently supported in React Native. + // rootMargin?: string, // This option exists on the Web but it's not currently supported in React Native. + threshold?: number | $ReadOnlyArray, +}; + +/** + * The [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) + * provides a way to asynchronously observe changes in the intersection of a + * target element with an ancestor element or with a top-level document's + * viewport. + * + * The ancestor element or viewport is referred to as the root. + * + * When an `IntersectionObserver` is created, it's configured to watch for given + * ratios of visibility within the root. + * + * The configuration cannot be changed once the `IntersectionObserver` is + * created, so a given observer object is only useful for watching for specific + * changes in degree of visibility; however, you can watch multiple target + * elements with the same observer. + * + * This implementation only supports the `threshold` option at the moment + * (`root` and `rootMargin` are not supported). + */ +export default class IntersectionObserver { + _callback: IntersectionObserverCallback; + _thresholds: $ReadOnlyArray; + _observationTargets: Set = new Set(); + _intersectionObserverId: ?IntersectionObserverId; + + constructor( + callback: IntersectionObserverCallback, + options?: IntersectionObserverInit, + ): void { + if (callback == null) { + throw new TypeError( + "Failed to construct 'IntersectionObserver': 1 argument required, but only 0 present.", + ); + } + + if (typeof callback !== 'function') { + throw new TypeError( + "Failed to construct 'IntersectionObserver': parameter 1 is not of type 'Function'.", + ); + } + + // $FlowExpectedError[prop-missing] it's not typed in React Native but exists on Web. + if (options?.root != null) { + throw new TypeError( + "Failed to construct 'IntersectionObserver': root is not supported", + ); + } + + // $FlowExpectedError[prop-missing] it's not typed in React Native but exists on Web. + if (options?.rootMargin != null) { + throw new TypeError( + "Failed to construct 'IntersectionObserver': rootMargin is not supported", + ); + } + + this._callback = callback; + this._thresholds = normalizeThresholds(options?.threshold); + } + + /** + * The `ReactNativeElement` whose bounds are used as the bounding box when + * testing for intersection. + * If no `root` value was passed to the constructor or its value is `null`, + * the root view is used. + * + * NOTE: This cannot currently be configured and `root` is always `null`. + */ + get root(): ReactNativeElement | null { + return null; + } + + /** + * String with syntax similar to that of the CSS `margin` property. + * Each side of the rectangle represented by `rootMargin` is added to the + * corresponding side in the root element's bounding box before the + * intersection test is performed. + * + * NOTE: This cannot currently be configured and `rootMargin` is always + * `null`. + */ + get rootMargin(): string { + return '0px 0px 0px 0px'; + } + + /** + * A list of thresholds, sorted in increasing numeric order, where each + * threshold is a ratio of intersection area to bounding box area of an + * observed target. + * Notifications for a target are generated when any of the thresholds are + * crossed for that target. + * If no value was passed to the constructor, `0` is used. + */ + get thresholds(): $ReadOnlyArray { + return this._thresholds; + } + + /** + * Adds an element to the set of target elements being watched by the + * `IntersectionObserver`. + * One observer has one set of thresholds and one root, but can watch multiple + * target elements for visibility changes. + * To stop observing the element, call `IntersectionObserver.unobserve()`. + */ + observe(target: ReactNativeElement): void { + if (!(target instanceof ReactNativeElement)) { + throw new TypeError( + "Failed to execute 'observe' on 'IntersectionObserver': parameter 1 is not of type 'ReactNativeElement'.", + ); + } + + if (this._observationTargets.has(target)) { + return; + } + + IntersectionObserverManager.observe({ + intersectionObserverId: this._getOrCreateIntersectionObserverId(), + target, + }); + + this._observationTargets.add(target); + } + + /** + * Instructs the `IntersectionObserver` to stop observing the specified target + * element. + */ + unobserve(target: ReactNativeElement): void { + if (!(target instanceof ReactNativeElement)) { + throw new TypeError( + "Failed to execute 'unobserve' on 'IntersectionObserver': parameter 1 is not of type 'ReactNativeElement'.", + ); + } + + if (!this._observationTargets.has(target)) { + return; + } + + const intersectionObserverId = this._intersectionObserverId; + if (intersectionObserverId == null) { + // This is unexpected if the target is in `_observationTargets`. + console.error( + "Unexpected state in 'IntersectionObserver': could not find observer ID to unobserve target.", + ); + return; + } + + IntersectionObserverManager.unobserve(intersectionObserverId, target); + this._observationTargets.delete(target); + + if (this._observationTargets.size === 0) { + IntersectionObserverManager.unregisterObserver(intersectionObserverId); + this._intersectionObserverId = null; + } + } + + /** + * Stops watching all of its target elements for visibility changes. + */ + disconnect(): void { + for (const target of this._observationTargets.keys()) { + this.unobserve(target); + } + } + + _getOrCreateIntersectionObserverId(): IntersectionObserverId { + let intersectionObserverId = this._intersectionObserverId; + if (intersectionObserverId == null) { + intersectionObserverId = IntersectionObserverManager.registerObserver( + this, + this._callback, + ); + this._intersectionObserverId = intersectionObserverId; + } + return intersectionObserverId; + } + + // Only for tests + __getObserverID(): ?IntersectionObserverId { + return this._intersectionObserverId; + } +} + +/** + * Converts the user defined `threshold` value into an array of sorted valid + * threshold options for `IntersectionObserver` (double ∈ [0, 1]). + * + * @example + * normalizeThresholds(0.5); // → [0.5] + * normalizeThresholds([1, 0.5, 0]); // → [0, 0.5, 1] + * normalizeThresholds(['1', '0.5', '0']); // → [0, 0.5, 1] + */ +function normalizeThresholds(threshold: mixed): $ReadOnlyArray { + if (Array.isArray(threshold)) { + if (threshold.length > 0) { + return threshold.map(normalizeThresholdValue).sort(); + } else { + return [0]; + } + } + + return [normalizeThresholdValue(threshold)]; +} + +function normalizeThresholdValue(threshold: mixed): number { + if (threshold == null) { + return 0; + } + + const thresholdAsNumber = Number(threshold); + if (!Number.isFinite(thresholdAsNumber)) { + throw new TypeError( + "Failed to read the 'threshold' property from 'IntersectionObserverInit': The provided double value is non-finite.", + ); + } + + if (thresholdAsNumber < 0 || thresholdAsNumber > 1) { + throw new RangeError( + "Failed to construct 'IntersectionObserver': Threshold values must be numbers between 0 and 1", + ); + } + + return thresholdAsNumber; +} diff --git a/packages/react-native/Libraries/IntersectionObserver/IntersectionObserverEntry.js b/packages/react-native/Libraries/IntersectionObserver/IntersectionObserverEntry.js new file mode 100644 index 00000000000000..315a53446c63e5 --- /dev/null +++ b/packages/react-native/Libraries/IntersectionObserver/IntersectionObserverEntry.js @@ -0,0 +1,140 @@ +/** + * 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 + */ + +// flowlint unsafe-getters-setters:off + +import type ReactNativeElement from '../DOM/Nodes/ReactNativeElement'; +import type {InternalInstanceHandle} from '../Renderer/shims/ReactNativeTypes'; +import type {NativeIntersectionObserverEntry} from './NativeIntersectionObserver'; + +import DOMRectReadOnly from '../DOM/Geometry/DOMRectReadOnly'; +import {getPublicInstanceFromInternalInstanceHandle} from '../DOM/Nodes/ReadOnlyNode'; + +/** + * The [`IntersectionObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry) + * interface of the Intersection Observer API describes the intersection between + * the target element and its root container at a specific moment of transition. + * + * An array of `IntersectionObserverEntry` is delivered to + * `IntersectionObserver` callbacks as the first argument. + */ +export default class IntersectionObserverEntry { + // We lazily compute all the properties from the raw entry provided by the + // native module, so we avoid unnecessary work. + _nativeEntry: NativeIntersectionObserverEntry; + + constructor(nativeEntry: NativeIntersectionObserverEntry) { + this._nativeEntry = nativeEntry; + } + + /** + * Returns the bounds rectangle of the target element as a `DOMRectReadOnly`. + * The bounds are computed as described in the documentation for + * [`Element.getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). + */ + get boundingClientRect(): DOMRectReadOnly { + const targetRect = this._nativeEntry.targetRect; + return new DOMRectReadOnly( + targetRect[0], + targetRect[1], + targetRect[2], + targetRect[3], + ); + } + + /** + * Returns the ratio of the `intersectionRect` to the `boundingClientRect`. + */ + get intersectionRatio(): number { + const intersectionRect = this.intersectionRect; + const boundingClientRect = this.boundingClientRect; + + if (boundingClientRect.width === 0 || boundingClientRect.height === 0) { + return 0; + } + + return ( + (intersectionRect.width * intersectionRect.height) / + (boundingClientRect.width * boundingClientRect.height) + ); + } + + /** + * Returns a `DOMRectReadOnly` representing the target's visible area. + */ + get intersectionRect(): DOMRectReadOnly { + const intersectionRect = this._nativeEntry.intersectionRect; + + if (intersectionRect == null) { + return new DOMRectReadOnly(); + } + + return new DOMRectReadOnly( + intersectionRect[0], + intersectionRect[1], + intersectionRect[2], + intersectionRect[3], + ); + } + + /** + * A `Boolean` value which is `true` if the target element intersects with the + * intersection observer's root. + * * If this is `true`, then, the `IntersectionObserverEntry` describes a + * transition into a state of intersection. + * * If it's `false`, then you know the transition is from intersecting to + * not-intersecting. + */ + get isIntersecting(): boolean { + return this._nativeEntry.isIntersectingAboveThresholds; + } + + /** + * Returns a `DOMRectReadOnly` for the intersection observer's root. + */ + get rootBounds(): DOMRectReadOnly { + const rootRect = this._nativeEntry.rootRect; + return new DOMRectReadOnly( + rootRect[0], + rootRect[1], + rootRect[2], + rootRect[3], + ); + } + + /** + * The `ReactNativeElement` whose intersection with the root changed. + */ + get target(): ReactNativeElement { + const targetInstanceHandle: InternalInstanceHandle = + // $FlowExpectedError[incompatible-type] native modules don't support using InternalInstanceHandle as a type + this._nativeEntry.targetInstanceHandle; + + const targetElement = + getPublicInstanceFromInternalInstanceHandle(targetInstanceHandle); + + // $FlowExpectedError[incompatible-cast] we know targetElement is a ReactNativeElement, not just a ReadOnlyNode + return (targetElement: ReactNativeElement); + } + + /** + * A `DOMHighResTimeStamp` indicating the time at which the intersection was + * recorded, relative to the `IntersectionObserver`'s time origin. + */ + get time(): DOMHighResTimeStamp { + return this._nativeEntry.time; + } +} + +export function createIntersectionObserverEntry( + entry: NativeIntersectionObserverEntry, +): IntersectionObserverEntry { + return new IntersectionObserverEntry(entry); +} diff --git a/packages/react-native/Libraries/IntersectionObserver/IntersectionObserverManager.js b/packages/react-native/Libraries/IntersectionObserver/IntersectionObserverManager.js new file mode 100644 index 00000000000000..c3f88ee7ef194d --- /dev/null +++ b/packages/react-native/Libraries/IntersectionObserver/IntersectionObserverManager.js @@ -0,0 +1,221 @@ +/** + * 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 + */ + +/** + * This module handles the communication between the React Native renderer + * and all the intersection observers that are currently observing any targets. + * + * In order to reduce the communication between native and JavaScript, + * we register a single notication callback in native, and then we handle how + * to notify each entry to the right intersection observer when we receive all + * the notifications together. + */ + +import type ReactNativeElement from '../DOM/Nodes/ReactNativeElement'; +import type IntersectionObserver, { + IntersectionObserverCallback, +} from './IntersectionObserver'; +import type IntersectionObserverEntry from './IntersectionObserverEntry'; + +import {getShadowNode} from '../DOM/Nodes/ReadOnlyNode'; +import * as Systrace from '../Performance/Systrace'; +import warnOnce from '../Utilities/warnOnce'; +import {createIntersectionObserverEntry} from './IntersectionObserverEntry'; +import NativeIntersectionObserver from './NativeIntersectionObserver'; + +export type IntersectionObserverId = number; + +let nextIntersectionObserverId: IntersectionObserverId = 1; +let isConnected: boolean = false; + +const registeredIntersectionObservers: Map< + IntersectionObserverId, + {observer: IntersectionObserver, callback: IntersectionObserverCallback}, +> = new Map(); + +/** + * Registers the given intersection observer and returns a unique ID for it, + * which is required to start observing targets. + */ +export function registerObserver( + observer: IntersectionObserver, + callback: IntersectionObserverCallback, +): IntersectionObserverId { + const intersectionObserverId = nextIntersectionObserverId; + nextIntersectionObserverId++; + registeredIntersectionObservers.set(intersectionObserverId, { + observer, + callback, + }); + return intersectionObserverId; +} + +/** + * Unregisters the given intersection observer. + * This should only be called when an observer is no longer observing any + * targets. + */ +export function unregisterObserver( + intersectionObserverId: IntersectionObserverId, +): void { + const deleted = registeredIntersectionObservers.delete( + intersectionObserverId, + ); + if (deleted && registeredIntersectionObservers.size === 0) { + NativeIntersectionObserver?.disconnect(); + isConnected = false; + } +} + +/** + * Starts observing a target on a specific intersection observer. + * If this is the first target being observed, this also sets up the centralized + * notification callback in native. + */ +export function observe({ + intersectionObserverId, + target, +}: { + intersectionObserverId: IntersectionObserverId, + target: ReactNativeElement, +}): void { + if (NativeIntersectionObserver == null) { + warnNoNativeIntersectionObserver(); + return; + } + + const registeredObserver = registeredIntersectionObservers.get( + intersectionObserverId, + ); + if (registeredObserver == null) { + console.error( + `IntersectionObserverManager: could not start observing target because IntersectionObserver with ID ${intersectionObserverId} was not registered.`, + ); + return; + } + + const targetShadowNode = getShadowNode(target); + if (targetShadowNode == null) { + console.error( + 'IntersectionObserverManager: could not find reference to host node from target', + ); + return; + } + + if (!isConnected) { + NativeIntersectionObserver.connect(notifyIntersectionObservers); + isConnected = true; + } + + return NativeIntersectionObserver.observe({ + intersectionObserverId, + targetShadowNode, + thresholds: registeredObserver.observer.thresholds, + }); +} + +export function unobserve( + intersectionObserverId: number, + target: ReactNativeElement, +): void { + if (NativeIntersectionObserver == null) { + warnNoNativeIntersectionObserver(); + return; + } + + const registeredObserver = registeredIntersectionObservers.get( + intersectionObserverId, + ); + if (registeredObserver == null) { + console.error( + `IntersectionObserverManager: could not stop observing target because IntersectionObserver with ID ${intersectionObserverId} was not registered.`, + ); + return; + } + + const targetShadowNode = getShadowNode(target); + if (targetShadowNode == null) { + console.error( + 'IntersectionObserverManager: could not find reference to host node from target', + ); + return; + } + + NativeIntersectionObserver.unobserve( + intersectionObserverId, + targetShadowNode, + ); +} + +/** + * This function is called from native when there are `IntersectionObserver` + * entries to dispatch. + */ +function notifyIntersectionObservers(): void { + Systrace.beginEvent( + 'IntersectionObserverManager.notifyIntersectionObservers', + ); + try { + doNotifyIntersectionObservers(); + } finally { + Systrace.endEvent(); + } +} + +function doNotifyIntersectionObservers(): void { + if (NativeIntersectionObserver == null) { + warnNoNativeIntersectionObserver(); + return; + } + + const nativeEntries = NativeIntersectionObserver.takeRecords(); + + const entriesByObserver: Map< + IntersectionObserverId, + Array, + > = new Map(); + + for (const nativeEntry of nativeEntries) { + let list = entriesByObserver.get(nativeEntry.intersectionObserverId); + if (list == null) { + list = []; + entriesByObserver.set(nativeEntry.intersectionObserverId, list); + } + list.push(createIntersectionObserverEntry(nativeEntry)); + } + + for (const [ + intersectionObserverId, + entriesForObserver, + ] of entriesByObserver) { + const registeredObserver = registeredIntersectionObservers.get( + intersectionObserverId, + ); + if (!registeredObserver) { + // This could happen if the observer is disconnected between commit + // and mount. In this case, we can just ignore the entries. + return; + } + + const {observer, callback} = registeredObserver; + try { + callback.call(observer, entriesForObserver, observer); + } catch (error) { + console.error(error); + } + } +} + +function warnNoNativeIntersectionObserver() { + warnOnce( + 'missing-native-intersection-observer', + 'Missing native implementation of IntersectionObserver', + ); +} diff --git a/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.cpp b/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.cpp new file mode 100644 index 00000000000000..94657af8cffce3 --- /dev/null +++ b/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "NativeIntersectionObserver.h" +#include +#include +#include + +#include "Plugins.h" + +std::shared_ptr +NativeIntersectionObserverModuleProvider( + std::shared_ptr jsInvoker) { + return std::make_shared( + std::move(jsInvoker)); +} + +namespace facebook::react { + +NativeIntersectionObserver::NativeIntersectionObserver( + std::shared_ptr jsInvoker) + : NativeIntersectionObserverCxxSpec(std::move(jsInvoker)) {} + +void NativeIntersectionObserver::observe( + jsi::Runtime &runtime, + NativeIntersectionObserverObserveOptions options) { + auto intersectionObserverId = options.intersectionObserverId; + auto shadowNode = + shadowNodeFromValue(runtime, std::move(options.targetShadowNode)); + auto thresholds = options.thresholds; + auto &uiManager = getUIManagerFromRuntime(runtime); + + intersectionObserverManager_.observe( + intersectionObserverId, shadowNode, thresholds, uiManager); +} + +void NativeIntersectionObserver::unobserve( + jsi::Runtime &runtime, + IntersectionObserverObserverId intersectionObserverId, + jsi::Object targetShadowNode) { + auto shadowNode = shadowNodeFromValue(runtime, std::move(targetShadowNode)); + intersectionObserverManager_.unobserve(intersectionObserverId, *shadowNode); +} + +void NativeIntersectionObserver::connect( + jsi::Runtime &runtime, + AsyncCallback<> notifyIntersectionObserversCallback) { + auto &uiManager = getUIManagerFromRuntime(runtime); + intersectionObserverManager_.connect( + uiManager, notifyIntersectionObserversCallback); +} + +void NativeIntersectionObserver::disconnect(jsi::Runtime &runtime) { + auto &uiManager = getUIManagerFromRuntime(runtime); + intersectionObserverManager_.disconnect(uiManager); +} + +std::vector +NativeIntersectionObserver::takeRecords(jsi::Runtime &runtime) { + auto entries = intersectionObserverManager_.takeRecords(); + + std::vector nativeModuleEntries; + nativeModuleEntries.reserve(entries.size()); + + for (auto const &entry : entries) { + nativeModuleEntries.emplace_back( + convertToNativeModuleEntry(entry, runtime)); + } + + return nativeModuleEntries; +} + +NativeIntersectionObserverEntry +NativeIntersectionObserver::convertToNativeModuleEntry( + IntersectionObserverEntry entry, + jsi::Runtime &runtime) { + RectAsTuple targetRect = { + entry.targetRect.origin.x, + entry.targetRect.origin.y, + entry.targetRect.size.width, + entry.targetRect.size.height}; + RectAsTuple rootRect = { + entry.rootRect.origin.x, + entry.rootRect.origin.y, + entry.rootRect.size.width, + entry.rootRect.size.height}; + std::optional intersectionRect; + if (entry.intersectionRect) { + intersectionRect = { + entry.intersectionRect.value().origin.x, + entry.intersectionRect.value().origin.y, + entry.intersectionRect.value().size.width, + entry.intersectionRect.value().size.height}; + } + + NativeIntersectionObserverEntry nativeModuleEntry = { + entry.intersectionObserverId, + (*entry.shadowNode).getInstanceHandle(runtime), + targetRect, + rootRect, + intersectionRect, + entry.isIntersectingAboveThresholds, + entry.time, + }; + + return nativeModuleEntry; +} + +UIManager &NativeIntersectionObserver::getUIManagerFromRuntime( + jsi::Runtime &runtime) { + return UIManagerBinding::getBinding(runtime)->getUIManager(); +} + +} // namespace facebook::react diff --git a/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.h b/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.h new file mode 100644 index 00000000000000..123e4cf20e6b5e --- /dev/null +++ b/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace facebook::react { + +using NativeIntersectionObserverIntersectionObserverId = int32_t; +using RectAsTuple = std::tuple; + +using NativeIntersectionObserverObserveOptions = + NativeIntersectionObserverCxxBaseNativeIntersectionObserverObserveOptions< + // intersectionObserverId + NativeIntersectionObserverIntersectionObserverId, + // targetShadowNode + jsi::Object, + // thresholds + std::vector>; + +template <> +struct Bridging + : NativeIntersectionObserverCxxBaseNativeIntersectionObserverObserveOptionsBridging< + // intersectionObserverId + NativeIntersectionObserverIntersectionObserverId, + // targetShadowNode + jsi::Object, + // thresholds + std::vector> {}; + +using NativeIntersectionObserverEntry = + NativeIntersectionObserverCxxBaseNativeIntersectionObserverEntry< + // intersectionObserverId + NativeIntersectionObserverIntersectionObserverId, + // targetInstanceHandle + jsi::Value, + // targetRect + RectAsTuple, + // rootRect + RectAsTuple, + // intersectionRect + std::optional, + // isIntersectingAboveThresholds + bool, + // time + double>; + +template <> +struct Bridging + : NativeIntersectionObserverCxxBaseNativeIntersectionObserverEntryBridging< + // intersectionObserverId + NativeIntersectionObserverIntersectionObserverId, + // targetInstanceHandle + jsi::Value, + // targetRect + RectAsTuple, + // rootRect + RectAsTuple, + // intersectionRect + std::optional, + // isIntersectingAboveThresholds + bool, + // time + double> {}; + +class NativeIntersectionObserver + : public NativeIntersectionObserverCxxSpec, + std::enable_shared_from_this { + public: + NativeIntersectionObserver(std::shared_ptr jsInvoker); + + void observe( + jsi::Runtime &runtime, + NativeIntersectionObserverObserveOptions options); + + void unobserve( + jsi::Runtime &runtime, + IntersectionObserverObserverId intersectionObserverId, + jsi::Object targetShadowNode); + + void connect( + jsi::Runtime &runtime, + AsyncCallback<> notifyIntersectionObserversCallback); + + void disconnect(jsi::Runtime &runtime); + + std::vector takeRecords( + jsi::Runtime &runtime); + + private: + IntersectionObserverManager intersectionObserverManager_{}; + + static UIManager &getUIManagerFromRuntime(jsi::Runtime &runtime); + static NativeIntersectionObserverEntry convertToNativeModuleEntry( + IntersectionObserverEntry entry, + jsi::Runtime &runtime); +}; + +} // namespace facebook::react diff --git a/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.js b/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.js new file mode 100644 index 00000000000000..ff620ec123a770 --- /dev/null +++ b/packages/react-native/Libraries/IntersectionObserver/NativeIntersectionObserver.js @@ -0,0 +1,41 @@ +/** + * 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 + */ + +import type {TurboModule} from '../TurboModule/RCTExport'; + +import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; + +export type NativeIntersectionObserverEntry = { + intersectionObserverId: number, + targetInstanceHandle: mixed, + targetRect: $ReadOnlyArray, // It's actually a tuple with x, y, width and height + rootRect: $ReadOnlyArray, // It's actually a tuple with x, y, width and height + intersectionRect: ?$ReadOnlyArray, // It's actually a tuple with x, y, width and height + isIntersectingAboveThresholds: boolean, + time: number, +}; + +export type NativeIntersectionObserverObserveOptions = { + intersectionObserverId: number, + targetShadowNode: mixed, + thresholds: $ReadOnlyArray, +}; + +export interface Spec extends TurboModule { + +observe: (options: NativeIntersectionObserverObserveOptions) => void; + +unobserve: (intersectionObserverId: number, targetShadowNode: mixed) => void; + +connect: (notifyIntersectionObserversCallback: () => void) => void; + +disconnect: () => void; + +takeRecords: () => $ReadOnlyArray; +} + +export default (TurboModuleRegistry.get( + 'NativeIntersectionObserverCxx', +): ?Spec); diff --git a/packages/react-native/Libraries/IntersectionObserver/__mocks__/NativeIntersectionObserver.js b/packages/react-native/Libraries/IntersectionObserver/__mocks__/NativeIntersectionObserver.js new file mode 100644 index 00000000000000..e66a5e12159687 --- /dev/null +++ b/packages/react-native/Libraries/IntersectionObserver/__mocks__/NativeIntersectionObserver.js @@ -0,0 +1,162 @@ +/** + * 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 + */ + +import type ReactNativeElement from '../../DOM/Nodes/ReactNativeElement'; +import type IntersectionObserver from '../IntersectionObserver'; +import type { + NativeIntersectionObserverEntry, + NativeIntersectionObserverObserveOptions, + Spec, +} from '../NativeIntersectionObserver'; + +import {getShadowNode} from '../../DOM/Nodes/ReadOnlyNode'; +import {getFabricUIManager} from '../../ReactNative/__mocks__/FabricUIManager'; +import invariant from 'invariant'; +import nullthrows from 'nullthrows'; + +type ObserverState = { + thresholds: $ReadOnlyArray, + intersecting: boolean, + currentThreshold: ?number, +}; + +type Observation = { + ...NativeIntersectionObserverObserveOptions, + state: ObserverState, +}; + +let pendingRecords: Array = []; +let callback: ?() => void; +let observations: Array = []; + +const FabricUIManagerMock = nullthrows(getFabricUIManager()); + +function createRecordFromObservation( + observation: Observation, +): NativeIntersectionObserverEntry { + return { + intersectionObserverId: observation.intersectionObserverId, + targetInstanceHandle: FabricUIManagerMock.__getInstanceHandleFromNode( + // $FlowExpectedError[incompatible-call] + observation.targetShadowNode, + ), + targetRect: observation.state.intersecting ? [0, 0, 1, 1] : [20, 20, 1, 1], + rootRect: [0, 0, 10, 10], + intersectionRect: observation.state.intersecting ? [0, 0, 1, 1] : null, + isIntersectingAboveThresholds: observation.state.intersecting, + time: performance.now(), + }; +} + +function notifyIntersectionObservers(): void { + callback?.(); +} + +const NativeIntersectionObserverMock = { + observe: (options: NativeIntersectionObserverObserveOptions): void => { + invariant( + observations.find( + observation => + observation.intersectionObserverId === + options.intersectionObserverId && + observation.targetShadowNode === options.targetShadowNode, + ) == null, + 'unexpected duplicate call to observe', + ); + const observation = { + ...options, + state: { + thresholds: options.thresholds, + intersecting: false, + currentThreshold: null, + }, + }; + observations.push(observation); + pendingRecords.push(createRecordFromObservation(observation)); + setImmediate(notifyIntersectionObservers); + }, + unobserve: ( + intersectionObserverId: number, + targetShadowNode: mixed, + ): void => { + const observationIndex = observations.findIndex( + observation => + observation.intersectionObserverId === intersectionObserverId && + observation.targetShadowNode === targetShadowNode, + ); + invariant( + observationIndex !== -1, + 'unexpected duplicate call to unobserve', + ); + observations.splice(observationIndex, 1); + }, + connect: (notifyIntersectionObserversCallback: () => void): void => { + invariant(callback == null, 'unexpected call to connect'); + invariant( + notifyIntersectionObserversCallback != null, + 'unexpected null notify intersection observers callback', + ); + callback = notifyIntersectionObserversCallback; + }, + disconnect: (): void => { + invariant(callback != null, 'unexpected call to disconnect'); + callback = null; + }, + takeRecords: (): $ReadOnlyArray => { + const currentRecords = pendingRecords; + pendingRecords = []; + return currentRecords; + }, + __forceTransitionForTests: ( + observer: IntersectionObserver, + target: ReactNativeElement, + ) => { + const targetShadowNode = getShadowNode(target); + const observation = observations.find( + obs => + obs.intersectionObserverId === observer.__getObserverID() && + obs.targetShadowNode === targetShadowNode, + ); + invariant( + observation != null, + 'cannot force transition on an unobserved target', + ); + if (observation.state.intersecting) { + observation.state.intersecting = false; + observation.state.currentThreshold = null; + } else { + observation.state.intersecting = true; + observation.state.currentThreshold = observation.thresholds[0]; + } + pendingRecords.push(createRecordFromObservation(observation)); + setImmediate(notifyIntersectionObservers); + }, + __getObservationsForTests: ( + observer: IntersectionObserver, + ): Array<{targetShadowNode: mixed, thresholds: $ReadOnlyArray}> => { + const intersectionObserverId = observer.__getObserverID(); + return observations + .filter( + observation => + observation.intersectionObserverId === intersectionObserverId, + ) + .map(observation => ({ + targetShadowNode: observation.targetShadowNode, + thresholds: observation.thresholds, + })); + }, + __isConnected: (): boolean => { + return callback != null; + }, +}; + +(NativeIntersectionObserverMock: Spec); + +export default NativeIntersectionObserverMock; diff --git a/packages/react-native/Libraries/LayoutAnimation/LayoutAnimation.js b/packages/react-native/Libraries/LayoutAnimation/LayoutAnimation.js index e4489d0543bf60..6283e673c64846 100644 --- a/packages/react-native/Libraries/LayoutAnimation/LayoutAnimation.js +++ b/packages/react-native/Libraries/LayoutAnimation/LayoutAnimation.js @@ -49,7 +49,7 @@ function configureNext( onAnimationDidEnd?: OnAnimationDidEndCallback, onAnimationDidFail?: OnAnimationDidFailCallback, ) { - if (Platform.isTesting) { + if (Platform.isDisableAnimations) { return; } diff --git a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h index b92bc1ec9c3209..eff3b0c5461422 100644 --- a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h +++ b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h @@ -5,11 +5,9 @@ * LICENSE file in the root directory of this source tree. */ +#import #import -#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 12000) /* __IPHONE_12_0 */ #import -#endif -#import @interface RCTLinkingManager : RCTEventEmitter @@ -24,11 +22,6 @@ + (BOOL)application:(nonnull UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity - restorationHandler: -#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 12000) /* __IPHONE_12_0 */ - (nonnull void (^)(NSArray> *_Nullable))restorationHandler; -#else - (nonnull void (^)(NSArray *_Nullable))restorationHandler; -#endif + restorationHandler:(nonnull void (^)(NSArray> *_Nullable))restorationHandler; @end diff --git a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm index cfa9078446208d..3fa06c43979bfd 100644 --- a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm +++ b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm @@ -72,14 +72,8 @@ + (BOOL)application:(UIApplication *)application + (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity - restorationHandler: -#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 12000) /* __IPHONE_12_0 */ - (nonnull void (^)(NSArray> *_Nullable))restorationHandler + restorationHandler:(nonnull void (^)(NSArray> *_Nullable))restorationHandler { -#else - (nonnull void (^)(NSArray *_Nullable))restorationHandler -{ -#endif if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSDictionary *payload = @{@"url" : userActivity.webpageURL.absoluteString}; [[NSNotificationCenter defaultCenter] postNotificationName:kOpenURLNotification object:self userInfo:payload]; diff --git a/packages/react-native/Libraries/LinkingIOS/React-RCTLinking.podspec b/packages/react-native/Libraries/LinkingIOS/React-RCTLinking.podspec index 5bf0a98802dc70..360a3e296ae4bd 100644 --- a/packages/react-native/Libraries/LinkingIOS/React-RCTLinking.podspec +++ b/packages/react-native/Libraries/LinkingIOS/React-RCTLinking.podspec @@ -28,7 +28,10 @@ header_search_paths = [ if ENV["USE_FRAMEWORKS"] header_search_paths = header_search_paths.concat([ "\"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\"", - "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"" + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers/build/generated/ios\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers/build/generated/ios\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers\"" ]) end diff --git a/packages/react-native/Libraries/LogBox/Data/parseLogBoxLog.js b/packages/react-native/Libraries/LogBox/Data/parseLogBoxLog.js index b41bade7fd0be5..744fa5e4e367ef 100644 --- a/packages/react-native/Libraries/LogBox/Data/parseLogBoxLog.js +++ b/packages/react-native/Libraries/LogBox/Data/parseLogBoxLog.js @@ -14,12 +14,38 @@ import type {LogBoxLogData} from './LogBoxLog'; import parseErrorStack from '../../Core/Devtools/parseErrorStack'; import UTFSequence from '../../UTFSequence'; import stringifySafe from '../../Utilities/stringifySafe'; +import ansiRegex from 'ansi-regex'; + +const ANSI_REGEX = ansiRegex().source; const BABEL_TRANSFORM_ERROR_FORMAT = /^(?:TransformError )?(?:SyntaxError: |ReferenceError: )(.*): (.*) \((\d+):(\d+)\)\n\n([\s\S]+)/; + +// https://github.com/babel/babel/blob/33dbb85e9e9fe36915273080ecc42aee62ed0ade/packages/babel-code-frame/src/index.ts#L183-L184 +const BABEL_CODE_FRAME_MARKER_PATTERN = new RegExp( + [ + // Beginning of a line (per 'm' flag) + '^', + // Optional ANSI escapes for colors + `(?:${ANSI_REGEX})*`, + // Marker + '>', + // Optional ANSI escapes for colors + `(?:${ANSI_REGEX})*`, + // Left padding for line number + ' +', + // Line number + '[0-9]+', + // Gutter + ' \\|', + ].join(''), + 'm', +); + const BABEL_CODE_FRAME_ERROR_FORMAT = // eslint-disable-next-line no-control-regex /^(?:TransformError )?(?:.*):? (?:.*?)(\/.*): ([\s\S]+?)\n([ >]{2}[\d\s]+ \|[\s\S]+|\u{001b}[\s\S]+)/u; + const METRO_ERROR_FORMAT = /^(?:InternalError Metro has encountered an error:) (.*): (.*) \((\d+):(\d+)\)\n\n([\s\S]+)/u; @@ -243,28 +269,32 @@ export function parseLogBoxException( }; } - const babelCodeFrameError = message.match(BABEL_CODE_FRAME_ERROR_FORMAT); + // Perform a cheap match first before trying to parse the full message, which + // can get expensive for arbitrary input. + if (BABEL_CODE_FRAME_MARKER_PATTERN.test(message)) { + const babelCodeFrameError = message.match(BABEL_CODE_FRAME_ERROR_FORMAT); - if (babelCodeFrameError) { - // Codeframe errors are thrown from any use of buildCodeFrameError. - const [fileName, content, codeFrame] = babelCodeFrameError.slice(1); - return { - level: 'syntax', - stack: [], - isComponentError: false, - componentStack: [], - codeFrame: { - fileName, - location: null, // We are not given the location. - content: codeFrame, - }, - message: { - content, - substitutions: [], - }, - category: `${fileName}-${1}-${1}`, - extraData: error.extraData, - }; + if (babelCodeFrameError) { + // Codeframe errors are thrown from any use of buildCodeFrameError. + const [fileName, content, codeFrame] = babelCodeFrameError.slice(1); + return { + level: 'syntax', + stack: [], + isComponentError: false, + componentStack: [], + codeFrame: { + fileName, + location: null, // We are not given the location. + content: codeFrame, + }, + message: { + content, + substitutions: [], + }, + category: `${fileName}-${1}-${1}`, + extraData: error.extraData, + }; + } } if (message.match(/^TransformError /)) { diff --git a/packages/react-native/Libraries/MutationObserver/MutationObserver.js b/packages/react-native/Libraries/MutationObserver/MutationObserver.js new file mode 100644 index 00000000000000..4c6c4ef2294aee --- /dev/null +++ b/packages/react-native/Libraries/MutationObserver/MutationObserver.js @@ -0,0 +1,184 @@ +/** + * 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 + */ + +// flowlint unsafe-getters-setters:off + +import type {MutationObserverId} from './MutationObserverManager'; +import type MutationRecord from './MutationRecord'; + +import ReactNativeElement from '../DOM/Nodes/ReactNativeElement'; +import * as MutationObserverManager from './MutationObserverManager'; + +export type MutationObserverCallback = ( + mutationRecords: $ReadOnlyArray, + observer: MutationObserver, +) => mixed; + +type MutationObserverInit = $ReadOnly<{ + subtree?: boolean, + // This is the only supported option so it's required to be `true`. + childList: true, + + // Unsupported: + attributes?: boolean, + attributeFilter?: $ReadOnlyArray, + attributeOldValue?: boolean, + characterData?: boolean, + characterDataOldValue?: boolean, +}>; + +/** + * This is a React Native implementation for the `MutationObserver` API + * (https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver). + * + * It only supports the `subtree` and `childList` options at the moment. + */ +export default class MutationObserver { + _callback: MutationObserverCallback; + _observationTargets: Set = new Set(); + _mutationObserverId: ?MutationObserverId; + + constructor(callback: MutationObserverCallback): void { + if (callback == null) { + throw new TypeError( + "Failed to construct 'MutationObserver': 1 argument required, but only 0 present.", + ); + } + + if (typeof callback !== 'function') { + throw new TypeError( + "Failed to construct 'MutationObserver': parameter 1 is not of type 'Function'.", + ); + } + + this._callback = callback; + } + + /** + * Configures the `MutationObserver` callback to begin receiving notifications + * of changes to the UI tree that match the given options. + * Depending on the configuration, the observer may watch a single node in the + * UI tree, or that node and some or all of its descendant nodes. + * To stop the `MutationObserver` (so that none of its callbacks will be + * triggered any longer), call `MutationObserver.disconnect()`. + */ + observe(target: ReactNativeElement, options?: MutationObserverInit): void { + if (!(target instanceof ReactNativeElement)) { + throw new TypeError( + "Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'ReactNativeElement'.", + ); + } + + // Browsers force a cast of this value to boolean + if (Boolean(options?.childList) !== true) { + throw new TypeError( + "Failed to execute 'observe' on 'MutationObserver': The options object must set 'childList' to true.", + ); + } + + if (options?.attributes != null) { + throw new Error( + "Failed to execute 'observe' on 'MutationObserver': attributes is not supported", + ); + } + + if (options?.attributeFilter != null) { + throw new Error( + "Failed to execute 'observe' on 'MutationObserver': attributeFilter is not supported", + ); + } + + if (options?.attributeOldValue != null) { + throw new Error( + "Failed to execute 'observe' on 'MutationObserver': attributeOldValue is not supported", + ); + } + + if (options?.characterData != null) { + throw new Error( + "Failed to execute 'observe' on 'MutationObserver': characterData is not supported", + ); + } + + if (options?.characterDataOldValue != null) { + throw new Error( + "Failed to execute 'observe' on 'MutationObserver': characterDataOldValue is not supported", + ); + } + + const mutationObserverId = this._getOrCreateMutationObserverId(); + + // As per the spec, if the target is already being observed, we "reset" + // the observation and only use the last options used. + if (this._observationTargets.has(target)) { + MutationObserverManager.unobserve(mutationObserverId, target); + } + + MutationObserverManager.observe({ + mutationObserverId, + target, + subtree: Boolean(options?.subtree), + }); + + this._observationTargets.add(target); + } + + _unobserve(target: ReactNativeElement): void { + if (!(target instanceof ReactNativeElement)) { + throw new TypeError( + "Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'ReactNativeElement'.", + ); + } + + if (!this._observationTargets.has(target)) { + return; + } + + const mutationObserverId = this._mutationObserverId; + if (mutationObserverId == null) { + return; + } + + MutationObserverManager.unobserve(mutationObserverId, target); + this._observationTargets.delete(target); + + if (this._observationTargets.size === 0) { + MutationObserverManager.unregisterObserver(mutationObserverId); + this._mutationObserverId = null; + } + } + + /** + * Tells the observer to stop watching for mutations. + * The observer can be reused by calling its `observe()` method again. + */ + disconnect(): void { + for (const target of this._observationTargets.keys()) { + this._unobserve(target); + } + } + + _getOrCreateMutationObserverId(): MutationObserverId { + let mutationObserverId = this._mutationObserverId; + if (mutationObserverId == null) { + mutationObserverId = MutationObserverManager.registerObserver( + this, + this._callback, + ); + this._mutationObserverId = mutationObserverId; + } + return mutationObserverId; + } + + // Only for tests + __getObserverID(): ?MutationObserverId { + return this._mutationObserverId; + } +} diff --git a/packages/react-native/Libraries/MutationObserver/MutationObserverManager.js b/packages/react-native/Libraries/MutationObserver/MutationObserverManager.js new file mode 100644 index 00000000000000..9cdf56f0c5dbad --- /dev/null +++ b/packages/react-native/Libraries/MutationObserver/MutationObserverManager.js @@ -0,0 +1,218 @@ +/** + * 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 + */ + +/** + * This module handles the communication between the React Native renderer + * and all the mutation observers that are currently observing any targets. + * + * In order to reduce the communication between native and JavaScript, + * we register a single notication callback in native, and then we handle how + * to notify each entry to the right mutation observer when we receive all + * the notifications together. + */ + +import type ReactNativeElement from '../DOM/Nodes/ReactNativeElement'; +import type MutationObserver, { + MutationObserverCallback, +} from './MutationObserver'; +import type MutationRecord from './MutationRecord'; + +import { + getPublicInstanceFromInternalInstanceHandle, + getShadowNode, +} from '../DOM/Nodes/ReadOnlyNode'; +import * as Systrace from '../Performance/Systrace'; +import warnOnce from '../Utilities/warnOnce'; +import {createMutationRecord} from './MutationRecord'; +import NativeMutationObserver from './NativeMutationObserver'; + +export type MutationObserverId = number; + +let nextMutationObserverId: MutationObserverId = 1; +let isConnected: boolean = false; + +const registeredMutationObservers: Map< + MutationObserverId, + $ReadOnly<{observer: MutationObserver, callback: MutationObserverCallback}>, +> = new Map(); + +/** + * Registers the given mutation observer and returns a unique ID for it, + * which is required to start observing targets. + */ +export function registerObserver( + observer: MutationObserver, + callback: MutationObserverCallback, +): MutationObserverId { + const mutationObserverId = nextMutationObserverId; + nextMutationObserverId++; + registeredMutationObservers.set(mutationObserverId, { + observer, + callback, + }); + return mutationObserverId; +} + +/** + * Unregisters the given mutation observer. + * This should only be called when an observer is no longer observing any + * targets. + */ +export function unregisterObserver( + mutationObserverId: MutationObserverId, +): void { + const deleted = registeredMutationObservers.delete(mutationObserverId); + if (deleted && registeredMutationObservers.size === 0) { + // When there are no observers left, we can disconnect the native module + // so we don't need to check commits for mutations. + NativeMutationObserver?.disconnect(); + isConnected = false; + } +} + +export function observe({ + mutationObserverId, + target, + subtree, +}: { + mutationObserverId: MutationObserverId, + target: ReactNativeElement, + subtree: boolean, +}): void { + if (NativeMutationObserver == null) { + warnNoNativeMutationObserver(); + return; + } + + const registeredObserver = + registeredMutationObservers.get(mutationObserverId); + if (registeredObserver == null) { + console.error( + `MutationObserverManager: could not start observing target because MutationObserver with ID ${mutationObserverId} was not registered.`, + ); + return; + } + + const targetShadowNode = getShadowNode(target); + if (targetShadowNode == null) { + console.error( + 'MutationObserverManager: could not find reference to host node from target', + ); + return; + } + + if (!isConnected) { + NativeMutationObserver.connect( + notifyMutationObservers, + // We need to do this operation from native to make sure we're retaining + // the public instance immediately when mutations occur. Otherwise React + // could dereference it in the instance handle and we wouldn't be able to + // access it. + // $FlowExpectedError[incompatible-call] This is typed as (mixed) => mixed in the native module because the codegen doesn't support the actual types. + getPublicInstanceFromInternalInstanceHandle, + ); + isConnected = true; + } + + return NativeMutationObserver.observe({ + mutationObserverId, + targetShadowNode, + subtree, + }); +} + +export function unobserve( + mutationObserverId: number, + target: ReactNativeElement, +): void { + if (NativeMutationObserver == null) { + warnNoNativeMutationObserver(); + return; + } + + const registeredObserver = + registeredMutationObservers.get(mutationObserverId); + if (registeredObserver == null) { + console.error( + `MutationObserverManager: could not stop observing target because MutationObserver with ID ${mutationObserverId} was not registered.`, + ); + return; + } + + const targetShadowNode = getShadowNode(target); + if (targetShadowNode == null) { + console.error( + 'MutationObserverManager: could not find reference to host node from target', + ); + return; + } + + NativeMutationObserver.unobserve(mutationObserverId, targetShadowNode); +} + +/** + * This function is called from native when there are `MutationObserver` + * entries to dispatch. + */ +function notifyMutationObservers(): void { + Systrace.beginEvent('MutationObserverManager.notifyMutationObservers'); + try { + doNotifyMutationObservers(); + } finally { + Systrace.endEvent(); + } +} + +function doNotifyMutationObservers(): void { + if (NativeMutationObserver == null) { + warnNoNativeMutationObserver(); + return; + } + + const nativeRecords = NativeMutationObserver.takeRecords(); + + const entriesByObserver: Map< + MutationObserverId, + Array, + > = new Map(); + + for (const nativeRecord of nativeRecords) { + let list = entriesByObserver.get(nativeRecord.mutationObserverId); + if (list == null) { + list = []; + entriesByObserver.set(nativeRecord.mutationObserverId, list); + } + list.push(createMutationRecord(nativeRecord)); + } + + for (const [mutationObserverId, entriesForObserver] of entriesByObserver) { + const registeredObserver = + registeredMutationObservers.get(mutationObserverId); + if (!registeredObserver) { + // This could happen if the observer is disconnected between commit + // and mount. In this case, we can just ignore the entries. + return; + } + + const {observer, callback} = registeredObserver; + try { + callback.call(observer, entriesForObserver, observer); + } catch (error) { + console.error(error); + } + } +} + +function warnNoNativeMutationObserver() { + warnOnce( + 'missing-native-mutation-observer', + 'Missing native implementation of MutationObserver', + ); +} diff --git a/packages/react-native/Libraries/MutationObserver/MutationRecord.js b/packages/react-native/Libraries/MutationObserver/MutationRecord.js new file mode 100644 index 00000000000000..18cce2d1fda14d --- /dev/null +++ b/packages/react-native/Libraries/MutationObserver/MutationRecord.js @@ -0,0 +1,82 @@ +/** + * 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 + */ + +// flowlint unsafe-getters-setters:off + +import type ReactNativeElement from '../DOM/Nodes/ReactNativeElement'; +import type ReadOnlyNode from '../DOM/Nodes/ReadOnlyNode'; +import type {NativeMutationRecord} from './NativeMutationObserver'; + +import NodeList, {createNodeList} from '../DOM/OldStyleCollections/NodeList'; + +export type MutationType = 'attributes' | 'characterData' | 'childList'; + +/** + * The `MutationRecord` is a read-only interface that represents an individual + * DOM mutation observed by a `MutationObserver`. + * + * It is the object inside the array passed to the callback of a `MutationObserver`. + */ +export default class MutationRecord { + _target: ReactNativeElement; + _addedNodes: NodeList; + _removedNodes: NodeList; + + constructor(nativeRecord: NativeMutationRecord) { + // $FlowExpectedError[incompatible-cast] the codegen doesn't support the actual type. + const target = (nativeRecord.target: ReactNativeElement); + this._target = target; + // $FlowExpectedError[incompatible-cast] the codegen doesn't support the actual type. + const addedNodes = (nativeRecord.addedNodes: $ReadOnlyArray); + this._addedNodes = createNodeList(addedNodes); + const removedNodes = + // $FlowExpectedError[incompatible-cast] the codegen doesn't support the actual type. + (nativeRecord.removedNodes: $ReadOnlyArray); + this._removedNodes = createNodeList(removedNodes); + } + + get addedNodes(): NodeList { + return this._addedNodes; + } + + get attributeName(): string | null { + return null; + } + + get nextSibling(): ReadOnlyNode | null { + return null; + } + + get oldValue(): mixed | null { + return null; + } + + get previousSibling(): ReadOnlyNode | null { + return null; + } + + get removedNodes(): NodeList { + return this._removedNodes; + } + + get target(): ReactNativeElement { + return this._target; + } + + get type(): MutationType { + return 'childList'; + } +} + +export function createMutationRecord( + entry: NativeMutationRecord, +): MutationRecord { + return new MutationRecord(entry); +} diff --git a/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.cpp b/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.cpp new file mode 100644 index 00000000000000..eb6d5231d698bc --- /dev/null +++ b/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.cpp @@ -0,0 +1,165 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "NativeMutationObserver.h" +#include +#include +#include +#include + +#include "Plugins.h" + +std::shared_ptr +NativeMutationObserverModuleProvider( + std::shared_ptr jsInvoker) { + return std::make_shared( + std::move(jsInvoker)); +} + +namespace facebook::react { + +static UIManager &getUIManagerFromRuntime(jsi::Runtime &runtime) { + return UIManagerBinding::getBinding(runtime)->getUIManager(); +} + +NativeMutationObserver::NativeMutationObserver( + std::shared_ptr jsInvoker) + : NativeMutationObserverCxxSpec(std::move(jsInvoker)) {} + +void NativeMutationObserver::observe( + jsi::Runtime &runtime, + NativeMutationObserverObserveOptions options) { + auto mutationObserverId = options.mutationObserverId; + auto subtree = options.subtree; + auto shadowNode = + shadowNodeFromValue(runtime, std::move(options).targetShadowNode); + auto &uiManager = getUIManagerFromRuntime(runtime); + + mutationObserverManager_.observe( + mutationObserverId, shadowNode, subtree, uiManager); +} + +void NativeMutationObserver::unobserve( + jsi::Runtime &runtime, + MutationObserverId mutationObserverId, + jsi::Object targetShadowNode) { + auto shadowNode = shadowNodeFromValue(runtime, std::move(targetShadowNode)); + mutationObserverManager_.unobserve(mutationObserverId, *shadowNode); +} + +void NativeMutationObserver::connect( + jsi::Runtime &runtime, + AsyncCallback<> notifyMutationObservers, + jsi::Function getPublicInstanceFromInstanceHandle) { + auto &uiManager = getUIManagerFromRuntime(runtime); + + // MutationObserver is not compatible with background executor. + // When using background executor, we commit trees outside the JS thread. + // In that case, we can't safely access the JS runtime in commit hooks to + // get references to mutated nodes (which we need to do at that point + // to ensure we are retaining removed nodes). + if (uiManager.hasBackgroundExecutor()) { + throw jsi::JSError( + runtime, + "MutationObserver: could not start observation because MutationObserver is incompatible with UIManager using background executor."); + } + + getPublicInstanceFromInstanceHandle_ = + jsi::Value(runtime, getPublicInstanceFromInstanceHandle); + + // This should always be called from the JS thread, as it's unsafe to call + // into JS otherwise (via `getPublicInstanceFromInstanceHandle`). + getPublicInstanceFromShadowNode_ = [&](ShadowNode const &shadowNode) { + auto instanceHandle = shadowNode.getInstanceHandle(runtime); + if (!instanceHandle.isObject() || + !getPublicInstanceFromInstanceHandle_.isObject() || + !getPublicInstanceFromInstanceHandle_.asObject(runtime).isFunction( + runtime)) { + return jsi::Value::null(); + } + return getPublicInstanceFromInstanceHandle_.asObject(runtime) + .asFunction(runtime) + .call(runtime, instanceHandle); + }; + + notifyMutationObservers_ = std::move(notifyMutationObservers); + + auto onMutationsCallback = [&](std::vector &records) { + return onMutations(records); + }; + + mutationObserverManager_.connect(uiManager, std::move(onMutationsCallback)); +} + +void NativeMutationObserver::disconnect(jsi::Runtime &runtime) { + auto &uiManager = getUIManagerFromRuntime(runtime); + mutationObserverManager_.disconnect(uiManager); + getPublicInstanceFromInstanceHandle_ = jsi::Value::undefined(); + getPublicInstanceFromShadowNode_ = nullptr; + notifyMutationObservers_ = nullptr; +} + +std::vector NativeMutationObserver::takeRecords( + jsi::Runtime & /*runtime*/) { + notifiedMutationObservers_ = false; + + std::vector records; + pendingRecords_.swap(records); + return records; +} + +std::vector +NativeMutationObserver::getPublicInstancesFromShadowNodes( + std::vector const &shadowNodes) const { + std::vector publicInstances; + publicInstances.reserve(shadowNodes.size()); + + for (auto const &shadowNode : shadowNodes) { + publicInstances.push_back(getPublicInstanceFromShadowNode_(*shadowNode)); + } + + return publicInstances; +} + +void NativeMutationObserver::onMutations( + std::vector &records) { + SystraceSection s("NativeMutationObserver::onMutations"); + + for (auto const &record : records) { + pendingRecords_.emplace_back(NativeMutationRecord{ + record.mutationObserverId, + // FIXME(T157129303) Instead of assuming we can call into JS from here, + // we should use an API that explicitly indicates it. + getPublicInstanceFromShadowNode_(*record.targetShadowNode), + getPublicInstancesFromShadowNodes(record.addedShadowNodes), + getPublicInstancesFromShadowNodes(record.removedShadowNodes)}); + } + + notifyMutationObserversIfNecessary(); +} + +/** + * This method allows us to avoid scheduling multiple calls to notify observers + * in the JS thread. We schedule one and skip subsequent ones (we just append + * the records to the pending list and wait for the scheduled task to consume + * all of them). + */ +void NativeMutationObserver::notifyMutationObserversIfNecessary() { + bool dispatchNotification = false; + + if (!pendingRecords_.empty() && !notifiedMutationObservers_) { + notifiedMutationObservers_ = true; + dispatchNotification = true; + } + + if (dispatchNotification) { + SystraceSection s("NativeMutationObserver::notifyObservers"); + notifyMutationObservers_(); + } +} + +} // namespace facebook::react diff --git a/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.h b/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.h new file mode 100644 index 00000000000000..e5ad900267fcb9 --- /dev/null +++ b/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace facebook::react { + +using NativeMutationObserverObserveOptions = + NativeMutationObserverCxxBaseNativeMutationObserverObserveOptions< + // mutationObserverId + MutationObserverId, + // targetShadowNode + jsi::Object, + // subtree + bool>; + +template <> +struct Bridging + : NativeMutationObserverCxxBaseNativeMutationObserverObserveOptionsBridging< + // mutationObserverId + MutationObserverId, + // targetShadowNode + jsi::Object, + // subtree + bool> {}; + +using NativeMutationRecord = NativeMutationObserverCxxBaseNativeMutationRecord< + // mutationObserverId + MutationObserverId, + // target + jsi::Value, + // addedNodes + std::vector, + // removedNodes + std::vector>; + +template <> +struct Bridging + : NativeMutationObserverCxxBaseNativeMutationRecordBridging< + // mutationObserverId + MutationObserverId, + // target + jsi::Value, + // addedNodes + std::vector, + // removedNodes + std::vector> {}; + +class NativeMutationObserver + : public NativeMutationObserverCxxSpec, + std::enable_shared_from_this { + public: + NativeMutationObserver(std::shared_ptr jsInvoker); + + void observe( + jsi::Runtime &runtime, + NativeMutationObserverObserveOptions options); + + void unobserve( + jsi::Runtime &runtime, + MutationObserverId mutationObserverId, + jsi::Object targetShadowNode); + + void connect( + jsi::Runtime &runtime, + AsyncCallback<> notifyMutationObservers, + jsi::Function getPublicInstanceFromInstanceHandle); + + void disconnect(jsi::Runtime &runtime); + + std::vector takeRecords(jsi::Runtime &runtime); + + private: + MutationObserverManager mutationObserverManager_{}; + + std::vector pendingRecords_; + + // This is passed to `connect` so we can retain references to public instances + // when mutation occur, before React cleans up unmounted instances. + jsi::Value getPublicInstanceFromInstanceHandle_ = jsi::Value::undefined(); + std::function + getPublicInstanceFromShadowNode_; + + bool notifiedMutationObservers_{}; + std::function notifyMutationObservers_; + + void onMutations(std::vector &records); + void notifyMutationObserversIfNecessary(); + + std::vector getPublicInstancesFromShadowNodes( + std::vector const &shadowNodes) const; +}; + +} // namespace facebook::react diff --git a/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.js b/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.js new file mode 100644 index 00000000000000..024102c96c8385 --- /dev/null +++ b/packages/react-native/Libraries/MutationObserver/NativeMutationObserver.js @@ -0,0 +1,58 @@ +/** + * 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 + */ + +import type {TurboModule} from '../TurboModule/RCTExport'; + +import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; + +export type MutationObserverId = number; + +// These types are not supported by the codegen. +type ShadowNode = mixed; +type InstanceHandle = mixed; +type ReactNativeElement = mixed; +type ReadOnlyNode = mixed; + +export type NativeMutationRecord = { + mutationObserverId: MutationObserverId, + target: ReactNativeElement, + addedNodes: $ReadOnlyArray, + removedNodes: $ReadOnlyArray, + ... +}; + +export type NativeMutationObserverObserveOptions = { + mutationObserverId: number, + targetShadowNode: ShadowNode, + subtree: boolean, +}; + +export interface Spec extends TurboModule { + +observe: (options: NativeMutationObserverObserveOptions) => void; + +unobserve: ( + mutationObserverId: number, + targetShadowNode: ShadowNode, + ) => void; + +connect: ( + notifyMutationObservers: () => void, + // We need this to retain the public instance before React removes the + // reference to it (which happen in mutations that remove nodes, or when + // nodes are removed between the change and the callback is executed in JS). + getPublicInstanceFromInstanceHandle: ( + instanceHandle: InstanceHandle, + ) => ReadOnlyNode, + ) => void; + +disconnect: () => void; + +takeRecords: () => $ReadOnlyArray; +} + +export default (TurboModuleRegistry.get( + 'NativeMutationObserverCxx', +): ?Spec); diff --git a/packages/react-native/Libraries/MutationObserver/__mocks__/NativeMutationObserver.js b/packages/react-native/Libraries/MutationObserver/__mocks__/NativeMutationObserver.js new file mode 100644 index 00000000000000..d7ffb65520d827 --- /dev/null +++ b/packages/react-native/Libraries/MutationObserver/__mocks__/NativeMutationObserver.js @@ -0,0 +1,327 @@ +/** + * 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 + */ + +/** + * This is a mock of `NativeMutationObserver` implementing the same logic as the + * native module and integrating with the existing mock for `FabricUIManager`. + * This allows us to test all the JavaScript code for IntersectionObserver in + * JavaScript as an integration test using only public APIs. + */ + +import type {NodeSet} from '../../ReactNative/FabricUIManager'; +import type {RootTag} from '../../ReactNative/RootTag'; +import type { + InternalInstanceHandle, + Node, +} from '../../Renderer/shims/ReactNativeTypes'; +import type { + MutationObserverId, + NativeMutationObserverObserveOptions, + NativeMutationRecord, + Spec, +} from '../NativeMutationObserver'; + +import ReadOnlyNode from '../../DOM/Nodes/ReadOnlyNode'; +import { + type NodeMock, + type UIManagerCommitHook, + fromNode, + getFabricUIManager, + getNodeInChildSet, +} from '../../ReactNative/__mocks__/FabricUIManager'; +import invariant from 'invariant'; +import nullthrows from 'nullthrows'; + +let pendingRecords: Array = []; +let callback: ?() => void; +let getPublicInstance: ?(instanceHandle: InternalInstanceHandle) => mixed; +let observersByRootTag: Map< + RootTag, + Map, shallow: Set}>, +> = new Map(); + +const FabricUIManagerMock = nullthrows(getFabricUIManager()); + +function getMockDataFromShadowNode(node: mixed): NodeMock { + // $FlowExpectedError[incompatible-call] + return fromNode(node); +} + +function castToNode(node: mixed): Node { + // $FlowExpectedError[incompatible-return] + return node; +} + +const NativeMutationMock = { + observe: (options: NativeMutationObserverObserveOptions): void => { + const targetShadowNode = castToNode(options.targetShadowNode); + const rootTag = getMockDataFromShadowNode(options.targetShadowNode).rootTag; + + let observers = observersByRootTag.get(rootTag); + if (observers == null) { + observers = new Map(); + observersByRootTag.set(rootTag, observers); + } + let observations = observers.get(options.mutationObserverId); + if (observations == null) { + observations = {deep: new Set(), shallow: new Set()}; + observers.set(options.mutationObserverId, observations); + } + + const isTargetBeingObserved = + observations.deep.has(targetShadowNode) || + observations.shallow.has(targetShadowNode); + invariant(!isTargetBeingObserved, 'unexpected duplicate call to observe'); + + if (options.subtree) { + observations.deep.add(targetShadowNode); + } else { + observations.shallow.add(targetShadowNode); + } + }, + unobserve: (mutationObserverId: number, target: mixed): void => { + const targetShadowNode = castToNode(target); + + const observers = observersByRootTag.get( + getMockDataFromShadowNode(targetShadowNode).rootTag, + ); + const observations = observers?.get(mutationObserverId); + invariant(observations != null, 'unexpected call to unobserve'); + + const isTargetBeingObserved = + observations.deep.has(targetShadowNode) || + observations.shallow.has(targetShadowNode); + invariant(isTargetBeingObserved, 'unexpected call to unobserve'); + + observations.deep.delete(targetShadowNode); + observations.shallow.delete(targetShadowNode); + }, + connect: ( + notifyMutationObserversCallback: () => void, + getPublicInstanceFromInstanceHandle: ( + instanceHandle: InternalInstanceHandle, + ) => mixed, + ): void => { + invariant(callback == null, 'unexpected call to connect'); + callback = notifyMutationObserversCallback; + getPublicInstance = getPublicInstanceFromInstanceHandle; + FabricUIManagerMock.__addCommitHook(NativeMutationObserverCommitHook); + }, + disconnect: (): void => { + invariant(callback != null, 'unexpected call to disconnect'); + callback = null; + FabricUIManagerMock.__removeCommitHook(NativeMutationObserverCommitHook); + }, + takeRecords: (): $ReadOnlyArray => { + const currentRecords = pendingRecords; + pendingRecords = []; + return currentRecords; + }, +}; + +(NativeMutationMock: Spec); + +export default NativeMutationMock; + +const NativeMutationObserverCommitHook: UIManagerCommitHook = { + shadowTreeWillCommit: (rootTag, oldChildSet, newChildSet) => { + runMutationObservations(rootTag, oldChildSet, newChildSet); + }, +}; + +function runMutationObservations( + rootTag: RootTag, + oldChildSet: ?NodeSet, + newChildSet: NodeSet, +): void { + const observers = observersByRootTag.get(rootTag); + if (!observers) { + return; + } + + const newRecords: Array = []; + + for (const [mutationObserverId, observations] of observers) { + const processedNodes: Set = new Set(); + for (const targetShadowNode of observations.deep) { + runMutationObservation({ + mutationObserverId, + targetShadowNode, + subtree: true, + oldChildSet, + newChildSet, + newRecords, + processedNodes, + }); + } + for (const targetShadowNode of observations.shallow) { + runMutationObservation({ + mutationObserverId, + targetShadowNode, + subtree: false, + oldChildSet, + newChildSet, + newRecords, + processedNodes, + }); + } + } + + for (const record of newRecords) { + pendingRecords.push(record); + } + + notifyObserversIfNecessary(); +} + +function findNodeOfSameFamily(list: NodeSet, node: Node): ?Node { + for (const current of list) { + if (fromNode(current).reactTag === fromNode(node).reactTag) { + return current; + } + } + return; +} + +function recordMutations({ + mutationObserverId, + targetShadowNode, + subtree, + oldNode, + newNode, + newRecords, + processedNodes, +}: { + mutationObserverId: MutationObserverId, + targetShadowNode: Node, + subtree: boolean, + oldNode: Node, + newNode: Node, + newRecords: Array, + processedNodes: Set, +}): void { + // If the nodes are referentially equal, their children are also the same. + if (oldNode === newNode || processedNodes.has(newNode)) { + return; + } + + processedNodes.add(newNode); + + const oldChildren = fromNode(oldNode).children; + const newChildren = fromNode(newNode).children; + + const addedNodes = []; + const removedNodes = []; + + // Check for removed nodes (and equal nodes for further inspection later) + for (const oldChild of oldChildren) { + const newChild = findNodeOfSameFamily(newChildren, oldChild); + if (newChild == null) { + removedNodes.push(oldChild); + } else if (subtree) { + recordMutations({ + mutationObserverId, + targetShadowNode, + subtree, + oldNode: oldChild, + newNode: newChild, + newRecords, + processedNodes, + }); + } + } + + // Check for added nodes + for (const newChild of newChildren) { + const oldChild = findNodeOfSameFamily(oldChildren, newChild); + if (oldChild == null) { + addedNodes.push(newChild); + } + } + + if (addedNodes.length > 0 || removedNodes.length > 0) { + newRecords.push({ + mutationObserverId: mutationObserverId, + target: nullthrows(getPublicInstance)( + getMockDataFromShadowNode(targetShadowNode).instanceHandle, + ), + addedNodes: addedNodes.map(node => { + const readOnlyNode = nullthrows(getPublicInstance)( + fromNode(node).instanceHandle, + ); + invariant( + readOnlyNode instanceof ReadOnlyNode, + 'expected instance of ReadOnlyNode', + ); + return readOnlyNode; + }), + removedNodes: removedNodes.map(node => { + const readOnlyNode = nullthrows(getPublicInstance)( + fromNode(node).instanceHandle, + ); + invariant( + readOnlyNode instanceof ReadOnlyNode, + 'expected instance of ReadOnlyNode', + ); + return readOnlyNode; + }), + }); + } +} + +function runMutationObservation({ + mutationObserverId, + targetShadowNode, + subtree, + oldChildSet, + newChildSet, + newRecords, + processedNodes, +}: { + mutationObserverId: MutationObserverId, + targetShadowNode: Node, + subtree: boolean, + oldChildSet: ?NodeSet, + newChildSet: NodeSet, + newRecords: Array, + processedNodes: Set, +}): void { + if (!oldChildSet) { + return; + } + + const oldTargetShadowNode = getNodeInChildSet(targetShadowNode, oldChildSet); + if (oldTargetShadowNode == null) { + return; + } + + const newTargetShadowNode = getNodeInChildSet(targetShadowNode, newChildSet); + if (newTargetShadowNode == null) { + return; + } + + recordMutations({ + mutationObserverId, + targetShadowNode, + subtree, + oldNode: oldTargetShadowNode, + newNode: newTargetShadowNode, + newRecords, + processedNodes, + }); +} + +function notifyObserversIfNecessary(): void { + if (pendingRecords.length > 0) { + // We schedule these using regular tasks in native because microtasks are + // still not properly supported. + setTimeout(() => callback?.(), 0); + } +} diff --git a/packages/react-native/Libraries/NativeAnimation/Drivers/RCTDecayAnimation.m b/packages/react-native/Libraries/NativeAnimation/Drivers/RCTDecayAnimation.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Drivers/RCTDecayAnimation.m rename to packages/react-native/Libraries/NativeAnimation/Drivers/RCTDecayAnimation.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Drivers/RCTEventAnimation.m b/packages/react-native/Libraries/NativeAnimation/Drivers/RCTEventAnimation.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Drivers/RCTEventAnimation.m rename to packages/react-native/Libraries/NativeAnimation/Drivers/RCTEventAnimation.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Drivers/RCTFrameAnimation.m b/packages/react-native/Libraries/NativeAnimation/Drivers/RCTFrameAnimation.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Drivers/RCTFrameAnimation.m rename to packages/react-native/Libraries/NativeAnimation/Drivers/RCTFrameAnimation.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Drivers/RCTSpringAnimation.m b/packages/react-native/Libraries/NativeAnimation/Drivers/RCTSpringAnimation.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Drivers/RCTSpringAnimation.m rename to packages/react-native/Libraries/NativeAnimation/Drivers/RCTSpringAnimation.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTAdditionAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTAdditionAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTAdditionAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTAdditionAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTColorAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTColorAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTColorAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTColorAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTDiffClampAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTDiffClampAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTDiffClampAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTDiffClampAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTDivisionAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTDivisionAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTDivisionAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTDivisionAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.h b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.h index d56395d55d7f18..26a78a7856a0ca 100644 --- a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.h +++ b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN RCT_EXTERN NSString *RCTInterpolateString( NSString *pattern, CGFloat inputValue, - NSArray *inputRange, + NSArray *inputRange, NSArray *> *outputRange, NSString *extrapolateLeft, NSString *extrapolateRight); diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.mm similarity index 99% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.mm index 3c53d537cc77cc..78ee190dee0cd4 100644 --- a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.m +++ b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTInterpolationAnimatedNode.mm @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -#import +#import "RCTInterpolationAnimatedNode.h" #import #import diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTMultiplicationAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTMultiplicationAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTMultiplicationAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTMultiplicationAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTObjectAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTObjectAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTObjectAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTObjectAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTStyleAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTStyleAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTStyleAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTStyleAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTSubtractionAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTSubtractionAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTSubtractionAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTSubtractionAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTTrackingAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTTrackingAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTTrackingAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTTrackingAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTTransformAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTTransformAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTTransformAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTTransformAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/Nodes/RCTValueAnimatedNode.m b/packages/react-native/Libraries/NativeAnimation/Nodes/RCTValueAnimatedNode.mm similarity index 100% rename from packages/react-native/Libraries/NativeAnimation/Nodes/RCTValueAnimatedNode.m rename to packages/react-native/Libraries/NativeAnimation/Nodes/RCTValueAnimatedNode.mm diff --git a/packages/react-native/Libraries/NativeAnimation/RCTAnimationUtils.m b/packages/react-native/Libraries/NativeAnimation/RCTAnimationUtils.mm similarity index 98% rename from packages/react-native/Libraries/NativeAnimation/RCTAnimationUtils.m rename to packages/react-native/Libraries/NativeAnimation/RCTAnimationUtils.mm index 8006fb808a9bf6..90cfe304d6f68a 100644 --- a/packages/react-native/Libraries/NativeAnimation/RCTAnimationUtils.m +++ b/packages/react-native/Libraries/NativeAnimation/RCTAnimationUtils.mm @@ -110,7 +110,7 @@ uint32_t RCTColorFromComponents(CGFloat red, CGFloat green, CGFloat blue, CGFloa #if TARGET_IPHONE_SIMULATOR // Based on https://stackoverflow.com/a/13307674 -float UIAnimationDragCoefficient(void); +UIKIT_EXTERN float UIAnimationDragCoefficient(void); #endif CGFloat RCTAnimationDragCoefficient(void) diff --git a/packages/react-native/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m b/packages/react-native/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.mm similarity index 99% rename from packages/react-native/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m rename to packages/react-native/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.mm index a272dcc8ded6d0..b3669766ea0746 100644 --- a/packages/react-native/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m +++ b/packages/react-native/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.mm @@ -346,7 +346,7 @@ - (void)addAnimatedEventToView:(NSNumber *)viewTag RCTAnimatedNode *node = _animationNodes[nodeTag]; if (!node) { - RCTLogError(@"Animated node with tag %@ does not exists", nodeTag); + RCTLogError(@"Animated node with tag %@ does not exist", nodeTag); return; } diff --git a/packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js b/packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js index bb13443bf44a2d..92b2959aad14d6 100644 --- a/packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js +++ b/packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js @@ -144,6 +144,18 @@ const bubblingEventTypes = { bubbled: 'onPointerOut', }, }, + topGotPointerCapture: { + phasedRegistrationNames: { + captured: 'onGotPointerCaptureCapture', + bubbled: 'onGotPointerCapture', + }, + }, + topLostPointerCapture: { + phasedRegistrationNames: { + captured: 'onLostPointerCaptureCapture', + bubbled: 'onLostPointerCapture', + }, + }, }; const directEventTypes = { @@ -366,6 +378,8 @@ const validAttributesForEventProps = ConditionallyIgnoredEventHandlers({ onPointerLeave: true, onPointerOver: true, onPointerOut: true, + onGotPointerCapture: true, + onLostPointerCapture: true, }); /** diff --git a/packages/react-native/Libraries/NativeComponent/NativeComponentRegistry.js b/packages/react-native/Libraries/NativeComponent/NativeComponentRegistry.js index 4ab3acd54ef4b6..ace5eb38e605cd 100644 --- a/packages/react-native/Libraries/NativeComponent/NativeComponentRegistry.js +++ b/packages/react-native/Libraries/NativeComponent/NativeComponentRegistry.js @@ -38,11 +38,9 @@ export function setRuntimeConfigProvider( verify: boolean, }, ): void { - invariant( - getRuntimeConfig == null, - 'NativeComponentRegistry.setRuntimeConfigProvider() called more than once.', - ); - getRuntimeConfig = runtimeConfigProvider; + if (getRuntimeConfig === undefined) { + getRuntimeConfig = runtimeConfigProvider; + } } /** diff --git a/packages/react-native/Libraries/Network/RCTNetworkPlugins.h b/packages/react-native/Libraries/Network/RCTNetworkPlugins.h index c596ea86356594..7fcf4722f2583b 100644 --- a/packages/react-native/Libraries/Network/RCTNetworkPlugins.h +++ b/packages/react-native/Libraries/Network/RCTNetworkPlugins.h @@ -29,10 +29,10 @@ extern "C" { Class RCTNetworkClassProvider(const char *name); // Lookup functions -Class RCTNetworkingCls(void) __attribute__((used)); Class RCTDataRequestHandlerCls(void) __attribute__((used)); Class RCTFileRequestHandlerCls(void) __attribute__((used)); Class RCTHTTPRequestHandlerCls(void) __attribute__((used)); +Class RCTNetworkingCls(void) __attribute__((used)); #ifdef __cplusplus } diff --git a/packages/react-native/Libraries/Network/RCTNetworkPlugins.mm b/packages/react-native/Libraries/Network/RCTNetworkPlugins.mm index d50344a587b30b..175d3eef47c891 100644 --- a/packages/react-native/Libraries/Network/RCTNetworkPlugins.mm +++ b/packages/react-native/Libraries/Network/RCTNetworkPlugins.mm @@ -19,10 +19,10 @@ Class RCTNetworkClassProvider(const char *name) { // Intentionally leak to avoid crashing after static destructors are run. static const auto sCoreModuleClassMap = new const std::unordered_map{ - {"Networking", RCTNetworkingCls}, {"DataRequestHandler", RCTDataRequestHandlerCls}, {"FileRequestHandler", RCTFileRequestHandlerCls}, {"HTTPRequestHandler", RCTHTTPRequestHandlerCls}, + {"Networking", RCTNetworkingCls}, }; auto p = sCoreModuleClassMap->find(name); diff --git a/packages/react-native/Libraries/Network/React-RCTNetwork.podspec b/packages/react-native/Libraries/Network/React-RCTNetwork.podspec index d8f54459dfe410..865dc41299094d 100644 --- a/packages/react-native/Libraries/Network/React-RCTNetwork.podspec +++ b/packages/react-native/Libraries/Network/React-RCTNetwork.podspec @@ -28,7 +28,11 @@ header_search_paths = [ if ENV["USE_FRAMEWORKS"] header_search_paths = header_search_paths.concat([ "\"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\"", - "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"" + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers/build/generated/ios\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers/build/generated/ios\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers\"", + ]) end diff --git a/packages/react-native/Libraries/Pressability/Pressability.js b/packages/react-native/Libraries/Pressability/Pressability.js index 803572cc677a5b..f577c621558a0c 100644 --- a/packages/react-native/Libraries/Pressability/Pressability.js +++ b/packages/react-native/Libraries/Pressability/Pressability.js @@ -134,6 +134,8 @@ export type PressabilityConfig = $ReadOnly<{| /** * Returns whether a long press gesture should cancel the press gesture. * Defaults to true. + * + * @deprecated */ onLongPressShouldCancelPress_DEPRECATED?: ?() => boolean, @@ -142,6 +144,8 @@ export type PressabilityConfig = $ReadOnly<{| * * Returns whether to yield to a lock termination request (e.g. if a native * scroll gesture attempts to steal the responder lock). + * + * @deprecated */ onResponderTerminationRequest_DEPRECATED?: ?() => boolean, @@ -163,7 +167,7 @@ export type EventHandlers = $ReadOnly<{| onMouseLeave?: (event: MouseEvent) => void, onPointerEnter?: (event: PointerEvent) => void, onPointerLeave?: (event: PointerEvent) => void, - onResponderGrant: (event: PressEvent) => void, + onResponderGrant: (event: PressEvent) => void | boolean, onResponderMove: (event: PressEvent) => void, onResponderRelease: (event: PressEvent) => void, onResponderTerminate: (event: PressEvent) => void, @@ -464,7 +468,7 @@ export default class Pressability { return !disabled; }, - onResponderGrant: (event: PressEvent): void => { + onResponderGrant: (event: PressEvent): void | boolean => { event.persist(); this._cancelPressOutDelayTimeout(); @@ -490,6 +494,8 @@ export default class Pressability { this._longPressDelayTimeout = setTimeout(() => { this._handleLongPress(event); }, delayLongPress + delayPressIn); + + return this._config.cancelable === false; }, onResponderMove: (event: PressEvent): void => { diff --git a/packages/react-native/Libraries/ReactNative/BridgelessUIManager.js b/packages/react-native/Libraries/ReactNative/BridgelessUIManager.js index bcd7f259754189..bcc3a984b22ffd 100644 --- a/packages/react-native/Libraries/ReactNative/BridgelessUIManager.js +++ b/packages/react-native/Libraries/ReactNative/BridgelessUIManager.js @@ -13,27 +13,45 @@ import type {RootTag} from '../Types/RootTagTypes'; import {unstable_hasComponent} from '../NativeComponent/NativeComponentRegistryUnstable'; +import ReactNativeFeatureFlags from './ReactNativeFeatureFlags'; + +let cachedConstants = null; const errorMessageForMethod = (methodName: string): string => "[ReactNative Architecture][JS] '" + methodName + "' is not available in the new React Native architecture."; +function getCachedConstants(): Object { + if (!cachedConstants) { + cachedConstants = global.RN$LegacyInterop_UIManager_getConstants(); + } + return cachedConstants; +} + module.exports = { getViewManagerConfig: (viewManagerName: string): mixed => { - console.error( - errorMessageForMethod('getViewManagerConfig') + - 'Use hasViewManagerConfig instead. viewManagerName: ' + - viewManagerName, - ); - return null; + if (ReactNativeFeatureFlags.enableNativeViewConfigsInBridgelessMode) { + return getCachedConstants()[viewManagerName]; + } else { + console.error( + errorMessageForMethod('getViewManagerConfig') + + 'Use hasViewManagerConfig instead. viewManagerName: ' + + viewManagerName, + ); + return null; + } }, hasViewManagerConfig: (viewManagerName: string): boolean => { return unstable_hasComponent(viewManagerName); }, getConstants: (): Object => { - console.error(errorMessageForMethod('getConstants')); - return {}; + if (ReactNativeFeatureFlags.enableNativeViewConfigsInBridgelessMode) { + return getCachedConstants(); + } else { + console.error(errorMessageForMethod('getConstants')); + return null; + } }, getConstantsForViewManager: (viewManagerName: string): Object => { console.error(errorMessageForMethod('getConstantsForViewManager')); diff --git a/packages/react-native/Libraries/ReactNative/ReactNativeFeatureFlags.js b/packages/react-native/Libraries/ReactNative/ReactNativeFeatureFlags.js index 2dafd7de630c41..5c24614e4134b2 100644 --- a/packages/react-native/Libraries/ReactNative/ReactNativeFeatureFlags.js +++ b/packages/react-native/Libraries/ReactNative/ReactNativeFeatureFlags.js @@ -49,6 +49,14 @@ export type FeatureFlags = {| * Enables use of AnimatedObject for animating transform values. */ shouldUseAnimatedObjectForTransform: () => boolean, + /** + * Enables use of setNativeProps in JS driven animations. + */ + shouldUseSetNativePropsInFabric: () => boolean, + /** + * Enables native view configs in brdgeless mode. + */ + enableNativeViewConfigsInBridgelessMode: () => boolean, |}; const ReactNativeFeatureFlags: FeatureFlags = { @@ -60,6 +68,8 @@ const ReactNativeFeatureFlags: FeatureFlags = { isGlobalWebPerformanceLoggerEnabled: () => false, enableAccessToHostTreeInFabric: () => false, shouldUseAnimatedObjectForTransform: () => false, + shouldUseSetNativePropsInFabric: () => false, + enableNativeViewConfigsInBridgelessMode: () => false, }; module.exports = ReactNativeFeatureFlags; diff --git a/packages/react-native/Libraries/ReactNative/UIManager.js b/packages/react-native/Libraries/ReactNative/UIManager.js index e830b96971891a..98360a14bb23c5 100644 --- a/packages/react-native/Libraries/ReactNative/UIManager.js +++ b/packages/react-native/Libraries/ReactNative/UIManager.js @@ -180,6 +180,14 @@ const UIManager = { commandName: number | string, commandArgs: any[], ) { + // Sometimes, libraries directly pass in the output of `findNodeHandle` to + // this function without checking if it's null. This guards against that + // case. We throw early here in Javascript so we can get a JS stacktrace + // instead of a harder-to-debug native Java or Objective-C stacktrace. + if (typeof reactTag !== 'number') { + throw new Error('dispatchViewManagerCommand: found null reactTag'); + } + if (isFabricReactTag(reactTag)) { const FabricUIManager = nullthrows(getFabricUIManager()); const shadowNode = diff --git a/packages/react-native/Libraries/ReactNative/__mocks__/FabricUIManager.js b/packages/react-native/Libraries/ReactNative/__mocks__/FabricUIManager.js index 0e9a67dccb0ba3..ddab78a2f14e97 100644 --- a/packages/react-native/Libraries/ReactNative/__mocks__/FabricUIManager.js +++ b/packages/react-native/Libraries/ReactNative/__mocks__/FabricUIManager.js @@ -24,7 +24,7 @@ import type { Spec as FabricUIManager, } from '../FabricUIManager'; -type NodeMock = { +export type NodeMock = { children: NodeSet, instanceHandle: InternalInstanceHandle, props: NodeProps, @@ -33,12 +33,12 @@ type NodeMock = { viewName: string, }; -function fromNode(node: Node): NodeMock { +export function fromNode(node: Node): NodeMock { // $FlowExpectedError[incompatible-return] return node; } -function toNode(node: NodeMock): Node { +export function toNode(node: NodeMock): Node { // $FlowExpectedError[incompatible-return] return node; } @@ -66,14 +66,10 @@ function ensureHostNode(node: Node): void { } } -function getAncestorsInCurrentTree( +function getAncestorsInChildSet( node: Node, + childSet: NodeSet, ): ?$ReadOnlyArray<[Node, number]> { - const childSet = roots.get(fromNode(node).rootTag); - if (childSet == null) { - return null; - } - const rootNode = toNode({ reactTag: 0, rootTag: fromNode(node).rootTag, @@ -96,6 +92,17 @@ function getAncestorsInCurrentTree( return null; } +function getAncestorsInCurrentTree( + node: Node, +): ?$ReadOnlyArray<[Node, number]> { + const childSet = roots.get(fromNode(node).rootTag); + if (childSet == null) { + return null; + } + + return getAncestorsInChildSet(node, childSet); +} + function getAncestors(root: Node, node: Node): ?$ReadOnlyArray<[Node, number]> { if (fromNode(root).reactTag === fromNode(node).reactTag) { return []; @@ -113,8 +120,8 @@ function getAncestors(root: Node, node: Node): ?$ReadOnlyArray<[Node, number]> { return null; } -function getNodeInCurrentTree(node: Node): ?Node { - const ancestors = getAncestorsInCurrentTree(node); +export function getNodeInChildSet(node: Node, childSet: NodeSet): ?Node { + const ancestors = getAncestorsInChildSet(node, childSet); if (ancestors == null) { return null; } @@ -124,6 +131,15 @@ function getNodeInCurrentTree(node: Node): ?Node { return nodeInCurrentTree; } +function getNodeInCurrentTree(node: Node): ?Node { + const childSet = roots.get(fromNode(node).rootTag); + if (childSet == null) { + return null; + } + + return getNodeInChildSet(node, childSet); +} + function* dfs(node: ?Node): Iterator { if (node == null) { return; @@ -143,7 +159,23 @@ function hasDisplayNone(node: Node): boolean { return props != null && props.display === 'none'; } -const FabricUIManagerMock: FabricUIManager = { +interface IFabricUIManagerMock extends FabricUIManager { + __getInstanceHandleFromNode(node: Node): InternalInstanceHandle; + __addCommitHook(commitHook: UIManagerCommitHook): void; + __removeCommitHook(commitHook: UIManagerCommitHook): void; +} + +export interface UIManagerCommitHook { + shadowTreeWillCommit: ( + rootTag: RootTag, + oldChildSet: ?NodeSet, + newChildSet: NodeSet, + ) => void; +} + +const commitHooks: Set = new Set(); + +const FabricUIManagerMock: IFabricUIManagerMock = { createNode: jest.fn( ( reactTag: number, @@ -206,6 +238,9 @@ const FabricUIManagerMock: FabricUIManager = { childSet.push(child); }), completeRoot: jest.fn((rootTag: RootTag, childSet: NodeSet): void => { + commitHooks.forEach(hook => + hook.shadowTreeWillCommit(rootTag, roots.get(rootTag), childSet), + ); roots.set(rootTag, childSet); }), measure: jest.fn((node: Node, callback: MeasureOnSuccessCallback): void => { @@ -458,10 +493,22 @@ const FabricUIManagerMock: FabricUIManager = { return [scrollLeft, scrollTop]; }, ), + + __getInstanceHandleFromNode(node: Node): InternalInstanceHandle { + return fromNode(node).instanceHandle; + }, + + __addCommitHook(commitHook: UIManagerCommitHook): void { + commitHooks.add(commitHook); + }, + + __removeCommitHook(commitHook: UIManagerCommitHook): void { + commitHooks.delete(commitHook); + }, }; global.nativeFabricUIManager = FabricUIManagerMock; -export function getFabricUIManager(): ?FabricUIManager { +export function getFabricUIManager(): ?IFabricUIManagerMock { return FabricUIManagerMock; } diff --git a/packages/react-native/Libraries/Settings/React-RCTSettings.podspec b/packages/react-native/Libraries/Settings/React-RCTSettings.podspec index 4bbd4e476bd06b..9fa55fded754fc 100644 --- a/packages/react-native/Libraries/Settings/React-RCTSettings.podspec +++ b/packages/react-native/Libraries/Settings/React-RCTSettings.podspec @@ -28,7 +28,10 @@ header_search_paths = [ if ENV["USE_FRAMEWORKS"] header_search_paths = header_search_paths.concat([ "\"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\"", - "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"" + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers/build/generated/ios\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers/build/generated/ios\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers\"", ]) end diff --git a/packages/react-native/Libraries/Share/Share.d.ts b/packages/react-native/Libraries/Share/Share.d.ts index 76ac757c97e8fe..789251a2c7bcfe 100644 --- a/packages/react-native/Libraries/Share/Share.d.ts +++ b/packages/react-native/Libraries/Share/Share.d.ts @@ -27,17 +27,11 @@ export type ShareOptions = { anchor?: number | undefined; }; -export type ShareSharedAction = { - action: 'sharedAction'; - activityType?: string | undefined; +export type ShareAction = { + action: 'sharedAction' | 'dismissedAction'; + activityType?: string | null | undefined; }; -export type ShareDismissedAction = { - action: 'dismissedAction'; -}; - -export type ShareAction = ShareSharedAction | ShareDismissedAction; - export interface ShareStatic { /** * Open a dialog to share text content. diff --git a/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts b/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts index 7bc5365ae0ede9..7956766b34367a 100644 --- a/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts +++ b/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts @@ -173,23 +173,27 @@ interface MatrixTransform { matrix: AnimatableNumericValue[]; } +type MaximumOneOf = K extends keyof T + ? {[P in K]: T[K]} & {[P in Exclude]?: never} + : never; + export interface TransformsStyle { transform?: - | ( - | PerpectiveTransform - | RotateTransform - | RotateXTransform - | RotateYTransform - | RotateZTransform - | ScaleTransform - | ScaleXTransform - | ScaleYTransform - | TranslateXTransform - | TranslateYTransform - | SkewXTransform - | SkewYTransform - | MatrixTransform - )[] + | MaximumOneOf< + PerpectiveTransform & + RotateTransform & + RotateXTransform & + RotateYTransform & + RotateZTransform & + ScaleTransform & + ScaleXTransform & + ScaleYTransform & + TranslateXTransform & + TranslateYTransform & + SkewXTransform & + SkewYTransform & + MatrixTransform + >[] | string | undefined; /** @@ -335,7 +339,6 @@ export interface TextStyle extends TextStyleIOS, TextStyleAndroid, ViewStyle { textShadowOffset?: {width: number; height: number} | undefined; textShadowRadius?: number | undefined; textTransform?: 'none' | 'capitalize' | 'uppercase' | 'lowercase' | undefined; - testID?: string | undefined; } /** diff --git a/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponent.h b/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponent.h deleted file mode 100644 index 63a9c960657165..00000000000000 --- a/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponent.h +++ /dev/null @@ -1,28 +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. - */ - -#import -#import -#import -#import - -@class RCTBridge; - -/** - * ComponentKit component represents a React Native Surface created - * (and stored in the state) with given `bridge`, `moduleName`, - * and `properties`. - */ -@interface RCTSurfaceBackedComponent : CKCompositeComponent - -+ (instancetype)newWithBridge:(RCTBridge *)bridge - surfacePresenter:(RCTSurfacePresenter *)surfacePresenter - moduleName:(NSString *)moduleName - properties:(NSDictionary *)properties - options:(RCTSurfaceHostingComponentOptions)options; - -@end diff --git a/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponent.mm b/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponent.mm deleted file mode 100644 index 39517ac5e86e57..00000000000000 --- a/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponent.mm +++ /dev/null @@ -1,76 +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. - */ - -#import "RCTSurfaceBackedComponent.h" - -#import - -#import -#import -#import -#import -#import - -#import "RCTSurfaceBackedComponentState.h" - -@implementation RCTSurfaceBackedComponent - -+ (id)initialState -{ - return [RCTSurfaceBackedComponentState new]; -} - -+ (instancetype)newWithBridge:(RCTBridge *)bridge - surfacePresenter:(RCTSurfacePresenter *)surfacePresenter - moduleName:(NSString *)moduleName - properties:(NSDictionary *)properties - options:(RCTSurfaceHostingComponentOptions)options -{ - CKComponentScope scope(self, moduleName); - - RCTSurfaceBackedComponentState *state = scope.state(); - - // JavaScript entrypoints expects "fabric" key for Fabric surfaces - NSMutableDictionary *adjustedProperties = [[NSMutableDictionary alloc] initWithDictionary:properties]; - adjustedProperties[@"fabric"] = surfacePresenter ? @YES : nil; - - if (state.surface == nil || ![state.surface.moduleName isEqualToString:moduleName]) { - id surface; - if (surfacePresenter) { - surface = [[RCTFabricSurface alloc] initWithSurfacePresenter:surfacePresenter - moduleName:moduleName - initialProperties:adjustedProperties]; - } else { - surface = [[RCTSurface alloc] initWithBridge:bridge moduleName:moduleName initialProperties:adjustedProperties]; - } - [surface start]; - - state = [RCTSurfaceBackedComponentState newWithSurface:surface]; - - CKComponentScope::replaceState(scope, state); - } else { - if (![state.surface.properties isEqualToDictionary:adjustedProperties]) { - state.surface.properties = adjustedProperties; - } - } - - RCTSurfaceHostingComponent *surfaceHostingComponent = [RCTSurfaceHostingComponent newWithSurface:state.surface - options:options]; - - CKComponent *component; - if (options.activityIndicatorComponentFactory == nil || RCTSurfaceStageIsRunning(state.surface.stage)) { - component = surfaceHostingComponent; - } else { - component = [[CKOverlayLayoutComponent alloc] initWithComponent:surfaceHostingComponent - overlay:options.activityIndicatorComponentFactory() - accessibilityContext:{}]; - } - - return [super newWithComponent:component]; -} - -@end diff --git a/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponentState.mm b/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponentState.mm deleted file mode 100644 index 224017da62b905..00000000000000 --- a/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponentState.mm +++ /dev/null @@ -1,26 +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. - */ - -#import "RCTSurfaceBackedComponentState.h" - -@implementation RCTSurfaceBackedComponentState - -+ (instancetype)newWithSurface:(id)surface -{ - return [[self alloc] initWithSurface:surface]; -} - -- (instancetype)initWithSurface:(id)surface -{ - if (self = [super init]) { - _surface = surface; - } - - return self; -} - -@end diff --git a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent+Internal.h b/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent+Internal.h deleted file mode 100644 index b3d3d4616aee49..00000000000000 --- a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent+Internal.h +++ /dev/null @@ -1,19 +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. - */ - -#import -#import - -@class RCTSurfaceHostingComponentState; - -@interface RCTSurfaceHostingComponent () - -@property (nonatomic, strong, readonly) id surface; -@property (nonatomic, retain, readonly) RCTSurfaceHostingComponentState *state; -@property (nonatomic, assign, readonly) RCTSurfaceHostingComponentOptions options; - -@end diff --git a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent.h b/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent.h deleted file mode 100644 index 1bd6f4667d325f..00000000000000 --- a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent.h +++ /dev/null @@ -1,19 +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. - */ - -#import -#import -#import - -/** - * ComponentKit component represents given Surface instance. - */ -@interface RCTSurfaceHostingComponent : CKComponent - -+ (instancetype)newWithSurface:(id)surface options:(RCTSurfaceHostingComponentOptions)options; - -@end diff --git a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent.mm b/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent.mm deleted file mode 100644 index 28bc33e5933e04..00000000000000 --- a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent.mm +++ /dev/null @@ -1,116 +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. - */ - -#import "RCTSurfaceHostingComponent.h" -#import "RCTSurfaceHostingComponent+Internal.h" - -#import - -#import -#import -#import -#import - -#import "RCTSurfaceHostingComponentController.h" -#import "RCTSurfaceHostingComponentState.h" - -@implementation RCTSurfaceHostingComponent - -+ (Class)controllerClass -{ - return [RCTSurfaceHostingComponentController class]; -} - -+ (id)initialState -{ - return [RCTSurfaceHostingComponentState new]; -} - -+ (instancetype)newWithSurface:(id)surface options:(RCTSurfaceHostingComponentOptions)options -{ - CKComponentScope scope(self, surface); - - RCTSurfaceHostingComponentState *const state = scope.state(); - - RCTSurfaceHostingComponentState *const newState = - [RCTSurfaceHostingComponentState newWithStage:surface.stage intrinsicSize:surface.intrinsicSize]; - - if (![state isEqual:newState]) { - CKComponentScope::replaceState(scope, newState); - } - - RCTSurfaceHostingComponent *const component = [super newWithView:{[UIView class]} size:{}]; - - if (component) { - component->_state = scope.state(); - component->_surface = surface; - component->_options = options; - } - - return component; -} - -- (RCLayout)computeLayoutThatFits:(CKSizeRange)constrainedSize -{ - // Optimistically communicating layout constraints to the `_surface`, - // just to provide layout constraints to React Native as early as possible. - // React Native *may* use this info later during applying the own state and - // related laying out in parallel with ComponentKit execution. - // This call will not interfere (or introduce any negative side effects) with - // following invocation of `sizeThatFitsMinimumSize:maximumSize:`. - // A weak point: We assume here that this particular layout will be - // mounted eventually, which is technically not guaranteed by ComponentKit. - // Therefore we also assume that the last layout calculated in a sequence - // will be mounted anyways, which is probably true for all *real* use cases. - // We plan to tackle this problem during the next big step in improving - // interop compatibilities of React Native which will enable us granularly - // control React Native mounting blocks and, as a result, implement - // truly synchronous mounting stage between React Native and ComponentKit. - [_surface setMinimumSize:constrainedSize.min maximumSize:constrainedSize.max]; - - // Just in case of the very first building pass, we give React Native a chance - // to prepare its internals for coming synchronous measuring. - if ([_surface isKindOfClass:[RCTSurface class]]) { - // Legacy Pre-Fabric Surface - [(RCTSurface *)_surface synchronouslyWaitForStage:RCTSurfaceStageSurfaceDidInitialLayout - timeout:_options.synchronousLayoutingTimeout]; - } else if ([_surface isKindOfClass:[RCTFabricSurface class]]) { - // Fabric Surface - // Hack: Increase timeout because RCTFabricSurface stage will be RCTSurfaceStageSurfaceDidInitialLayout - // before mounting has finished, which can cause sizeThatFitsMinimumSize to return the wrong value. - // Safe hack because timeout length can be increased without making the component seem slower. - // However if timeout length is less than the time to mount a surface, the size may be incorrect. - // TODO (T115399546) Allow RCTFabricSurface synchronouslyWaitFor to wait for mounting completion stage - NSTimeInterval timeout = 20; - [(RCTFabricSurface *)_surface synchronouslyWaitFor:timeout]; - } - - CGSize fittingSize = CGSizeZero; - if (_surface.stage & RCTSurfaceStageSurfaceDidInitialLayout) { - fittingSize = [_surface sizeThatFitsMinimumSize:constrainedSize.min maximumSize:constrainedSize.max]; - } else { - fittingSize = _options.activityIndicatorSize; - } - - fittingSize = constrainedSize.clamp(fittingSize); - return {self, fittingSize}; -} - -- (CKComponentBoundsAnimation)boundsAnimationFromPreviousComponent:(RCTSurfaceHostingComponent *)previousComponent -{ - if (_options.boundsAnimations && (previousComponent->_state.stage != _state.stage)) { - return { - .mode = CKComponentBoundsAnimationModeDefault, - .duration = 0.25, - .options = UIViewAnimationOptionCurveEaseInOut, - }; - } - - return {}; -} - -@end diff --git a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentController.mm b/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentController.mm deleted file mode 100644 index 7f82cd4158918d..00000000000000 --- a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentController.mm +++ /dev/null @@ -1,161 +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. - */ - -#import "RCTSurfaceHostingComponentController.h" - -#import -#import -#import -#import -#import - -#import "RCTSurfaceHostingComponent+Internal.h" -#import "RCTSurfaceHostingComponent.h" -#import "RCTSurfaceHostingComponentState.h" - -@interface RCTSurfaceHostingComponentController () -@end - -@implementation RCTSurfaceHostingComponentController { - id _surface; -} - -- (instancetype)initWithComponent:(RCTSurfaceHostingComponent *)component -{ - if (self = [super initWithComponent:component]) { - [self updateSurfaceWithComponent:component]; - } - - return self; -} - -#pragma mark - Lifecycle - -- (void)didMount -{ - [super didMount]; - [self mountSurfaceView]; -} - -- (void)didRemount -{ - [super didRemount]; - [self mountSurfaceView]; -} - -- (void)didUpdateComponent -{ - [super didUpdateComponent]; - [self updateSurfaceWithComponent:(RCTSurfaceHostingComponent *)self.component]; -} - -- (void)didUnmount -{ - [super didUnmount]; - [self unmountSurfaceView]; -} - -#pragma mark - Helpers - -- (void)updateSurfaceWithComponent:(RCTSurfaceHostingComponent *)component -{ - // Updating `surface` - id const surface = component.surface; - if (surface != _surface) { - if (_surface.delegate == self) { - _surface.delegate = nil; - } - - _surface = surface; - _surface.delegate = self; - } -} - -- (void)setIntrinsicSize:(CGSize)intrinsicSize -{ - __weak __typeof(self) weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - __strong __typeof(self) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - [strongSelf.component - updateState:^(RCTSurfaceHostingComponentState *state) { - return [RCTSurfaceHostingComponentState newWithStage:state.stage intrinsicSize:intrinsicSize]; - } - mode:[strongSelf suitableStateUpdateMode]]; - }); -} - -- (void)setStage:(RCTSurfaceStage)stage -{ - __weak __typeof(self) weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - __strong __typeof(self) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - [strongSelf.component - updateState:^(RCTSurfaceHostingComponentState *state) { - return [RCTSurfaceHostingComponentState newWithStage:stage intrinsicSize:state.intrinsicSize]; - } - mode:[strongSelf suitableStateUpdateMode]]; - }); -} - -- (CKUpdateMode)suitableStateUpdateMode -{ - return ((RCTSurfaceHostingComponent *)self.component).options.synchronousStateUpdates && RCTIsMainQueue() - ? CKUpdateModeSynchronous - : CKUpdateModeAsynchronous; -} - -- (void)mountSurfaceView -{ - UIView *const surfaceView = _surface.view; - - const CKComponentViewContext &context = [[self component] viewContext]; - - UIView *const superview = context.view; - superview.clipsToBounds = YES; - - RCTAssert([superview.subviews count] <= 1, @"Should never have more than a single stateful subview."); - - UIView *const existingSurfaceView = [superview.subviews lastObject]; - if (existingSurfaceView != surfaceView) { - [existingSurfaceView removeFromSuperview]; - surfaceView.frame = superview.bounds; - surfaceView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - [superview addSubview:surfaceView]; - } -} - -- (void)unmountSurfaceView -{ - const CKComponentViewContext &context = [[self component] viewContext]; - - UIView *const superview = context.view; - RCTAssert([superview.subviews count] <= 1, @"Should never have more than a single stateful subview."); - UIView *const existingSurfaceView = [superview.subviews lastObject]; - [existingSurfaceView removeFromSuperview]; -} - -#pragma mark - RCTSurfaceDelegate - -- (void)surface:(RCTSurface *)surface didChangeIntrinsicSize:(CGSize)intrinsicSize -{ - [self setIntrinsicSize:intrinsicSize]; -} - -- (void)surface:(RCTSurface *)surface didChangeStage:(RCTSurfaceStage)stage -{ - [self setStage:stage]; -} - -@end diff --git a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentOptions.h b/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentOptions.h deleted file mode 100644 index 06819d99c809f5..00000000000000 --- a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentOptions.h +++ /dev/null @@ -1,20 +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. - */ - -#import - -#import - -typedef CKComponent * (^RCTSurfaceHostingComponentOptionsActivityIndicatorComponentFactory)(); - -struct RCTSurfaceHostingComponentOptions { - NSTimeInterval synchronousLayoutingTimeout = 0.350; - BOOL synchronousStateUpdates = YES; - CGSize activityIndicatorSize = {44.0, 44.0}; - BOOL boundsAnimations = YES; - RCTSurfaceHostingComponentOptionsActivityIndicatorComponentFactory activityIndicatorComponentFactory = nil; -}; diff --git a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentState.h b/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentState.h deleted file mode 100644 index 6036e74be774e0..00000000000000 --- a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentState.h +++ /dev/null @@ -1,19 +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. - */ - -#import - -#import - -@interface RCTSurfaceHostingComponentState : NSObject - -@property (nonatomic, readonly, assign) CGSize intrinsicSize; -@property (nonatomic, readonly, assign) RCTSurfaceStage stage; - -+ (instancetype)newWithStage:(RCTSurfaceStage)stage intrinsicSize:(CGSize)intrinsicSize; - -@end diff --git a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentState.mm b/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentState.mm deleted file mode 100644 index f108bff23833d7..00000000000000 --- a/packages/react-native/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponentState.mm +++ /dev/null @@ -1,36 +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. - */ - -#import "RCTSurfaceHostingComponentState.h" - -@implementation RCTSurfaceHostingComponentState - -+ (instancetype)newWithStage:(RCTSurfaceStage)stage intrinsicSize:(CGSize)intrinsicSize -{ - return [[self alloc] initWithStage:stage intrinsicSize:intrinsicSize]; -} - -- (instancetype)initWithStage:(RCTSurfaceStage)stage intrinsicSize:(CGSize)intrinsicSize -{ - if (self = [super init]) { - _stage = stage; - _intrinsicSize = intrinsicSize; - } - - return self; -} - -- (BOOL)isEqual:(RCTSurfaceHostingComponentState *)other -{ - if (other == self) { - return YES; - } - - return _stage == other->_stage && CGSizeEqualToSize(_intrinsicSize, other->_intrinsicSize); -} - -@end diff --git a/packages/react-native/Libraries/Text/BaseText/RCTBaseTextShadowView.m b/packages/react-native/Libraries/Text/BaseText/RCTBaseTextShadowView.mm similarity index 100% rename from packages/react-native/Libraries/Text/BaseText/RCTBaseTextShadowView.m rename to packages/react-native/Libraries/Text/BaseText/RCTBaseTextShadowView.mm diff --git a/packages/react-native/Libraries/Text/BaseText/RCTBaseTextViewManager.m b/packages/react-native/Libraries/Text/BaseText/RCTBaseTextViewManager.mm similarity index 100% rename from packages/react-native/Libraries/Text/BaseText/RCTBaseTextViewManager.m rename to packages/react-native/Libraries/Text/BaseText/RCTBaseTextViewManager.mm diff --git a/packages/react-native/Libraries/Text/RCTConvert+Text.m b/packages/react-native/Libraries/Text/RCTConvert+Text.mm similarity index 100% rename from packages/react-native/Libraries/Text/RCTConvert+Text.m rename to packages/react-native/Libraries/Text/RCTConvert+Text.mm diff --git a/packages/react-native/Libraries/Text/RCTTextAttributes.m b/packages/react-native/Libraries/Text/RCTTextAttributes.mm similarity index 100% rename from packages/react-native/Libraries/Text/RCTTextAttributes.m rename to packages/react-native/Libraries/Text/RCTTextAttributes.mm diff --git a/packages/react-native/Libraries/Text/RawText/RCTRawTextShadowView.m b/packages/react-native/Libraries/Text/RawText/RCTRawTextShadowView.mm similarity index 100% rename from packages/react-native/Libraries/Text/RawText/RCTRawTextShadowView.m rename to packages/react-native/Libraries/Text/RawText/RCTRawTextShadowView.mm diff --git a/packages/react-native/Libraries/Text/RawText/RCTRawTextViewManager.m b/packages/react-native/Libraries/Text/RawText/RCTRawTextViewManager.mm similarity index 100% rename from packages/react-native/Libraries/Text/RawText/RCTRawTextViewManager.m rename to packages/react-native/Libraries/Text/RawText/RCTRawTextViewManager.mm diff --git a/packages/react-native/Libraries/Text/React-RCTText.podspec b/packages/react-native/Libraries/Text/React-RCTText.podspec index 36d878b3c3ff33..3777e5d9603f28 100644 --- a/packages/react-native/Libraries/Text/React-RCTText.podspec +++ b/packages/react-native/Libraries/Text/React-RCTText.podspec @@ -26,9 +26,11 @@ Pod::Spec.new do |s| s.author = "Meta Platforms, Inc. and its affiliates" s.platforms = { :ios => min_ios_version_supported } s.source = source - s.source_files = "**/*.{h,m}" + s.source_files = "**/*.{h,m,mm}" s.preserve_paths = "package.json", "LICENSE", "LICENSE-docs" s.header_dir = "RCTText" + s.framework = ["MobileCoreServices"] + s.dependency "Yoga" s.dependency "React-Core/RCTTextHeaders", version end diff --git a/packages/react-native/Libraries/Text/Text.d.ts b/packages/react-native/Libraries/Text/Text.d.ts index bee0c632372ea0..b90bf240ba72d9 100644 --- a/packages/react-native/Libraries/Text/Text.d.ts +++ b/packages/react-native/Libraries/Text/Text.d.ts @@ -43,11 +43,6 @@ export interface TextPropsIOS { | 'largeTitle' | undefined; - /** - * Specifies smallest possible scale a font can reach when adjustsFontSizeToFit is enabled. (values 0.01-1.0). - */ - minimumFontScale?: number | undefined; - /** * When `true`, no visual change is made when text is pressed down. By * default, a gray oval highlights the text on press down. @@ -209,6 +204,11 @@ export interface TextProps * - >= 1: sets the maxFontSizeMultiplier of this node to this value */ maxFontSizeMultiplier?: number | null | undefined; + + /** + * Specifies smallest possible scale a font can reach when adjustsFontSizeToFit is enabled. (values 0.01-1.0). + */ + minimumFontScale?: number | undefined; } /** diff --git a/packages/react-native/Libraries/Text/Text.js b/packages/react-native/Libraries/Text/Text.js index df548af47dab81..d473178deb5490 100644 --- a/packages/react-native/Libraries/Text/Text.js +++ b/packages/react-native/Libraries/Text/Text.js @@ -15,7 +15,6 @@ import * as PressabilityDebug from '../Pressability/PressabilityDebug'; import usePressability from '../Pressability/usePressability'; import flattenStyle from '../StyleSheet/flattenStyle'; import processColor from '../StyleSheet/processColor'; -import {getAccessibilityRoleFromRole} from '../Utilities/AcessibilityMapping'; import Platform from '../Utilities/Platform'; import TextAncestor from './TextAncestor'; import {NativeText, NativeVirtualText} from './TextNativeComponent'; @@ -34,7 +33,6 @@ const Text: React.AbstractComponent< const { accessible, accessibilityLabel, - accessibilityRole, accessibilityState, allowFontScaling, 'aria-busy': ariaBusy, @@ -57,7 +55,6 @@ const Text: React.AbstractComponent< onResponderTerminationRequest, onStartShouldSetResponder, pressRetentionOffset, - role, suppressHighlighting, ...restProps } = props; @@ -234,9 +231,6 @@ const Text: React.AbstractComponent< {...restProps} {...eventHandlersForText} accessibilityLabel={ariaLabel ?? accessibilityLabel} - accessibilityRole={ - role ? getAccessibilityRoleFromRole(role) : accessibilityRole - } accessibilityState={_accessibilityState} isHighlighted={isHighlighted} isPressable={isPressable} @@ -253,9 +247,6 @@ const Text: React.AbstractComponent< {...restProps} {...eventHandlersForText} accessibilityLabel={ariaLabel ?? accessibilityLabel} - accessibilityRole={ - role ? getAccessibilityRoleFromRole(role) : accessibilityRole - } accessibilityState={nativeTextAccessibilityState} accessible={ accessible == null && Platform.OS === 'android' diff --git a/packages/react-native/Libraries/Text/Text/RCTDynamicTypeRamp.m b/packages/react-native/Libraries/Text/Text/RCTDynamicTypeRamp.mm similarity index 100% rename from packages/react-native/Libraries/Text/Text/RCTDynamicTypeRamp.m rename to packages/react-native/Libraries/Text/Text/RCTDynamicTypeRamp.mm diff --git a/packages/react-native/Libraries/Text/Text/RCTTextShadowView.m b/packages/react-native/Libraries/Text/Text/RCTTextShadowView.mm similarity index 100% rename from packages/react-native/Libraries/Text/Text/RCTTextShadowView.m rename to packages/react-native/Libraries/Text/Text/RCTTextShadowView.mm diff --git a/packages/react-native/Libraries/Text/Text/RCTTextView.m b/packages/react-native/Libraries/Text/Text/RCTTextView.mm similarity index 100% rename from packages/react-native/Libraries/Text/Text/RCTTextView.m rename to packages/react-native/Libraries/Text/Text/RCTTextView.mm diff --git a/packages/react-native/Libraries/Text/Text/RCTTextViewManager.m b/packages/react-native/Libraries/Text/Text/RCTTextViewManager.mm similarity index 100% rename from packages/react-native/Libraries/Text/Text/RCTTextViewManager.m rename to packages/react-native/Libraries/Text/Text/RCTTextViewManager.mm diff --git a/packages/react-native/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputView.m b/packages/react-native/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputView.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputView.m rename to packages/react-native/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputView.mm diff --git a/packages/react-native/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.m b/packages/react-native/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.m rename to packages/react-native/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.mm diff --git a/packages/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.m b/packages/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.mm similarity index 99% rename from packages/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.m rename to packages/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.mm index e95384b28c1551..6526db1261072c 100644 --- a/packages/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.m +++ b/packages/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.mm @@ -57,13 +57,13 @@ @implementation RCTUITextView { static UIFont *defaultPlaceholderFont(void) { - return [UIFont systemFontOfSize:17]; + return [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; } static UIColor *defaultPlaceholderColor(void) { // Default placeholder color from UITextField. - return [UIColor colorWithRed:0 green:0 blue:0.0980392 alpha:0.22]; + return [UIColor placeholderTextColor]; } - (instancetype)initWithFrame:(CGRect)frame diff --git a/packages/react-native/Libraries/Text/TextInput/RCTBackedTextInputDelegateAdapter.m b/packages/react-native/Libraries/Text/TextInput/RCTBackedTextInputDelegateAdapter.mm similarity index 98% rename from packages/react-native/Libraries/Text/TextInput/RCTBackedTextInputDelegateAdapter.m rename to packages/react-native/Libraries/Text/TextInput/RCTBackedTextInputDelegateAdapter.mm index 1c8f8e055e8399..9dca6a5567d9a0 100644 --- a/packages/react-native/Libraries/Text/TextInput/RCTBackedTextInputDelegateAdapter.m +++ b/packages/react-native/Libraries/Text/TextInput/RCTBackedTextInputDelegateAdapter.mm @@ -256,7 +256,7 @@ - (BOOL)textView:(__unused UITextView *)textView shouldChangeTextInRange:(NSRang - (void)textViewDidChange:(__unused UITextView *)textView { - if (_ignoreNextTextInputCall) { + if (_ignoreNextTextInputCall && [_lastStringStateWasUpdatedWith isEqual:_backedTextInputView.attributedText]) { _ignoreNextTextInputCall = NO; return; } diff --git a/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputShadowView.m b/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputShadowView.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputShadowView.m rename to packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputShadowView.mm diff --git a/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.m b/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm similarity index 94% rename from packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.m rename to packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm index 9da656c5b0fb95..233c76ed84092f 100644 --- a/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.m +++ b/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm @@ -231,12 +231,12 @@ - (void)setSelectionStart:(NSInteger)start selectionEnd:(NSInteger)end - (void)setTextContentType:(NSString *)type { -#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) static dispatch_once_t onceToken; static NSDictionary *contentTypeMap; dispatch_once(&onceToken, ^{ - contentTypeMap = @{ + NSMutableDictionary *mutableContentTypeMap = [NSMutableDictionary new]; + [mutableContentTypeMap addEntriesFromDictionary:@{ @"none" : @"", @"URL" : UITextContentTypeURL, @"addressCity" : UITextContentTypeAddressCity, @@ -263,21 +263,36 @@ - (void)setTextContentType:(NSString *)type @"telephoneNumber" : UITextContentTypeTelephoneNumber, @"username" : UITextContentTypeUsername, @"password" : UITextContentTypePassword, - }; - - NSDictionary *iOS12extras = - @{@"newPassword" : UITextContentTypeNewPassword, @"oneTimeCode" : UITextContentTypeOneTimeCode}; - - NSMutableDictionary *iOS12baseMap = [contentTypeMap mutableCopy]; - [iOS12baseMap addEntriesFromDictionary:iOS12extras]; + @"newPassword" : UITextContentTypeNewPassword, + @"oneTimeCode" : UITextContentTypeOneTimeCode, + }]; + +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 170000 /* __IPHONE_17_0 */ + if (@available(iOS 17.0, *)) { + [mutableContentTypeMap addEntriesFromDictionary:@{ + @"creditCardExpiration" : UITextContentTypeCreditCardExpiration, + @"creditCardExpirationMonth" : UITextContentTypeCreditCardExpirationMonth, + @"creditCardExpirationYear" : UITextContentTypeCreditCardExpirationYear, + @"creditCardSecurityCode" : UITextContentTypeCreditCardSecurityCode, + @"creditCardType" : UITextContentTypeCreditCardType, + @"creditCardName" : UITextContentTypeCreditCardName, + @"creditCardGivenName" : UITextContentTypeCreditCardGivenName, + @"creditCardMiddleName" : UITextContentTypeCreditCardMiddleName, + @"creditCardFamilyName" : UITextContentTypeCreditCardFamilyName, + @"birthdate" : UITextContentTypeBirthdate, + @"birthdateDay" : UITextContentTypeBirthdateDay, + @"birthdateMonth" : UITextContentTypeBirthdateMonth, + @"birthdateYear" : UITextContentTypeBirthdateYear, + }]; + } +#endif - contentTypeMap = [iOS12baseMap copy]; + contentTypeMap = mutableContentTypeMap; }); // Setting textContentType to an empty string will disable any // default behaviour, like the autofill bar for password inputs self.backedTextInputView.textContentType = contentTypeMap[type] ?: type; -#endif } - (void)setPasswordRules:(NSString *)descriptor diff --git a/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.m b/packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.m rename to packages/react-native/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm diff --git a/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryShadowView.m b/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryShadowView.mm similarity index 84% rename from packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryShadowView.m rename to packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryShadowView.mm index 0bb54d3dac8a6a..ebe514e037f486 100644 --- a/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryShadowView.m +++ b/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryShadowView.mm @@ -14,7 +14,7 @@ @implementation RCTInputAccessoryShadowView - (void)insertReactSubview:(RCTShadowView *)subview atIndex:(NSInteger)atIndex { [super insertReactSubview:subview atIndex:atIndex]; - subview.width = (YGValue){RCTScreenSize().width, YGUnitPoint}; + subview.width = (YGValue){static_cast(RCTScreenSize().width), YGUnitPoint}; } @end diff --git a/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryView.m b/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryView.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryView.m rename to packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryView.mm diff --git a/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryViewContent.m b/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryViewContent.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryViewContent.m rename to packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryViewContent.mm diff --git a/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryViewManager.m b/packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryViewManager.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryViewManager.m rename to packages/react-native/Libraries/Text/TextInput/RCTInputAccessoryViewManager.mm diff --git a/packages/react-native/Libraries/Text/TextInput/RCTTextSelection.m b/packages/react-native/Libraries/Text/TextInput/RCTTextSelection.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/RCTTextSelection.m rename to packages/react-native/Libraries/Text/TextInput/RCTTextSelection.mm diff --git a/packages/react-native/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputView.m b/packages/react-native/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputView.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputView.m rename to packages/react-native/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputView.mm diff --git a/packages/react-native/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.m b/packages/react-native/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.m rename to packages/react-native/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.mm diff --git a/packages/react-native/Libraries/Text/TextInput/Singleline/RCTUITextField.m b/packages/react-native/Libraries/Text/TextInput/Singleline/RCTUITextField.mm similarity index 100% rename from packages/react-native/Libraries/Text/TextInput/Singleline/RCTUITextField.m rename to packages/react-native/Libraries/Text/TextInput/Singleline/RCTUITextField.mm diff --git a/packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextShadowView.m b/packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextShadowView.mm similarity index 100% rename from packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextShadowView.m rename to packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextShadowView.mm diff --git a/packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextView.m b/packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextView.mm similarity index 100% rename from packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextView.m rename to packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextView.mm diff --git a/packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextViewManager.m b/packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextViewManager.mm similarity index 100% rename from packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextViewManager.m rename to packages/react-native/Libraries/Text/VirtualText/RCTVirtualTextViewManager.mm diff --git a/packages/react-native/Libraries/Text/__tests__/Text-test.js b/packages/react-native/Libraries/Text/__tests__/Text-test.js index af02de98211cbe..ffd7e8d688789f 100644 --- a/packages/react-native/Libraries/Text/__tests__/Text-test.js +++ b/packages/react-native/Libraries/Text/__tests__/Text-test.js @@ -169,6 +169,7 @@ describe('Text compat with web', () => { disabled={true} ellipsizeMode="tail" isHighlighted={false} + role="main" selectionColor={null} /> `); diff --git a/packages/react-native/Libraries/Types/CoreEventTypes.d.ts b/packages/react-native/Libraries/Types/CoreEventTypes.d.ts index 7aff083b07a2bf..9e9f18f84b4496 100644 --- a/packages/react-native/Libraries/Types/CoreEventTypes.d.ts +++ b/packages/react-native/Libraries/Types/CoreEventTypes.d.ts @@ -8,7 +8,6 @@ */ import type * as React from 'react'; -import {NodeHandle} from '../ReactNative/RendererProxy'; import {HostComponent} from '../../types/public/ReactNativeTypes'; export interface LayoutRectangle { @@ -42,7 +41,11 @@ export interface TextLayoutEventData extends TargetedEvent { // Similar to React.SyntheticEvent except for nativeEvent export interface NativeSyntheticEvent - extends React.BaseSyntheticEvent {} + extends React.BaseSyntheticEvent< + T, + React.ElementRef>, + React.ElementRef> + > {} export interface NativeTouchEvent { /** diff --git a/packages/react-native/Libraries/Utilities/AcessibilityMapping.js b/packages/react-native/Libraries/Utilities/AcessibilityMapping.js deleted file mode 100644 index 911f3381089fe9..00000000000000 --- a/packages/react-native/Libraries/Utilities/AcessibilityMapping.js +++ /dev/null @@ -1,154 +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 { - AccessibilityRole, - Role, -} from '../Components/View/ViewAccessibility'; - -// Map role values to AccessibilityRole values -export function getAccessibilityRoleFromRole(role: Role): ?AccessibilityRole { - switch (role) { - case 'alert': - return 'alert'; - case 'alertdialog': - return undefined; - case 'application': - return undefined; - case 'article': - return undefined; - case 'banner': - return undefined; - case 'button': - return 'button'; - case 'cell': - return undefined; - case 'checkbox': - return 'checkbox'; - case 'columnheader': - return undefined; - case 'combobox': - return 'combobox'; - case 'complementary': - return undefined; - case 'contentinfo': - return undefined; - case 'definition': - return undefined; - case 'dialog': - return undefined; - case 'directory': - return undefined; - case 'document': - return undefined; - case 'feed': - return undefined; - case 'figure': - return undefined; - case 'form': - return undefined; - case 'grid': - return 'grid'; - case 'group': - return undefined; - case 'heading': - return 'header'; - case 'img': - return 'image'; - case 'link': - return 'link'; - case 'list': - return 'list'; - case 'listitem': - return undefined; - case 'log': - return undefined; - case 'main': - return undefined; - case 'marquee': - return undefined; - case 'math': - return undefined; - case 'menu': - return 'menu'; - case 'menubar': - return 'menubar'; - case 'menuitem': - return 'menuitem'; - case 'meter': - return undefined; - case 'navigation': - return undefined; - case 'none': - return 'none'; - case 'note': - return undefined; - case 'option': - return undefined; - case 'presentation': - return 'none'; - case 'progressbar': - return 'progressbar'; - case 'radio': - return 'radio'; - case 'radiogroup': - return 'radiogroup'; - case 'region': - return undefined; - case 'row': - return undefined; - case 'rowgroup': - return undefined; - case 'rowheader': - return undefined; - case 'scrollbar': - return 'scrollbar'; - case 'searchbox': - return 'search'; - case 'separator': - return undefined; - case 'slider': - return 'adjustable'; - case 'spinbutton': - return 'spinbutton'; - case 'status': - return undefined; - case 'summary': - return 'summary'; - case 'switch': - return 'switch'; - case 'tab': - return 'tab'; - case 'table': - return undefined; - case 'tablist': - return 'tablist'; - case 'tabpanel': - return undefined; - case 'term': - return undefined; - case 'timer': - return 'timer'; - case 'toolbar': - return 'toolbar'; - case 'tooltip': - return undefined; - case 'tree': - return undefined; - case 'treegrid': - return undefined; - case 'treeitem': - return undefined; - } - - return undefined; -} diff --git a/packages/react-native/Libraries/Utilities/NativePlatformConstantsAndroid.js b/packages/react-native/Libraries/Utilities/NativePlatformConstantsAndroid.js index e1329e8c5896b6..b470f9b350ec7f 100644 --- a/packages/react-native/Libraries/Utilities/NativePlatformConstantsAndroid.js +++ b/packages/react-native/Libraries/Utilities/NativePlatformConstantsAndroid.js @@ -15,6 +15,7 @@ import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { +getConstants: () => {| isTesting: boolean, + isDisableAnimations?: boolean, reactNativeVersion: {| major: number, minor: number, diff --git a/packages/react-native/Libraries/Utilities/NativePlatformConstantsIOS.js b/packages/react-native/Libraries/Utilities/NativePlatformConstantsIOS.js index cf60d5ec984877..c1defa9981f0c1 100644 --- a/packages/react-native/Libraries/Utilities/NativePlatformConstantsIOS.js +++ b/packages/react-native/Libraries/Utilities/NativePlatformConstantsIOS.js @@ -15,6 +15,7 @@ import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { +getConstants: () => {| isTesting: boolean, + isDisableAnimations?: boolean, reactNativeVersion: {| major: number, minor: number, diff --git a/packages/react-native/Libraries/Utilities/Platform.android.js b/packages/react-native/Libraries/Utilities/Platform.android.js index 29234be81a7baa..3d4b9e40f545bb 100644 --- a/packages/react-native/Libraries/Utilities/Platform.android.js +++ b/packages/react-native/Libraries/Utilities/Platform.android.js @@ -28,6 +28,7 @@ const Platform = { // $FlowFixMe[unsafe-getters-setters] get constants(): {| isTesting: boolean, + isDisableAnimations?: boolean, reactNativeVersion: {| major: number, minor: number, @@ -61,6 +62,11 @@ const Platform = { return false; }, // $FlowFixMe[unsafe-getters-setters] + get isDisableAnimations(): boolean { + // $FlowFixMe[object-this-reference] + return this.constants.isDisableAnimations ?? this.isTesting; + }, + // $FlowFixMe[unsafe-getters-setters] get isTV(): boolean { // $FlowFixMe[object-this-reference] return this.constants.uiMode === 'tv'; diff --git a/packages/react-native/Libraries/Utilities/Platform.d.ts b/packages/react-native/Libraries/Utilities/Platform.d.ts index 465a82b35c6df1..1ff836839110be 100644 --- a/packages/react-native/Libraries/Utilities/Platform.d.ts +++ b/packages/react-native/Libraries/Utilities/Platform.d.ts @@ -19,6 +19,7 @@ export type PlatformOSType = | 'native'; type PlatformConstants = { isTesting: boolean; + isDisableAnimations?: boolean | undefined; reactNativeVersion: { major: number; minor: number; diff --git a/packages/react-native/Libraries/Utilities/Platform.ios.js b/packages/react-native/Libraries/Utilities/Platform.ios.js index 4adf4201c52b3e..4d0217a80945f4 100644 --- a/packages/react-native/Libraries/Utilities/Platform.ios.js +++ b/packages/react-native/Libraries/Utilities/Platform.ios.js @@ -30,6 +30,7 @@ const Platform = { forceTouchAvailable: boolean, interfaceIdiom: string, isTesting: boolean, + isDisableAnimations?: boolean, osVersion: string, reactNativeVersion: {| major: number, @@ -65,6 +66,11 @@ const Platform = { } return false; }, + // $FlowFixMe[unsafe-getters-setters] + get isDisableAnimations(): boolean { + // $FlowFixMe[object-this-reference] + return this.constants.isDisableAnimations ?? this.isTesting; + }, select: (spec: PlatformSelectSpec): T => // $FlowFixMe[incompatible-return] 'ios' in spec ? spec.ios : 'native' in spec ? spec.native : spec.default, diff --git a/packages/react-native/Libraries/Utilities/ReactNativeTestTools.js b/packages/react-native/Libraries/Utilities/ReactNativeTestTools.js index 8671575054137c..f36e735eb2af9f 100644 --- a/packages/react-native/Libraries/Utilities/ReactNativeTestTools.js +++ b/packages/react-native/Libraries/Utilities/ReactNativeTestTools.js @@ -28,7 +28,6 @@ const ReactTestRenderer = require('react-test-renderer'); const shallowRenderer = new ShallowRenderer(); export type ReactTestInstance = $PropertyType; export type Predicate = (node: ReactTestInstance) => boolean; -type $ReturnType = $Call<((...A) => Ret) => Ret, Fn>; /* $FlowFixMe[value-as-type] (>=0.125.1 site=react_native_fb) This comment * suppresses an error found when Flow v0.125.1 was deployed. To see the error, * delete this comment and run Flow. */ @@ -36,7 +35,7 @@ export type ReactTestRendererJSON = /* $FlowFixMe[prop-missing] (>=0.125.1 site=react_native_fb) This comment * suppresses an error found when Flow v0.125.1 was deployed. To see the error, * delete this comment and run Flow. */ - $ReturnType; + ReturnType; function byClickable(): Predicate { return withMessage( diff --git a/packages/react-native/Libraries/Utilities/createPerformanceLogger.js b/packages/react-native/Libraries/Utilities/createPerformanceLogger.js index 0c09c750c7f094..ef701198b8d3d4 100644 --- a/packages/react-native/Libraries/Utilities/createPerformanceLogger.js +++ b/packages/react-native/Libraries/Utilities/createPerformanceLogger.js @@ -27,7 +27,7 @@ const PRINT_TO_CONSOLE: false = false; // Type as false to prevent accidentally const WEB_PERFORMANCE_PREFIX = 'global_perf_'; export const getCurrentTimestamp: () => number = - global.nativeQPLTimestamp ?? global.performance.now.bind(global.performance); + global.nativeQPLTimestamp ?? (() => global.performance.now()); class PerformanceLogger implements IPerformanceLogger { _timespans: {[key: string]: ?Timespan} = {}; @@ -41,6 +41,34 @@ class PerformanceLogger implements IPerformanceLogger { this._isLoggingForWebPerformance = isLoggingForWebPerformance === true; } + // NOTE: The Performance.mark/measure calls are wrapped here to ensure that + // we are safe from the cases when the global 'peformance' object is still not yet defined. + // It is only necessary in this file because of potential race conditions in the initialization + // order between 'createPerformanceLogger' and 'setUpPerformance'. + // + // In most of the other cases this kind of check for `performance` being defined + // wouldn't be necessary. + _performanceMark(key: string, startTime: number) { + if (this._isLoggingForWebPerformance) { + global.performance?.mark?.(key, { + startTime, + }); + } + } + + _performanceMeasure( + key: string, + start: number | string, + end: number | string, + ) { + if (this._isLoggingForWebPerformance) { + global.performance?.measure?.(key, { + start, + end, + }); + } + } + addTimespan( key: string, startTime: number, @@ -72,12 +100,11 @@ class PerformanceLogger implements IPerformanceLogger { endExtras, }; - if (this._isLoggingForWebPerformance) { - performance.measure(`${WEB_PERFORMANCE_PREFIX}_${key}`, { - start: startTime, - end: endTime, - }); - } + this._performanceMeasure( + `${WEB_PERFORMANCE_PREFIX}_${key}`, + startTime, + endTime, + ); } append(performanceLogger: IPerformanceLogger) { @@ -193,11 +220,7 @@ class PerformanceLogger implements IPerformanceLogger { this._pointExtras[key] = extras; } - if (this._isLoggingForWebPerformance) { - performance.mark(`${WEB_PERFORMANCE_PREFIX}_${key}`, { - startTime: timestamp, - }); - } + this._performanceMark(`${WEB_PERFORMANCE_PREFIX}_${key}`, timestamp); } removeExtra(key: string): ?ExtraValue { @@ -260,11 +283,10 @@ class PerformanceLogger implements IPerformanceLogger { infoLog('PerformanceLogger.js', 'start: ' + key); } - if (this._isLoggingForWebPerformance) { - performance.mark(`${WEB_PERFORMANCE_PREFIX}_timespan_start_${key}`, { - startTime: timestamp, - }); - } + this._performanceMark( + `${WEB_PERFORMANCE_PREFIX}_timespan_start_${key}`, + timestamp, + ); } stopTimespan( @@ -311,12 +333,11 @@ class PerformanceLogger implements IPerformanceLogger { delete _cookies[key]; } - if (this._isLoggingForWebPerformance) { - performance.measure(`${WEB_PERFORMANCE_PREFIX}_${key}`, { - start: `${WEB_PERFORMANCE_PREFIX}_timespan_start_${key}`, - end: timestamp, - }); - } + this._performanceMeasure( + `${WEB_PERFORMANCE_PREFIX}_${key}`, + `${WEB_PERFORMANCE_PREFIX}_timespan_start_${key}`, + timestamp, + ); } } diff --git a/packages/react-native/Libraries/Vibration/React-RCTVibration.podspec b/packages/react-native/Libraries/Vibration/React-RCTVibration.podspec index 2eb4c33882d78e..616611ea137591 100644 --- a/packages/react-native/Libraries/Vibration/React-RCTVibration.podspec +++ b/packages/react-native/Libraries/Vibration/React-RCTVibration.podspec @@ -28,7 +28,9 @@ header_search_paths = [ if ENV["USE_FRAMEWORKS"] header_search_paths = header_search_paths.concat([ "\"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\"", - "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"" + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers/build/generated/ios\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers\"" ]) end diff --git a/packages/react-native/Libraries/WebPerformance/NativePerformance.cpp b/packages/react-native/Libraries/WebPerformance/NativePerformance.cpp index e9ccdf332b6557..f2ec308fda0267 100644 --- a/packages/react-native/Libraries/WebPerformance/NativePerformance.cpp +++ b/packages/react-native/Libraries/WebPerformance/NativePerformance.cpp @@ -60,12 +60,12 @@ ReactNativeStartupTiming NativePerformance::getReactNativeStartupTiming( ReactMarker::StartupLogger &startupLogger = ReactMarker::StartupLogger::getInstance(); - result.startTime = startupLogger.getAppStartTime(); + result.startTime = startupLogger.getAppStartupStartTime(); result.executeJavaScriptBundleEntryPointStart = startupLogger.getRunJSBundleStartTime(); result.executeJavaScriptBundleEntryPointEnd = startupLogger.getRunJSBundleEndTime(); - result.endTime = startupLogger.getRunJSBundleEndTime(); + result.endTime = startupLogger.getAppStartupEndTime(); return result; } diff --git a/packages/react-native/Libraries/promiseRejectionTrackingOptions.js b/packages/react-native/Libraries/promiseRejectionTrackingOptions.js index a57f3666899d62..b951f612ecf6c7 100644 --- a/packages/react-native/Libraries/promiseRejectionTrackingOptions.js +++ b/packages/react-native/Libraries/promiseRejectionTrackingOptions.js @@ -10,9 +10,7 @@ import typeof {enable} from 'promise/setimmediate/rejection-tracking'; -type ExtractOptionsType =

(((options?: ?P) => void)) => P; - -let rejectionTrackingOptions: $Call = { +let rejectionTrackingOptions: $NonMaybeType[0]> = { allRejections: true, onUnhandled: (id, rejection = {}) => { let message: string; diff --git a/packages/react-native/Libraries/vendor/emitter/EventEmitter.js b/packages/react-native/Libraries/vendor/emitter/EventEmitter.js index 6bd20257222d73..904b77a3226756 100644 --- a/packages/react-native/Libraries/vendor/emitter/EventEmitter.js +++ b/packages/react-native/Libraries/vendor/emitter/EventEmitter.js @@ -15,13 +15,13 @@ export interface EventSubscription { export interface IEventEmitter { addListener>( eventType: TEvent, - listener: (...args: $ElementType) => mixed, + listener: (...args: TEventToArgsMap[TEvent]) => mixed, context?: mixed, ): EventSubscription; emit>( eventType: TEvent, - ...args: $ElementType + ...args: TEventToArgsMap[TEvent] ): void; removeAllListeners>(eventType?: ?TEvent): void; @@ -71,7 +71,7 @@ export default class EventEmitter */ addListener>( eventType: TEvent, - listener: (...args: $ElementType) => mixed, + listener: (...args: TEventToArgsMap[TEvent]) => mixed, context: mixed, ): EventSubscription { if (typeof listener !== 'function') { @@ -79,11 +79,12 @@ export default class EventEmitter 'EventEmitter.addListener(...): 2nd argument must be a function.', ); } - const registrations = allocate<_, _, TEventToArgsMap[TEvent]>( - this._registry, - eventType, - ); - const registration: Registration<$ElementType> = { + const registrations = allocate< + TEventToArgsMap, + TEvent, + TEventToArgsMap[TEvent], + >(this._registry, eventType); + const registration: Registration = { context, listener, remove(): void { @@ -103,11 +104,10 @@ export default class EventEmitter */ emit>( eventType: TEvent, - ...args: $ElementType + ...args: TEventToArgsMap[TEvent] ): void { - const registrations: ?Set< - Registration<$ElementType>, - > = this._registry[eventType]; + const registrations: ?Set> = + this._registry[eventType]; if (registrations != null) { for (const registration of [...registrations]) { registration.listener.apply(registration.context, args); @@ -140,7 +140,7 @@ export default class EventEmitter function allocate< TEventToArgsMap: {...}, TEvent: $Keys, - TEventArgs: $ElementType, + TEventArgs: TEventToArgsMap[TEvent], >( registry: Registry, eventType: TEvent, diff --git a/packages/react-native/React-Core.podspec b/packages/react-native/React-Core.podspec index 2fad76d2d9726a..c46b5afc4f15fc 100644 --- a/packages/react-native/React-Core.podspec +++ b/packages/react-native/React-Core.podspec @@ -91,7 +91,7 @@ Pod::Spec.new do |s| "React/Fabric/**/*", "React/FBReactNativeSpec/**/*", "React/Tests/**/*", - "React/Inspector/**/*" + "React/Inspector/**/*", ] # If we are using Hermes (the default is use hermes, so USE_HERMES can be nil), we don't have jsc installed # So we have to exclude the JSCExecutorFactory @@ -99,7 +99,7 @@ Pod::Spec.new do |s| exclude_files = exclude_files.append("React/CxxBridge/JSCExecutorFactory.{h,mm}") end ss.exclude_files = exclude_files - ss.private_header_files = "React/Cxx*/*.h" + ss.private_header_files = "React/CxxLogUtils/*.h" end s.subspec "DevSupport" do |ss| diff --git a/packages/react-native/React/Base/RCTBridge.h b/packages/react-native/React/Base/RCTBridge.h index 92545c4317ebe5..9ab945b67fcd17 100644 --- a/packages/react-native/React/Base/RCTBridge.h +++ b/packages/react-native/React/Base/RCTBridge.h @@ -9,6 +9,7 @@ #import #import +#import #import #import #import @@ -64,6 +65,15 @@ RCT_EXTERN void RCTEnableTurboModuleInterop(BOOL enabled); RCT_EXTERN BOOL RCTTurboModuleInteropBridgeProxyEnabled(void); RCT_EXTERN void RCTEnableTurboModuleInteropBridgeProxy(BOOL enabled); +typedef enum { + kRCTBridgeProxyLoggingLevelNone, + kRCTBridgeProxyLoggingLevelWarning, + kRCTBridgeProxyLoggingLevelError, +} RCTBridgeProxyLoggingLevel; + +RCT_EXTERN RCTBridgeProxyLoggingLevel RCTTurboModuleInteropBridgeProxyLogLevel(void); +RCT_EXTERN void RCTSetTurboModuleInteropBridgeProxyLogLevel(RCTBridgeProxyLoggingLevel logLevel); + // Route all TurboModules through TurboModule interop RCT_EXTERN BOOL RCTTurboModuleInteropForAllTurboModulesEnabled(void); RCT_EXTERN void RCTEnableTurboModuleInteropForAllTurboModules(BOOL enabled); @@ -149,7 +159,7 @@ RCT_EXTERN void RCTSetTurboModuleCleanupMode(RCTTurboModuleCleanupMode mode); * It allows the bridge to attach properties to ObjC modules that give those modules * access to Bridge APIs. */ -- (void)attachBridgeAPIsToObjCModule:(id)module; +- (RCTBridgeModuleDecorator *)bridgeModuleDecorator; /** * Convenience method for retrieving all modules conforming to a given protocol. diff --git a/packages/react-native/React/Base/RCTBridge.m b/packages/react-native/React/Base/RCTBridge.mm similarity index 96% rename from packages/react-native/React/Base/RCTBridge.m rename to packages/react-native/React/Base/RCTBridge.mm index b8300f27f073b8..76c3e81378c65d 100644 --- a/packages/react-native/React/Base/RCTBridge.m +++ b/packages/react-native/React/Base/RCTBridge.mm @@ -141,6 +141,17 @@ void RCTEnableTurboModuleInteropBridgeProxy(BOOL enabled) turboModuleInteropBridgeProxyEnabled = enabled; } +static RCTBridgeProxyLoggingLevel bridgeProxyLoggingLevel = kRCTBridgeProxyLoggingLevelNone; +RCTBridgeProxyLoggingLevel RCTTurboModuleInteropBridgeProxyLogLevel(void) +{ + return bridgeProxyLoggingLevel; +} + +void RCTSetTurboModuleInteropBridgeProxyLogLevel(RCTBridgeProxyLoggingLevel logLevel) +{ + bridgeProxyLoggingLevel = logLevel; +} + static BOOL useTurboModuleInteropForAllTurboModules = NO; BOOL RCTTurboModuleInteropForAllTurboModulesEnabled(void) { @@ -226,9 +237,9 @@ - (void)setRCTTurboModuleRegistry:(id)turboModuleRegistr [self.batchedBridge setRCTTurboModuleRegistry:turboModuleRegistry]; } -- (void)attachBridgeAPIsToObjCModule:(id)module +- (RCTBridgeModuleDecorator *)bridgeModuleDecorator { - [self.batchedBridge attachBridgeAPIsToObjCModule:module]; + return [self.batchedBridge bridgeModuleDecorator]; } - (void)didReceiveReloadCommand diff --git a/packages/react-native/React/Base/RCTBridgeProxy.h b/packages/react-native/React/Base/RCTBridgeProxy.h index b1c70287b1cc35..f8639c418e0d25 100644 --- a/packages/react-native/React/Base/RCTBridgeProxy.h +++ b/packages/react-native/React/Base/RCTBridgeProxy.h @@ -19,7 +19,8 @@ moduleRegistry:(RCTModuleRegistry *)moduleRegistry bundleManager:(RCTBundleManager *)bundleManager callableJSModules:(RCTCallableJSModules *)callableJSModules - dispatchToJSThread:(void (^)(dispatch_block_t))dispatchToJSThread NS_DESIGNATED_INITIALIZER; + dispatchToJSThread:(void (^)(dispatch_block_t))dispatchToJSThread + registerSegmentWithId:(void (^)(NSNumber *, NSString *))registerSegmentWithId NS_DESIGNATED_INITIALIZER; - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel; - (void)forwardInvocation:(NSInvocation *)invocation; diff --git a/packages/react-native/React/Base/RCTBridgeProxy.mm b/packages/react-native/React/Base/RCTBridgeProxy.mm index c91a0fe9667400..1c3a1a065c3eff 100644 --- a/packages/react-native/React/Base/RCTBridgeProxy.mm +++ b/packages/react-native/React/Base/RCTBridgeProxy.mm @@ -27,6 +27,7 @@ @implementation RCTBridgeProxy { RCTBundleManager *_bundleManager; RCTCallableJSModules *_callableJSModules; void (^_dispatchToJSThread)(dispatch_block_t); + void (^_registerSegmentWithId)(NSNumber *, NSString *); } - (instancetype)initWithViewRegistry:(RCTViewRegistry *)viewRegistry @@ -34,6 +35,7 @@ - (instancetype)initWithViewRegistry:(RCTViewRegistry *)viewRegistry bundleManager:(RCTBundleManager *)bundleManager callableJSModules:(RCTCallableJSModules *)callableJSModules dispatchToJSThread:(void (^)(dispatch_block_t))dispatchToJSThread + registerSegmentWithId:(void (^)(NSNumber *, NSString *))registerSegmentWithId { self = [super self]; if (self) { @@ -42,6 +44,7 @@ - (instancetype)initWithViewRegistry:(RCTViewRegistry *)viewRegistry self->_bundleManager = bundleManager; self->_callableJSModules = callableJSModules; self->_dispatchToJSThread = dispatchToJSThread; + self->_registerSegmentWithId = registerSegmentWithId; } return self; } @@ -159,7 +162,7 @@ - (void)enqueueJSCall:(NSString *)module - (void)registerSegmentWithId:(NSUInteger)segmentId path:(NSString *)path { - [self logError:@"Please migrate to RCTHost registerSegmentWithId. Nooping" cmd:_cmd]; + self->_registerSegmentWithId(@(segmentId), path); } - (id)delegate @@ -368,12 +371,17 @@ - (void)forwardInvocation:(NSInvocation *)invocation */ - (void)logWarning:(NSString *)message cmd:(SEL)cmd { - RCTLogWarn(@"RCTBridgeProxy: Calling [bridge %@]. %@", NSStringFromSelector(cmd), message); + if (RCTTurboModuleInteropBridgeProxyLogLevel() == kRCTBridgeProxyLoggingLevelWarning) { + RCTLogWarn(@"RCTBridgeProxy: Calling [bridge %@]. %@", NSStringFromSelector(cmd), message); + } } - (void)logError:(NSString *)message cmd:(SEL)cmd { - RCTLogError(@"RCTBridgeProxy: Calling [bridge %@]. %@", NSStringFromSelector(cmd), message); + if (RCTTurboModuleInteropBridgeProxyLogLevel() == kRCTBridgeProxyLoggingLevelWarning || + RCTTurboModuleInteropBridgeProxyLogLevel() == kRCTBridgeProxyLoggingLevelError) { + RCTLogError(@"RCTBridgeProxy: Calling [bridge %@]. %@", NSStringFromSelector(cmd), message); + } } @end @@ -434,14 +442,19 @@ - (void)forwardInvocation:(NSInvocation *)invocation */ - (void)logWarning:(NSString *)message cmd:(SEL)cmd { - RCTLogWarn( - @"RCTBridgeProxy (RCTUIManagerProxy): Calling [bridge.uiManager %@]. %@", NSStringFromSelector(cmd), message); + if (RCTTurboModuleInteropBridgeProxyLogLevel() == kRCTBridgeProxyLoggingLevelWarning) { + RCTLogWarn( + @"RCTBridgeProxy (RCTUIManagerProxy): Calling [bridge.uiManager %@]. %@", NSStringFromSelector(cmd), message); + } } - (void)logError:(NSString *)message cmd:(SEL)cmd { - RCTLogError( - @"RCTBridgeProxy (RCTUIManagerProxy): Calling [bridge.uiManager %@]. %@", NSStringFromSelector(cmd), message); + if (RCTTurboModuleInteropBridgeProxyLogLevel() == kRCTBridgeProxyLoggingLevelWarning || + RCTTurboModuleInteropBridgeProxyLogLevel() == kRCTBridgeProxyLoggingLevelError) { + RCTLogError( + @"RCTBridgeProxy (RCTUIManagerProxy): Calling [bridge.uiManager %@]. %@", NSStringFromSelector(cmd), message); + } } @end diff --git a/packages/react-native/React/Base/RCTBundleURLProvider.h b/packages/react-native/React/Base/RCTBundleURLProvider.h index cbf8132b1da907..7072e05dd8397b 100644 --- a/packages/react-native/React/Base/RCTBundleURLProvider.h +++ b/packages/react-native/React/Base/RCTBundleURLProvider.h @@ -101,6 +101,7 @@ RCT_EXTERN void RCTBundleURLProviderAllowPackagerServerAccess(BOOL allowed); @property (nonatomic, assign) BOOL enableMinification; @property (nonatomic, assign) BOOL enableDev; +@property (nonatomic, assign) BOOL inlineSourceMap; /** * The scheme/protocol used of the packager, the default is the http protocol @@ -125,13 +126,32 @@ RCT_EXTERN void RCTBundleURLProviderAllowPackagerServerAccess(BOOL allowed); + (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot packagerHost:(NSString *)packagerHost enableDev:(BOOL)enableDev - enableMinification:(BOOL)enableMinification; + enableMinification:(BOOL)enableMinification + __deprecated_msg( + "Use `jsBundleURLForBundleRoot:packagerHost:enableDev:enableMinification:inlineSourceMap:` instead"); + ++ (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot + packagerHost:(NSString *)packagerHost + packagerScheme:(NSString *)scheme + enableDev:(BOOL)enableDev + enableMinification:(BOOL)enableMinification + modulesOnly:(BOOL)modulesOnly + runModule:(BOOL)runModule + __deprecated_msg( + "Use jsBundleURLForBundleRoot:packagerHost:enableDev:enableMinification:inlineSourceMap:modulesOnly:runModule:` instead"); + ++ (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot + packagerHost:(NSString *)packagerHost + enableDev:(BOOL)enableDev + enableMinification:(BOOL)enableMinification + inlineSourceMap:(BOOL)inlineSourceMap; + (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot packagerHost:(NSString *)packagerHost packagerScheme:(NSString *)scheme enableDev:(BOOL)enableDev enableMinification:(BOOL)enableMinification + inlineSourceMap:(BOOL)inlineSourceMap modulesOnly:(BOOL)modulesOnly runModule:(BOOL)runModule; /** @@ -142,6 +162,17 @@ RCT_EXTERN void RCTBundleURLProviderAllowPackagerServerAccess(BOOL allowed); + (NSURL *)resourceURLForResourcePath:(NSString *)path packagerHost:(NSString *)packagerHost scheme:(NSString *)scheme - query:(NSString *)query; + query:(NSString *)query + __deprecated_msg("Use version with queryItems parameter instead"); + +/** + * Given a hostname for the packager and a resource path (including "/"), return the URL to the resource. + * In general, please use the instance method to decide if the packager is running and fallback to the pre-packaged + * resource if it is not: -resourceURLForResourceRoot:resourceName:resourceExtension:offlineBundle: + */ ++ (NSURL *)resourceURLForResourcePath:(NSString *)path + packagerHost:(NSString *)packagerHost + scheme:(NSString *)scheme + queryItems:(NSArray *)queryItems; @end diff --git a/packages/react-native/React/Base/RCTBundleURLProvider.mm b/packages/react-native/React/Base/RCTBundleURLProvider.mm index f1dc797815c87d..7b5dd2b3641feb 100644 --- a/packages/react-native/React/Base/RCTBundleURLProvider.mm +++ b/packages/react-native/React/Base/RCTBundleURLProvider.mm @@ -22,10 +22,12 @@ void RCTBundleURLProviderAllowPackagerServerAccess(BOOL allowed) kRCTAllowPackagerAccess = allowed; } #endif +static NSString *const kRCTPlatformName = @"ios"; static NSString *const kRCTPackagerSchemeKey = @"RCT_packager_scheme"; static NSString *const kRCTJsLocationKey = @"RCT_jsLocation"; static NSString *const kRCTEnableDevKey = @"RCT_enableDev"; static NSString *const kRCTEnableMinificationKey = @"RCT_enableMinification"; +static NSString *const kRCTInlineSourceMapKey = @"RCT_inlineSourceMap"; @implementation RCTBundleURLProvider @@ -187,6 +189,7 @@ - (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot fallbackURLProvider:( packagerScheme:[self packagerScheme] enableDev:[self enableDev] enableMinification:[self enableMinification] + inlineSourceMap:[self inlineSourceMap] modulesOnly:NO runModule:YES]; } @@ -199,6 +202,7 @@ - (NSURL *)jsBundleURLForSplitBundleRoot:(NSString *)bundleRoot packagerScheme:[self packagerScheme] enableDev:[self enableDev] enableMinification:[self enableMinification] + inlineSourceMap:[self inlineSourceMap] modulesOnly:YES runModule:NO]; } @@ -238,13 +242,29 @@ - (NSURL *)resourceURLForResourceRoot:(NSString *)root return [[self class] resourceURLForResourcePath:path packagerHost:packagerServerHostPort scheme:packagerServerScheme - query:nil]; + queryItems:nil]; } + (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot packagerHost:(NSString *)packagerHost enableDev:(BOOL)enableDev enableMinification:(BOOL)enableMinification +{ + return [self jsBundleURLForBundleRoot:bundleRoot + packagerHost:packagerHost + packagerScheme:nil + enableDev:enableDev + enableMinification:enableMinification + inlineSourceMap:NO + modulesOnly:NO + runModule:YES]; +} + ++ (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot + packagerHost:(NSString *)packagerHost + enableDev:(BOOL)enableDev + enableMinification:(BOOL)enableMinification + inlineSourceMap:(BOOL)inlineSourceMap { return [self jsBundleURLForBundleRoot:bundleRoot @@ -252,6 +272,7 @@ + (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot packagerScheme:nil enableDev:enableDev enableMinification:enableMinification + inlineSourceMap:inlineSourceMap modulesOnly:NO runModule:YES]; } @@ -263,22 +284,43 @@ + (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot enableMinification:(BOOL)enableMinification modulesOnly:(BOOL)modulesOnly runModule:(BOOL)runModule +{ + return [self jsBundleURLForBundleRoot:bundleRoot + packagerHost:packagerHost + packagerScheme:nil + enableDev:enableDev + enableMinification:enableMinification + inlineSourceMap:NO + modulesOnly:modulesOnly + runModule:runModule]; +} + ++ (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot + packagerHost:(NSString *)packagerHost + packagerScheme:(NSString *)scheme + enableDev:(BOOL)enableDev + enableMinification:(BOOL)enableMinification + inlineSourceMap:(BOOL)inlineSourceMap + modulesOnly:(BOOL)modulesOnly + runModule:(BOOL)runModule { NSString *path = [NSString stringWithFormat:@"/%@.bundle", bundleRoot]; BOOL lazy = enableDev; - // When we support only iOS 8 and above, use queryItems for a better API. - NSString *query = [NSString stringWithFormat:@"platform=ios&dev=%@&lazy=%@&minify=%@&modulesOnly=%@&runModule=%@", - enableDev ? @"true" : @"false", - lazy ? @"true" : @"false", - enableMinification ? @"true" : @"false", - modulesOnly ? @"true" : @"false", - runModule ? @"true" : @"false"]; + NSArray *queryItems = @[ + [[NSURLQueryItem alloc] initWithName:@"platform" value:kRCTPlatformName], + [[NSURLQueryItem alloc] initWithName:@"dev" value:enableDev ? @"true" : @"false"], + [[NSURLQueryItem alloc] initWithName:@"lazy" value:lazy ? @"true" : @"false"], + [[NSURLQueryItem alloc] initWithName:@"minify" value:enableMinification ? @"true" : @"false"], + [[NSURLQueryItem alloc] initWithName:@"inlineSourceMap" value:inlineSourceMap ? @"true" : @"false"], + [[NSURLQueryItem alloc] initWithName:@"modulesOnly" value:modulesOnly ? @"true" : @"false"], + [[NSURLQueryItem alloc] initWithName:@"runModule" value:runModule ? @"true" : @"false"], + ]; NSString *bundleID = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleIdentifierKey]; if (bundleID) { - query = [NSString stringWithFormat:@"%@&app=%@", query, bundleID]; + queryItems = [queryItems arrayByAddingObject:[[NSURLQueryItem alloc] initWithName:@"app" value:bundleID]]; } - return [[self class] resourceURLForResourcePath:path packagerHost:packagerHost scheme:scheme query:query]; + return [[self class] resourceURLForResourcePath:path packagerHost:packagerHost scheme:scheme queryItems:queryItems]; } + (NSURL *)resourceURLForResourcePath:(NSString *)path @@ -295,6 +337,20 @@ + (NSURL *)resourceURLForResourcePath:(NSString *)path return components.URL; } ++ (NSURL *)resourceURLForResourcePath:(NSString *)path + packagerHost:(NSString *)packagerHost + scheme:(NSString *)scheme + queryItems:(NSArray *)queryItems +{ + NSURLComponents *components = [NSURLComponents componentsWithURL:serverRootWithHostPort(packagerHost, scheme) + resolvingAgainstBaseURL:NO]; + components.path = path; + if (queryItems != nil) { + components.queryItems = queryItems; + } + return components.URL; +} + - (void)updateValue:(id)object forKey:(NSString *)key { [[NSUserDefaults standardUserDefaults] setObject:object forKey:key]; @@ -312,6 +368,11 @@ - (BOOL)enableMinification return [[NSUserDefaults standardUserDefaults] boolForKey:kRCTEnableMinificationKey]; } +- (BOOL)inlineSourceMap +{ + return [[NSUserDefaults standardUserDefaults] boolForKey:kRCTInlineSourceMapKey]; +} + - (NSString *)jsLocation { return [[NSUserDefaults standardUserDefaults] stringForKey:kRCTJsLocationKey]; @@ -341,6 +402,11 @@ - (void)setEnableMinification:(BOOL)enableMinification [self updateValue:@(enableMinification) forKey:kRCTEnableMinificationKey]; } +- (void)setInlineSourceMap:(BOOL)inlineSourceMap +{ + [self updateValue:@(inlineSourceMap) forKey:kRCTInlineSourceMapKey]; +} + - (void)setPackagerScheme:(NSString *)packagerScheme { [self updateValue:packagerScheme forKey:kRCTPackagerSchemeKey]; diff --git a/packages/react-native/React/Base/RCTConstants.h b/packages/react-native/React/Base/RCTConstants.h index b1c244ac93c228..5cae2004f67bd9 100644 --- a/packages/react-native/React/Base/RCTConstants.h +++ b/packages/react-native/React/Base/RCTConstants.h @@ -39,25 +39,6 @@ RCT_EXTERN NSString *const RCTJavaScriptDidFailToLoadNotification; */ RCT_EXTERN NSString *const RCTDidInitializeModuleNotification; -/** - * This notification fires each time a module is setup after it is initialized. The - * `RCTDidSetupModuleNotificationModuleNameKey` key will contain a reference to the module name and - * `RCTDidSetupModuleNotificationSetupTimeKey` will contain the setup time in ms. - */ -RCT_EXTERN NSString *const RCTDidSetupModuleNotification; - -/** - * Key for the module name (NSString) in the - * RCTDidSetupModuleNotification userInfo dictionary. - */ -RCT_EXTERN NSString *const RCTDidSetupModuleNotificationModuleNameKey; - -/** - * Key for the setup time (NSNumber) in the - * RCTDidSetupModuleNotification userInfo dictionary. - */ -RCT_EXTERN NSString *const RCTDidSetupModuleNotificationSetupTimeKey; - /* * W3C Pointer Events */ @@ -73,7 +54,7 @@ RCT_EXTERN void RCTSetValidateCanSendEventInRCTEventEmitter(BOOL value); /* * Memory Pressure Unloading Level */ -RCT_EXTERN BOOL RCTGetMemoryPressureUnloadLevel(void); +RCT_EXTERN int RCTGetMemoryPressureUnloadLevel(void); RCT_EXTERN void RCTSetMemoryPressureUnloadLevel(int value); /* diff --git a/packages/react-native/React/Base/RCTConstants.m b/packages/react-native/React/Base/RCTConstants.m index 81b8741d583fe8..a06dff9b3b1fa3 100644 --- a/packages/react-native/React/Base/RCTConstants.m +++ b/packages/react-native/React/Base/RCTConstants.m @@ -16,9 +16,6 @@ NSString *const RCTJavaScriptWillStartLoadingNotification = @"RCTJavaScriptWillStartLoadingNotification"; NSString *const RCTDidInitializeModuleNotification = @"RCTDidInitializeModuleNotification"; -NSString *const RCTDidSetupModuleNotification = @"RCTDidSetupModuleNotification"; -NSString *const RCTDidSetupModuleNotificationModuleNameKey = @"moduleName"; -NSString *const RCTDidSetupModuleNotificationSetupTimeKey = @"setupTime"; /* * W3C Pointer Events @@ -56,7 +53,7 @@ void RCTSetValidateCanSendEventInRCTEventEmitter(BOOL value) */ static int RCTMemoryPressureUnloadLevel = 15; -BOOL RCTGetMemoryPressureUnloadLevel(void) +int RCTGetMemoryPressureUnloadLevel(void) { return RCTMemoryPressureUnloadLevel; } diff --git a/packages/react-native/React/Base/RCTModuleData.h b/packages/react-native/React/Base/RCTModuleData.h index a1c5b3a62d747d..6e3c0cbf5d7191 100644 --- a/packages/react-native/React/Base/RCTModuleData.h +++ b/packages/react-native/React/Base/RCTModuleData.h @@ -8,7 +8,6 @@ #import #import -#import "RCTDefines.h" @protocol RCTBridgeMethod; @protocol RCTBridgeModule; @@ -112,6 +111,3 @@ typedef id (^RCTBridgeModuleProvider)(void); @property (nonatomic, assign, readonly) BOOL implementsPartialBatchDidFlush; @end - -RCT_EXTERN void RCTSetIsMainQueueExecutionOfConstantsToExportDisabled(BOOL val); -RCT_EXTERN BOOL RCTIsMainQueueExecutionOfConstantsToExportDisabled(void); diff --git a/packages/react-native/React/Base/RCTModuleData.mm b/packages/react-native/React/Base/RCTModuleData.mm index 3e7fd3e7f76bc8..dbbc6daa9aa30c 100644 --- a/packages/react-native/React/Base/RCTModuleData.mm +++ b/packages/react-native/React/Base/RCTModuleData.mm @@ -32,17 +32,6 @@ int32_t getUniqueId() return counter++; } } -static BOOL isMainQueueExecutionOfConstantToExportDisabled = NO; - -void RCTSetIsMainQueueExecutionOfConstantsToExportDisabled(BOOL val) -{ - isMainQueueExecutionOfConstantToExportDisabled = val; -} - -BOOL RCTIsMainQueueExecutionOfConstantsToExportDisabled() -{ - return isMainQueueExecutionOfConstantToExportDisabled; -} @implementation RCTModuleData { NSDictionary *_constantsToExport; @@ -461,7 +450,7 @@ - (void)gatherConstantsAndSignalJSRequireEnding:(BOOL)startMarkers BridgeNativeModulePerfLogger::moduleJSRequireEndingStart([moduleName UTF8String]); } - if (!RCTIsMainQueueExecutionOfConstantsToExportDisabled() && _requiresMainQueueSetup) { + if (_requiresMainQueueSetup) { if (!RCTIsMainQueue()) { RCTLogWarn(@"Required dispatch_sync to load constants for %@. This may lead to deadlocks", _moduleClass); } diff --git a/packages/react-native/React/Base/RCTPLTag.h b/packages/react-native/React/Base/RCTPLTag.h index 5aa15cb588969f..cb9f8f0ded0462 100644 --- a/packages/react-native/React/Base/RCTPLTag.h +++ b/packages/react-native/React/Base/RCTPLTag.h @@ -25,5 +25,6 @@ typedef NS_ENUM(NSInteger, RCTPLTag) { RCTPLTTI, RCTPLBundleSize, RCTPLReactInstanceInit, + RCTPLAppStartup, RCTPLSize // This is used to count the size }; diff --git a/packages/react-native/React/Base/RCTPerformanceLoggerLabels.m b/packages/react-native/React/Base/RCTPerformanceLoggerLabels.m index 5312d1443a8ee9..c508dbfc39a170 100644 --- a/packages/react-native/React/Base/RCTPerformanceLoggerLabels.m +++ b/packages/react-native/React/Base/RCTPerformanceLoggerLabels.m @@ -49,6 +49,8 @@ return @"BundleSize"; case RCTPLReactInstanceInit: return @"ReactInstanceInit"; + case RCTPLAppStartup: + return @"AppStartup"; case RCTPLSize: // Only used to count enum size RCTAssert(NO, @"RCTPLSize should not be used to track performance timestamps."); return nil; diff --git a/packages/react-native/React/CoreModules/CoreModulesPlugins.h b/packages/react-native/React/CoreModules/CoreModulesPlugins.h index f84955e063fb06..a3a7bce63f335d 100644 --- a/packages/react-native/React/CoreModules/CoreModulesPlugins.h +++ b/packages/react-native/React/CoreModules/CoreModulesPlugins.h @@ -30,28 +30,28 @@ Class RCTCoreModulesClassProvider(const char *name); // Lookup functions Class RCTAccessibilityManagerCls(void) __attribute__((used)); +Class RCTActionSheetManagerCls(void) __attribute__((used)); +Class RCTAlertManagerCls(void) __attribute__((used)); +Class RCTAppStateCls(void) __attribute__((used)); Class RCTAppearanceCls(void) __attribute__((used)); +Class RCTClipboardCls(void) __attribute__((used)); +Class RCTDevLoadingViewCls(void) __attribute__((used)); +Class RCTDevMenuCls(void) __attribute__((used)); +Class RCTDevSettingsCls(void) __attribute__((used)); Class RCTDeviceInfoCls(void) __attribute__((used)); +Class RCTEventDispatcherCls(void) __attribute__((used)); Class RCTExceptionsManagerCls(void) __attribute__((used)); -Class RCTPlatformCls(void) __attribute__((used)); -Class RCTClipboardCls(void) __attribute__((used)); Class RCTI18nManagerCls(void) __attribute__((used)); -Class RCTSourceCodeCls(void) __attribute__((used)); -Class RCTActionSheetManagerCls(void) __attribute__((used)); -Class RCTAlertManagerCls(void) __attribute__((used)); -Class RCTTimingCls(void) __attribute__((used)); -Class RCTStatusBarManagerCls(void) __attribute__((used)); Class RCTKeyboardObserverCls(void) __attribute__((used)); -Class RCTAppStateCls(void) __attribute__((used)); +Class RCTLogBoxCls(void) __attribute__((used)); Class RCTPerfMonitorCls(void) __attribute__((used)); -Class RCTDevMenuCls(void) __attribute__((used)); -Class RCTDevSettingsCls(void) __attribute__((used)); +Class RCTPlatformCls(void) __attribute__((used)); Class RCTRedBoxCls(void) __attribute__((used)); -Class RCTLogBoxCls(void) __attribute__((used)); +Class RCTSourceCodeCls(void) __attribute__((used)); +Class RCTStatusBarManagerCls(void) __attribute__((used)); +Class RCTTimingCls(void) __attribute__((used)); Class RCTWebSocketExecutorCls(void) __attribute__((used)); Class RCTWebSocketModuleCls(void) __attribute__((used)); -Class RCTDevLoadingViewCls(void) __attribute__((used)); -Class RCTEventDispatcherCls(void) __attribute__((used)); Class RCTBlobManagerCls(void) __attribute__((used)); #ifdef __cplusplus diff --git a/packages/react-native/React/CoreModules/CoreModulesPlugins.mm b/packages/react-native/React/CoreModules/CoreModulesPlugins.mm index 05fc3c4597e8cc..fc1587becada12 100644 --- a/packages/react-native/React/CoreModules/CoreModulesPlugins.mm +++ b/packages/react-native/React/CoreModules/CoreModulesPlugins.mm @@ -20,28 +20,28 @@ Class RCTCoreModulesClassProvider(const char *name) { // Intentionally leak to avoid crashing after static destructors are run. static const auto sCoreModuleClassMap = new const std::unordered_map{ {"AccessibilityManager", RCTAccessibilityManagerCls}, + {"ActionSheetManager", RCTActionSheetManagerCls}, + {"AlertManager", RCTAlertManagerCls}, + {"AppState", RCTAppStateCls}, {"Appearance", RCTAppearanceCls}, + {"Clipboard", RCTClipboardCls}, + {"DevLoadingView", RCTDevLoadingViewCls}, + {"DevMenu", RCTDevMenuCls}, + {"DevSettings", RCTDevSettingsCls}, {"DeviceInfo", RCTDeviceInfoCls}, + {"EventDispatcher", RCTEventDispatcherCls}, {"ExceptionsManager", RCTExceptionsManagerCls}, - {"PlatformConstants", RCTPlatformCls}, - {"Clipboard", RCTClipboardCls}, {"I18nManager", RCTI18nManagerCls}, - {"SourceCode", RCTSourceCodeCls}, - {"ActionSheetManager", RCTActionSheetManagerCls}, - {"AlertManager", RCTAlertManagerCls}, - {"Timing", RCTTimingCls}, - {"StatusBarManager", RCTStatusBarManagerCls}, {"KeyboardObserver", RCTKeyboardObserverCls}, - {"AppState", RCTAppStateCls}, + {"LogBox", RCTLogBoxCls}, {"PerfMonitor", RCTPerfMonitorCls}, - {"DevMenu", RCTDevMenuCls}, - {"DevSettings", RCTDevSettingsCls}, + {"PlatformConstants", RCTPlatformCls}, {"RedBox", RCTRedBoxCls}, - {"LogBox", RCTLogBoxCls}, + {"SourceCode", RCTSourceCodeCls}, + {"StatusBarManager", RCTStatusBarManagerCls}, + {"Timing", RCTTimingCls}, {"WebSocketExecutor", RCTWebSocketExecutorCls}, {"WebSocketModule", RCTWebSocketModuleCls}, - {"DevLoadingView", RCTDevLoadingViewCls}, - {"EventDispatcher", RCTEventDispatcherCls}, {"BlobModule", RCTBlobManagerCls}, }; diff --git a/packages/react-native/React/CoreModules/RCTAlertController.m b/packages/react-native/React/CoreModules/RCTAlertController.mm similarity index 89% rename from packages/react-native/React/CoreModules/RCTAlertController.m rename to packages/react-native/React/CoreModules/RCTAlertController.mm index e3f19959e93427..2b6822108b3152 100644 --- a/packages/react-native/React/CoreModules/RCTAlertController.m +++ b/packages/react-native/React/CoreModules/RCTAlertController.mm @@ -43,8 +43,9 @@ - (UIWindow *)alertWindow - (void)show:(BOOL)animated completion:(void (^)(void))completion { - UIUserInterfaceStyle style = - RCTSharedApplication().delegate.window.overrideUserInterfaceStyle ?: UIUserInterfaceStyleUnspecified; + UIUserInterfaceStyle style = RCTSharedApplication().delegate.window.overrideUserInterfaceStyle + ? RCTSharedApplication().delegate.window.overrideUserInterfaceStyle + : UIUserInterfaceStyleUnspecified; self.overrideUserInterfaceStyle = style; [self.alertWindow makeKeyAndVisible]; diff --git a/packages/react-native/React/CoreModules/RCTDevLoadingView.mm b/packages/react-native/React/CoreModules/RCTDevLoadingView.mm index 02bdb96e1d507c..ab9c945790e358 100644 --- a/packages/react-native/React/CoreModules/RCTDevLoadingView.mm +++ b/packages/react-native/React/CoreModules/RCTDevLoadingView.mm @@ -83,6 +83,14 @@ - (void)showInitialMessageDelayed:(void (^)())initialMessage dispatch_time(DISPATCH_TIME_NOW, 0.2 * NSEC_PER_SEC), dispatch_get_main_queue(), self->_initialMessageBlock); } +- (void)hideBannerAfter:(CGFloat)delay +{ + // Cancel previous hide call after the delay. + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hide) object:nil]; + // Set new hide call after a delay. + [self performSelector:@selector(hide) withObject:nil afterDelay:delay]; +} + - (void)showMessage:(NSString *)message color:(UIColor *)color backgroundColor:(UIColor *)backgroundColor { if (!RCTDevLoadingViewGetEnabled() || _hiding) { @@ -132,6 +140,8 @@ - (void)showMessage:(NSString *)message color:(UIColor *)color backgroundColor:( UIWindowScene *scene = (UIWindowScene *)RCTSharedApplication().connectedScenes.anyObject; self->_window.windowScene = scene; }); + + [self hideBannerAfter:15.0]; } RCT_EXPORT_METHOD(showMessage diff --git a/packages/react-native/React/CoreModules/RCTFPSGraph.m b/packages/react-native/React/CoreModules/RCTFPSGraph.mm similarity index 98% rename from packages/react-native/React/CoreModules/RCTFPSGraph.m rename to packages/react-native/React/CoreModules/RCTFPSGraph.mm index 6beaf7d16f1d45..1fc4bd24b9c37f 100644 --- a/packages/react-native/React/CoreModules/RCTFPSGraph.m +++ b/packages/react-native/React/CoreModules/RCTFPSGraph.mm @@ -45,7 +45,7 @@ - (instancetype)initWithFrame:(CGRect)frame color:(UIColor *)color _length = (NSUInteger)floor(frame.size.width); _height = (NSUInteger)floor(frame.size.height); _scale = 60.0 / (CGFloat)_height; - _frames = calloc(sizeof(CGFloat), _length); + _frames = (CGFloat *)calloc(sizeof(CGFloat), _length); _color = color; [self.layer addSublayer:self.graph]; diff --git a/packages/react-native/React/CoreModules/RCTPerfMonitor.mm b/packages/react-native/React/CoreModules/RCTPerfMonitor.mm index 307161f5b3e4c5..46463a0f9c5505 100644 --- a/packages/react-native/React/CoreModules/RCTPerfMonitor.mm +++ b/packages/react-native/React/CoreModules/RCTPerfMonitor.mm @@ -183,7 +183,9 @@ - (UIPanGestureRecognizer *)gestureRecognizer - (UIView *)container { if (!_container) { - _container = [[UIView alloc] initWithFrame:CGRectMake(10, 25, 180, RCTPerfMonitorBarHeight)]; + CGSize statusBarSize = RCTSharedApplication().statusBarFrame.size; + CGFloat statusBarHeight = statusBarSize.height; + _container = [[UIView alloc] initWithFrame:CGRectMake(10, statusBarHeight, 180, RCTPerfMonitorBarHeight)]; _container.layer.borderWidth = 2; _container.layer.borderColor = [UIColor lightGrayColor].CGColor; [_container addGestureRecognizer:self.gestureRecognizer]; diff --git a/packages/react-native/React/CoreModules/RCTTiming.mm b/packages/react-native/React/CoreModules/RCTTiming.mm index 13d0d57296bbba..6065006b8eb281 100644 --- a/packages/react-native/React/CoreModules/RCTTiming.mm +++ b/packages/react-native/React/CoreModules/RCTTiming.mm @@ -256,9 +256,9 @@ - (void)didUpdateFrame:(RCTFrameUpdate *)update } if (_sendIdleEvents) { - NSTimeInterval currentTimestamp = [[NSDate date] timeIntervalSince1970]; - NSTimeInterval frameElapsed = currentTimestamp - update.timestamp; + NSTimeInterval frameElapsed = (CACurrentMediaTime() - update.timestamp); if (kFrameDuration - frameElapsed >= kIdleCallbackFrameDeadline) { + NSTimeInterval currentTimestamp = [[NSDate date] timeIntervalSince1970]; NSNumber *absoluteFrameStartMS = @((currentTimestamp - frameElapsed) * 1000); if (_bridge) { [_bridge enqueueJSCall:@"JSTimers" method:@"callIdleCallbacks" args:@[ absoluteFrameStartMS ] completion:NULL]; diff --git a/packages/react-native/React/CoreModules/React-CoreModules.podspec b/packages/react-native/React/CoreModules/React-CoreModules.podspec index 7941b07c49e013..313947f5c6598f 100644 --- a/packages/react-native/React/CoreModules/React-CoreModules.podspec +++ b/packages/react-native/React/CoreModules/React-CoreModules.podspec @@ -49,7 +49,7 @@ Pod::Spec.new do |s| "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", "HEADER_SEARCH_PATHS" => header_search_paths.join(" ") } - + s.framework = "UIKit" s.dependency "React-Codegen", version s.dependency "RCT-Folly", folly_version s.dependency "RCTTypeSafety", version diff --git a/packages/react-native/React/CxxBridge/RCTCxxBridge.mm b/packages/react-native/React/CxxBridge/RCTCxxBridge.mm index a23413895768c1..fc77456265da17 100644 --- a/packages/react-native/React/CxxBridge/RCTCxxBridge.mm +++ b/packages/react-native/React/CxxBridge/RCTCxxBridge.mm @@ -114,26 +114,18 @@ int32_t getUniqueId() } -static void notifyAboutModuleSetup(RCTPerformanceLogger *performanceLogger, const char *tag) -{ - NSString *moduleName = [[NSString alloc] initWithUTF8String:tag]; - if (moduleName) { - int64_t setupTime = [performanceLogger durationForTag:RCTPLNativeModuleSetup]; - [[NSNotificationCenter defaultCenter] postNotificationName:RCTDidSetupModuleNotification - object:nil - userInfo:@{ - RCTDidSetupModuleNotificationModuleNameKey : moduleName, - RCTDidSetupModuleNotificationSetupTimeKey : @(setupTime) - }]; - } -} - static void mapReactMarkerToPerformanceLogger( const ReactMarker::ReactMarkerId markerId, RCTPerformanceLogger *performanceLogger, const char *tag) { switch (markerId) { + case ReactMarker::APP_STARTUP_START: + [performanceLogger markStartForTag:RCTPLAppStartup]; + break; + case ReactMarker::APP_STARTUP_STOP: + [performanceLogger markStopForTag:RCTPLAppStartup]; + break; case ReactMarker::RUN_JS_BUNDLE_START: [performanceLogger markStartForTag:RCTPLScriptExecution]; break; @@ -152,7 +144,6 @@ static void mapReactMarkerToPerformanceLogger( break; case ReactMarker::NATIVE_MODULE_SETUP_STOP: [performanceLogger markStopForTag:RCTPLNativeModuleSetup]; - notifyAboutModuleSetup(performanceLogger, tag); break; // Not needed in bridge mode. case ReactMarker::REACT_INSTANCE_INIT_START: @@ -245,14 +236,12 @@ - (void)setRCTTurboModuleRegistry:(id)turboModuleRegistr [_objCModuleRegistry setTurboModuleRegistry:_turboModuleRegistry]; } -- (void)attachBridgeAPIsToObjCModule:(id)module +- (RCTBridgeModuleDecorator *)bridgeModuleDecorator { - RCTBridgeModuleDecorator *bridgeModuleDecorator = - [[RCTBridgeModuleDecorator alloc] initWithViewRegistry:_viewRegistry_DEPRECATED - moduleRegistry:_objCModuleRegistry - bundleManager:_bundleManager - callableJSModules:_callableJSModules]; - [bridgeModuleDecorator attachInteropAPIsToModule:module]; + return [[RCTBridgeModuleDecorator alloc] initWithViewRegistry:_viewRegistry_DEPRECATED + moduleRegistry:_objCModuleRegistry + bundleManager:_bundleManager + callableJSModules:_callableJSModules]; } - (std::shared_ptr)jsMessageThread @@ -1026,9 +1015,7 @@ - (void)_prepareModulesWithDispatchGroup:(dispatch_group_t)dispatchGroup if (self.valid && ![moduleData.moduleClass isSubclassOfClass:[RCTCxxModule class]]) { [self->_performanceLogger appendStartForTag:RCTPLNativeModuleMainThread]; (void)[moduleData instance]; - if (!RCTIsMainQueueExecutionOfConstantsToExportDisabled()) { - [moduleData gatherConstants]; - } + [moduleData gatherConstants]; [self->_performanceLogger appendStopForTag:RCTPLNativeModuleMainThread]; } }; diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ActivityIndicator/RCTActivityIndicatorViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/ActivityIndicator/RCTActivityIndicatorViewComponentView.mm index 3f233578412588..c570f329f8df33 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ActivityIndicator/RCTActivityIndicatorViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ActivityIndicator/RCTActivityIndicatorViewComponentView.mm @@ -21,9 +21,9 @@ static UIActivityIndicatorViewStyle convertActivityIndicatorViewStyle(const Acti { switch (size) { case ActivityIndicatorViewSize::Small: - return UIActivityIndicatorViewStyleWhite; + return UIActivityIndicatorViewStyleMedium; case ActivityIndicatorViewSize::Large: - return UIActivityIndicatorViewStyleWhiteLarge; + return UIActivityIndicatorViewStyleLarge; } } @@ -64,8 +64,8 @@ - (instancetype)initWithFrame:(CGRect)frame - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - const auto &oldViewProps = *std::static_pointer_cast(_props); - const auto &newViewProps = *std::static_pointer_cast(props); + const auto &oldViewProps = static_cast(*_props); + const auto &newViewProps = static_cast(*props); if (oldViewProps.animating != newViewProps.animating) { if (newViewProps.animating) { diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm index 8b5b3d1b22ad28..472d83e45b12e0 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm @@ -14,9 +14,9 @@ #import #import #import -#import #import #import +#import using namespace facebook::react; @@ -54,8 +54,8 @@ + (ComponentDescriptorProvider)componentDescriptorProvider - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - auto const &oldImageProps = *std::static_pointer_cast(_props); - auto const &newImageProps = *std::static_pointer_cast(props); + const auto &oldImageProps = static_cast(*_props); + const auto &newImageProps = static_cast(*props); // `resizeMode` if (oldImageProps.resizeMode != newImageProps.resizeMode) { @@ -88,7 +88,7 @@ - (void)updateState:(State::Shared const &)state oldState:(State::Shared const & (newImageState && newImageState->getData().getImageSource() != oldImageState->getData().getImageSource())) { // Loading actually starts a little before this, but this is the first time we know // the image is loading and can fire an event from this component - std::static_pointer_cast(_eventEmitter)->onLoadStart(); + static_cast(*_eventEmitter).onLoadStart(); // TODO (T58941612): Tracking for visibility should be done directly on this class. // For now, we consolidate instrumentation logic in the image loader, so that pre-Fabric gets the same treatment. @@ -138,10 +138,10 @@ - (void)didReceiveImage:(UIImage *)image metadata:(id)metadata fromObserver:(voi return; } - std::static_pointer_cast(_eventEmitter)->onLoad(); - std::static_pointer_cast(_eventEmitter)->onLoadEnd(); + static_cast(*_eventEmitter).onLoad(); + static_cast(*_eventEmitter).onLoadEnd(); - const auto &imageProps = *std::static_pointer_cast(_props); + const auto &imageProps = static_cast(*_props); if (imageProps.tintColor) { image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; @@ -176,7 +176,7 @@ - (void)didReceiveProgress:(float)progress fromObserver:(void const *)observer return; } - std::static_pointer_cast(_eventEmitter)->onProgress(progress); + static_cast(*_eventEmitter).onProgress(progress); } - (void)didReceiveFailureFromObserver:(void const *)observer @@ -187,8 +187,8 @@ - (void)didReceiveFailureFromObserver:(void const *)observer return; } - std::static_pointer_cast(_eventEmitter)->onError(); - std::static_pointer_cast(_eventEmitter)->onLoadEnd(); + static_cast(*_eventEmitter).onError(); + static_cast(*_eventEmitter).onLoadEnd(); } @end diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm index f78c2797f0ef7c..f00cc30d211a16 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm @@ -107,8 +107,8 @@ - (void)unmountChildComponentView:(UIView *)childCompo - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - auto const &oldInputAccessoryProps = *std::static_pointer_cast(_props); - auto const &newInputAccessoryProps = *std::static_pointer_cast(props); + const auto &oldInputAccessoryProps = static_cast(*_props); + const auto &newInputAccessoryProps = static_cast(*props); if (newInputAccessoryProps.backgroundColor != oldInputAccessoryProps.backgroundColor) { _contentView.backgroundColor = RCTUIColorFromSharedColor(newInputAccessoryProps.backgroundColor); diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm index 5324963ea01a42..81181588130732 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm @@ -187,9 +187,9 @@ - (void)finalizeUpdates:(RNComponentViewUpdateMask)updateMask _adapter.eventInterceptor = ^(std::string eventName, folly::dynamic event) { if (weakSelf) { __typeof(self) strongSelf = weakSelf; - auto eventEmitter = - std::static_pointer_cast(strongSelf->_eventEmitter); - eventEmitter->dispatchEvent(eventName, event); + const auto &eventEmitter = + static_cast(*strongSelf->_eventEmitter); + eventEmitter.dispatchEvent(eventName, event); } }; self.contentView = _adapter.paperView; @@ -217,7 +217,7 @@ - (void)finalizeUpdates:(RNComponentViewUpdateMask)updateMask [_adapter.paperView didUpdateReactSubviews]; if (updateMask & RNComponentViewUpdateMaskProps) { - const auto &newProps = *std::static_pointer_cast(_props); + const auto &newProps = static_cast(*_props); [_adapter setProps:newProps.otherProps]; } } diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm index 951db3af44f028..0fea1bfc95afbc 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm @@ -24,6 +24,7 @@ - (instancetype)initWithCoordinator:(RCTLegacyViewManagerInteropCoordinator *)co - (void)dealloc { + [_coordinator removeViewFromRegistryWithTag:_tag]; [_paperView removeFromSuperview]; [_coordinator removeObserveForTag:_tag]; } @@ -39,6 +40,7 @@ - (UIView *)paperView weakSelf.eventInterceptor(eventName, event); } }]; + [_coordinator addViewToRegistry:_paperView withTag:_tag]; } return _paperView; } diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm index 28c4bd227b7cc9..b91e44bb15ba23 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm @@ -182,12 +182,12 @@ - (void)ensurePresentedOnlyIfNeeded - (std::shared_ptr)modalEventEmitter { - if (!self->_eventEmitter) { + if (!_eventEmitter) { return nullptr; } - assert(std::dynamic_pointer_cast(self->_eventEmitter)); - return std::static_pointer_cast(self->_eventEmitter); + assert(std::dynamic_pointer_cast(_eventEmitter)); + return std::static_pointer_cast(_eventEmitter); } #pragma mark - RCTMountingTransactionObserving @@ -245,7 +245,7 @@ - (void)prepareForRecycle - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - const auto &newProps = *std::static_pointer_cast(props); + const auto &newProps = static_cast(*props); #if !TARGET_OS_TV self.viewController.supportedInterfaceOrientations = supportedOrientationsMask(newProps.supportedOrientations); diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.h b/packages/react-native/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.h index 6ce762210f0e99..ca5f395c3141a8 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.h +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.h @@ -30,15 +30,15 @@ extern "C" { Class RCTFabricComponentsProvider(const char *name); // Lookup functions +Class RCTActivityIndicatorViewCls(void) __attribute__((used)); +Class RCTInputAccessoryCls(void) __attribute__((used)); +Class RCTParagraphCls(void) __attribute__((used)); +Class RCTPullToRefreshViewCls(void) __attribute__((used)); Class RCTSafeAreaViewCls(void) __attribute__((used)); Class RCTScrollViewCls(void) __attribute__((used)); -Class RCTPullToRefreshViewCls(void) __attribute__((used)); -Class RCTActivityIndicatorViewCls(void) __attribute__((used)); Class RCTSwitchCls(void) __attribute__((used)); -Class RCTUnimplementedNativeViewCls(void) __attribute__((used)); -Class RCTParagraphCls(void) __attribute__((used)); Class RCTTextInputCls(void) __attribute__((used)); -Class RCTInputAccessoryCls(void) __attribute__((used)); +Class RCTUnimplementedNativeViewCls(void) __attribute__((used)); Class RCTViewCls(void) __attribute__((used)); Class RCTImageCls(void) __attribute__((used)); Class RCTModalHostViewCls(void) __attribute__((used)); diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.mm index ef5bd4e68707c5..02d1dc1a125af7 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.mm @@ -18,15 +18,15 @@ Class RCTFabricComponentsProvider(const char *name) { static std::unordered_map sFabricComponentsClassMap = { + {"ActivityIndicatorView", RCTActivityIndicatorViewCls}, + {"InputAccessoryView", RCTInputAccessoryCls}, + {"Paragraph", RCTParagraphCls}, + {"PullToRefreshView", RCTPullToRefreshViewCls}, {"SafeAreaView", RCTSafeAreaViewCls}, {"ScrollView", RCTScrollViewCls}, - {"PullToRefreshView", RCTPullToRefreshViewCls}, - {"ActivityIndicatorView", RCTActivityIndicatorViewCls}, {"Switch", RCTSwitchCls}, - {"UnimplementedNativeView", RCTUnimplementedNativeViewCls}, - {"Paragraph", RCTParagraphCls}, {"TextInput", RCTTextInputCls}, - {"InputAccessoryView", RCTInputAccessoryCls}, + {"UnimplementedNativeView", RCTUnimplementedNativeViewCls}, {"View", RCTViewCls}, {"Image", RCTImageCls}, {"ModalHostView", RCTModalHostViewCls}, diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.mm index 9480239051e8be..23de45a94715eb 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.mm @@ -57,8 +57,8 @@ + (ComponentDescriptorProvider)componentDescriptorProvider - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - auto const &oldConcreteProps = *std::static_pointer_cast(_props); - auto const &newConcreteProps = *std::static_pointer_cast(props); + const auto &oldConcreteProps = static_cast(*_props); + const auto &newConcreteProps = static_cast(*props); if (newConcreteProps.refreshing != oldConcreteProps.refreshing) { if (newConcreteProps.refreshing) { @@ -89,12 +89,12 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const & - (void)handleUIControlEventValueChanged { - std::static_pointer_cast(_eventEmitter)->onRefresh({}); + static_cast(*_eventEmitter).onRefresh({}); } - (void)_updateTitle { - auto const &concreteProps = *std::static_pointer_cast(_props); + const auto &concreteProps = static_cast(*_props); if (concreteProps.title.empty()) { _refreshControl.attributedTitle = nil; diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm index fde373ba822035..94c82ad08ada0b 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -190,8 +190,8 @@ - (void)updateLayoutMetrics:(const LayoutMetrics &)layoutMetrics - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - const auto &oldScrollViewProps = *std::static_pointer_cast(_props); - const auto &newScrollViewProps = *std::static_pointer_cast(props); + const auto &oldScrollViewProps = static_cast(*_props); + const auto &newScrollViewProps = static_cast(*props); #define REMAP_PROP(reactName, localName, target) \ if (oldScrollViewProps.reactName != newScrollViewProps.reactName) { \ @@ -408,7 +408,7 @@ - (void)_updateStateWithContentOffset - (void)prepareForRecycle { - const auto &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); _scrollView.contentOffset = RCTCGPointFromPoint(props.contentOffset); // We set the default behavior to "never" so that iOS // doesn't do weird things to UIScrollView insets automatically @@ -445,7 +445,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView if ((_lastScrollEventDispatchTime == 0) || (now - _lastScrollEventDispatchTime > _scrollEventThrottle)) { _lastScrollEventDispatchTime = now; if (_eventEmitter) { - std::static_pointer_cast(_eventEmitter)->onScroll([self _scrollViewMetrics]); + static_cast(*_eventEmitter).onScroll([self _scrollViewMetrics]); } RCTSendScrollEventForNativeAnimations_DEPRECATED(scrollView, self.tag); @@ -479,7 +479,7 @@ - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView return; } - std::static_pointer_cast(_eventEmitter)->onScrollBeginDrag([self _scrollViewMetrics]); + static_cast(*_eventEmitter).onScrollBeginDrag([self _scrollViewMetrics]); _isUserTriggeredScrolling = YES; } @@ -491,7 +491,7 @@ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL return; } - std::static_pointer_cast(_eventEmitter)->onScrollEndDrag([self _scrollViewMetrics]); + static_cast(*_eventEmitter).onScrollEndDrag([self _scrollViewMetrics]); [self _updateStateWithContentOffset]; @@ -510,8 +510,7 @@ - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView return; } - std::static_pointer_cast(_eventEmitter) - ->onMomentumScrollBegin([self _scrollViewMetrics]); + static_cast(*_eventEmitter).onMomentumScrollBegin([self _scrollViewMetrics]); } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView @@ -522,7 +521,7 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView return; } - std::static_pointer_cast(_eventEmitter)->onMomentumScrollEnd([self _scrollViewMetrics]); + static_cast(*_eventEmitter).onMomentumScrollEnd([self _scrollViewMetrics]); [self _updateStateWithContentOffset]; _isUserTriggeredScrolling = NO; } @@ -541,7 +540,7 @@ - (void)_handleFinishedScrolling:(UIScrollView *)scrollView return; } - std::static_pointer_cast(_eventEmitter)->onMomentumScrollEnd([self _scrollViewMetrics]); + static_cast(*_eventEmitter).onMomentumScrollEnd([self _scrollViewMetrics]); [self _updateStateWithContentOffset]; } @@ -553,7 +552,7 @@ - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable return; } - std::static_pointer_cast(_eventEmitter)->onScrollBeginDrag([self _scrollViewMetrics]); + static_cast(*_eventEmitter).onScrollBeginDrag([self _scrollViewMetrics]); } - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale @@ -564,7 +563,7 @@ - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UI return; } - std::static_pointer_cast(_eventEmitter)->onScrollEndDrag([self _scrollViewMetrics]); + static_cast(*_eventEmitter).onScrollEndDrag([self _scrollViewMetrics]); [self _updateStateWithContentOffset]; } @@ -607,7 +606,7 @@ - (void)scrollTo:(double)x y:(double)y animated:(BOOL)animated fmax(_scrollView.contentInset.top, 0), 0.01)); // Make width and height greater than 0 - const auto &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if (!CGRectContainsPoint(maxRect, offset) && !props.scrollToOverflowEnabled) { CGFloat localX = fmax(offset.x, CGRectGetMinX(maxRect)); localX = fmin(localX, CGRectGetMaxX(maxRect)); @@ -714,7 +713,7 @@ - (void)removeScrollListener:(NSObject *)scrollListener - (void)_prepareForMaintainVisibleScrollPosition { - const auto &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if (!props.maintainVisibleContentPosition) { return; } @@ -740,7 +739,7 @@ - (void)_prepareForMaintainVisibleScrollPosition - (void)_adjustForMaintainVisibleContentPosition { - const auto &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if (!props.maintainVisibleContentPosition) { return; } diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Switch/RCTSwitchComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Switch/RCTSwitchComponentView.mm index 844b60c120efb8..bf95785588cbeb 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Switch/RCTSwitchComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Switch/RCTSwitchComponentView.mm @@ -57,8 +57,8 @@ + (ComponentDescriptorProvider)componentDescriptorProvider - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - const auto &oldSwitchProps = *std::static_pointer_cast(_props); - const auto &newSwitchProps = *std::static_pointer_cast(props); + const auto &oldSwitchProps = static_cast(*_props); + const auto &newSwitchProps = static_cast(*props); // `value` if (oldSwitchProps.value != newSwitchProps.value) { @@ -92,13 +92,13 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const & - (void)onChange:(UISwitch *)sender { - const auto &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if (props.value == sender.on) { return; } - std::dynamic_pointer_cast(_eventEmitter) - ->onChange(SwitchEventEmitter::OnChange{.value = static_cast(sender.on)}); + static_cast(*_eventEmitter) + .onChange(SwitchEventEmitter::OnChange{.value = static_cast(sender.on)}); } #pragma mark - Native Commands diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm index ac45711c97bea3..95f3ab569346a1 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm @@ -81,8 +81,8 @@ + (ComponentDescriptorProvider)componentDescriptorProvider - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - auto const &oldParagraphProps = *std::static_pointer_cast(_props); - auto const &newParagraphProps = *std::static_pointer_cast(props); + const auto &oldParagraphProps = static_cast(*_props); + const auto &newParagraphProps = static_cast(*props); _paragraphAttributes = newParagraphProps.paragraphAttributes; @@ -147,7 +147,7 @@ - (BOOL)isAccessibilityElement - (NSArray *)accessibilityElements { - auto const ¶graphProps = *std::static_pointer_cast(_props); + const auto ¶graphProps = static_cast(*_props); // If the component is not `accessible`, we return an empty array. // We do this because logically all nested components represent the content of the component; @@ -241,13 +241,13 @@ - (void)handleLongPress:(UILongPressGestureRecognizer *)gesture - (BOOL)canBecomeFirstResponder { - auto const ¶graphProps = *std::static_pointer_cast(_props); + const auto ¶graphProps = static_cast(*_props); return paragraphProps.isSelectable; } - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { - auto const ¶graphProps = *std::static_pointer_cast(_props); + const auto ¶graphProps = static_cast(*_props); if (paragraphProps.isSelectable && action == @selector(copy:)) { return YES; diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm index cd5a89752208b5..800c04aeee08ae 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm @@ -82,7 +82,7 @@ - (void)didMoveToWindow [super didMoveToWindow]; if (self.window && !_didMoveToWindow) { - auto const &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if (props.autoFocus) { [_backedTextInputView becomeFirstResponder]; } @@ -107,8 +107,8 @@ + (ComponentDescriptorProvider)componentDescriptorProvider - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - auto const &oldTextInputProps = *std::static_pointer_cast(_props); - auto const &newTextInputProps = *std::static_pointer_cast(props); + const auto &oldTextInputProps = static_cast(*_props); + const auto &newTextInputProps = static_cast(*props); // Traits: if (newTextInputProps.traits.multiline != oldTextInputProps.traits.multiline) { @@ -190,10 +190,8 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const & } if (newTextInputProps.traits.smartInsertDelete != oldTextInputProps.traits.smartInsertDelete) { - if (@available(iOS 11.0, *)) { - _backedTextInputView.smartInsertDeleteType = - RCTUITextSmartInsertDeleteTypeFromOptionalBool(newTextInputProps.traits.smartInsertDelete); - } + _backedTextInputView.smartInsertDeleteType = + RCTUITextSmartInsertDeleteTypeFromOptionalBool(newTextInputProps.traits.smartInsertDelete); } // Traits `blurOnSubmit`, `clearTextOnFocus`, and `selectTextOnFocus` were omitted intentionally here @@ -259,8 +257,7 @@ - (void)updateLayoutMetrics:(LayoutMetrics const &)layoutMetrics RCTUIEdgeInsetsFromEdgeInsets(layoutMetrics.contentInsets - layoutMetrics.borderWidth); if (_eventEmitter) { - auto const &textInputEventEmitter = *std::static_pointer_cast(_eventEmitter); - textInputEventEmitter.onContentSizeChange([self _textInputMetrics]); + static_cast(*_eventEmitter).onContentSizeChange([self _textInputMetrics]); } } @@ -286,7 +283,7 @@ - (BOOL)textInputShouldBeginEditing - (void)textInputDidBeginEditing { - auto const &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if (props.traits.clearTextOnFocus) { _backedTextInputView.attributedText = nil; @@ -299,7 +296,7 @@ - (void)textInputDidBeginEditing } if (_eventEmitter) { - std::static_pointer_cast(_eventEmitter)->onFocus([self _textInputMetrics]); + static_cast(*_eventEmitter).onFocus([self _textInputMetrics]); } } @@ -311,8 +308,8 @@ - (BOOL)textInputShouldEndEditing - (void)textInputDidEndEditing { if (_eventEmitter) { - std::static_pointer_cast(_eventEmitter)->onEndEditing([self _textInputMetrics]); - std::static_pointer_cast(_eventEmitter)->onBlur([self _textInputMetrics]); + static_cast(*_eventEmitter).onEndEditing([self _textInputMetrics]); + static_cast(*_eventEmitter).onBlur([self _textInputMetrics]); } } @@ -327,7 +324,7 @@ - (BOOL)textInputShouldSubmitOnReturn // (no connection to any specific "submitting" process). if (_eventEmitter && shouldSubmit) { - std::static_pointer_cast(_eventEmitter)->onSubmitEditing([self _textInputMetrics]); + static_cast(*_eventEmitter).onSubmitEditing([self _textInputMetrics]); } return shouldSubmit; } @@ -344,7 +341,7 @@ - (void)textInputDidReturn - (NSString *)textInputShouldChangeText:(NSString *)text inRange:(NSRange)range { - auto const &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if (!_backedTextInputView.textWasPasted) { if (_eventEmitter) { @@ -352,7 +349,7 @@ - (NSString *)textInputShouldChangeText:(NSString *)text inRange:(NSRange)range keyPressMetrics.text = RCTStringFromNSString(text); keyPressMetrics.eventCount = _mostRecentEventCount; - auto const &textInputEventEmitter = *std::static_pointer_cast(_eventEmitter); + auto const &textInputEventEmitter = static_cast(*_eventEmitter); if (props.onKeyPressSync) { textInputEventEmitter.onKeyPressSync(keyPressMetrics); } else { @@ -402,8 +399,8 @@ - (void)textInputDidChange [self _updateState]; if (_eventEmitter) { - auto const &textInputEventEmitter = *std::static_pointer_cast(_eventEmitter); - auto const &props = *std::static_pointer_cast(_props); + auto const &textInputEventEmitter = static_cast(*_eventEmitter); + const auto &props = static_cast(*_props); if (props.onChangeSync) { textInputEventEmitter.onChangeSync([self _textInputMetrics]); } else { @@ -417,14 +414,14 @@ - (void)textInputDidChangeSelection if (_comingFromJS) { return; } - auto const &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if (props.traits.multiline && ![_lastStringStateWasUpdatedWith isEqual:_backedTextInputView.attributedText]) { [self textInputDidChange]; _ignoreNextTextInputCall = YES; } if (_eventEmitter) { - std::static_pointer_cast(_eventEmitter)->onSelectionChange([self _textInputMetrics]); + static_cast(*_eventEmitter).onSelectionChange([self _textInputMetrics]); } } @@ -433,7 +430,7 @@ - (void)textInputDidChangeSelection - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (_eventEmitter) { - std::static_pointer_cast(_eventEmitter)->onScroll([self _textInputMetrics]); + static_cast(*_eventEmitter).onScroll([self _textInputMetrics]); } } @@ -587,7 +584,7 @@ - (void)_updateState - (void)_restoreTextSelection { - auto const selection = std::dynamic_pointer_cast(_props)->selection; + const auto &selection = static_cast(*_props).selection; if (!selection.has_value()) { return; } @@ -667,7 +664,7 @@ - (BOOL)_textOf:(NSAttributedString *)newText equals:(NSAttributedString *)oldTe - (SubmitBehavior)getSubmitBehavior { - auto const &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); const SubmitBehavior submitBehaviorDefaultable = props.traits.submitBehavior; // We should always have a non-default `submitBehavior`, but in case we don't, set it based on multiline. diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm index cf32eff19f11f7..6260830e5f6210 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm @@ -45,11 +45,7 @@ void RCTCopyBackedTextInput( toTextInput.secureTextEntry = fromTextInput.secureTextEntry; toTextInput.keyboardType = fromTextInput.keyboardType; toTextInput.textContentType = fromTextInput.textContentType; - - if (@available(iOS 11.0, *)) { - toTextInput.smartInsertDeleteType = fromTextInput.smartInsertDeleteType; - } - + toTextInput.smartInsertDeleteType = fromTextInput.smartInsertDeleteType; toTextInput.passwordRules = fromTextInput.passwordRules; [toTextInput setSelectedTextRange:fromTextInput.selectedTextRange notifyDelegate:NO]; @@ -187,7 +183,8 @@ UITextContentType RCTUITextContentTypeFromString(std::string const &contentType) static NSDictionary *contentTypeMap; dispatch_once(&onceToken, ^{ - NSMutableDictionary *mutableContentTypeMap = [@{ + NSMutableDictionary *mutableContentTypeMap = [NSMutableDictionary new]; + [mutableContentTypeMap addEntriesFromDictionary:@{ @"" : @"", @"none" : @"", @"URL" : UITextContentTypeURL, @@ -215,14 +212,31 @@ UITextContentType RCTUITextContentTypeFromString(std::string const &contentType) @"telephoneNumber" : UITextContentTypeTelephoneNumber, @"username" : UITextContentTypeUsername, @"password" : UITextContentTypePassword, - } mutableCopy]; - - [mutableContentTypeMap addEntriesFromDictionary:@{ @"newPassword" : UITextContentTypeNewPassword, - @"oneTimeCode" : UITextContentTypeOneTimeCode + @"oneTimeCode" : UITextContentTypeOneTimeCode, }]; - contentTypeMap = [mutableContentTypeMap copy]; +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 170000 /* __IPHONE_17_0 */ + if (@available(iOS 17.0, *)) { + [mutableContentTypeMap addEntriesFromDictionary:@{ + @"creditCardExpiration" : UITextContentTypeCreditCardExpiration, + @"creditCardExpirationMonth" : UITextContentTypeCreditCardExpirationMonth, + @"creditCardExpirationYear" : UITextContentTypeCreditCardExpirationYear, + @"creditCardSecurityCode" : UITextContentTypeCreditCardSecurityCode, + @"creditCardType" : UITextContentTypeCreditCardType, + @"creditCardName" : UITextContentTypeCreditCardName, + @"creditCardGivenName" : UITextContentTypeCreditCardGivenName, + @"creditCardMiddleName" : UITextContentTypeCreditCardMiddleName, + @"creditCardFamilyName" : UITextContentTypeCreditCardFamilyName, + @"birthdate" : UITextContentTypeBirthdate, + @"birthdateDay" : UITextContentTypeBirthdateDay, + @"birthdateMonth" : UITextContentTypeBirthdateMonth, + @"birthdateYear" : UITextContentTypeBirthdateYear, + }]; + } +#endif + + contentTypeMap = mutableContentTypeMap; }); return contentTypeMap[RCTNSStringFromString(contentType)] ?: @""; diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/UnimplementedComponent/RCTUnimplementedNativeComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/UnimplementedComponent/RCTUnimplementedNativeComponentView.mm index 6c38b8bda685ce..0a55451e61a929 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/UnimplementedComponent/RCTUnimplementedNativeComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/UnimplementedComponent/RCTUnimplementedNativeComponentView.mm @@ -47,8 +47,8 @@ + (ComponentDescriptorProvider)componentDescriptorProvider - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - const auto &oldViewProps = *std::static_pointer_cast(_props); - const auto &newViewProps = *std::static_pointer_cast(props); + const auto &oldViewProps = static_cast(*_props); + const auto &newViewProps = static_cast(*props); if (oldViewProps.name != newViewProps.name) { _label.text = [NSString stringWithFormat:@"'%s' is not Fabric compatible yet.", newViewProps.name.c_str()]; diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/UnimplementedView/RCTUnimplementedViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/UnimplementedView/RCTUnimplementedViewComponentView.mm index 1112c5a9895437..e448178777285d 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/UnimplementedView/RCTUnimplementedViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/UnimplementedView/RCTUnimplementedViewComponentView.mm @@ -54,8 +54,8 @@ + (ComponentDescriptorProvider)componentDescriptorProvider - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - auto const &oldUnimplementedViewProps = *std::static_pointer_cast(_props); - auto const &newUnimplementedViewProps = *std::static_pointer_cast(props); + const auto &oldUnimplementedViewProps = static_cast(*_props); + const auto &newUnimplementedViewProps = static_cast(*props); if (oldUnimplementedViewProps.getComponentName() != newUnimplementedViewProps.getComponentName()) { _label.text = diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index 33da37d1f0a65a..b15f9dfb1be0a8 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -193,8 +193,8 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const & NSStringFromClass([self class])); #endif - auto const &oldViewProps = *std::static_pointer_cast(_props); - auto const &newViewProps = *std::static_pointer_cast(props); + const auto &oldViewProps = static_cast(*_props); + const auto &newViewProps = static_cast(*props); BOOL needsInvalidateLayer = NO; @@ -425,7 +425,7 @@ - (void)prepareForRecycle [super prepareForRecycle]; // If view was managed by animated, its props need to align with UIView's properties. - auto const &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); if ([_propKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN containsObject:@"transform"]) { self.layer.transform = RCTCATransform3DFromTransformMatrix(props.transform); } @@ -712,7 +712,7 @@ - (NSString *)accessibilityLabel - (NSString *)accessibilityValue { - auto const &props = *std::static_pointer_cast(_props); + const auto &props = static_cast(*_props); // Handle Switch. if ((self.accessibilityTraits & AccessibilityTraitSwitch) == AccessibilityTraitSwitch) { diff --git a/packages/react-native/React/Fabric/Mounting/RCTComponentViewFactory.mm b/packages/react-native/React/Fabric/Mounting/RCTComponentViewFactory.mm index 8ed6f9a8319da8..71a78d28f79379 100644 --- a/packages/react-native/React/Fabric/Mounting/RCTComponentViewFactory.mm +++ b/packages/react-native/React/Fabric/Mounting/RCTComponentViewFactory.mm @@ -9,6 +9,7 @@ #import #import +#import #import #import @@ -105,10 +106,16 @@ - (BOOL)registerComponentIfPossible:(std::string const &)name return YES; } + // Paper name: we prepare this variables to warn the user + // when the component is registered in both Fabric and in the + // interop layer, so they can remove that + NSString *componentNameString = RCTNSStringFromString(name); + BOOL isRegisteredInInteropLayer = [RCTLegacyViewManagerInteropComponentView isSupported:componentNameString]; + // Fallback 1: Call provider function for component view class. Class klass = RCTComponentViewClassWithName(name.c_str()); if (klass) { - [self registerComponentViewClass:klass]; + [self registerComponentViewClass:klass andWarnIfNeeded:isRegisteredInInteropLayer]; return YES; } @@ -119,14 +126,13 @@ - (BOOL)registerComponentIfPossible:(std::string const &)name NSString *objcName = [NSString stringWithCString:name.c_str() encoding:NSUTF8StringEncoding]; klass = self.thirdPartyFabricComponentsProvider.thirdPartyFabricComponents[objcName]; if (klass) { - [self registerComponentViewClass:klass]; + [self registerComponentViewClass:klass andWarnIfNeeded:isRegisteredInInteropLayer]; return YES; } } // Fallback 3: Try to use Paper Interop. - NSString *componentNameString = RCTNSStringFromString(name); - if ([RCTLegacyViewManagerInteropComponentView isSupported:componentNameString]) { + if (isRegisteredInInteropLayer) { RCTLogNewArchitectureValidation( RCTNotAllowedInBridgeless, self, @@ -215,4 +221,17 @@ - (RCTComponentViewDescriptor)createComponentViewWithComponentHandle:(facebook:: return _providerRegistry.createComponentDescriptorRegistry(parameters); } +#pragma mark - Private + +- (void)registerComponentViewClass:(Class)componentViewClass + andWarnIfNeeded:(BOOL)isRegisteredInInteropLayer +{ + [self registerComponentViewClass:componentViewClass]; + if (isRegisteredInInteropLayer) { + RCTLogWarn( + @"Component with class %@ has been registered in both the New Architecture Renderer and in the Interop Layer.\nPlease remove it from the Interop Layer", + componentViewClass); + } +} + @end diff --git a/packages/react-native/React/Fabric/Mounting/RCTMountingManager.mm b/packages/react-native/React/Fabric/Mounting/RCTMountingManager.mm index 0e7cc3f383cf69..1626b5bdd5ebf7 100644 --- a/packages/react-native/React/Fabric/Mounting/RCTMountingManager.mm +++ b/packages/react-native/React/Fabric/Mounting/RCTMountingManager.mm @@ -17,11 +17,11 @@ #import #import #import -#import #import #import #import #import +#import #import #import @@ -50,10 +50,6 @@ static void RCTPerformMountInstructions( { SystraceSection s("RCTPerformMountInstructions"); - if (!CoreFeatures::disableTransactionCommit) { - [CATransaction begin]; - [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; - } for (auto const &mutation : mutations) { switch (mutation.type) { case ShadowViewMutation::Create: { @@ -152,9 +148,6 @@ static void RCTPerformMountInstructions( } } } - if (!CoreFeatures::disableTransactionCommit) { - [CATransaction commit]; - } } @implementation RCTMountingManager { @@ -316,7 +309,7 @@ - (void)synchronouslyUpdateViewOnUIThread:(ReactTag)reactTag [componentView updateProps:newProps oldProps:oldProps]; componentView.propKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN = propKeys; - const auto &newViewProps = *std::static_pointer_cast(newProps); + const auto &newViewProps = static_cast(*newProps); if (props[@"transform"] && !CATransform3DEqualToTransform( diff --git a/packages/react-native/React/Fabric/RCTSurfacePresenter.mm b/packages/react-native/React/Fabric/RCTSurfacePresenter.mm index 3e11f245198c48..d17a646fb19d7d 100644 --- a/packages/react-native/React/Fabric/RCTSurfacePresenter.mm +++ b/packages/react-native/React/Fabric/RCTSurfacePresenter.mm @@ -29,12 +29,12 @@ #import #import #import -#import #import #import #import #import #import +#import #import #import "PlatformRunLoopObserver.h" @@ -272,10 +272,6 @@ - (RCTScheduler *)_createScheduler CoreFeatures::cancelImageDownloadsOnRecycle = true; } - if (reactNativeConfig && reactNativeConfig->getBool("react_fabric:disable_transaction_commit")) { - CoreFeatures::disableTransactionCommit = true; - } - if (reactNativeConfig && reactNativeConfig->getBool("react_fabric:enable_granular_scroll_view_state_updates_ios")) { CoreFeatures::enableGranularScrollViewStateUpdatesIOS = true; } diff --git a/packages/react-native/React/I18n/strings/ar.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/ar.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..6809123690dcb5 Binary files /dev/null and b/packages/react-native/React/I18n/strings/ar.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/cs.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/cs.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..b8b20f9bf1fb84 Binary files /dev/null and b/packages/react-native/React/I18n/strings/cs.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/da.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/da.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..69a7e2469c1461 Binary files /dev/null and b/packages/react-native/React/I18n/strings/da.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/de.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/de.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..7a8e7fdae5d3d2 Binary files /dev/null and b/packages/react-native/React/I18n/strings/de.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/el.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/el.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..c190bb402bae8a Binary files /dev/null and b/packages/react-native/React/I18n/strings/el.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/en-GB.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/en-GB.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..6e6f1851dcc641 Binary files /dev/null and b/packages/react-native/React/I18n/strings/en-GB.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/es-ES.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/es-ES.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..c934ef2c41e7a9 Binary files /dev/null and b/packages/react-native/React/I18n/strings/es-ES.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/es.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/es.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..a8a8293376b978 Binary files /dev/null and b/packages/react-native/React/I18n/strings/es.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/fi.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/fi.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..e51db9232616a2 Binary files /dev/null and b/packages/react-native/React/I18n/strings/fi.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/fr.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/fr.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..a3b5014fdb73f7 Binary files /dev/null and b/packages/react-native/React/I18n/strings/fr.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/he.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/he.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..0171dbc4351232 Binary files /dev/null and b/packages/react-native/React/I18n/strings/he.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/hi.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/hi.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..c84ee86adac985 Binary files /dev/null and b/packages/react-native/React/I18n/strings/hi.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/hr.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/hr.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..de41c0ea6d3133 Binary files /dev/null and b/packages/react-native/React/I18n/strings/hr.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/hu.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/hu.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..af4c2491c7c0b2 Binary files /dev/null and b/packages/react-native/React/I18n/strings/hu.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/id.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/id.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..251ed4d6188bf4 Binary files /dev/null and b/packages/react-native/React/I18n/strings/id.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/it.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/it.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..616f8c3cfe57da Binary files /dev/null and b/packages/react-native/React/I18n/strings/it.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/ja.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/ja.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..a40f042171ff5f Binary files /dev/null and b/packages/react-native/React/I18n/strings/ja.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/ko.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/ko.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..c131bf58d47f98 Binary files /dev/null and b/packages/react-native/React/I18n/strings/ko.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/ms.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/ms.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..db8d65ae2fe72d Binary files /dev/null and b/packages/react-native/React/I18n/strings/ms.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/nb.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/nb.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..153401ec038cd1 Binary files /dev/null and b/packages/react-native/React/I18n/strings/nb.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/nl.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/nl.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..564d59c45d7401 Binary files /dev/null and b/packages/react-native/React/I18n/strings/nl.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/pl.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/pl.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..cd89d8fb34f3c4 Binary files /dev/null and b/packages/react-native/React/I18n/strings/pl.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/pt-PT.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/pt-PT.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..5c514d2e073801 Binary files /dev/null and b/packages/react-native/React/I18n/strings/pt-PT.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/pt.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/pt.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..8c1286b2b59eb4 Binary files /dev/null and b/packages/react-native/React/I18n/strings/pt.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/ro.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/ro.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..99ed4f37f29f5b Binary files /dev/null and b/packages/react-native/React/I18n/strings/ro.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/ru.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/ru.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..213a788e133edd Binary files /dev/null and b/packages/react-native/React/I18n/strings/ru.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/sk.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/sk.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..142a2bfdb28964 Binary files /dev/null and b/packages/react-native/React/I18n/strings/sk.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/sv.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/sv.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..eb84af0fb6b22c Binary files /dev/null and b/packages/react-native/React/I18n/strings/sv.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/th.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/th.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..9986617c8df7a6 Binary files /dev/null and b/packages/react-native/React/I18n/strings/th.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/tr.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/tr.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..c5d872a32f7777 Binary files /dev/null and b/packages/react-native/React/I18n/strings/tr.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/uk.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/uk.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..a0ac0c31cfcb6c Binary files /dev/null and b/packages/react-native/React/I18n/strings/uk.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/vi.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/vi.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..860517fe17a3fb Binary files /dev/null and b/packages/react-native/React/I18n/strings/vi.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/zh-Hans.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/zh-Hans.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..bea5bb753b0f03 Binary files /dev/null and b/packages/react-native/React/I18n/strings/zh-Hans.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/zh-Hant-HK.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/zh-Hant-HK.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..940288b8b28731 Binary files /dev/null and b/packages/react-native/React/I18n/strings/zh-Hant-HK.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/I18n/strings/zh-Hant.lproj/fbt_language_pack.bin b/packages/react-native/React/I18n/strings/zh-Hant.lproj/fbt_language_pack.bin new file mode 100644 index 00000000000000..05b972fc2156e8 Binary files /dev/null and b/packages/react-native/React/I18n/strings/zh-Hant.lproj/fbt_language_pack.bin differ diff --git a/packages/react-native/React/Modules/RCTUIManager.m b/packages/react-native/React/Modules/RCTUIManager.m index 6f03df143f1e9e..209c1326e00fae 100644 --- a/packages/react-native/React/Modules/RCTUIManager.m +++ b/packages/react-native/React/Modules/RCTUIManager.m @@ -1485,6 +1485,13 @@ static void RCTMeasureLayout(RCTShadowView *view, RCTShadowView *ancestor, RCTRe moduleConstants[@"baseModuleName"] = viewConfig[@"baseModuleName"]; moduleConstants[@"bubblingEventTypes"] = bubblingEventTypes; moduleConstants[@"directEventTypes"] = directEventTypes; + // In the Old Architecture the "Commands" and "Constants" properties of view manager config are populated by + // lazifyViewManagerConfig function in JS. This fuction uses NativeModules global object that is not available in the + // New Architecture. To make native view configs work in the New Architecture we will populate these properties in + // native. + moduleConstants[@"Commands"] = viewConfig[@"Commands"]; + // In the Old Architecture "Constants" are empty. + moduleConstants[@"Constants"] = [NSDictionary new]; // Add direct events for (NSString *eventName in viewConfig[@"directEvents"]) { diff --git a/packages/react-native/React/React-RCTFabric.podspec b/packages/react-native/React/React-RCTFabric.podspec index 1c1ac9f67937b7..af3ed97086bb48 100644 --- a/packages/react-native/React/React-RCTFabric.podspec +++ b/packages/react-native/React/React-RCTFabric.podspec @@ -39,12 +39,14 @@ if ENV['USE_FRAMEWORKS'] header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/textlayoutmanager/platform/ios\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/textinput/iostextinput\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/imagemanager/platform/ios\"" + header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-nativeconfig/React_nativeconfig.framework/Headers\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-ImageManager/React_ImageManager.framework/Headers\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\"" - header_search_paths << "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\"" + header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\"" + header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-rendererdebug/React_rendererdebug.framework/Headers\"" end Pod::Spec.new do |s| @@ -83,6 +85,8 @@ Pod::Spec.new do |s| s.dependency "React-FabricImage" s.dependency "React-debug" s.dependency "React-utils" + s.dependency "React-rendererdebug" + s.dependency "React-nativeconfig" if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" s.dependency "hermes-engine" diff --git a/packages/react-native/React/Views/RCTActivityIndicatorViewManager.m b/packages/react-native/React/Views/RCTActivityIndicatorViewManager.m index 10ef8ae76302c3..74c71c453b719a 100644 --- a/packages/react-native/React/Views/RCTActivityIndicatorViewManager.m +++ b/packages/react-native/React/Views/RCTActivityIndicatorViewManager.m @@ -18,10 +18,10 @@ @implementation RCTConvert (UIActivityIndicatorView) RCT_ENUM_CONVERTER( UIActivityIndicatorViewStyle, (@{ - @"large" : @(UIActivityIndicatorViewStyleWhiteLarge), - @"small" : @(UIActivityIndicatorViewStyleWhite), + @"large" : @(UIActivityIndicatorViewStyleLarge), + @"small" : @(UIActivityIndicatorViewStyleMedium), }), - UIActivityIndicatorViewStyleWhiteLarge, + UIActivityIndicatorViewStyleLarge, integerValue) @end diff --git a/packages/react-native/React/Views/RCTComponentData.m b/packages/react-native/React/Views/RCTComponentData.m index 94b30a63480523..da9f8206138fde 100644 --- a/packages/react-native/React/Views/RCTComponentData.m +++ b/packages/react-native/React/Views/RCTComponentData.m @@ -15,6 +15,7 @@ #import "RCTConstants.h" #import "RCTConvert.h" #import "RCTEventDispatcherProtocol.h" +#import "RCTModuleMethod.h" #import "RCTParserUtils.h" #import "RCTShadowView.h" #import "RCTUtils.h" @@ -385,6 +386,34 @@ - (void)setProps:(NSDictionary *)props forShadowView:(RCTShadowV }]; } ++ (NSDictionary *)commandsForViewMangerClass:(Class)managerClass + methods:(Method *)methods + methodCount:(unsigned int)methodCount +{ + NSMutableDictionary *commands = [NSMutableDictionary new]; + static const char *prefix = "__rct_export__"; + const unsigned int prefixLength = strlen(prefix); + int commandCount = 0; + for (int i = 0; i < methodCount; i++) { + SEL selector = method_getName(methods[i]); + const char *selectorName = sel_getName(selector); + if (strncmp(selectorName, prefix, prefixLength) != 0) { + continue; + } + RCTMethodInfo *methodInfo = ((RCTMethodInfo * (*)(id, SEL)) objc_msgSend)(managerClass, selector); + RCTModuleMethod *moduleMethod = [[RCTModuleMethod alloc] initWithExportedMethod:methodInfo + moduleClass:managerClass]; + NSString *methodName = @(moduleMethod.JSMethodName); + commands[methodName] = @(commandCount); + commandCount += 1; + } + // View manager do not export getConstants with RCT_EXPORT_METHOD, so we inject it into "Commands" manually. + if (commandCount > 0) { + commands[@"getConstants"] = @(commandCount); + } + return commands; +} + + (NSDictionary *)viewConfigForViewMangerClass:(Class)managerClass { NSMutableArray *bubblingEvents = [NSMutableArray new]; @@ -442,6 +471,10 @@ - (void)setProps:(NSDictionary *)props forShadowView:(RCTShadowV propTypes[name] = type; } } + + NSDictionary *commands = [self commandsForViewMangerClass:managerClass + methods:methods + methodCount:count]; free(methods); #if RCT_DEBUG @@ -464,6 +497,7 @@ - (void)setProps:(NSDictionary *)props forShadowView:(RCTShadowV @"bubblingEvents" : bubblingEvents, @"capturingEvents" : capturingEvents, @"baseModuleName" : superClass == [NSObject class] ? (id)kCFNull : RCTViewManagerModuleNameForClass(superClass), + @"Commands" : commands, }; } diff --git a/packages/react-native/React/Views/RCTView.h b/packages/react-native/React/Views/RCTView.h index fc5e2217cf5266..200d8b451bf59e 100644 --- a/packages/react-native/React/Views/RCTView.h +++ b/packages/react-native/React/Views/RCTView.h @@ -132,5 +132,7 @@ extern const UIAccessibilityTraits SwitchAccessibilityTrait; @property (nonatomic, assign) RCTCapturingEventBlock onPointerLeave; @property (nonatomic, assign) RCTBubblingEventBlock onPointerOver; @property (nonatomic, assign) RCTBubblingEventBlock onPointerOut; +@property (nonatomic, assign) RCTBubblingEventBlock onGotPointerCapture; +@property (nonatomic, assign) RCTBubblingEventBlock onLostPointerCapture; @end diff --git a/packages/react-native/React/Views/RCTViewManager.m b/packages/react-native/React/Views/RCTViewManager.m index 9a0af4e74cecb9..eb3ff9c00d882e 100644 --- a/packages/react-native/React/Views/RCTViewManager.m +++ b/packages/react-native/React/Views/RCTViewManager.m @@ -549,5 +549,7 @@ - (void)updateAccessibilityTraitsForRole:(RCTView *)view withDefaultView:(RCTVie RCT_EXPORT_VIEW_PROPERTY(onPointerLeave, RCTCapturingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onPointerOver, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onPointerOut, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onGotPointerCapture, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onLostPointerCapture, RCTBubblingEventBlock) @end diff --git a/packages/react-native/ReactAndroid/build.gradle b/packages/react-native/ReactAndroid/build.gradle index 25ba3cbcda958c..82b1494a08269e 100644 --- a/packages/react-native/ReactAndroid/build.gradle +++ b/packages/react-native/ReactAndroid/build.gradle @@ -185,6 +185,10 @@ final def preparePrefab = tasks.register("preparePrefab", PreparePrefabHeadersTa new Pair("src/main/jni/react/jni", "react/jni/"), ] ), + new PrefabPreprocessingEntry( + "react_utils", + new Pair("../ReactCommon/react/utils/", "react/utils/"), + ), new PrefabPreprocessingEntry( "react_render_imagemanager", [ @@ -332,6 +336,23 @@ task downloadGlog(dependsOn: createNativeDepsDirectories, type: Download) { dest(new File(downloadsDir, "glog-${GLOG_VERSION}.tar.gz")) } +task downloadGtest(dependsOn: createNativeDepsDirectories, type: Download) { + src("https://github.com/google/googletest/archive/refs/tags/release-${GTEST_VERSION}.tar.gz") + onlyIfModified(true) + overwrite(false) + retries(5) + dest(new File(downloadsDir, "gtest.tar.gz")) +} + +task prepareGtest(dependsOn: dependenciesPath ? [] : [downloadGtest], type: Copy) { + from(dependenciesPath ?: tarTree(downloadGtest.dest)) + eachFile { fname -> { + fname.path = (fname.path - "googletest-release-${GTEST_VERSION}/") + } + } + into(new File(thirdPartyNdkDir,"googletest")) +} + // Prepare glog sources to be compiled, this task will perform steps that normally should've been // executed by automake. This way we can avoid dependencies on make/automake final def prepareGlog = tasks.register("prepareGlog", PrepareGlogTask) { @@ -356,6 +377,7 @@ task downloadNdkBuildDependencies { dependsOn(downloadGlog) dependsOn(downloadFmt) dependsOn(downloadLibevent) + dependsOn(downloadGtest) } /** @@ -436,7 +458,7 @@ android { namespace "com.facebook.react" // Used to override the NDK path/version on internal CI or by allowing - // users to customize the NDK path/version from their root project (e.g. for M1 support) + // users to customize the NDK path/version from their root project (e.g. for Apple Silicon support) if (rootProject.hasProperty("ndkPath")) { ndkPath rootProject.ext.ndkPath } @@ -449,6 +471,11 @@ android { targetCompatibility = JavaVersion.VERSION_11 } + kotlinOptions { + // Using '-Xjvm-default=all' to generate default java methods for interfaces + freeCompilerArgs = ['-Xjvm-default=all'] + } + defaultConfig { minSdk = 21 targetSdk = 33 @@ -481,6 +508,11 @@ android { targets "jsijniprofiler", "reactnativeblob", "reactperfloggerjni", + "bridgeless", + "rninstance", + "hermesinstancejni", + "uimanagerjni", + "jscinstance", // prefab targets "reactnativejni", "react_render_debug", @@ -488,6 +520,7 @@ android { "runtimeexecutor", "react_codegen_rncore", "react_debug", + "react_utils", "react_render_componentregistry", "react_newarchdefaults", "react_render_animations", @@ -536,7 +569,7 @@ android { } } - preBuild.dependsOn(prepareJSC, prepareBoost, prepareDoubleConversion, prepareFmt, prepareFolly, prepareGlog, prepareLibevent) + preBuild.dependsOn(prepareJSC, prepareBoost, prepareDoubleConversion, prepareFmt, prepareFolly, prepareGlog, prepareLibevent, prepareGtest) preBuild.dependsOn("generateCodegenArtifactsFromSchema") preBuild.dependsOn(preparePrefab) @@ -567,6 +600,7 @@ android { buildFeatures { prefab true prefabPublishing !skipPrefabPublishing + buildConfig true } prefab { @@ -585,6 +619,9 @@ android { react_debug { headers(new File(prefabHeadersDir, "react_debug").absolutePath) } + react_utils { + headers(new File(prefabHeadersDir, "react_utils").absolutePath) + } react_render_componentregistry { headers(new File(prefabHeadersDir, "react_render_componentregistry").absolutePath) } @@ -682,6 +719,7 @@ dependencies { api("com.facebook.fbjni:fbjni:${FBJNI_VERSION}") api("com.facebook.fresco:fresco:${FRESCO_VERSION}") + api("com.facebook.fresco:middleware:${FRESCO_VERSION}") api("com.facebook.fresco:imagepipeline-okhttp3:${FRESCO_VERSION}") api("com.facebook.fresco:ui-common:${FRESCO_VERSION}") api("com.facebook.infer.annotation:infer-annotation:${INFER_ANNOTATIONS_VERSION}") @@ -721,6 +759,8 @@ react { } kotlin { + // We intentionally don't build on JDK 17 as our tests are broken due to Mockito/PowerMock + // not running well on JDK 17. jvmToolchain(11) } diff --git a/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake b/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake index 2cb77c4f77d49f..a24bd464d51a40 100644 --- a/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake +++ b/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake @@ -68,6 +68,7 @@ add_library(turbomodulejsijni ALIAS ReactAndroid::turbomodulejsijni) add_library(runtimeexecutor ALIAS ReactAndroid::runtimeexecutor) add_library(react_codegen_rncore ALIAS ReactAndroid::react_codegen_rncore) add_library(react_debug ALIAS ReactAndroid::react_debug) +add_library(react_utils ALIAS ReactAndroid::react_utils) add_library(react_render_componentregistry ALIAS ReactAndroid::react_render_componentregistry) add_library(react_newarchdefaults ALIAS ReactAndroid::react_newarchdefaults) add_library(react_render_core ALIAS ReactAndroid::react_render_core) @@ -95,6 +96,7 @@ target_link_libraries(${CMAKE_PROJECT_NAME} jsi # prefab ready react_codegen_rncore # prefab ready react_debug # prefab ready + react_utils # prefab ready react_nativemodule_core # prefab ready react_newarchdefaults # prefab ready react_render_componentregistry # prefab ready diff --git a/packages/react-native/ReactAndroid/flipper-integration/.npmignore b/packages/react-native/ReactAndroid/flipper-integration/.npmignore new file mode 100644 index 00000000000000..b1bfa20d8f87b2 --- /dev/null +++ b/packages/react-native/ReactAndroid/flipper-integration/.npmignore @@ -0,0 +1,2 @@ +# Make sure we never publish the build folders to npm. +build/ diff --git a/packages/react-native/ReactAndroid/flipper-integration/build.gradle b/packages/react-native/ReactAndroid/flipper-integration/build.gradle new file mode 100644 index 00000000000000..b441e405858033 --- /dev/null +++ b/packages/react-native/ReactAndroid/flipper-integration/build.gradle @@ -0,0 +1,61 @@ +/* + * 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. + */ + +plugins { + id("com.android.library") + id("maven-publish") + id("signing") + id("org.jetbrains.kotlin.android") +} + +group = "com.facebook.react" +version = parent.publishing_version + +repositories { + // Normally RNGP will set repositories for all modules, + // but when consumed from source, we need to re-declare + // those repositories as there is no app module there. + mavenCentral() + google() +} + +android { + compileSdk 33 + buildToolsVersion = "33.0.0" + namespace "com.facebook.react.flipper" + + defaultConfig { + minSdk = 21 + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlin { + jvmToolchain(11) + } + + dependencies { + implementation project(':packages:react-native:ReactAndroid') + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") + debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { + exclude group:'com.squareup.okhttp3', module:'okhttp' + } + debugImplementation("com.facebook.fresco:flipper-fresco-plugin:${FLIPPER_FRESCO_VERSION}") + } + + publishing { + multipleVariants { + withSourcesJar() + allVariants() + } + } +} + +apply from: "../publish.gradle" diff --git a/packages/react-native/ReactAndroid/flipper-integration/gradle.properties b/packages/react-native/ReactAndroid/flipper-integration/gradle.properties new file mode 100644 index 00000000000000..aa09105bf10e2d --- /dev/null +++ b/packages/react-native/ReactAndroid/flipper-integration/gradle.properties @@ -0,0 +1,3 @@ +# Version of flipper SDK to use for this integration +FLIPPER_VERSION=0.201.0 +FLIPPER_FRESCO_VERSION=3.0.0 diff --git a/packages/react-native/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.kt b/packages/react-native/ReactAndroid/flipper-integration/src/debug/java/com/facebook/react/flipper/ReactNativeFlipper.kt similarity index 91% rename from packages/react-native/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.kt rename to packages/react-native/ReactAndroid/flipper-integration/src/debug/java/com/facebook/react/flipper/ReactNativeFlipper.kt index c628808885f896..ecbef22f773105 100644 --- a/packages/react-native/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.kt +++ b/packages/react-native/ReactAndroid/flipper-integration/src/debug/java/com/facebook/react/flipper/ReactNativeFlipper.kt @@ -1,4 +1,11 @@ -package com.helloworld +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.flipper import android.content.Context import com.facebook.flipper.android.AndroidFlipperClient @@ -21,6 +28,7 @@ import com.facebook.react.modules.network.NetworkingModule * flavor of it. Here you can add your own plugins and customize the Flipper setup. */ object ReactNativeFlipper { + @JvmStatic fun initializeFlipper(context: Context, reactInstanceManager: ReactInstanceManager) { if (FlipperUtils.shouldEnableFlipper(context)) { val client = AndroidFlipperClient.getInstance(context) diff --git a/packages/react-native/template/android/app/src/release/java/com/helloworld/ReactNativeFlipper.kt b/packages/react-native/ReactAndroid/flipper-integration/src/release/java/com/facebook/react/flipper/ReactNativeFlipper.kt similarity index 66% rename from packages/react-native/template/android/app/src/release/java/com/helloworld/ReactNativeFlipper.kt rename to packages/react-native/ReactAndroid/flipper-integration/src/release/java/com/facebook/react/flipper/ReactNativeFlipper.kt index 5eea0530a745ea..e44f63d8d1db66 100644 --- a/packages/react-native/template/android/app/src/release/java/com/helloworld/ReactNativeFlipper.kt +++ b/packages/react-native/ReactAndroid/flipper-integration/src/release/java/com/facebook/react/flipper/ReactNativeFlipper.kt @@ -1,4 +1,11 @@ -package com.helloworld +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.flipper import android.content.Context import com.facebook.react.ReactInstanceManager @@ -9,6 +16,7 @@ import com.facebook.react.ReactInstanceManager */ object ReactNativeFlipper { @Suppress("UNUSED_PARAMETER") + @JvmStatic fun initializeFlipper(context: Context, reactInstanceManager: ReactInstanceManager) { // Do nothing as we don't want to initialize Flipper on Release. } diff --git a/packages/react-native/ReactAndroid/gradle.properties b/packages/react-native/ReactAndroid/gradle.properties index 5843fa9dfbb21a..4b62f038058547 100644 --- a/packages/react-native/ReactAndroid/gradle.properties +++ b/packages/react-native/ReactAndroid/gradle.properties @@ -7,8 +7,8 @@ ANDROIDX_AUTOFILL_VERSION=1.1.0 ANDROIDX_TEST_VERSION=1.1.0 ANDROIDX_TRACING_VERSION=1.1.0 ASSERTJ_VERSION=3.21.0 -FBJNI_VERSION=0.3.0 -FRESCO_VERSION=2.5.0 +FBJNI_VERSION=0.4.0 +FRESCO_VERSION=3.0.0 INFER_ANNOTATIONS_VERSION=0.18.0 JAVAX_INJECT_VERSION=1 JSR305_VERSION=3.0.2 @@ -29,6 +29,11 @@ FMT_VERSION=6.2.1 FOLLY_VERSION=2021.07.22.00 GLOG_VERSION=0.3.5 LIBEVENT_VERSION=2.1.12 +GTEST_VERSION=1.12.1 android.useAndroidX=true android.enableJetifier=true + +# We want to have more fine grained control on the Java version for +# ReactAndroid, therefore we disable RGNP Java version alignment mechanism +react.internal.disableJavaVersionAlignment=true diff --git a/packages/react-native/ReactAndroid/hermes-engine/build.gradle b/packages/react-native/ReactAndroid/hermes-engine/build.gradle index c1fceaaeec7747..88f47e54b963ff 100644 --- a/packages/react-native/ReactAndroid/hermes-engine/build.gradle +++ b/packages/react-native/ReactAndroid/hermes-engine/build.gradle @@ -42,6 +42,16 @@ def downloadsDir = customDownloadDir ? new File(customDownloadDir) : new File(re def overrideHermesDir = System.getenv("REACT_NATIVE_OVERRIDE_HERMES_DIR") != null def hermesDir = System.getenv("REACT_NATIVE_OVERRIDE_HERMES_DIR") ?: new File(reactNativeRootDir, "sdks/hermes") def hermesBuildDir = new File("$buildDir/hermes") +def hermesCOutputBinary = new File("$buildDir/hermes/bin/hermesc") +// This filetree represents the file of the Hermes build that we want as input/output +// of the buildHermesC task. Gradle will compute the hash of files in the file tree +// and won't rebuilt hermesc unless those files are changing. +def hermesBuildOutputFileTree = fileTree(hermesBuildDir.toString()) + .exclude('**/*.make') + .exclude('**/*.internal') + .exclude('**/external/**') + .exclude('**/hermes.framework/**') + .exclude('**/bin/hermesc') def hermesVersion = "main" def hermesVersionFile = new File(reactNativeRootDir, "sdks/.hermesversion") @@ -86,12 +96,36 @@ task unzipHermes(dependsOn: downloadHermes, type: Copy) { task configureBuildForHermes(type: Exec) { workingDir(hermesDir) - commandLine(windowsAwareCommandLine(findCmakePath(cmakeVersion), Os.isFamily(Os.FAMILY_WINDOWS) ? "-GNMake Makefiles" : "", "-S", ".", "-B", hermesBuildDir.toString(), "-DJSI_DIR=" + jsiDir.absolutePath)) + inputs.dir(hermesDir) + outputs.files(hermesBuildOutputFileTree) + commandLine( + windowsAwareCommandLine( + findCmakePath(cmakeVersion), + Os.isFamily(Os.FAMILY_WINDOWS) ? "-GNMake Makefiles" : "", + "-S", + ".", + "-B", + hermesBuildDir.toString(), + "-DJSI_DIR=" + jsiDir.absolutePath + ) + ) } -task buildHermes(dependsOn: configureBuildForHermes, type: Exec) { +task buildHermesC(dependsOn: configureBuildForHermes, type: Exec) { workingDir(hermesDir) - commandLine(windowsAwareCommandLine(findCmakePath(cmakeVersion), "--build", hermesBuildDir.toString(), "--target", "hermesc", "-j", ndkBuildJobs)) + inputs.files(hermesBuildOutputFileTree) + outputs.file(hermesCOutputBinary) + commandLine( + windowsAwareCommandLine( + findCmakePath(cmakeVersion), + "--build", + hermesBuildDir.toString(), + "--target", + "hermesc", + "-j", + ndkBuildJobs, + ) + ) } task prepareHeadersForPrefab(type: Copy) { @@ -130,7 +164,7 @@ android { namespace "com.facebook.hermes" // Used to override the NDK path/version on internal CI or by allowing - // users to customize the NDK path/version from their root project (e.g. for M1 support) + // users to customize the NDK path/version from their root project (e.g. for Apple Silicon support) if (rootProject.hasProperty("ndkPath")) { ndkPath rootProject.ext.ndkPath } @@ -191,6 +225,8 @@ android { externalNativeBuild { cmake { arguments "-DCMAKE_BUILD_TYPE=MinSizeRel" + // For release builds, we don't want to enable the Hermes Debugger. + arguments "-DHERMES_ENABLE_DEBUGGER=False" } } } @@ -202,6 +238,8 @@ android { } kotlin { + // We intentionally don't build on JDK 17 to keep this version aligned with + // the JVM toolchain of :ReactAndroid jvmToolchain(11) } @@ -220,8 +258,8 @@ android { } dependencies { - implementation("com.facebook.fbjni:fbjni:0.3.0") - implementation("com.facebook.soloader:soloader:0.10.4") + implementation("com.facebook.fbjni:fbjni:0.4.0") + implementation("com.facebook.soloader:soloader:0.10.5") implementation("com.facebook.yoga:proguard-annotations:1.19.0") implementation("androidx.annotation:annotation:1.3.0") } @@ -254,9 +292,9 @@ afterEvaluate { configureBuildForHermes.dependsOn(unzipHermes) prepareHeadersForPrefab.dependsOn(unzipHermes) } - preBuild.dependsOn(buildHermes) + preBuild.dependsOn(buildHermesC) preBuild.dependsOn(prepareHeadersForPrefab) - prepareHeadersForPrefab.dependsOn(buildHermes) + prepareHeadersForPrefab.dependsOn(buildHermesC) } /* Publishing Configuration */ diff --git a/packages/react-native/ReactAndroid/src/androidTest/java/com/facebook/react/testing/FakeAsyncLocalStorage.java b/packages/react-native/ReactAndroid/src/androidTest/java/com/facebook/react/testing/FakeAsyncLocalStorage.java deleted file mode 100644 index d544be393a9acc..00000000000000 --- a/packages/react-native/ReactAndroid/src/androidTest/java/com/facebook/react/testing/FakeAsyncLocalStorage.java +++ /dev/null @@ -1,56 +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. - */ - -package com.facebook.react.testing; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.BaseJavaModule; -import com.facebook.react.bridge.Callback; -import com.facebook.react.bridge.ReactMethod; -import com.facebook.react.bridge.ReadableArray; -import com.facebook.react.bridge.WritableMap; - -/** Dummy implementation of storage module, used for testing */ -public final class FakeAsyncLocalStorage extends BaseJavaModule { - - private static WritableMap errorMessage; - - static { - errorMessage = Arguments.createMap(); - errorMessage.putString("message", "Fake Async Local Storage"); - } - - @Override - public String getName() { - return "AsyncSQLiteDBStorage"; - } - - @ReactMethod - public void multiGet(final ReadableArray keys, final Callback callback) { - callback.invoke(errorMessage, null); - } - - @ReactMethod - public void multiSet(final ReadableArray keyValueArray, final Callback callback) { - callback.invoke(errorMessage); - } - - @ReactMethod - public void multiRemove(final ReadableArray keys, final Callback callback) { - callback.invoke(errorMessage); - } - - @ReactMethod - public void clear(Callback callback) { - callback.invoke(errorMessage); - } - - @ReactMethod - public void getAllKeys(final Callback callback) { - callback.invoke(errorMessage, null); - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/BridgelessReactPackage.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/BridgelessReactPackage.java new file mode 100644 index 00000000000000..14d361b0499475 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/BridgelessReactPackage.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react; + +import com.facebook.infer.annotation.Nullsafe; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.devsupport.LogBoxModule; +import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.module.annotations.ReactModule; +import com.facebook.react.module.annotations.ReactModuleList; +import com.facebook.react.module.model.ReactModuleInfo; +import com.facebook.react.module.model.ReactModuleInfoProvider; +import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.modules.debug.DevSettingsModule; +import com.facebook.react.modules.debug.SourceCodeModule; +import com.facebook.react.modules.deviceinfo.DeviceInfoModule; +import com.facebook.react.modules.systeminfo.AndroidInfoModule; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.HashMap; +import java.util.Map; + +@Nullsafe(Nullsafe.Mode.LOCAL) +@ReactModuleList( + nativeModules = { + AndroidInfoModule.class, + DeviceInfoModule.class, + DevSettingsModule.class, + SourceCodeModule.class, + LogBoxModule.class, + DeviceEventManagerModule.class, + }) +public class BridgelessReactPackage extends TurboReactPackage { + + private DevSupportManager mDevSupportManager; + private DefaultHardwareBackBtnHandler mHardwareBackBtnHandler; + + public BridgelessReactPackage( + DevSupportManager devSupportManager, DefaultHardwareBackBtnHandler hardwareBackBtnHandler) { + mDevSupportManager = devSupportManager; + mHardwareBackBtnHandler = hardwareBackBtnHandler; + } + + @Override + public NativeModule getModule(String name, ReactApplicationContext reactContext) { + switch (name) { + case AndroidInfoModule.NAME: + return new AndroidInfoModule(reactContext); + case DeviceInfoModule.NAME: + return new DeviceInfoModule(reactContext); + case SourceCodeModule.NAME: + return new SourceCodeModule(reactContext); + case DevSettingsModule.NAME: + return new DevSettingsModule(reactContext, mDevSupportManager); + case DeviceEventManagerModule.NAME: + return new DeviceEventManagerModule(reactContext, mHardwareBackBtnHandler); + case LogBoxModule.NAME: + return new LogBoxModule(reactContext, mDevSupportManager); + default: + throw new IllegalArgumentException( + "In BridgelessReactPackage, could not find Native module for " + name); + } + } + + @Override + public ReactModuleInfoProvider getReactModuleInfoProvider() { + try { + Class reactModuleInfoProviderClass = + Class.forName("com.facebook.react.CoreModulesPackage$$ReactModuleInfoProvider"); + return (ReactModuleInfoProvider) reactModuleInfoProviderClass.newInstance(); + } catch (ClassNotFoundException e) { + // In OSS case, the annotation processor does not run. We fall back on creating this byhand + Class[] moduleList = + new Class[] { + AndroidInfoModule.class, + DeviceInfoModule.class, + SourceCodeModule.class, + DevSettingsModule.class, + DeviceEventManagerModule.class, + LogBoxModule.class, + }; + final Map reactModuleInfoMap = new HashMap<>(); + for (Class moduleClass : moduleList) { + ReactModule reactModule = moduleClass.getAnnotation(ReactModule.class); + if (reactModule != null) { + reactModuleInfoMap.put( + reactModule.name(), + new ReactModuleInfo( + reactModule.name(), + moduleClass.getName(), + reactModule.canOverrideExistingModule(), + reactModule.needsEagerInit(), + reactModule.hasConstants(), + reactModule.isCxxModule(), + TurboModule.class.isAssignableFrom(moduleClass))); + } + } + return new ReactModuleInfoProvider() { + @Override + public Map getReactModuleInfos() { + return reactModuleInfoMap; + } + }; + } catch (InstantiationException e) { + throw new RuntimeException( + "No ReactModuleInfoProvider for CoreModulesPackage$$ReactModuleInfoProvider", e); + } catch (IllegalAccessException e) { + throw new RuntimeException( + "No ReactModuleInfoProvider for CoreModulesPackage$$ReactModuleInfoProvider", e); + } + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java index 82b3fee2a850a3..54921eec630d8c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java @@ -15,10 +15,11 @@ import android.os.Build; import android.os.Bundle; import android.view.KeyEvent; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.Callback; +import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.interfaces.ReactHostInterface; import com.facebook.react.modules.core.PermissionListener; /** @@ -56,7 +57,7 @@ public ReactActivityDelegate(ReactActivity activity, @Nullable String mainCompon return null; } - protected @NonNull Bundle composeLaunchOptions() { + protected @Nullable Bundle composeLaunchOptions() { Bundle composedLaunchOptions = getLaunchOptions(); if (isFabricEnabled()) { if (composedLaunchOptions == null) { @@ -86,6 +87,10 @@ protected ReactNativeHost getReactNativeHost() { return ((ReactApplication) getPlainActivity().getApplication()).getReactNativeHost(); } + public ReactHostInterface getReactHost() { + return ((ReactApplication) getPlainActivity().getApplication()).getReactHostInterface(); + } + public ReactInstanceManager getReactInstanceManager() { return mReactDelegate.getReactInstanceManager(); } @@ -97,14 +102,19 @@ public String getMainComponentName() { protected void onCreate(Bundle savedInstanceState) { String mainComponentName = getMainComponentName(); final Bundle launchOptions = composeLaunchOptions(); - mReactDelegate = - new ReactDelegate( - getPlainActivity(), getReactNativeHost(), mainComponentName, launchOptions) { - @Override - protected ReactRootView createRootView() { - return ReactActivityDelegate.this.createRootView(launchOptions); - } - }; + if (ReactFeatureFlags.enableBridgelessArchitecture) { + mReactDelegate = + new ReactDelegate(getPlainActivity(), getReactHost(), mainComponentName, launchOptions); + } else { + mReactDelegate = + new ReactDelegate( + getPlainActivity(), getReactNativeHost(), mainComponentName, launchOptions) { + @Override + protected ReactRootView createRootView() { + return ReactActivityDelegate.this.createRootView(launchOptions); + } + }; + } if (mainComponentName != null) { loadApp(mainComponentName); } @@ -137,11 +147,13 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } public boolean onKeyDown(int keyCode, KeyEvent event) { - if (getReactNativeHost().hasInstance() - && getReactNativeHost().getUseDeveloperSupport() - && keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { - event.startTracking(); - return true; + if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (getReactNativeHost().hasInstance() + && getReactNativeHost().getUseDeveloperSupport() + && keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { + event.startTracking(); + return true; + } } return false; } @@ -151,11 +163,13 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { } public boolean onKeyLongPress(int keyCode, KeyEvent event) { - if (getReactNativeHost().hasInstance() - && getReactNativeHost().getUseDeveloperSupport() - && keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { - getReactNativeHost().getReactInstanceManager().showDevOptionsDialog(); - return true; + if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (getReactNativeHost().hasInstance() + && getReactNativeHost().getUseDeveloperSupport() + && keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { + getReactNativeHost().getReactInstanceManager().showDevOptionsDialog(); + return true; + } } return false; } @@ -165,22 +179,28 @@ public boolean onBackPressed() { } public boolean onNewIntent(Intent intent) { - if (getReactNativeHost().hasInstance()) { - getReactNativeHost().getReactInstanceManager().onNewIntent(intent); - return true; + if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (getReactNativeHost().hasInstance()) { + getReactNativeHost().getReactInstanceManager().onNewIntent(intent); + return true; + } } return false; } public void onWindowFocusChanged(boolean hasFocus) { - if (getReactNativeHost().hasInstance()) { - getReactNativeHost().getReactInstanceManager().onWindowFocusChange(hasFocus); + if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (getReactNativeHost().hasInstance()) { + getReactNativeHost().getReactInstanceManager().onWindowFocusChange(hasFocus); + } } } public void onConfigurationChanged(Configuration newConfig) { - if (getReactNativeHost().hasInstance()) { - getReactInstanceManager().onConfigurationChanged(getContext(), newConfig); + if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (getReactNativeHost().hasInstance()) { + getReactInstanceManager().onConfigurationChanged(getContext(), newConfig); + } } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.java deleted file mode 100644 index b8abe0cf16980f..00000000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.java +++ /dev/null @@ -1,26 +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. - */ - -package com.facebook.react; - -import androidx.annotation.Nullable; -import com.facebook.react.interfaces.ReactHostInterface; - -/** Interface that represents an instance of a React Native application */ -public interface ReactApplication { - - /** Get the default {@link ReactNativeHost} for this app. */ - ReactNativeHost getReactNativeHost(); - - /** - * Get the default {@link ReactHostInterface} for this app. This method will be used by the new - * architecture of react native - */ - default @Nullable ReactHostInterface getReactHostInterface() { - return null; - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.kt new file mode 100644 index 00000000000000..2712ae20eb72ac --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react + +import com.facebook.react.common.annotations.UnstableReactNativeAPI +import com.facebook.react.interfaces.ReactHostInterface + +@OptIn(UnstableReactNativeAPI::class) +/** Interface that represents an instance of a React Native application */ +interface ReactApplication { + /** Get the default [ReactNativeHost] for this app. */ + val reactNativeHost: ReactNativeHost + + /** + * Get the default [ReactHostInterface] for this app. This method will be used by the new + * architecture of react native + */ + val reactHostInterface: ReactHostInterface? + get() = null +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java index 3f6934a33f2f5a..0ed6f7d20a762f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java @@ -14,7 +14,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.devsupport.DoubleTapReloadRecognizer; +import com.facebook.react.interfaces.ReactHostInterface; +import com.facebook.react.interfaces.ReactSurfaceInterface; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; /** @@ -32,7 +35,9 @@ public class ReactDelegate { @Nullable private DoubleTapReloadRecognizer mDoubleTapReloadRecognizer; - private ReactNativeHost mReactNativeHost; + @Nullable private ReactNativeHost mReactNativeHost; + @Nullable private ReactHostInterface mReactHost; + @Nullable private ReactSurfaceInterface mReactSurface; private boolean mFabricEnabled = false; @@ -48,6 +53,18 @@ public ReactDelegate( mReactNativeHost = reactNativeHost; } + public ReactDelegate( + Activity activity, + ReactHostInterface reactHost, + @Nullable String appKey, + @Nullable Bundle launchOptions) { + mActivity = activity; + mMainComponentName = appKey; + mLaunchOptions = launchOptions; + mDoubleTapReloadRecognizer = new DoubleTapReloadRecognizer(); + mReactHost = reactHost; + } + public ReactDelegate( Activity activity, ReactNativeHost reactNativeHost, @@ -63,48 +80,72 @@ public ReactDelegate( } public void onHostResume() { - if (getReactNativeHost().hasInstance()) { + if (ReactFeatureFlags.enableBridgelessArchitecture) { if (mActivity instanceof DefaultHardwareBackBtnHandler) { - getReactNativeHost() - .getReactInstanceManager() - .onHostResume(mActivity, (DefaultHardwareBackBtnHandler) mActivity); - } else { - throw new ClassCastException( - "Host Activity does not implement DefaultHardwareBackBtnHandler"); + mReactHost.onHostResume(mActivity, (DefaultHardwareBackBtnHandler) mActivity); + } + } else { + if (getReactNativeHost().hasInstance()) { + if (mActivity instanceof DefaultHardwareBackBtnHandler) { + getReactNativeHost() + .getReactInstanceManager() + .onHostResume(mActivity, (DefaultHardwareBackBtnHandler) mActivity); + } else { + throw new ClassCastException( + "Host Activity does not implement DefaultHardwareBackBtnHandler"); + } } } } public void onHostPause() { - if (getReactNativeHost().hasInstance()) { - getReactNativeHost().getReactInstanceManager().onHostPause(mActivity); + if (ReactFeatureFlags.enableBridgelessArchitecture) { + mReactHost.onHostPause(mActivity); + } else { + if (getReactNativeHost().hasInstance()) { + getReactNativeHost().getReactInstanceManager().onHostPause(mActivity); + } } } public void onHostDestroy() { - if (mReactRootView != null) { - mReactRootView.unmountReactApplication(); - mReactRootView = null; - } - if (getReactNativeHost().hasInstance()) { - getReactNativeHost().getReactInstanceManager().onHostDestroy(mActivity); + if (ReactFeatureFlags.enableBridgelessArchitecture) { + mReactHost.onHostDestroy(mActivity); + } else { + if (mReactRootView != null) { + mReactRootView.unmountReactApplication(); + mReactRootView = null; + } + if (getReactNativeHost().hasInstance()) { + getReactNativeHost().getReactInstanceManager().onHostDestroy(mActivity); + } } } public boolean onBackPressed() { - if (getReactNativeHost().hasInstance()) { - getReactNativeHost().getReactInstanceManager().onBackPressed(); + if (ReactFeatureFlags.enableBridgelessArchitecture) { + mReactHost.onBackPressed(); return true; + } else { + if (getReactNativeHost().hasInstance()) { + getReactNativeHost().getReactInstanceManager().onBackPressed(); + return true; + } } return false; } public void onActivityResult( int requestCode, int resultCode, Intent data, boolean shouldForwardToReactInstance) { - if (getReactNativeHost().hasInstance() && shouldForwardToReactInstance) { - getReactNativeHost() - .getReactInstanceManager() - .onActivityResult(mActivity, requestCode, resultCode, data); + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO T156475655: Implement onActivityResult for Bridgeless + return; + } else { + if (getReactNativeHost().hasInstance() && shouldForwardToReactInstance) { + getReactNativeHost() + .getReactInstanceManager() + .onActivityResult(mActivity, requestCode, resultCode, data); + } } } @@ -113,16 +154,31 @@ public void loadApp() { } public void loadApp(String appKey) { - if (mReactRootView != null) { - throw new IllegalStateException("Cannot loadApp while app is already running."); + // With Bridgeless enabled, create and start the surface + if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (mReactSurface == null) { + // Create a ReactSurface + mReactSurface = mReactHost.createSurface(mActivity, appKey, mLaunchOptions); + // Set main Activity's content view + mActivity.setContentView(mReactSurface.getView()); + } + mReactSurface.start(); + } else { + if (mReactRootView != null) { + throw new IllegalStateException("Cannot loadApp while app is already running."); + } + mReactRootView = createRootView(); + mReactRootView.startReactApplication( + getReactNativeHost().getReactInstanceManager(), appKey, mLaunchOptions); } - mReactRootView = createRootView(); - mReactRootView.startReactApplication( - getReactNativeHost().getReactInstanceManager(), appKey, mLaunchOptions); } public ReactRootView getReactRootView() { - return mReactRootView; + if (ReactFeatureFlags.enableBridgelessArchitecture) { + return (ReactRootView) mReactSurface.getView(); + } else { + return mReactRootView; + } } protected ReactRootView createRootView() { @@ -139,7 +195,11 @@ protected ReactRootView createRootView() { * application. */ public boolean shouldShowDevMenuOrReload(int keyCode, KeyEvent event) { - if (getReactNativeHost().hasInstance() && getReactNativeHost().getUseDeveloperSupport()) { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO T156475655: Implement shouldShowDevMenuOrReload for Bridgeless + return false; + } else if (getReactNativeHost().hasInstance() + && getReactNativeHost().getUseDeveloperSupport()) { if (keyCode == KeyEvent.KEYCODE_MENU) { getReactNativeHost().getReactInstanceManager().showDevOptionsDialog(); return true; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index ef93f0c332e3b0..7a56f1d1345f5c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -185,7 +185,7 @@ public interface ReactInstanceEventListener private final @Nullable JSIModulePackage mJSIModulePackage; private final @Nullable ReactPackageTurboModuleManagerDelegate.Builder mTMMDelegateBuilder; private List mViewManagers; - private boolean mUseFallbackBundle = false; + private boolean mUseFallbackBundle = true; private class ReactContextInitParams { private final JavaScriptExecutorFactory mJsExecutorFactory; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index f0a0b7dbef5a23..8142f72c9271e4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -193,21 +193,15 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } } - @Override - public void onChildStartedNativeGesture(MotionEvent ev) { - onChildStartedNativeGesture(null, ev); - } - @Override public void onChildStartedNativeGesture(View childView, MotionEvent ev) { if (!isDispatcherReady()) { return; } - ReactContext reactContext = getCurrentReactContext(); - UIManager uiManager = UIManagerHelper.getUIManager(reactContext, getUIManagerType()); - if (uiManager != null) { - EventDispatcher eventDispatcher = uiManager.getEventDispatcher(); + EventDispatcher eventDispatcher = + UIManagerHelper.getEventDispatcher(getCurrentReactContext(), getUIManagerType()); + if (eventDispatcher != null) { mJSTouchDispatcher.onChildStartedNativeGesture(ev, eventDispatcher); if (childView != null && mJSPointerDispatcher != null) { mJSPointerDispatcher.onChildStartedNativeGesture(childView, ev, eventDispatcher); @@ -220,11 +214,10 @@ public void onChildEndedNativeGesture(View childView, MotionEvent ev) { if (!isDispatcherReady()) { return; } - ReactContext reactContext = getCurrentReactContext(); - UIManager uiManager = UIManagerHelper.getUIManager(reactContext, getUIManagerType()); - if (uiManager != null) { - EventDispatcher eventDispatcher = uiManager.getEventDispatcher(); + EventDispatcher eventDispatcher = + UIManagerHelper.getEventDispatcher(getCurrentReactContext(), getUIManagerType()); + if (eventDispatcher != null) { mJSTouchDispatcher.onChildEndedNativeGesture(ev, eventDispatcher); if (mJSPointerDispatcher != null) { mJSPointerDispatcher.onChildEndedNativeGesture(); @@ -347,11 +340,10 @@ protected void dispatchJSPointerEvent(MotionEvent event, boolean isCapture) { FLog.w(TAG, "Unable to dispatch pointer events to JS before the dispatcher is available"); return; } - ReactContext reactContext = getCurrentReactContext(); - UIManager uiManager = UIManagerHelper.getUIManager(reactContext, getUIManagerType()); - if (uiManager != null) { - EventDispatcher eventDispatcher = uiManager.getEventDispatcher(); + EventDispatcher eventDispatcher = + UIManagerHelper.getEventDispatcher(getCurrentReactContext(), getUIManagerType()); + if (eventDispatcher != null) { mJSPointerDispatcher.handleMotionEvent(event, eventDispatcher, isCapture); } } @@ -365,11 +357,10 @@ protected void dispatchJSTouchEvent(MotionEvent event) { FLog.w(TAG, "Unable to dispatch touch to JS before the dispatcher is available"); return; } - ReactContext reactContext = getCurrentReactContext(); - UIManager uiManager = UIManagerHelper.getUIManager(reactContext, getUIManagerType()); - if (uiManager != null) { - EventDispatcher eventDispatcher = uiManager.getEventDispatcher(); + EventDispatcher eventDispatcher = + UIManagerHelper.getEventDispatcher(getCurrentReactContext(), getUIManagerType()); + if (eventDispatcher != null) { mJSTouchDispatcher.handleTouchEvent(event, eventDispatcher); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.java index ff722adbb248af..d34624b5410b8d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.java @@ -97,7 +97,7 @@ public final void updateView() { for (Map.Entry entry : mPropNodeMapping.entrySet()) { @Nullable AnimatedNode node = mNativeAnimatedNodesManager.getNodeById(entry.getValue()); if (node == null) { - throw new IllegalArgumentException("Mapped property node does not exists"); + throw new IllegalArgumentException("Mapped property node does not exist"); } else if (node instanceof StyleAnimatedNode) { ((StyleAnimatedNode) node).collectViewUpdates(mPropMap); } else if (node instanceof ValueAnimatedNode) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/StyleAnimatedNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/StyleAnimatedNode.java index ae4b70c215d9e7..478fb34aa4a830 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/StyleAnimatedNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/StyleAnimatedNode.java @@ -38,7 +38,7 @@ public void collectViewUpdates(JavaOnlyMap propsMap) { for (Map.Entry entry : mPropMapping.entrySet()) { @Nullable AnimatedNode node = mNativeAnimatedNodesManager.getNodeById(entry.getValue()); if (node == null) { - throw new IllegalArgumentException("Mapped style node does not exists"); + throw new IllegalArgumentException("Mapped style node does not exist"); } else if (node instanceof TransformAnimatedNode) { ((TransformAnimatedNode) node).collectViewUpdates(propsMap); } else if (node instanceof ValueAnimatedNode) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/TransformAnimatedNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/TransformAnimatedNode.java index 8b3ec593d4ecba..1664bb18f2f9eb 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/TransformAnimatedNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/TransformAnimatedNode.java @@ -66,7 +66,7 @@ public void collectViewUpdates(JavaOnlyMap propsMap) { int nodeTag = ((AnimatedTransformConfig) transformConfig).mNodeTag; AnimatedNode node = mNativeAnimatedNodesManager.getNodeById(nodeTag); if (node == null) { - throw new IllegalArgumentException("Mapped style node does not exists"); + throw new IllegalArgumentException("Mapped style node does not exist"); } else if (node instanceof ValueAnimatedNode) { value = ((ValueAnimatedNode) node).getValue(); } else { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Callback.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Callback.java index da1df73fa7fe2c..495ea9d8067936 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Callback.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Callback.java @@ -18,5 +18,5 @@ public interface Callback { * * @param args arguments passed to javascript callback method via bridge */ - public void invoke(Object... args); + void invoke(Object... args); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java index 4c7c57665cac0c..4c3151cd080fec 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java @@ -20,7 +20,6 @@ public abstract class GuardedAsyncTask extends AsyncTask extends AsyncTask sNativeReactMarkerQueue = new ConcurrentLinkedQueue<>(); + + private static class ReactMarkerRecord { + private final String mMarkerName; + private final long mMarkerTime; + + public ReactMarkerRecord(String markerName, long markerTime) { + mMarkerName = markerName; + mMarkerTime = markerTime; + } + + public String getMarkerName() { + return mMarkerName; + } + + public long getMarkerTime() { + return mMarkerTime; + } + } + public interface MarkerListener { void logMarker(ReactMarkerConstants name, @Nullable String tag, int instanceKey); }; @@ -42,9 +65,6 @@ void logFabricMarker( private static final List sFabricMarkerListeners = new CopyOnWriteArrayList<>(); - // The android app start time that to be set by the corresponding app - private static long sAppStartTime; - @DoNotStrip public static void addListener(MarkerListener listener) { if (!sListeners.contains(listener)) { @@ -135,20 +155,54 @@ public static void logMarker(ReactMarkerConstants name, @Nullable String tag) { } @DoNotStrip + public static void logMarker(ReactMarkerConstants name, long time) { + logMarker(name, null, 0, time); + } + + @DoNotStrip + @AnyThread public static void logMarker(ReactMarkerConstants name, @Nullable String tag, int instanceKey) { + logMarker(name, tag, instanceKey, null); + } + + @DoNotStrip + @AnyThread + public static void logMarker( + ReactMarkerConstants name, @Nullable String tag, int instanceKey, @Nullable Long time) { logFabricMarker(name, tag, instanceKey); for (MarkerListener listener : sListeners) { listener.logMarker(name, tag, instanceKey); } + + notifyNativeMarker(name, time); } @DoNotStrip - public static void setAppStartTime(long appStartTime) { - sAppStartTime = appStartTime; + private static void notifyNativeMarker(ReactMarkerConstants name, @Nullable Long time) { + if (!name.hasMatchingNameMarker()) { + return; + } + + @Nullable Long now = time; + if (now == null) { + now = SystemClock.uptimeMillis(); + } + + if (ReactBridge.isInitialized()) { + // First send the current marker + nativeLogMarker(name.name(), now); + + // Then send all cached native ReactMarkers + while (!sNativeReactMarkerQueue.isEmpty()) { + ReactMarkerRecord record = sNativeReactMarkerQueue.poll(); + nativeLogMarker(record.getMarkerName(), record.getMarkerTime()); + } + } else { + // The native JNI method is not loaded at this point. + sNativeReactMarkerQueue.add(new ReactMarkerRecord(name.name(), now)); + } } @DoNotStrip - public static double getAppStartTime() { - return (double) sAppStartTime; - } + private static native void nativeLogMarker(String markerName, long markerTime); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java index b90a03600bd1d1..ce4f659698e769 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java @@ -9,8 +9,10 @@ /** Constants used by ReactMarker. */ public enum ReactMarkerConstants { + APP_STARTUP_START(true), + APP_STARTUP_END(true), CREATE_REACT_CONTEXT_START, - CREATE_REACT_CONTEXT_END, + CREATE_REACT_CONTEXT_END(true), PROCESS_PACKAGES_START, PROCESS_PACKAGES_END, BUILD_NATIVE_MODULE_REGISTRY_START, @@ -19,8 +21,8 @@ public enum ReactMarkerConstants { CREATE_CATALYST_INSTANCE_END, DESTROY_CATALYST_INSTANCE_START, DESTROY_CATALYST_INSTANCE_END, - RUN_JS_BUNDLE_START, - RUN_JS_BUNDLE_END, + RUN_JS_BUNDLE_START(true), + RUN_JS_BUNDLE_END(true), NATIVE_MODULE_INITIALIZE_START, NATIVE_MODULE_INITIALIZE_END, SETUP_REACT_CONTEXT_START, @@ -32,8 +34,8 @@ public enum ReactMarkerConstants { CREATE_VIEW_MANAGERS_END, CREATE_UI_MANAGER_MODULE_CONSTANTS_START, CREATE_UI_MANAGER_MODULE_CONSTANTS_END, - NATIVE_MODULE_SETUP_START, - NATIVE_MODULE_SETUP_END, + NATIVE_MODULE_SETUP_START(true), + NATIVE_MODULE_SETUP_END(true), CREATE_MODULE_START, CREATE_MODULE_END, PROCESS_CORE_REACT_PACKAGE_START, @@ -59,8 +61,8 @@ public enum ReactMarkerConstants { UNPACKING_JS_BUNDLE_LOADER_CHECK_END, UNPACKING_JS_BUNDLE_LOADER_EXTRACTED, UNPACKING_JS_BUNDLE_LOADER_BLOCKED, - loadApplicationScript_startStringConvert, - loadApplicationScript_endStringConvert, + loadApplicationScript_startStringConvert(true), + loadApplicationScript_endStringConvert(true), PRE_SETUP_REACT_CONTEXT_START, PRE_SETUP_REACT_CONTEXT_END, PRE_RUN_JS_BUNDLE_START, @@ -86,8 +88,8 @@ public enum ReactMarkerConstants { CREATE_MC_MODULE_END, CREATE_MC_MODULE_GET_METADATA_START, CREATE_MC_MODULE_GET_METADATA_END, - REGISTER_JS_SEGMENT_START, - REGISTER_JS_SEGMENT_STOP, + REGISTER_JS_SEGMENT_START(true), + REGISTER_JS_SEGMENT_STOP(true), VM_INIT, ON_FRAGMENT_CREATE, JAVASCRIPT_EXECUTOR_FACTORY_INJECT_START, @@ -121,5 +123,19 @@ public enum ReactMarkerConstants { REACT_BRIDGELESS_LOADING_START, REACT_BRIDGELESS_LOADING_END, LOAD_REACT_NATIVE_MAPBUFFER_SO_FILE_START, - LOAD_REACT_NATIVE_MAPBUFFER_SO_FILE_END, + LOAD_REACT_NATIVE_MAPBUFFER_SO_FILE_END; + + private boolean mHasMatchingNameMarker; + + ReactMarkerConstants() { + this(false); + } + + ReactMarkerConstants(boolean hasMatchingNameMarker) { + mHasMatchingNameMarker = hasMatchingNameMarker; + } + + public boolean hasMatchingNameMarker() { + return mHasMatchingNameMarker; + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/BridgelessReactContext.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/BridgelessReactContext.java index bf65d685dfb443..3b404a6541c01d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/BridgelessReactContext.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/BridgelessReactContext.java @@ -40,8 +40,7 @@ * com.facebook.react.bridge.CatalystInstance}, which doesn't exist in bridgeless mode. */ @Nullsafe(Nullsafe.Mode.LOCAL) -public class BridgelessReactContext extends ReactApplicationContext - implements EventDispatcherProvider { +class BridgelessReactContext extends ReactApplicationContext implements EventDispatcherProvider { private final ReactHost mReactHost; private final AtomicReference mSourceURL = new AtomicReference<>(); @@ -95,7 +94,7 @@ public boolean hasActiveReactInstance() { return mReactHost.isInstanceInitialized(); } - public DevSupportManager getDevSupportManager() { + DevSupportManager getDevSupportManager() { return mReactHost.getDevSupportManager(); } @@ -154,7 +153,7 @@ public void handleException(Exception e) { mReactHost.handleHostException(e); } - public DefaultHardwareBackBtnHandler getDefaultHardwareBackBtnHandler() { + DefaultHardwareBackBtnHandler getDefaultHardwareBackBtnHandler() { return mReactHost.getDefaultBackButtonHandler(); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/JSCInstance.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/JSCInstance.java new file mode 100644 index 00000000000000..117425a88021db --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/JSCInstance.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.bridgeless; + +import com.facebook.infer.annotation.Nullsafe; +import com.facebook.jni.HybridData; +import com.facebook.jni.annotations.DoNotStrip; +import com.facebook.soloader.SoLoader; + +@Nullsafe(Nullsafe.Mode.LOCAL) +public class JSCInstance extends JSEngineInstance { + static { + SoLoader.loadLibrary("jscinstance"); + } + + @DoNotStrip + protected static native HybridData initHybrid(); + + public JSCInstance() { + super(initHybrid()); + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHost.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHost.java index 3660c61d780d75..10ef6bc52344bc 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHost.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHost.java @@ -15,12 +15,14 @@ import android.app.Activity; import android.content.Context; +import android.os.Bundle; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; import com.facebook.infer.annotation.Nullsafe; import com.facebook.infer.annotation.ThreadConfined; import com.facebook.infer.annotation.ThreadSafe; +import com.facebook.react.JSEngineResolutionAlgorithm; import com.facebook.react.MemoryPressureRouter; import com.facebook.react.ReactInstanceEventListener; import com.facebook.react.bridge.Callback; @@ -37,18 +39,20 @@ import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.queue.QueueThreadExceptionHandler; import com.facebook.react.bridge.queue.ReactQueueConfiguration; -import com.facebook.react.bridgeless.exceptionmanager.ReactJsExceptionHandler; import com.facebook.react.bridgeless.internal.bolts.Continuation; import com.facebook.react.bridgeless.internal.bolts.Task; import com.facebook.react.bridgeless.internal.bolts.TaskCompletionSource; import com.facebook.react.common.LifecycleState; import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.devsupport.DevSupportManagerBase; import com.facebook.react.devsupport.DisabledDevSupportManager; import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.fabric.ComponentFactory; import com.facebook.react.fabric.FabricUIManager; import com.facebook.react.interfaces.ReactHostInterface; +import com.facebook.react.interfaces.ReactSurfaceInterface; +import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.UIManagerModule; @@ -84,6 +88,7 @@ public class ReactHost implements ReactHostInterface { private static final boolean DEV = ReactBuildConfig.DEBUG; private static final String TAG = "ReactHost"; private static final int BRIDGELESS_MARKER_INSTANCE_KEY = 1; + private static final AtomicInteger mCounter = new AtomicInteger(0); private final Context mContext; private final ReactHostDelegate mReactHostDelegate; @@ -95,7 +100,6 @@ public class ReactHost implements ReactHostInterface { private final QueueThreadExceptionHandler mQueueThreadExceptionHandler; private final Set mAttachedSurfaces = Collections.synchronizedSet(new HashSet<>()); private final MemoryPressureRouter mMemoryPressureRouter; - private MemoryPressureListener mMemoryPressureListener; private final boolean mAllowPackagerServerAccess; private final boolean mUseDevSupport; private final Collection mReactInstanceEventListeners = @@ -111,14 +115,14 @@ public class ReactHost implements ReactHostInterface { new BridgelessAtomicRef<>(); private final AtomicReference mActivity = new AtomicReference<>(); - private @Nullable DefaultHardwareBackBtnHandler mDefaultHardwareBackBtnHandler; private final BridgelessReactStateTracker mBridgelessReactStateTracker = new BridgelessReactStateTracker(DEV); private final ReactLifecycleStateManager mReactLifecycleStateManager = new ReactLifecycleStateManager(mBridgelessReactStateTracker); - - private static final AtomicInteger mCounter = new AtomicInteger(0); private final int mId = mCounter.getAndIncrement(); + private @Nullable JSEngineResolutionAlgorithm mJSEngineResolutionAlgorithm = null; + private MemoryPressureListener mMemoryPressureListener; + private @Nullable DefaultHardwareBackBtnHandler mDefaultHardwareBackBtnHandler; public ReactHost( Context context, @@ -171,19 +175,6 @@ public ReactHost( mUseDevSupport = useDevSupport; } - private MemoryPressureListener createMemoryPressureListener(ReactInstance reactInstance) { - WeakReference weakReactInstance = new WeakReference<>(reactInstance); - return (level) -> { - mBGExecutor.execute( - () -> { - @Nullable ReactInstance strongReactInstance = weakReactInstance.get(); - if (strongReactInstance != null) { - strongReactInstance.handleMemoryPressure(level); - } - }); - }; - } - @Override public LifecycleState getLifecycleState() { return mReactLifecycleStateManager.getLifecycleState(); @@ -206,66 +197,6 @@ public Task start() { return oldStart(); } - @ThreadConfined("ReactHost") - private @Nullable Task mStartTask = null; - - private Task oldStart() { - final String method = "oldPreload()"; - return Task.call( - () -> { - if (mStartTask == null) { - log(method, "Schedule"); - mStartTask = - getOrCreateReactInstanceTask() - .continueWithTask( - task -> { - if (task.isFaulted()) { - destroy( - "oldPreload() failure: " + task.getError().getMessage(), - task.getError()); - mReactHostDelegate.handleInstanceException(task.getError()); - } - - return task; - }, - mBGExecutor) - .makeVoid(); - } - return mStartTask; - }, - mBGExecutor) - .continueWithTask(Task::getResult); - } - - private Task newStart() { - final String method = "newPreload()"; - return Task.call( - () -> { - if (mStartTask == null) { - log(method, "Schedule"); - mStartTask = - waitThenCallNewGetOrCreateReactInstanceTask() - .continueWithTask( - (task) -> { - if (task.isFaulted()) { - mReactHostDelegate.handleInstanceException(task.getError()); - // Wait for destroy to finish - return newGetOrCreateDestroyTask( - "newPreload() failure: " + task.getError().getMessage(), - task.getError()) - .continueWithTask(destroyTask -> Task.forError(task.getError())) - .makeVoid(); - } - return task.makeVoid(); - }, - mBGExecutor); - } - return mStartTask; - }, - mBGExecutor) - .continueWithTask(Task::getResult); - } - /** Initialize and run a React Native surface in a background without mounting real views. */ public Task prerenderSurface(final ReactSurface surface) { final String method = "prerenderSurface(surfaceId = " + surface.getSurfaceID() + ")"; @@ -326,7 +257,8 @@ public Task stopSurface(final ReactSurface surface) { @ThreadConfined(UI) @Override public void onHostResume( - final @Nullable Activity activity, DefaultHardwareBackBtnHandler defaultBackButtonImpl) { + final @Nullable Activity activity, + @Nullable DefaultHardwareBackBtnHandler defaultBackButtonImpl) { mDefaultHardwareBackBtnHandler = defaultBackButtonImpl; onHostResume(activity); } @@ -410,12 +342,6 @@ public void onHostDestroy(@Nullable Activity activity) { } } - @ThreadConfined(UI) - private void moveToHostDestroy(@Nullable ReactContext currentContext) { - mReactLifecycleStateManager.moveToOnHostDestroy(currentContext); - mActivity.set(null); - } - /** * Returns current ReactContext which could be nullable if ReactInstance hasn't been created. * @@ -431,6 +357,139 @@ public DevSupportManager getDevSupportManager() { return assertNotNull(mDevSupportManager); } + @Override + public ReactSurfaceInterface createSurface( + Context context, String moduleName, @Nullable Bundle initialProps) { + ReactSurface surface = new ReactSurface(context, moduleName, initialProps); + surface.attachView(new ReactSurfaceView(context, surface)); + surface.attach(this); + return surface; + } + + public MemoryPressureRouter getMemoryPressureRouter() { + return mMemoryPressureRouter; + } + + /* package */ boolean isInstanceInitialized() { + final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult(); + return reactInstance != null; + } + + @ThreadConfined(UI) + @Override + public boolean onBackPressed() { + UiThreadUtil.assertOnUiThread(); + final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult(); + if (reactInstance == null) { + return false; + } + + DeviceEventManagerModule deviceEventManagerModule = + reactInstance.getNativeModule(DeviceEventManagerModule.class); + if (deviceEventManagerModule == null) { + return false; + } + + deviceEventManagerModule.emitHardwareBackPressed(); + return true; + } + + public @Nullable ReactQueueConfiguration getReactQueueConfiguration() { + synchronized (mReactInstanceTaskRef) { + Task task = mReactInstanceTaskRef.get(); + if (!task.isFaulted() && !task.isCancelled() && task.getResult() != null) { + return task.getResult().getReactQueueConfiguration(); + } + } + return null; + } + + /** Add a listener to be notified of ReactInstance events. */ + public void addReactInstanceEventListener(ReactInstanceEventListener listener) { + mReactInstanceEventListeners.add(listener); + } + + /** Remove a listener previously added with {@link #addReactInstanceEventListener}. */ + public void removeReactInstanceEventListener(ReactInstanceEventListener listener) { + mReactInstanceEventListeners.remove(listener); + } + + /** + * Entrypoint to reload the ReactInstance. If the ReactInstance is destroying, will wait until + * destroy is finished, before reloading. + * + * @param reason {@link String} describing why ReactHost is being reloaded (e.g. js error, user + * tap on reload button) + * @return A task that completes when React Native reloads + */ + public Task reload(String reason) { + final String method = "reload()"; + if (ReactFeatureFlags.enableBridgelessArchitectureNewCreateReloadDestroy) { + return Task.call( + () -> { + if (mDestroyTask != null) { + log( + method, + "Destroying React Native. Waiting for destroy to finish, before reloading React Native."); + return mDestroyTask + .continueWithTask(task -> newGetOrCreateReloadTask(reason), mBGExecutor) + .makeVoid(); + } + + return newGetOrCreateReloadTask(reason).makeVoid(); + }, + mBGExecutor) + .continueWithTask(Task::getResult); + } + + return oldReload(reason); + } + + /** + * Entrypoint to destroy the ReactInstance. If the ReactInstance is reloading, will wait until + * reload is finished, before destroying. + * + * @param reason {@link String} describing why ReactHost is being destroyed (e.g. memmory + * pressure) + * @param ex {@link Exception} exception that caused the trigger to destroy ReactHost (or null) + * This exception will be used to log properly the cause of destroy operation. + * @return A task that completes when React Native gets destroyed. + */ + public Task destroy(String reason, @Nullable Exception ex) { + final String method = "destroy()"; + if (ReactFeatureFlags.enableBridgelessArchitectureNewCreateReloadDestroy) { + return Task.call( + () -> { + if (mReloadTask != null) { + log( + method, + "Reloading React Native. Waiting for reload to finish before destroying React Native."); + return mReloadTask.continueWithTask( + task -> newGetOrCreateDestroyTask(reason, ex), mBGExecutor); + } + return newGetOrCreateDestroyTask(reason, ex); + }, + mBGExecutor) + .continueWithTask(Task::getResult); + } + + oldDestroy(reason, ex); + return Task.forResult(nullsafeFIXME(null, "Empty Destroy Task")); + } + + private MemoryPressureListener createMemoryPressureListener(ReactInstance reactInstance) { + WeakReference weakReactInstance = new WeakReference<>(reactInstance); + return (level) -> { + mBGExecutor.execute( + () -> { + @Nullable ReactInstance strongReactInstance = weakReactInstance.get(); + if (strongReactInstance != null) { + strongReactInstance.handleMemoryPressure(level); + } + }); + }; + } + @Nullable /* package */ Activity getCurrentActivity() { return mActivity.get(); @@ -494,7 +553,7 @@ T getNativeModule(Class nativeModuleInterface) { return null; } - /* package */ DefaultHardwareBackBtnHandler getDefaultBackButtonHandler() { + public DefaultHardwareBackBtnHandler getDefaultBackButtonHandler() { return () -> { UiThreadUtil.assertOnUiThread(); if (mDefaultHardwareBackBtnHandler != null) { @@ -503,54 +562,6 @@ T getNativeModule(Class nativeModuleInterface) { }; } - public MemoryPressureRouter getMemoryPressureRouter() { - return mMemoryPressureRouter; - } - - /* package */ boolean isInstanceInitialized() { - final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult(); - return reactInstance != null; - } - - @ThreadConfined(UI) - @Override - public boolean onBackPressed() { - UiThreadUtil.assertOnUiThread(); - final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult(); - if (reactInstance == null) { - return false; - } - - DeviceEventManagerModule deviceEventManagerModule = - reactInstance.getNativeModule(DeviceEventManagerModule.class); - if (deviceEventManagerModule == null) { - return false; - } - - deviceEventManagerModule.emitHardwareBackPressed(); - return true; - } - - public @Nullable ReactQueueConfiguration getReactQueueConfiguration() { - synchronized (mReactInstanceTaskRef) { - Task task = mReactInstanceTaskRef.get(); - if (!task.isFaulted() && !task.isCancelled() && task.getResult() != null) { - return task.getResult().getReactQueueConfiguration(); - } - } - return null; - } - - /** Add a listener to be notified of ReactInstance events. */ - public void addReactInstanceEventListener(ReactInstanceEventListener listener) { - mReactInstanceEventListeners.add(listener); - } - - /** Remove a listener previously added with {@link #addReactInstanceEventListener}. */ - public void removeReactInstanceEventListener(ReactInstanceEventListener listener) { - mReactInstanceEventListeners.remove(listener); - } - /* package */ Task loadBundle(final JSBundleLoader bundleLoader) { final String method = "loadBundle()"; log(method, "Schedule"); @@ -643,6 +654,72 @@ public void removeReactInstanceEventListener(ReactInstanceEventListener listener void then(T t); } + @ThreadConfined("ReactHost") + private @Nullable Task mStartTask = null; + + private Task oldStart() { + final String method = "oldPreload()"; + return Task.call( + () -> { + if (mStartTask == null) { + log(method, "Schedule"); + mStartTask = + getOrCreateReactInstanceTask() + .continueWithTask( + task -> { + if (task.isFaulted()) { + destroy( + "oldPreload() failure: " + task.getError().getMessage(), + task.getError()); + mReactHostDelegate.handleInstanceException(task.getError()); + } + + return task; + }, + mBGExecutor) + .makeVoid(); + } + return mStartTask; + }, + mBGExecutor) + .continueWithTask(Task::getResult); + } + + private Task newStart() { + final String method = "newPreload()"; + return Task.call( + () -> { + if (mStartTask == null) { + log(method, "Schedule"); + mStartTask = + waitThenCallNewGetOrCreateReactInstanceTask() + .continueWithTask( + (task) -> { + if (task.isFaulted()) { + mReactHostDelegate.handleInstanceException(task.getError()); + // Wait for destroy to finish + return newGetOrCreateDestroyTask( + "newPreload() failure: " + task.getError().getMessage(), + task.getError()) + .continueWithTask(destroyTask -> Task.forError(task.getError())) + .makeVoid(); + } + return task.makeVoid(); + }, + mBGExecutor); + } + return mStartTask; + }, + mBGExecutor) + .continueWithTask(Task::getResult); + } + + @ThreadConfined(UI) + private void moveToHostDestroy(@Nullable ReactContext currentContext) { + mReactLifecycleStateManager.moveToOnHostDestroy(currentContext); + mActivity.set(null); + } + private void raiseSoftException(String method, String message) { raiseSoftException(method, message, null); } @@ -1001,16 +1078,21 @@ private Task loadJSBundleFromMetro() { log(method); final TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); - final DevSupportManager asyncDevSupportManager = getDevSupportManager(); - final String sourceUrl = asyncDevSupportManager.getSourceUrl(); + final DevSupportManagerBase asyncDevSupportManager = + ((DevSupportManagerBase) getDevSupportManager()); + String bundleURL = + asyncDevSupportManager + .getDevServerHelper() + .getDevServerBundleURL( + Assertions.assertNotNull(asyncDevSupportManager.getJSAppBundleName())); asyncDevSupportManager.reloadJSFromServer( - sourceUrl, + bundleURL, () -> { log(method, "Creating BundleLoader"); JSBundleLoader bundleLoader = JSBundleLoader.createCachedBundleFromNetworkLoader( - sourceUrl, asyncDevSupportManager.getDownloadedJSBundleFile()); + bundleURL, asyncDevSupportManager.getDownloadedJSBundleFile()); taskCompletionSource.setResult(bundleLoader); }); @@ -1025,37 +1107,6 @@ private void log(String method) { mBridgelessReactStateTracker.enterState("ReactHost{" + mId + "}." + method); } - /** - * Entrypoint to reload the ReactInstance. If the ReactInstance is destroying, will wait until - * destroy is finished, before reloading. - * - * @param reason {@link String} describing why ReactHost is being reloaded (e.g. js error, user - * tap on reload button) - * @return A task that completes when React Native reloads - */ - public Task reload(String reason) { - final String method = "reload()"; - if (ReactFeatureFlags.enableBridgelessArchitectureNewCreateReloadDestroy) { - return Task.call( - () -> { - if (mDestroyTask != null) { - log( - method, - "Destroying React Native. Waiting for destroy to finish, before reloading React Native."); - return mDestroyTask - .continueWithTask(task -> newGetOrCreateReloadTask(reason), mBGExecutor) - .makeVoid(); - } - - return newGetOrCreateReloadTask(reason).makeVoid(); - }, - mBGExecutor) - .continueWithTask(Task::getResult); - } - - return oldReload(reason); - } - @ThreadConfined("ReactHost") private @Nullable Task mReloadTask = null; @@ -1219,38 +1270,6 @@ private Task newGetOrCreateReloadTask(String reason) { return mReloadTask; } - /** - * Entrypoint to destroy the ReactInstance. If the ReactInstance is reloading, will wait until - * reload is finished, before destroying. - * - * @param reason {@link String} describing why ReactHost is being destroyed (e.g. memmory - * pressure) - * @param ex {@link Exception} exception that caused the trigger to destroy ReactHost (or null) - * This exception will be used to log properly the cause of destroy operation. - * @return A task that completes when React Native gets destroyed. - */ - public Task destroy(String reason, @Nullable Exception ex) { - final String method = "destroy()"; - if (ReactFeatureFlags.enableBridgelessArchitectureNewCreateReloadDestroy) { - return Task.call( - () -> { - if (mReloadTask != null) { - log( - method, - "Reloading React Native. Waiting for reload to finish before destroying React Native."); - return mReloadTask.continueWithTask( - task -> newGetOrCreateDestroyTask(reason, ex), mBGExecutor); - } - return newGetOrCreateDestroyTask(reason, ex); - }, - mBGExecutor) - .continueWithTask(Task::getResult); - } - - oldDestroy(reason, ex); - return Task.forResult(nullsafeFIXME(null, "Empty Destroy Task")); - } - @ThreadConfined("ReactHost") private @Nullable Task mDestroyTask = null; @@ -1396,6 +1415,13 @@ private void oldDestroy(String reason, @Nullable Exception ex) { raiseSoftException(method, reason, ex); synchronized (mReactInstanceTaskRef) { + // Prevent re-destroy when ReactInstance has been reset already, which could happen when + // calling destroy multiple times on the same thread + ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult(); + if (reactInstance == null) { + return; + } + // Retain a reference to current ReactContext before de-referenced by mReactContextRef final ReactContext reactContext = getCurrentReactContext(); @@ -1486,4 +1512,13 @@ private void oldDestroyReactInstanceAndContext(final String callingMethod, final } } } + + public void setJSEngineResolutionAlgorithm( + @Nullable JSEngineResolutionAlgorithm jsEngineResolutionAlgorithm) { + mJSEngineResolutionAlgorithm = jsEngineResolutionAlgorithm; + } + + public @Nullable JSEngineResolutionAlgorithm getJSEngineResolutionAlgorithm() { + return mJSEngineResolutionAlgorithm; + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHostDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHostDelegate.kt index 3d9ab63ad5afd5..1a409a98aab0dc 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHostDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHostDelegate.kt @@ -9,12 +9,11 @@ package com.facebook.react.bridgeless import com.facebook.infer.annotation.ThreadSafe import com.facebook.react.ReactPackage +import com.facebook.react.ReactPackageTurboModuleManagerDelegate import com.facebook.react.bridge.JSBundleLoader -import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.common.annotations.UnstableReactNativeAPI import com.facebook.react.fabric.ReactNativeConfig import com.facebook.react.turbomodule.core.TurboModuleManager -import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate /** * [ReactHostDelegate] is an interface that defines parameters required to initialize React Native. @@ -49,7 +48,7 @@ interface ReactHostDelegate { val jSBundleLoader: JSBundleLoader /** TODO: combine getTurboModuleManagerDelegate inside [ReactPackage] */ - fun getTurboModuleManagerDelegate(context: ReactApplicationContext): TurboModuleManagerDelegate + val turboModuleManagerDelegateBuilder: ReactPackageTurboModuleManagerDelegate.Builder /** * Callback that can be used by React Native host applications to react to exceptions thrown by @@ -68,17 +67,14 @@ interface ReactHostDelegate { override val jSMainModulePath: String, override val jSBundleLoader: JSBundleLoader, override val jSEngineInstance: JSEngineInstance, + override val turboModuleManagerDelegateBuilder: + ReactPackageTurboModuleManagerDelegate.Builder, override val reactPackages: List = emptyList(), override val bindingsInstaller: BindingsInstaller? = null, - private val turboModuleManagerDelegate: - (context: ReactApplicationContext) -> TurboModuleManagerDelegate, private val reactNativeConfig: ReactNativeConfig = ReactNativeConfig.DEFAULT_CONFIG, private val exceptionHandler: (error: Exception) -> Unit = {} ) : ReactHostDelegate { - override fun getTurboModuleManagerDelegate(context: ReactApplicationContext) = - turboModuleManagerDelegate(context) - override fun getReactNativeConfig(turboModuleManager: TurboModuleManager) = reactNativeConfig override fun handleInstanceException(error: Exception) = exceptionHandler(error) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstance.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstance.java index 85dbe4abe0601f..cdea79ae8c585c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstance.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstance.java @@ -16,13 +16,17 @@ import com.facebook.infer.annotation.ThreadSafe; import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.BridgelessReactPackage; import com.facebook.react.ReactPackage; import com.facebook.react.ViewManagerOnDemandReactPackage; +import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.JSBundleLoader; import com.facebook.react.bridge.JSBundleLoaderDelegate; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.NativeArray; +import com.facebook.react.bridge.NativeMap; import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactNoCrashSoftException; import com.facebook.react.bridge.ReactSoftExceptionLogger; import com.facebook.react.bridge.RuntimeExecutor; import com.facebook.react.bridge.RuntimeScheduler; @@ -32,7 +36,7 @@ import com.facebook.react.bridge.queue.ReactQueueConfiguration; import com.facebook.react.bridge.queue.ReactQueueConfigurationImpl; import com.facebook.react.bridge.queue.ReactQueueConfigurationSpec; -import com.facebook.react.bridgeless.exceptionmanager.ReactJsExceptionHandler; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.fabric.Binding; import com.facebook.react.fabric.BindingImpl; @@ -40,6 +44,7 @@ import com.facebook.react.fabric.FabricUIManager; import com.facebook.react.fabric.ReactNativeConfig; import com.facebook.react.fabric.events.EventBeatManager; +import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.modules.core.JavaTimerManager; import com.facebook.react.modules.core.ReactChoreographer; @@ -51,6 +56,9 @@ import com.facebook.react.uimanager.ComponentNameResolverManager; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.IllegalViewOperationException; +import com.facebook.react.uimanager.UIConstantsProvider; +import com.facebook.react.uimanager.UIConstantsProviderManager; +import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.ViewManager; import com.facebook.react.uimanager.ViewManagerRegistry; import com.facebook.react.uimanager.ViewManagerResolver; @@ -59,8 +67,10 @@ import com.facebook.systrace.Systrace; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import javax.annotation.Nullable; @@ -78,6 +88,7 @@ final class ReactInstance { private final ReactHostDelegate mDelegate; private final BridgelessReactContext mBridgelessReactContext; + private final List mReactPackages; private final ReactQueueConfiguration mQueueConfiguration; private final TurboModuleManager mTurboModuleManager; @@ -85,6 +96,11 @@ final class ReactInstance { private final JavaTimerManager mJavaTimerManager; @DoNotStrip @Nullable private ComponentNameResolverManager mComponentNameResolverManager; + @DoNotStrip @Nullable private UIConstantsProviderManager mUIConstantsProviderManager; + + static { + loadLibraryIfNeeded(); + } private static volatile boolean sIsLibraryLoaded; @@ -98,7 +114,6 @@ final class ReactInstance { boolean useDevSupport) { mBridgelessReactContext = bridgelessReactContext; mDelegate = delegate; - loadLibraryIfNeeded(); Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "ReactInstance.initialize"); @@ -186,8 +201,20 @@ public void onHostDestroy() { // Set up TurboModules Systrace.beginSection( Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "ReactInstance.initialize#initTurboModules"); + + mReactPackages = new ArrayList<>(mDelegate.getReactPackages()); + mReactPackages.add( + new BridgelessReactPackage( + bridgelessReactContext.getDevSupportManager(), + bridgelessReactContext.getDefaultHardwareBackBtnHandler())); + TurboModuleManagerDelegate turboModuleManagerDelegate = - mDelegate.getTurboModuleManagerDelegate(mBridgelessReactContext); + mDelegate + .getTurboModuleManagerDelegateBuilder() + .setPackages(mReactPackages) + .setReactApplicationContext(mBridgelessReactContext) + .build(); + mTurboModuleManager = new TurboModuleManager( // Use unbuffered RuntimeExecutor to install binding @@ -203,6 +230,27 @@ public void onHostDestroy() { Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE); + // Initialize function for JS's UIManager.getViewManagerConfig() + // It should come after getTurboModuleManagerDelegate as it relies on react packages being + // initialized. + // This happens inside getTurboModuleManagerDelegate getter. + if (ReactFeatureFlags.useNativeViewConfigsInBridgelessMode) { + mUIConstantsProviderManager = + new UIConstantsProviderManager( + // Use unbuffered RuntimeExecutor to install binding + unbufferedRuntimeExecutor, + // Here we are construncting the return value for UIManager.getConstants call. + // The old architectre relied on the constatnts struct to contain: + // 1. Eagerly loaded view configs for all native components. + // 2. genericBubblingEventTypes. + // 3. genericDirectEventTypes. + // We want to match this beahavior. + (UIConstantsProvider) + () -> { + return getUIManagerConstants(); + }); + } + // Set up Fabric Systrace.beginSection( Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "ReactInstance.initialize#initFabric"); @@ -371,6 +419,7 @@ public Collection getNativeModules() { mFabricUIManager.onCatalystInstanceDestroy(); mHybridData.resetNative(); mComponentNameResolverManager = null; + mUIConstantsProviderManager = null; } /* --- Native methods --- */ @@ -419,7 +468,7 @@ public void handleMemoryPressure(int level) { } catch (NullPointerException e) { ReactSoftExceptionLogger.logSoftException( TAG, - new IllegalViewOperationException( + new ReactNoCrashSoftException( "Native method handleMemoryPressureJs is called earlier than librninstance.so got ready.")); } } @@ -442,7 +491,7 @@ public void registerSegment(int segmentId, String path) { private @Nullable ViewManager createViewManager(String viewManagerName) { if (mDelegate != null) { - List packages = mDelegate.getReactPackages(); + List packages = mReactPackages; if (packages != null) { synchronized (packages) { for (ReactPackage reactPackage : packages) { @@ -465,7 +514,7 @@ public void registerSegment(int segmentId, String path) { private @NonNull Collection getViewManagerNames() { Set uniqueNames = new HashSet<>(); if (mDelegate != null) { - List packages = mDelegate.getReactPackages(); + List packages = mReactPackages; if (packages != null) { synchronized (packages) { for (ReactPackage reactPackage : packages) { @@ -483,4 +532,14 @@ public void registerSegment(int segmentId, String path) { } return uniqueNames; } + + private @NonNull NativeMap getUIManagerConstants() { + List viewManagers = new ArrayList(); + for (String viewManagerName : getViewManagerNames()) { + viewManagers.add(createViewManager(viewManagerName)); + } + Map constants = + UIManagerModule.createConstants(viewManagers, new HashMap<>(), new HashMap<>()); + return Arguments.makeNativeMap(constants); + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactSurface.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactSurface.java index 8568296d4d27ad..d8144923fc49a3 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactSurface.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactSurface.java @@ -12,6 +12,7 @@ import android.util.DisplayMetrics; import android.view.View; import android.view.View.MeasureSpec; +import android.view.ViewGroup; import androidx.annotation.UiThread; import com.facebook.infer.annotation.Nullsafe; import com.facebook.infer.annotation.ThreadSafe; @@ -21,9 +22,10 @@ import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.bridgeless.internal.bolts.Task; import com.facebook.react.common.annotations.VisibleForTesting; -import com.facebook.react.fabric.SurfaceHandler; import com.facebook.react.fabric.SurfaceHandlerBinding; +import com.facebook.react.fabric.interfaces.SurfaceHandler; import com.facebook.react.interfaces.ReactSurfaceInterface; +import com.facebook.react.interfaces.TaskInterface; import com.facebook.react.modules.i18nmanager.I18nUtil; import com.facebook.react.uimanager.events.EventDispatcher; import java.util.concurrent.atomic.AtomicReference; @@ -130,11 +132,13 @@ public SurfaceHandler getSurfaceHandler() { return mSurfaceHandler; } - public @Nullable ReactSurfaceView getView() { + @Override + public @Nullable ViewGroup getView() { return mSurfaceView.get(); } - public Task prerender() { + @Override + public TaskInterface prerender() { ReactHost host = mReactHost.get(); if (host == null) { return Task.forError( @@ -144,7 +148,8 @@ public Task prerender() { return host.prerenderSurface(this); } - public Task start() { + @Override + public TaskInterface start() { if (mSurfaceView.get() == null) { return Task.forError( new IllegalStateException( @@ -160,7 +165,8 @@ public Task start() { return host.startSurface(this); } - public Task stop() { + @Override + public TaskInterface stop() { ReactHost host = mReactHost.get(); if (host == null) { return Task.forError( @@ -181,7 +187,7 @@ public String getModuleName() { public void clear() { UiThreadUtil.runOnUiThread( () -> { - ReactSurfaceView view = getView(); + ReactSurfaceView view = (ReactSurfaceView) getView(); if (view != null) { view.removeAllViews(); view.setId(View.NO_ID); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactSurfaceView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactSurfaceView.java index 5d6832624c0c6e..a379b16f7360b7 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactSurfaceView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactSurfaceView.java @@ -33,7 +33,7 @@ public class ReactSurfaceView extends ReactRootView { private static final String TAG = "ReactSurfaceView"; - private ReactSurface mSurface; + private final ReactSurface mSurface; private final JSTouchDispatcher mJSTouchDispatcher; private @Nullable JSPointerDispatcher mJSPointerDispatcher; @@ -138,26 +138,33 @@ public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { * from the child's onTouchIntercepted implementation. */ @Override - public void onChildStartedNativeGesture(MotionEvent ev) { - if (mJSTouchDispatcher != null && mSurface.getEventDispatcher() != null) { - mJSTouchDispatcher.onChildStartedNativeGesture(ev, mSurface.getEventDispatcher()); + public void onChildStartedNativeGesture(View childView, MotionEvent ev) { + EventDispatcher eventDispatcher = mSurface.getEventDispatcher(); + if (eventDispatcher == null) { + return; } - } - /** - * Called when a child starts a native gesture (e.g. a scroll in a ScrollView). Should be called - * from the child's onTouchIntercepted implementation. - */ - @Override - public void onChildStartedNativeGesture(View childView, MotionEvent ev) { - onChildStartedNativeGesture(ev); + if (mJSTouchDispatcher != null) { + mJSTouchDispatcher.onChildStartedNativeGesture(ev, eventDispatcher); + } + if (childView != null && mJSPointerDispatcher != null) { + mJSPointerDispatcher.onChildStartedNativeGesture(childView, ev, eventDispatcher); + } } @Override public void onChildEndedNativeGesture(View childView, MotionEvent ev) { + EventDispatcher eventDispatcher = mSurface.getEventDispatcher(); + if (eventDispatcher == null) { + return; + } + if (mJSTouchDispatcher != null && mSurface.getEventDispatcher() != null) { mJSTouchDispatcher.onChildEndedNativeGesture(ev, mSurface.getEventDispatcher()); } + if (mJSPointerDispatcher != null) { + mJSPointerDispatcher.onChildStartedNativeGesture(childView, ev, eventDispatcher); + } } @Override diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/internal/bolts/Task.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/internal/bolts/Task.java index 499afcab9d1c4c..07092aec6597ea 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/internal/bolts/Task.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/internal/bolts/Task.java @@ -7,6 +7,7 @@ package com.facebook.react.bridgeless.internal.bolts; +import com.facebook.react.interfaces.TaskInterface; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -26,7 +27,7 @@ * * @param The type of the result of the task. */ -public class Task { +public class Task implements TaskInterface { /** An {@link java.util.concurrent.Executor} that executes tasks in parallel. */ public static final ExecutorService BACKGROUND_EXECUTOR = BoltsExecutors.background(); @@ -112,6 +113,7 @@ public static TaskCompletionSource create() { * @return {@code true} if the task completed (has a result, an error, or was cancelled. {@code * false} otherwise. */ + @Override public boolean isCompleted() { synchronized (lock) { return complete; @@ -119,6 +121,7 @@ public boolean isCompleted() { } /** @return {@code true} if the task was cancelled, {@code false} otherwise. */ + @Override public boolean isCancelled() { synchronized (lock) { return cancelled; @@ -126,6 +129,7 @@ public boolean isCancelled() { } /** @return {@code true} if the task has an error, {@code false} otherwise. */ + @Override public boolean isFaulted() { synchronized (lock) { return getError() != null; @@ -133,6 +137,7 @@ public boolean isFaulted() { } /** @return The result of the task, if set. {@code null} otherwise. */ + @Override public TResult getResult() { synchronized (lock) { return result; @@ -140,6 +145,7 @@ public TResult getResult() { } /** @return The error for the task, if set. {@code null} otherwise. */ + @Override public Exception getError() { synchronized (lock) { if (error != null) { @@ -154,6 +160,7 @@ public Exception getError() { } /** Blocks until the task is complete. */ + @Override public void waitForCompletion() throws InterruptedException { synchronized (lock) { if (!isCompleted()) { @@ -168,6 +175,7 @@ public void waitForCompletion() throws InterruptedException { * @return {@code true} if the task completed (has a result, an error, or was cancelled). {@code * false} otherwise. */ + @Override public boolean waitForCompletion(long duration, TimeUnit timeUnit) throws InterruptedException { synchronized (lock) { if (!isCompleted()) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/ArrayUtils.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/ArrayUtils.java deleted file mode 100644 index def6056917fb01..00000000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/ArrayUtils.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.react.common; - -import java.util.Arrays; -import java.util.List; -import javax.annotation.Nullable; - -public class ArrayUtils { - - public static float[] copyArray(@Nullable float[] array) { - return array == null ? null : Arrays.copyOf(array, array.length); - } - - public static int[] copyListToArray(List list) { - int[] array = new int[list.size()]; - for (int t = 0; t < list.size(); t++) { - array[t] = list.get(t); - } - return array; - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/assets/ReactFontManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/assets/ReactFontManager.java new file mode 100644 index 00000000000000..7e7df01bd140ff --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/assets/ReactFontManager.java @@ -0,0 +1,239 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.common.assets; + +import android.content.Context; +import android.content.res.AssetManager; +import android.graphics.Typeface; +import android.os.Build; +import android.util.SparseArray; +import androidx.annotation.Nullable; +import androidx.core.content.res.ResourcesCompat; +import com.facebook.infer.annotation.Nullsafe; +import java.util.HashMap; +import java.util.Map; + +/** + * Responsible for loading and caching Typeface objects. + * + *

This will first try to load a typeface from the assets/fonts folder. If one is not found in + * that folder, this will fallback to the best matching system typeface. + * + *

Custom fonts support the extensions `.ttf` and `.otf` and the variants `bold`, `italic`, and + * `bold_italic`. For example, given a font named "ExampleFontFamily", the following are supported: + * + *

    + *
  • ExampleFontFamily.ttf (or .otf) + *
  • ExampleFontFamily_bold.ttf (or .otf) + *
  • ExampleFontFamily_italic.ttf (or .otf) + *
  • ExampleFontFamily_bold_italic.ttf (or .otf) + */ +@Nullsafe(Nullsafe.Mode.LOCAL) +public class ReactFontManager { + + // NOTE: Indices in `EXTENSIONS` correspond to the `TypeFace` style constants. + private static final String[] EXTENSIONS = {"", "_bold", "_italic", "_bold_italic"}; + private static final String[] FILE_EXTENSIONS = {".ttf", ".otf"}; + private static final String FONTS_ASSET_PATH = "fonts/"; + + private static ReactFontManager sReactFontManagerInstance; + + private final Map mFontCache; + private final Map mCustomTypefaceCache; + + private ReactFontManager() { + mFontCache = new HashMap<>(); + mCustomTypefaceCache = new HashMap<>(); + } + + public static ReactFontManager getInstance() { + if (sReactFontManagerInstance == null) { + sReactFontManagerInstance = new ReactFontManager(); + } + return sReactFontManagerInstance; + } + + public Typeface getTypeface(String fontFamilyName, int style, AssetManager assetManager) { + return getTypeface(fontFamilyName, new TypefaceStyle(style), assetManager); + } + + public Typeface getTypeface( + String fontFamilyName, int weight, boolean italic, AssetManager assetManager) { + return getTypeface(fontFamilyName, new TypefaceStyle(weight, italic), assetManager); + } + + public Typeface getTypeface( + String fontFamilyName, int style, int weight, AssetManager assetManager) { + return getTypeface(fontFamilyName, new TypefaceStyle(style, weight), assetManager); + } + + public Typeface getTypeface( + String fontFamilyName, TypefaceStyle typefaceStyle, AssetManager assetManager) { + if (mCustomTypefaceCache.containsKey(fontFamilyName)) { + // Apply `typefaceStyle` because custom fonts configure variants using `app:fontStyle` and + // `app:fontWeight` in their resource XML configuration file. + return typefaceStyle.apply(mCustomTypefaceCache.get(fontFamilyName)); + } + + AssetFontFamily assetFontFamily = mFontCache.get(fontFamilyName); + if (assetFontFamily == null) { + assetFontFamily = new AssetFontFamily(); + mFontCache.put(fontFamilyName, assetFontFamily); + } + + int style = typefaceStyle.getNearestStyle(); + + Typeface assetTypeface = assetFontFamily.getTypefaceForStyle(style); + if (assetTypeface == null) { + assetTypeface = createAssetTypeface(fontFamilyName, style, assetManager); + assetFontFamily.setTypefaceForStyle(style, assetTypeface); + } + // Do not apply `typefaceStyle` because asset font files already incorporate the style. + return assetTypeface; + } + + /* + * This method allows you to load custom fonts from res/font folder as provided font family name. + * Fonts may be one of .ttf, .otf or XML (https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml). + * To support multiple font styles or weights, you must provide a font in XML format. + * + * ReactFontManager.getInstance().addCustomFont(this, "Srisakdi", R.font.srisakdi); + */ + public void addCustomFont(Context context, String fontFamily, int fontId) { + Typeface font = ResourcesCompat.getFont(context, fontId); + if (font != null) { + mCustomTypefaceCache.put(fontFamily, font); + } + } + + /** + * Equivalent method to {@see addCustomFont(Context, String, int)} which accepts a Typeface + * object. + */ + public void addCustomFont(String fontFamily, @Nullable Typeface font) { + if (font != null) { + mCustomTypefaceCache.put(fontFamily, font); + } + } + + /** + * Add additional font family, or replace the exist one in the font memory cache. + * + * @param style + * @see {@link Typeface#DEFAULT} + * @see {@link Typeface#BOLD} + * @see {@link Typeface#ITALIC} + * @see {@link Typeface#BOLD_ITALIC} + */ + public void setTypeface(String fontFamilyName, int style, Typeface typeface) { + if (typeface != null) { + AssetFontFamily assetFontFamily = mFontCache.get(fontFamilyName); + if (assetFontFamily == null) { + assetFontFamily = new AssetFontFamily(); + mFontCache.put(fontFamilyName, assetFontFamily); + } + assetFontFamily.setTypefaceForStyle(style, typeface); + } + } + + private static Typeface createAssetTypeface( + String fontFamilyName, int style, AssetManager assetManager) { + String extension = EXTENSIONS[style]; + for (String fileExtension : FILE_EXTENSIONS) { + String fileName = + new StringBuilder() + .append(FONTS_ASSET_PATH) + .append(fontFamilyName) + .append(extension) + .append(fileExtension) + .toString(); + try { + return Typeface.createFromAsset(assetManager, fileName); + } catch (RuntimeException e) { + // If the typeface asset does not exist, try another extension. + continue; + } + } + return Typeface.create(fontFamilyName, style); + } + + /** Responsible for normalizing style and numeric weight for backward compatibility. */ + public static class TypefaceStyle { + + public static final int BOLD = 700; + public static final int NORMAL = 400; + public static final int UNSET = -1; + + private static final int MIN_WEIGHT = 1; + private static final int MAX_WEIGHT = 1000; + + private final boolean mItalic; + private final int mWeight; + + public TypefaceStyle(int weight, boolean italic) { + mItalic = italic; + mWeight = weight == UNSET ? NORMAL : weight; + } + + public TypefaceStyle(int style) { + if (style == UNSET) { + style = Typeface.NORMAL; + } + + mItalic = (style & Typeface.ITALIC) != 0; + mWeight = (style & Typeface.BOLD) != 0 ? BOLD : NORMAL; + } + + /** + * If `weight` is supplied, it will be combined with the italic bit from `style`. Otherwise, any + * existing weight bit in `style` will be used. + */ + public TypefaceStyle(int style, int weight) { + if (style == UNSET) { + style = Typeface.NORMAL; + } + + mItalic = (style & Typeface.ITALIC) != 0; + mWeight = weight == UNSET ? (style & Typeface.BOLD) != 0 ? BOLD : NORMAL : weight; + } + + public int getNearestStyle() { + if (mWeight < BOLD) { + return mItalic ? Typeface.ITALIC : Typeface.NORMAL; + } else { + return mItalic ? Typeface.BOLD_ITALIC : Typeface.BOLD; + } + } + + public Typeface apply(Typeface typeface) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + return Typeface.create(typeface, getNearestStyle()); + } else { + return Typeface.create(typeface, mWeight, mItalic); + } + } + } + + /** Responsible for caching typefaces for each custom font family. */ + private static class AssetFontFamily { + + private SparseArray mTypefaceSparseArray; + + private AssetFontFamily() { + mTypefaceSparseArray = new SparseArray<>(4); + } + + public @Nullable Typeface getTypefaceForStyle(int style) { + return mTypefaceSparseArray.get(style); + } + + public void setTypefaceForStyle(int style, Typeface typeface) { + mTypefaceSparseArray.put(style, typeface); + } + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.kt index ccfc730773427b..329f8701f5f8b2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.kt @@ -262,6 +262,7 @@ class ReadableMapBuffer : MapBuffer { override val key: Int get() = readUnsignedShort(bucketOffset).toInt() + override val type: MapBuffer.DataType get() = MapBuffer.DataType.values()[readUnsignedShort(bucketOffset + TYPE_OFFSET).toInt()] diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/WritableMapBuffer.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/WritableMapBuffer.kt index 8a6a7a9b9bb6a7..c3f161b518e53b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/WritableMapBuffer.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/WritableMapBuffer.kt @@ -136,7 +136,9 @@ class WritableMapBuffer : MapBuffer { override fun iterator(): Iterator = object : Iterator { var count = 0 + override fun hasNext(): Boolean = count < values.size() + override fun next(): MapBuffer.Entry = MapBufferEntry(count++) } @@ -145,12 +147,16 @@ class WritableMapBuffer : MapBuffer { override val type: DataType = values.valueAt(index).dataType(key) override val booleanValue: Boolean get() = verifyValue(key, values.valueAt(index)) + override val intValue: Int get() = verifyValue(key, values.valueAt(index)) + override val doubleValue: Double get() = verifyValue(key, values.valueAt(index)) + override val stringValue: String get() = verifyValue(key, values.valueAt(index)) + override val mapBufferValue: MapBuffer get() = verifyValue(key, values.valueAt(index)) } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index 6eb5b53b12f552..6aec6901af480a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -104,17 +104,6 @@ public class ReactFeatureFlags { /** Feature Flag to enable the pending event queue in fabric before mounting views */ public static boolean enableFabricPendingEventQueue = false; - /** - * Feature flag that controls how turbo modules are exposed to JS - * - *
      - *
    • 0 = as a HostObject - *
    • 1 = as a plain object, backed with a HostObject as prototype - *
    • 2 = as a plain object, with all methods eagerly configured - *
    - */ - public static int turboModuleBindingMode = 0; - /** * Feature Flag to enable View Recycling. When enabled, individual ViewManagers must still opt-in. */ @@ -159,4 +148,13 @@ public class ReactFeatureFlags { /** Report mount operations from the host platform to notify mount hooks. */ public static boolean enableMountHooks = false; + + /** Fixes a leak in SurfaceMountingManager.mTagSetForStoppedSurface */ + public static boolean fixStoppedSurfaceTagSetLeak = true; + + /** Disable the background executor for layout in Fabric */ + public static boolean enableBackgroundExecutor = false; + + /** Use native view configs in bridgeless mode. */ + public static boolean useNativeViewConfigsInBridgelessMode = false; } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultJSIModulePackage.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultJSIModulePackage.kt index de55e4bd0507f4..f1328997c849ea 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultJSIModulePackage.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultJSIModulePackage.kt @@ -40,6 +40,7 @@ class DefaultJSIModulePackage(private val reactNativeHost: ReactNativeHost) : JS private val reactNativeHost: ReactNativeHost ) : JSIModuleSpec { override fun getJSIModuleType(): JSIModuleType = JSIModuleType.UIManager + override fun getJSIModuleProvider(): JSIModuleProvider { val componentFactory = ComponentFactory() diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt index 73cb1e0f1da939..3e862dcf616096 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt @@ -27,15 +27,18 @@ object DefaultNewArchitectureEntryPoint { fun load( turboModulesEnabled: Boolean = true, fabricEnabled: Boolean = true, + bridgelessEnaled: Boolean = false, dynamicLibraryName: String = "appmodules", ) { ReactFeatureFlags.useTurboModules = turboModulesEnabled ReactFeatureFlags.enableFabricRenderer = fabricEnabled ReactFeatureFlags.unstable_useFabricInterop = fabricEnabled + ReactFeatureFlags.enableBridgelessArchitecture = bridgelessEnaled this.privateFabricEnabled = fabricEnabled this.privateTurboModulesEnabled = turboModulesEnabled this.privateConcurrentReactEnabled = fabricEnabled + this.privateBridgelessEnabled = bridgelessEnaled SoLoader.loadLibrary("react_newarchdefaults") SoLoader.loadLibrary(dynamicLibraryName) @@ -49,10 +52,11 @@ object DefaultNewArchitectureEntryPoint { fun load( turboModulesEnabled: Boolean = true, fabricEnabled: Boolean = true, + bridgelessEnaled: Boolean = false, @Suppress("UNUSED_PARAMETER") concurrentReactEnabled: Boolean = true, dynamicLibraryName: String = "appmodules", ) { - load(turboModulesEnabled, fabricEnabled, dynamicLibraryName) + load(turboModulesEnabled, fabricEnabled, bridgelessEnaled, dynamicLibraryName) } private var privateFabricEnabled: Boolean = false @@ -69,4 +73,9 @@ object DefaultNewArchitectureEntryPoint { @JvmStatic val concurrentReactEnabled: Boolean get() = privateConcurrentReactEnabled + + private var privateBridgelessEnabled: Boolean = false + @JvmStatic + val bridgelessEnaled: Boolean + get() = privateBridgelessEnabled } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHostDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHostDelegate.kt index c56417f35f8b86..f789bdd03acdaa 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHostDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHostDelegate.kt @@ -9,8 +9,8 @@ package com.facebook.react.defaults import com.facebook.jni.annotations.DoNotStrip import com.facebook.react.ReactPackage +import com.facebook.react.ReactPackageTurboModuleManagerDelegate import com.facebook.react.bridge.JSBundleLoader -import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridgeless.BindingsInstaller import com.facebook.react.bridgeless.JSEngineInstance import com.facebook.react.bridgeless.ReactHostDelegate @@ -18,7 +18,6 @@ import com.facebook.react.bridgeless.hermes.HermesInstance import com.facebook.react.common.annotations.UnstableReactNativeAPI import com.facebook.react.fabric.ReactNativeConfig import com.facebook.react.turbomodule.core.TurboModuleManager -import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate /** * A utility class that allows you to simplify the initialization of React Native by setting up a @@ -46,15 +45,11 @@ class DefaultReactHostDelegate( override val reactPackages: List = emptyList(), override val jSEngineInstance: JSEngineInstance = HermesInstance(), override val bindingsInstaller: BindingsInstaller = DefaultBindingsInstaller(), - private val turboModuleManagerDelegate: - (context: ReactApplicationContext) -> TurboModuleManagerDelegate, private val reactNativeConfig: ReactNativeConfig = ReactNativeConfig.DEFAULT_CONFIG, - private val exceptionHandler: (Exception) -> Unit = {} + private val exceptionHandler: (Exception) -> Unit = {}, + override val turboModuleManagerDelegateBuilder: ReactPackageTurboModuleManagerDelegate.Builder ) : ReactHostDelegate { - override fun getTurboModuleManagerDelegate(context: ReactApplicationContext) = - turboModuleManagerDelegate(context) - override fun getReactNativeConfig(turboModuleManager: TurboModuleManager) = reactNativeConfig override fun handleInstanceException(error: Exception) = exceptionHandler(error) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt index ac1fd1a4c7d90c..de6c9ef7579bce 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt @@ -27,7 +27,7 @@ private constructor(context: ReactApplicationContext, packages: List) = + public override fun build(context: ReactApplicationContext, packages: List) = DefaultTurboModuleManagerDelegate(context, packages) } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java index b393db1675623d..d1f2b994f3d8b0 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java @@ -19,6 +19,7 @@ import android.content.pm.PackageManager; import android.graphics.Typeface; import android.hardware.SensorManager; +import android.os.Build; import android.util.Pair; import android.view.Gravity; import android.view.View; @@ -687,7 +688,7 @@ public void reloadSettings() { return mCurrentContext; } - protected @Nullable String getJSAppBundleName() { + public @Nullable String getJSAppBundleName() { return mJSAppBundleName; } @@ -695,7 +696,7 @@ protected Context getApplicationContext() { return mApplicationContext; } - protected DevServerHelper getDevServerHelper() { + public DevServerHelper getDevServerHelper() { return mDevServerHelper; } @@ -1022,7 +1023,7 @@ private void reload() { if (!mIsReceiverRegistered) { IntentFilter filter = new IntentFilter(); filter.addAction(getReloadAppAction(mApplicationContext)); - mApplicationContext.registerReceiver(mReloadAppBroadcastReceiver, filter); + compatRegisterReceiver(mApplicationContext, mReloadAppBroadcastReceiver, filter, true); mIsReceiverRegistered = true; } @@ -1120,4 +1121,21 @@ public void setPackagerLocationCustomizer( return mSurfaceDelegateFactory.createSurfaceDelegate(moduleName); } + + /** + * Starting with Android 14, apps and services that target Android 14 and use context-registered + * receivers are required to specify a flag to indicate whether or not the receiver should be + * exported to all other apps on the device: either RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED + * + *

    https://developer.android.com/about/versions/14/behavior-changes-14#runtime-receivers-exported + */ + private void compatRegisterReceiver( + Context context, BroadcastReceiver receiver, IntentFilter filter, boolean exported) { + if (Build.VERSION.SDK_INT >= 34 && context.getApplicationInfo().targetSdkVersion >= 34) { + context.registerReceiver( + receiver, filter, exported ? Context.RECEIVER_EXPORTED : Context.RECEIVER_NOT_EXPORTED); + } else { + context.registerReceiver(receiver, filter); + } + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index 5f36d0e23a30f6..a7e80e784b5996 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -37,6 +37,7 @@ import com.facebook.infer.annotation.ThreadConfined; import com.facebook.proguard.annotations.DoNotStripAny; import com.facebook.react.bridge.ColorPropConverter; +import com.facebook.react.bridge.GuardedRunnable; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.NativeArray; import com.facebook.react.bridge.NativeMap; @@ -54,15 +55,16 @@ import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.common.mapbuffer.ReadableMapBuffer; import com.facebook.react.config.ReactFeatureFlags; -import com.facebook.react.fabric.events.EventBeatManager; import com.facebook.react.fabric.events.EventEmitterWrapper; import com.facebook.react.fabric.events.FabricEventEmitter; +import com.facebook.react.fabric.interfaces.SurfaceHandler; import com.facebook.react.fabric.interop.InteropEventEmitter; import com.facebook.react.fabric.mounting.MountItemDispatcher; import com.facebook.react.fabric.mounting.MountingManager; import com.facebook.react.fabric.mounting.SurfaceMountingManager; import com.facebook.react.fabric.mounting.SurfaceMountingManager.ViewEvent; import com.facebook.react.fabric.mounting.mountitems.BatchMountItem; +import com.facebook.react.fabric.mounting.mountitems.DispatchCommandMountItem; import com.facebook.react.fabric.mounting.mountitems.MountItem; import com.facebook.react.fabric.mounting.mountitems.MountItemFactory; import com.facebook.react.modules.core.ReactChoreographer; @@ -77,6 +79,7 @@ import com.facebook.react.uimanager.UIManagerHelper; import com.facebook.react.uimanager.ViewManagerPropertyUpdater; import com.facebook.react.uimanager.ViewManagerRegistry; +import com.facebook.react.uimanager.events.BatchEventDispatchedListener; import com.facebook.react.uimanager.events.EventCategoryDef; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.uimanager.events.EventDispatcherImpl; @@ -166,7 +169,7 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { @NonNull private final MountItemDispatcher mMountItemDispatcher; @NonNull private final ViewManagerRegistry mViewManagerRegistry; - @NonNull private final EventBeatManager mEventBeatManager; + @NonNull private final BatchEventDispatchedListener mBatchEventDispatchedListener; @NonNull private final CopyOnWriteArrayList mListeners = new CopyOnWriteArrayList<>(); @@ -211,14 +214,14 @@ public void executeItems(Queue items) { public FabricUIManager( @NonNull ReactApplicationContext reactContext, @NonNull ViewManagerRegistry viewManagerRegistry, - @NonNull EventBeatManager eventBeatManager) { + @NonNull BatchEventDispatchedListener batchEventDispatchedListener) { mDispatchUIFrameCallback = new DispatchUIFrameCallback(reactContext); mReactApplicationContext = reactContext; mMountingManager = new MountingManager(viewManagerRegistry, mMountItemExecutor); mMountItemDispatcher = new MountItemDispatcher(mMountingManager, new MountItemDispatchListener()); mEventDispatcher = new EventDispatcherImpl(reactContext); - mEventBeatManager = eventBeatManager; + mBatchEventDispatchedListener = batchEventDispatchedListener; mReactApplicationContext.addLifecycleEventListener(this); mViewManagerRegistry = viewManagerRegistry; @@ -386,7 +389,7 @@ public void stopSurface(final int surfaceID) { @Override public void initialize() { mEventDispatcher.registerEventEmitter(FABRIC, new FabricEventEmitter(this)); - mEventDispatcher.addBatchEventDispatchedListener(mEventBeatManager); + mEventDispatcher.addBatchEventDispatchedListener(mBatchEventDispatchedListener); if (ENABLE_FABRIC_PERF_LOGS) { mDevToolsReactPerfLogger = new DevToolsReactPerfLogger(); mDevToolsReactPerfLogger.addDevToolsReactPerfLoggerListener(FABRIC_PERF_LOGGER); @@ -425,7 +428,7 @@ public void onCatalystInstanceDestroy() { // memory immediately. mDispatchUIFrameCallback.stop(); - mEventDispatcher.removeBatchEventDispatchedListener(mEventBeatManager); + mEventDispatcher.removeBatchEventDispatchedListener(mBatchEventDispatchedListener); mEventDispatcher.unregisterEventEmitter(FABRIC); mReactApplicationContext.unregisterComponentCallbacks(mViewManagerRegistry); @@ -504,6 +507,11 @@ private long measure( public int getColor(int surfaceId, String[] resourcePaths) { ThemedReactContext context = mMountingManager.getSurfaceManagerEnforced(surfaceId, "getColor").getContext(); + // Surface may have been stopped + if (context == null) { + return 0; + } + for (String resourcePath : resourcePaths) { Integer color = ColorPropConverter.resolveResourcePath(context, resourcePath); if (color != null) { @@ -597,16 +605,14 @@ private long measureMapBuffer( * @return if theme data is available in the output parameters. */ public boolean getThemeData(int surfaceId, float[] defaultTextInputPadding) { - SurfaceMountingManager surfaceMountingManager = - mMountingManager.getSurfaceManagerEnforced(surfaceId, "getThemeData"); - ThemedReactContext themedReactContext = surfaceMountingManager.getContext(); - - if (themedReactContext == null) { + Context context = + mMountingManager.getSurfaceManagerEnforced(surfaceId, "getThemeData").getContext(); + if (context == null) { FLog.w(TAG, "\"themedReactContext\" is null when call \"getThemeData\""); return false; } - float[] defaultTextInputPaddingForTheme = - UIManagerHelper.getDefaultTextInputPadding(themedReactContext); + + float[] defaultTextInputPaddingForTheme = UIManagerHelper.getDefaultTextInputPadding(context); defaultTextInputPadding[0] = defaultTextInputPaddingForTheme[PADDING_START_INDEX]; defaultTextInputPadding[1] = defaultTextInputPaddingForTheme[PADDING_END_INDEX]; defaultTextInputPadding[2] = defaultTextInputPaddingForTheme[PADDING_TOP_INDEX]; @@ -785,9 +791,9 @@ private void scheduleMountItem( if (shouldSchedule) { mMountItemDispatcher.addMountItem(mountItem); Runnable runnable = - new Runnable() { + new GuardedRunnable(mReactApplicationContext) { @Override - public void run() { + public void runGuarded() { mMountItemDispatcher.tryDispatchMountItems(); } }; @@ -868,12 +874,12 @@ public void updateRootLayoutSpecs( return; } - ThemedReactContext reactContext = surfaceMountingManager.getContext(); + Context context = surfaceMountingManager.getContext(); boolean isRTL = false; boolean doLeftAndRightSwapInRTL = false; - if (reactContext != null) { - isRTL = I18nUtil.getInstance().isRTL(reactContext); - doLeftAndRightSwapInRTL = I18nUtil.getInstance().doLeftAndRightSwapInRTL(reactContext); + if (context != null) { + isRTL = I18nUtil.getInstance().isRTL(context); + doLeftAndRightSwapInRTL = I18nUtil.getInstance().doLeftAndRightSwapInRTL(context); } mBinding.setConstraints( @@ -1042,9 +1048,17 @@ public void dispatchCommand( final int reactTag, final String commandId, @Nullable final ReadableArray commandArgs) { - mMountItemDispatcher.dispatchCommandMountItem( - MountItemFactory.createDispatchCommandMountItem( - surfaceId, reactTag, commandId, commandArgs)); + if (ReactFeatureFlags.unstable_useFabricInterop) { + // For Fabric Interop, we check if the commandId is an integer. If it is, we use the integer + // overload of dispatchCommand. Otherwise, we use the string overload. + // and the events won't be correctly dispatched. + mMountItemDispatcher.dispatchCommandMountItem( + createDispatchCommandMountItemForInterop(surfaceId, reactTag, commandId, commandArgs)); + } else { + mMountItemDispatcher.dispatchCommandMountItem( + MountItemFactory.createDispatchCommandMountItem( + surfaceId, reactTag, commandId, commandArgs)); + } } @Override @@ -1241,6 +1255,26 @@ public void didDispatchMountItems() { } } + /** + * Util function that takes care of handling commands for Fabric Interop. If the command is a + * string that represents a number (say "42"), it will be parsed as an integer and the + * corresponding dispatch command mount item will be created. + */ + /* package */ DispatchCommandMountItem createDispatchCommandMountItemForInterop( + final int surfaceId, + final int reactTag, + final String commandId, + @Nullable final ReadableArray commandArgs) { + try { + int commandIdInteger = Integer.parseInt(commandId); + return MountItemFactory.createDispatchCommandMountItem( + surfaceId, reactTag, commandIdInteger, commandArgs); + } catch (NumberFormatException e) { + return MountItemFactory.createDispatchCommandMountItem( + surfaceId, reactTag, commandId, commandArgs); + } + } + private class DispatchUIFrameCallback extends GuardedFrameCallback { private volatile boolean mIsMountingEnabled = true; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/GuardedFrameCallback.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/GuardedFrameCallback.java index fb385e6eca03af..dcee5e2ebe8f91 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/GuardedFrameCallback.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/GuardedFrameCallback.java @@ -16,7 +16,6 @@ public abstract class GuardedFrameCallback extends ChoreographerCompat.FrameCall @NonNull private final JSExceptionHandler mExceptionHandler; - @Deprecated protected GuardedFrameCallback(@NonNull ReactContext reactContext) { this(reactContext.getExceptionHandler()); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java index 0cefe448a2d43c..a1f0d4e7eec5c7 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java @@ -14,6 +14,7 @@ import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.NativeMap; +import com.facebook.react.fabric.interfaces.SurfaceHandler; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandler.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/interfaces/SurfaceHandler.kt similarity index 52% rename from packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandler.java rename to packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/interfaces/SurfaceHandler.kt index 19b3ff7739fe01..d6d2c7c5d9b692 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandler.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/interfaces/SurfaceHandler.kt @@ -5,46 +5,47 @@ * LICENSE file in the root directory of this source tree. */ -package com.facebook.react.fabric; +package com.facebook.react.fabric.interfaces -import com.facebook.react.bridge.NativeMap; -import javax.annotation.concurrent.ThreadSafe; +import com.facebook.react.bridge.NativeMap +import javax.annotation.concurrent.ThreadSafe /** Represents a Java variant of the surface, its status and inner data required to display it. */ @ThreadSafe -public interface SurfaceHandler { - - /** Starts the surface if the surface is not running */ - void start(); - - /** Stops the surface if it is currently running */ - void stop(); - - void setProps(NativeMap props); +interface SurfaceHandler { /** * Provides current surface id. Id should be updated after each call to {@link * SurfaceHandler#stop} */ - int getSurfaceId(); + val surfaceId: Int - /** - * Updates current surface id. Id should be updated after each call to {@link SurfaceHandler#stop} - */ - void setSurfaceId(int surfaceId); + val isRunning: Boolean + + val moduleName: String - boolean isRunning(); + /** Starts the surface if the surface is not running */ + fun start() - String getModuleName(); + /** Stops the surface if it is currently running */ + fun stop() - void setLayoutConstraints( - int widthMeasureSpec, - int heightMeasureSpec, - int offsetX, - int offsetY, - boolean doLeftAndRightSwapInRTL, - boolean isRTL, - float pixelDensity); + fun setProps(props: NativeMap) - void setMountable(boolean mountable); + /** + * Updates current surface id. Id should be updated after each call to {@link SurfaceHandler#stop} + */ + fun setSurfaceId(surfaceId: Int) + + fun setLayoutConstraints( + widthMeasureSpec: Int, + heightMeasureSpec: Int, + offsetX: Int, + offsetY: Int, + doLeftAndRightSwapInRTL: Boolean, + isRTL: Boolean, + pixelDensity: Float + ) + + fun setMountable(mountable: Boolean) } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java index f3fb5e0a0024bf..be7bf13bbf6723 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java @@ -16,6 +16,7 @@ import androidx.annotation.AnyThread; import androidx.annotation.NonNull; import androidx.annotation.UiThread; +import androidx.collection.SparseArrayCompat; import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; import com.facebook.infer.annotation.ThreadConfined; @@ -52,6 +53,7 @@ import com.facebook.react.views.view.ReactViewManagerWrapper; import java.util.HashSet; import java.util.LinkedList; +import java.util.Map; import java.util.Queue; import java.util.Set; import java.util.Stack; @@ -91,7 +93,8 @@ public class SurfaceMountingManager { private RemoveDeleteTreeUIFrameCallback mRemoveDeleteTreeUIFrameCallback; // This is null *until* StopSurface is called. - private Set mTagSetForStoppedSurface; + private Set mTagSetForStoppedSurfaceLegacy; + private SparseArrayCompat mTagSetForStoppedSurface; private final int mSurfaceId; @@ -166,7 +169,10 @@ public boolean getViewExists(int tag) { // If Surface stopped, check if tag *was* associated with this Surface, even though it's been // deleted. This helps distinguish between scenarios where an invalid tag is referenced, vs // race conditions where an imperative method is called on a tag during/just after StopSurface. - if (mTagSetForStoppedSurface != null && mTagSetForStoppedSurface.contains(tag)) { + if (mTagSetForStoppedSurface != null && mTagSetForStoppedSurface.containsKey(tag)) { + return true; + } + if (mTagSetForStoppedSurfaceLegacy != null && mTagSetForStoppedSurfaceLegacy.contains(tag)) { return true; } if (mTagToViewState == null) { @@ -287,27 +293,38 @@ public void stopSurface() { } Runnable runnable = - new Runnable() { - @Override - public void run() { - // We must call `onDropViewInstance` on all remaining Views + () -> { + if (ReactFeatureFlags.fixStoppedSurfaceTagSetLeak) { + mTagSetForStoppedSurface = new SparseArrayCompat<>(); + for (Map.Entry entry : mTagToViewState.entrySet()) { + // Using this as a placeholder value in the map. We're using SparseArrayCompat + // since it can efficiently represent the list of pending tags + mTagSetForStoppedSurface.put(entry.getKey(), this); + + // We must call `onDropViewInstance` on all remaining Views + onViewStateDeleted(entry.getValue()); + } + } else { for (ViewState viewState : mTagToViewState.values()) { + // We must call `onDropViewInstance` on all remaining Views onViewStateDeleted(viewState); } + mTagSetForStoppedSurfaceLegacy = mTagToViewState.keySet(); + } - // Evict all views from cache and memory - mTagSetForStoppedSurface = mTagToViewState.keySet(); - mTagToViewState = null; - mJSResponderHandler = null; - mRootViewManager = null; - mMountItemExecutor = null; - mOnViewAttachItems.clear(); - - if (ReactFeatureFlags.enableViewRecycling) { - mViewManagerRegistry.onSurfaceStopped(mSurfaceId); - } - FLog.e(TAG, "Surface [" + mSurfaceId + "] was stopped on SurfaceMountingManager."); + // Evict all views from cache and memory + // TODO: clear instead of nulling out to simplify null-safety in this class + mTagToViewState = null; + mJSResponderHandler = null; + mRootViewManager = null; + mMountItemExecutor = null; + mThemedReactContext = null; + mOnViewAttachItems.clear(); + + if (ReactFeatureFlags.enableViewRecycling) { + mViewManagerRegistry.onSurfaceStopped(mSurfaceId); } + FLog.e(TAG, "Surface [" + mSurfaceId + "] was stopped on SurfaceMountingManager."); }; if (UiThreadUtil.isOnUiThread()) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactHostInterface.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactHostInterface.kt index cdaadcc706087f..3086f8f587132c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactHostInterface.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactHostInterface.kt @@ -8,6 +8,8 @@ package com.facebook.react.interfaces import android.app.Activity +import android.content.Context +import android.os.Bundle import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.queue.ReactQueueConfiguration import com.facebook.react.common.LifecycleState @@ -63,4 +65,11 @@ interface ReactHostInterface { /** To be called when the host activity is destroyed. */ fun onHostDestroy(activity: Activity?) + + /** To be called to create and setup an ReactSurface. */ + fun createSurface( + context: Context, + moduleName: String, + initialProps: Bundle? + ): ReactSurfaceInterface? } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactSurfaceInterface.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactSurfaceInterface.kt index 5dd268bdf098de..d3fb4b7d946ee9 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactSurfaceInterface.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactSurfaceInterface.kt @@ -7,8 +7,22 @@ package com.facebook.react.interfaces +import android.view.ViewGroup + /** Represents a Surface in React Native. */ interface ReactSurfaceInterface { // the API of this interface will be completed as we analyze and refactor API of ReactSurface, // ReactRootView, etc. + + // Prerender this surface + fun prerender(): TaskInterface + + // Start running this surface + fun start(): TaskInterface + + // Stop running this surface + fun stop(): TaskInterface + + // Get React root view of this surface + fun getView(): ViewGroup? } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/TaskInterface.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/TaskInterface.kt new file mode 100644 index 00000000000000..6742d1ebfdbeea --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/TaskInterface.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.interfaces + +import java.util.concurrent.TimeUnit + +/** + * This is the public interface for Task which represents the result of an asynchronous computation. + */ +interface TaskInterface { + + /** Blocks until the task is complete. */ + @Throws(InterruptedException::class) fun waitForCompletion() + + /** + * Blocks until the task is complete or times out. + * + * @return true if the task completed (has a result, an error, or was cancelled). false otherwise. + */ + @Throws(InterruptedException::class) + fun waitForCompletion(duration: Long, timeUnit: TimeUnit?): Boolean + + /** @return The result of the task, if set. null otherwise. */ + fun getResult(): TResult? + + /** @return The error for the task, if set. null otherwise. */ + fun getError(): Exception? + + /** + * @return true if the task completed (has a result, an error, or was cancelled. false otherwise. + */ + fun isCompleted(): Boolean + + /** @return true if the task was cancelled, false otherwise. */ + fun isCancelled(): Boolean + + /** @return true if the task has an error, false otherwise. */ + fun isFaulted(): Boolean +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/exceptionmanager/ReactJsExceptionHandler.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/exceptionmanager/ReactJsExceptionHandler.kt new file mode 100644 index 00000000000000..ce80a2861796a1 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/exceptionmanager/ReactJsExceptionHandler.kt @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.interfaces.exceptionmanager + +import com.facebook.proguard.annotations.DoNotStripAny +import com.facebook.react.common.annotations.UnstableReactNativeAPI +import com.facebook.react.common.mapbuffer.ReadableMapBuffer + +@DoNotStripAny +@UnstableReactNativeAPI +fun interface ReactJsExceptionHandler { + fun reportJsException(errorMap: ReadableMapBuffer?) +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java index fc9298d748920e..17e7ce7bf16cee 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java @@ -14,7 +14,7 @@ import com.facebook.soloader.SoLoader; @DoNotStrip -/* package */ public class JSCExecutor extends JavaScriptExecutor { +public class JSCExecutor extends JavaScriptExecutor { static { loadLibrary(); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java index bbc6bb0589f986..362bf75d40f540 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java @@ -83,9 +83,9 @@ private ImagePipeline getImagePipeline() { /** * Fetch the width and height of the given image. * - * @param uriString the URI of the remote image to prefetch - * @param promise the promise that is fulfilled when the image is successfully prefetched or - * rejected when there is an error + * @param uriString the URI of the remote image + * @param promise the promise that is fulfilled when operation successfully completed or rejected + * when there is an error */ @ReactMethod public void getSize(final String uriString, final Promise promise) { @@ -139,10 +139,10 @@ protected void onFailureImpl(DataSource> data /** * Fetch the width and height of the given image with headers. * - * @param uriString the URI of the remote image to prefetch + * @param uriString the URI of the remote image * @param headers headers send with the request - * @param promise the promise that is fulfilled when the image is successfully prefetched or - * rejected when there is an error + * @param promise the promise that is fulfilled when operation successfully completed or rejected + * when there is an error */ @ReactMethod public void getSizeWithHeaders( diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/CustomClientBuilder.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/CustomClientBuilder.java new file mode 100644 index 00000000000000..db81d653baeada --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/CustomClientBuilder.java @@ -0,0 +1,14 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.modules.network; + +import okhttp3.OkHttpClient; + +public interface CustomClientBuilder { + public void apply(OkHttpClient.Builder builder); +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java index 020f8b82e277fb..344c452836fc23 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java @@ -94,7 +94,8 @@ public interface ResponseHandler { private static final int CHUNK_TIMEOUT_NS = 100 * 1000000; // 100ms private static final int MAX_CHUNK_SIZE_BETWEEN_FLUSHES = 8 * 1024; // 8K - private static @Nullable CustomClientBuilder customClientBuilder = null; + private static @Nullable com.facebook.react.modules.network.CustomClientBuilder + customClientBuilder = null; private final OkHttpClient mClient; private final ForwardingCookieHandler mCookieHandler; @@ -163,13 +164,18 @@ public NetworkingModule(ReactApplicationContext context, String defaultUserAgent this(context, defaultUserAgent, OkHttpClientProvider.createClient(context), null); } - public static void setCustomClientBuilder(CustomClientBuilder ccb) { + public static void setCustomClientBuilder( + com.facebook.react.modules.network.CustomClientBuilder ccb) { customClientBuilder = ccb; } - public static interface CustomClientBuilder { - public void apply(OkHttpClient.Builder builder); - } + /** + * @deprecated To be removed in a future release. See + * https://github.com/facebook/react-native/pull/37798#pullrequestreview-1518338914 + */ + @Deprecated + public static interface CustomClientBuilder + extends com.facebook.react.modules.network.CustomClientBuilder {} private static void applyCustomBuilder(OkHttpClient.Builder builder) { if (customClientBuilder != null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoModule.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoModule.java index 8a3fe903b5a0d2..3c283271487eda 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoModule.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoModule.java @@ -28,6 +28,7 @@ @SuppressLint("HardwareIds") public class AndroidInfoModule extends NativePlatformConstantsAndroidSpec implements TurboModule { private static final String IS_TESTING = "IS_TESTING"; + private static final String IS_DISABLE_ANIMATIONS = "IS_DISABLE_ANIMATIONS"; public AndroidInfoModule(ReactApplicationContext reactContext) { super(reactContext); @@ -75,6 +76,10 @@ private String uiMode() { } constants.put( "isTesting", "true".equals(System.getProperty(IS_TESTING)) || isRunningScreenshotTest()); + String isDisableAnimations = System.getProperty(IS_DISABLE_ANIMATIONS); + if (isDisableAnimations != null) { + constants.put("isDisableAnimations", "true".equals(isDisableAnimations)); + } constants.put("reactNativeVersion", ReactNativeVersion.VERSION); constants.put("uiMode", uiMode()); return constants; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java index ee1b2c85dc261f..d13db1fb2a90a8 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java @@ -19,6 +19,7 @@ import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.ReactConstants; import com.facebook.react.module.annotations.ReactModule; +import com.facebook.react.modules.network.CustomClientBuilder; import com.facebook.react.modules.network.ForwardingCookieHandler; import java.io.IOException; import java.net.URI; @@ -48,11 +49,23 @@ public interface ContentHandler { private ForwardingCookieHandler mCookieHandler; + private static @Nullable CustomClientBuilder customClientBuilder = null; + public WebSocketModule(ReactApplicationContext context) { super(context); mCookieHandler = new ForwardingCookieHandler(context); } + public static void setCustomClientBuilder(CustomClientBuilder ccb) { + customClientBuilder = ccb; + } + + private static void applyCustomBuilder(OkHttpClient.Builder builder) { + if (customClientBuilder != null) { + customClientBuilder.apply(builder); + } + } + @Override public void invalidate() { for (WebSocket socket : mWebSocketConnections.values()) { @@ -84,12 +97,15 @@ public void connect( @Nullable final ReadableMap options, final double socketID) { final int id = (int) socketID; - OkHttpClient client = + OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) - .readTimeout(0, TimeUnit.MINUTES) // Disable timeouts for read - .build(); + .readTimeout(0, TimeUnit.MINUTES); // Disable timeouts for read + + applyCustomBuilder(okHttpBuilder); + + OkHttpClient client = okHttpBuilder.build(); Request.Builder builder = new Request.Builder().tag(id).url(url); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSPointerDispatcher.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSPointerDispatcher.java index eb970dfbfb443f..d65ecbea8bcfbc 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSPointerDispatcher.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSPointerDispatcher.java @@ -50,6 +50,8 @@ public class JSPointerDispatcher { private int mLastButtonState = 0; private final ViewGroup mRootViewGroup; + private static final int[] sRootScreenCoords = {0, 0}; + // Set globally for hover interactions, referenced for coalescing hover events public JSPointerDispatcher(ViewGroup viewGroup) { @@ -255,10 +257,21 @@ private void onDown( } } + private float[] eventCoordsToScreenCoords(float[] eventCoords) { + float[] screenCoords = new float[2]; + mRootViewGroup.getLocationOnScreen(sRootScreenCoords); + + screenCoords[0] = eventCoords[0] + sRootScreenCoords[0]; + screenCoords[1] = eventCoords[1] + sRootScreenCoords[1]; + + return screenCoords; + } + private PointerEventState createEventState(int activePointerId, MotionEvent motionEvent) { Map offsetByPointerId = new HashMap(); Map> hitPathByPointerId = new HashMap>(); Map eventCoordinatesByPointerId = new HashMap(); + Map screenCoordinatesByPointerId = new HashMap(); for (int index = 0; index < motionEvent.getPointerCount(); index++) { float[] offsetCoordinates = new float[2]; float[] eventCoordinates = new float[] {motionEvent.getX(index), motionEvent.getY(index)}; @@ -270,6 +283,7 @@ private PointerEventState createEventState(int activePointerId, MotionEvent moti offsetByPointerId.put(pointerId, offsetCoordinates); hitPathByPointerId.put(pointerId, hitPath); eventCoordinatesByPointerId.put(pointerId, eventCoordinates); + screenCoordinatesByPointerId.put(pointerId, eventCoordsToScreenCoords(eventCoordinates)); } int surfaceId = UIManagerHelper.getSurfaceId(mRootViewGroup); @@ -282,6 +296,7 @@ private PointerEventState createEventState(int activePointerId, MotionEvent moti offsetByPointerId, hitPathByPointerId, eventCoordinatesByPointerId, + screenCoordinatesByPointerId, mHoveringPointerIds); // Creates a copy of hovering pointer ids, as they may be updated } @@ -673,17 +688,22 @@ private int[] getChildOffsetRelativeToRoot(View childView) { private PointerEventState normalizeToRoot(PointerEventState original, float rootX, float rootY) { Map newOffsets = new HashMap<>(original.getOffsetByPointerId()); Map newEventCoords = new HashMap<>(original.getEventCoordinatesByPointerId()); + Map newScreenCoords = + new HashMap<>(original.getScreenCoordinatesByPointerId()); + float[] rootOffset = {rootX, rootY}; for (Map.Entry offsetEntry : newOffsets.entrySet()) { - float[] offsetValue = offsetEntry.getValue(); - offsetValue[0] = rootX; - offsetValue[1] = rootY; + offsetEntry.setValue(rootOffset); } + float[] zeroOffset = {0, 0}; for (Map.Entry eventCoordsEntry : newEventCoords.entrySet()) { - float[] eventCoordsValue = eventCoordsEntry.getValue(); - eventCoordsValue[0] = 0; - eventCoordsValue[1] = 0; + eventCoordsEntry.setValue(zeroOffset); + } + + float[] screenCoords = eventCoordsToScreenCoords(rootOffset); + for (Map.Entry screenCoordsEntry : newScreenCoords.entrySet()) { + screenCoordsEntry.setValue(screenCoords); } return new PointerEventState( @@ -694,6 +714,7 @@ private PointerEventState normalizeToRoot(PointerEventState original, float root newOffsets, new HashMap<>(original.getHitPathByPointerId()), newEventCoords, + newScreenCoords, new HashSet<>(original.getHoveringPointerIds())); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootView.java index 4e0e1723368e05..cf588887d93a76 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootView.java @@ -21,7 +21,9 @@ public interface RootView { /** @deprecated */ @Deprecated - void onChildStartedNativeGesture(MotionEvent ev); + default void onChildStartedNativeGesture(MotionEvent ev) { + onChildStartedNativeGesture(null, ev); + } /** * Called when a child ends a native gesture. Should be called from the child's onTouchIntercepted diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/exceptionmanager/ReactJsExceptionHandler.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIConstantsProvider.java similarity index 55% rename from packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/exceptionmanager/ReactJsExceptionHandler.java rename to packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIConstantsProvider.java index a05e6471911a9b..77b95520c5c91a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/exceptionmanager/ReactJsExceptionHandler.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIConstantsProvider.java @@ -5,13 +5,14 @@ * LICENSE file in the root directory of this source tree. */ -package com.facebook.react.bridgeless.exceptionmanager; +package com.facebook.react.uimanager; import com.facebook.proguard.annotations.DoNotStripAny; -import com.facebook.react.common.mapbuffer.ReadableMapBuffer; +import com.facebook.react.bridge.NativeMap; @DoNotStripAny -public interface ReactJsExceptionHandler { +public interface UIConstantsProvider { - void reportJsException(ReadableMapBuffer errorMap); + /* Returns UIManager's constants. */ + NativeMap getConstants(); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIConstantsProviderManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIConstantsProviderManager.java new file mode 100644 index 00000000000000..6479a0c1562d5e --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIConstantsProviderManager.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.uimanager; + +import com.facebook.jni.HybridData; +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.proguard.annotations.DoNotStripAny; +import com.facebook.react.bridge.RuntimeExecutor; +import com.facebook.soloader.SoLoader; + +@DoNotStripAny +public class UIConstantsProviderManager { + + static { + staticInit(); + } + + @DoNotStrip + @SuppressWarnings("unused") + private final HybridData mHybridData; + + public UIConstantsProviderManager( + RuntimeExecutor runtimeExecutor, Object uiConstantsProviderManager) { + mHybridData = initHybrid(runtimeExecutor, uiConstantsProviderManager); + installJSIBindings(); + } + + private native HybridData initHybrid( + RuntimeExecutor runtimeExecutor, Object uiConstantsProviderManager); + + private native void installJSIBindings(); + + private static void staticInit() { + SoLoader.loadLibrary("uimanagerjni"); + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java index 6fff633ac9a440..c4a3902d1e3d6a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java @@ -206,7 +206,7 @@ public static int getSurfaceId(Context context) { * @return the default padding used by Android EditText's. This method returns the padding in an * array to avoid extra classloading during hot-path of RN Android. */ - public static float[] getDefaultTextInputPadding(ThemedReactContext context) { + public static float[] getDefaultTextInputPadding(Context context) { EditText editText = new EditText(context); float[] padding = new float[4]; padding[PADDING_START_INDEX] = PixelUtil.toDIPFromPixel(ViewCompat.getPaddingStart(editText)); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index 78b174f0250429..9ff04bc2b07a4f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -229,7 +229,7 @@ private static Map createConstants(ViewManagerResolver viewManag } } - private static Map createConstants( + public static Map createConstants( List viewManagers, @Nullable Map customBubblingEvents, @Nullable Map customDirectEvents) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java index cd10e3a76d0698..6d0770447bfb90 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java @@ -11,7 +11,9 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import com.facebook.common.logging.FLog; import com.facebook.react.common.MapBuilder; +import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.config.ReactFeatureFlags; import com.facebook.systrace.SystraceMessage; import java.util.ArrayList; @@ -26,7 +28,7 @@ * registered view managers. */ /* package */ class UIManagerModuleConstantsHelper { - + private static final String TAG = "UIManagerModuleConstantsHelper"; private static final String BUBBLING_EVENTS_KEY = "bubblingEventTypes"; private static final String DIRECT_EVENTS_KEY = "directEventTypes"; @@ -50,6 +52,31 @@ DIRECT_EVENTS_KEY, UIManagerModuleConstants.getDirectEventTypeConstants()); } + private static void validateDirectEventNames( + String viewManagerName, Map directEvents) { + if (!ReactBuildConfig.DEBUG || directEvents == null) { + return; + } + + for (String key : directEvents.keySet()) { + Object value = directEvents.get(key); + if (value != null && (value instanceof Map)) { + String regName = (String) ((Map) value).get("registrationName"); + if (regName != null + && key.startsWith("top") + && regName.startsWith("on") + && !key.substring(3).equals(regName.substring(2))) { + FLog.e( + TAG, + String.format( + "Direct event name for '%s' doesn't correspond to the naming convention," + + " expected 'topEventName'->'onEventName', got '%s'->'%s'", + viewManagerName, key, regName)); + } + } + } + } + /** * Generates map of constants that is then exposed by {@link UIManagerModule}. Provided list of * {@param viewManagers} is then used to populate content of those predefined fields using {@link @@ -118,7 +145,6 @@ Map viewManagerBubblingEvents = viewManager.getExportedCustomBubblingEventTypeConstants(); if (viewManagerBubblingEvents != null) { - if (ReactFeatureFlags.enableFabricRenderer && ReactFeatureFlags.unstable_useFabricInterop) { // For Fabric, events needs to be fired with a "top" prefix. // For the sake of Fabric Interop, here we normalize events adding "top" in their @@ -133,7 +159,14 @@ } Map viewManagerDirectEvents = viewManager.getExportedCustomDirectEventTypeConstants(); + validateDirectEventNames(viewManager.getName(), viewManagerDirectEvents); if (viewManagerDirectEvents != null) { + if (ReactFeatureFlags.enableFabricRenderer && ReactFeatureFlags.unstable_useFabricInterop) { + // For Fabric, events needs to be fired with a "top" prefix. + // For the sake of Fabric Interop, here we normalize events adding "top" in their + // name if the user hasn't provided it. + normalizeEventTypes(viewManagerDirectEvents); + } recursiveMerge(cumulativeDirectEventTypes, viewManagerDirectEvents); recursiveMerge(viewManagerDirectEvents, defaultDirectEvents); viewManagerConstants.put(DIRECT_EVENTS_KEY, viewManagerDirectEvents); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java index 02b99115070478..66f3c1bdcfc12c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java @@ -7,6 +7,7 @@ package com.facebook.react.uimanager.events; +import android.view.KeyEvent; import android.view.MotionEvent; import androidx.annotation.Nullable; import androidx.core.util.Pools; @@ -183,6 +184,13 @@ private List createW3CPointerEvents() { return w3cPointerEvents; } + private void addModifierKeyData(WritableMap pointerEvent, int modifierKeyMask) { + pointerEvent.putBoolean("ctrlKey", (modifierKeyMask & KeyEvent.META_CTRL_ON) != 0); + pointerEvent.putBoolean("shiftKey", (modifierKeyMask & KeyEvent.META_SHIFT_ON) != 0); + pointerEvent.putBoolean("altKey", (modifierKeyMask & KeyEvent.META_ALT_ON) != 0); + pointerEvent.putBoolean("metaKey", (modifierKeyMask & KeyEvent.META_META_ON) != 0); + } + private WritableMap createW3CPointerEvent(int index) { WritableMap pointerEvent = Arguments.createMap(); int pointerId = mMotionEvent.getPointerId(index); @@ -207,6 +215,12 @@ private WritableMap createW3CPointerEvent(int index) { pointerEvent.putDouble("clientX", clientX); pointerEvent.putDouble("clientY", clientY); + float[] screenCoords = mEventState.getScreenCoordinatesByPointerId().get(pointerId); + double screenX = PixelUtil.toDIPFromPixel(screenCoords[0]); + double screenY = PixelUtil.toDIPFromPixel(screenCoords[1]); + pointerEvent.putDouble("screenX", screenX); + pointerEvent.putDouble("screenY", screenY); + // x,y values are aliases of clientX, clientY pointerEvent.putDouble("x", clientX); pointerEvent.putDouble("y", clientY); @@ -254,6 +268,8 @@ private WritableMap createW3CPointerEvent(int index) { pointerEvent.putDouble("pressure", pressure); pointerEvent.putDouble("tangentialPressure", 0.0); + addModifierKeyData(pointerEvent, mMotionEvent.getMetaState()); + return pointerEvent; } @@ -328,6 +344,7 @@ public static class PointerEventState { private Map mOffsetByPointerId; private Map> mHitPathByPointerId; private Map mEventCoordinatesByPointerId; + private Map mScreenCoordinatesByPointerId; private Set mHoveringPointerIds; public PointerEventState( @@ -338,6 +355,7 @@ public PointerEventState( Map offsetByPointerId, Map> hitPathByPointerId, Map eventCoordinatesByPointerId, + Map screenCoordinatesByPointerId, Set hoveringPointerIds) { mPrimaryPointerId = primaryPointerId; mActivePointerId = activePointerId; @@ -346,6 +364,7 @@ public PointerEventState( mOffsetByPointerId = offsetByPointerId; mHitPathByPointerId = hitPathByPointerId; mEventCoordinatesByPointerId = eventCoordinatesByPointerId; + mScreenCoordinatesByPointerId = screenCoordinatesByPointerId; mHoveringPointerIds = new HashSet<>(hoveringPointerIds); } @@ -385,6 +404,10 @@ public final Map getEventCoordinatesByPointerId() { return mEventCoordinatesByPointerId; } + public final Map getScreenCoordinatesByPointerId() { + return mScreenCoordinatesByPointerId; + } + public final List getHitPathForActivePointer() { return mHitPathByPointerId.get(mActivePointerId); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/util/RNLog.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/util/RNLog.java index 438750cf415ed8..8469879f21201b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/util/RNLog.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/util/RNLog.java @@ -97,29 +97,15 @@ private static void logInternal(ReactContext context, String message, int level) private static String levelToString(int level) { switch (level) { case LOG: - { - return "log"; - } case TRACE: - { - return "log"; - } + return "log"; case ADVICE: - { - return "warn"; - } case WARN: - { - return "warn"; - } + return "warn"; case ERROR: - { - return "error"; - } + return "error"; default: - { - return "none"; - } + return "none"; } } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java index 30a6ed20bdf546..da4fad4b4c7c97 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java @@ -152,6 +152,9 @@ public ReactImageView( mDraweeControllerBuilder = draweeControllerBuilder; mGlobalImageLoadListener = globalImageLoadListener; mCallerContext = callerContext; + // Workaround Android bug where ImageView visibility is not propagated to the Drawable, so you + // have to manually update visibility. Will be resolved once we move to VitoView. + setLegacyVisibilityHandlingEnabled(true); } public void setShouldNotifyLoadEvents(boolean shouldNotify) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java index 8c401a3544f1e0..d6320d42b72529 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java @@ -567,11 +567,6 @@ public boolean onHoverEvent(MotionEvent event) { return super.onHoverEvent(event); } - @Override - public void onChildStartedNativeGesture(MotionEvent ev) { - this.onChildStartedNativeGesture(null, ev); - } - @Override public void onChildStartedNativeGesture(View childView, MotionEvent ev) { mJSTouchDispatcher.onChildStartedNativeGesture(ev, mEventDispatcher); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index c5271853b4d09c..57a208c36ab96d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -825,7 +825,6 @@ private void handlePostTouchScrolling(int velocityX, int velocityY) { new Runnable() { private boolean mSnappingToPage = false; - private boolean mRunning = true; private int mStableFrames = 0; @Override @@ -834,7 +833,8 @@ public void run() { // We are still scrolling. mActivelyScrolling = false; mStableFrames = 0; - mRunning = true; + ViewCompat.postOnAnimationDelayed( + ReactHorizontalScrollView.this, this, ReactScrollViewHelper.MOMENTUM_DELAY); } else { // There has not been a scroll update since the last time this Runnable executed. ReactScrollViewHelper.updateFabricScrollState(ReactHorizontalScrollView.this); @@ -847,31 +847,25 @@ public void run() { // fire before the first scroll event of an animated scroll/fling, and stop // immediately. mStableFrames++; - mRunning = (mStableFrames < 3); - - if (mPagingEnabled && !mSnappingToPage) { - // Only if we have pagingEnabled and we have not snapped to the page do we - // need to continue checking for the scroll. And we cause that scroll by asking for - // it - mSnappingToPage = true; - flingAndSnap(0); - ViewCompat.postOnAnimationDelayed( - ReactHorizontalScrollView.this, this, ReactScrollViewHelper.MOMENTUM_DELAY); - } else { + + if (mStableFrames >= 3) { + mPostTouchRunnable = null; if (mSendMomentumEvents) { ReactScrollViewHelper.emitScrollMomentumEndEvent(ReactHorizontalScrollView.this); } disableFpsListener(); + } else { + if (mPagingEnabled && !mSnappingToPage) { + // If we have pagingEnabled and we have not snapped to the page + // we need to cause that scroll by asking for it + mSnappingToPage = true; + flingAndSnap(0); + } + // The scrollview has not "stabilized" so we just post to check again a frame later + ViewCompat.postOnAnimationDelayed( + ReactHorizontalScrollView.this, this, ReactScrollViewHelper.MOMENTUM_DELAY); } } - - // We are still scrolling so we just post to check again a frame later - if (mRunning) { - ViewCompat.postOnAnimationDelayed( - ReactHorizontalScrollView.this, this, ReactScrollViewHelper.MOMENTUM_DELAY); - } else { - mPostTouchRunnable = null; - } } }; ViewCompat.postOnAnimationDelayed( diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 6bda8b8826b474..86d9dafffe2d67 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -645,7 +645,6 @@ private void handlePostTouchScrolling(int velocityX, int velocityY) { new Runnable() { private boolean mSnappingToPage = false; - private boolean mRunning = true; private int mStableFrames = 0; @Override @@ -654,7 +653,8 @@ public void run() { // We are still scrolling. mActivelyScrolling = false; mStableFrames = 0; - mRunning = true; + ViewCompat.postOnAnimationDelayed( + ReactScrollView.this, this, ReactScrollViewHelper.MOMENTUM_DELAY); } else { // There has not been a scroll update since the last time this Runnable executed. ReactScrollViewHelper.updateFabricScrollState(ReactScrollView.this); @@ -667,31 +667,25 @@ public void run() { // fire before the first scroll event of an animated scroll/fling, and stop // immediately. mStableFrames++; - mRunning = (mStableFrames < 3); - - if (mPagingEnabled && !mSnappingToPage) { - // Only if we have pagingEnabled and we have not snapped to the page do we - // need to continue checking for the scroll. And we cause that scroll by asking for - // it - mSnappingToPage = true; - flingAndSnap(0); - ViewCompat.postOnAnimationDelayed( - ReactScrollView.this, this, ReactScrollViewHelper.MOMENTUM_DELAY); - } else { + + if (mStableFrames >= 3) { + mPostTouchRunnable = null; if (mSendMomentumEvents) { ReactScrollViewHelper.emitScrollMomentumEndEvent(ReactScrollView.this); } disableFpsListener(); + } else { + if (mPagingEnabled && !mSnappingToPage) { + // If we have pagingEnabled and we have not snapped to the page + // we need to cause that scroll by asking for it + mSnappingToPage = true; + flingAndSnap(0); + } + // The scrollview has not "stabilized" so we just post to check again a frame later + ViewCompat.postOnAnimationDelayed( + ReactScrollView.this, this, ReactScrollViewHelper.MOMENTUM_DELAY); } } - - // We are still scrolling so we just post to check again a frame later - if (mRunning) { - ViewCompat.postOnAnimationDelayed( - ReactScrollView.this, this, ReactScrollViewHelper.MOMENTUM_DELAY); - } else { - mPostTouchRunnable = null; - } } }; ViewCompat.postOnAnimationDelayed( diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.java index e16dd1cad29358..ac34e2541bf3a2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.java @@ -101,6 +101,15 @@ private static void emitScrollEve private static void emitScrollEvent( T scrollView, ScrollEventType scrollEventType, float xVelocity, float yVelocity) { long now = System.currentTimeMillis(); + // Throttle the scroll event if scrollEventThrottle is set to be equal or more than 17 ms. + // We limit the delta to 17ms so that small throttles intended to enable 60fps updates will not + // inadvertently filter out any scroll events. + if (scrollView.getScrollEventThrottle() + >= Math.max(17, now - scrollView.getLastScrollDispatchTime())) { + // Scroll events are throttled. + return; + } + View contentView = scrollView.getChildAt(0); if (contentView == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java index 46e0ccf36c6e9d..b41b0858f6f83b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java @@ -379,4 +379,22 @@ public void setPointerEvents(ReactScrollView view, @Nullable String pointerEvent public void setScrollEventThrottle(ReactScrollView view, int scrollEventThrottle) { view.setScrollEventThrottle(scrollEventThrottle); } + + @ReactProp(name = "isInvertedVirtualizedList") + public void setIsInvertedVirtualizedList(ReactScrollView view, boolean applyFix) { + // Usually when inverting the scroll view we are using scaleY: -1 on the list + // and on the parent container. HOWEVER, starting from android API 33 there is + // a bug that can cause an ANR due to that. Thus we are using different transform + // commands to circumvent the ANR. This however causes the vertical scrollbar to + // be on the wrong side. Thus we are moving it to the other side, when the list + // is inverted. + // See also: + // - https://github.com/facebook/react-native/issues/35350 + // - https://issuetracker.google.com/issues/287304310 + if (applyFix) { + view.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT); + } else { + view.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_DEFAULT); + } + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java index 7866390bfa09bd..51fd4dd0149c77 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java @@ -14,6 +14,7 @@ import android.text.style.MetricAffectingSpan; import androidx.annotation.Nullable; import com.facebook.infer.annotation.Nullsafe; +import com.facebook.react.common.assets.ReactFontManager; @Nullsafe(Nullsafe.Mode.LOCAL) public class CustomStyleSpan extends MetricAffectingSpan implements ReactSpan { @@ -60,11 +61,13 @@ public void updateMeasureState(TextPaint paint) { } public int getStyle() { - return mStyle == ReactBaseTextShadowNode.UNSET ? Typeface.NORMAL : mStyle; + return mStyle == ReactFontManager.TypefaceStyle.UNSET ? Typeface.NORMAL : mStyle; } public int getWeight() { - return mWeight == ReactBaseTextShadowNode.UNSET ? TypefaceStyle.NORMAL : mWeight; + return mWeight == ReactFontManager.TypefaceStyle.UNSET + ? ReactFontManager.TypefaceStyle.NORMAL + : mWeight; } public @Nullable String getFontFamily() { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java index 6bb75fb5b54b7e..d2c2d6e7b80ba4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java @@ -22,6 +22,7 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.common.ReactConstants; +import com.facebook.react.common.assets.ReactFontManager; import com.facebook.react.uimanager.IllegalViewOperationException; import com.facebook.react.uimanager.LayoutShadowNode; import com.facebook.react.uimanager.NativeViewHierarchyOptimizer; @@ -56,7 +57,7 @@ public abstract class ReactBaseTextShadowNode extends LayoutShadowNode { // character. // https://en.wikipedia.org/wiki/Bi-directional_text#weak_characters private static final String INLINE_VIEW_PLACEHOLDER = "0"; - public static final int UNSET = -1; + public static final int UNSET = ReactFontManager.TypefaceStyle.UNSET; public static final String PROP_SHADOW_OFFSET = "textShadowOffset"; public static final String PROP_SHADOW_OFFSET_WIDTH = "width"; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java index c7dc9b34265a4e..0b3310e3f1bb1d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java @@ -10,172 +10,57 @@ import android.content.Context; import android.content.res.AssetManager; import android.graphics.Typeface; -import android.util.SparseArray; import androidx.annotation.Nullable; -import androidx.core.content.res.ResourcesCompat; import com.facebook.infer.annotation.Nullsafe; -import java.util.HashMap; -import java.util.Map; /** * Responsible for loading and caching Typeface objects. * - *

    This will first try to load a typeface from the assets/fonts folder. If one is not found in - * that folder, this will fallback to the best matching system typeface. - * - *

    Custom fonts support the extensions `.ttf` and `.otf` and the variants `bold`, `italic`, and - * `bold_italic`. For example, given a font named "ExampleFontFamily", the following are supported: - * - *

      - *
    • ExampleFontFamily.ttf (or .otf) - *
    • ExampleFontFamily_bold.ttf (or .otf) - *
    • ExampleFontFamily_italic.ttf (or .otf) - *
    • ExampleFontFamily_bold_italic.ttf (or .otf) + * @deprecated This class is deprecated and it will be deleted in the near future. Please use {@link + * com.facebook.react.common.assets.ReactFontManager} instead. */ @Nullsafe(Nullsafe.Mode.LOCAL) +@Deprecated public class ReactFontManager { - // NOTE: Indices in `EXTENSIONS` correspond to the `TypeFace` style constants. - private static final String[] EXTENSIONS = {"", "_bold", "_italic", "_bold_italic"}; - private static final String[] FILE_EXTENSIONS = {".ttf", ".otf"}; - private static final String FONTS_ASSET_PATH = "fonts/"; - private static ReactFontManager sReactFontManagerInstance; + private final com.facebook.react.common.assets.ReactFontManager mDelegate; - private final Map mFontCache; - private final Map mCustomTypefaceCache; - - private ReactFontManager() { - mFontCache = new HashMap<>(); - mCustomTypefaceCache = new HashMap<>(); + private ReactFontManager(com.facebook.react.common.assets.ReactFontManager delegate) { + mDelegate = delegate; } public static ReactFontManager getInstance() { if (sReactFontManagerInstance == null) { - sReactFontManagerInstance = new ReactFontManager(); + sReactFontManagerInstance = + new ReactFontManager(com.facebook.react.common.assets.ReactFontManager.getInstance()); } return sReactFontManagerInstance; } public Typeface getTypeface(String fontFamilyName, int style, AssetManager assetManager) { - return getTypeface(fontFamilyName, new TypefaceStyle(style), assetManager); + return mDelegate.getTypeface(fontFamilyName, style, assetManager); } public Typeface getTypeface( String fontFamilyName, int weight, boolean italic, AssetManager assetManager) { - return getTypeface(fontFamilyName, new TypefaceStyle(weight, italic), assetManager); + return mDelegate.getTypeface(fontFamilyName, weight, italic, assetManager); } public Typeface getTypeface( String fontFamilyName, int style, int weight, AssetManager assetManager) { - return getTypeface(fontFamilyName, new TypefaceStyle(style, weight), assetManager); - } - - public Typeface getTypeface( - String fontFamilyName, TypefaceStyle typefaceStyle, AssetManager assetManager) { - if (mCustomTypefaceCache.containsKey(fontFamilyName)) { - // Apply `typefaceStyle` because custom fonts configure variants using `app:fontStyle` and - // `app:fontWeight` in their resource XML configuration file. - return typefaceStyle.apply(mCustomTypefaceCache.get(fontFamilyName)); - } - - AssetFontFamily assetFontFamily = mFontCache.get(fontFamilyName); - if (assetFontFamily == null) { - assetFontFamily = new AssetFontFamily(); - mFontCache.put(fontFamilyName, assetFontFamily); - } - - int style = typefaceStyle.getNearestStyle(); - - Typeface assetTypeface = assetFontFamily.getTypefaceForStyle(style); - if (assetTypeface == null) { - assetTypeface = createAssetTypeface(fontFamilyName, style, assetManager); - assetFontFamily.setTypefaceForStyle(style, assetTypeface); - } - // Do not apply `typefaceStyle` because asset font files already incorporate the style. - return assetTypeface; + return mDelegate.getTypeface(fontFamilyName, style, weight, assetManager); } - /* - * This method allows you to load custom fonts from res/font folder as provided font family name. - * Fonts may be one of .ttf, .otf or XML (https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml). - * To support multiple font styles or weights, you must provide a font in XML format. - * - * ReactFontManager.getInstance().addCustomFont(this, "Srisakdi", R.font.srisakdi); - */ public void addCustomFont(Context context, String fontFamily, int fontId) { - Typeface font = ResourcesCompat.getFont(context, fontId); - if (font != null) { - mCustomTypefaceCache.put(fontFamily, font); - } + mDelegate.addCustomFont(context, fontFamily, fontId); } - /** - * Equivalent method to {@see addCustomFont(Context, String, int)} which accepts a Typeface - * object. - */ public void addCustomFont(String fontFamily, @Nullable Typeface font) { - if (font != null) { - mCustomTypefaceCache.put(fontFamily, font); - } + mDelegate.addCustomFont(fontFamily, font); } - /** - * Add additional font family, or replace the exist one in the font memory cache. - * - * @param style - * @see {@link Typeface#DEFAULT} - * @see {@link Typeface#BOLD} - * @see {@link Typeface#ITALIC} - * @see {@link Typeface#BOLD_ITALIC} - */ public void setTypeface(String fontFamilyName, int style, Typeface typeface) { - if (typeface != null) { - AssetFontFamily assetFontFamily = mFontCache.get(fontFamilyName); - if (assetFontFamily == null) { - assetFontFamily = new AssetFontFamily(); - mFontCache.put(fontFamilyName, assetFontFamily); - } - assetFontFamily.setTypefaceForStyle(style, typeface); - } - } - - private static Typeface createAssetTypeface( - String fontFamilyName, int style, AssetManager assetManager) { - String extension = EXTENSIONS[style]; - for (String fileExtension : FILE_EXTENSIONS) { - String fileName = - new StringBuilder() - .append(FONTS_ASSET_PATH) - .append(fontFamilyName) - .append(extension) - .append(fileExtension) - .toString(); - try { - return Typeface.createFromAsset(assetManager, fileName); - } catch (RuntimeException e) { - // If the typeface asset does not exist, try another extension. - continue; - } - } - return Typeface.create(fontFamilyName, style); - } - - /** Responsible for caching typefaces for each custom font family. */ - private static class AssetFontFamily { - - private SparseArray mTypefaceSparseArray; - - private AssetFontFamily() { - mTypefaceSparseArray = new SparseArray<>(4); - } - - public @Nullable Typeface getTypefaceForStyle(int style) { - return mTypefaceSparseArray.get(style); - } - - public void setTypefaceForStyle(int style, Typeface typeface) { - mTypefaceSparseArray.put(style, typeface); - } + mDelegate.setTypeface(fontFamilyName, style, typeface); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java index b69452d9384fcf..a66950c7966af6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java @@ -87,7 +87,7 @@ public long measure( // TODO: We could probably use a smarter algorithm here. This will require 0(n) // measurements // based on the number of points the font size needs to be reduced by. - currentFontSize = currentFontSize - (int) PixelUtil.toPixelFromDIP(1); + currentFontSize -= Math.max(1, (int) PixelUtil.toPixelFromDIP(1)); float ratio = (float) currentFontSize / (float) initialFontSize; ReactAbsoluteSizeSpan[] sizeSpans = diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTypefaceUtils.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTypefaceUtils.java index d71cbdea942626..64fe5e36c0eb0d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTypefaceUtils.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTypefaceUtils.java @@ -13,6 +13,7 @@ import androidx.annotation.Nullable; import com.facebook.infer.annotation.Nullsafe; import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.common.assets.ReactFontManager; import java.util.ArrayList; import java.util.List; @@ -44,7 +45,7 @@ public static int parseFontWeight(@Nullable String fontWeightString) { return 900; } } - return ReactBaseTextShadowNode.UNSET; + return ReactFontManager.TypefaceStyle.UNSET; } public static int parseFontStyle(@Nullable String fontStyleString) { @@ -56,7 +57,7 @@ public static int parseFontStyle(@Nullable String fontStyleString) { return Typeface.NORMAL; } } - return ReactBaseTextShadowNode.UNSET; + return ReactFontManager.TypefaceStyle.UNSET; } public static @Nullable String parseFontVariant(@Nullable ReadableArray fontVariantArray) { @@ -184,7 +185,8 @@ public static Typeface applyStyles( int weight, @Nullable String fontFamilyName, AssetManager assetManager) { - TypefaceStyle typefaceStyle = new TypefaceStyle(style, weight); + ReactFontManager.TypefaceStyle typefaceStyle = + new ReactFontManager.TypefaceStyle(style, weight); if (fontFamilyName == null) { return typefaceStyle.apply(typeface == null ? Typeface.DEFAULT : typeface); } else { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TypefaceStyle.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TypefaceStyle.java deleted file mode 100644 index 7fb87a4ff54340..00000000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TypefaceStyle.java +++ /dev/null @@ -1,72 +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. - */ - -package com.facebook.react.views.text; - -import android.graphics.Typeface; -import android.os.Build; -import com.facebook.infer.annotation.Nullsafe; - -/** Responsible for normalizing style and numeric weight for backward compatibility. */ -@Nullsafe(Nullsafe.Mode.LOCAL) -class TypefaceStyle { - - public static final int BOLD = 700; - public static final int NORMAL = 400; - - private static final int MIN_WEIGHT = 1; - private static final int MAX_WEIGHT = 1000; - - private final boolean mItalic; - private final int mWeight; - - public TypefaceStyle(int weight, boolean italic) { - mItalic = italic; - mWeight = weight == ReactBaseTextShadowNode.UNSET ? NORMAL : weight; - } - - public TypefaceStyle(int style) { - if (style == ReactBaseTextShadowNode.UNSET) { - style = Typeface.NORMAL; - } - - mItalic = (style & Typeface.ITALIC) != 0; - mWeight = (style & Typeface.BOLD) != 0 ? BOLD : NORMAL; - } - - /** - * If `weight` is supplied, it will be combined with the italic bit from `style`. Otherwise, any - * existing weight bit in `style` will be used. - */ - public TypefaceStyle(int style, int weight) { - if (style == ReactBaseTextShadowNode.UNSET) { - style = Typeface.NORMAL; - } - - mItalic = (style & Typeface.ITALIC) != 0; - mWeight = - weight == ReactBaseTextShadowNode.UNSET - ? (style & Typeface.BOLD) != 0 ? BOLD : NORMAL - : weight; - } - - public int getNearestStyle() { - if (mWeight < BOLD) { - return mItalic ? Typeface.ITALIC : Typeface.NORMAL; - } else { - return mItalic ? Typeface.BOLD_ITALIC : Typeface.BOLD; - } - } - - public Typeface apply(Typeface typeface) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { - return Typeface.create(typeface, getNearestStyle()); - } else { - return Typeface.create(typeface, mWeight, mItalic); - } - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java index 448e94885dc21a..55c92a7df207f2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -632,10 +632,13 @@ public void maybeSetText(ReactTextUpdate reactTextUpdate) { if (reactTextUpdate.getText().length() == 0) { setText(null); } else { - // When we update text, we trigger onChangeText code that will - // try to update state if the wrapper is available. Temporarily disable - // to prevent an infinite loop. + boolean shouldRestoreComposingSpans = length() == spannableStringBuilder.length(); + getText().replace(0, length(), spannableStringBuilder); + + if (shouldRestoreComposingSpans) { + restoreComposingSpansToTextFrom(spannableStringBuilder); + } } mDisableTextDiffing = false; @@ -650,10 +653,13 @@ public void maybeSetText(ReactTextUpdate reactTextUpdate) { } /** - * Remove and/or add {@link Spanned.SPAN_EXCLUSIVE_EXCLUSIVE} spans, since they should only exist - * as long as the text they cover is the same. All other spans will remain the same, since they - * will adapt to the new text, hence why {@link SpannableStringBuilder#replace} never removes - * them. + * Remove and/or add {@link Spanned#SPAN_EXCLUSIVE_EXCLUSIVE} spans, since they should only exist + * as long as the text they cover is the same unless they are {@link Spanned#SPAN_COMPOSING}. All + * other spans will remain the same, since they will adapt to the new text, hence why {@link + * SpannableStringBuilder#replace} never removes them. Keep copy of {@link Spanned#SPAN_COMPOSING} + * Spans in {@param spannableStringBuilder}, because they are important for keyboard suggestions. + * Without keeping these Spans, suggestions default to be put after the current selection + * position, possibly resulting in letter duplication. */ private void manageSpans(SpannableStringBuilder spannableStringBuilder) { Object[] spans = getText().getSpans(0, length(), Object.class); @@ -662,6 +668,7 @@ private void manageSpans(SpannableStringBuilder spannableStringBuilder) { int spanFlags = getText().getSpanFlags(span); boolean isExclusiveExclusive = (spanFlags & Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) == Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; + boolean isComposing = (spanFlags & Spanned.SPAN_COMPOSING) == Spanned.SPAN_COMPOSING; // Remove all styling spans we might have previously set if (span instanceof ReactSpan) { @@ -676,6 +683,12 @@ private void manageSpans(SpannableStringBuilder spannableStringBuilder) { final int spanStart = getText().getSpanStart(span); final int spanEnd = getText().getSpanEnd(span); + // We keep a copy of Composing spans + if (isComposing) { + spannableStringBuilder.setSpan(span, spanStart, spanEnd, spanFlags); + continue; + } + // Make sure the span is removed from existing text, otherwise the spans we set will be // ignored or it will cover text that has changed. getText().removeSpan(span); @@ -803,6 +816,34 @@ private void addSpansFromStyleAttributes(SpannableStringBuilder workingText) { } } + /** + * Attaches the {@link Spanned#SPAN_COMPOSING} from {@param spannableStringBuilder} to {@link + * ReactEditText#getText} + * + *

      See {@link ReactEditText#manageSpans} for more details. Also + * https://github.com/facebook/react-native/issues/11068 + */ + private void restoreComposingSpansToTextFrom(SpannableStringBuilder spannableStringBuilder) { + Editable text = getText(); + if (text == null) { + return; + } + Object[] spans = spannableStringBuilder.getSpans(0, length(), Object.class); + for (Object span : spans) { + int spanFlags = spannableStringBuilder.getSpanFlags(span); + boolean isComposing = (spanFlags & Spanned.SPAN_COMPOSING) == Spanned.SPAN_COMPOSING; + + if (!isComposing) { + continue; + } + + final int spanStart = spannableStringBuilder.getSpanStart(span); + final int spanEnd = spannableStringBuilder.getSpanEnd(span); + + text.setSpan(span, spanStart, spanEnd, spanFlags); + } + } + private static boolean sameTextForSpan( final Editable oldText, final SpannableStringBuilder newText, diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java index 3532e45ec87556..daa87bf0f8389f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java @@ -12,7 +12,7 @@ public enum YogaExperimentalFeature { WEB_FLEX_BASIS(0), ABSOLUTE_PERCENTAGE_AGAINST_PADDING_EDGE(1), - FIX_ABSOLUTE_TRAILING_COLUMN_MARGIN(2); + FIX_JNILOCAL_REF_OVERFLOWS(2); private final int mIntValue; @@ -28,7 +28,7 @@ public static YogaExperimentalFeature fromInt(int value) { switch (value) { case 0: return WEB_FLEX_BASIS; case 1: return ABSOLUTE_PERCENTAGE_AGAINST_PADDING_EDGE; - case 2: return FIX_ABSOLUTE_TRAILING_COLUMN_MARGIN; + case 2: return FIX_JNILOCAL_REF_OVERFLOWS; default: throw new IllegalArgumentException("Unknown enum value: " + value); } } diff --git a/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt index f97a1a2ee278db..5420b01e5b7c2e 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt +++ b/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt @@ -48,6 +48,7 @@ add_react_third_party_ndk_subdir(fmt) add_react_third_party_ndk_subdir(libevent) add_react_third_party_ndk_subdir(folly) add_react_third_party_ndk_subdir(jsc) +add_react_third_party_ndk_subdir(googletest) # Common targets add_react_common_subdir(yoga) @@ -97,6 +98,10 @@ add_react_common_subdir(react/utils) add_react_common_subdir(react/bridging) add_react_common_subdir(react/renderer/mapbuffer) add_react_common_subdir(react/nativemodule/core) +add_react_common_subdir(jserrorhandler) +add_react_common_subdir(react/bridgeless) +add_react_common_subdir(react/bridgeless/hermes) +add_react_common_subdir(react/bridgeless/nativeviewconfig) # ReactAndroid JNI targets add_react_build_subdir(generated/source/codegen/jni) @@ -114,12 +119,9 @@ add_react_android_subdir(src/main/jni/react/fabric) add_react_android_subdir(src/main/jni/react/newarchdefaults) add_react_android_subdir(src/main/jni/react/hermes/reactexecutor) add_react_android_subdir(src/main/jni/react/hermes/instrumentation/) - -# GTest setup -set(GOOGLETEST_ROOT ${ANDROID_NDK}/sources/third_party/googletest) -add_library(gtest STATIC ${GOOGLETEST_ROOT}/src/gtest_main.cc ${GOOGLETEST_ROOT}/src/gtest-all.cc) -target_include_directories(gtest PRIVATE ${GOOGLETEST_ROOT}) -target_include_directories(gtest PUBLIC ${GOOGLETEST_ROOT}/include) +add_react_android_subdir(src/main/jni/react/bridgeless/jni) +add_react_android_subdir(src/main/jni/react/bridgeless/hermes/jni) +add_react_android_subdir(src/main/jni/react/bridgeless/jsc/jni) # GTest dependencies add_executable(reactnative_unittest @@ -163,17 +165,17 @@ add_executable(reactnative_unittest ${REACT_COMMON_DIR}/react/renderer/templateprocessor/tests/UITemplateProcessorTest.cpp ${REACT_COMMON_DIR}/react/renderer/textlayoutmanager/tests/TextLayoutManagerTest.cpp ${REACT_COMMON_DIR}/react/renderer/uimanager/tests/FabricUIManagerTest.cpp - + ########## (COMPILE BUT FAIL ON ASSERTS) ########### # ${REACT_COMMON_DIR}/react/renderer/animations/tests/LayoutAnimationTest.cpp # ${REACT_COMMON_DIR}/react/renderer/mounting/tests/MountingTest.cpp # ${REACT_COMMON_DIR}/react/renderer/mounting/tests/ShadowTreeLifeCycleTest.cpp - + ########## (COMPILE BUT FAIL WITH RUNTIME EXCEPTIONS) ########### # ${REACT_COMMON_DIR}/hermes/inspector/chrome/tests/ConnectionDemuxTests.cpp # ${REACT_COMMON_DIR}/hermes/inspector/detail/tests/SerialExecutorTests.cpp # ${REACT_COMMON_DIR}/hermes/inspector/tests/InspectorTests.cpp - + ########## (DO NOT COMPILE) ########### # ${REACT_COMMON_DIR}/react/renderer/core/tests/ShadowNodeTest.cpp # ${REACT_COMMON_DIR}/react/renderer/core/tests/ConcreteShadowNodeTest.cpp @@ -192,9 +194,9 @@ add_executable(reactnative_unittest target_link_libraries(reactnative_unittest folly_runtime folly_futures - glog + glog glog_init - gtest + gtest_main hermes-engine::libhermes hermes_inspector jsi diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/fb/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/first-party/fb/CMakeLists.txt index c3e3ecebbbd75b..16eb9527e1b8fe 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/fb/CMakeLists.txt +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/fb/CMakeLists.txt @@ -21,7 +21,7 @@ add_compile_options( -Wno-error=unused-but-set-variable -DHAVE_POSIX_CLOCKS ) -if(${CMAKE_BUILD_TYPE} MATCHES Release) +if(NOT ${CMAKE_BUILD_TYPE} MATCHES Debug) add_compile_options(-DNDEBUG) endif() diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/ScopedGlobalRef.h b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/ScopedGlobalRef.h index 64ca74dc59a2dd..fa0afba27efb4f 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/ScopedGlobalRef.h +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/ScopedGlobalRef.h @@ -12,9 +12,7 @@ #include #include "corefunctions.h" -namespace facebook { -namespace yoga { -namespace vanillajni { +namespace facebook::yoga::vanillajni { /** * ScopedGlobalRef is a sort of smart reference that allows us to control the @@ -132,6 +130,4 @@ ScopedGlobalRef make_global_ref(T globalRef) { return ScopedGlobalRef(globalRef); } -} // namespace vanillajni -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::vanillajni diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/ScopedLocalRef.h b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/ScopedLocalRef.h index 56c4d101e09d95..e486e20460fbcb 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/ScopedLocalRef.h +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/ScopedLocalRef.h @@ -15,9 +15,7 @@ #include #include -namespace facebook { -namespace yoga { -namespace vanillajni { +namespace facebook::yoga::vanillajni { /** * ScopedLocalRef is a sort of smart reference that allows us to control the @@ -132,6 +130,4 @@ ScopedLocalRef make_local_ref(JNIEnv* env, T localRef) { return ScopedLocalRef(env, localRef); } -} // namespace vanillajni -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::vanillajni diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp index 0a95d991976a8b..1f0dd1c4a869ca 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp @@ -280,7 +280,8 @@ static void YGTransferLayoutOutputsRecursive( JNIEnv* env, jobject thiz, YGNodeRef root, - void* layoutContext) { + void* layoutContext, + bool shouldCleanLocalRef) { if (!YGNodeGetHasNewLayout(root)) { return; } @@ -346,11 +347,16 @@ static void YGTransferLayoutOutputsRecursive( env->SetFloatArrayRegion(arrFinal.get(), 0, arrSize, arr); env->SetObjectField(obj.get(), arrField, arrFinal.get()); + if (shouldCleanLocalRef) { + objectClass.reset(); + arrFinal.reset(); + } + YGNodeSetHasNewLayout(root, false); for (uint32_t i = 0; i < YGNodeGetChildCount(root); i++) { YGTransferLayoutOutputsRecursive( - env, thiz, YGNodeGetChild(root, i), layoutContext); + env, thiz, YGNodeGetChild(root, i), layoutContext, shouldCleanLocalRef); } } @@ -372,13 +378,17 @@ static void jni_YGNodeCalculateLayoutJNI( } const YGNodeRef root = _jlong2YGNodeRef(nativePointer); + const bool shouldCleanLocalRef = + root->getConfig()->isExperimentalFeatureEnabled( + YGExperimentalFeatureFixJNILocalRefOverflows); YGNodeCalculateLayoutWithContext( root, static_cast(width), static_cast(height), YGNodeStyleGetDirection(_jlong2YGNodeRef(nativePointer)), layoutContext); - YGTransferLayoutOutputsRecursive(env, obj, root, layoutContext); + YGTransferLayoutOutputsRecursive( + env, obj, root, layoutContext, shouldCleanLocalRef); } catch (const YogaJniException& jniException) { ScopedLocalRef throwable = jniException.getThrowable(); if (throwable.get()) { diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YogaJniException.cpp b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YogaJniException.cpp index 81bdf28f90540d..aabbc753375a00 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YogaJniException.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YogaJniException.cpp @@ -10,9 +10,7 @@ #include "YogaJniException.h" #include "common.h" -namespace facebook { -namespace yoga { -namespace vanillajni { +namespace facebook::yoga::vanillajni { YogaJniException::YogaJniException() { jclass cl = getCurrentEnv()->FindClass("java/lang/RuntimeException"); @@ -47,6 +45,5 @@ ScopedLocalRef YogaJniException::getThrowable() const noexcept { getCurrentEnv(), static_cast(getCurrentEnv()->NewLocalRef(throwable_.get()))); } -} // namespace vanillajni -} // namespace yoga -} // namespace facebook + +} // namespace facebook::yoga::vanillajni diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YogaJniException.h b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YogaJniException.h index b0378ab450ff83..7c858b5ac8dcd6 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YogaJniException.h +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YogaJniException.h @@ -9,9 +9,7 @@ #include #include "common.h" -namespace facebook { -namespace yoga { -namespace vanillajni { +namespace facebook::yoga::vanillajni { /** * This class wraps a Java exception (jthrowable) into a C++ exception; A global * reference to Java exception (jthrowable) is made so that the exception object @@ -33,6 +31,5 @@ class YogaJniException : public std::exception { private: ScopedGlobalRef throwable_; }; -} // namespace vanillajni -} // namespace yoga -} // namespace facebook + +} // namespace facebook::yoga::vanillajni diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/common.cpp b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/common.cpp index e8ece68a363897..f7a43175c45357 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/common.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/common.cpp @@ -7,9 +7,7 @@ #include "common.h" -namespace facebook { -namespace yoga { -namespace vanillajni { +namespace facebook::yoga::vanillajni { void registerNatives( JNIEnv* env, @@ -109,6 +107,5 @@ ScopedGlobalRef newGlobalRef(JNIEnv* env, jthrowable obj) { return make_global_ref(result); } -} // namespace vanillajni -} // namespace yoga -} // namespace facebook + +} // namespace facebook::yoga::vanillajni diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/common.h b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/common.h index d79c3e50ceb005..57631618cd548b 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/common.h +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/common.h @@ -9,9 +9,7 @@ #include "ScopedGlobalRef.h" #include "ScopedLocalRef.h" -namespace facebook { -namespace yoga { -namespace vanillajni { +namespace facebook::yoga::vanillajni { /** * Registers a set of methods for a JNI class. Aborts if registration fails. @@ -74,6 +72,5 @@ ScopedLocalRef callStaticObjectMethod( ScopedGlobalRef newGlobalRef(JNIEnv* env, jobject obj); ScopedGlobalRef newGlobalRef(JNIEnv* env, jthrowable obj); -} // namespace vanillajni -} // namespace yoga -} // namespace facebook + +} // namespace facebook::yoga::vanillajni diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.cpp b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.cpp index bbdcebd323df77..bcaf811923ea81 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.cpp @@ -9,9 +9,7 @@ #include "macros.h" #include "YogaJniException.h" -namespace facebook { -namespace yoga { -namespace vanillajni { +namespace facebook::yoga::vanillajni { namespace { JavaVM* globalVm = NULL; @@ -90,6 +88,4 @@ void assertNoPendingJniExceptionIf(JNIEnv* env, bool condition) { throw YogaJniException(); } -} // namespace vanillajni -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::vanillajni diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.h b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.h index e6f2650e09fea2..ced9480b9cb3ae 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.h +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.h @@ -10,9 +10,7 @@ #include #include -namespace facebook { -namespace yoga { -namespace vanillajni { +namespace facebook::yoga::vanillajni { /** * This method has to be called before using the vanillajni library. This method @@ -49,6 +47,4 @@ void assertNoPendingJniException(JNIEnv* env); void assertNoPendingJniExceptionIf(JNIEnv* env, bool condition); -} // namespace vanillajni -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::vanillajni diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/CMakeLists.txt new file mode 100644 index 00000000000000..a779d4f72a712d --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/CMakeLists.txt @@ -0,0 +1,29 @@ +# 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. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB_RECURSE hermes_instance_jni_SRC CONFIGURE_DEPENDS *.cpp) + +add_library(hermesinstancejni + SHARED + ${hermes_instance_jni_SRC} +) +target_compile_options( + hermesinstancejni + PRIVATE + $<$:-DHERMES_ENABLE_DEBUGGER=1> + -std=c++17 + -fexceptions +) +target_include_directories(hermesinstancejni PRIVATE .) +target_link_libraries( + hermesinstancejni + hermes-engine::libhermes + rninstance + fbjni + bridgelesshermes +) diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/JHermesInstance.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/JHermesInstance.cpp index 4c04821a75e5c6..4095d9cd605113 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/JHermesInstance.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/JHermesInstance.cpp @@ -7,7 +7,7 @@ #include "JHermesInstance.h" -#include +#include namespace facebook::react { diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/JHermesInstance.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/JHermesInstance.h index 117556998971d0..2fbc73a45cd011 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/JHermesInstance.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/JHermesInstance.h @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include #include diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/OnLoad.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/OnLoad.cpp index 136b1a09d123e6..f6aa11c21da613 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/OnLoad.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/hermes/jni/OnLoad.cpp @@ -5,12 +5,11 @@ * LICENSE file in the root directory of this source tree. */ -#include -#include +#include #include "JHermesInstance.h" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { - return facebook::xplat::initialize( + return facebook::jni::initialize( vm, [] { facebook::react::JHermesInstance::registerNatives(); }); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/CMakeLists.txt new file mode 100644 index 00000000000000..7b5fa858832498 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/CMakeLists.txt @@ -0,0 +1,31 @@ +# 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. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB_RECURSE bridgeless_jni_SRC CONFIGURE_DEPENDS *.cpp) + +add_library(rninstance + SHARED + ${bridgeless_jni_SRC} +) +target_compile_options( + rninstance + PRIVATE + $<$:-DHERMES_ENABLE_DEBUGGER=1> + -std=c++17 + -fexceptions +) +target_include_directories(rninstance PUBLIC .) +target_link_libraries( + rninstance + fabricjni + turbomodulejsijni + fb + jsi + fbjni + bridgeless +) diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JBindingsInstaller.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JBindingsInstaller.h index cc632469ba7f1e..1048f67b93f3e3 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JBindingsInstaller.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JBindingsInstaller.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include #include diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSEngineInstance.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSEngineInstance.h index ba4d66cfea0c99..8d1463cb5cd83c 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSEngineInstance.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSEngineInstance.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSTimerExecutor.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSTimerExecutor.cpp index ebd93d2d49b9fe..26a896816cad4e 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSTimerExecutor.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSTimerExecutor.cpp @@ -7,14 +7,13 @@ #include "JJSTimerExecutor.h" -#include +#include #include namespace facebook::react { void JJSTimerExecutor::setTimerManager( std::weak_ptr timerManager) { - assert(timerManager && "`timerManager` must not be `nullptr`."); timerManager_ = timerManager; } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSTimerExecutor.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSTimerExecutor.h index 3da6a77b1f8217..9436e71daad4f4 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSTimerExecutor.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJSTimerExecutor.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJavaTimerManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJavaTimerManager.cpp index 638f664cc782ce..b54da9b159130a 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJavaTimerManager.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJavaTimerManager.cpp @@ -7,7 +7,7 @@ #include "JJavaTimerManager.h" -#include +#include #include namespace facebook::react { diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJavaTimerManager.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJavaTimerManager.h index d44cec367fc795..e576a1f892a553 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJavaTimerManager.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JJavaTimerManager.h @@ -9,7 +9,7 @@ #include -#include +#include #include namespace facebook::react { diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactExceptionManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactExceptionManager.cpp index a8968d77bcc1aa..21cc5d52d3bfe8 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactExceptionManager.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactExceptionManager.cpp @@ -6,7 +6,7 @@ */ #include "JReactExceptionManager.h" -#include +#include #include #include #include diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactExceptionManager.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactExceptionManager.h index 23b4ea46b900a4..80b898c39ea9dc 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactExceptionManager.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactExceptionManager.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include @@ -17,7 +17,7 @@ class JReactExceptionManager : public facebook::jni::JavaClass { public: static auto constexpr kJavaDescriptor = - "Lcom/facebook/react/bridgeless/exceptionmanager/ReactJsExceptionHandler;"; + "Lcom/facebook/react/interfaces/exceptionmanager/ReactJsExceptionHandler;"; void reportJsException(const JReadableMapBuffer::javaobject errorMapBuffer); }; diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.cpp index 4df09482a59492..e5d2f4c6d07934 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.cpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include #include diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.h index 99e7d80ebb8778..652dc7234f4933 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JavaTimerRegistry.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JavaTimerRegistry.h index ae89a5296f8b5f..943b9bc4835dcb 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JavaTimerRegistry.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JavaTimerRegistry.h @@ -9,7 +9,7 @@ #include -#include +#include #include #include "JJavaTimerManager.h" diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/OnLoad.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/OnLoad.cpp index 171de6b35e31f1..e8dfb19f5b233f 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/OnLoad.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/OnLoad.cpp @@ -5,15 +5,14 @@ * LICENSE file in the root directory of this source tree. */ -#include -#include +#include #include #include "JJSTimerExecutor.h" #include "JReactInstance.h" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*unused*/) { - return facebook::xplat::initialize(vm, [] { + return facebook::jni::initialize(vm, [] { facebook::react::JReactMarker::setLogPerfMarkerIfNeeded(); facebook::react::JReactInstance::registerNatives(); facebook::react::JJSTimerExecutor::registerNatives(); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jsc/jni/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jsc/jni/CMakeLists.txt new file mode 100644 index 00000000000000..fed3a3cb824305 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jsc/jni/CMakeLists.txt @@ -0,0 +1,22 @@ +# 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. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +add_compile_options(-fvisibility=hidden -fexceptions -frtti) + +file(GLOB jscinstance_SRC CONFIGURE_DEPENDS "*.cpp") +add_library(jscinstance SHARED ${jscinstance_SRC}) + +target_include_directories(jscinstance PUBLIC .) + +target_link_libraries( + jscinstance + bridgeless + jscruntime + fbjni + reactnativejni +) diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jsc/jni/OnLoad.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jsc/jni/OnLoad.cpp new file mode 100644 index 00000000000000..01c982e8c6b1e2 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jsc/jni/OnLoad.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include +#include +#include +#include +#include +#include + +namespace facebook::react { + +class JSCInstance : public jni::HybridClass { + public: + static constexpr auto kJavaDescriptor = + "Lcom/facebook/react/bridgeless/JSCInstance;"; + + static jni::local_ref initHybrid(jni::alias_ref) { + return makeCxxInstance(); + } + + static void registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", JSCInstance::initHybrid), + }); + } + + std::unique_ptr createJSRuntime() noexcept { + return jsc::makeJSCRuntime(); + } + + private: + friend HybridBase; + using HybridBase::HybridBase; +}; + +} // namespace facebook::react + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { + return facebook::jni::initialize( + vm, [] { facebook::react::JSCInstance::registerNatives(); }); +} diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp index 3d880580d5cc46..c23648f0ea07f3 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -36,6 +35,7 @@ #include #include #include +#include namespace facebook::react { @@ -448,8 +448,7 @@ void Binding::installFabricUIManager( toolbox.synchronousEventBeatFactory = synchronousBeatFactory; toolbox.asynchronousEventBeatFactory = asynchronousBeatFactory; - if (reactNativeConfig_->getBool( - "react_fabric:enable_background_executor_android")) { + if (getFeatureFlagValue("enableBackgroundExecutor")) { backgroundExecutor_ = JBackgroundExecutor::create("fabric_bg"); toolbox.backgroundExecutor = backgroundExecutor_; } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/CoreComponentsRegistry.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/CoreComponentsRegistry.cpp index b82a561a074c05..49cca5270a59fa 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/CoreComponentsRegistry.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/CoreComponentsRegistry.cpp @@ -88,9 +88,9 @@ CoreComponentsRegistry::initHybrid( auto registry = CoreComponentsRegistry::sharedProviderRegistry() ->createComponentDescriptorRegistry( {eventDispatcher, contextContainer}); - auto mutableRegistry = - std::const_pointer_cast(registry); - mutableRegistry->setFallbackComponentDescriptor( + auto &mutableRegistry = + const_cast(*registry); + mutableRegistry.setFallbackComponentDescriptor( std::make_shared( ComponentDescriptorParameters{ eventDispatcher, contextContainer, nullptr})); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp index e39091a6a57635..993ddca71ac2e1 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp @@ -13,12 +13,12 @@ #include #include -#include #include #include #include #include #include +#include #include #include @@ -201,19 +201,14 @@ static inline void writeIntBufferTypePreamble( // TODO: this method will be removed when binding for components are code-gen jni::local_ref getPlatformComponentName(ShadowView const &shadowView) { static std::string scrollViewComponentName = std::string("ScrollView"); - - jni::local_ref componentName; if (scrollViewComponentName == shadowView.componentName) { - auto newViewProps = - std::static_pointer_cast(shadowView.props); - if (newViewProps->getProbablyMoreHorizontalThanVertical_DEPRECATED()) { - componentName = jni::make_jstring("AndroidHorizontalScrollView"); - return componentName; + const auto &newViewProps = + static_cast(*shadowView.props); + if (newViewProps.getProbablyMoreHorizontalThanVertical_DEPRECATED()) { + return jni::make_jstring("AndroidHorizontalScrollView"); } } - - componentName = jni::make_jstring(shadowView.componentName); - return componentName; + return jni::make_jstring(shadowView.componentName); } static inline float scale(Float value, Float pointScaleFactor) { diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/react/jni/CMakeLists.txt index cf8ffe295e4119..0e49300c78e8a4 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/CMakeLists.txt +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/CMakeLists.txt @@ -10,7 +10,6 @@ file(GLOB reactnativejni_SRC CONFIGURE_DEPENDS *.cpp) add_compile_options( -fexceptions - -frtti -Wno-unused-lambda-capture -std=c++17 -DWITH_INSPECTOR=1) diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index 53688d625d4a19..67c3fdfacfef60 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -398,8 +398,11 @@ CatalystInstanceImpl::getNativeMethodCallInvokerHolder() { jni::alias_ref CatalystInstanceImpl::getRuntimeExecutor() { if (!runtimeExecutor_) { - runtimeExecutor_ = jni::make_global( - JRuntimeExecutor::newObjectCxxArgs(instance_->getRuntimeExecutor())); + auto executor = instance_->getRuntimeExecutor(); + if (executor) { + runtimeExecutor_ = + jni::make_global(JRuntimeExecutor::newObjectCxxArgs(executor)); + } } return runtimeExecutor_; } @@ -408,15 +411,16 @@ jni::alias_ref CatalystInstanceImpl::getRuntimeScheduler() { if (!runtimeScheduler_) { auto runtimeExecutor = instance_->getRuntimeExecutor(); - auto runtimeScheduler = std::make_shared(runtimeExecutor); - - runtimeScheduler_ = - jni::make_global(JRuntimeScheduler::newObjectCxxArgs(runtimeScheduler)); - - runtimeExecutor([runtimeScheduler](jsi::Runtime &runtime) { - RuntimeSchedulerBinding::createAndInstallIfNeeded( - runtime, runtimeScheduler); - }); + if (runtimeExecutor) { + auto runtimeScheduler = + std::make_shared(runtimeExecutor); + runtimeScheduler_ = jni::make_global( + JRuntimeScheduler::newObjectCxxArgs(runtimeScheduler)); + runtimeExecutor([scheduler = + std::move(runtimeScheduler)](jsi::Runtime &runtime) { + RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, scheduler); + }); + } } return runtimeScheduler_; diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp index c3be1ad2b55a3f..59cf545a074833 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp @@ -19,7 +19,6 @@ void JReactMarker::setLogPerfMarkerIfNeeded() { ReactMarker::logTaggedMarkerImpl = JReactMarker::logPerfMarker; ReactMarker::logTaggedMarkerBridgelessImpl = JReactMarker::logPerfMarkerBridgeless; - ReactMarker::getAppStartTimeImpl = JReactMarker::getAppStartTime; }); } @@ -63,10 +62,16 @@ void JReactMarker::logPerfMarkerBridgeless( } void JReactMarker::logPerfMarkerWithInstanceKey( - const facebook::react::ReactMarker::ReactMarkerId markerId, + const ReactMarker::ReactMarkerId markerId, const char *tag, const int instanceKey) { switch (markerId) { + case ReactMarker::APP_STARTUP_START: + JReactMarker::logMarker("APP_STARTUP_START"); + break; + case ReactMarker::APP_STARTUP_STOP: + JReactMarker::logMarker("APP_STARTUP_END"); + break; case ReactMarker::RUN_JS_BUNDLE_START: JReactMarker::logMarker("RUN_JS_BUNDLE_START", tag, instanceKey); break; @@ -103,10 +108,52 @@ void JReactMarker::logPerfMarkerWithInstanceKey( } } -double JReactMarker::getAppStartTime() { - static auto cls = javaClassStatic(); - static auto meth = cls->getStaticMethod("getAppStartTime"); - return meth(cls); +void JReactMarker::nativeLogMarker( + jni::alias_ref /* unused */, + std::string markerNameStr, + jlong markerTime) { + // TODO: refactor this to a bidirectional map along with + // logPerfMarkerWithInstanceKey + if (markerNameStr == "APP_STARTUP_START") { + ReactMarker::logMarkerDone( + ReactMarker::APP_STARTUP_START, (double)markerTime); + } else if (markerNameStr == "APP_STARTUP_END") { + ReactMarker::logMarkerDone( + ReactMarker::APP_STARTUP_STOP, (double)markerTime); + } else if (markerNameStr == "RUN_JS_BUNDLE_START") { + ReactMarker::logMarkerDone( + ReactMarker::RUN_JS_BUNDLE_START, (double)markerTime); + } else if (markerNameStr == "RUN_JS_BUNDLE_END") { + ReactMarker::logMarkerDone( + ReactMarker::RUN_JS_BUNDLE_STOP, (double)markerTime); + } else if (markerNameStr == "CREATE_REACT_CONTEXT_END") { + ReactMarker::logMarkerDone( + ReactMarker::CREATE_REACT_CONTEXT_STOP, (double)markerTime); + } else if (markerNameStr == "loadApplicationScript_startStringConvert") { + ReactMarker::logMarkerDone( + ReactMarker::JS_BUNDLE_STRING_CONVERT_START, (double)markerTime); + } else if (markerNameStr == "loadApplicationScript_endStringConvert") { + ReactMarker::logMarkerDone( + ReactMarker::JS_BUNDLE_STRING_CONVERT_STOP, (double)markerTime); + } else if (markerNameStr == "NATIVE_MODULE_SETUP_START") { + ReactMarker::logMarkerDone( + ReactMarker::NATIVE_MODULE_SETUP_START, (double)markerTime); + } else if (markerNameStr == "NATIVE_MODULE_SETUP_END") { + ReactMarker::logMarkerDone( + ReactMarker::NATIVE_MODULE_SETUP_STOP, (double)markerTime); + } else if (markerNameStr == "REGISTER_JS_SEGMENT_START") { + ReactMarker::logMarkerDone( + ReactMarker::REGISTER_JS_SEGMENT_START, (double)markerTime); + } else if (markerNameStr == "REGISTER_JS_SEGMENT_STOP") { + ReactMarker::logMarkerDone( + ReactMarker::REGISTER_JS_SEGMENT_STOP, (double)markerTime); + } +} + +void JReactMarker::registerNatives() { + javaClassLocal()->registerNatives({ + makeNativeMethod("nativeLogMarker", JReactMarker::nativeLogMarker), + }); } } // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JReactMarker.h b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JReactMarker.h index a857ae4f3f72e1..1a48426c4fc4fa 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JReactMarker.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JReactMarker.h @@ -18,6 +18,7 @@ class JReactMarker : public facebook::jni::JavaClass { public: static constexpr auto kJavaDescriptor = "Lcom/facebook/react/bridge/ReactMarker;"; + static void registerNatives(); static void setLogPerfMarkerIfNeeded(); private: @@ -37,7 +38,10 @@ class JReactMarker : public facebook::jni::JavaClass { const ReactMarker::ReactMarkerId markerId, const char *tag, const int instanceKey); - static double getAppStartTime(); + static void nativeLogMarker( + jni::alias_ref /* unused */, + std::string markerNameStr, + jlong markerTime); }; } // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp index 58bd589c43d7ab..e3d6c3ef03aa79 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp @@ -16,6 +16,7 @@ #include "CatalystInstanceImpl.h" #include "CxxModuleWrapper.h" #include "JCallback.h" +#include "JReactMarker.h" #include "JavaScriptExecutorHolder.h" #include "ProxyExecutor.h" #include "WritableNativeArray.h" @@ -85,6 +86,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { NativeMap::registerNatives(); ReadableNativeMap::registerNatives(); WritableNativeMap::registerNatives(); + JReactMarker::registerNatives(); #ifdef WITH_INSPECTOR JInspector::registerNatives(); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp index 833db513e2f849..f99e2dbd262ee0 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp @@ -13,14 +13,6 @@ using namespace facebook::jni; namespace facebook::react { -// TODO T112842309: Remove after fbjni upgraded in OSS -void ReadableNativeArray::mapException(const std::exception &ex) { - if (dynamic_cast(&ex) != nullptr) { - throwNewJavaException( - exceptions::gUnexpectedNativeTypeExceptionClass, ex.what()); - } -} - void ReadableNativeArray::mapException(std::exception_ptr ex) { try { std::rethrow_exception(ex); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.h b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.h index 52ab38f0bafa9d..b9c0d780faee1c 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.h @@ -32,7 +32,6 @@ class ReadableNativeArray static constexpr const char *kJavaDescriptor = "Lcom/facebook/react/bridge/ReadableNativeArray;"; - static void mapException(const std::exception &ex); static void mapException(std::exception_ptr ex); static void registerNatives(); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.cpp index 6a9d554b9ac4a7..75b0d16ebf1dc5 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.cpp @@ -11,14 +11,6 @@ using namespace facebook::jni; namespace facebook::react { -// TODO T112842309: Remove after fbjni upgraded in OSS -void ReadableNativeMap::mapException(const std::exception &ex) { - if (dynamic_cast(&ex) != nullptr) { - throwNewJavaException( - exceptions::gUnexpectedNativeTypeExceptionClass, ex.what()); - } -} - void ReadableNativeMap::mapException(std::exception_ptr ex) { try { std::rethrow_exception(ex); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.h b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.h index 2513a8a6028c27..4fa3c481e9eea8 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.h @@ -40,7 +40,6 @@ struct ReadableNativeMap : jni::HybridClass { std::optional keys_; static jni::local_ref createWithContents(folly::dynamic &&map); - static void mapException(const std::exception &ex); static void mapException(std::exception_ptr ex); static void registerNatives(); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultComponentsRegistry.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultComponentsRegistry.cpp index 8273e31777adc7..a291c22f915282 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultComponentsRegistry.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultComponentsRegistry.cpp @@ -44,10 +44,9 @@ DefaultComponentsRegistry::initHybrid( ->createComponentDescriptorRegistry( {eventDispatcher, contextContainer}); - auto mutableRegistry = - std::const_pointer_cast(registry); - - mutableRegistry->setFallbackComponentDescriptor( + auto &mutableRegistry = + const_cast(*registry); + mutableRegistry.setFallbackComponentDescriptor( std::make_shared( ComponentDescriptorParameters{ eventDispatcher, contextContainer, nullptr})); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp index fdcee5f672d1ab..baa3e2eeaf066d 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp @@ -91,17 +91,6 @@ class JMethodDescriptor : public jni::JavaClass { }; } // namespace -constexpr static auto ReactFeatureFlagsJavaDescriptor = - "com/facebook/react/config/ReactFeatureFlags"; - -static int getFeatureFlagValue(const char *name) { - static const auto reactFeatureFlagsJavaDescriptor = - jni::findClassStatic(ReactFeatureFlagsJavaDescriptor); - const auto field = - reactFeatureFlagsJavaDescriptor->getStaticField(name); - return reactFeatureFlagsJavaDescriptor->getStaticFieldValue(field); -} - TurboModuleManager::TurboModuleManager( jni::alias_ref jThis, RuntimeExecutor runtimeExecutor, @@ -319,20 +308,13 @@ void TurboModuleManager::installJSIBindings(bool shouldCreateLegacyModules) { bool isInteropLayerDisabled = !shouldCreateLegacyModules; runtimeExecutor_([this, isInteropLayerDisabled](jsi::Runtime &runtime) { - TurboModuleBindingMode bindingMode = static_cast( - getFeatureFlagValue("turboModuleBindingMode")); - if (isInteropLayerDisabled) { - TurboModuleBinding::install( - runtime, bindingMode, createTurboModuleProvider()); + TurboModuleBinding::install(runtime, createTurboModuleProvider()); return; } TurboModuleBinding::install( - runtime, - bindingMode, - createTurboModuleProvider(), - createLegacyModuleProvider()); + runtime, createTurboModuleProvider(), createLegacyModuleProvider()); }); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/CMakeLists.txt index 3a3dbe33212521..8fc6ee71f0f13c 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/CMakeLists.txt +++ b/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/CMakeLists.txt @@ -19,6 +19,7 @@ target_link_libraries(uimanagerjni folly_runtime glog glog_init + bridgelessnativeviewconfig rrc_native yoga callinvokerholder diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/OnLoad.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/OnLoad.cpp index 4e153e824259c7..c7beb68a6acc8e 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/OnLoad.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/OnLoad.cpp @@ -8,9 +8,11 @@ #include #include "ComponentNameResolverManager.h" +#include "UIConstantsProviderManager.h" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { return facebook::jni::initialize(vm, [] { facebook::react::ComponentNameResolverManager::registerNatives(); + facebook::react::UIConstantsProviderManager::registerNatives(); }); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/UIConstantsProviderManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/UIConstantsProviderManager.cpp new file mode 100644 index 00000000000000..42e8204a31bd5c --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/UIConstantsProviderManager.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include + +#include +#include +#include +#include + +#include +#include "UIConstantsProviderManager.h" + +namespace facebook::react { + +using namespace facebook::jni; + +UIConstantsProviderManager::UIConstantsProviderManager( + jni::alias_ref jThis, + RuntimeExecutor runtimeExecutor, + jni::alias_ref uiConstantsProvider) + : javaPart_(jni::make_global(jThis)), + runtimeExecutor_(runtimeExecutor), + uiConstantsProvider_(jni::make_global(uiConstantsProvider)) {} + +jni::local_ref +UIConstantsProviderManager::initHybrid( + jni::alias_ref jThis, + jni::alias_ref runtimeExecutor, + jni::alias_ref uiConstantsProvider) { + return makeCxxInstance( + jThis, runtimeExecutor->cthis()->get(), uiConstantsProvider); +} + +void UIConstantsProviderManager::registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", UIConstantsProviderManager::initHybrid), + makeNativeMethod( + "installJSIBindings", UIConstantsProviderManager::installJSIBindings), + }); +} + +void UIConstantsProviderManager::installJSIBindings() { + runtimeExecutor_([thizz = this](jsi::Runtime &runtime) { + auto uiConstantsProvider = [thizz, &runtime]() -> jsi::Value { + static auto getConstants = + jni::findClassStatic( + UIConstantsProviderManager::UIConstantsProviderJavaDescriptor) + ->getMethod()>( + "getConstants"); + auto constants = getConstants(thizz->uiConstantsProvider_.get()); + return jsi::valueFromDynamic(runtime, constants->cthis()->consume()); + }; + + LegacyUIManagerConstantsProviderBinding::install( + runtime, std::move(uiConstantsProvider)); + }); +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/UIConstantsProviderManager.h b/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/UIConstantsProviderManager.h new file mode 100644 index 00000000000000..ba537da6eb8b5f --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/uimanager/UIConstantsProviderManager.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +class UIConstantsProviderManager + : public facebook::jni::HybridClass { + public: + static auto constexpr kJavaDescriptor = + "Lcom/facebook/react/uimanager/UIConstantsProviderManager;"; + + constexpr static auto UIConstantsProviderJavaDescriptor = + "com/facebook/react/uimanager/UIConstantsProvider"; + + static facebook::jni::local_ref initHybrid( + facebook::jni::alias_ref jThis, + facebook::jni::alias_ref runtimeExecutor, + facebook::jni::alias_ref uiConstantsProviderManager); + + static void registerNatives(); + + private: + friend HybridBase; + facebook::jni::global_ref javaPart_; + RuntimeExecutor runtimeExecutor_; + + facebook::jni::global_ref uiConstantsProvider_; + + void installJSIBindings(); + + explicit UIConstantsProviderManager( + facebook::jni::alias_ref jThis, + RuntimeExecutor runtimeExecutor, + facebook::jni::alias_ref uiConstantsProviderManager); +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/values-ka/strings.xml b/packages/react-native/ReactAndroid/src/main/res/devsupport/values-ka/strings.xml index 4b39c6aace90e5..03f9c20615dcd3 100644 --- a/packages/react-native/ReactAndroid/src/main/res/devsupport/values-ka/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/devsupport/values-ka/strings.xml @@ -4,4 +4,5 @@ React Native-ის დეველოპერთა მენიუ (%1$s) + გაშვებულია %1$s diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/values-lv/strings.xml b/packages/react-native/ReactAndroid/src/main/res/devsupport/values-lv/strings.xml index 336698f59082c1..37c13f27644dd5 100644 --- a/packages/react-native/ReactAndroid/src/main/res/devsupport/values-lv/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/devsupport/values-lv/strings.xml @@ -3,5 +3,6 @@ + Reakciju vietējā izstrādātāju izvēlne (%1$s) Darbojas %1$s diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-af/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-af/strings.xml index 24e1b69fe6b4ef..82932ee371b283 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-af/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-af/strings.xml @@ -3,4 +3,29 @@ + Skakel + Prent + Knoppie, prent + Opskrif + Opletnota + Kombinasiekassie + Kieslys + Kieslysbalk + Kieslysitem + Vorderingbalk + Radiogroep + Rolleesbalk + Tolknoppie + Oortjie + Oortjielys + Afteller + Nutsbalk + Opsomming + besig + is uitgevou + is ingevou + ontkies + aan + af + is gemeng diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ar/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ar/strings.xml index 9ee5b1218296dd..09606420a91f48 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ar/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ar/strings.xml @@ -3,4 +3,29 @@ + رابط + صورة + زر، صورة + العنوان + تنبيه + مربع تحرير وسرد + القائمة + شريط القائمة + عنصر القائمة + شريط التقدم + مجموعة أزرار اختيار + شريط التمرير + زر زيادة ونقصان + علامة التبويب + قائمة علامات التبويب + مؤقِت + شريط الأدوات + ملخص + مشغول + موسع + مطوي + غير محدَد + تشغيل + إيقاف تشغيل + مختلط diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-as/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-as/strings.xml index 7224dbc28d87b8..d2c53f09f0c6b0 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-as/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-as/strings.xml @@ -3,4 +3,11 @@ + লিংক + ছবি + বুটাম, ছবি + যুটীয়া বাকচ + মেন্যু + অন কৰক + অফ কৰক diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-az/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-az/strings.xml index 8d1df4784531c0..ae75008547a07d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-az/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-az/strings.xml @@ -3,4 +3,9 @@ + Keçid + Şəkil + Düymə, şəkil + aktivdir + deaktiv diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-be/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-be/strings.xml index ce84b2af7e3b2d..46ed38f7f7b097 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-be/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-be/strings.xml @@ -3,4 +3,6 @@ + Відарыс + Кнопка, відарыс diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bg/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bg/strings.xml index 09b7b31c671dab..a50ed8236cf755 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bg/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bg/strings.xml @@ -3,4 +3,29 @@ + Връзка + Изображение + Бутон, изображение + Заглавие + Сигнал + Комбинирана кутия + Меню + Лента с менюта + Елемент от меню + Лента за напредък + Радио група + Лента за превъртане + Бутон за завъртане + Раздел + Списък с раздели + Таймер + Лента с инструменти + Обобщение + заето + разширено + свито + неизбрано + включено + изключено + смесено diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bn/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bn/strings.xml index b5d516623ef92f..1f097ede444236 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bn/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bn/strings.xml @@ -3,4 +3,29 @@ + লিঙ্ক + ইমেজ + বোতাম, ছবি + শিরোনাম + অ্যালার্ট + কম্বো বক্স + মেনু + মেনু বার + মেনু আইটেম + প্রোগ্রেস বার + রেডিও গ্রুপ + স্ক্রোল বার + স্পিন বোতাম + ট্যাব + ট্যাব লিস্ট + টাইমার + টুল বার + সারসংক্ষেপ + ব্যস্ত + বাড়ানো হয়েছে + ছোট করা হয়েছে + আনসিলেক্ট করা হয়েছে + চালু আছে + বন্ধ আছে + মিশ্র diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bs/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bs/strings.xml index 6360c5c0799ee6..f5b0f7351e9dc3 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bs/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-bs/strings.xml @@ -3,4 +3,29 @@ + Veza + Slika + Dugme, slika + Zaglavlje + Upozorenje + Kombinovana kutija + Meni + Traka menija + Stavka menija + Traka napretka + Grupa za radio + Traka klizača + Dugme za okretanje + Kartica + Lista kartica + Tajmer + Traka alata + Sažetak + zauzeto + prošireno + skupljeno + nije odabrano + uključeno + isključeno + mješovito diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-cs/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-cs/strings.xml index b556b85f3bc390..53b972bbfd8f41 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-cs/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-cs/strings.xml @@ -3,4 +3,29 @@ + Odkaz + Obrázek + Tlačítko, obrázek + Nadpis + Výstraha + Kombinované pole + Nabídka + Panel nabídky + Položka nabídky + Ukazatel postupu + Skupina přepínačů + Posuvník + Číselník + Karta + Seznam karet + Časovač + Panel nástrojů + Přehled + zaneprázdněno + rozbaleno + sbaleno + nevybráno + zap + vyp + oboje diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-da/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-da/strings.xml index 1fd6723b3bae1f..6c51adb91eca54 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-da/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-da/strings.xml @@ -3,4 +3,26 @@ + Billede + Knap, billede + Overskrift + Underretning + Kombinationsboks + Menulinje + Menupunkt + Statuslinje + Radiogruppe + Rullelinje + Snurreknap + Fane + Liste over faner + Værktøjslinje + Oversigt + optaget + udvidet + skjult + fravalgt + til + fra + blandet diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-de/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-de/strings.xml index b4629c93404814..d0aaf6106fe419 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-de/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-de/strings.xml @@ -3,4 +3,26 @@ + Bild + Button, Bild + Überschrift + Warnhinweis + Kombinationsfeld + Menü + Menüleiste + Menüpunkt + Statusanzeige + Gruppe von Buttons + Scroll-Leiste + Auswahl-Button + Tab-Liste + Symbolleiste + Übersicht + in Gebrauch + eingeblendet + ausgeblendet + nicht ausgewählt + ein + aus + gemischt diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-el/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-el/strings.xml index 0604fa12ac1e99..0fdf564435f00a 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-el/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-el/strings.xml @@ -3,4 +3,29 @@ + Σύνδεσμος + Εικόνα + Κουμπί, εικόνα + Επικεφαλίδα + Ειδοποίηση + Συνδυαστικό κουτάκι + Μενού + Γραμμή μενού + Στοιχείο μενού + Γραμμή προόδου + Ομάδα κουμπιών επιλογής + Γραμμή κύλισης + Κουμπί περιστροφής + Καρτέλα + Λίστα καρτελών + Χρονόμετρο + Γραμμή εργαλείων + Σύνοψη + απασχολημένος/η + διευρυμένο + συμπτυγμένο + μη επιλεγμένα + ναι + όχι + συνδυασμός diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-en-rGB/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-en-rGB/strings.xml index 49147780ee63b5..43f9f73c92027d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-en-rGB/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-en-rGB/strings.xml @@ -3,4 +3,14 @@ + Button, image + Combo box + Menu bar + Menu item + Progress bar + Radio group + Scroll bar + Spin button + Tab list + Tool bar diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-es-rES/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-es-rES/strings.xml index 025a080a25a9f8..d3200129fe5e0b 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-es-rES/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-es-rES/strings.xml @@ -3,4 +3,29 @@ + Enlace + Imagen + Botón, imagen + Encabezado + Alerta + Cuadro combinado + Menú + Barra de menú + Elemento del menú + Barra de progreso + Grupo de botones de radio + Barra de desplazamiento + Botón de selección + Pestaña + Lista de pestañas + Temporizador + Barra de herramientas + Resumen + ocupado + ampliado + contraído + sin seleccionar + activado + desactivado + mezclado diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-es/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-es/strings.xml index bfb1514177a8c5..d674a6459721ef 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-es/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-es/strings.xml @@ -3,4 +3,29 @@ + Enlace + Imagen + Botón, Imagen + Encabezado + Alerta + Cuadro combinado + Menú + Barra de menús + Opción del menú + Barra de progreso + Grupo de botones de opción + Barra de desplazamiento + Control de número + Pestaña + Lista de pestañas + Temporizador + Barra de herramientas + Resumen + ocupado + expandido + contraído + no seleccionado + activado + desactivado + mixto diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-et/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-et/strings.xml index e17476d14d8823..ba66aff65d1d8d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-et/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-et/strings.xml @@ -3,4 +3,28 @@ + Pilt + Nupp, pilt + Pealkiri + Hoiatus + Liitboks + Menüü + Menüüriba + Menüü-üksus + Edenemisriba + Raadionuppude grupp + Kerimisriba + Pööramisnupp + Vahekaart + Vahekaartide loend + Taimer + Tööriistariba + Kokkuvõte + hõivatud + laiendatud + ahendatud + valimata + sees + väljas + miksitud diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fa/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fa/strings.xml index 72270d97102a7c..e669a7bb65afd9 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fa/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fa/strings.xml @@ -3,4 +3,29 @@ + پیوند + تصویر + دکمه، تصویر + سر‌صفحه + هشدار + جعبه گفتگو + منو + نوار منو + مورد منو + نوار پیشرفت + گروه رادیویی + نوار پیمایش + دکمه چرخش + برگه + فهرست برگه + زمان‌سنج + نوار ابزار + خلاصه + مشغول + بزرگ‌شده + کوچک‌شده + لغو انتخاب شد + روشن + خاموش + ترکیب‌شده diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fi/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fi/strings.xml index 7c49d51816ed44..ce80c989f9e75d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fi/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fi/strings.xml @@ -3,4 +3,29 @@ + Linkki + Kuva + Painike, kuva + Otsikko + Hälytys + Yhdistelmäruutu + Valikko + Valikkopalkki + Valikkokohde + Edistymispalkki + Valintanappiryhmä + Vierityspalkki + Pyörityspainike + Välilehti + Välilehtilista + Ajastin + Työkalupalkki + Yhteenveto + varattu + laajennettu + pienennetty + ei valittu + käytössä + ei käytössä + yhdistetty diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fr-rCA/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fr-rCA/strings.xml index d5fe3fb4a959d0..116e8fc71442b2 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fr-rCA/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fr-rCA/strings.xml @@ -3,4 +3,27 @@ + Lien + Bouton, image + Titre + Alerte + Zone combinée + Barre de menu + Option de menu + Barre de progression + Groupe de boutons radio + Barre de déroulement + Bouton compteur circulaire + Onglet + Liste des onglets + Minuterie + Barre d’outils + Résumé + en cours de traitement + agrandi + réduit + désélectionné + activé + désactivé + à double état diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fr/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fr/strings.xml index 14e76329cc9db8..aad6fa4a4e9542 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fr/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-fr/strings.xml @@ -3,8 +3,27 @@ + Lien + Bouton, image + Titre + Alerte + Liste déroulante + Barre de menu + Élément du menu + Barre de progression + Groupe de boutons radio + Barre de défilement + Toupie + Onglet + Liste d’onglets + Minuteur + Barre d’outils + Récapitulatif opération en cours agrandi réduit + désélectionné(s) + activé + désactivé mixte diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-gu/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-gu/strings.xml index 2a2946b617eb63..6dac5291f7830c 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-gu/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-gu/strings.xml @@ -3,4 +3,29 @@ + લિંક + ફોટો + બટન, ફોટો + શીર્ષક + એલર્ટ + કોમ્બો બોક્સ + મેનૂ + મેનૂ બાર + મેનૂ આઇટમ + પ્રગતિ બાર + રેડિયો ગ્રૂપ + સ્ક્રોલ બાર + સ્પિન બટન + ટેબ + ટેબ લિસ્ટ + ટાઇમર + ટૂલ બાર + સારાંશ + વ્યસ્ત + વિસ્તૃત + નાનું + પસંદગીમાંથી કાઢી નાખ્યું + ચાલુ + બંધ + મિક્સ કરેલ diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ha/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ha/strings.xml index 084b1b6aac0de0..c365404fe61418 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ha/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ha/strings.xml @@ -3,4 +3,29 @@ + Kafa + Hoto + Madanni, Hoto + Kanu + Bayanan Ankararwa + Jerin Akwain Zaɓi ko Shigar da Rubutu + Mazaɓa + Bar Na Mazaɓa + Mazaɓar abu + Bar Na Nuna Ci Gaba + Rukunin Rediyo + Bar Na Jirgawa + Madanni Ƙarawa ko Rage Kima + Madannin shiga gurbi + Jerin Madannin Shiga Gurbi + Na\'urar sarrafa lokaci + Bar Na Kayan Aiki + Taƙaitawa + aiki + an faɗaɗa + rusasshe + wanda ba a zaɓa ba + kunna + kashe + gauraye diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hi/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hi/strings.xml index 3bca368f01586b..17e5277843ad9d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hi/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hi/strings.xml @@ -3,4 +3,29 @@ + लिंक + फ़ोटो + बटन, फ़ोटो + शीर्षक + अलर्ट + कॉम्बो बॉक्स + मेनू + मेनू बार + मेनू आइटम + प्रोग्रेस बार + रेडियो ग्रुप + स्क्रॉल बार + स्पिन बटन + टैब + टैब लिस्ट + टाइमर + टूल बार + सारांश + व्यस्त + बड़ा किया गया + छोटा किया गया + नहीं चुने गए + चालू है + बंद है + मिक्स diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hr/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hr/strings.xml index 97250a3e1f6a4c..d2d2419b247b82 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hr/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hr/strings.xml @@ -3,4 +3,29 @@ + Veza + Slika + Gumb, slika + Zaglavlje + Upozorenje + Kombinirani okvir + Izbornik + Traka izbornika + Stavka izbornika + Traka napretka + Grupa izbornih gumba + Traka za pomicanje + Gumb za vrtnju + Kartica + Popis kartica + Mjerač vremena + Traka s alatima + Sažetak + zauzeto + prošireno + sažeto + poništen odabir + uključeno + isključeno + mješovito diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hu/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hu/strings.xml index 7c28e052110cd6..ea922b64737f02 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hu/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hu/strings.xml @@ -3,4 +3,29 @@ + Hivatkozás + Kép + Gomb, kép + Címsor + Figyelmeztetés + Kombinált lista + Menü + Menüsor + Menüelem + Folyamatjelző + Választógomb-csoport + Görgetősáv + Forgó gomb + Lapfül + Lapfülek listája + Időmérő + Eszköztár + Összegzés + elfoglalt + kibontva + összecsukva + nincs kiválasztva + be + ki + vegyes diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hy/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hy/strings.xml index 9fc19db9a6a210..385327940b1e85 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hy/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-hy/strings.xml @@ -3,4 +3,11 @@ + Հղում + Նկար + Կոճակ, նկար + Կոմբո արկղ + Ընտրացանկ + միացրած + անջատած diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-in/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-in/strings.xml index 6d32bd7238156f..bdc65bbda79bea 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-in/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-in/strings.xml @@ -3,4 +3,27 @@ + Tautkan + Gambar + Tombol, Gambar + Judul + Peringatan + Kotak Kombo + Bilah Menu + Item Menu + Bilah Progres + Grup Radio + Bilah Gulir + Tombol Putar + Daftar Tab + Pengatur Waktu + Bilah Fitur + Ringkasan + sibuk + diperluas + diciutkan + batal dipilih + aktif + nonaktif + campuran diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-it/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-it/strings.xml index 89dcf449cfb41d..0a87368ca7c5c3 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-it/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-it/strings.xml @@ -3,4 +3,25 @@ + Immagine + Pulsante, Immagine + Titolo + Avviso + Casella combinata + Barra dei menu + Elemento del menu + Barra di avanzamento + Gruppo radio + Barra di scorrimento + Pulsante girevole + Lista delle tab + Barra degli strumenti + Riepilogo + occupato + aperto + chiuso + non selezionato + + no + misto diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-iw/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-iw/strings.xml index dcca08e175b5d0..d032407ea5be96 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-iw/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-iw/strings.xml @@ -3,4 +3,29 @@ + קישור + תמונה + לחצן, תמונה + כותרת + התראה + תיבה משולבת + תפריט + סרגל תפריטים + פריט בתפריט + סרגל התקדמות + קבוצת רדיו + סרגל גלילה + לחצן מסתובב + לשונית + רשימת לשוניות + טיימר + סרגל כלים + סיכום + תפוס + מורחב + מצומצם + הבחירה בוטלה + מופעל + כבוי + משולב diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ja/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ja/strings.xml index 437a25fe2bea8f..871ca3b04aa55f 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ja/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ja/strings.xml @@ -3,4 +3,29 @@ + リンク + 画像 + ボタン、画像 + 見出し + アラート + コンボボックス + メニュー + メニューバー + メニューアイテム + 進行状況バー + ラジオグループ + スクロールバー + スピンボタン + タブ + タブリスト + タイマー + ツールバー + 概要 + 作業中 + 展開中 + 縮小中 + 未選択 + オン + オフ + 混合 diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-jv/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-jv/strings.xml index 5bc93b9a564110..af572f6056151a 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-jv/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-jv/strings.xml @@ -3,4 +3,26 @@ + Pranala + Gambar + Tombol, Gambar + Judhul + Pengenget + Kothak Kombo + Wilah Menu + Item Menu + Wilah Progres + Grup Radio + Wilah Nggulung + Tombol Muter + Daftar Tab + Wilah Alat + Ringkesan + sibuk + dijembarake + diciutake + wurung dipilih + urip + mati + mix diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ka/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ka/strings.xml index 1c2a251fabd607..29972a42517d3e 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ka/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ka/strings.xml @@ -3,4 +3,25 @@ + ბმული + გამოსახულება + ღილაკი, გამოსახულება + სათაური + გაფრთხილება + მენიუ + მენიუს ზოლი + მენიუს ერთეული + პროგრესის ზოლი + გადაადგილების პანელი + დატრიალების ღილაკი + ჩანართი + ტაიმერი + ხელსაწყოების ზოლი + შეჯამება + დაკავებული + გაშლილი + აურჩეველი + ჩართული + გამორთულია + შერეული diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-kk/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-kk/strings.xml index f2afa0349f18f9..5de79532de34ae 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-kk/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-kk/strings.xml @@ -3,4 +3,8 @@ + Сілтеме + Кескін + Түйме, кескін + қосулы diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-km/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-km/strings.xml index d6ed5fadf8cf0f..88e3287d26a32f 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-km/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-km/strings.xml @@ -3,4 +3,29 @@ + តំណ + រូបភាព + ប៊ូតុង, រូបភាព + ចំណងជើង + ជូន​ដំណឹង + ប្រអប់បញ្ចូលគ្នា + ម៉ឺនុយ + របារម៉ឺនុយ + ធាតុម៉ឺនុយ + របារ​ដំណើរការ + ក្រុមវិទ្យុ + របាររំកិល + ប៊ូតុង​បង្វិល + ផ្ទាំង + បញ្ជីថេប + មុខងារកំណត់ម៉ោង + របារ​ឧបករណ៍ + សេចក្ដីសង្ខេប + ជាប់រវល់ + បានពង្រីក + បានបង្រួម + បាបនដោះការជ្រើសរើស + បើក + បិទ + បានលាយ diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-kn/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-kn/strings.xml index b4a93b39ff0be2..15c52aff789e9d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-kn/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-kn/strings.xml @@ -3,4 +3,29 @@ + ಲಿಂಕ್ + ಚಿತ್ರ + ಬಟನ್, ಚಿತ್ರ + ಶಿರೋಲೇಖ + ಎಚ್ಚರಿಕೆ + ಕೊಂಬೊ ಬಾಕ್ಸ್ + ಮೆನು + ಮೆನು ಬಾರ್ + ಮೆನು ಐಟಂ + ಪ್ರೋಗ್ರೆಸ್ ಬಾರ್ + ರೇಡಿಯೋ ಗುಂಪು + ಸ್ಕ್ರಾಲ್ ಬಾರ್ + ಸ್ಪಿನ್ ಬಟನ್ + ಟ್ಯಾಬ್ + ಟ್ಯಾಬ್ ಪಟ್ಟಿ + ಟೈಮರ್ + ಟೂಲ್ ಬಾರ್ + ಸಾರಾಂಶ + ಕಾರ್ಯನಿರತ + ವಿಸ್ತರಿಸಲಾಗಿದೆ + ಮುಚ್ಚಿದೆ + ಆಯ್ಕೆ ರದ್ದುಮಾಡಲಾಗಿದೆ + ಆನ್ + ಆಫ್ + ಬಗೆಬಗೆಯ diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ko/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ko/strings.xml index ba310011f0d554..7370e6d18ac660 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ko/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ko/strings.xml @@ -3,4 +3,29 @@ + 링크 + 이미지 + 버튼, 이미지 + 제목 + 알림 + 콤보 상자 + 메뉴 + 메뉴 표시줄 + 메뉴 항목 + 진행률 표시줄 + 라디오 그룹 + 스크롤 바 + 회전 버튼 + + 탭 리스트 + 타이머 + 도구 표시줄 + 요약 + 처리 중 + 확대됨 + 숨겨짐 + 선택되지 않음 + 설정 + 해제 + 혼합 diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ky/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ky/strings.xml index 8bdeee47c0d67f..1ec1f36b12b09e 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ky/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ky/strings.xml @@ -3,4 +3,7 @@ + Шилтеме + Сүрөт + Баскыч, сүрөт diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lo/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lo/strings.xml index d35f4bd7efb9eb..444a22dc4de9eb 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lo/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lo/strings.xml @@ -3,4 +3,10 @@ + ລິ້ງ + ຮູບພາບ + ປຸ່ມ, ຮູບພາບ + ກ່ອງຄອມໂບ + ເປີດ + ປິດ diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lt/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lt/strings.xml index c3177bbf23299d..454a465ec4c384 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lt/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lt/strings.xml @@ -3,4 +3,29 @@ + Nuoroda + Vaizdas + Mygtukas, vaizdas + Antraštė + Įspėjimas + Sudėtinis laukelis + Meniu + Meniu juosta + Meniu elementas + Eigos juosta + Akučių grupė + Slinkimo juosta + Sukimo mygtukas + Skirtukas + Skirtukų sąrašas + Laikmatis + Įrankių juosta + Suvestinė + naudojama + išskleista + sutraukta + pasirinkimas atšauktas + įjungta + išjungta + mišrus diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lv/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lv/strings.xml index a66be9d1d970c9..acfe3289fda2d6 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lv/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-lv/strings.xml @@ -3,4 +3,27 @@ + Saite + Attēls + Poga, attēls + Virsraksts + Paziņojums + Kombinētais lodziņš + Izvēlne + Izvēļņu josla + Izvēlnes opcija + Progresa josla + Ritināšanas josla + Vērtību poga + Cilne + Taimeris + Rīkjosla + Kopsavilkums + aizņemts + izvērsts + sakļauts + nav atlasīts + ieslēgts + izslēgts + jaukti diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mk/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mk/strings.xml index 1c76e1bb07c64e..9ed07d6fdf4c27 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mk/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mk/strings.xml @@ -3,4 +3,29 @@ + Врска + Слика + Копче, слика + Заглавие + Предупредување + Комбинирано поле + Мени + Мени лента + Производ на мени + Лента за напредок + Радио група + Лента за лизгање + Копче за вртење + Картичка + Список со картички + Тајмер + Лента со алатки + Резиме + зафатено + проширено + собрано + изборот е поништен + вклучено + исклучено + мешано diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ml/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ml/strings.xml index 5d568f33232987..a9aa446a89b7a8 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ml/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ml/strings.xml @@ -3,4 +3,29 @@ + ലിങ്ക് + ചിത്രം + ബട്ടൺ, ചിത്രം + തലക്കെട്ട് + അലേർട്ട് + കോംബോ ബോക്‌സ് + മെനു + മെനു ബാർ + മെനു ഇനം + പുരോഗതി ബാർ + റേഡിയോ ഗ്രൂപ്പ് + സ്‌ക്രോൾ ബാർ + കറക്കുക ബട്ടൺ + ടാബ് + ടാബ് ലിസ്‌റ്റ് + ടൈമർ + ടൂൾ ബാർ + സംഗ്രഹം + തിരക്കിലാണ് + വിപുലീകരിച്ചു + ചുരുക്കി + തിരഞ്ഞെടുത്തത് മാറ്റി + ഓണാണ് + ഓഫാണ് + മിശ്രിതം diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mn/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mn/strings.xml index 2f27b04d30db45..300491952c877f 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mn/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mn/strings.xml @@ -3,4 +3,7 @@ + Холбоос + Зураг + Товч, зураг diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mr/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mr/strings.xml index ad239221c0e924..bf953bf7a29598 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mr/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-mr/strings.xml @@ -3,4 +3,29 @@ + लिंक + प्रतिमा + बटण, प्रतिमा + मथळा + अलर्ट + कॉम्बो बॉक्स + मेनू + मेनू बार + मेनू आयटम + प्रगती बार + रेडिओ ग्रुप + बार स्क्रोल करा + बटण स्पिन करा + टॅब + टॅब लिस्ट + टायमर + टूल बार + सारांश + व्यग्र + विस्तारित केले + संकुचित केले + निवड रद्द केलेले + चालू + बंद + मिश्र diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ms/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ms/strings.xml index 443eca7a57e1f8..c1091f8d92ff8d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ms/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ms/strings.xml @@ -3,4 +3,27 @@ + Pautan + Imej + Butang, Imej + Tajuk + Isyarat + Kotak Kombo + Bar Menu + Item Menu + Bar Kemajuan + Kumpulan Radio + Bar Tatal + Butang Putaran + Senarai Tab + Pemasa + Bar Alat + Ringkasan + sibuk + dikembangkan + diruntuhkan + dinyahpilih + dihidupkan + dimatikan + campuran diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-my/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-my/strings.xml index 65abfdbf7bd192..8a8424acc41b4d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-my/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-my/strings.xml @@ -3,4 +3,29 @@ + လင့်ခ် + ဓာတ်ပုံ + ခလုတ်၊ ဓာတ်ပုံ + ခေါင်းစီး + သတိပေးချက် + ရွေးရန်အကွက် + မီနူး + မီနူး ဘားတန်း + မီနူး အကြောင်းအရာ + ပြီးစီးမှုပြ ဘားတန်း + ရေဒီယိုအုပ်စု + ရွှေ့ဆွဲကြည့်ရန် ဘားတန်း + လှည့်ရန် ခလုတ် + တက်ဘ် + တက်ဘ်စာရင်း + အချိန်တိုင်းစက် + ကိရိယာ ဘားတန်း + အနှစ်ချုပ် + လုပ်ဆောင်နေဆဲ + ချဲ့ထားပြီး + ခေါက်သိမ်းထားပါတယ် + ရွေးမထားပါ + ဖွင့် + ပိတ် + ရောစပ်ထားပြီး diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-nb/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-nb/strings.xml index 873742c208ac05..edb1a1e7b20a79 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-nb/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-nb/strings.xml @@ -3,4 +3,29 @@ + Lenke + Bilde + Knapp, bilde + Overskrift + Varsel + Kombinasjonsboks + Meny + Menyfelt + Menyelement + Fremdriftslinje + Radiogruppe + Rullelinje + Rotasjonsknapp + Fane + Faneliste + Tidsur + Verktøylinje + Sammendrag + opptatt + utvidet + skjult + valgt bort + + av + blandet diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ne/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ne/strings.xml index 47a8e78d014c40..dcaca959169cc5 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ne/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ne/strings.xml @@ -3,4 +3,9 @@ + लिङ्क + फोटो + बटन, फोटो + अन + अफ diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-nl/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-nl/strings.xml index 75355cf16bd979..feeed53f1ae50d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-nl/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-nl/strings.xml @@ -3,4 +3,26 @@ + Afbeelding + Knop, afbeelding + Kop + Waarschuwing + Combivak + Menubalk + Menu-item + Voortgangsbalk + Keuzegroep + Scrollbalk + Draaiknop + Tabblad + Lijst met tabbladen + Werkbalk + Samenvatting + bezig + uitgevouwen + samengevouwen + gedeselecteerd + aan + uit + gemengd diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pa/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pa/strings.xml index ea45e686429267..7cc4e095fa7f2b 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pa/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pa/strings.xml @@ -3,4 +3,29 @@ + ਲਿੰਕ + ਚਿੱਤਰ + ਬਟਨ, ਚਿੱਤਰ + ਸਿਰਲੇਖ + ਸੁਚੇਤਨਾ + ਕੋਂਬੋ ਬਾਕਸ + ਮੀਨੂ + ਮੀਨੂ ਬਾਰ + ਮੀਨੂ ਆਈਟਮ + ਪ੍ਰੋਗਰੈੱਸ ਬਾਰ + ਰਡੀਓ ਗਰੁੱਪ + ਸਕ੍ਰੋਲ ਬਾਰ + \'ਘੁੰਮਾਓ\' ਬਟਨ + ਟੈਬ + ਟੈਬ ਸੂਚੀ + ਟਾਈਮਰ + ਟੂਲ ਬਾਰ + ਸਾਰ + ਵਿਅਸਤ + ਵਿਸਤਾਰ ਕੀਤਾ ਗਿਆ + ਸਮੇਟਿਆ ਗਿਆ + ਚੋਣ ਹਟਾਈ ਗਈ + ਚਾਲੂ + ਬੰਦ + ਮਿਕਸਡ diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pl/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pl/strings.xml index 4f53d3ec705bb8..040ce847300b41 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pl/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pl/strings.xml @@ -3,4 +3,26 @@ + Obraz + Przycisk, obraz + Nagłówek + Pole kombi + Pasek menu + Pozycja menu + Pasek postępu + Grupa przycisków radiowych + Pasek przewijania + Przycisk kręcenia + Karta + Lista kart + Czasomierz + Pasek narzędzi + Podsumowanie + zajęte + rozwinięte + zwinięte + nie wybrano + wł. + wył. + mieszane diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ps/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ps/strings.xml index d86dbade5fa188..c93367e60a5abb 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ps/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ps/strings.xml @@ -3,4 +3,11 @@ + لینک + عکس + تڼۍ، انځور + کومبو باکس + مېنیو + روښانه + غیر فعال diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pt-rPT/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pt-rPT/strings.xml index a0d4564f7f0932..f3afd9bf3e5595 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pt-rPT/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pt-rPT/strings.xml @@ -3,4 +3,28 @@ + Ligação + Imagem + Botão, Imagem + Título + Aviso + Caixa de combinação + Barra do menu + Item do menu + Barra de progresso + Grupo de opções + Barra de deslocamento + Botão giratório + Separador + Lista de separadores + Temporizador + Barra de ferramentas + Resumo + ocupado + expandido + fechado + não selecionado + ativado + desativado + misto diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pt/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pt/strings.xml index 3a24466f7006cd..940fdce4c0b684 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pt/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-pt/strings.xml @@ -3,4 +3,29 @@ + Link + Imagem + Botão, imagem + Título + Alerta + Caixa de combinação + Menu + Barra do menu + Item do menu + Barra de progresso + Botão de grupo de opções + Barra de rolamento + Botão de rotação + Aba + Lista de abas + Temporizador + Barra de ferramentas + Resumo + ocupado + expandido + recolhido + desmarcados + ativado + desativado + misto diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ro/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ro/strings.xml index 445f1af124553e..571d7e6f357d86 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ro/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ro/strings.xml @@ -3,4 +3,27 @@ + Imagine + Buton, imagine + Antet + Alertă + Casetă combo + Meniu + Bară meniu + Element din meniu + Bară de progres + Grup de butoane radio + Bară de derulare + Buton de incrementare + Filă + Listă file + Bară de instrumente + Rezumat + ocupat + extins + restrâns + neselectat + activat + dezactivat + combinat diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ru/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ru/strings.xml index 1105ec010ea037..6d9de6e1da3a3b 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ru/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ru/strings.xml @@ -3,4 +3,29 @@ + Ссылка + Изображение + Кнопка, изображение + Заголовок + Оповещение + Комбинированное поле + Меню + Панель меню + Элемент меню + Индикатор прогресса + Группа кнопок-переключателей + Полоса прокрутки + Кнопка кольцевого списка + Вкладка + Список вкладок + Таймер + Панель инструментов + Сводка + занято + развернуто + свернуто + не выбрано + включено + выкл + смешанный diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-si/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-si/strings.xml index 2153d88a0669fb..5aeb46293d7a4f 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-si/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-si/strings.xml @@ -3,4 +3,29 @@ + සබැඳිය + රූපය + ‍බොත්තම, රූපය + සිරස්තලය + ඇඟවීම + සංයුක්ත පෙට්ටිය + මෙනුව + මෙනු තීරුව + ‍මෙනු අයිතමය + ප්‍රගති තීරුව + ගුවන්විදුලි සමූහය + අනුචලන තීරුව + වේගයෙන් කරකවන බොත්තම + ටැබය + ටැබ ලැයිස්තුව + කාල ගණකය + මෙවලම් තීරුව + සාරාංශය + කාර්යබහුලයි + විහිදුවන ලදි + හකුළන ලදී + තේරීම ඉවත් කරන ලද + ක්‍රියාත්මකයි + අක්‍රියයි + මිශ්‍ර කළ diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sk/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sk/strings.xml index 2d1768d211d54d..7d7f4b6c603fb5 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sk/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sk/strings.xml @@ -3,4 +3,29 @@ + Odkaz + Obrázok + Tlačidlo, obrázok + Nadpis + Upozornenie + Kombinované pole + Ponuka + Lišta s ponukou + Položka ponuky + Indikátor postupu + Skupina tlačidiel na výber + Lišta na posúvanie + Otočné tlačidlo + Tabulátor + Zoznam kariet + Časovač + Panel s nástrojmi + Súhrn + obsadené + rozbalené + zbalené + nevybrané + zapnuté + vypnuté + zmiešané diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sl/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sl/strings.xml index a8d2a680928b58..a70f4bfac88177 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sl/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sl/strings.xml @@ -3,4 +3,29 @@ + Povezava + Slika + Gumb, slika + Naslov + Opozorilo + Kombinirano polje + Meni + Meni + Element v meniju + Črta napredka + Radio skupina + Drsnik + Vrtljivi gumb + Zavihek + Seznam z zavihki + Časovnik + Vrstica z orodji + Povzetek + zasedeno + razširjen + strnjeno + neizbrano + vklopljeno + izključeno + mešano diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-so/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-so/strings.xml index bf64cbaf06b979..1ff917b4ad5754 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-so/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-so/strings.xml @@ -3,4 +3,9 @@ + Linki + Sawir + Batoon, Sawir + daaran + dansan diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sq/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sq/strings.xml index a225539656b409..4b681fa5da2625 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sq/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sq/strings.xml @@ -3,4 +3,29 @@ + Lidhja + Imazh + Buton, imazh + Titull + Sinjalizim + Kuti kombinimi + Meny + Shiriti i menysë + Artikull i menysë + Shiriti i Progresit + Grupi i Radios + Shiriti i lëvizjes + Butoni i rrotullimit + Skedë + Lista e skedave + Kohëmatësi + Shiriti i mjeteve + Përmbledhja + I zënë + zgjeruar + palosur + i pazgjedhur + aktive + joaktiv + përzier diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sr/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sr/strings.xml index 47782d7cf1000e..28d6ea337cbda8 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sr/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sr/strings.xml @@ -3,4 +3,29 @@ + Веза + Слика + Дугме, слика + Заглавље + Обавештење + Комбиновано поље + Мени + Трака са менијем + Ставка из менија + Трака са напретком + Група за радио + Трака за померање + Дугме за окретање + Картица + Листа картица + Тајмер + Трака са алаткама + Резиме + заузето + проширено + скупљено + избор опозван + укључено + искључено + мешано diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sv/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sv/strings.xml index 2eed9288127946..c40edbe7723586 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sv/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sv/strings.xml @@ -3,4 +3,28 @@ + Länk + Bild + Knapp, bild + Rubrik + Avisering + Kombinationsruta + Meny + Menyfält + Menyobjekt + Förloppsfält + Radiogrupp + Bläddringslist + Rotationsknapp + Flik + Fliklista + Verktygsfält + Sammanfattning + upptagen + utökad + minimerad + avmarkerad + + av + blandad diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sw/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sw/strings.xml index 6dea5b85bb9a65..a26adb80d40d43 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sw/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-sw/strings.xml @@ -3,4 +3,29 @@ + Kiungo + Picha + Kitufe, Picha + Kichwa + Arifa + Kisanduku cha Combo + Menyu + Upau wa Menyu + Kipengee cha Menyu + Upau wa Hatua + Kundi la Redio + Mwambaa wa Kubiringiza + Kitufe cha Kuzungusha + Kichupo + Orodha ya Kichupo + Kipima muda + Upau wa Zana + Muhtasari + shughulini + imepanuliwa + imekunjwa + haijateuliwa + imewashwa + imezimwa + mchanganyiko diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ta/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ta/strings.xml index f8bfd1c350e5e0..9823eab70ede1b 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ta/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ta/strings.xml @@ -3,4 +3,29 @@ + இணைப்பு + படம் + பொத்தான், படம் + தலைப்பு + நினைவூட்டல் + காம்போ பெட்டி + மெனு + மெனு பட்டி + மெனு பொருள் + போக்கு பட்டி + ரேடியோ குழு + உருட்டுப்பட்டி + ஸ்பின் பட்டன் + பிரிவு + பிரிவுப் பட்டியல் + டைமர் + கருவிப்பட்டி + சுருக்கம் + பணிமிகுதி + விரிவாக்கப்பட்டது + சுருக்கப்பட்டது + தேர்வுநீக்கப்பட்டது + ஆன் + ஆஃப் + கலந்துள்ளது diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-te/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-te/strings.xml index 241b213130fe0a..f08a251c185554 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-te/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-te/strings.xml @@ -3,4 +3,29 @@ + లింక్ + చిత్రం + బటన్, చిత్రం + శీర్షిక + హెచ్చరిక + కాంబో బాక్స్ + మెను + మెను బార్ + మెను ఐటమ్ + ప్రోగ్రెస్ బార్ + రేడియో గ్రూప్ + స్క్రోల్ బార్ + స్పిన్ బటన్ + ట్యాబ్ + ట్యాబ్ జాబితా + టైమర్ + టూల్ బార్ + సమ్మరీ + బిజీగా ఉన్నారు + విస్తరింపబడింది + కుదించబడింది + ఎంపిక తీసివేసారు + ఆన్ చేయి + ఆఫ్ చేయి + మిక్స్డ్ diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tg/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tg/strings.xml index 330b5d77cf1e83..f4fda6ef9466c6 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tg/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tg/strings.xml @@ -3,4 +3,8 @@ + Пайванд + Тасвир + Тугма, тасвир + хомӯш diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-th/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-th/strings.xml index a4206503879525..f78b401f7b0aaf 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-th/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-th/strings.xml @@ -3,4 +3,29 @@ + ลิงก์ + รูปภาพ + ปุ่ม, รูปภาพ + ส่วนหัว + การแจ้งเตือน + กล่องคอมโบ + เมนู + แถบเมนู + รายการในเมนู + แถบความคืบหน้า + กลุ่มปุ่มตัวเลือก + แถบเลื่อน + ปุ่มเพิ่ม/ลด + แท็บ + รายการแท็บ + ตัวจับเวลา + แถบเครื่องมือ + สรุป + ไม่ว่าง + ขยายแล้ว + ยุบแล้ว + ไม่ได้เลือก + เปิดอยู่ + ปิดอยู่ + ผสมกัน diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tl/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tl/strings.xml index dadacb703c930c..6fabf6bc463432 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tl/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tl/strings.xml @@ -3,4 +3,12 @@ + Combox Box + Item sa Menu + Grupo ng Radio + naka-expand + naka-collapse + na-unselect + naka-ON + naka-OFF diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tr/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tr/strings.xml index 755cf862c5eb9e..f8866dfe87d6f0 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tr/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-tr/strings.xml @@ -3,4 +3,29 @@ + Bağlantı + Görsel + Düğme, Görsel + Başlık + Uyarı + Karma Kutu + Menü + Menü Çubuğu + Menü Seçeneği + İlerleme Çubuğu + Radyo Grubu + Kaydırma Çubuğu + Döndürme Düğmesi + Sekme + Sekme Listesi + Zamanlayıcı + Araç Çubuğu + Özet + meşgul + genişletilmiş + daraltılmış + seçili değil + açık + kapalı + karışık diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-uk/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-uk/strings.xml index bf3cc46d1cb490..02c3e74feae637 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-uk/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-uk/strings.xml @@ -3,4 +3,29 @@ + Посилання + Зображення + Кнопка, зображення + Заголовок + Сповіщення + Комбінований список + Меню + Рядок меню + Об\'єкт меню + Індикатор прогресу + Група перемикачів + Прокручування + Кнопка обертання + Вкладка + Список вкладок + Таймер + Панель інструментів + Зведення + зайнято + розгорнуто + згорнуто + не вибрано + Увімк. + Вимк. + змішано diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ur/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ur/strings.xml index 6d76f390ea068a..7d1bd49dc5970f 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ur/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-ur/strings.xml @@ -3,4 +3,29 @@ + لنک + تصویر + بٹن، تصویر + سرخی + الرٹ + کومبو باکس + مینیو + مینیو بار + مینیو آئٹم + پیشرفت کی بار + ریڈیو گروپ + سکرول بار + گھمانے کا بٹن + ٹیب + ٹیب کی لسٹ + ٹائمر + ٹول بار + خلاصہ + مصروف + توسیع کیا گیا + سکیڑا گیا + غیر منتخب کردہ + آن ہے + آف ہے + امتزاج diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-uz/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-uz/strings.xml index 9d4667fa9877e6..d2bbcacc61da02 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-uz/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-uz/strings.xml @@ -3,4 +3,9 @@ + Havola + Rasm + Tugma, rasm + yoniq + o‘chiq diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-vi/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-vi/strings.xml index 706622a3be9832..5a185889b86d8d 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-vi/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-vi/strings.xml @@ -3,4 +3,27 @@ + Liên kết + Hình ảnh + Nút, Hình ảnh + Tiêu đề + Thông báo + Ô lựa chọn + Thanh menu + Mục trong menu + Thanh tiến độ + Nhóm nút radio + Thanh cuộn + Nút quay + Danh sách tab + Bộ hẹn giờ + Thanh công cụ + Tóm tắt + bận + đã mở rộng + đã thu gọn + không được chọn + đang bật + đang tắt + kết hợp diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rCN/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rCN/strings.xml index c50c06c1a71bf2..3727372faeb3e7 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rCN/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rCN/strings.xml @@ -3,4 +3,29 @@ + 链接 + 图片 + 按钮,图片 + 标题 + 提醒 + 组合框 + 菜单 + 菜单栏 + 菜单项目 + 进度条 + 单选组 + 滚动条 + 旋转按钮 + 选项卡 + 选项卡列表 + 倒计时 + 工具栏 + 摘要 + 忙碌中 + 已展开 + 已收起 + 未选中 + 开启 + 关闭 + 混合 diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rHK/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rHK/strings.xml index 067865f00e1e61..c2f4bc5e83e40b 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rHK/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rHK/strings.xml @@ -3,4 +3,29 @@ + 連結 + 圖像 + 圖像,按鈕 + 標題 + 提醒 + 下拉式方塊 + 選單 + 選單列 + 選單項目 + 進度列 + 選項按鈕群組 + 捲軸 + 微調按鈕 + 分頁 + 分頁清單 + 計時器 + 工具列 + 摘要 + 忙碌中 + 已展開 + 已收合 + 已取消選取 + 開啟 + 關閉 + 混合 diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rTW/strings.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rTW/strings.xml index c56baa9ccc27f0..95b51c40a54195 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rTW/strings.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values-zh-rTW/strings.xml @@ -3,4 +3,29 @@ + 連結 + 圖像 + 圖像,按鈕 + 標題 + 提醒 + 下拉式方塊 + 功能表 + 功能表列 + 功能表項目 + 進度列 + 選項按鈕群組 + 捲軸 + 微調按鈕 + 頁籤 + 頁籤清單 + 計時器 + 工具列 + 摘要 + 忙線中 + 已展開 + 已收合 + 已取消選取 + 開啟 + 關閉 + 混合 diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/ReactActivityDelegateTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/ReactActivityDelegateTest.kt index 2912a9c193645b..66b4c9c4919eba 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/ReactActivityDelegateTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/ReactActivityDelegateTest.kt @@ -7,7 +7,6 @@ package com.facebook.react -import android.app.Activity import android.os.Bundle import org.junit.Assert.* import org.junit.Test @@ -17,14 +16,15 @@ import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class ReactActivityDelegateTest { - val nullDelegate: Activity? = null + val nullDelegate: ReactActivity? = null @Test fun delegateWithFabricEnabled_populatesInitialPropsCorrectly() { val delegate = object : ReactActivityDelegate(nullDelegate, "test-delegate") { override fun isFabricEnabled() = true - public val inspectLaunchOptions: Bundle? + + val inspectLaunchOptions: Bundle? get() = composeLaunchOptions() } @@ -38,7 +38,8 @@ class ReactActivityDelegateTest { val delegate = object : ReactActivityDelegate(nullDelegate, "test-delegate") { override fun isFabricEnabled() = false - public val inspectLaunchOptions: Bundle? + + val inspectLaunchOptions: Bundle? get() = composeLaunchOptions() } @@ -50,9 +51,11 @@ class ReactActivityDelegateTest { val delegate = object : ReactActivityDelegate(nullDelegate, "test-delegate") { override fun isFabricEnabled() = true + override fun getLaunchOptions(): Bundle = Bundle().apply { putString("test-property", "test-value") } - public val inspectLaunchOptions: Bundle? + + val inspectLaunchOptions: Bundle? get() = composeLaunchOptions() } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.kt index 9be2b225b03b3c..6141fe10d2c893 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.kt @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +@file:Suppress("DEPRECATION") // Suppressing as we want to test RCTEventEmitter here package com.facebook.react import android.app.Activity @@ -63,7 +64,7 @@ class RootViewTest { whenever(SystemClock.uptimeMillis()).thenAnswer { ts } catalystInstanceMock = ReactTestHelper.createMockCatalystInstance() - reactContext = spy(ReactApplicationContext(RuntimeEnvironment.application)) + reactContext = spy(ReactApplicationContext(RuntimeEnvironment.getApplication())) reactContext.initializeWithInstance(catalystInstanceMock) DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(reactContext) diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.java deleted file mode 100644 index a587bcb2c4c693..00000000000000 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.java +++ /dev/null @@ -1,1294 +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. - */ - -package com.facebook.react.animated; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.atMost; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.Callback; -import com.facebook.react.bridge.CatalystInstance; -import com.facebook.react.bridge.JSIModuleType; -import com.facebook.react.bridge.JavaOnlyArray; -import com.facebook.react.bridge.JavaOnlyMap; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.common.MapBuilder; -import com.facebook.react.uimanager.UIManagerModule; -import com.facebook.react.uimanager.events.Event; -import com.facebook.react.uimanager.events.EventDispatcher; -import com.facebook.react.uimanager.events.RCTEventEmitter; -import java.util.Map; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.rule.PowerMockRule; -import org.robolectric.RobolectricTestRunner; - -/** Tests the animated nodes graph traversal algorithm from {@link NativeAnimatedNodesManager}. */ -@PrepareForTest({Arguments.class}) -@RunWith(RobolectricTestRunner.class) -@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "androidx.*", "android.*"}) -public class NativeAnimatedNodeTraversalTest { - - private static long FRAME_LEN_NANOS = 1000000000L / 60L; - private static long INITIAL_FRAME_TIME_NANOS = 14599233201256L; /* random */ - - @Rule public PowerMockRule rule = new PowerMockRule(); - - private long mFrameTimeNanos; - private ReactApplicationContext mReactApplicationContextMock; - private CatalystInstance mCatalystInstanceMock; - private UIManagerModule mUIManagerMock; - private EventDispatcher mEventDispatcherMock; - private NativeAnimatedNodesManager mNativeAnimatedNodesManager; - - private long nextFrameTime() { - return mFrameTimeNanos += FRAME_LEN_NANOS; - } - - @Before - public void setUp() { - PowerMockito.mockStatic(Arguments.class); - PowerMockito.when(Arguments.createArray()) - .thenAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - return new JavaOnlyArray(); - } - }); - PowerMockito.when(Arguments.createMap()) - .thenAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - return new JavaOnlyMap(); - } - }); - - mFrameTimeNanos = INITIAL_FRAME_TIME_NANOS; - - mReactApplicationContextMock = mock(ReactApplicationContext.class); - PowerMockito.when(mReactApplicationContextMock.hasActiveReactInstance()) - .thenAnswer( - new Answer() { - @Override - public Boolean answer(InvocationOnMock invocationOnMock) throws Throwable { - return true; - } - }); - PowerMockito.when(mReactApplicationContextMock.hasCatalystInstance()) - .thenAnswer( - new Answer() { - @Override - public Boolean answer(InvocationOnMock invocationOnMock) throws Throwable { - return true; - } - }); - PowerMockito.when(mReactApplicationContextMock.getCatalystInstance()) - .thenAnswer( - new Answer() { - @Override - public CatalystInstance answer(InvocationOnMock invocationOnMock) throws Throwable { - return mCatalystInstanceMock; - } - }); - PowerMockito.when(mReactApplicationContextMock.getNativeModule(any(Class.class))) - .thenAnswer( - new Answer() { - @Override - public UIManagerModule answer(InvocationOnMock invocationOnMock) throws Throwable { - return mUIManagerMock; - } - }); - - mCatalystInstanceMock = mock(CatalystInstance.class); - PowerMockito.when(mCatalystInstanceMock.getJSIModule(any(JSIModuleType.class))) - .thenAnswer( - new Answer() { - @Override - public UIManagerModule answer(InvocationOnMock invocationOnMock) throws Throwable { - return mUIManagerMock; - } - }); - PowerMockito.when(mCatalystInstanceMock.getNativeModule(any(Class.class))) - .thenAnswer( - new Answer() { - @Override - public UIManagerModule answer(InvocationOnMock invocationOnMock) throws Throwable { - return mUIManagerMock; - } - }); - - mUIManagerMock = mock(UIManagerModule.class); - mEventDispatcherMock = mock(EventDispatcher.class); - PowerMockito.when(mUIManagerMock.getEventDispatcher()) - .thenAnswer( - new Answer() { - @Override - public EventDispatcher answer(InvocationOnMock invocation) throws Throwable { - return mEventDispatcherMock; - } - }); - PowerMockito.when(mUIManagerMock.getConstants()) - .thenAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - return MapBuilder.of("customDirectEventTypes", MapBuilder.newHashMap()); - } - }); - PowerMockito.when(mUIManagerMock.getDirectEventNamesResolver()) - .thenAnswer( - new Answer() { - @Override - public UIManagerModule.CustomEventNamesResolver answer(InvocationOnMock invocation) - throws Throwable { - return new UIManagerModule.CustomEventNamesResolver() { - @Override - public String resolveCustomEventName(String eventName) { - Map directEventTypes = - (Map) - mUIManagerMock.getConstants().get("customDirectEventTypes"); - if (directEventTypes != null) { - Map customEventType = - (Map) directEventTypes.get(eventName); - if (customEventType != null) { - return customEventType.get("registrationName"); - } - } - return eventName; - } - }; - } - }); - PowerMockito.when(mUIManagerMock.resolveCustomDirectEventName(any(String.class))) - .thenAnswer( - new Answer() { - @Override - public String answer(InvocationOnMock invocation) throws Throwable { - String arg = invocation.getArguments()[0].toString(); - return "on" + arg.substring(3); - } - }); - mNativeAnimatedNodesManager = new NativeAnimatedNodesManager(mReactApplicationContextMock); - } - - /** - * Generates a simple animated nodes graph and attaches the props node to a given {@param viewTag} - * Parameter {@param opacity} is used as a initial value for the "opacity" attribute. - * - *

      Nodes are connected as follows (nodes IDs in parens): ValueNode(1) -> StyleNode(2) -> - * PropNode(3) - */ - private void createSimpleAnimatedViewWithOpacity(int viewTag, double opacity) { - mNativeAnimatedNodesManager.createAnimatedNode( - 1, JavaOnlyMap.of("type", "value", "value", opacity, "offset", 0d)); - mNativeAnimatedNodesManager.createAnimatedNode( - 2, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("opacity", 1))); - mNativeAnimatedNodesManager.createAnimatedNode( - 3, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 2))); - mNativeAnimatedNodesManager.connectAnimatedNodes(1, 2); - mNativeAnimatedNodesManager.connectAnimatedNodes(2, 3); - mNativeAnimatedNodesManager.connectAnimatedNodeToView(3, viewTag); - } - - @Test - public void testFramesAnimation() { - createSimpleAnimatedViewWithOpacity(1000, 0d); - - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d); - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, 1, JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1d), animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - for (int i = 0; i < frames.size(); i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(frames.getDouble(i)); - } - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - @Test - public void testFramesAnimationLoopsFiveTimes() { - createSimpleAnimatedViewWithOpacity(1000, 0d); - - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d); - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - 1, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1d, "iterations", 5), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - for (int iteration = 0; iteration < 5; iteration++) { - for (int i = 0; i < frames.size(); i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(frames.getDouble(i)); - } - } - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - @Test - public void testNodeValueListenerIfNotListening() { - int nodeId = 1; - - createSimpleAnimatedViewWithOpacity(1000, 0d); - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d); - - Callback animationCallback = mock(Callback.class); - AnimatedNodeValueListener valueListener = mock(AnimatedNodeValueListener.class); - - mNativeAnimatedNodesManager.startListeningToAnimatedNodeValue(nodeId, valueListener); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - nodeId, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1d), - animationCallback); - - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(valueListener).onValueUpdate(eq(0d)); - - mNativeAnimatedNodesManager.stopListeningToAnimatedNodeValue(nodeId); - - reset(valueListener); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(valueListener); - } - - @Test - public void testNodeValueListenerIfListening() { - int nodeId = 1; - - createSimpleAnimatedViewWithOpacity(1000, 0d); - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d); - - Callback animationCallback = mock(Callback.class); - AnimatedNodeValueListener valueListener = mock(AnimatedNodeValueListener.class); - - mNativeAnimatedNodesManager.startListeningToAnimatedNodeValue(nodeId, valueListener); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - nodeId, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1d), - animationCallback); - - for (int i = 0; i < frames.size(); i++) { - reset(valueListener); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(valueListener).onValueUpdate(eq(frames.getDouble(i))); - } - - reset(valueListener); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(valueListener); - } - - public void performSpringAnimationTestWithConfig( - JavaOnlyMap config, boolean testForCriticallyDamped) { - createSimpleAnimatedViewWithOpacity(1000, 0d); - - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode(1, 1, config, animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(0); - - double previousValue = 0d; - boolean wasGreaterThanOne = false; - /* run 3 secs of animation */ - for (int i = 0; i < 3 * 60; i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock, atMost(1)) - .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - double currentValue = stylesCaptor.getValue().getDouble("opacity"); - if (currentValue > 1d) { - wasGreaterThanOne = true; - } - // verify that animation step is relatively small - assertThat(Math.abs(currentValue - previousValue)).isLessThan(0.12d); - previousValue = currentValue; - } - // verify that we've reach the final value at the end of animation - assertThat(previousValue).isEqualTo(1d); - // verify that value has reached some maximum value that is greater than the final value - // (bounce) - if (testForCriticallyDamped) { - assertThat(!wasGreaterThanOne); - } else { - assertThat(wasGreaterThanOne); - } - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - @Test - public void testUnderdampedSpringAnimation() { - performSpringAnimationTestWithConfig( - JavaOnlyMap.of( - "type", - "spring", - "stiffness", - 230.2d, - "damping", - 22d, - "mass", - 1d, - "initialVelocity", - 0d, - "toValue", - 1d, - "restSpeedThreshold", - 0.001d, - "restDisplacementThreshold", - 0.001d, - "overshootClamping", - false), - false); - } - - @Test - public void testCriticallyDampedSpringAnimation() { - performSpringAnimationTestWithConfig( - JavaOnlyMap.of( - "type", - "spring", - "stiffness", - 1000d, - "damping", - 500d, - "mass", - 3.0d, - "initialVelocity", - 0d, - "toValue", - 1d, - "restSpeedThreshold", - 0.001d, - "restDisplacementThreshold", - 0.001d, - "overshootClamping", - false), - true); - } - - @Test - public void testSpringAnimationLoopsFiveTimes() { - createSimpleAnimatedViewWithOpacity(1000, 0d); - - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - 1, - JavaOnlyMap.of( - "type", - "spring", - "stiffness", - 230.2d, - "damping", - 22d, - "mass", - 1d, - "initialVelocity", - 0d, - "toValue", - 1d, - "restSpeedThreshold", - 0.001d, - "restDisplacementThreshold", - 0.001d, - "overshootClamping", - false, - "iterations", - 5), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(0); - - double previousValue = 0d; - boolean wasGreaterThanOne = false; - boolean didComeToRest = false; - int numberOfResets = 0; - /* run 3 secs of animation, five times */ - for (int i = 0; i < 3 * 60 * 5; i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock, atMost(1)) - .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - double currentValue = stylesCaptor.getValue().getDouble("opacity"); - if (currentValue > 1d) { - wasGreaterThanOne = true; - } - // Test to see if it reset after coming to rest - if (didComeToRest - && currentValue == 0d - && Math.abs(Math.abs(currentValue - previousValue) - 1d) < 0.001d) { - numberOfResets++; - } - - // verify that an animation step is relatively small, unless it has come to rest and reset - if (!didComeToRest) assertThat(Math.abs(currentValue - previousValue)).isLessThan(0.12d); - - // record that the animation did come to rest when it rests on toValue - didComeToRest = - Math.abs(currentValue - 1d) < 0.001d && Math.abs(currentValue - previousValue) < 0.001d; - previousValue = currentValue; - } - // verify that we've reach the final value at the end of animation - assertThat(previousValue).isEqualTo(1d); - // verify that value has reached some maximum value that is greater than the final value - // (bounce) - assertThat(wasGreaterThanOne); - // verify that value reset 4 times after finishing a full animation - assertThat(numberOfResets).isEqualTo(4); - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - @Test - public void testDecayAnimation() { - createSimpleAnimatedViewWithOpacity(1000, 0d); - - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - 1, - JavaOnlyMap.of("type", "decay", "velocity", 0.5d, "deceleration", 0.998d), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock, atMost(1)) - .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - double previousValue = stylesCaptor.getValue().getDouble("opacity"); - double previousDiff = Double.POSITIVE_INFINITY; - /* run 3 secs of animation */ - for (int i = 0; i < 3 * 60; i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock, atMost(1)) - .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - double currentValue = stylesCaptor.getValue().getDouble("opacity"); - double currentDiff = currentValue - previousValue; - // verify monotonicity - // greater *or equal* because the animation stops during these 3 seconds - assertThat(currentValue).as("on frame " + i).isGreaterThanOrEqualTo(previousValue); - // verify decay - if (i > 3) { - // i > 3 because that's how long it takes to settle previousDiff - if (i % 3 != 0) { - // i % 3 != 0 because every 3 frames we go a tiny - // bit faster, because frame length is 16.(6)ms - assertThat(currentDiff).as("on frame " + i).isLessThanOrEqualTo(previousDiff); - } else { - assertThat(currentDiff).as("on frame " + i).isGreaterThanOrEqualTo(previousDiff); - } - } - previousValue = currentValue; - previousDiff = currentDiff; - } - // should be done in 3s - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - @Test - public void testDecayAnimationLoopsFiveTimes() { - createSimpleAnimatedViewWithOpacity(1000, 0d); - - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - 1, - JavaOnlyMap.of("type", "decay", "velocity", 0.5d, "deceleration", 0.998d, "iterations", 5), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock, atMost(1)) - .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - double previousValue = stylesCaptor.getValue().getDouble("opacity"); - double previousDiff = Double.POSITIVE_INFINITY; - double initialValue = stylesCaptor.getValue().getDouble("opacity"); - boolean didComeToRest = false; - int numberOfResets = 0; - /* run 3 secs of animation, five times */ - for (int i = 0; i < 3 * 60 * 5; i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock, atMost(1)) - .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - double currentValue = stylesCaptor.getValue().getDouble("opacity"); - double currentDiff = currentValue - previousValue; - // Test to see if it reset after coming to rest (i.e. dropped back to ) - if (didComeToRest && currentValue == initialValue) { - numberOfResets++; - } - - // verify monotonicity, unless it has come to rest and reset - // greater *or equal* because the animation stops during these 3 seconds - if (!didComeToRest) - assertThat(currentValue).as("on frame " + i).isGreaterThanOrEqualTo(previousValue); - - // Test if animation has come to rest using the 0.1 threshold from DecayAnimation.java - didComeToRest = Math.abs(currentDiff) < 0.1d; - previousValue = currentValue; - previousDiff = currentDiff; - } - - // verify that value reset (looped) 4 times after finishing a full animation - assertThat(numberOfResets).isEqualTo(4); - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - @Test - public void testAnimationCallbackFinish() { - createSimpleAnimatedViewWithOpacity(1000, 0d); - - JavaOnlyArray frames = JavaOnlyArray.of(0d, 1d); - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, 1, JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1d), animationCallback); - - ArgumentCaptor callbackResponseCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(animationCallback); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(animationCallback); - - reset(animationCallback); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(animationCallback).invoke(callbackResponseCaptor.capture()); - - assertThat(callbackResponseCaptor.getValue().hasKey("finished")).isTrue(); - assertThat(callbackResponseCaptor.getValue().getBoolean("finished")).isTrue(); - - reset(animationCallback); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(animationCallback); - } - - /** - * Creates a following graph of nodes: Value(1, firstValue) ----> Add(3) ---> Style(4) ---> - * Props(5) ---> View(viewTag) | Value(2, secondValue) --+ - * - *

      Add(3) node maps to a "translateX" attribute of the Style(4) node. - */ - private void createAnimatedGraphWithAdditionNode( - int viewTag, double firstValue, double secondValue) { - mNativeAnimatedNodesManager.createAnimatedNode( - 1, JavaOnlyMap.of("type", "value", "value", firstValue, "offset", 0d)); - mNativeAnimatedNodesManager.createAnimatedNode( - 2, JavaOnlyMap.of("type", "value", "value", secondValue, "offset", 0d)); - - mNativeAnimatedNodesManager.createAnimatedNode( - 3, JavaOnlyMap.of("type", "addition", "input", JavaOnlyArray.of(1, 2))); - - mNativeAnimatedNodesManager.createAnimatedNode( - 4, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("translateX", 3))); - mNativeAnimatedNodesManager.createAnimatedNode( - 5, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 4))); - mNativeAnimatedNodesManager.connectAnimatedNodes(1, 3); - mNativeAnimatedNodesManager.connectAnimatedNodes(2, 3); - mNativeAnimatedNodesManager.connectAnimatedNodes(3, 4); - mNativeAnimatedNodesManager.connectAnimatedNodes(4, 5); - mNativeAnimatedNodesManager.connectAnimatedNodeToView(5, viewTag); - } - - @Test - public void testAdditionNode() { - createAnimatedGraphWithAdditionNode(50, 100d, 1000d); - - Callback animationCallback = mock(Callback.class); - JavaOnlyArray frames = JavaOnlyArray.of(0d, 1d); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - 1, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 101d), - animationCallback); - - mNativeAnimatedNodesManager.startAnimatingNode( - 2, - 2, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1010d), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")).isEqualTo(1100d); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")).isEqualTo(1111d); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - /** - * Verifies that {@link NativeAnimatedNodesManager#runUpdates} updates the view correctly in case - * when one of the addition input nodes has started animating while the other one has not. - * - *

      We expect that the output of the addition node will take the starting value of the second - * input node even though the node hasn't been connected to an active animation driver. - */ - @Test - public void testViewReceiveUpdatesIfOneOfAnimationHasntStarted() { - createAnimatedGraphWithAdditionNode(50, 100d, 1000d); - - // Start animating only the first addition input node - Callback animationCallback = mock(Callback.class); - JavaOnlyArray frames = JavaOnlyArray.of(0d, 1d); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - 1, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 101d), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")).isEqualTo(1100d); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")).isEqualTo(1101d); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - /** - * Verifies that {@link NativeAnimatedNodesManager#runUpdates} updates the view correctly in case - * when one of the addition input nodes animation finishes before the other. - * - *

      We expect that the output of the addition node after one of the animation has finished will - * take the last value of the animated node and the view will receive updates up until the second - * animation is over. - */ - @Test - public void testViewReceiveUpdatesWhenOneOfAnimationHasFinished() { - createAnimatedGraphWithAdditionNode(50, 100d, 1000d); - - Callback animationCallback = mock(Callback.class); - - // Start animating for the first addition input node, will have 2 frames only - JavaOnlyArray firstFrames = JavaOnlyArray.of(0d, 1d); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - 1, - JavaOnlyMap.of("type", "frames", "frames", firstFrames, "toValue", 200d), - animationCallback); - - // Start animating for the first addition input node, will have 6 frames - JavaOnlyArray secondFrames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d); - mNativeAnimatedNodesManager.startAnimatingNode( - 2, - 2, - JavaOnlyMap.of("type", "frames", "frames", secondFrames, "toValue", 1010d), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")).isEqualTo(1100d); - - for (int i = 1; i < secondFrames.size(); i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")) - .isEqualTo(1200d + secondFrames.getDouble(i) * 10d); - } - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - @Test - public void testMultiplicationNode() { - mNativeAnimatedNodesManager.createAnimatedNode( - 1, JavaOnlyMap.of("type", "value", "value", 1d, "offset", 0d)); - mNativeAnimatedNodesManager.createAnimatedNode( - 2, JavaOnlyMap.of("type", "value", "value", 5d, "offset", 0d)); - - mNativeAnimatedNodesManager.createAnimatedNode( - 3, JavaOnlyMap.of("type", "multiplication", "input", JavaOnlyArray.of(1, 2))); - - mNativeAnimatedNodesManager.createAnimatedNode( - 4, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("translateX", 3))); - mNativeAnimatedNodesManager.createAnimatedNode( - 5, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 4))); - mNativeAnimatedNodesManager.connectAnimatedNodes(1, 3); - mNativeAnimatedNodesManager.connectAnimatedNodes(2, 3); - mNativeAnimatedNodesManager.connectAnimatedNodes(3, 4); - mNativeAnimatedNodesManager.connectAnimatedNodes(4, 5); - mNativeAnimatedNodesManager.connectAnimatedNodeToView(5, 50); - - Callback animationCallback = mock(Callback.class); - JavaOnlyArray frames = JavaOnlyArray.of(0d, 1d); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, 1, JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 2d), animationCallback); - - mNativeAnimatedNodesManager.startAnimatingNode( - 2, - 2, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 10d), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")).isEqualTo(5d); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")).isEqualTo(20d); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - /** - * This test verifies that when {@link NativeAnimatedModule#stopAnimation} is called the animation - * will no longer be updating the nodes it has been previously attached to and that the animation - * callback will be triggered with {@code {finished: false}} - */ - @Test - public void testHandleStoppingAnimation() { - createSimpleAnimatedViewWithOpacity(1000, 0d); - - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1.0d); - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode( - 404, - 1, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1d), - animationCallback); - - ArgumentCaptor callbackResponseCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(animationCallback); - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock, times(2)) - .synchronouslyUpdateViewOnUIThread(anyInt(), any(ReadableMap.class)); - verifyNoMoreInteractions(animationCallback); - - reset(animationCallback); - reset(mUIManagerMock); - mNativeAnimatedNodesManager.stopAnimation(404); - verify(animationCallback).invoke(callbackResponseCaptor.capture()); - verifyNoMoreInteractions(animationCallback); - verifyNoMoreInteractions(mUIManagerMock); - - assertThat(callbackResponseCaptor.getValue().hasKey("finished")).isTrue(); - assertThat(callbackResponseCaptor.getValue().getBoolean("finished")).isFalse(); - - reset(animationCallback); - reset(mUIManagerMock); - // Run "update" loop a few more times -> we expect no further updates nor callback calls to be - // triggered - for (int i = 0; i < 5; i++) { - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - } - - verifyNoMoreInteractions(mUIManagerMock); - verifyNoMoreInteractions(animationCallback); - } - - @Test - public void testGetValue() { - int tag = 1; - mNativeAnimatedNodesManager.createAnimatedNode( - tag, JavaOnlyMap.of("type", "value", "value", 1d, "offset", 0d)); - - Callback saveValueCallbackMock = mock(Callback.class); - - mNativeAnimatedNodesManager.getValue(tag, saveValueCallbackMock); - - verify(saveValueCallbackMock, times(1)).invoke(1d); - } - - @Test - public void testInterpolationNode() { - mNativeAnimatedNodesManager.createAnimatedNode( - 1, JavaOnlyMap.of("type", "value", "value", 10d, "offset", 0d)); - - mNativeAnimatedNodesManager.createAnimatedNode( - 2, - JavaOnlyMap.of( - "type", - "interpolation", - "inputRange", - JavaOnlyArray.of(10d, 20d), - "outputRange", - JavaOnlyArray.of(0d, 1d), - "extrapolateLeft", - "extend", - "extrapolateRight", - "extend")); - - mNativeAnimatedNodesManager.createAnimatedNode( - 3, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("opacity", 2))); - mNativeAnimatedNodesManager.createAnimatedNode( - 4, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 3))); - mNativeAnimatedNodesManager.connectAnimatedNodes(1, 2); - mNativeAnimatedNodesManager.connectAnimatedNodes(2, 3); - mNativeAnimatedNodesManager.connectAnimatedNodes(3, 4); - mNativeAnimatedNodesManager.connectAnimatedNodeToView(4, 50); - - Callback animationCallback = mock(Callback.class); - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, - 1, - JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 20d), - animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - for (int i = 0; i < frames.size(); i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(frames.getDouble(i)); - } - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - private Event createScrollEvent(final int tag, final double value) { - return new Event(tag) { - @Override - public String getEventName() { - return "topScroll"; - } - - @Override - public void dispatch(RCTEventEmitter rctEventEmitter) { - rctEventEmitter.receiveEvent( - tag, "topScroll", JavaOnlyMap.of("contentOffset", JavaOnlyMap.of("y", value))); - } - }; - } - - @Test - public void testNativeAnimatedEventDoUpdate() { - int viewTag = 1000; - - createSimpleAnimatedViewWithOpacity(viewTag, 0d); - - mNativeAnimatedNodesManager.addAnimatedEventToView( - viewTag, - "onScroll", - JavaOnlyMap.of( - "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))); - - mNativeAnimatedNodesManager.onEventDispatch(createScrollEvent(viewTag, 10)); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(10); - } - - @Test - public void testNativeAnimatedEventDoNotUpdate() { - int viewTag = 1000; - - createSimpleAnimatedViewWithOpacity(viewTag, 0d); - - mNativeAnimatedNodesManager.addAnimatedEventToView( - viewTag, - "otherEvent", - JavaOnlyMap.of( - "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))); - - mNativeAnimatedNodesManager.addAnimatedEventToView( - 999, - "topScroll", - JavaOnlyMap.of( - "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))); - - mNativeAnimatedNodesManager.onEventDispatch(createScrollEvent(viewTag, 10)); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(0); - } - - @Test - public void testNativeAnimatedEventCustomMapping() { - int viewTag = 1000; - - PowerMockito.when(mUIManagerMock.getConstants()) - .thenAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - return MapBuilder.of( - "customDirectEventTypes", - MapBuilder.of("onScroll", MapBuilder.of("registrationName", "onScroll"))); - } - }); - mNativeAnimatedNodesManager = new NativeAnimatedNodesManager(mReactApplicationContextMock); - - createSimpleAnimatedViewWithOpacity(viewTag, 0d); - - mNativeAnimatedNodesManager.addAnimatedEventToView( - viewTag, - "onScroll", - JavaOnlyMap.of( - "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))); - - mNativeAnimatedNodesManager.onEventDispatch(createScrollEvent(viewTag, 10)); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(10); - } - - @Test - public void testRestoreDefaultProps() { - int viewTag = 1001; // restoreDefaultProps not called in Fabric, make sure it's a non-Fabric tag - int propsNodeTag = 3; - mNativeAnimatedNodesManager.createAnimatedNode( - 1, JavaOnlyMap.of("type", "value", "value", 1d, "offset", 0d)); - mNativeAnimatedNodesManager.createAnimatedNode( - 2, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("opacity", 1))); - mNativeAnimatedNodesManager.createAnimatedNode( - propsNodeTag, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 2))); - mNativeAnimatedNodesManager.connectAnimatedNodes(1, 2); - mNativeAnimatedNodesManager.connectAnimatedNodes(2, propsNodeTag); - mNativeAnimatedNodesManager.connectAnimatedNodeToView(propsNodeTag, viewTag); - - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.5d, 1d); - Callback animationCallback = mock(Callback.class); - mNativeAnimatedNodesManager.startAnimatingNode( - 1, 1, JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 0d), animationCallback); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - for (int i = 0; i < frames.size(); i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - } - - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("opacity")).isEqualTo(0); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.restoreDefaultValues(propsNodeTag); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().isNull("opacity")); - } - - /** - * Creates a following graph of nodes: Value(3, initialValue) ----> Style(4) ---> Props(5) ---> - * View(viewTag) - * - *

      Value(3) is set to track Value(1) via Tracking(2) node with the provided animation config - */ - private void createAnimatedGraphWithTrackingNode( - int viewTag, double initialValue, JavaOnlyMap animationConfig) { - mNativeAnimatedNodesManager.createAnimatedNode( - 1, JavaOnlyMap.of("type", "value", "value", initialValue, "offset", 0d)); - mNativeAnimatedNodesManager.createAnimatedNode( - 3, JavaOnlyMap.of("type", "value", "value", initialValue, "offset", 0d)); - - mNativeAnimatedNodesManager.createAnimatedNode( - 2, - JavaOnlyMap.of( - "type", - "tracking", - "animationId", - 70, - "value", - 3, - "toValue", - 1, - "animationConfig", - animationConfig)); - - mNativeAnimatedNodesManager.createAnimatedNode( - 4, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("translateX", 3))); - mNativeAnimatedNodesManager.createAnimatedNode( - 5, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 4))); - mNativeAnimatedNodesManager.connectAnimatedNodes(1, 2); - mNativeAnimatedNodesManager.connectAnimatedNodes(3, 4); - mNativeAnimatedNodesManager.connectAnimatedNodes(4, 5); - mNativeAnimatedNodesManager.connectAnimatedNodeToView(5, viewTag); - } - - /** - * In this test we verify that when value is being tracked we can update destination value in the - * middle of ongoing animation and the animation will update and animate to the new spot. This is - * tested using simple 5 frame backed timing animation. - */ - @Test - public void testTracking() { - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.25d, 0.5d, 0.75d, 1d); - JavaOnlyMap animationConfig = JavaOnlyMap.of("type", "frames", "frames", frames); - - createAnimatedGraphWithTrackingNode(1000, 0d, animationConfig); - - ArgumentCaptor stylesCaptor = ArgumentCaptor.forClass(ReadableMap.class); - - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")).isEqualTo(0d); - - // update "toValue" to 100, we expect tracking animation to animate now from 0 to 100 in 5 steps - mNativeAnimatedNodesManager.setAnimatedNodeValue(1, 100d); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); // kick off the animation - - for (int i = 0; i < frames.size(); i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")) - .isEqualTo(frames.getDouble(i) * 100d); - } - - // update "toValue" to 0 but run only two frames from the animation, - // we expect tracking animation to animate now from 100 to 75 - mNativeAnimatedNodesManager.setAnimatedNodeValue(1, 0d); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); // kick off the animation - - for (int i = 0; i < 2; i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")) - .isEqualTo(100d * (1d - frames.getDouble(i))); - } - - // at this point we expect tracking value to be at 75 - assertThat(((ValueAnimatedNode) mNativeAnimatedNodesManager.getNodeById(3)).getValue()) - .isEqualTo(75d); - - // we update "toValue" again to 100 and expect the animation to restart from the current place - mNativeAnimatedNodesManager.setAnimatedNodeValue(1, 100d); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); // kick off the animation - - for (int i = 0; i < frames.size(); i++) { - reset(mUIManagerMock); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verify(mUIManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()); - assertThat(stylesCaptor.getValue().getDouble("translateX")) - .isEqualTo(50d + 50d * frames.getDouble(i)); - } - } - - /** - * In this test we verify that when tracking is set up for a given animated node and when the - * animation settles it will not be registered as an active animation and therefore will not - * consume resources on running the animation that has already completed. Then we verify that when - * the value updates the animation will resume as expected and the complete again when reaches the - * end. - */ - @Test - public void testTrackingPausesWhenEndValueIsReached() { - JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.5d, 1d); - JavaOnlyMap animationConfig = JavaOnlyMap.of("type", "frames", "frames", frames); - - createAnimatedGraphWithTrackingNode(1000, 0d, animationConfig); - mNativeAnimatedNodesManager.setAnimatedNodeValue(1, 100d); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); // make sure animation starts - - reset(mUIManagerMock); - for (int i = 0; i < frames.size(); i++) { - assertThat(mNativeAnimatedNodesManager.hasActiveAnimations()).isTrue(); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - } - verify(mUIManagerMock, times(frames.size())) - .synchronouslyUpdateViewOnUIThread(eq(1000), any(ReadableMap.class)); - - // the animation has completed, we expect no updates to be done - reset(mUIManagerMock); - assertThat(mNativeAnimatedNodesManager.hasActiveAnimations()).isFalse(); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - - // we update end value and expect the animation to restart - mNativeAnimatedNodesManager.setAnimatedNodeValue(1, 200d); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); // make sure animation starts - - reset(mUIManagerMock); - for (int i = 0; i < frames.size(); i++) { - assertThat(mNativeAnimatedNodesManager.hasActiveAnimations()).isTrue(); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - } - verify(mUIManagerMock, times(frames.size())) - .synchronouslyUpdateViewOnUIThread(eq(1000), any(ReadableMap.class)); - - // the animation has completed, we expect no updates to be done - reset(mUIManagerMock); - assertThat(mNativeAnimatedNodesManager.hasActiveAnimations()).isFalse(); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - verifyNoMoreInteractions(mUIManagerMock); - } - - /** - * In this test we verify that when tracking is configured to use spring animation and when the - * destination value updates the current speed of the animated value will be taken into account - * while updating the spring animation and it will smoothly transition to the new end value. - */ - @Test - public void testSpringTrackingRetainsSpeed() { - // this spring config corresponds to tension 20 and friction 0.5 which makes the spring settle - // very slowly - JavaOnlyMap springConfig = - JavaOnlyMap.of( - "type", - "spring", - "restSpeedThreshold", - 0.001, - "mass", - 1d, - "restDisplacementThreshold", - 0.001, - "initialVelocity", - 0.5d, - "damping", - 2.5, - "stiffness", - 157.8, - "overshootClamping", - false); - - createAnimatedGraphWithTrackingNode(1000, 0d, springConfig); - - // update "toValue" to 1, we expect tracking animation to animate now from 0 to 1 - mNativeAnimatedNodesManager.setAnimatedNodeValue(1, 1d); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - - // we run several steps of animation until the value starts bouncing, has negative speed and - // passes the final point (that is 1) while going backwards - boolean isBoucingBack = false; - double previousValue = - ((ValueAnimatedNode) mNativeAnimatedNodesManager.getNodeById(3)).getValue(); - for (int maxFrames = 500; maxFrames > 0; maxFrames--) { - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - double currentValue = - ((ValueAnimatedNode) mNativeAnimatedNodesManager.getNodeById(3)).getValue(); - if (previousValue >= 1d && currentValue < 1d) { - isBoucingBack = true; - break; - } - previousValue = currentValue; - } - assertThat(isBoucingBack).isTrue(); - - // we now update "toValue" to 1.5 but since the value have negative speed and has also pretty - // low friction we expect it to keep going in the opposite direction for a few more frames - mNativeAnimatedNodesManager.setAnimatedNodeValue(1, 1.5d); - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - int bounceBackInitialFrames = 0; - boolean hasTurnedForward = false; - - // we run 8 seconds of animation - for (int i = 0; i < 8 * 60; i++) { - mNativeAnimatedNodesManager.runUpdates(nextFrameTime()); - double currentValue = - ((ValueAnimatedNode) mNativeAnimatedNodesManager.getNodeById(3)).getValue(); - if (!hasTurnedForward) { - if (currentValue <= previousValue) { - bounceBackInitialFrames++; - } else { - hasTurnedForward = true; - } - } - previousValue = currentValue; - } - assertThat(hasTurnedForward).isEqualTo(true); - assertThat(bounceBackInitialFrames).isGreaterThan(3); - - // we verify that the value settled at 2 - assertThat(previousValue).isEqualTo(1.5d); - } -} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.kt new file mode 100644 index 00000000000000..b8da3ba774172d --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.kt @@ -0,0 +1,1242 @@ +/* + * 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. + */ + +@file:Suppress("DEPRECATION") // Suppressing as we want to test RCTEventEmitter here +package com.facebook.react.animated + +import android.annotation.SuppressLint +import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.Callback +import com.facebook.react.bridge.CatalystInstance +import com.facebook.react.bridge.JSIModuleType +import com.facebook.react.bridge.JavaOnlyArray +import com.facebook.react.bridge.JavaOnlyMap +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.common.MapBuilder +import com.facebook.react.uimanager.UIManagerModule +import com.facebook.react.uimanager.events.Event +import com.facebook.react.uimanager.events.EventDispatcher +import com.facebook.react.uimanager.events.RCTEventEmitter +import kotlin.collections.Map +import kotlin.math.abs +import org.assertj.core.api.Assertions.assertThat +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.ArgumentMatchers.any +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.ArgumentMatchers.eq +import org.mockito.Mockito.atMost +import org.mockito.Mockito.mock +import org.mockito.Mockito.reset +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.powermock.api.mockito.PowerMockito.mockStatic +import org.powermock.api.mockito.PowerMockito.`when` as whenever +import org.powermock.core.classloader.annotations.PowerMockIgnore +import org.powermock.core.classloader.annotations.PrepareForTest +import org.powermock.modules.junit4.rule.PowerMockRule +import org.robolectric.RobolectricTestRunner + +/** Tests the animated nodes graph traversal algorithm from {@link NativeAnimatedNodesManager}. */ +@PrepareForTest(Arguments::class) +@RunWith(RobolectricTestRunner::class) +@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "androidx.*", "android.*") +class NativeAnimatedNodeTraversalTest { + @get:Rule var rule = PowerMockRule() + + private var frameTimeNanos: Long = 0L + private lateinit var reactApplicationContextMock: ReactApplicationContext + private lateinit var catalystInstanceMock: CatalystInstance + private lateinit var uiManagerMock: UIManagerModule + private lateinit var eventDispatcherMock: EventDispatcher + private lateinit var nativeAnimatedNodesManager: NativeAnimatedNodesManager + + private fun nextFrameTime(): Long { + frameTimeNanos += FRAME_LEN_NANOS + return frameTimeNanos + } + + @Before + fun setUp() { + mockStatic(Arguments::class.java) + whenever(Arguments.createArray()).thenAnswer { JavaOnlyArray() } + whenever(Arguments.createMap()).thenAnswer { JavaOnlyMap() } + + frameTimeNanos = INITIAL_FRAME_TIME_NANOS + + reactApplicationContextMock = mock(ReactApplicationContext::class.java) + whenever(reactApplicationContextMock.hasActiveReactInstance()).thenAnswer { true } + whenever(reactApplicationContextMock.hasCatalystInstance()).thenAnswer { true } + whenever(reactApplicationContextMock.catalystInstance).thenAnswer { catalystInstanceMock } + whenever(reactApplicationContextMock.getNativeModule(UIManagerModule::class.java)).thenAnswer { + uiManagerMock + } + + catalystInstanceMock = mock(CatalystInstance::class.java) + whenever(catalystInstanceMock.getJSIModule(any(JSIModuleType::class.java))).thenAnswer { + uiManagerMock + } + whenever(catalystInstanceMock.getNativeModule(UIManagerModule::class.java)).thenAnswer { + uiManagerMock + } + + uiManagerMock = mock(UIManagerModule::class.java) + eventDispatcherMock = mock(EventDispatcher::class.java) + whenever(uiManagerMock.eventDispatcher).thenAnswer { eventDispatcherMock } + whenever(uiManagerMock.constants).thenAnswer { + MapBuilder.of("customDirectEventTypes", MapBuilder.newHashMap()) + } + whenever(uiManagerMock.directEventNamesResolver).thenAnswer { + object : UIManagerModule.CustomEventNamesResolver { + override fun resolveCustomEventName(eventName: String): String { + val constants: Map = uiManagerMock.constants ?: emptyMap() + val directEventTypes: Any? = constants["customDirectEventTypes"] + if (directEventTypes != null && directEventTypes is Map<*, *>) { + val customEventType = directEventTypes[eventName] + if (customEventType != null && customEventType is Map<*, *>) { + return customEventType["registrationName"] as? String ?: eventName + } + } + return eventName + } + } + } + whenever(uiManagerMock.resolveCustomDirectEventName(any(String::class.java))).thenAnswer { + invocation -> + val arg = invocation.arguments[0].toString() + "on${arg.substring(3)}" + } + nativeAnimatedNodesManager = NativeAnimatedNodesManager(reactApplicationContextMock) + } + + /** + * Generates a simple animated nodes graph and attaches the props node to a given {@param viewTag} + * Parameter {@param opacity} is used as a initial value for the "opacity" attribute. + * + *

      Nodes are connected as follows (nodes IDs in parens): ValueNode(1) -> StyleNode(2) -> + * PropNode(3) + */ + private fun createSimpleAnimatedViewWithOpacity(viewTag: Int = 1000) { + val opacity = 0.0 + nativeAnimatedNodesManager.createAnimatedNode( + 1, JavaOnlyMap.of("type", "value", "value", opacity, "offset", 0.0)) + nativeAnimatedNodesManager.createAnimatedNode( + 2, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("opacity", 1))) + nativeAnimatedNodesManager.createAnimatedNode( + 3, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 2))) + nativeAnimatedNodesManager.connectAnimatedNodes(1, 2) + nativeAnimatedNodesManager.connectAnimatedNodes(2, 3) + nativeAnimatedNodesManager.connectAnimatedNodeToView(3, viewTag) + } + + @Test + fun testFramesAnimation() { + createSimpleAnimatedViewWithOpacity() + + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.2, 0.4, 0.6, 0.8, 1.0) + + val animationCallback: Callback = mock(Callback::class.java) + nativeAnimatedNodesManager.startAnimatingNode( + 1, 1, JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1.0), animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + for (i in 0 until frames.size()) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(frames.getDouble(i)) + } + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + @Test + fun testFramesAnimationLoopsFiveTimes() { + createSimpleAnimatedViewWithOpacity() + + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.2, 0.4, 0.6, 0.8, 1.0) + val animationCallback: Callback = mock(Callback::class.java) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + 1, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1.0, "iterations", 5), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + for (iteration in 1..5) { + for (i in 0 until frames.size()) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(frames.getDouble(i)) + } + } + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + @Test + fun testNodeValueListenerIfNotListening() { + val nodeId: Int = 1 + + createSimpleAnimatedViewWithOpacity() + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.2, 0.4, 0.6, 0.8, 1.0) + + val animationCallback: Callback = mock(Callback::class.java) + val valueListener: AnimatedNodeValueListener = mock(AnimatedNodeValueListener::class.java) + + nativeAnimatedNodesManager.startListeningToAnimatedNodeValue(nodeId, valueListener) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + nodeId, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1.0), + animationCallback) + + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(valueListener).onValueUpdate(eq(0.0)) + + nativeAnimatedNodesManager.stopListeningToAnimatedNodeValue(nodeId) + + reset(valueListener) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(valueListener) + } + + @Test + fun testNodeValueListenerIfListening() { + val nodeId: Int = 1 + + createSimpleAnimatedViewWithOpacity() + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.2, 0.4, 0.6, 0.8, 1.0) + + val animationCallback: Callback = mock(Callback::class.java) + val valueListener: AnimatedNodeValueListener = mock(AnimatedNodeValueListener::class.java) + + nativeAnimatedNodesManager.startListeningToAnimatedNodeValue(nodeId, valueListener) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + nodeId, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1.0), + animationCallback) + + for (i in 0 until frames.size()) { + reset(valueListener) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(valueListener).onValueUpdate(eq(frames.getDouble(i))) + } + + reset(valueListener) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(valueListener) + } + + private fun performSpringAnimationTestWithConfig( + config: JavaOnlyMap?, + testForCriticallyDamped: Boolean + ) { + createSimpleAnimatedViewWithOpacity() + + val animationCallback: Callback = mock(Callback::class.java) + + nativeAnimatedNodesManager.startAnimatingNode(1, 1, config, animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(0.0) + + var previousValue: Double = 0.0 + var wasGreaterThanOne: Boolean = false + + /* run 3 secs of animation */ + for (i in 0 until 3 * 60) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock, atMost(1)) + .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + val currentValue: Double = stylesCaptor.value.getDouble("opacity") + if (currentValue > 1.0) { + wasGreaterThanOne = true + } + // verify that animation step is relatively small + assertThat(abs(currentValue - previousValue)).isLessThan(0.12) + previousValue = currentValue + } + // verify that we've reach the final value at the end of animation + assertThat(previousValue).isEqualTo(1.0) + // verify that value has reached some maximum value that is greater than the final value + // (bounce) + if (testForCriticallyDamped) { + assertThat(!wasGreaterThanOne).isTrue + } else { + assertThat(wasGreaterThanOne).isTrue + } + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + @Test + fun testUnderdampedSpringAnimation() { + performSpringAnimationTestWithConfig( + JavaOnlyMap.of( + "type", + "spring", + "stiffness", + 230.2, + "damping", + 22.0, + "mass", + 1.0, + "initialVelocity", + 0.0, + "toValue", + 1.0, + "restSpeedThreshold", + 0.001, + "restDisplacementThreshold", + 0.001, + "overshootClamping", + false), + false) + } + + @Test + fun testCriticallyDampedSpringAnimation() { + performSpringAnimationTestWithConfig( + JavaOnlyMap.of( + "type", + "spring", + "stiffness", + 1000.0, + "damping", + 500.0, + "mass", + 3.0, + "initialVelocity", + 0.0, + "toValue", + 1.0, + "restSpeedThreshold", + 0.001, + "restDisplacementThreshold", + 0.001, + "overshootClamping", + false), + true) + } + + @Test + fun testSpringAnimationLoopsFiveTimes() { + createSimpleAnimatedViewWithOpacity() + + val animationCallback: Callback = mock(Callback::class.java) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + 1, + JavaOnlyMap.of( + "type", + "spring", + "stiffness", + 230.2, + "damping", + 22.0, + "mass", + 1.0, + "initialVelocity", + 0.0, + "toValue", + 1.0, + "restSpeedThreshold", + 0.001, + "restDisplacementThreshold", + 0.001, + "overshootClamping", + false, + "iterations", + 5), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(0.0) + + var previousValue: Double = 0.0 + var wasGreaterThanOne: Boolean = false + var didComeToRest: Boolean = false + var numberOfResets: Int = 0 + /* run 3 secs of animation, five times */ + for (i in 0 until 3 * 60 * 5) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock, atMost(1)) + .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + val currentValue: Double = stylesCaptor.value.getDouble("opacity") + if (currentValue > 1.0) { + wasGreaterThanOne = true + } + // Test to see if it reset after coming to rest + if (didComeToRest && + currentValue == 0.0 && + abs(abs(currentValue - previousValue) - 1.0) < 0.001) { + numberOfResets++ + } + + // verify that an animation step is relatively small, unless it has come to rest and + // reset + if (!didComeToRest) assertThat(abs(currentValue - previousValue)).isLessThan(0.12) + + // record that the animation did come to rest when it rests on toValue + didComeToRest = abs(currentValue - 1.0) < 0.001 && abs(currentValue - previousValue) < 0.001 + previousValue = currentValue + } + // verify that we've reach the final value at the end of animation + assertThat(previousValue).isEqualTo(1.0) + // verify that value has reached some maximum value that is greater than the final value + // (bounce) + assertThat(wasGreaterThanOne).isTrue + // verify that value reset 4 times after finishing a full animation + assertThat(numberOfResets).isEqualTo(4) + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + @Test + fun testDecayAnimation() { + createSimpleAnimatedViewWithOpacity() + + val animationCallback: Callback = mock(Callback::class.java) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + 1, + JavaOnlyMap.of("type", "decay", "velocity", 0.5, "deceleration", 0.998), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock, atMost(1)) + .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + var previousValue: Double = stylesCaptor.value.getDouble("opacity") + var previousDiff: Double = Double.POSITIVE_INFINITY + /* run 3 secs of animation */ + for (i in 0 until 3 * 60) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock, atMost(1)) + .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + val currentValue: Double = stylesCaptor.value.getDouble("opacity") + val currentDiff: Double = currentValue - previousValue + // verify monotonicity + // greater *or equal* because the animation stops during these 3 seconds + assertThat(currentValue).describedAs("on frame $i").isGreaterThanOrEqualTo(previousValue) + // verify decay + if (i > 3) { + // i > 3 because that's how long it takes to settle previousDiff + if (i % 3 != 0) { + // i % 3 != 0 because every 3 frames we go a tiny + // bit faster, because frame length is 16.(6)ms + assertThat(currentDiff).describedAs("on frame $i").isLessThanOrEqualTo(previousDiff) + } else { + assertThat(currentDiff).describedAs("on frame $i").isGreaterThanOrEqualTo(previousDiff) + } + } + previousValue = currentValue + previousDiff = currentDiff + } + // should be done in 3s + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + @Test + fun testDecayAnimationLoopsFiveTimes() { + createSimpleAnimatedViewWithOpacity() + + val animationCallback: Callback = mock(Callback::class.java) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + 1, + JavaOnlyMap.of("type", "decay", "velocity", 0.5, "deceleration", 0.998, "iterations", 5), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock, atMost(1)) + .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + var previousValue: Double = stylesCaptor.value.getDouble("opacity") + val initialValue: Double = stylesCaptor.value.getDouble("opacity") + var didComeToRest: Boolean = false + var numberOfResets: Int = 0 + /* run 3 secs of animation, five times */ + for (i in 0 until 3 * 60 * 5) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock, atMost(1)) + .synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + val currentValue: Double = stylesCaptor.value.getDouble("opacity") + val currentDiff: Double = currentValue - previousValue + // Test to see if it reset after coming to rest (i.e. dropped back to ) + if (didComeToRest && currentValue == initialValue) { + numberOfResets++ + } + + // verify monotonicity, unless it has come to rest and reset + // greater *or equal* because the animation stops during these 3 seconds + if (!didComeToRest) { + assertThat(currentValue).describedAs("on frame $i").isGreaterThanOrEqualTo(previousValue) + } + + // Test if animation has come to rest using the 0.1 threshold from DecayAnimation.java + didComeToRest = abs(currentDiff) < 0.1 + previousValue = currentValue + } + + // verify that value reset (looped) 4 times after finishing a full animation + assertThat(numberOfResets).isEqualTo(4) + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + @Test + fun testAnimationCallbackFinish() { + createSimpleAnimatedViewWithOpacity() + + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 1.0) + val animationCallback: Callback = mock(Callback::class.java) + nativeAnimatedNodesManager.startAnimatingNode( + 1, 1, JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1.0), animationCallback) + + val callbackResponseCaptor: ArgumentCaptor = + ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(animationCallback) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(animationCallback) + + reset(animationCallback) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(animationCallback).invoke(callbackResponseCaptor.capture()) + + assertThat(callbackResponseCaptor.value.hasKey("finished")).isTrue + assertThat(callbackResponseCaptor.value.getBoolean("finished")).isTrue + + reset(animationCallback) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(animationCallback) + } + + /** + * Creates a following graph of nodes: Value(1, firstValue) ----> Add(3) ---> Style(4) ---> + * Props(5) ---> View(viewTag) | Value(2, secondValue) --+ + * + *

      Add(3) node maps to a "translateX" attribute of the Style(4) node. + */ + private fun createAnimatedGraphWithAdditionNode( + viewTag: Int = 50, + firstValue: Double = 100.0, + secondValue: Double = 1000.0 + ) { + nativeAnimatedNodesManager.createAnimatedNode( + 1, JavaOnlyMap.of("type", "value", "value", firstValue, "offset", 0.0)) + nativeAnimatedNodesManager.createAnimatedNode( + 2, JavaOnlyMap.of("type", "value", "value", secondValue, "offset", 0.0)) + + nativeAnimatedNodesManager.createAnimatedNode( + 3, JavaOnlyMap.of("type", "addition", "input", JavaOnlyArray.of(1, 2))) + + nativeAnimatedNodesManager.createAnimatedNode( + 4, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("translateX", 3))) + nativeAnimatedNodesManager.createAnimatedNode( + 5, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 4))) + nativeAnimatedNodesManager.connectAnimatedNodes(1, 3) + nativeAnimatedNodesManager.connectAnimatedNodes(2, 3) + nativeAnimatedNodesManager.connectAnimatedNodes(3, 4) + nativeAnimatedNodesManager.connectAnimatedNodes(4, 5) + nativeAnimatedNodesManager.connectAnimatedNodeToView(5, viewTag) + } + + @Test + fun testAdditionNode() { + createAnimatedGraphWithAdditionNode() + + val animationCallback: Callback = mock(Callback::class.java) + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 1.0) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + 1, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 101.0), + animationCallback) + + nativeAnimatedNodesManager.startAnimatingNode( + 2, + 2, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1010.0), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(1100.0) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(1111.0) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + /** + * Verifies that {@link NativeAnimatedNodesManager#runUpdates} updates the view correctly in case + * when one of the addition input nodes has started animating while the other one has not. + * + *

      We expect that the output of the addition node will take the starting value of the second + * input node even though the node hasn't been connected to an active animation driver. + */ + @Test + fun testViewReceiveUpdatesIfOneOfAnimationHasntStarted() { + createAnimatedGraphWithAdditionNode() + + // Start animating only the first addition input node + val animationCallback: Callback = mock(Callback::class.java) + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 1.0) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + 1, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 101.0), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(1100.0) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(1101.0) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + /** + * Verifies that {@link NativeAnimatedNodesManager#runUpdates} updates the view correctly in case + * when one of the addition input nodes animation finishes before the other. + * + *

      We expect that the output of the addition node after one of the animation has finished will + * take the last value of the animated node and the view will receive updates up until the second + * animation is over. + */ + @Test + fun testViewReceiveUpdatesWhenOneOfAnimationHasFinished() { + createAnimatedGraphWithAdditionNode() + + val animationCallback: Callback = mock(Callback::class.java) + + // Start animating for the first addition input node, will have 2 frames only + val firstFrames: JavaOnlyArray = JavaOnlyArray.of(0.0, 1.0) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + 1, + JavaOnlyMap.of("type", "frames", "frames", firstFrames, "toValue", 200.0), + animationCallback) + + // Start animating for the first addition input node, will have 6 frames + val secondFrames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.2, 0.4, 0.6, 0.8, 1.0) + nativeAnimatedNodesManager.startAnimatingNode( + 2, + 2, + JavaOnlyMap.of("type", "frames", "frames", secondFrames, "toValue", 1010.0), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(1100.0) + + for (i in 1 until secondFrames.size()) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")) + .isEqualTo(1200.0 + secondFrames.getDouble(i) * 10.0) + } + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + @Test + fun testMultiplicationNode() { + nativeAnimatedNodesManager.createAnimatedNode( + 1, JavaOnlyMap.of("type", "value", "value", 1.0, "offset", 0.0)) + nativeAnimatedNodesManager.createAnimatedNode( + 2, JavaOnlyMap.of("type", "value", "value", 5.0, "offset", 0.0)) + + nativeAnimatedNodesManager.createAnimatedNode( + 3, JavaOnlyMap.of("type", "multiplication", "input", JavaOnlyArray.of(1, 2))) + + nativeAnimatedNodesManager.createAnimatedNode( + 4, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("translateX", 3))) + nativeAnimatedNodesManager.createAnimatedNode( + 5, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 4))) + nativeAnimatedNodesManager.connectAnimatedNodes(1, 3) + nativeAnimatedNodesManager.connectAnimatedNodes(2, 3) + nativeAnimatedNodesManager.connectAnimatedNodes(3, 4) + nativeAnimatedNodesManager.connectAnimatedNodes(4, 5) + nativeAnimatedNodesManager.connectAnimatedNodeToView(5, 50) + + val animationCallback: Callback = mock(Callback::class.java) + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 1.0) + nativeAnimatedNodesManager.startAnimatingNode( + 1, 1, JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 2.0), animationCallback) + + nativeAnimatedNodesManager.startAnimatingNode( + 2, + 2, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 10.0), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(5.0) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(20.0) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + /** + * This test verifies that when {@link NativeAnimatedModule#stopAnimation} is called the animation + * will no longer be updating the nodes it has been previously attached to and that the animation + * callback will be triggered with {@code {finished: false}} + */ + @Test + fun testHandleStoppingAnimation() { + createSimpleAnimatedViewWithOpacity() + + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.2, 0.4, 0.6, 0.8, 1.0) + val animationCallback: Callback = mock(Callback::class.java) + nativeAnimatedNodesManager.startAnimatingNode( + 404, + 1, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1.0), + animationCallback) + + val callbackResponseCaptor: ArgumentCaptor = + ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(animationCallback) + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock, times(2)) + .synchronouslyUpdateViewOnUIThread(anyInt(), any(ReadableMap::class.java)) + verifyNoMoreInteractions(animationCallback) + + reset(animationCallback) + reset(uiManagerMock) + nativeAnimatedNodesManager.stopAnimation(404) + verify(animationCallback).invoke(callbackResponseCaptor.capture()) + verifyNoMoreInteractions(animationCallback) + verifyNoMoreInteractions(uiManagerMock) + + assertThat(callbackResponseCaptor.value.hasKey("finished")).isTrue + assertThat(callbackResponseCaptor.value.getBoolean("finished")).isFalse + + reset(animationCallback) + reset(uiManagerMock) + // Run "update" loop a few more times -> we expect no further updates nor callback calls to + // be triggered + for (i in 0 until 5) { + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + } + + verifyNoMoreInteractions(uiManagerMock) + verifyNoMoreInteractions(animationCallback) + } + + @Test + fun testGetValue() { + val tag: Int = 1 + nativeAnimatedNodesManager.createAnimatedNode( + tag, JavaOnlyMap.of("type", "value", "value", 1.0, "offset", 0.0)) + + val saveValueCallbackMock: Callback = mock(Callback::class.java) + + nativeAnimatedNodesManager.getValue(tag, saveValueCallbackMock) + + verify(saveValueCallbackMock, times(1)).invoke(1.0) + } + + @Test + fun testInterpolationNode() { + nativeAnimatedNodesManager.createAnimatedNode( + 1, JavaOnlyMap.of("type", "value", "value", 10.0, "offset", 0.0)) + + nativeAnimatedNodesManager.createAnimatedNode( + 2, + JavaOnlyMap.of( + "type", + "interpolation", + "inputRange", + JavaOnlyArray.of(10.0, 20.0), + "outputRange", + JavaOnlyArray.of(0.0, 1.0), + "extrapolateLeft", + "extend", + "extrapolateRight", + "extend")) + + nativeAnimatedNodesManager.createAnimatedNode( + 3, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("opacity", 2))) + nativeAnimatedNodesManager.createAnimatedNode( + 4, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 3))) + nativeAnimatedNodesManager.connectAnimatedNodes(1, 2) + nativeAnimatedNodesManager.connectAnimatedNodes(2, 3) + nativeAnimatedNodesManager.connectAnimatedNodes(3, 4) + nativeAnimatedNodesManager.connectAnimatedNodeToView(4, 50) + + val animationCallback: Callback = mock(Callback::class.java) + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.2, 0.4, 0.6, 0.8, 1.0) + nativeAnimatedNodesManager.startAnimatingNode( + 1, + 1, + JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 20.0), + animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + for (i in 0 until frames.size()) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(50), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(frames.getDouble(i)) + } + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + private fun createScrollEvent(tag: Int, value: Double): Event> { + return object : Event>(tag) { + + override fun getEventName(): String { + return "topScroll" + } + + @Override + @Deprecated("Deprecated in Java") + override fun dispatch(rctEventEmitter: RCTEventEmitter) { + rctEventEmitter.receiveEvent( + tag, "topScroll", JavaOnlyMap.of("contentOffset", JavaOnlyMap.of("y", value))) + } + } + } + + @Test + fun testNativeAnimatedEventDoUpdate() { + val viewTag = 1000 + + createSimpleAnimatedViewWithOpacity(viewTag) + + nativeAnimatedNodesManager.addAnimatedEventToView( + viewTag, + "onScroll", + JavaOnlyMap.of( + "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))) + + nativeAnimatedNodesManager.onEventDispatch(createScrollEvent(viewTag, 10.0)) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(10.0) + } + + @Test + fun testNativeAnimatedEventDoNotUpdate() { + val viewTag = 1000 + + createSimpleAnimatedViewWithOpacity() + + nativeAnimatedNodesManager.addAnimatedEventToView( + viewTag, + "otherEvent", + JavaOnlyMap.of( + "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))) + + nativeAnimatedNodesManager.addAnimatedEventToView( + 999, + "topScroll", + JavaOnlyMap.of( + "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))) + + nativeAnimatedNodesManager.onEventDispatch(createScrollEvent(viewTag, 10.0)) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(0.0) + } + + @Test + fun testNativeAnimatedEventCustomMapping() { + val viewTag: Int = 1000 + + whenever(uiManagerMock.constants).thenAnswer { + MapBuilder.of( + "customDirectEventTypes", + MapBuilder.of("onScroll", MapBuilder.of("registrationName", "onScroll"))) + } + + nativeAnimatedNodesManager = NativeAnimatedNodesManager(reactApplicationContextMock) + + createSimpleAnimatedViewWithOpacity() + + nativeAnimatedNodesManager.addAnimatedEventToView( + viewTag, + "onScroll", + JavaOnlyMap.of( + "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))) + + nativeAnimatedNodesManager.onEventDispatch(createScrollEvent(viewTag, 10.0)) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(10.0) + } + + @SuppressLint("CheckResult") + @Test + fun testRestoreDefaultProps() { + val viewTag: Int = 1001 + // restoreDefaultProps not called in Fabric, make sure it's a non-Fabric tag + val propsNodeTag: Int = 3 + nativeAnimatedNodesManager.createAnimatedNode( + 1, JavaOnlyMap.of("type", "value", "value", 1.0, "offset", 0.0)) + nativeAnimatedNodesManager.createAnimatedNode( + 2, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("opacity", 1))) + nativeAnimatedNodesManager.createAnimatedNode( + propsNodeTag, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 2))) + nativeAnimatedNodesManager.connectAnimatedNodes(1, 2) + nativeAnimatedNodesManager.connectAnimatedNodes(2, propsNodeTag) + nativeAnimatedNodesManager.connectAnimatedNodeToView(propsNodeTag, viewTag) + + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.5, 1.0) + val animationCallback: Callback = mock(Callback::class.java) + nativeAnimatedNodesManager.startAnimatingNode( + 1, 1, JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 0.0), animationCallback) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + for (i in 0 until frames.size()) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + } + + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("opacity")).isEqualTo(0.0) + + reset(uiManagerMock) + nativeAnimatedNodesManager.restoreDefaultValues(propsNodeTag) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(viewTag), stylesCaptor.capture()) + assertThat(stylesCaptor.value.isNull("opacity")).isTrue + } + + /** + * Creates a following graph of nodes: Value(3, initialValue) ----> Style(4) ---> Props(5) ---> + * View(viewTag) + * + *

      Value(3) is set to track Value(1) via Tracking(2) node with the provided animation config + */ + private fun createAnimatedGraphWithTrackingNode( + animationConfig: JavaOnlyMap, + viewTag: Int = 1000, + initialValue: Double = 0.0, + ) { + nativeAnimatedNodesManager.createAnimatedNode( + 1, JavaOnlyMap.of("type", "value", "value", initialValue, "offset", 0.0)) + nativeAnimatedNodesManager.createAnimatedNode( + 3, JavaOnlyMap.of("type", "value", "value", initialValue, "offset", 0.0)) + + nativeAnimatedNodesManager.createAnimatedNode( + 2, + JavaOnlyMap.of( + "type", + "tracking", + "animationId", + 70, + "value", + 3, + "toValue", + 1, + "animationConfig", + animationConfig)) + + nativeAnimatedNodesManager.createAnimatedNode( + 4, JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("translateX", 3))) + nativeAnimatedNodesManager.createAnimatedNode( + 5, JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 4))) + nativeAnimatedNodesManager.connectAnimatedNodes(1, 2) + nativeAnimatedNodesManager.connectAnimatedNodes(3, 4) + nativeAnimatedNodesManager.connectAnimatedNodes(4, 5) + nativeAnimatedNodesManager.connectAnimatedNodeToView(5, viewTag) + } + + /** + * In this test we verify that when value is being tracked we can update destination value in the + * middle of ongoing animation and the animation will update and animate to the new spot. This is + * tested using simple 5 frame backed timing animation. + */ + @Test + fun testTracking() { + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.25, 0.5, 0.75, 1) + val animationConfig: JavaOnlyMap = JavaOnlyMap.of("type", "frames", "frames", frames) + + createAnimatedGraphWithTrackingNode(animationConfig) + + val stylesCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ReadableMap::class.java) + + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(0.0) + + // update "toValue" to 100, we expect tracking animation to animate now from 0 to 100 in 5 + // steps + nativeAnimatedNodesManager.setAnimatedNodeValue(1, 100.0) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + // kick off the animation + + for (i in 0 until frames.size()) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")).isEqualTo(frames.getDouble(i) * 100.0) + } + + // update "toValue" to 0 but run only two frames from the animation, + // we expect tracking animation to animate now from 100 to 75 + nativeAnimatedNodesManager.setAnimatedNodeValue(1, 0.0) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + // kick off the animation + + for (i in 0 until 2) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")) + .isEqualTo(100 * (1 - frames.getDouble(i))) + } + + // at this point we expect tracking value to be at 75 + assertThat((nativeAnimatedNodesManager.getNodeById(3) as ValueAnimatedNode).value) + .isEqualTo(75.0) + + // we update "toValue" again to 100 and expect the animation to restart from the current + // place + nativeAnimatedNodesManager.setAnimatedNodeValue(1, 100.0) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + // kick off the animation + + for (i in 0 until frames.size()) { + reset(uiManagerMock) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verify(uiManagerMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture()) + assertThat(stylesCaptor.value.getDouble("translateX")) + .isEqualTo(50.0 + 50.0 * frames.getDouble(i)) + } + } + + /** + * In this test we verify that when tracking is set up for a given animated node and when the + * animation settles it will not be registered as an active animation and therefore will not + * consume resources on running the animation that has already completed. Then we verify that when + * the value updates the animation will resume as expected and the complete again when reaches the + * end. + */ + @Test + fun testTrackingPausesWhenEndValueIsReached() { + val frames: JavaOnlyArray = JavaOnlyArray.of(0.0, 0.5, 1.0) + val animationConfig: JavaOnlyMap = JavaOnlyMap.of("type", "frames", "frames", frames) + + createAnimatedGraphWithTrackingNode(animationConfig) + nativeAnimatedNodesManager.setAnimatedNodeValue(1, 100.0) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + // make sure animation starts + + reset(uiManagerMock) + for (i in 0 until frames.size()) { + assertThat(nativeAnimatedNodesManager.hasActiveAnimations()).isTrue + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + } + verify(uiManagerMock, times(frames.size())) + .synchronouslyUpdateViewOnUIThread(eq(1000), any(ReadableMap::class.java)) + + // the animation has completed, we expect no updates to be done + reset(uiManagerMock) + assertThat(nativeAnimatedNodesManager.hasActiveAnimations()).isFalse + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + + // we update end value and expect the animation to restart + nativeAnimatedNodesManager.setAnimatedNodeValue(1, 200.0) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + // make sure animation starts + + reset(uiManagerMock) + for (i in 0 until frames.size()) { + assertThat(nativeAnimatedNodesManager.hasActiveAnimations()).isTrue + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + } + verify(uiManagerMock, times(frames.size())) + .synchronouslyUpdateViewOnUIThread(eq(1000), any(ReadableMap::class.java)) + + // the animation has completed, we expect no updates to be done + reset(uiManagerMock) + assertThat(nativeAnimatedNodesManager.hasActiveAnimations()).isFalse + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + verifyNoMoreInteractions(uiManagerMock) + } + + /** + * In this test we verify that when tracking is configured to use spring animation and when the + * destination value updates the current speed of the animated value will be taken into account + * while updating the spring animation and it will smoothly transition to the new end value. + */ + @Test + fun testSpringTrackingRetainsSpeed() { + // this spring config corresponds to tension 20 and friction 0.5 which makes the spring + // settle + // very slowly + val springConfig: JavaOnlyMap = + JavaOnlyMap.of( + "type", + "spring", + "restSpeedThreshold", + 0.001, + "mass", + 1.0, + "restDisplacementThreshold", + 0.001, + "initialVelocity", + 0.5, + "damping", + 2.5, + "stiffness", + 157.8, + "overshootClamping", + false) + + createAnimatedGraphWithTrackingNode(springConfig) + + // update "toValue" to 1, we expect tracking animation to animate now from 0 to 1 + nativeAnimatedNodesManager.setAnimatedNodeValue(1, 1.0) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + + // we run several steps of animation until the value starts bouncing, has negative speed and + // passes the final point (that is 1) while going backwards + var isBoucingBack: Boolean = false + var previousValue: Double = + (nativeAnimatedNodesManager.getNodeById(3) as ValueAnimatedNode).value + for (i in 500 downTo 0) { + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + val currentValue: Double = + (nativeAnimatedNodesManager.getNodeById(3) as ValueAnimatedNode).value + if (previousValue >= 1.0 && currentValue < 1.0) { + isBoucingBack = true + break + } + previousValue = currentValue + } + assertThat(isBoucingBack).isTrue + + // we now update "toValue" to 1.5 but since the value have negative speed and has also + // pretty + // low friction we expect it to keep going in the opposite direction for a few more frames + nativeAnimatedNodesManager.setAnimatedNodeValue(1, 1.5) + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + var bounceBackInitialFrames: Int = 0 + var hasTurnedForward: Boolean = false + + // we run 8 seconds of animation + for (i in 0 until 8 * 60) { + nativeAnimatedNodesManager.runUpdates(nextFrameTime()) + val currentValue: Double = + (nativeAnimatedNodesManager.getNodeById(3) as ValueAnimatedNode).value + if (!hasTurnedForward) { + if (currentValue <= previousValue) { + bounceBackInitialFrames++ + } else { + hasTurnedForward = true + } + } + previousValue = currentValue + } + assertThat(hasTurnedForward).isEqualTo(true) + assertThat(bounceBackInitialFrames).isGreaterThan(3) + + // we verify that the value settled at 2 + assertThat(previousValue).isEqualTo(1.5) + } + + companion object { + private const val FRAME_LEN_NANOS: Long = 1000000000L / 60L + private const val INITIAL_FRAME_TIME_NANOS: Long = 14599233201256L /* random */ + } +} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/BaseJavaModuleTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/BaseJavaModuleTest.java deleted file mode 100644 index 76a75bb3d67ea8..00000000000000 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/BaseJavaModuleTest.java +++ /dev/null @@ -1,131 +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. - */ - -package com.facebook.react.bridge; - -import static org.mockito.Mockito.when; - -import com.facebook.react.turbomodule.core.interfaces.TurboModule; -import com.facebook.testutils.shadows.ShadowSoLoader; -import java.util.List; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; - -/** Tests for {@link BaseJavaModule} and {@link JavaModuleWrapper} */ -@Config( - shadows = { - ShadowSoLoader.class, - }) -@RunWith(RobolectricTestRunner.class) -public class BaseJavaModuleTest { - private List mMethods; - private JavaModuleWrapper mModuleWrapper; - - private List mGeneratedMethods; - private JavaModuleWrapper mGeneratedModuleWrapper; - - private ReadableNativeArray mArguments; - - @Before - public void setup() { - ModuleHolder moduleHolder = new ModuleHolder(new MethodsModule()); - mModuleWrapper = new JavaModuleWrapper(null, moduleHolder); - mMethods = mModuleWrapper.getMethodDescriptors(); - - ModuleHolder generatedModuleHolder = new ModuleHolder(new GeneratedMethodsModule()); - mGeneratedModuleWrapper = new JavaModuleWrapper(null, generatedModuleHolder); - mGeneratedMethods = mGeneratedModuleWrapper.getMethodDescriptors(); - - mArguments = Mockito.mock(ReadableNativeArray.class); - } - - private int findMethod(String mname, List methods) { - int posn = -1; - for (int i = 0; i < methods.size(); i++) { - JavaModuleWrapper.MethodDescriptor md = methods.get(i); - if (md.name == mname) { - posn = i; - break; - } - } - return posn; - } - - @Test(expected = NativeArgumentsParseException.class) - public void testCallMethodWithoutEnoughArgs() throws Exception { - int methodId = findMethod("regularMethod", mMethods); - when(mArguments.size()).thenReturn(1); - mModuleWrapper.invoke(methodId, mArguments); - } - - @Test - public void testCallMethodWithEnoughArgs() { - int methodId = findMethod("regularMethod", mMethods); - when(mArguments.size()).thenReturn(2); - mModuleWrapper.invoke(methodId, mArguments); - } - - @Test - public void testCallAsyncMethodWithEnoughArgs() { - // Promise block evaluates to 2 args needing to be passed from JS - int methodId = findMethod("asyncMethod", mMethods); - when(mArguments.size()).thenReturn(3); - mModuleWrapper.invoke(methodId, mArguments); - } - - @Test - public void testCallSyncMethod() { - int methodId = findMethod("syncMethod", mMethods); - when(mArguments.size()).thenReturn(2); - mModuleWrapper.invoke(methodId, mArguments); - } - - @Test - public void testCallGeneratedMethod() { - int methodId = findMethod("generatedMethod", mGeneratedMethods); - when(mArguments.size()).thenReturn(2); - mGeneratedModuleWrapper.invoke(methodId, mArguments); - } - - private static class MethodsModule extends BaseJavaModule { - @Override - public String getName() { - return "Methods"; - } - - @ReactMethod - public void regularMethod(String a, int b) {} - - @ReactMethod - public void asyncMethod(int a, Promise p) {} - - @ReactMethod(isBlockingSynchronousMethod = true) - public int syncMethod(int a, int b) { - return a + b; - } - } - - private abstract class NativeTestGeneratedModuleSpec extends BaseJavaModule - implements TurboModule { - @ReactMethod - public abstract void generatedMethod(String a, int b); - } - - private class GeneratedMethodsModule extends NativeTestGeneratedModuleSpec { - @Override - public String getName() { - return "GeneratedMethods"; - } - - @Override - public void generatedMethod(String a, int b) {} - } -} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/BaseJavaModuleTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/BaseJavaModuleTest.kt new file mode 100644 index 00000000000000..ac5e7892440cb0 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/BaseJavaModuleTest.kt @@ -0,0 +1,100 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.bridge + +import com.facebook.react.turbomodule.core.interfaces.TurboModule +import com.facebook.testutils.shadows.ShadowSoLoader +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock +import org.mockito.Mockito.`when` as whenever +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** Tests for [BaseJavaModule] and [JavaModuleWrapper] */ +@Config(shadows = [ShadowSoLoader::class]) +@RunWith(RobolectricTestRunner::class) +class BaseJavaModuleTest { + private lateinit var methods: List + private lateinit var moduleWrapper: JavaModuleWrapper + private lateinit var generatedMethods: List + private lateinit var generatedModuleWrapper: JavaModuleWrapper + private lateinit var arguments: ReadableNativeArray + + @Before + fun setup() { + val moduleHolder = ModuleHolder(MethodsModule()) + moduleWrapper = JavaModuleWrapper(null, moduleHolder) + methods = moduleWrapper.methodDescriptors + val generatedModuleHolder = ModuleHolder(GeneratedMethodsModule()) + generatedModuleWrapper = JavaModuleWrapper(null, generatedModuleHolder) + generatedMethods = generatedModuleWrapper.methodDescriptors + arguments = mock(ReadableNativeArray::class.java) + } + + private fun findMethod(mname: String, methods: List): Int = + methods.indexOfFirst({ it.name === mname }) + + @Test(expected = NativeArgumentsParseException::class) + fun testCallMethodWithoutEnoughArgs() { + val methodId = findMethod("regularMethod", methods) + whenever(arguments.size()).thenReturn(1) + moduleWrapper.invoke(methodId, arguments) + } + + @Test + fun testCallMethodWithEnoughArgs() { + val methodId = findMethod("regularMethod", methods) + whenever(arguments.size()).thenReturn(2) + moduleWrapper.invoke(methodId, arguments) + } + + @Test + fun testCallAsyncMethodWithEnoughArgs() { + // Promise block evaluates to 2 args needing to be passed from JS + val methodId = findMethod("asyncMethod", methods) + whenever(arguments.size()).thenReturn(3) + moduleWrapper.invoke(methodId, arguments) + } + + @Test + fun testCallSyncMethod() { + val methodId = findMethod("syncMethod", methods) + whenever(arguments.size()).thenReturn(2) + moduleWrapper.invoke(methodId, arguments) + } + + @Test + fun testCallGeneratedMethod() { + val methodId = findMethod("generatedMethod", generatedMethods) + whenever(arguments.size()).thenReturn(2) + generatedModuleWrapper.invoke(methodId, arguments) + } + + @Suppress("UNUSED_PARAMETER") + private class MethodsModule : BaseJavaModule() { + override fun getName(): String = "Methods" + + @ReactMethod fun regularMethod(a: String?, b: Int?) {} + + @ReactMethod fun asyncMethod(a: Int, p: Promise) {} + + @ReactMethod(isBlockingSynchronousMethod = true) fun syncMethod(a: Int, b: Int): Int = a + b + } + + private abstract inner class NativeTestGeneratedModuleSpec : BaseJavaModule(), TurboModule { + @ReactMethod abstract fun generatedMethod(a: String?, b: Int?) + } + + private inner class GeneratedMethodsModule : NativeTestGeneratedModuleSpec() { + override fun getName(): String = "GeneratedMethods" + + override fun generatedMethod(a: String?, b: Int?) {} + } +} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/FallbackJSBundleLoaderTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/FallbackJSBundleLoaderTest.kt index 62c0b4d46ba333..a43a6da6363257 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/FallbackJSBundleLoaderTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/FallbackJSBundleLoaderTest.kt @@ -134,6 +134,7 @@ class FallbackJSBundleLoaderTest { private fun recoverableMsg(errMsg: String): String = FallbackJSBundleLoader.RECOVERABLE + errMsg + @Suppress("UNUSED_PARAMETER") private fun recoverableLoader(url: String, errMsg: String): JSBundleLoader { val loader = mock(JSBundleLoader::class.java) whenever(loader.loadScript(null)) @@ -144,6 +145,7 @@ class FallbackJSBundleLoaderTest { private fun fatalMsg(errMsg: String): String = UNRECOVERABLE + errMsg + @Suppress("UNUSED_PARAMETER") private fun fatalLoader(url: String, errMsg: String): JSBundleLoader { val loader = mock(JSBundleLoader::class.java) whenever(loader.loadScript(null)).thenThrow(RuntimeException(UNRECOVERABLE + errMsg)) diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/JavaScriptModuleRegistryTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/JavaScriptModuleRegistryTest.java deleted file mode 100644 index 79abb47f6ac9e1..00000000000000 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/JavaScriptModuleRegistryTest.java +++ /dev/null @@ -1,35 +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. - */ - -package com.facebook.react.bridge; - -import org.junit.Assert; -import org.junit.Test; - -/** Tests for {@link JavaScriptModuleRegistry} */ -public class JavaScriptModuleRegistryTest { - - private interface TestJavaScriptModule extends JavaScriptModule { - void doSomething(); - } - - private interface OuterClass$NestedInnerClass extends JavaScriptModule { - void doSomething(); - } - - @Test - public void testGetJSModuleName() { - String name = JavaScriptModuleRegistry.getJSModuleName(TestJavaScriptModule.class); - Assert.assertEquals("TestJavaScriptModule", name); - } - - @Test - public void testGetJSModuleName_stripOuterClass() { - String name = JavaScriptModuleRegistry.getJSModuleName(OuterClass$NestedInnerClass.class); - Assert.assertEquals("NestedInnerClass", name); - } -} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/JavaScriptModuleRegistryTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/JavaScriptModuleRegistryTest.kt new file mode 100644 index 00000000000000..48f4dccdff3b00 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/JavaScriptModuleRegistryTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.bridge + +import org.junit.Assert +import org.junit.Test + +/** Tests for [JavaScriptModuleRegistry] */ +class JavaScriptModuleRegistryTest { + private interface TestJavaScriptModule : JavaScriptModule { + fun doSomething() + } + + private interface `OuterClass$NestedInnerClass` : JavaScriptModule { + fun doSomething() + } + + @Test + fun testGetJSModuleName() { + val name = JavaScriptModuleRegistry.getJSModuleName(TestJavaScriptModule::class.java) + Assert.assertEquals("TestJavaScriptModule", name) + } + + @Test + fun testGetJSModuleName_stripOuterClass() { + val name = JavaScriptModuleRegistry.getJSModuleName(`OuterClass$NestedInnerClass`::class.java) + Assert.assertEquals("NestedInnerClass", name) + } +} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/ReactTestHelper.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/ReactTestHelper.kt index 18a49fb04a003c..ac4353df2c4b7e 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/ReactTestHelper.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/ReactTestHelper.kt @@ -24,7 +24,7 @@ object ReactTestHelper { */ @JvmStatic fun createCatalystContextForTest(): ReactApplicationContext = - ReactApplicationContext(RuntimeEnvironment.application).apply { + ReactApplicationContext(RuntimeEnvironment.getApplication()).apply { initializeWithInstance(createMockCatalystInstance()) } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/FakeRCTEventEmitter.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/FakeRCTEventEmitter.kt index 39872e4b238877..bf3a756faac824 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/FakeRCTEventEmitter.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/FakeRCTEventEmitter.kt @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +@file:Suppress("DEPRECATION") // Suppressing as we want to fake a RCTEventEmitter here package com.facebook.react.bridge.interop import com.facebook.react.bridge.WritableArray diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/InteropModuleRegistryTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/InteropModuleRegistryTest.kt index df20bfbead1057..18f35a332ef8c4 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/InteropModuleRegistryTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/InteropModuleRegistryTest.kt @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +@file:Suppress( + "DEPRECATION") // Suppressing as we want to test specifically with RCTEventEmitter here package com.facebook.react.bridge.interop import com.facebook.react.config.ReactFeatureFlags diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactHostDelegateTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactHostDelegateTest.kt index 4bc2ed9c6b2b5e..fc89a8fc46efe0 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactHostDelegateTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactHostDelegateTest.kt @@ -7,11 +7,11 @@ package com.facebook.react.bridgeless +import com.facebook.react.ReactPackageTurboModuleManagerDelegate import com.facebook.react.bridge.JSBundleLoader import com.facebook.react.bridgeless.hermes.HermesInstance import com.facebook.react.common.annotations.UnstableReactNativeAPI import com.facebook.react.defaults.DefaultReactHostDelegate -import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate import com.facebook.testutils.shadows.ShadowSoLoader import org.assertj.core.api.Assertions.assertThat import org.junit.Test @@ -32,8 +32,8 @@ class ReactHostDelegateTest { @Test fun testDefaultReactHostDelegateCreation() { val jsBundleLoader: JSBundleLoader = Mockito.mock(JSBundleLoader::class.java) - val turboModuleManagerDelegateMock: TurboModuleManagerDelegate = - Mockito.mock(TurboModuleManagerDelegate::class.java) + val turboModuleManagerDelegateBuilderMock: ReactPackageTurboModuleManagerDelegate.Builder = + Mockito.mock(ReactPackageTurboModuleManagerDelegate.Builder::class.java) val hermesInstance: JSEngineInstance = Mockito.mock(HermesInstance::class.java) val jsMainModulePathMocked = "mockedJSMainModulePath" val delegate = @@ -41,7 +41,7 @@ class ReactHostDelegateTest { jSMainModulePath = jsMainModulePathMocked, jSBundleLoader = jsBundleLoader, jSEngineInstance = hermesInstance, - turboModuleManagerDelegate = { turboModuleManagerDelegateMock }) + turboModuleManagerDelegateBuilder = turboModuleManagerDelegateBuilderMock) assertThat(delegate.jSMainModulePath).isEqualTo(jsMainModulePathMocked) } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactHostTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactHostTest.java index 21950e7c54c1ea..e56bae01bd1735 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactHostTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactHostTest.java @@ -7,6 +7,7 @@ package com.facebook.react.bridgeless; +import static android.os.Looper.getMainLooper; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; @@ -15,17 +16,23 @@ import static org.mockito.Mockito.verify; import static org.mockito.MockitoAnnotations.initMocks; import static org.powermock.api.mockito.PowerMockito.whenNew; +import static org.robolectric.Shadows.shadowOf; import android.app.Activity; import com.facebook.react.MemoryPressureRouter; import com.facebook.react.bridge.JSBundleLoader; import com.facebook.react.bridge.MemoryPressureListener; +import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.UIManager; +import com.facebook.react.bridgeless.internal.bolts.Task; import com.facebook.react.bridgeless.internal.bolts.TaskCompletionSource; +import com.facebook.react.common.LifecycleState; import com.facebook.react.devsupport.interfaces.PackagerStatusCallback; import com.facebook.react.fabric.ComponentFactory; import com.facebook.react.uimanager.events.BlackHoleEventDispatcher; import com.facebook.react.uimanager.events.EventDispatcher; +import com.facebook.testutils.shadows.ShadowSoLoader; +import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Ignore; import org.junit.Rule; @@ -38,8 +45,11 @@ import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.android.controller.ActivityController; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.LooperMode; /** Tests {@linkcom.facebook.react.bridgeless.ReactHost} */ +@Ignore("Ignore for now as these tests fail in OSS only") @SuppressStaticInitializationFor("com.facebook.react.fabric.ComponentFactory") @RunWith(RobolectricTestRunner.class) @PowerMockIgnore({ @@ -49,8 +59,9 @@ "androidx.*", "javax.net.ssl.*" }) +@Config(shadows = ShadowSoLoader.class) +@LooperMode(LooperMode.Mode.PAUSED) @PrepareForTest({ReactHost.class, ComponentFactory.class}) -@Ignore("Ignore for now as these tests fail in OSS only") public class ReactHostTest { private ReactHostDelegate mReactHostDelegate; @@ -61,6 +72,7 @@ public class ReactHostTest { private ReactHost mReactHost; private ActivityController mActivityController; private ComponentFactory mComponentFactory; + private BridgelessReactContext mBridgelessReactContext; @Rule public PowerMockRule rule = new PowerMockRule(); @@ -76,8 +88,10 @@ public void setUp() throws Exception { mDevSupportManager = mock(BridgelessDevSupportManager.class); mJSBundleLoader = mock(JSBundleLoader.class); mComponentFactory = mock(ComponentFactory.class); + mBridgelessReactContext = mock(BridgelessReactContext.class); whenNew(ReactInstance.class).withAnyArguments().thenReturn(mReactInstance); + whenNew(BridgelessReactContext.class).withAnyArguments().thenReturn(mBridgelessReactContext); whenNew(MemoryPressureRouter.class).withAnyArguments().thenReturn(mMemoryPressureRouter); whenNew(BridgelessDevSupportManager.class).withAnyArguments().thenReturn(mDevSupportManager); @@ -91,6 +105,10 @@ public void setUp() throws Exception { false, null, false); + + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + taskCompletionSource.setResult(true); + whenNew(TaskCompletionSource.class).withAnyArguments().thenReturn(taskCompletionSource); } @Test @@ -105,24 +123,77 @@ public void getUIManager_returnsNullIfNoInstance() { assertThat(uiManager).isNull(); } - @Ignore("FIXME") + @Test public void testGetDevSupportManager() { assertThat(mReactHost.getDevSupportManager()).isEqualTo(mDevSupportManager); } - @Ignore("waitForCompletion is locking the test thread making the entire venice tests to timeout") - public void testPreload() throws Exception { - TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); - taskCompletionSource.setResult(true); - whenNew(TaskCompletionSource.class).withAnyArguments().thenReturn(taskCompletionSource); + @Test + public void testStart() throws Exception { doNothing().when(mDevSupportManager).isPackagerRunning(any(PackagerStatusCallback.class)); - assertThat(mReactHost.isInstanceInitialized()).isFalse(); - mReactHost.start().waitForCompletion(); + waitForTaskUIThread(mReactHost.start()); assertThat(mReactHost.isInstanceInitialized()).isTrue(); assertThat(mReactHost.getCurrentReactContext()).isNotNull(); verify(mMemoryPressureRouter).addMemoryPressureListener((MemoryPressureListener) any()); } + + private void startReactHost() throws Exception { + waitForTaskUIThread(mReactHost.start()); + } + + @Test + public void testDestroy() throws Exception { + startReactHost(); + + waitForTaskUIThread(mReactHost.destroy("Destroying from testing infra", null)); + assertThat(mReactHost.isInstanceInitialized()).isFalse(); + assertThat(mReactHost.getCurrentReactContext()).isNull(); + } + + @Test + public void testReload() throws Exception { + startReactHost(); + + ReactContext oldReactContext = mReactHost.getCurrentReactContext(); + BridgelessReactContext newReactContext = mock(BridgelessReactContext.class); + assertThat(newReactContext).isNotEqualTo(oldReactContext); + whenNew(BridgelessReactContext.class).withAnyArguments().thenReturn(newReactContext); + + waitForTaskUIThread(mReactHost.reload("Reload from testing infra")); + + assertThat(mReactHost.isInstanceInitialized()).isTrue(); + assertThat(mReactHost.getCurrentReactContext()).isNotNull(); + assertThat(mReactHost.getCurrentReactContext()).isEqualTo(newReactContext); + assertThat(mReactHost.getCurrentReactContext()).isNotEqualTo(oldReactContext); + } + + @Test + public void testLifecycleStateChanges() throws Exception { + startReactHost(); + + assertThat(mReactHost.getLifecycleState()).isEqualTo(LifecycleState.BEFORE_CREATE); + mReactHost.onHostResume(mActivityController.get()); + assertThat(mReactHost.getLifecycleState()).isEqualTo(LifecycleState.RESUMED); + mReactHost.onHostPause(mActivityController.get()); + assertThat(mReactHost.getLifecycleState()).isEqualTo(LifecycleState.BEFORE_RESUME); + mReactHost.onHostDestroy(mActivityController.get()); + assertThat(mReactHost.getLifecycleState()).isEqualTo(LifecycleState.BEFORE_CREATE); + } + + private static void waitForTaskUIThread(Task task) throws InterruptedException { + boolean isTaskCompleted = false; + while (!isTaskCompleted) { + if (!task.waitForCompletion(4, TimeUnit.MILLISECONDS)) { + shadowOf(getMainLooper()).idle(); + } else { + if (task.isCancelled() || task.isFaulted()) { + throw new RuntimeException("Task was cancelled or faulted. Error: " + task.getError()); + } + isTaskCompleted = true; + } + } + } } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactSurfaceTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactSurfaceTest.java index aeba7ffe654698..9d66f09abe62fa 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactSurfaceTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridgeless/ReactSurfaceTest.java @@ -20,7 +20,7 @@ import android.view.View; import com.facebook.react.bridge.NativeMap; import com.facebook.react.bridgeless.internal.bolts.Task; -import com.facebook.react.fabric.SurfaceHandler; +import com.facebook.react.fabric.interfaces.SurfaceHandler; import com.facebook.react.uimanager.events.EventDispatcher; import java.util.concurrent.Callable; import org.junit.Before; @@ -77,7 +77,7 @@ public void testAttachThrowExeption() { @Test public void testPrerender() throws InterruptedException { mReactSurface.attach(mReactHost); - Task task = mReactSurface.prerender(); + Task task = (Task) mReactSurface.prerender(); task.waitForCompletion(); verify(mReactHost).prerenderSurface(mReactSurface); @@ -88,7 +88,7 @@ public void testPrerender() throws InterruptedException { public void testStart() throws InterruptedException { mReactSurface.attach(mReactHost); assertThat(mReactHost.isSurfaceAttached(mReactSurface)).isFalse(); - Task task = mReactSurface.start(); + Task task = (Task) mReactSurface.start(); task.waitForCompletion(); verify(mReactHost).startSurface(mReactSurface); @@ -99,10 +99,10 @@ public void testStart() throws InterruptedException { public void testStop() throws InterruptedException { mReactSurface.attach(mReactHost); - Task task = mReactSurface.start(); + Task task = (Task) mReactSurface.start(); task.waitForCompletion(); - task = mReactSurface.stop(); + task = (Task) mReactSurface.stop(); task.waitForCompletion(); verify(mReactHost).stopSurface(mReactSurface); @@ -147,11 +147,13 @@ public void testStartStopHandlerCalls() throws InterruptedException { assertThat(mReactSurface.isRunning()).isFalse(); - mReactSurface.start().waitForCompletion(); + Task task = (Task) mReactSurface.start(); + task.waitForCompletion(); assertThat(mReactSurface.isRunning()).isTrue(); - mReactSurface.stop().waitForCompletion(); + task = (Task) mReactSurface.stop(); + task.waitForCompletion(); assertThat(mReactSurface.isRunning()).isFalse(); } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/FabricUIManagerTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/FabricUIManagerTest.kt new file mode 100644 index 00000000000000..f8827eb7225547 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/FabricUIManagerTest.kt @@ -0,0 +1,57 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.fabric + +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.uimanager.ViewManagerRegistry +import com.facebook.react.uimanager.events.BatchEventDispatchedListener +import com.facebook.testutils.fakes.FakeBatchEventDispatchedListener +import com.facebook.testutils.shadows.ShadowSoLoader +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(shadows = [ShadowSoLoader::class]) +class FabricUIManagerTest { + + private lateinit var reactContext: ReactApplicationContext + private lateinit var viewManagerRegistry: ViewManagerRegistry + private lateinit var batchEventDispatchedListener: BatchEventDispatchedListener + private lateinit var underTest: FabricUIManager + + @Before + fun setup() { + reactContext = ReactApplicationContext(RuntimeEnvironment.getApplication()) + viewManagerRegistry = ViewManagerRegistry(emptyList()) + batchEventDispatchedListener = FakeBatchEventDispatchedListener() + underTest = FabricUIManager(reactContext, viewManagerRegistry, batchEventDispatchedListener) + } + + @Test + fun createDispatchCommandMountItemForInterop_withValidString_returnsStringEvent() { + val command = underTest.createDispatchCommandMountItemForInterop(11, 1, "anEvent", null) + + // DispatchStringCommandMountItem is package private so we can `as` check it. + val className = command::class.java.name.substringAfterLast(".") + assertEquals("DispatchStringCommandMountItem", className) + } + + @Test + fun createDispatchCommandMountItemForInterop_withValidInt_returnsIntEvent() { + val command = underTest.createDispatchCommandMountItemForInterop(11, 1, "42", null) + + // DispatchIntCommandMountItem is package private so we can `as` check it. + val className = command::class.java.name.substringAfterLast(".") + assertEquals("DispatchIntCommandMountItem", className) + } +} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/events/TouchEventDispatchTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/events/TouchEventDispatchTest.kt index 950ddd5ee40d03..87ad9d665062f1 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/events/TouchEventDispatchTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/events/TouchEventDispatchTest.kt @@ -9,6 +9,8 @@ package com.facebook.react.fabric.events import android.util.DisplayMetrics import android.view.MotionEvent +import android.view.MotionEvent.PointerCoords +import android.view.MotionEvent.PointerProperties import com.facebook.react.bridge.* import com.facebook.react.fabric.FabricUIManager import com.facebook.react.uimanager.DisplayMetricsHolder @@ -511,22 +513,23 @@ class TouchEventDispatchTest { action: Int, pointerId: Int, pointerIds: IntArray, - pointerCoords: Array + pointerCoords: Array ): TouchEvent { touchEventCoalescingKeyHelper.addCoalescingKey(gestureTime.toLong()) - val action = action or (pointerId shl MotionEvent.ACTION_POINTER_INDEX_SHIFT) + val shiftedAction = action or (pointerId shl MotionEvent.ACTION_POINTER_INDEX_SHIFT) return TouchEvent.obtain( SURFACE_ID, TARGET_VIEW_ID, - getType(action), + getType(shiftedAction), MotionEvent.obtain( gestureTime.toLong(), gestureTime.toLong(), - action, + shiftedAction, pointerIds.size, - pointerIds, + pointerIds.toPointerProperties(), pointerCoords, 0, + 0, 0f, 0f, 0, @@ -545,8 +548,7 @@ class TouchEventDispatchTest { private const val GESTURE_START_TIME = 1 private fun getType(action: Int): TouchEventType { - val action = action and MotionEvent.ACTION_POINTER_INDEX_MASK.inv() - when (action) { + when (action and MotionEvent.ACTION_POINTER_INDEX_MASK.inv()) { MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN -> return TouchEventType.START MotionEvent.ACTION_UP, @@ -591,10 +593,13 @@ class TouchEventDispatchTest { putDouble("timestamp", time.toDouble()) } - private fun pointerCoords(x: Float, y: Float): MotionEvent.PointerCoords = - MotionEvent.PointerCoords().apply { + private fun pointerCoords(x: Float, y: Float): PointerCoords = + PointerCoords().apply { this.x = x this.y = y } } } + +private fun IntArray.toPointerProperties(): Array = + this.map { PointerProperties().apply { id = it } }.toTypedArray() diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/FakeEventDispatcher.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/FakeEventDispatcher.kt index af3af4a4b52c77..3c444a5d124756 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/FakeEventDispatcher.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/FakeEventDispatcher.kt @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +@file:Suppress("DEPRECATION") // Suppressing as RCTEventEmitter is part of the API package com.facebook.react.fabric.interop import com.facebook.react.uimanager.events.BatchEventDispatchedListener diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/InteropEventEmitterTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/InteropEventEmitterTest.java deleted file mode 100644 index 5e86e029ef02b6..00000000000000 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/InteropEventEmitterTest.java +++ /dev/null @@ -1,67 +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. - */ - -package com.facebook.react.fabric.interop; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.facebook.react.bridge.JavaOnlyMap; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContext; -import com.facebook.react.bridge.WritableMap; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; - -@RunWith(RobolectricTestRunner.class) -public class InteropEventEmitterTest { - - ReactContext mReactContext; - FakeEventDispatcher mEventDispatcher; - - @Before - public void setup() { - mReactContext = new ReactApplicationContext(RuntimeEnvironment.application); - mEventDispatcher = new FakeEventDispatcher(); - } - - @Test - public void receiveEvent_dispatchesCorrectly() { - InteropEventEmitter eventEmitter = new InteropEventEmitter(mReactContext); - eventEmitter.overrideEventDispatcher(mEventDispatcher); - - eventEmitter.receiveEvent(42, "onTest", null); - - assertEquals(1, mEventDispatcher.getRecordedDispatchedEvents().size()); - assertEquals("onTest", mEventDispatcher.getRecordedDispatchedEvents().get(0).getEventName()); - assertEquals( - InteropEvent.class, mEventDispatcher.getRecordedDispatchedEvents().get(0).getClass()); - } - - @Test - public void receiveEvent_dataIsPreserved() { - InteropEventEmitter eventEmitter = new InteropEventEmitter(mReactContext); - eventEmitter.overrideEventDispatcher(mEventDispatcher); - WritableMap eventData = JavaOnlyMap.of("color", "indigo"); - - eventEmitter.receiveEvent(42, "onTest", eventData); - - InteropEvent event = (InteropEvent) mEventDispatcher.getRecordedDispatchedEvents().get(0); - WritableMap dispatchedEventData = event.getEventData(); - assertNotNull(dispatchedEventData); - assertEquals("indigo", dispatchedEventData.getString("color")); - } - - @Test(expected = UnsupportedOperationException.class) - public void receiveTouches_isNotSupported() { - InteropEventEmitter eventEmitter = new InteropEventEmitter(mReactContext); - eventEmitter.receiveTouches("a touch", null, null); - } -} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/InteropEventEmitterTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/InteropEventEmitterTest.kt new file mode 100644 index 00000000000000..7922e5301d6c84 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/interop/InteropEventEmitterTest.kt @@ -0,0 +1,63 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.fabric.interop + +import com.facebook.react.bridge.JavaOnlyMap +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReactContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment + +@RunWith(RobolectricTestRunner::class) +class InteropEventEmitterTest { + lateinit var reactContext: ReactContext + lateinit var eventDispatcher: FakeEventDispatcher + + @Before + fun setup() { + reactContext = ReactApplicationContext(RuntimeEnvironment.getApplication()) + eventDispatcher = FakeEventDispatcher() + } + + @Test + fun receiveEvent_dispatchesCorrectly() { + val eventEmitter = InteropEventEmitter(reactContext) + eventEmitter.overrideEventDispatcher(eventDispatcher) + + eventEmitter.receiveEvent(42, "onTest", null) + + assertEquals(1, eventDispatcher.getRecordedDispatchedEvents().size) + assertEquals("onTest", eventDispatcher.getRecordedDispatchedEvents().get(0).getEventName()) + assertEquals(InteropEvent::class, eventDispatcher.getRecordedDispatchedEvents().get(0)::class) + } + + @Test + fun receiveEvent_dataIsPreserved() { + val eventEmitter = InteropEventEmitter(reactContext) + eventEmitter.overrideEventDispatcher(eventDispatcher) + val eventData = JavaOnlyMap.of("color", "indigo") + + eventEmitter.receiveEvent(42, "onTest", eventData) + + val event = eventDispatcher.getRecordedDispatchedEvents().get(0) as InteropEvent + val dispatchedEventData = event.getEventData() + assertNotNull(dispatchedEventData) + assertEquals("indigo", dispatchedEventData!!.getString("color")) + } + + @Test(expected = java.lang.UnsupportedOperationException::class) + fun receiveTouches_isNotSupported() { + val eventEmitter = InteropEventEmitter(reactContext) + eventEmitter.receiveTouches("a touch", null, null) + } +} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/clipboard/ClipboardModuleTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/clipboard/ClipboardModuleTest.kt index e76120e912596d..3f58b66aff08a5 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/clipboard/ClipboardModuleTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/clipboard/ClipboardModuleTest.kt @@ -28,9 +28,9 @@ class ClipboardModuleTest { @Before fun setUp() { - clipboardModule = ClipboardModule(ReactApplicationContext(RuntimeEnvironment.application)) + clipboardModule = ClipboardModule(ReactApplicationContext(RuntimeEnvironment.getApplication())) clipboardManager = - RuntimeEnvironment.application.getSystemService(Context.CLIPBOARD_SERVICE) + RuntimeEnvironment.getApplication().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt index 252a8a26478d4e..c89f98d9ceaa3f 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt @@ -47,7 +47,7 @@ class DeviceInfoModuleTest : TestCase() { public override fun setUp() { initTestData() PowerMockito.mockStatic(DisplayMetricsHolder::class.java) - reactContext = spy(ReactApplicationContext(RuntimeEnvironment.application)) + reactContext = spy(ReactApplicationContext(RuntimeEnvironment.getApplication())) val catalystInstanceMock = ReactTestHelper.createMockCatalystInstance() reactContext.initializeWithInstance(catalystInstanceMock) deviceInfoModule = DeviceInfoModule(reactContext) diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ReactCookieJarContainerTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ReactCookieJarContainerTest.java deleted file mode 100644 index 3acb9a0af8dc98..00000000000000 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ReactCookieJarContainerTest.java +++ /dev/null @@ -1,71 +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. - */ - -package com.facebook.react.modules.network; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.ArrayList; -import java.util.List; -import okhttp3.Cookie; -import okhttp3.CookieJar; -import okhttp3.HttpUrl; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.robolectric.RobolectricTestRunner; - -/** Tests for {@link NetworkingModule}. */ -@PrepareForTest({ReactCookieJarContainer.class}) -@RunWith(RobolectricTestRunner.class) -@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "androidx.*", "android.*"}) -public class ReactCookieJarContainerTest { - - @Test - public void testMissingJar() throws Exception { - ReactCookieJarContainer jarContainer = mock(ReactCookieJarContainer.class); - assertThat(jarContainer.loadForRequest(HttpUrl.parse("http://example.com")).size()) - .isEqualTo(0); - } - - @Test - public void testEmptyCookies() throws Exception { - ReactCookieJarContainer jarContainer = mock(ReactCookieJarContainer.class); - List cookies = new ArrayList<>(); - when(jarContainer.loadForRequest(any(HttpUrl.class))).thenReturn(cookies); - assertThat(jarContainer.loadForRequest(HttpUrl.parse("http://example.com")).size()) - .isEqualTo(0); - } - - @Test - public void testValidCookies() throws Exception { - ReactCookieJarContainer jarContainer = new ReactCookieJarContainer(); - CookieJar cookieJar = mock(CookieJar.class); - jarContainer.setCookieJar(cookieJar); - List cookies = new ArrayList<>(); - cookies.add(new Cookie.Builder().name("valid").value("valid value").domain("domain").build()); - when(cookieJar.loadForRequest(any(HttpUrl.class))).thenReturn(cookies); - assertThat(jarContainer.loadForRequest(HttpUrl.parse("http://example.com")).size()) - .isEqualTo(1); - } - - @Test - public void testInvalidCookies() throws Exception { - ReactCookieJarContainer jarContainer = new ReactCookieJarContainer(); - CookieJar cookieJar = mock(CookieJar.class); - jarContainer.setCookieJar(cookieJar); - List cookies = new ArrayList<>(); - cookies.add(new Cookie.Builder().name("valid").value("înválíd välūė").domain("domain").build()); - when(cookieJar.loadForRequest(any(HttpUrl.class))).thenReturn(cookies); - assertThat(jarContainer.loadForRequest(HttpUrl.parse("http://example.com")).size()) - .isEqualTo(0); - } -} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ReactCookieJarContainerTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ReactCookieJarContainerTest.kt new file mode 100644 index 00000000000000..15e9537ea59200 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ReactCookieJarContainerTest.kt @@ -0,0 +1,65 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.modules.network + +import okhttp3.Cookie +import okhttp3.CookieJar +import okhttp3.HttpUrl +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.any +import org.mockito.Mockito.mock +import org.mockito.Mockito.`when` as whenever +import org.powermock.core.classloader.annotations.PowerMockIgnore +import org.powermock.core.classloader.annotations.PrepareForTest +import org.robolectric.RobolectricTestRunner + +/** Tests for {@link NetworkingModule}. */ +@RunWith(RobolectricTestRunner::class) +@PrepareForTest(ReactCookieJarContainer::class) +@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "androidx.*", "android.*") +class ReactCookieJarContainerTest { + private val httpUrl: HttpUrl = HttpUrl.Builder().host("example.com").scheme("http").build() + + @Test + fun testMissingJar() { + val jarContainer: ReactCookieJarContainer = mock(ReactCookieJarContainer::class.java) + assertThat(jarContainer.loadForRequest(httpUrl).size).isEqualTo(0) + } + + @Test + fun testEmptyCookies() { + val jarContainer: ReactCookieJarContainer = mock(ReactCookieJarContainer::class.java) + val cookies: List = emptyList() + whenever(jarContainer.loadForRequest(any(HttpUrl::class.java))).thenReturn(cookies) + assertThat(jarContainer.loadForRequest(httpUrl).size).isEqualTo(0) + } + + @Test + fun testValidCookies() { + val jarContainer = ReactCookieJarContainer() + val cookieJar: CookieJar = mock(CookieJar::class.java) + jarContainer.setCookieJar(cookieJar) + val cookies: MutableList = mutableListOf() + cookies.add(Cookie.Builder().name("valid").value("valid value").domain("domain").build()) + whenever(cookieJar.loadForRequest(httpUrl)).thenReturn(cookies) + assertThat(jarContainer.loadForRequest(httpUrl).size).isEqualTo(1) + } + + @Test + fun testInvalidCookies() { + val jarContainer = ReactCookieJarContainer() + val cookieJar: CookieJar = mock(CookieJar::class.java) + jarContainer.setCookieJar(cookieJar) + val cookies: MutableList = mutableListOf() + cookies.add(Cookie.Builder().name("valid").value("înválíd välūė").domain("domain").build()) + whenever(cookieJar.loadForRequest(httpUrl)).thenReturn(cookies) + assertThat(jarContainer.loadForRequest(httpUrl).size).isEqualTo(0) + } +} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/share/ShareModuleTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/share/ShareModuleTest.kt index d67eed712e83df..2327b6cc07d0fe 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/share/ShareModuleTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/share/ShareModuleTest.kt @@ -55,16 +55,16 @@ class ShareModuleTest { shareModule.share(content, dialogTitle, promise) - val chooserIntent = shadowOf(RuntimeEnvironment.application).nextStartedActivity + val chooserIntent = shadowOf(RuntimeEnvironment.getApplication()).nextStartedActivity assertNotNull("Dialog was not displayed", chooserIntent) assertEquals(Intent.ACTION_CHOOSER, chooserIntent.action) - assertEquals(dialogTitle, chooserIntent.extras?.get(Intent.EXTRA_TITLE)) + assertEquals(dialogTitle, chooserIntent.extras?.getString(Intent.EXTRA_TITLE)) - val contentIntent = chooserIntent.extras?.get(Intent.EXTRA_INTENT) as Intent? + val contentIntent = chooserIntent.extras?.getParcelable(Intent.EXTRA_INTENT, Intent::class.java) assertNotNull("Intent was not built correctly", contentIntent) assertEquals(Intent.ACTION_SEND, contentIntent?.action) - assertEquals(title, contentIntent?.extras?.get(Intent.EXTRA_SUBJECT)) - assertEquals(message, contentIntent?.extras?.get(Intent.EXTRA_TEXT)) + assertEquals(title, contentIntent?.extras?.getString(Intent.EXTRA_SUBJECT)) + assertEquals(message, contentIntent?.extras?.getString(Intent.EXTRA_TEXT)) assertEquals(1, promise.resolved) } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.java index 83e32f7287ab1f..35b367e50195e3 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.java @@ -46,7 +46,7 @@ public class BaseViewManagerTest { @Before public void setUp() { mViewManager = new ReactViewManager(); - mView = new ReactViewGroup(RuntimeEnvironment.application); + mView = new ReactViewGroup(RuntimeEnvironment.getApplication()); PowerMockito.mockStatic(Arguments.class); PowerMockito.when(Arguments.createMap()) .thenAnswer( diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/JSPointerDispatcherTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/JSPointerDispatcherTest.java new file mode 100644 index 00000000000000..1e2e256af6b7d9 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/JSPointerDispatcherTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.uimanager; + +import android.content.Context; +import android.graphics.Rect; +import android.os.SystemClock; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; +import com.facebook.react.uimanager.events.Event; +import com.facebook.react.uimanager.events.EventDispatcher; +import com.facebook.react.uimanager.events.PointerEventHelper; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatcher; +import org.mockito.Mockito; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class JSPointerDispatcherTest { + + private ViewGroup mRoot; + private JSPointerDispatcher mPointerDispatcher; + + class EventWithName implements ArgumentMatcher { + private String mEventName; + + public EventWithName(String eventName) { + mEventName = eventName; + } + + @Override + public boolean matches(Event argument) { + return argument.getEventName().equals(mEventName); + } + + @Override + public String toString() { + return "[event with name: " + mEventName + "]"; + } + } + + @Before + public void setupViewHierarchy() { + Context ctx = RuntimeEnvironment.getApplication(); + mRoot = new LinearLayout(ctx); + TextView childView = new TextView(ctx); + childView.append("Hello, world!"); + // need > 0 ID to consider it as a react view (see + // TouchTargetHelper::findTargetPathAndCoordinatesForTouch) + childView.setId(100); + mRoot.addView(childView); + // needed for test to ensure that child has dimensions + mRoot.measure(500, 500); + mRoot.layout(0, 0, 500, 500); + mPointerDispatcher = new JSPointerDispatcher(mRoot); + } + + private static MotionEvent createMotionEvent(int action, float x, float y) { + long downTime = SystemClock.uptimeMillis(); + long eventTime = downTime; + int metaState = 0; // no modifiers pressed + + return MotionEvent.obtain(downTime, eventTime, action, x, y, metaState); + } + + private Rect getChildViewRectInRootCoordinates(int childIndex) { + View child = mRoot.getChildAt(childIndex); + Rect outRect = new Rect(); + child.getDrawingRect(outRect); + + mRoot.offsetDescendantRectToMyCoords(child, outRect); + + return outRect; + } + + @Test + public void testPointerEnter() { + Rect childRect = getChildViewRectInRootCoordinates(0); + MotionEvent ev = + createMotionEvent(MotionEvent.ACTION_DOWN, childRect.centerX(), childRect.centerY()); + EventDispatcher mockDispatcher = Mockito.mock(EventDispatcher.class); + mPointerDispatcher.handleMotionEvent(ev, mockDispatcher, false); + Mockito.verify(mockDispatcher) + .dispatchEvent(Mockito.argThat(new EventWithName(PointerEventHelper.POINTER_DOWN))); + } +} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/ReactPropConstantsTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/ReactPropConstantsTest.java index 505127b691afed..121af024f0270a 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/ReactPropConstantsTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/ReactPropConstantsTest.java @@ -123,7 +123,7 @@ public void customIntGroupProp(View v, int index, Integer value) {} public void testNativePropsIncludeCorrectTypes() { List viewManagers = Arrays.asList(new ViewManagerUnderTest()); ReactApplicationContext reactContext = - new ReactApplicationContext(RuntimeEnvironment.application); + new ReactApplicationContext(RuntimeEnvironment.getApplication()); UIManagerModule uiManagerModule = new UIManagerModule(reactContext, viewManagers, 0); Map constants = (Map) valueAtPath(uiManagerModule.getConstants(), "SomeView", "NativeProps"); diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/SimpleViewPropertyTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/SimpleViewPropertyTest.java index c1ccc3c233064a..69badeea839e15 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/SimpleViewPropertyTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/SimpleViewPropertyTest.java @@ -66,7 +66,7 @@ public String getName() { @Before public void setup() { - mContext = new ReactApplicationContext(RuntimeEnvironment.application); + mContext = new ReactApplicationContext(RuntimeEnvironment.getApplication()); mCatalystInstanceMock = ReactTestHelper.createMockCatalystInstance(); mContext.initializeWithInstance(mCatalystInstanceMock); mThemedContext = new ThemedReactContext(mContext, mContext); diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.java index 0aa3e1c90cde92..07e788bb38d37a 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.java @@ -47,7 +47,7 @@ public class UIManagerModuleConstantsTest { @Before public void setUp() { - mReactContext = new ReactApplicationContext(RuntimeEnvironment.application); + mReactContext = new ReactApplicationContext(RuntimeEnvironment.getApplication()); } @Test diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleTest.java index 2408455eff1ddc..349cff3df87963 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleTest.java @@ -100,7 +100,7 @@ public Object answer(InvocationOnMock invocation) throws Throwable { any(ChoreographerCompat.FrameCallback.class)); mCatalystInstanceMock = ReactTestHelper.createMockCatalystInstance(); - mReactContext = new ReactApplicationContext(RuntimeEnvironment.application); + mReactContext = new ReactApplicationContext(RuntimeEnvironment.getApplication()); mReactContext.initializeWithInstance(mCatalystInstanceMock); UIManagerModule uiManagerModuleMock = mock(UIManagerModule.class); @@ -145,7 +145,7 @@ public void testHierarchyWithView() { UIManagerModule uiManager = getUIManagerModule(); ReactRootView rootView = - new ReactRootView(RuntimeEnvironment.application.getApplicationContext()); + new ReactRootView(RuntimeEnvironment.getApplication().getApplicationContext()); int rootTag = uiManager.addRootView(rootView); int viewTag = rootTag + 1; int subViewTag = viewTag + 1; @@ -491,7 +491,7 @@ public void testReplaceExistingNonRootView() { public void testRemoveSubviewsFromContainerWithID() { UIManagerModule uiManager = getUIManagerModule(); ReactRootView rootView = - new ReactRootView(RuntimeEnvironment.application.getApplicationContext()); + new ReactRootView(RuntimeEnvironment.getApplication().getApplicationContext()); int rootTag = uiManager.addRootView(rootView); final int containerTag = rootTag + 1; @@ -541,7 +541,7 @@ public void testRemoveSubviewsFromContainerWithID() { */ private ViewGroup createSimpleTextHierarchy(UIManagerModule uiManager, String text) { ReactRootView rootView = - new ReactRootView(RuntimeEnvironment.application.getApplicationContext()); + new ReactRootView(RuntimeEnvironment.getApplication().getApplicationContext()); int rootTag = uiManager.addRootView(rootView); int textTag = rootTag + 1; int rawTextTag = textTag + 1; diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java index 66a127c802c760..107c1d0d4538ad 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java @@ -85,7 +85,7 @@ public Object answer(InvocationOnMock invocation) { RNLog.w(null, ""); SoLoader.setInTestMode(); - mContext = new ReactApplicationContext(RuntimeEnvironment.application); + mContext = new ReactApplicationContext(RuntimeEnvironment.getApplication()); mCatalystInstanceMock = ReactTestHelper.createMockCatalystInstance(); mContext.initializeWithInstance(mCatalystInstanceMock); mThemeContext = new ThemedReactContext(mContext, mContext); diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/text/ReactTextTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/text/ReactTextTest.java index 5048afaefa8b53..9dc586f5c15a6d 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/text/ReactTextTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/text/ReactTextTest.java @@ -476,7 +476,7 @@ private static TSPAN getSingleSpan(TextView textView, Class spanC private ReactRootView createText( UIManagerModule uiManager, JavaOnlyMap textProps, JavaOnlyMap rawTextProps) { - ReactRootView rootView = new ReactRootView(RuntimeEnvironment.application); + ReactRootView rootView = new ReactRootView(RuntimeEnvironment.getApplication()); int rootTag = uiManager.addRootView(rootView); int textTag = rootTag + 1; int rawTextTag = textTag + 1; diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.java index 0d191fdef742fb..171d4f3532a706 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.java @@ -52,7 +52,7 @@ public class ReactTextInputPropertyTest { @Before public void setup() { - mContext = new ReactApplicationContext(RuntimeEnvironment.application); + mContext = new ReactApplicationContext(RuntimeEnvironment.getApplication()); mCatalystInstanceMock = ReactTestHelper.createMockCatalystInstance(); mContext.initializeWithInstance(mCatalystInstanceMock); mThemedContext = new ThemedReactContext(mContext, mContext); diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/TextInputTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/TextInputTest.java index 7df47a12f696a6..77a3f44669a3c2 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/TextInputTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/TextInputTest.java @@ -87,7 +87,7 @@ public Object answer(InvocationOnMock invocation) throws Throwable { public void testPropsApplied() { UIManagerModule uiManager = getUIManagerModule(); - ReactRootView rootView = new ReactRootView(RuntimeEnvironment.application); + ReactRootView rootView = new ReactRootView(RuntimeEnvironment.getApplication()); rootView.setLayoutParams(new ReactRootView.LayoutParams(100, 100)); int rootTag = uiManager.addRootView(rootView); int textInputTag = rootTag + 1; @@ -115,7 +115,7 @@ public void testPropsApplied() { public void testPropsUpdate() { UIManagerModule uiManager = getUIManagerModule(); - ReactRootView rootView = new ReactRootView(RuntimeEnvironment.application); + ReactRootView rootView = new ReactRootView(RuntimeEnvironment.getApplication()); rootView.setLayoutParams(new ReactRootView.LayoutParams(100, 100)); int rootTag = uiManager.addRootView(rootView); int textInputTag = rootTag + 1; diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/testutils/fakes/FakeBatchEventDispatchedListener.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/testutils/fakes/FakeBatchEventDispatchedListener.kt new file mode 100644 index 00000000000000..9f3dd1d78398a6 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/testutils/fakes/FakeBatchEventDispatchedListener.kt @@ -0,0 +1,17 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.testutils.fakes + +import com.facebook.react.uimanager.events.BatchEventDispatchedListener + +/** A fake [BatchEventDispatchedListener] for testing that does nothing. */ +class FakeBatchEventDispatchedListener : BatchEventDispatchedListener { + override fun onBatchEventDispatched() { + // do nothing + } +} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/testutils/shadows/ShadowSoLoader.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/testutils/shadows/ShadowSoLoader.kt index 56c06c4a93452c..0793a3524d340c 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/testutils/shadows/ShadowSoLoader.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/testutils/shadows/ShadowSoLoader.kt @@ -13,6 +13,7 @@ import kotlin.jvm.JvmStatic import org.robolectric.annotation.Implementation import org.robolectric.annotation.Implements +@Suppress("UNUSED_PARAMETER") @Implements(SoLoader::class) class ShadowSoLoader { companion object { diff --git a/packages/react-native/ReactCommon/React-Fabric.podspec b/packages/react-native/ReactCommon/React-Fabric.podspec index 1f5a9b955fd5ea..bf0ad1d2f390b7 100644 --- a/packages/react-native/ReactCommon/React-Fabric.podspec +++ b/packages/react-native/ReactCommon/React-Fabric.podspec @@ -33,10 +33,11 @@ Pod::Spec.new do |s| s.source = source s.source_files = "dummyFile.cpp" s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", - "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "DEFINES_MODULE" => "YES" } if ENV['USE_FRAMEWORKS'] - s.header_mappings_dir = './' + s.header_mappings_dir = File.absolute_path('./') s.module_name = 'React_Fabric' end @@ -54,6 +55,7 @@ Pod::Spec.new do |s| s.dependency "React-debug" s.dependency "React-utils" # s.dependency "React-runtimescheduler" + s.dependency "React-rendererdebug" s.dependency "React-cxxreact" if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" @@ -86,11 +88,6 @@ Pod::Spec.new do |s| ss.header_dir = "butter" end - s.subspec "config" do |ss| - ss.source_files = "react/config/*.{m,mm,cpp,h}" - ss.header_dir = "react/config" - end - s.subspec "core" do |ss| header_search_path = [ "\"$(PODS_ROOT)/boost\"", @@ -105,8 +102,9 @@ Pod::Spec.new do |s| "\"$(PODS_ROOT)/DoubleConversion\"", "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers\"", "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers/\"", "\"$(PODS_TARGET_SRCROOT)/react/renderer/textlayoutmanager/platform/ios\"", - "\"$(PODS_TARGET_SRCROOT)/react/renderer/components/textinput/iostextinput\"" + "\"$(PODS_TARGET_SRCROOT)/react/renderer/components/textinput/iostextinput\"", ] end @@ -232,14 +230,6 @@ Pod::Spec.new do |s| end end - s.subspec "debug_renderer" do |ss| - ss.dependency folly_dep_name, folly_version - ss.compiler_flags = folly_compiler_flags - ss.source_files = "react/renderer/debug/**/*.{m,mm,cpp,h}" - ss.exclude_files = "react/renderer/debug/tests" - ss.header_dir = "react/renderer/debug" - end - s.subspec "imagemanager" do |ss| ss.dependency folly_dep_name, folly_version ss.compiler_flags = folly_compiler_flags @@ -247,14 +237,6 @@ Pod::Spec.new do |s| ss.header_dir = "react/renderer/imagemanager" end - s.subspec "mapbuffer" do |ss| - ss.dependency folly_dep_name, folly_version - ss.compiler_flags = folly_compiler_flags - ss.source_files = "react/renderer/mapbuffer/**/*.{m,mm,cpp,h}" - ss.exclude_files = "react/renderer/mapbuffer/tests" - ss.header_dir = "react/renderer/mapbuffer" - end - s.subspec "mounting" do |ss| ss.dependency folly_dep_name, folly_version ss.compiler_flags = folly_compiler_flags diff --git a/packages/react-native/ReactCommon/React-FabricImage.podspec b/packages/react-native/ReactCommon/React-FabricImage.podspec index e5a4be90b50d90..385ecdf322adec 100644 --- a/packages/react-native/ReactCommon/React-FabricImage.podspec +++ b/packages/react-native/ReactCommon/React-FabricImage.podspec @@ -38,7 +38,8 @@ if ENV['USE_FRAMEWORKS'] "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/imagemanager/platform/ios\"", "\"$(PODS_TARGET_SRCROOT)/react/renderer/textlayoutmanager/platform/ios\"", "\"$(PODS_TARGET_SRCROOT)/react/renderer/components/textinput/iostextinput\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\"" + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers/\"" ] end @@ -77,6 +78,8 @@ Pod::Spec.new do |s| s.dependency "DoubleConversion" s.dependency "React-ImageManager" s.dependency "React-Fabric" + s.dependency "React-utils" + s.dependency "React-rendererdebug" s.dependency "Yoga" if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" diff --git a/packages/react-native/ReactCommon/React-Mapbuffer.podspec b/packages/react-native/ReactCommon/React-Mapbuffer.podspec new file mode 100644 index 00000000000000..2fdcd9ff7c3f7c --- /dev/null +++ b/packages/react-native/ReactCommon/React-Mapbuffer.podspec @@ -0,0 +1,43 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "React-Mapbuffer" + s.version = version + s.summary = "-" + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.source_files = "react/renderer/mapbuffer/*.{cpp,h}" + s.exclude_files = "react/renderer/mapbuffer/tests" + s.public_header_files = 'react/renderer/mapbuffer/*.h' + s.header_dir = "react/renderer/mapbuffer" + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\"", "USE_HEADERMAP" => "YES", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } + + if ENV['USE_FRAMEWORKS'] + s.header_mappings_dir = './' + s.module_name = 'React_Mapbuffer' + end + + s.dependency "glog" + s.dependency "React-debug" + +end diff --git a/packages/react-native/ReactCommon/React-nativeconfig.podspec b/packages/react-native/ReactCommon/React-nativeconfig.podspec new file mode 100644 index 00000000000000..d1dd415727bc28 --- /dev/null +++ b/packages/react-native/ReactCommon/React-nativeconfig.podspec @@ -0,0 +1,35 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "React-nativeconfig" + s.version = version + s.summary = "-" + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.source_files = "react/config/*.{m,mm,cpp,h}" + s.header_dir = "react/config" + + if ENV['USE_FRAMEWORKS'] + s.header_mappings_dir = './' + s.module_name = 'React_nativeconfig' + end +end diff --git a/packages/react-native/ReactCommon/React-rncore.podspec b/packages/react-native/ReactCommon/React-rncore.podspec index 62838bb5fe47cd..5465ed61a953e7 100644 --- a/packages/react-native/ReactCommon/React-rncore.podspec +++ b/packages/react-native/ReactCommon/React-rncore.podspec @@ -26,6 +26,17 @@ react_native_dependency_path = ENV['REACT_NATIVE_PATH'] # Relative path to react native from current podspec react_native_sources_path = '..' +header_search_paths = [ + "\"$(PODS_TARGET_SRCROOT)\"", + "\"$(PODS_TARGET_SRCROOT)/ReactCommon\"", +] + +if ENV["USE_FRAMEWORKS"] + header_search_paths = header_search_paths.concat([ + "\"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\"", + ]) +end + Pod::Spec.new do |s| s.name = "React-rncore" s.version = version @@ -37,6 +48,7 @@ Pod::Spec.new do |s| s.source = source s.source_files = "dummyFile.cpp" s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", + "HEADER_SEARCH_PATHS" => header_search_paths.join(' '), "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } diff --git a/packages/react-native/ReactCommon/ReactCommon.podspec b/packages/react-native/ReactCommon/ReactCommon.podspec index 448907b3b8f26e..ff6abe3da9d758 100644 --- a/packages/react-native/ReactCommon/ReactCommon.podspec +++ b/packages/react-native/ReactCommon/ReactCommon.podspec @@ -37,7 +37,7 @@ Pod::Spec.new do |s| "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", "GCC_WARN_PEDANTIC" => "YES" } if ENV['USE_FRAMEWORKS'] - s.header_mappings_dir = './' + s.header_mappings_dir = File.absolute_path("./") end # TODO (T48588859): Restructure this target to align with dir structure: "react/nativemodule/..." diff --git a/packages/react-native/ReactCommon/cxxreact/CMakeLists.txt b/packages/react-native/ReactCommon/cxxreact/CMakeLists.txt index 2aa8c299dc1c38..d1316d7deaa023 100644 --- a/packages/react-native/ReactCommon/cxxreact/CMakeLists.txt +++ b/packages/react-native/ReactCommon/cxxreact/CMakeLists.txt @@ -27,4 +27,5 @@ target_link_libraries(reactnative jsinspector logger reactperflogger - runtimeexecutor) + runtimeexecutor + react_debug) diff --git a/packages/react-native/ReactCommon/cxxreact/Instance.cpp b/packages/react-native/ReactCommon/cxxreact/Instance.cpp index 7cf9d3a148eda6..8f75501e61d640 100644 --- a/packages/react-native/ReactCommon/cxxreact/Instance.cpp +++ b/packages/react-native/ReactCommon/cxxreact/Instance.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -211,26 +212,31 @@ std::shared_ptr Instance::getJSCallInvoker() { } RuntimeExecutor Instance::getRuntimeExecutor() { - std::weak_ptr weakNativeToJsBridge = nativeToJsBridge_; + // HACK: RuntimeExecutor is not compatible with non-JSIExecutor, we return + // a null callback, which the caller should handle. + if (!getJavaScriptContext()) { + return nullptr; + } - auto runtimeExecutor = - [weakNativeToJsBridge]( - std::function &&callback) { - if (auto strongNativeToJsBridge = weakNativeToJsBridge.lock()) { - strongNativeToJsBridge->runOnExecutorQueue( - [callback = std::move(callback)](JSExecutor *executor) { - jsi::Runtime *runtime = - (jsi::Runtime *)executor->getJavaScriptContext(); - try { - callback(*runtime); - executor->flush(); - } catch (jsi::JSError &originalError) { - handleJSError(*runtime, originalError, true); - } - }); - } - }; - return runtimeExecutor; + std::weak_ptr weakNativeToJsBridge = nativeToJsBridge_; + return [weakNativeToJsBridge]( + std::function &&callback) { + if (auto strongNativeToJsBridge = weakNativeToJsBridge.lock()) { + strongNativeToJsBridge->runOnExecutorQueue( + [callback = std::move(callback)](JSExecutor *executor) { + // Assumes the underlying executor is a JSIExecutor + jsi::Runtime *runtime = + (jsi::Runtime *)executor->getJavaScriptContext(); + try { + react_native_assert(runtime != nullptr); + callback(*runtime); + executor->flush(); + } catch (jsi::JSError &originalError) { + handleJSError(*runtime, originalError, true); + } + }); + } + }; } std::shared_ptr diff --git a/packages/react-native/ReactCommon/cxxreact/RAMBundleRegistry.cpp b/packages/react-native/ReactCommon/cxxreact/RAMBundleRegistry.cpp index ff3cd6b3cde72d..c90860dbeebdc3 100644 --- a/packages/react-native/ReactCommon/cxxreact/RAMBundleRegistry.cpp +++ b/packages/react-native/ReactCommon/cxxreact/RAMBundleRegistry.cpp @@ -13,7 +13,10 @@ namespace facebook::react { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" constexpr uint32_t RAMBundleRegistry::MAIN_BUNDLE_ID; +#pragma clang diagnostic pop std::unique_ptr RAMBundleRegistry::singleBundleRegistry( std::unique_ptr mainBundle) { diff --git a/packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec b/packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec index fe1b09b0a59362..fa7eb6125ee51c 100644 --- a/packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec +++ b/packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec @@ -33,8 +33,10 @@ Pod::Spec.new do |s| s.source_files = "*.{cpp,h}" s.exclude_files = "SampleCxxModule.*" s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags - s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\"", - "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\"", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" + } s.header_dir = "cxxreact" s.dependency "boost", "1.76.0" @@ -47,6 +49,7 @@ Pod::Spec.new do |s| s.dependency "React-perflogger", version s.dependency "React-jsi", version s.dependency "React-logger", version + s.dependency "React-debug", version if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" s.dependency 'hermes-engine' diff --git a/packages/react-native/ReactCommon/cxxreact/ReactMarker.cpp b/packages/react-native/ReactCommon/cxxreact/ReactMarker.cpp index a84b8d71b3aae0..2b6478b33c677e 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactMarker.cpp +++ b/packages/react-native/ReactCommon/cxxreact/ReactMarker.cpp @@ -18,7 +18,6 @@ namespace ReactMarker { LogTaggedMarker logTaggedMarkerImpl = nullptr; LogTaggedMarker logTaggedMarkerBridgelessImpl = nullptr; -GetAppStartTime getAppStartTimeImpl = nullptr; #if __clang__ #pragma clang diagnostic pop @@ -29,7 +28,6 @@ void logMarker(const ReactMarkerId markerId) { } void logTaggedMarker(const ReactMarkerId markerId, const char *tag) { - StartupLogger::getInstance().logStartupEvent(markerId); logTaggedMarkerImpl(markerId, tag); } @@ -38,27 +36,43 @@ void logMarkerBridgeless(const ReactMarkerId markerId) { } void logTaggedMarkerBridgeless(const ReactMarkerId markerId, const char *tag) { - StartupLogger::getInstance().logStartupEvent(markerId); logTaggedMarkerBridgelessImpl(markerId, tag); } +void logMarkerDone(const ReactMarkerId markerId, double markerTime) { + StartupLogger::getInstance().logStartupEvent(markerId, markerTime); +} + StartupLogger &StartupLogger::getInstance() { static StartupLogger instance; return instance; } -void StartupLogger::logStartupEvent(const ReactMarkerId markerId) { - auto now = JSExecutor::performanceNow(); +void StartupLogger::logStartupEvent( + const ReactMarkerId markerId, + double markerTime) { switch (markerId) { + case ReactMarkerId::APP_STARTUP_START: + if (appStartupStartTime == 0) { + appStartupStartTime = markerTime; + } + return; + + case ReactMarkerId::APP_STARTUP_STOP: + if (appStartupEndTime == 0) { + appStartupEndTime = markerTime; + } + return; + case ReactMarkerId::RUN_JS_BUNDLE_START: if (runJSBundleStartTime == 0) { - runJSBundleStartTime = now; + runJSBundleStartTime = markerTime; } return; case ReactMarkerId::RUN_JS_BUNDLE_STOP: if (runJSBundleEndTime == 0) { - runJSBundleEndTime = now; + runJSBundleEndTime = markerTime; } return; @@ -67,12 +81,8 @@ void StartupLogger::logStartupEvent(const ReactMarkerId markerId) { } } -double StartupLogger::getAppStartTime() { - if (getAppStartTimeImpl == nullptr) { - return 0; - } - - return getAppStartTimeImpl(); +double StartupLogger::getAppStartupStartTime() { + return appStartupStartTime; } double StartupLogger::getRunJSBundleStartTime() { @@ -83,5 +93,9 @@ double StartupLogger::getRunJSBundleEndTime() { return runJSBundleEndTime; } +double StartupLogger::getAppStartupEndTime() { + return appStartupEndTime; +} + } // namespace ReactMarker } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/cxxreact/ReactMarker.h b/packages/react-native/ReactCommon/cxxreact/ReactMarker.h index 76b8e7a165e8dc..178cdbc13a19e8 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactMarker.h +++ b/packages/react-native/ReactCommon/cxxreact/ReactMarker.h @@ -15,6 +15,8 @@ namespace facebook::react { namespace ReactMarker { enum ReactMarkerId { + APP_STARTUP_START, + APP_STARTUP_STOP, NATIVE_REQUIRE_START, NATIVE_REQUIRE_STOP, RUN_JS_BUNDLE_START, @@ -35,12 +37,10 @@ using LogTaggedMarker = std::function; // Bridge only using LogTaggedMarkerBridgeless = std::function; -using GetAppStartTime = std::function; #else typedef void ( *LogTaggedMarker)(const ReactMarkerId, const char *tag); // Bridge only typedef void (*LogTaggedMarkerBridgeless)(const ReactMarkerId, const char *tag); -typedef double (*GetAppStartTime)(); #endif #ifndef RN_EXPORT @@ -49,7 +49,6 @@ typedef double (*GetAppStartTime)(); extern RN_EXPORT LogTaggedMarker logTaggedMarkerImpl; // Bridge only extern RN_EXPORT LogTaggedMarker logTaggedMarkerBridgelessImpl; -extern RN_EXPORT GetAppStartTime getAppStartTimeImpl; extern RN_EXPORT void logMarker(const ReactMarkerId markerId); // Bridge only extern RN_EXPORT void logTaggedMarker( @@ -59,7 +58,6 @@ extern RN_EXPORT void logMarkerBridgeless(const ReactMarkerId markerId); extern RN_EXPORT void logTaggedMarkerBridgeless( const ReactMarkerId markerId, const char *tag); -extern RN_EXPORT double getAppStartTime(); struct ReactMarkerEvent { const ReactMarkerId markerId; @@ -71,19 +69,29 @@ class StartupLogger { public: static StartupLogger &getInstance(); - void logStartupEvent(const ReactMarker::ReactMarkerId markerId); - double getAppStartTime(); + void logStartupEvent(const ReactMarkerId markerName, double markerTime); + double getAppStartupStartTime(); double getRunJSBundleStartTime(); double getRunJSBundleEndTime(); + double getAppStartupEndTime(); private: StartupLogger() = default; StartupLogger(const StartupLogger &) = delete; StartupLogger &operator=(const StartupLogger &) = delete; + double appStartupStartTime; + double appStartupEndTime; double runJSBundleStartTime; double runJSBundleEndTime; }; +// When the marker got logged from the platform, it will notify here. This is +// used to collect react markers that are logged in the platform instead of in +// C++. +extern RN_EXPORT void logMarkerDone( + const ReactMarkerId markerId, + double markerTime); + } // namespace ReactMarker } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/hermes/executor/React-jsitracing.podspec b/packages/react-native/ReactCommon/hermes/executor/React-jsitracing.podspec new file mode 100644 index 00000000000000..06e6b72d6fee4c --- /dev/null +++ b/packages/react-native/ReactCommon/hermes/executor/React-jsitracing.podspec @@ -0,0 +1,41 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "../../..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "React-jsitracing" + s.version = version + s.summary = "Bridgeless for React Native." + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.source_files = "JSITracing.{cpp,h}" + s.header_dir = "." + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"${PODS_TARGET_SRCROOT}/../..\"", + "USE_HEADERMAP" => "YES", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "GCC_WARN_PEDANTIC" => "YES" } + + if ENV['USE_FRAMEWORKS'] + s.header_mappings_dir = './' + s.module_name = 'React_jsitracing' + end + + s.dependency "React-jsi" +end diff --git a/packages/react-native/ReactCommon/hermes/inspector/CMakeLists.txt b/packages/react-native/ReactCommon/hermes/inspector/CMakeLists.txt index 3dc0fba5de232d..c6a94c80d8430d 100644 --- a/packages/react-native/ReactCommon/hermes/inspector/CMakeLists.txt +++ b/packages/react-native/ReactCommon/hermes/inspector/CMakeLists.txt @@ -20,6 +20,14 @@ target_compile_options( -fexceptions ) +if(${CMAKE_BUILD_TYPE} MATCHES Debug) + target_compile_options( + hermes_inspector + PRIVATE + -DHERMES_ENABLE_DEBUGGER=1 + ) +endif() + target_include_directories(hermes_inspector PUBLIC ${REACT_COMMON_DIR}) target_link_libraries(hermes_inspector jsinspector diff --git a/packages/react-native/ReactCommon/hermes/inspector/chrome/Connection.cpp b/packages/react-native/ReactCommon/hermes/inspector/chrome/Connection.cpp index 4bc2a2b2dccd65..eb548df0bdd594 100644 --- a/packages/react-native/ReactCommon/hermes/inspector/chrome/Connection.cpp +++ b/packages/react-native/ReactCommon/hermes/inspector/chrome/Connection.cpp @@ -421,6 +421,10 @@ void Connection::Impl::onMessageAdded( const ConsoleMessageInfo &info) { m::runtime::ConsoleAPICalledNotification apiCalledNote; apiCalledNote.type = info.level; + apiCalledNote.timestamp = + std::chrono::duration>( + std::chrono::system_clock::now().time_since_epoch()) + .count(); // TODO(jpporto): fix test cases sending invalid context id. // apiCalledNote.executionContextId = kHermesExecutionContextId; diff --git a/packages/react-native/ReactCommon/jsc/CMakeLists.txt b/packages/react-native/ReactCommon/jsc/CMakeLists.txt index 5db3ff62a01bbc..c5c17fb4048da8 100644 --- a/packages/react-native/ReactCommon/jsc/CMakeLists.txt +++ b/packages/react-native/ReactCommon/jsc/CMakeLists.txt @@ -34,6 +34,6 @@ target_link_libraries(jscruntime # Android has this enabled by default, but the flag is still needed for iOS. target_compile_options(jscruntime PRIVATE -DRN_FABRIC_ENABLED) -if(${CMAKE_BUILD_TYPE} MATCHES Release) +if(NOT ${CMAKE_BUILD_TYPE} MATCHES Debug) target_compile_options(jscruntime PRIVATE -DNDEBUG) endif() diff --git a/packages/react-native/ReactCommon/jserrorhandler/CMakeLists.txt b/packages/react-native/ReactCommon/jserrorhandler/CMakeLists.txt new file mode 100644 index 00000000000000..a007f929c0ed9e --- /dev/null +++ b/packages/react-native/ReactCommon/jserrorhandler/CMakeLists.txt @@ -0,0 +1,22 @@ +# 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. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +add_compile_options(-std=c++17) + +file(GLOB_RECURSE js_error_handler_SRC CONFIGURE_DEPENDS *.cpp) +add_library( + jserrorhandler + SHARED + ${js_error_handler_SRC} +) +target_include_directories(jserrorhandler PUBLIC .) +target_link_libraries(jserrorhandler + jsi + folly_runtime + mapbufferjni +) diff --git a/packages/react-native/ReactCommon/jserrorhandler/React-jserrorhandler.podspec b/packages/react-native/ReactCommon/jserrorhandler/React-jserrorhandler.podspec new file mode 100644 index 00000000000000..3ede4292bd2703 --- /dev/null +++ b/packages/react-native/ReactCommon/jserrorhandler/React-jserrorhandler.podspec @@ -0,0 +1,49 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-gnu-zero-variadic-macro-arguments' +folly_version = '2021.07.22.00' +folly_dep_name = 'RCT-Folly/Fabric' +boost_compiler_flags = '-Wno-documentation' +react_native_path = ".." + +Pod::Spec.new do |s| + s.name = "React-jserrorhandler" + s.version = version + s.summary = "-" + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.header_dir = "jserrorhandler" + s.source_files = "JsErrorHandler.{cpp,h}" + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Mapbuffer/React_Mapbuffer.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\"", "USE_HEADERMAP" => "YES", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } + s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + + if ENV['USE_FRAMEWORKS'] + s.header_mappings_dir = './' + s.module_name = 'React_jserrorhandler' + end + + s.dependency folly_dep_name, folly_version + s.dependency "React-jsi", version + s.dependency "React-Mapbuffer" + +end diff --git a/packages/react-native/ReactCommon/jsi/React-jsi.podspec b/packages/react-native/ReactCommon/jsi/React-jsi.podspec index a6768f029f4594..f04749dc707728 100644 --- a/packages/react-native/ReactCommon/jsi/React-jsi.podspec +++ b/packages/react-native/ReactCommon/jsi/React-jsi.podspec @@ -36,7 +36,8 @@ Pod::Spec.new do |s| s.header_dir = "jsi" s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags - s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\"" } + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\"", + "DEFINES_MODULE" => "YES" } s.dependency "boost", "1.76.0" s.dependency "DoubleConversion" diff --git a/packages/react-native/ReactCommon/jsi/jsi/jsi.h b/packages/react-native/ReactCommon/jsi/jsi/jsi.h index dd5ebe1eb90c6d..18ff0ec41b570e 100644 --- a/packages/react-native/ReactCommon/jsi/jsi/jsi.h +++ b/packages/react-native/ReactCommon/jsi/jsi/jsi.h @@ -924,6 +924,7 @@ class JSI_EXPORT Array : public Object { private: friend class Object; friend class Value; + friend class Runtime; void setValueAtIndexImpl(Runtime& runtime, size_t i, const Value& value) const { @@ -959,6 +960,7 @@ class JSI_EXPORT ArrayBuffer : public Object { private: friend class Object; friend class Value; + friend class Runtime; ArrayBuffer(Runtime::PointerValue* value) : Object(value) {} }; @@ -1067,6 +1069,7 @@ class JSI_EXPORT Function : public Object { private: friend class Object; friend class Value; + friend class Runtime; Function(Runtime::PointerValue* value) : Object(value) {} }; @@ -1389,7 +1392,7 @@ class JSI_EXPORT Scope { explicit Scope(Runtime& rt) : rt_(rt), prv_(rt.pushScope()) {} ~Scope() { rt_.popScope(prv_); - }; + } Scope(const Scope&) = delete; Scope(Scope&&) = delete; @@ -1411,8 +1414,8 @@ class JSI_EXPORT Scope { /// Base class for jsi exceptions class JSI_EXPORT JSIException : public std::exception { protected: - JSIException(){}; - JSIException(std::string what) : what_(std::move(what)){}; + JSIException() {} + JSIException(std::string what) : what_(std::move(what)) {} public: JSIException(const JSIException&) = default; @@ -1453,7 +1456,7 @@ class JSI_EXPORT JSError : public JSIException { /// Creates a JSError referring to new \c Error instance capturing current /// JavaScript stack. The error message property is set to given \c message. JSError(Runtime& rt, const char* message) - : JSError(rt, std::string(message)){}; + : JSError(rt, std::string(message)) {} /// Creates a JSError referring to a JavaScript Object having message and /// stack properties set to provided values. diff --git a/packages/react-native/ReactCommon/jsi/jsi/test/testlib.cpp b/packages/react-native/ReactCommon/jsi/jsi/test/testlib.cpp index 395d48b9e8338e..2c1c3ae5bc79ab 100644 --- a/packages/react-native/ReactCommon/jsi/jsi/test/testlib.cpp +++ b/packages/react-native/ReactCommon/jsi/jsi/test/testlib.cpp @@ -478,6 +478,20 @@ TEST_P(JSITest, ArrayTest) { Array alpha2 = Array(rt, 1); alpha2 = std::move(alpha); EXPECT_EQ(alpha2.size(rt), 4); + + // Test getting/setting an element that is an accessor. + auto arrWithAccessor = + eval( + "Object.defineProperty([], '0', {set(){ throw 72 }, get(){ return 45 }});") + .getObject(rt) + .getArray(rt); + try { + arrWithAccessor.setValueAtIndex(rt, 0, 1); + FAIL() << "Expected exception"; + } catch (const JSError& err) { + EXPECT_EQ(err.value().getNumber(), 72); + } + EXPECT_EQ(arrWithAccessor.getValueAtIndex(rt, 0).getNumber(), 45); } TEST_P(JSITest, FunctionTest) { diff --git a/packages/react-native/ReactCommon/react/bridgeless/BufferedRuntimeExecutor.h b/packages/react-native/ReactCommon/react/bridgeless/BufferedRuntimeExecutor.h index 0b0be428785a01..e2102a7ed6af22 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/BufferedRuntimeExecutor.h +++ b/packages/react-native/ReactCommon/react/bridgeless/BufferedRuntimeExecutor.h @@ -7,9 +7,9 @@ #include #include -#include #include #include +#include "TimerManager.h" namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/bridgeless/CMakeLists.txt b/packages/react-native/ReactCommon/react/bridgeless/CMakeLists.txt new file mode 100644 index 00000000000000..2ad8ccb366b2d5 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/CMakeLists.txt @@ -0,0 +1,37 @@ +# 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. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB bridgeless_SRC "*.cpp") + +add_library(bridgeless + STATIC + ${bridgeless_SRC} +) +target_compile_options( + bridgeless + PRIVATE + $<$:-DHERMES_ENABLE_DEBUGGER=1> + -std=c++17 + -fexceptions +) +target_include_directories(bridgeless PUBLIC .) + +find_library(LIBHERMES NAMES hermes-engine::libhermes) +if (LIBHERMES) + target_link_libraries(bridgeless hermes-engine::libhermes) +endif () + +target_link_libraries( + bridgeless + jserrorhandler + fabricjni + turbomodulejsijni + fb + jsi + jsireact +) diff --git a/packages/react-native/ReactCommon/react/bridgeless/React-BridgelessCore.podspec b/packages/react-native/ReactCommon/react/bridgeless/React-BridgelessCore.podspec new file mode 100644 index 00000000000000..c96710062695d3 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/React-BridgelessCore.podspec @@ -0,0 +1,62 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "../../..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-gnu-zero-variadic-macro-arguments' +folly_version = '2021.07.22.00' +folly_dep_name = 'RCT-Folly/Fabric' +boost_compiler_flags = '-Wno-documentation' + +Pod::Spec.new do |s| + s.name = "React-BridgelessCore" + s.version = version + s.summary = "Bridgeless for React Native." + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.source_files = "*.{cpp,h}", "nativeviewconfig/*.{cpp,h}" + s.exclude_files = "iostests/*", "tests/**/*.{cpp,h}" + s.header_dir = "react/bridgeless" + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/React-Core\" \"${PODS_TARGET_SRCROOT}/../..\"", + "USE_HEADERMAP" => "YES", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "GCC_WARN_PEDANTIC" => "YES" } + s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + + if ENV['USE_FRAMEWORKS'] + s.header_mappings_dir = './' + s.module_name = 'React_BridgelessCore' + end + + s.dependency folly_dep_name, folly_version + s.dependency "React-jsiexecutor" + s.dependency "React-cxxreact" + s.dependency "React-runtimeexecutor" + s.dependency "glog" + s.dependency "React-jsi" + s.dependency "React-jserrorhandler" + s.dependency "React-runtimescheduler" + + if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" + s.dependency "hermes-engine" + else + s.dependency "React-jsc" + end + +end diff --git a/packages/react-native/ReactCommon/react/bridgeless/React-BridgelessHermes.podspec b/packages/react-native/ReactCommon/react/bridgeless/React-BridgelessHermes.podspec new file mode 100644 index 00000000000000..134f5d1a345d07 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/React-BridgelessHermes.podspec @@ -0,0 +1,57 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "../../..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-gnu-zero-variadic-macro-arguments' +folly_version = '2021.07.22.00' +folly_dep_name = 'RCT-Folly/Fabric' +boost_compiler_flags = '-Wno-documentation' + +Pod::Spec.new do |s| + s.name = "React-BridgelessHermes" + s.version = version + s.summary = "Bridgeless for React Native." + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.source_files = "hermes/*.{cpp,h}" + s.header_dir = "react/bridgeless/hermes" + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"${PODS_TARGET_SRCROOT}/../..\" \"${PODS_TARGET_SRCROOT}/../../hermes/executor\"", + "USE_HEADERMAP" => "YES", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "GCC_WARN_PEDANTIC" => "YES" } + s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + + if ENV['USE_FRAMEWORKS'] + s.header_mappings_dir = './' + s.module_name = 'React_BridgelessHermes' + end + + s.dependency folly_dep_name, folly_version + s.dependency "React-jsi" + s.dependency "React-nativeconfig" + s.dependency "React-jsitracing" + + if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" + s.dependency "hermes-engine" + else + s.dependency "React-jsc" + s.exclude_files = "hermes/*.{cpp,h}" + end +end diff --git a/packages/react-native/ReactCommon/react/bridgeless/ReactInstance.cpp b/packages/react-native/ReactCommon/react/bridgeless/ReactInstance.cpp index 07edae1f8dcc00..df9caa868e6235 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/ReactInstance.cpp +++ b/packages/react-native/ReactCommon/react/bridgeless/ReactInstance.cpp @@ -11,10 +11,8 @@ #include #include #include +#include #include -#include -#include -#include #include #include @@ -321,8 +319,6 @@ void defineReactInstanceFlags( ReactInstance::JSRuntimeFlags options) noexcept { defineReadOnlyGlobal(runtime, "RN$Bridgeless", jsi::Value(true)); - jsi::addNativeTracingHooks(runtime); - if (options.isProfiling) { defineReadOnlyGlobal(runtime, "__RCTProfileIsProfiling", jsi::Value(true)); } diff --git a/packages/react-native/ReactCommon/react/bridgeless/hermes/CMakeLists.txt b/packages/react-native/ReactCommon/react/bridgeless/hermes/CMakeLists.txt new file mode 100644 index 00000000000000..0870d732737453 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/hermes/CMakeLists.txt @@ -0,0 +1,25 @@ +# 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. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +add_compile_options(-std=c++17) + +file(GLOB_RECURSE bridgeless_hermes_SRC CONFIGURE_DEPENDS *.cpp) +add_library( + bridgelesshermes + STATIC + ${bridgeless_hermes_SRC} +) +target_include_directories(bridgelesshermes PUBLIC .) + +target_link_libraries(bridgelesshermes + jsireact + hermes-engine::libhermes + hermes_inspector + jsi + hermes_executor_common +) diff --git a/packages/react-native/ReactCommon/react/bridgeless/hermes/HermesInstance.cpp b/packages/react-native/ReactCommon/react/bridgeless/hermes/HermesInstance.cpp index 6b73c1a91c420d..5a2fd57c06082e 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/hermes/HermesInstance.cpp +++ b/packages/react-native/ReactCommon/react/bridgeless/hermes/HermesInstance.cpp @@ -7,6 +7,7 @@ #include "HermesInstance.h" +#include #include #ifdef HERMES_ENABLE_DEBUGGER @@ -115,6 +116,8 @@ std::unique_ptr HermesInstance::createJSRuntime( return decoratedRuntime; #endif + jsi::addNativeTracingHooks(*hermesRuntime); + return hermesRuntime; } diff --git a/packages/react-native/ReactCommon/react/bridgeless/hermes/HermesInstance.h b/packages/react-native/ReactCommon/react/bridgeless/hermes/HermesInstance.h index 933018ccd348f3..b176edc6820bcc 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/hermes/HermesInstance.h +++ b/packages/react-native/ReactCommon/react/bridgeless/hermes/HermesInstance.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/CMakeLists.txt b/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/CMakeLists.txt new file mode 100644 index 00000000000000..68bd16e06e42ec --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/CMakeLists.txt @@ -0,0 +1,19 @@ +# 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. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +add_compile_options(-std=c++17) + +file(GLOB_RECURSE bridgeless_nativeviewconfig_SRC CONFIGURE_DEPENDS *.cpp) +add_library( + bridgelessnativeviewconfig + STATIC + ${bridgeless_nativeviewconfig_SRC} +) +target_include_directories(bridgelessnativeviewconfig PUBLIC .) + +target_link_libraries(bridgelessnativeviewconfig jsi) diff --git a/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/NativeViewConfigProviderBinding.cpp b/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/LegacyUIManagerConstantsProviderBinding.cpp similarity index 59% rename from packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/NativeViewConfigProviderBinding.cpp rename to packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/LegacyUIManagerConstantsProviderBinding.cpp index d29eca015d1087..f3b1eb8ffed96f 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/NativeViewConfigProviderBinding.cpp +++ b/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/LegacyUIManagerConstantsProviderBinding.cpp @@ -5,21 +5,21 @@ * LICENSE file in the root directory of this source tree. */ -#include "NativeViewConfigProviderBinding.h" +#include "LegacyUIManagerConstantsProviderBinding.h" -namespace facebook::react::NativeViewConfigProviderBinding { +namespace facebook::react::LegacyUIManagerConstantsProviderBinding { void install(jsi::Runtime &runtime, ProviderType &&provider) { - auto name = "RN$NativeComponentRegistry_getNativeViewConfig"; + auto name = "RN$LegacyInterop_UIManager_getConstants"; auto hostFunction = [provider = std::move(provider)]( jsi::Runtime &runtime, jsi::Value const & /*thisValue*/, - jsi::Value const *args, + jsi::Value const * /*arguments*/, size_t count) -> jsi::Value { - if (count != 1 || !args[0].isString()) { - throw new jsi::JSError(runtime, "1 argument of type String expected."); + if (count != 0) { + throw new jsi::JSError(runtime, "0 arguments expected."); } - return provider(args[0].getString(runtime).utf8(runtime)); + return provider(); }; auto jsiFunction = jsi::Function::createFromHostFunction( @@ -27,4 +27,4 @@ void install(jsi::Runtime &runtime, ProviderType &&provider) { runtime.global().setProperty(runtime, name, jsiFunction); } -} // namespace facebook::react::NativeViewConfigProviderBinding +} // namespace facebook::react::LegacyUIManagerConstantsProviderBinding diff --git a/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/LegacyUIManagerConstantsProviderBinding.h b/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/LegacyUIManagerConstantsProviderBinding.h new file mode 100644 index 00000000000000..b32cc7c8f23fe4 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/LegacyUIManagerConstantsProviderBinding.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +namespace facebook::react::LegacyUIManagerConstantsProviderBinding { + +using ProviderType = std::function; + +/* + * Installs RN$LegacyInterop_UIManager_getConstants binding into JavaScript + * runtime. It is supposed to be used as a substitute to UIManager.getConstants + * in bridgeless mode. + */ +void install(jsi::Runtime &runtime, ProviderType &&provider); +} // namespace facebook::react::LegacyUIManagerConstantsProviderBinding diff --git a/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/NativeViewConfigProviderBinding.h b/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/NativeViewConfigProviderBinding.h deleted file mode 100644 index b635eab8777117..00000000000000 --- a/packages/react-native/ReactCommon/react/bridgeless/nativeviewconfig/NativeViewConfigProviderBinding.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#pragma once - -#include - -namespace facebook::react::NativeViewConfigProviderBinding { - -using ProviderType = std::function; - -/* - * Installs native view config provider into JavaScript runtime. - */ -void install(jsi::Runtime &runtime, ProviderType &&provider); -} // namespace facebook::react::NativeViewConfigProviderBinding diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/NativeViewConfig/RCTNativeViewConfigProvider.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/NativeViewConfig/RCTNativeViewConfigProvider.mm deleted file mode 100644 index 97108934347076..00000000000000 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/NativeViewConfig/RCTNativeViewConfigProvider.mm +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#include "RCTNativeViewConfigProvider.h" - -#import -#import -#import -#import -#import -#import - -namespace facebook::react { -namespace { - -// This function eagerly loads module constants for every RCTViewManager subclass. -// This is not compatible with lazily loaded modules, but we don't have them in OSS, so that's fine for now. -NSDictionary *eagerViewConfigs() -{ - static NSMutableDictionary *result = [NSMutableDictionary new]; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - auto directEvents = [NSMutableDictionary new]; - auto bubblingEvents = [NSMutableDictionary new]; - for (Class moduleClass in RCTGetModuleClasses()) { - if ([moduleClass isSubclassOfClass:RCTViewManager.class]) { - auto name = RCTViewManagerModuleNameForClass(moduleClass); - auto viewConfig = [RCTComponentData viewConfigForViewMangerClass:moduleClass]; - auto moduleConstants = - RCTModuleConstantsForDestructuredComponent(directEvents, bubblingEvents, moduleClass, name, viewConfig); - result[name] = moduleConstants; - } - } - }); - return result; -} - -jsi::Value provideNativeViewConfig(facebook::jsi::Runtime &runtime, std::string const &name) -{ - auto componentName = [NSString stringWithCString:name.c_str() encoding:NSASCIIStringEncoding]; - auto viewConfig = eagerViewConfigs()[componentName]; - return TurboModuleConvertUtils::convertObjCObjectToJSIValue(runtime, viewConfig); -}; - -} // namespace - -void installNativeViewConfigProviderBinding(jsi::Runtime &runtime) -{ - auto nativeViewConfigProvider = [&runtime](std::string const &name) -> jsi::Value { - return provideNativeViewConfig(runtime, name); - }; - NativeViewConfigProviderBinding::install(runtime, std::move(nativeViewConfigProvider)); -} -} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/React-BridgelessApple.podspec b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/React-BridgelessApple.podspec new file mode 100644 index 00000000000000..acdac0d0a61644 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/React-BridgelessApple.podspec @@ -0,0 +1,75 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "../../../../..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-gnu-zero-variadic-macro-arguments' +folly_version = '2021.07.22.00' +folly_dep_name = 'RCT-Folly/Fabric' +boost_compiler_flags = '-Wno-documentation' + +header_search_paths = [ + "$(PODS_ROOT)/boost", + "$(PODS_TARGET_SRCROOT)/../../../..", + "$(PODS_TARGET_SRCROOT)/../../../../..", +] + +Pod::Spec.new do |s| + s.name = "React-BridgelessApple" + s.version = version + s.summary = "Bridgeless for React Native." + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.source_files = "ReactCommon/*.{mm,h}" + s.header_dir = "ReactCommon" + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => header_search_paths, + "USE_HEADERMAP" => "YES", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "GCC_WARN_PEDANTIC" => "YES" } + s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + + if ENV['USE_FRAMEWORKS'] + s.header_mappings_dir = './' + s.module_name = 'React_BridgelessApple' + end + + s.dependency folly_dep_name, folly_version + s.dependency "React-jsiexecutor" + s.dependency "React-cxxreact" + s.dependency "React-callinvoker" + s.dependency "React-runtimeexecutor" + s.dependency "React-utils" + s.dependency "React-jsi" + s.dependency "React-Core/Default" + s.dependency "React-CoreModules" + s.dependency "React-NativeModulesApple" + s.dependency "React-RCTFabric" + s.dependency "React-BridgelessCore" + s.dependency "React-Mapbuffer" + s.dependency "React-jserrorhandler" + + if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" + s.dependency "hermes-engine" + s.dependency "React-BridgelessHermes" + s.exclude_files = "ReactCommon/RCTJscInstance.{mm,h}" + else + s.dependency "React-jsc" + s.exclude_files = "ReactCommon/RCTHermesInstance.{mm,h}" + end +end diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/ObjCTimerRegistry.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/ObjCTimerRegistry.h similarity index 91% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/ObjCTimerRegistry.h rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/ObjCTimerRegistry.h index 60219eb7211c98..b62d473e95bf86 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/ObjCTimerRegistry.h +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/ObjCTimerRegistry.h @@ -7,14 +7,13 @@ #import -#import #import #import #import @interface RCTJSTimerExecutor : NSObject -- (void)setTimerManager:(std::weak_ptr)timerManager FB_OBJC_DIRECT; +- (void)setTimerManager:(std::weak_ptr)timerManager; @end diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/ObjCTimerRegistry.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/ObjCTimerRegistry.mm similarity index 100% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/ObjCTimerRegistry.mm rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/ObjCTimerRegistry.mm diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTContextContainerHandling.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTContextContainerHandling.h similarity index 100% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTContextContainerHandling.h rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTContextContainerHandling.h diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Hermes/RCTHermesInstance.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHermesInstance.h similarity index 100% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Hermes/RCTHermesInstance.h rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHermesInstance.h diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Hermes/RCTHermesInstance.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHermesInstance.mm similarity index 100% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Hermes/RCTHermesInstance.mm rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHermesInstance.mm diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost+Internal.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost+Internal.h similarity index 91% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost+Internal.h rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost+Internal.h index 64883331a818b1..4432aa0cce498d 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost+Internal.h +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost+Internal.h @@ -7,7 +7,7 @@ #import "RCTHost.h" -#import +#import "RCTContextContainerHandling.h" typedef NSURL * (^RCTHostBundleURLProvider)(void); diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost.h similarity index 83% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost.h rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost.h index 12e16a9e407216..f083cd50042040 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost.h +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost.h @@ -7,7 +7,6 @@ #import -#import #import #import #import @@ -19,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @class RCTFabricSurface; @class RCTHost; @class RCTModuleRegistry; -FB_RUNTIME_PROTOCOL + @protocol RCTTurboModuleManagerDelegate; // Runtime API @@ -49,7 +48,7 @@ typedef std::shared_ptr (^RCTHostJSEngineProv - (instancetype)initWithBundleURL:(NSURL *)bundleURL hostDelegate:(id)hostDelegate turboModuleManagerDelegate:(id)turboModuleManagerDelegate - jsEngineProvider:(RCTHostJSEngineProvider)jsEngineProvider NS_DESIGNATED_INITIALIZER FB_OBJC_DIRECT; + jsEngineProvider:(RCTHostJSEngineProvider)jsEngineProvider NS_DESIGNATED_INITIALIZER; @property (nonatomic, weak, nullable) id runtimeDelegate; @@ -61,16 +60,15 @@ typedef std::shared_ptr (^RCTHostJSEngineProv - (RCTFabricSurface *)createSurfaceWithModuleName:(NSString *)moduleName mode:(facebook::react::DisplayMode)displayMode - initialProperties:(NSDictionary *)properties FB_OBJC_DIRECT; + initialProperties:(NSDictionary *)properties; -- (RCTFabricSurface *)createSurfaceWithModuleName:(NSString *)moduleName - initialProperties:(NSDictionary *)properties FB_OBJC_DIRECT; +- (RCTFabricSurface *)createSurfaceWithModuleName:(NSString *)moduleName initialProperties:(NSDictionary *)properties; -- (RCTSurfacePresenter *)getSurfacePresenter FB_OBJC_DIRECT; +- (RCTSurfacePresenter *)getSurfacePresenter; // Native module API -- (RCTModuleRegistry *)getModuleRegistry FB_OBJC_DIRECT; +- (RCTModuleRegistry *)getModuleRegistry; @end diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost.mm similarity index 98% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost.mm rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost.mm index fc91d96e5420cb..f733d5514f6c8d 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTHost.mm +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTHost.mm @@ -8,7 +8,6 @@ #import "RCTHost.h" #import "RCTHost+Internal.h" -#import #import #import #import @@ -274,12 +273,12 @@ - (void)setContextContainerHandler:(id)contextConta #pragma mark - Private -- (void)_attachSurface:(RCTFabricSurface *)surface FB_OBJC_DIRECT +- (void)_attachSurface:(RCTFabricSurface *)surface { _attachedSurfaces.push_back(surface); } -- (NSArray *)_getAttachedSurfaces FB_OBJC_DIRECT +- (NSArray *)_getAttachedSurfaces { NSMutableArray *surfaces = [NSMutableArray new]; for (RCTFabricSurface *surface : _attachedSurfaces) { diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTInstance.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTInstance.h similarity index 95% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTInstance.h rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTInstance.h index 5445ca8b7c247d..bd7798627b0a54 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTInstance.h +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTInstance.h @@ -7,7 +7,6 @@ #import -#import #import #import #import @@ -33,7 +32,6 @@ RCT_EXTERN void RCTInstanceSetRuntimeDiagnosticFlags(NSString *_Nullable flags); @class RCTSource; @class RCTSurfacePresenter; -FB_RUNTIME_PROTOCOL @protocol RCTTurboModuleManagerDelegate; @protocol RCTInstanceDelegate @@ -62,7 +60,7 @@ typedef void (^_Null_unspecified RCTInstanceInitialBundleLoadCompletionBlock)(); bundleManager:(RCTBundleManager *)bundleManager turboModuleManagerDelegate:(id)turboModuleManagerDelegate onInitialBundleLoad:(RCTInstanceInitialBundleLoadCompletionBlock)onInitialBundleLoad - moduleRegistry:(RCTModuleRegistry *)moduleRegistry NS_DESIGNATED_INITIALIZER FB_OBJC_DIRECT; + moduleRegistry:(RCTModuleRegistry *)moduleRegistry; - (void)callFunctionOnJSModule:(NSString *)moduleName method:(NSString *)method args:(NSArray *)args; diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTInstance.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTInstance.mm similarity index 91% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTInstance.mm rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTInstance.mm index 2258edae930bdb..0842d70c7eff6c 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTInstance.mm +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTInstance.mm @@ -28,7 +28,6 @@ #import #import #import -#import #import #import #import @@ -39,10 +38,10 @@ #import "ObjCTimerRegistry.h" #import "RCTJSThreadManager.h" +#import "RCTLegacyUIManagerConstantsProvider.h" #import "RCTPerformanceLoggerUtils.h" #if RCT_DEV_MENU && __has_include() -#import #import #endif @@ -225,26 +224,31 @@ - (void)_start RuntimeExecutor bufferedRuntimeExecutor = _reactInstance->getBufferedRuntimeExecutor(); timerManager->setRuntimeExecutor(bufferedRuntimeExecutor); - // Set up TurboModules - _turboModuleManager = - [[RCTTurboModuleManager alloc] initWithBridge:nil - delegate:self - jsInvoker:std::make_shared(bufferedRuntimeExecutor)]; - - if (RCTTurboModuleInteropEnabled() && RCTTurboModuleInteropBridgeProxyEnabled()) { - RCTBridgeProxy *bridgeProxy = [[RCTBridgeProxy alloc] - initWithViewRegistry:_bridgeModuleDecorator.viewRegistry_DEPRECATED - moduleRegistry:_bridgeModuleDecorator.moduleRegistry - bundleManager:_bridgeModuleDecorator.bundleManager - callableJSModules:_bridgeModuleDecorator.callableJSModules - dispatchToJSThread:^(dispatch_block_t block) { - __strong __typeof(self) strongSelf = weakSelf; - if (strongSelf && strongSelf->_valid) { - strongSelf->_reactInstance->getBufferedRuntimeExecutor()([=](jsi::Runtime &runtime) { block(); }); + RCTBridgeProxy *bridgeProxy = RCTTurboModuleInteropEnabled() && RCTTurboModuleInteropBridgeProxyEnabled() + ? [[RCTBridgeProxy alloc] initWithViewRegistry:_bridgeModuleDecorator.viewRegistry_DEPRECATED + moduleRegistry:_bridgeModuleDecorator.moduleRegistry + bundleManager:_bridgeModuleDecorator.bundleManager + callableJSModules:_bridgeModuleDecorator.callableJSModules + dispatchToJSThread:^(dispatch_block_t block) { + __strong __typeof(self) strongSelf = weakSelf; + if (strongSelf && strongSelf->_valid) { + strongSelf->_reactInstance->getBufferedRuntimeExecutor()([=](jsi::Runtime &runtime) { block(); }); + } } - }]; - [_turboModuleManager setBridgeProxy:bridgeProxy]; - } + registerSegmentWithId:^(NSNumber *segmentId, NSString *path) { + __strong __typeof(self) strongSelf = weakSelf; + if (strongSelf && strongSelf->_valid) { + [strongSelf registerSegmentWithId:segmentId path:path]; + } + }] + : nil; + + // Set up TurboModules + _turboModuleManager = [[RCTTurboModuleManager alloc] + initWithBridgeProxy:bridgeProxy + bridgeModuleDecorator:_bridgeModuleDecorator + delegate:self + jsInvoker:std::make_shared(bufferedRuntimeExecutor)]; // Initialize RCTModuleRegistry so that TurboModules can require other TurboModules. [_bridgeModuleDecorator.moduleRegistry setTurboModuleRegistry:_turboModuleManager]; @@ -297,7 +301,7 @@ - (void)_start RCTInstallNativeComponentRegistryBinding(runtime); if (RCTGetUseNativeViewConfigsInBridgelessMode()) { - installNativeViewConfigProviderBinding(runtime); + installLegacyUIManagerConstantsProviderBinding(runtime); } [strongSelf->_delegate instance:strongSelf didInitializeRuntime:runtime]; @@ -320,7 +324,7 @@ - (void)_start [_performanceLogger markStopForTag:RCTPLReactInstanceInit]; } -- (void)_attachBridgelessAPIsToModule:(id)module FB_OBJC_DIRECT +- (void)_attachBridgelessAPIsToModule:(id)module { __weak RCTInstance *weakSelf = self; if ([module respondsToSelector:@selector(setDispatchToJSThread:)]) { @@ -347,11 +351,9 @@ - (void)_attachBridgelessAPIsToModule:(id)module FB_OBJC_DIRECT } #endif } - - [_bridgeModuleDecorator attachInteropAPIsToModule:(id)module]; } -- (void)_loadJSBundle:(NSURL *)sourceURL FB_OBJC_DIRECT +- (void)_loadJSBundle:(NSURL *)sourceURL { #if RCT_DEV_MENU && __has_include() { @@ -397,7 +399,7 @@ - (void)_loadJSBundle:(NSURL *)sourceURL FB_OBJC_DIRECT }]; } -- (void)_loadScriptFromSource:(RCTSource *)source FB_OBJC_DIRECT +- (void)_loadScriptFromSource:(RCTSource *)source { std::lock_guard lock(_invalidationMutex); if (!_valid) { diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTJSThreadManager.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJSThreadManager.h similarity index 73% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTJSThreadManager.h rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJSThreadManager.h index 3fd4edda7bc9f7..ce64c55fdf0401 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTJSThreadManager.h +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJSThreadManager.h @@ -7,15 +7,14 @@ #import -#import #import NS_ASSUME_NONNULL_BEGIN @interface RCTJSThreadManager : NSObject -- (void)dispatchToJSThread:(dispatch_block_t)block FB_OBJC_DIRECT; -- (std::shared_ptr)jsMessageThread FB_OBJC_DIRECT; +- (void)dispatchToJSThread:(dispatch_block_t)block; +- (std::shared_ptr)jsMessageThread; @end diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTJSThreadManager.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJSThreadManager.mm similarity index 95% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTJSThreadManager.mm rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJSThreadManager.mm index 20fcfce9414381..66d53609779b47 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTJSThreadManager.mm +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJSThreadManager.mm @@ -7,7 +7,6 @@ #import "RCTJSThreadManager.h" -#import #import #import @@ -59,7 +58,7 @@ - (void)dealloc #pragma mark - JSThread Management -- (void)startJSThread FB_OBJC_DIRECT +- (void)startJSThread { _jsThread = [[NSThread alloc] initWithTarget:[self class] selector:@selector(runRunLoop) object:nil]; _jsThread.name = RCTJSThreadName; @@ -109,7 +108,7 @@ + (void)runRunLoop #pragma mark - Private -- (void)_handleError:(NSError *)error FB_OBJC_DIRECT +- (void)_handleError:(NSError *)error { RCTFatal(error); } diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJscInstance.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJscInstance.h new file mode 100644 index 00000000000000..2a0246320e60dd --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJscInstance.h @@ -0,0 +1,23 @@ +/* + * 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. + */ + +#import +#import + +namespace facebook { +namespace react { + +class RCTJscInstance : public JSEngineInstance { + public: + RCTJscInstance(); + + std::unique_ptr createJSRuntime() noexcept override; + + ~RCTJscInstance(){}; +}; +} // namespace react +} // namespace facebook diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJscInstance.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJscInstance.mm new file mode 100644 index 00000000000000..b270ba8d27e2cd --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTJscInstance.mm @@ -0,0 +1,22 @@ +/* + * 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. + */ + +#import "RCTJscInstance.h" +#include + +namespace facebook { +namespace react { + +RCTJscInstance::RCTJscInstance() {} + +std::unique_ptr RCTJscInstance::createJSRuntime() noexcept +{ + return jsc::makeJSCRuntime(); +} + +} // namespace react +} // namespace facebook diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTLegacyUIManagerConstantsProvider.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTLegacyUIManagerConstantsProvider.h new file mode 100644 index 00000000000000..9359df209c0494 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTLegacyUIManagerConstantsProvider.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +namespace facebook::react { +/* + * Installs UIManger constants provider into JavaScript runtime. This is needed + * to implement UIManager.getConstants in bridgeless mode. The constants object + * contains view configs for every legacy native component. + */ +void installLegacyUIManagerConstantsProviderBinding(jsi::Runtime &runtime); +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTLegacyUIManagerConstantsProvider.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTLegacyUIManagerConstantsProvider.mm new file mode 100644 index 00000000000000..b156a127994ca6 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTLegacyUIManagerConstantsProvider.mm @@ -0,0 +1,44 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "RCTLegacyUIManagerConstantsProvider.h" + +#import +#import +#import +#import +#import +#import + +namespace facebook::react { +namespace { + +jsi::Value getConstants(facebook::jsi::Runtime &runtime) +{ + static NSMutableDictionary *result = [NSMutableDictionary new]; + auto directEvents = [NSMutableDictionary new]; + auto bubblingEvents = [NSMutableDictionary new]; + for (Class moduleClass in RCTGetModuleClasses()) { + if ([moduleClass isSubclassOfClass:RCTViewManager.class]) { + auto name = RCTViewManagerModuleNameForClass(moduleClass); + auto viewConfig = [RCTComponentData viewConfigForViewMangerClass:moduleClass]; + auto moduleConstants = + RCTModuleConstantsForDestructuredComponent(directEvents, bubblingEvents, moduleClass, name, viewConfig); + result[name] = moduleConstants; + } + } + return TurboModuleConvertUtils::convertObjCObjectToJSIValue(runtime, result); +}; + +} // namespace + +void installLegacyUIManagerConstantsProviderBinding(jsi::Runtime &runtime) +{ + auto constantsProvider = [&runtime]() -> jsi::Value { return getConstants(runtime); }; + LegacyUIManagerConstantsProviderBinding::install(runtime, std::move(constantsProvider)); +} +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTPerformanceLoggerUtils.h b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTPerformanceLoggerUtils.h similarity index 100% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTPerformanceLoggerUtils.h rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTPerformanceLoggerUtils.h diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTPerformanceLoggerUtils.mm b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTPerformanceLoggerUtils.mm similarity index 91% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTPerformanceLoggerUtils.mm rename to packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTPerformanceLoggerUtils.mm index a8c20b83f46757..7a069100eeadb1 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/Core/RCTPerformanceLoggerUtils.mm +++ b/packages/react-native/ReactCommon/react/bridgeless/platform/ios/ReactCommon/RCTPerformanceLoggerUtils.mm @@ -17,6 +17,12 @@ static void mapReactMarkerToPerformanceLogger( RCTPerformanceLogger *performanceLogger) { switch (markerId) { + case ReactMarker::APP_STARTUP_START: + [performanceLogger markStartForTag:RCTPLAppStartup]; + break; + case ReactMarker::APP_STARTUP_STOP: + [performanceLogger markStopForTag:RCTPLAppStartup]; + break; case ReactMarker::RUN_JS_BUNDLE_START: [performanceLogger markStartForTag:RCTPLScriptExecution]; break; diff --git a/packages/react-native/ReactCommon/react/bridgeless/tests/cxx/ReactInstanceTest.cpp b/packages/react-native/ReactCommon/react/bridgeless/tests/cxx/ReactInstanceTest.cpp index ca3f34f14d35d9..2ef608629916e0 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/tests/cxx/ReactInstanceTest.cpp +++ b/packages/react-native/ReactCommon/react/bridgeless/tests/cxx/ReactInstanceTest.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include #include diff --git a/packages/react-native/ReactCommon/react/bridging/CMakeLists.txt b/packages/react-native/ReactCommon/react/bridging/CMakeLists.txt index 18eb946077fe68..8d8f81a768b49d 100644 --- a/packages/react-native/ReactCommon/react/bridging/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/bridging/CMakeLists.txt @@ -21,4 +21,4 @@ add_library(react_bridging STATIC ${react_bridging_SRC}) target_include_directories(react_bridging PUBLIC ${REACT_COMMON_DIR}) -target_link_libraries(react_bridging jsi) +target_link_libraries(react_bridging jsi callinvoker) diff --git a/packages/react-native/ReactCommon/react/config/ReactNativeConfig.cpp b/packages/react-native/ReactCommon/react/config/ReactNativeConfig.cpp index 915c7737fb07d0..9a701c320e5f33 100644 --- a/packages/react-native/ReactCommon/react/config/ReactNativeConfig.cpp +++ b/packages/react-native/ReactCommon/react/config/ReactNativeConfig.cpp @@ -23,9 +23,6 @@ bool EmptyReactNativeConfig::getBool(const std::string ¶m) const { if (param == "react_fabric:enabled_layout_animations_ios") { return true; } - if (param == "react_fabric:enable_nstextstorage_caching") { - return true; - } return false; } diff --git a/packages/react-native/ReactCommon/react/debug/CMakeLists.txt b/packages/react-native/ReactCommon/react/debug/CMakeLists.txt index ccfc69872e7340..cb3497e77a12cd 100644 --- a/packages/react-native/ReactCommon/react/debug/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/debug/CMakeLists.txt @@ -23,6 +23,6 @@ target_include_directories(react_debug PUBLIC ${REACT_COMMON_DIR}) target_link_libraries(react_debug log folly_runtime) -if(${CMAKE_BUILD_TYPE} MATCHES Release) +if(NOT ${CMAKE_BUILD_TYPE} MATCHES Debug) target_compile_options(react_debug PUBLIC -DNDEBUG) endif() diff --git a/packages/react-native/ReactCommon/react/debug/React-debug.podspec b/packages/react-native/ReactCommon/react/debug/React-debug.podspec index dab4a31652edfa..933ace4d4d6fd5 100644 --- a/packages/react-native/ReactCommon/react/debug/React-debug.podspec +++ b/packages/react-native/ReactCommon/react/debug/React-debug.podspec @@ -27,10 +27,11 @@ Pod::Spec.new do |s| s.source = source s.source_files = "**/*.{cpp,h}" s.header_dir = "react/debug" - s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } + s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "DEFINES_MODULE" => "YES" } if ENV['USE_FRAMEWORKS'] s.module_name = "React_debug" - s.header_mappings_dir = "../.." + s.header_mappings_dir = File.absolute_path("../..") end end diff --git a/packages/react-native/ReactCommon/react/debug/flags.h b/packages/react-native/ReactCommon/react/debug/flags.h index dae3ecc4e51f81..1ccc1a2817dfe5 100644 --- a/packages/react-native/ReactCommon/react/debug/flags.h +++ b/packages/react-native/ReactCommon/react/debug/flags.h @@ -8,14 +8,15 @@ #pragma once // -// Enable REACT_NATIVE_DEBUG if NDEBUG is not defined. -// Due to BUCK defaults in open-source, NDEBUG is always defined for all android -// builds. -// If you build in OSS with CMake, you will have -DNDEBUG set only for release -// builds, therefore REACT_NATIVE_DEBUG will not be set. Here we introduce -// REACT_NATIVE_DEBUG that we use internally instead of NDEBUG that we can -// control and use as a more reliable xplat flag. For any build that doesn't -// have NDEBUG defined, we enable REACT_NATIVE_DEBUG for convenience. -#ifndef NDEBUG -#define REACT_NATIVE_DEBUG 1 +// Preprocessor flags which control whether code meant for debugging the +// internals of React Native is included in the build. E.g. debug assertions. +// +// This flag is normally derived from NDEBUG, but may be set explicitly by +// defining `REACT_NATIVE_DEBUG` or `REACT_NATIVE_PRODUCTION`. +#if !(defined(REACT_NATIVE_DEBUG) || defined(REACT_NATIVE_PRODUCTION)) +#ifdef NDEBUG +#define REACT_NATIVE_PRODUCTION +#else +#define REACT_NATIVE_DEBUG +#endif #endif diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp index e7039b5850934b..eb84bf6c6be560 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp @@ -95,13 +95,11 @@ static void defineReadOnlyGlobal( */ TurboModuleBinding::TurboModuleBinding( - TurboModuleBindingMode bindingMode, TurboModuleProviderFunctionType &&moduleProvider) - : bindingMode_(bindingMode), moduleProvider_(std::move(moduleProvider)) {} + : moduleProvider_(std::move(moduleProvider)) {} void TurboModuleBinding::install( jsi::Runtime &runtime, - TurboModuleBindingMode bindingMode, TurboModuleProviderFunctionType &&moduleProvider, TurboModuleProviderFunctionType &&legacyModuleProvider) { runtime.global().setProperty( @@ -111,8 +109,7 @@ void TurboModuleBinding::install( runtime, jsi::PropNameID::forAscii(runtime, "__turboModuleProxy"), 1, - [binding = - TurboModuleBinding(bindingMode, std::move(moduleProvider))]( + [binding = TurboModuleBinding(std::move(moduleProvider))]( jsi::Runtime &rt, const jsi::Value &thisVal, const jsi::Value *args, @@ -135,7 +132,7 @@ void TurboModuleBinding::install( runtime, std::make_shared( std::make_unique( - bindingMode, std::move(legacyModuleProvider))))); + std::move(legacyModuleProvider))))); } else { defineReadOnlyGlobal( runtime, @@ -160,11 +157,6 @@ jsi::Value TurboModuleBinding::getModule( module = moduleProvider_(moduleName); } if (module) { - // Default behaviour - if (bindingMode_ == TurboModuleBindingMode::HostObject) { - return jsi::Object::createFromHostObject(runtime, std::move(module)); - } - // What is jsRepresentation? A cache for the TurboModule's properties // Henceforth, always return the cache (i.e: jsRepresentation) to JavaScript // @@ -186,26 +178,19 @@ jsi::Value TurboModuleBinding::getModule( weakJsRepresentation = std::make_unique(runtime, jsRepresentation); - if (bindingMode_ == TurboModuleBindingMode::Prototype) { - // Option 1: Lazily populate the jsRepresentation, on property access. - // - // How does this work? - // 1. Initially jsRepresentation is empty: {} - // 2. If property lookup on jsRepresentation fails, the JS runtime will - // search jsRepresentation's prototype: jsi::Object(TurboModule). - // 3. TurboModule::get(runtime, propKey) executes. This creates the - // property, caches it on jsRepresentation, then returns it to - // JavaScript. - auto hostObject = - jsi::Object::createFromHostObject(runtime, std::move(module)); - jsRepresentation.setProperty(runtime, "__proto__", std::move(hostObject)); - } else { - // Option 2: Eagerly populate the jsRepresentation, on create. - // Object.assign(jsRepresentation, jsi::Object(TurboModule)) - for (auto &propName : module->getPropertyNames(runtime)) { - module->get(runtime, propName); - } - } + // Lazily populate the jsRepresentation, on property access. + // + // How does this work? + // 1. Initially jsRepresentation is empty: {} + // 2. If property lookup on jsRepresentation fails, the JS runtime will + // search jsRepresentation's prototype: jsi::Object(TurboModule). + // 3. TurboModule::get(runtime, propKey) executes. This creates the + // property, caches it on jsRepresentation, then returns it to + // JavaScript. + auto hostObject = + jsi::Object::createFromHostObject(runtime, std::move(module)); + jsRepresentation.setProperty(runtime, "__proto__", std::move(hostObject)); + return jsRepresentation; } else { return jsi::Value::null(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h index 1aef473c63d0ee..2fc6e17cf4ac86 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h @@ -14,12 +14,6 @@ namespace facebook::react { -enum class TurboModuleBindingMode : uint8_t { - HostObject = 0, - Prototype = 1, - Eager = 2, -}; - class BridgelessNativeModuleProxy; /** @@ -33,13 +27,10 @@ class TurboModuleBinding { */ static void install( jsi::Runtime &runtime, - TurboModuleBindingMode bindingMode, TurboModuleProviderFunctionType &&moduleProvider, TurboModuleProviderFunctionType &&legacyModuleProvider = nullptr); - TurboModuleBinding( - TurboModuleBindingMode bindingMode, - TurboModuleProviderFunctionType &&moduleProvider); + TurboModuleBinding(TurboModuleProviderFunctionType &&moduleProvider); virtual ~TurboModuleBinding(); private: @@ -52,7 +43,6 @@ class TurboModuleBinding { jsi::Value getModule(jsi::Runtime &runtime, const std::string &moduleName) const; - TurboModuleBindingMode bindingMode_; TurboModuleProviderFunctionType moduleProvider_; }; diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp b/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp index 616861539d1749..0940a6ea48a1e2 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp @@ -430,15 +430,9 @@ jsi::JSError convertThrowableToJSError( } jsi::Object cause(runtime); - auto getName = throwable->getClass() - ->getClass() - ->getMethod()>("getName"); - auto getMessage = - throwable->getClass()->getMethod()>( - "getMessage"); - auto message = getMessage(throwable)->toStdString(); - cause.setProperty( - runtime, "name", getName(throwable->getClass())->toStdString()); + auto name = throwable->getClass()->getCanonicalName()->toStdString(); + auto message = throwable->getMessage()->toStdString(); + cause.setProperty(runtime, "name", name); cause.setProperty(runtime, "message", message); cause.setProperty(runtime, "stackElements", std::move(stackElements)); diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec index 8824ba73561bf3..00f5c923fe3dcc 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec @@ -37,7 +37,7 @@ Pod::Spec.new do |s| "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", "GCC_WARN_PEDANTIC" => "YES" } if ENV['USE_FRAMEWORKS'] - s.header_mappings_dir = './' + s.header_mappings_dir = File.absolute_path('./') end s.source_files = "ReactCommon/**/*.{mm,cpp,h}" diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h index 4d0872fbab4a69..1ef120d83dced6 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h @@ -9,6 +9,7 @@ #import +#import #import #import #import @@ -16,8 +17,6 @@ #import #import "RCTTurboModule.h" -RCT_EXTERN void RCTTurboModuleSetBindingMode(facebook::react::TurboModuleBindingMode bindingMode); - @protocol RCTTurboModuleManagerDelegate /** @@ -59,15 +58,12 @@ RCT_EXTERN void RCTTurboModuleSetBindingMode(facebook::react::TurboModuleBinding delegate:(id)delegate jsInvoker:(std::shared_ptr)jsInvoker; -- (void)installJSBindings:(facebook::jsi::Runtime &)runtime; - -/** - * @deprecated: use installJSBindings instead - */ -- (void)installJSBindingWithRuntimeExecutor:(facebook::react::RuntimeExecutor &)runtimeExecutor; +- (instancetype)initWithBridgeProxy:(RCTBridgeProxy *)bridgeProxy + bridgeModuleDecorator:(RCTBridgeModuleDecorator *)bridgeModuleDecorator + delegate:(id)delegate + jsInvoker:(std::shared_ptr)jsInvoker; -// TODO: Should we move this into the initializer? -- (void)setBridgeProxy:(RCTBridgeProxy *)bridgeProxy; +- (void)installJSBindings:(facebook::jsi::Runtime &)runtime; - (void)invalidate; diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm index efb232fa13420e..c1659d80fa81f2 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm @@ -33,12 +33,6 @@ using namespace facebook; using namespace facebook::react; -static TurboModuleBindingMode sTurboModuleBindingMode = TurboModuleBindingMode::HostObject; -void RCTTurboModuleSetBindingMode(TurboModuleBindingMode bindingMode) -{ - sTurboModuleBindingMode = bindingMode; -} - /** * A global variable whose address we use to associate method queues to id objects. */ @@ -159,6 +153,16 @@ void invokeSync(const std::string &methodName, std::function &&work) ove ModuleNativeMethodCallInvoker::invokeSync(methodName, std::move(work)); } }; + +bool isTurboModuleClass(Class cls) +{ + return [cls conformsToProtocol:@protocol(RCTTurboModule)]; +} + +bool isTurboModuleInstance(id module) +{ + return isTurboModuleClass([module class]); +} } // Fallback lookup since RCT class prefix is sometimes stripped in the existing NativeModule system. @@ -201,9 +205,12 @@ @implementation RCTTurboModuleManager { NSDictionary *_legacyEagerlyRegisteredModuleClasses; RCTBridgeProxy *_bridgeProxy; + RCTBridgeModuleDecorator *_bridgeModuleDecorator; } - (instancetype)initWithBridge:(RCTBridge *)bridge + bridgeProxy:(RCTBridgeProxy *)bridgeProxy + bridgeModuleDecorator:(RCTBridgeModuleDecorator *)bridgeModuleDecorator delegate:(id)delegate jsInvoker:(std::shared_ptr)jsInvoker { @@ -211,6 +218,8 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge _jsInvoker = std::move(jsInvoker); _delegate = delegate; _bridge = bridge; + _bridgeProxy = bridgeProxy; + _bridgeModuleDecorator = bridgeModuleDecorator; _invalidating = false; if (RCTTurboModuleInteropEnabled()) { @@ -218,7 +227,7 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge if ([_delegate respondsToSelector:@selector(extraModulesForBridge:)]) { for (id module in [_delegate extraModulesForBridge:nil]) { - if (!RCT_IS_TURBO_MODULE_INSTANCE(module)) { + if (!isTurboModuleInstance(module)) { [legacyInitializedModules setObject:module forKey:RCTBridgeModuleNameForClass([module class])]; } } @@ -227,7 +236,7 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge NSMutableDictionary *legacyEagerlyRegisteredModuleClasses = [NSMutableDictionary new]; for (Class moduleClass in RCTGetModuleClasses()) { - if (!RCT_IS_TURBO_MODULE_CLASS(moduleClass)) { + if (!isTurboModuleClass(moduleClass)) { [legacyEagerlyRegisteredModuleClasses setObject:moduleClass forKey:RCTBridgeModuleNameForClass(moduleClass)]; } } @@ -237,32 +246,36 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bridgeWillInvalidateModules:) name:RCTBridgeWillInvalidateModulesNotification - object:_bridge.parentBridge]; + object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bridgeDidInvalidateModules:) name:RCTBridgeDidInvalidateModulesNotification - object:_bridge.parentBridge]; + object:nil]; } return self; } -- (void)setBridgeProxy:(RCTBridgeProxy *)bridgeProxy +- (instancetype)initWithBridge:(RCTBridge *)bridge + delegate:(id)delegate + jsInvoker:(std::shared_ptr)jsInvoker { - _bridgeProxy = bridgeProxy; + return [self initWithBridge:bridge + bridgeProxy:nil + bridgeModuleDecorator:[bridge bridgeModuleDecorator] + delegate:delegate + jsInvoker:jsInvoker]; } -- (void)notifyAboutTurboModuleSetup:(const char *)name +- (instancetype)initWithBridgeProxy:(RCTBridgeProxy *)bridgeProxy + bridgeModuleDecorator:(RCTBridgeModuleDecorator *)bridgeModuleDecorator + delegate:(id)delegate + jsInvoker:(std::shared_ptr)jsInvoker { - NSString *moduleName = [[NSString alloc] initWithUTF8String:name]; - if (moduleName) { - int64_t setupTime = [self->_bridge.performanceLogger durationForTag:RCTPLTurboModuleSetup]; - [[NSNotificationCenter defaultCenter] postNotificationName:RCTDidSetupModuleNotification - object:nil - userInfo:@{ - RCTDidSetupModuleNotificationModuleNameKey : moduleName, - RCTDidSetupModuleNotificationSetupTimeKey : @(setupTime) - }]; - } + return [self initWithBridge:nil + bridgeProxy:bridgeProxy + bridgeModuleDecorator:bridgeModuleDecorator + delegate:delegate + jsInvoker:jsInvoker]; } /** @@ -438,8 +451,7 @@ - (BOOL)_isTurboModule:(const char *)moduleName } Class moduleClass = [self _getModuleClassFromName:moduleName]; - return moduleClass != nil && - (RCT_IS_TURBO_MODULE_CLASS(moduleClass) && ![moduleClass isSubclassOfClass:RCTCxxModule.class]); + return moduleClass != nil && (isTurboModuleClass(moduleClass) && ![moduleClass isSubclassOfClass:RCTCxxModule.class]); } - (BOOL)_isLegacyModule:(const char *)moduleName @@ -458,8 +470,7 @@ - (BOOL)_isLegacyModuleClass:(Class)moduleClass return YES; } - return moduleClass != nil && - (!RCT_IS_TURBO_MODULE_CLASS(moduleClass) || [moduleClass isSubclassOfClass:RCTCxxModule.class]); + return moduleClass != nil && (!isTurboModuleClass(moduleClass) || [moduleClass isSubclassOfClass:RCTCxxModule.class]); } - (ModuleHolder *)_getOrCreateModuleHolder:(const char *)moduleName @@ -712,8 +723,8 @@ - (BOOL)_shouldCreateObjCModule:(Class)moduleClass /** * Decorate NativeModules with bridgeless-compatible APIs that call into the bridge. */ - if (_bridge) { - [_bridge attachBridgeAPIsToObjCModule:module]; + if (_bridgeModuleDecorator) { + [_bridgeModuleDecorator attachInteropAPIsToModule:module]; } /** @@ -783,9 +794,25 @@ - (Class)_getModuleClassFromName:(const char *)moduleName moduleClass = [_delegate getModuleClassFromName:moduleName]; } - if (!moduleClass) { - moduleClass = getFallbackClassFromName(moduleName); + if (moduleClass != nil) { + return moduleClass; } + + moduleClass = getFallbackClassFromName(moduleName); + if (moduleClass != nil) { + return moduleClass; + } + + // fallback on modules registered throught RCT_EXPORT_MODULE with custom names + NSString *objcModuleName = [NSString stringWithUTF8String:moduleName]; + NSArray *modules = RCTGetModuleClasses(); + for (Class current in modules) { + NSString *currentModuleName = [current moduleName]; + if ([objcModuleName isEqualToString:currentModuleName]) { + return current; + } + } + return moduleClass; } @@ -894,7 +921,6 @@ - (void)installJSBindings:(facebook::jsi::Runtime &)runtime if (moduleWasNotInitialized && [self moduleIsInitialized:moduleName]) { [self->_bridge.performanceLogger markStopForTag:RCTPLTurboModuleSetup]; - [self notifyAboutTurboModuleSetup:moduleName]; } if (turboModule) { @@ -910,7 +936,6 @@ - (void)installJSBindings:(facebook::jsi::Runtime &)runtime auto moduleName = name.c_str(); TurboModulePerfLogger::moduleJSRequireBeginningStart(moduleName); - auto moduleWasNotInitialized = ![self moduleIsInitialized:moduleName]; /** * By default, all TurboModules are long-lived. @@ -919,10 +944,6 @@ - (void)installJSBindings:(facebook::jsi::Runtime &)runtime */ auto turboModule = [self provideLegacyModule:moduleName]; - if (moduleWasNotInitialized && [self moduleIsInitialized:moduleName]) { - [self notifyAboutTurboModuleSetup:moduleName]; - } - if (turboModule) { TurboModulePerfLogger::moduleJSRequireEndingEnd(moduleName); } else { @@ -931,21 +952,9 @@ - (void)installJSBindings:(facebook::jsi::Runtime &)runtime return turboModule; }; - TurboModuleBinding::install( - runtime, sTurboModuleBindingMode, std::move(turboModuleProvider), std::move(legacyModuleProvider)); + TurboModuleBinding::install(runtime, std::move(turboModuleProvider), std::move(legacyModuleProvider)); } else { - TurboModuleBinding::install(runtime, sTurboModuleBindingMode, std::move(turboModuleProvider)); - } -} - -/** - * @deprecated: use installJSBindings instead - */ -- (void)installJSBindingWithRuntimeExecutor:(facebook::react::RuntimeExecutor &)runtimeExecutor -{ - // jsi::Runtime doesn't exist when attached to Chrome debugger. - if (runtimeExecutor) { - runtimeExecutor([self](facebook::jsi::Runtime &runtime) { [self installJSBindings:runtime]; }); + TurboModuleBinding::install(runtime, std::move(turboModuleProvider)); } } diff --git a/packages/react-native/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec b/packages/react-native/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec index ddccfded01041d..f1143cea212b40 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec @@ -37,7 +37,7 @@ Pod::Spec.new do |s| "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", "GCC_WARN_PEDANTIC" => "YES" } if ENV['USE_FRAMEWORKS'] - s.header_mappings_dir = './' + s.header_mappings_dir = File.absolute_path('./') end diff --git a/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponentState.h b/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleLegacyModule.h similarity index 50% rename from packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponentState.h rename to packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleLegacyModule.h index 665fb802abc3fb..0f1e4ff55926e8 100644 --- a/packages/react-native/Libraries/SurfaceBackedComponent/RCTSurfaceBackedComponentState.h +++ b/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleLegacyModule.h @@ -7,12 +7,10 @@ #import -@protocol RCTSurfaceProtocol; - -@interface RCTSurfaceBackedComponentState : NSObject - -@property (atomic, readonly, strong) id surface; - -+ (instancetype)newWithSurface:(id)surface; +#import +#import +#import +#import +@interface RCTSampleLegacyModule : NSObject @end diff --git a/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleLegacyModule.mm b/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleLegacyModule.mm new file mode 100644 index 00000000000000..5613f858cf4d9a --- /dev/null +++ b/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleLegacyModule.mm @@ -0,0 +1,222 @@ +/* + * 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. + */ + +#import "RCTSampleLegacyModule.h" + +@implementation RCTSampleLegacyModule { + RCTBridge *_bridge; +} + +// Backward-compatible export +RCT_EXPORT_MODULE() + +// Backward-compatible queue configuration ++ (BOOL)requiresMainQueueSetup +{ + return YES; +} + +- (void)setBridge:(RCTBridge *)bridge +{ + _bridge = bridge; +} + +- (dispatch_queue_t)methodQueue +{ + return dispatch_get_main_queue(); +} + +// Backward compatible invalidation +- (void)invalidate +{ + // Actually do nothing here. + NSLog(@"Invalidating RCTSampleTurboModule..."); +} + +- (NSDictionary *)getConstants +{ + __block NSDictionary *constants; + RCTUnsafeExecuteOnMainQueueSync(^{ + constants = @{ + @"const1" : @YES, + @"const2" : @(390), + @"const3" : @"something", + }; + }); + + return constants; +} + +// TODO: Remove once fully migrated to TurboModule. +- (NSDictionary *)constantsToExport +{ + return [self getConstants]; +} + +RCT_EXPORT_METHOD(voidFunc) +{ + // Nothing to do +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getBool : (BOOL)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getEnum : (double)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getNumber : (double)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getFloat : (float)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getInt : (int)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getLongLong : (int64_t)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getUnsignedLongLong : (uint64_t)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getNSInteger : (NSInteger)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getNSUInteger : (NSUInteger)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSArray> *, getArray : (NSArray *)arg) +{ + return arg; +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSDictionary *, getObject : (NSDictionary *)arg) +{ + return arg; +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSString *, getString : (NSString *)arg) +{ + return arg; +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getNSNumber : (nonnull NSNumber *)arg) +{ + return arg; +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSDictionary *, getUnsafeObject : (NSDictionary *)arg) +{ + return arg; +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getRootTag : (double)arg) +{ + return @(arg); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSDictionary *, getValue : (double)x y : (NSString *)y z : (NSDictionary *)z) +{ + return @{ + @"x" : @(x), + @"y" : y ?: [NSNull null], + @"z" : z ?: [NSNull null], + }; +} + +RCT_EXPORT_METHOD(getValueWithCallback : (RCTResponseSenderBlock)callback) +{ + if (!callback) { + return; + } + callback(@[ @"value from callback!" ]); +} + +RCT_EXPORT_METHOD(getValueWithPromise + : (BOOL)error resolve + : (RCTPromiseResolveBlock)resolve reject + : (RCTPromiseRejectBlock)reject) +{ + if (!resolve || !reject) { + return; + } + + if (error) { + reject( + @"code_1", + @"intentional promise rejection", + [NSError errorWithDomain:@"RCTSampleTurboModule" code:1 userInfo:nil]); + } else { + resolve(@"result!"); + } +} + +RCT_EXPORT_METHOD(voidFuncThrows) +{ + NSException *myException = [NSException exceptionWithName:@"Excepption" + reason:@"Intentional exception from ObjC voidFuncThrows" + userInfo:nil]; + @throw myException; +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSDictionary *, getObjectThrows : (NSDictionary *)arg) +{ + NSException *myException = [NSException exceptionWithName:@"Excepption" + reason:@"Intentional exception from ObjC getObjectThrows" + userInfo:nil]; + @throw myException; +} + +RCT_EXPORT_METHOD(promiseThrows + : (BOOL)error resolve + : (RCTPromiseResolveBlock)resolve reject + : (RCTPromiseRejectBlock)reject) +{ + NSException *myException = [NSException exceptionWithName:@"Excepption" + reason:@"Intentional exception from ObjC promiseThrows" + userInfo:nil]; + @throw myException; +} + +RCT_EXPORT_METHOD(voidFuncAssert) +{ + RCTAssert(false, @"Intentional assert from ObjC voidFuncAssert"); +} + +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSDictionary *, getObjectAssert : (NSDictionary *)arg) +{ + RCTAssert(false, @"Intentional assert from ObjC getObjectAssert"); + return arg; +} + +RCT_EXPORT_METHOD(promiseAssert + : (BOOL)error resolve + : (RCTPromiseResolveBlock)resolve reject + : (RCTPromiseRejectBlock)reject) +{ + RCTAssert(false, @"Intentional assert from ObjC promiseAssert"); +} + +@end diff --git a/packages/react-native/ReactCommon/react/renderer/animations/LayoutAnimationKeyFrameManager.cpp b/packages/react-native/ReactCommon/react/renderer/animations/LayoutAnimationKeyFrameManager.cpp index 34aed3a676046f..71df612c864c89 100644 --- a/packages/react-native/ReactCommon/react/renderer/animations/LayoutAnimationKeyFrameManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animations/LayoutAnimationKeyFrameManager.cpp @@ -467,8 +467,7 @@ LayoutAnimationKeyFrameManager::pullTransaction( if (baselineShadowView.traits.check( ShadowNodeTraits::Trait::ViewKind)) { - auto const &viewProps = - *std::static_pointer_cast(props); + const auto &viewProps = static_cast(*props); const_cast(viewProps).opacity = 0; } @@ -489,8 +488,7 @@ LayoutAnimationKeyFrameManager::pullTransaction( .cloneProps(propsParserContext, viewStart.props, {}); if (baselineShadowView.traits.check( ShadowNodeTraits::Trait::ViewKind)) { - auto const &viewProps = - *std::static_pointer_cast(props); + const auto &viewProps = static_cast(*props); const_cast(viewProps).transform = Transform::Scale(isScaleX ? 0 : 1, isScaleY ? 0 : 1, 1); } @@ -590,8 +588,8 @@ LayoutAnimationKeyFrameManager::pullTransaction( if (baselineShadowView.traits.check( ShadowNodeTraits::Trait::ViewKind)) { - auto const &viewProps = - *std::static_pointer_cast(props); + const auto &viewProps = + static_cast(*props); const_cast(viewProps).opacity = 0; } @@ -615,8 +613,8 @@ LayoutAnimationKeyFrameManager::pullTransaction( if (baselineShadowView.traits.check( ShadowNodeTraits::Trait::ViewKind)) { - auto const &viewProps = - *std::static_pointer_cast(props); + const auto &viewProps = + static_cast(*props); const_cast(viewProps).transform = Transform::Scale(isScaleX ? 0 : 1, isScaleY ? 0 : 1, 1); } diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/AttributedString.cpp b/packages/react-native/ReactCommon/react/renderer/attributedstring/AttributedString.cpp index b244d11b096e83..a9c71bfe25862e 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/AttributedString.cpp +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/AttributedString.cpp @@ -17,7 +17,12 @@ using Fragments = AttributedString::Fragments; #pragma mark - Fragment std::string Fragment::AttachmentCharacter() { - return u8"\uFFFC"; // Unicode `OBJECT REPLACEMENT CHARACTER` + // C++20 makes char8_t a distinct type from char, and u8 string literals + // consist of char8_t instead of char, which in turn requires std::u8string, + // etc. Here we were assuming char was UTF-8 anyway, so just cast to that + // (which is valid because char* is allowed to alias anything). + return reinterpret_cast( + u8"\uFFFC"); // Unicode `OBJECT REPLACEMENT CHARACTER` } bool Fragment::isAttachment() const { diff --git a/packages/react-native/ReactCommon/react/renderer/componentregistry/native/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/componentregistry/native/CMakeLists.txt index fabef78d62f02d..ea49c8984747e1 100644 --- a/packages/react-native/ReactCommon/react/renderer/componentregistry/native/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/componentregistry/native/CMakeLists.txt @@ -28,4 +28,5 @@ target_link_libraries(rrc_native react_render_core react_render_debug react_utils + callinvoker ) diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/components/image/CMakeLists.txt index 9e5e0989e3298f..cb7dcae7d6d3cf 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/components/image/CMakeLists.txt @@ -26,6 +26,7 @@ target_link_libraries(rrc_image glog_init jsi react_debug + react_utils react_render_core react_render_debug react_render_graphics diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h index ae8040185efa46..2feb6c9719b7ef 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h @@ -27,12 +27,11 @@ class ImageComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - auto imageShadowNode = - std::static_pointer_cast(shadowNode); + auto &imageShadowNode = static_cast(*shadowNode); // `ImageShadowNode` uses `ImageManager` to initiate image loading and // communicate the loading state and results to mounting layer. - imageShadowNode->setImageManager(imageManager_); + imageShadowNode.setImageManager(imageManager_); } private: diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp index 5598746faa9f85..40de1421dd056e 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp @@ -7,8 +7,8 @@ #include #include -#include #include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h index 55d56df694b3e3..0ffc2f22a2ee23 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h @@ -46,7 +46,7 @@ class ImageShadowNode final : public ConcreteViewShadowNode< ShadowNodeFamily::Shared const & /*family*/, ComponentDescriptor const &componentDescriptor) { auto imageSource = ImageSource{ImageSource::Type::Invalid}; - return {imageSource, {imageSource, nullptr}, 0}; + return {imageSource, {imageSource, nullptr, {}}, 0}; } #pragma mark - LayoutableShadowNode diff --git a/packages/react-native/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h index 5f2117fbc90dfd..695fe7bcbd5eb9 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h @@ -22,20 +22,17 @@ class InputAccessoryComponentDescriptor final using ConcreteComponentDescriptor::ConcreteComponentDescriptor; void adopt(ShadowNode::Unshared const &shadowNode) const override { - auto concreteShadowNode = - std::static_pointer_cast(shadowNode); + auto &layoutableShadowNode = + static_cast(*shadowNode); - auto layoutableShadowNode = - std::static_pointer_cast(concreteShadowNode); + auto &stateData = + static_cast( + *shadowNode->getState()) + .getData(); - auto state = - std::static_pointer_cast( - shadowNode->getState()); - auto stateData = state->getData(); - - layoutableShadowNode->setSize( + layoutableShadowNode.setSize( Size{stateData.viewportSize.width, stateData.viewportSize.height}); - layoutableShadowNode->setPositionType(YGPositionTypeAbsolute); + layoutableShadowNode.setPositionType(YGPositionTypeAbsolute); ConcreteComponentDescriptor::adopt(shadowNode); } diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm index 67846a6634291a..c8e2c07d0191e4 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm @@ -18,7 +18,7 @@ namespace facebook::react { -static std::string moduleNameFromComponentName(const std::string &componentName) +static std::string moduleNameFromComponentNameNoRCTPrefix(const std::string &componentName) { // TODO: remove FB specific code (T56174424) if (componentName == "StickerInputView") { @@ -45,12 +45,32 @@ return componentName + "Manager"; } - return "RCT" + componentName + "Manager"; + return componentName + "Manager"; } inline NSString *RCTNSStringFromString(const std::string &string) { - return [NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding]; + return [NSString stringWithUTF8String:string.c_str()]; +} + +static Class getViewManagerFromComponentName(const std::string &componentName) +{ + auto viewManagerName = moduleNameFromComponentNameNoRCTPrefix(componentName); + + // 1. Try to get the manager with the RCT prefix. + auto rctViewManagerName = "RCT" + viewManagerName; + Class viewManagerClass = NSClassFromString(RCTNSStringFromString(rctViewManagerName)); + if (viewManagerClass) { + return viewManagerClass; + } + + // 2. Try to get the manager without the prefix. + viewManagerClass = NSClassFromString(RCTNSStringFromString(viewManagerName)); + if (viewManagerClass) { + return viewManagerClass; + } + + return nil; } static std::shared_ptr const constructCoordinator( @@ -58,9 +78,8 @@ ComponentDescriptor::Flavor const &flavor) { auto componentName = *std::static_pointer_cast(flavor); - auto moduleName = moduleNameFromComponentName(componentName); - Class module = NSClassFromString(RCTNSStringFromString(moduleName)); - assert(module); + Class viewManagerClass = getViewManagerFromComponentName(componentName); + assert(viewManagerClass); auto optionalBridge = contextContainer->find>("Bridge"); RCTBridge *bridge; if (optionalBridge) { @@ -79,7 +98,7 @@ bridgeModuleDecorator = unwrapManagedObject(optionalModuleDecorator.value()); } - RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:module + RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:viewManagerClass bridge:bridge eventDispatcher:eventDispatcher]; return wrapManagedObject([[RCTLegacyViewManagerInteropCoordinator alloc] @@ -101,7 +120,7 @@ ComponentName LegacyViewManagerInteropComponentDescriptor::getComponentName() const { - return std::static_pointer_cast(this->flavor_)->c_str(); + return static_cast(flavor_.get())->c_str(); } void LegacyViewManagerInteropComponentDescriptor::adopt(ShadowNode::Unshared const &shadowNode) const @@ -109,11 +128,11 @@ ConcreteComponentDescriptor::adopt(shadowNode); assert(std::dynamic_pointer_cast(shadowNode)); - auto legacyViewManagerInteropShadowNode = std::static_pointer_cast(shadowNode); + auto &legacyViewManagerInteropShadowNode = static_cast(*shadowNode); auto state = LegacyViewManagerInteropState{}; state.coordinator = _coordinator; - legacyViewManagerInteropShadowNode->setStateData(std::move(state)); + legacyViewManagerInteropShadowNode.setStateData(std::move(state)); } } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h index 0e226c6e90c8b6..05e8a977b97360 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h @@ -38,6 +38,10 @@ typedef void (^InterceptorBlock)(std::string eventName, folly::dynamic event); reactTag:(NSInteger)tag paperView:(UIView *)paperView; +- (void)removeViewFromRegistryWithTag:(NSInteger)tag; + +- (void)addViewToRegistry:(UIView *)view withTag:(NSInteger)tag; + @end NS_ASSUME_NONNULL_END diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.mm b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.mm index 5b22004daf1cc0..d1b0bfff4fcb9f 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.mm +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.mm @@ -131,22 +131,19 @@ - (void)handleCommand:(NSString *)commandName NSArray *newArgs = [@[ [NSNumber numberWithInteger:tag] ] arrayByAddingObjectsFromArray:args]; if (_bridge) { - [self _addViewToRegistry:paperView withTag:tag]; [_bridge.batchedBridge dispatchBlock:^{ [method invokeWithBridge:self->_bridge module:self->_componentData.manager arguments:newArgs]; [self->_bridge.uiManager setNeedsLayout]; } queue:RCTGetUIManagerQueue()]; - [self _removeViewFromRegistryWithTag:tag]; } else { // TODO T86826778 - Figure out which queue this should be dispatched to. [method invokeWithBridge:nil module:self->_componentData.manager arguments:newArgs]; } } -#pragma mark - Private -- (void)_addViewToRegistry:(UIView *)view withTag:(NSInteger)tag +- (void)addViewToRegistry:(UIView *)view withTag:(NSInteger)tag { [self _addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { if ([viewRegistry objectForKey:@(tag)] != NULL) { @@ -158,7 +155,7 @@ - (void)_addViewToRegistry:(UIView *)view withTag:(NSInteger)tag }]; } -- (void)_removeViewFromRegistryWithTag:(NSInteger)tag +- (void)removeViewFromRegistryWithTag:(NSInteger)tag { [self _addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { if ([viewRegistry objectForKey:@(tag)] == NULL) { @@ -171,6 +168,8 @@ - (void)_removeViewFromRegistryWithTag:(NSInteger)tag }]; } +#pragma mark - Private + - (void)_addUIBlock:(RCTViewManagerUIBlock)block { __weak __typeof__(self) weakSelf = self; diff --git a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h index dbb7c40a9648ea..49300366e520c3 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h @@ -23,20 +23,16 @@ class ModalHostViewComponentDescriptor final using ConcreteComponentDescriptor::ConcreteComponentDescriptor; void adopt(ShadowNode::Unshared const &shadowNode) const override { - auto modalShadowNode = - std::static_pointer_cast(shadowNode); - - auto layoutableShadowNode = - std::static_pointer_cast(modalShadowNode); - - auto state = - std::static_pointer_cast( - shadowNode->getState()); - auto stateData = state->getData(); - - layoutableShadowNode->setSize( + auto &layoutableShadowNode = + static_cast(*shadowNode); + auto &stateData = + static_cast( + *shadowNode->getState()) + .getData(); + + layoutableShadowNode.setSize( Size{stateData.screenSize.width, stateData.screenSize.height}); - layoutableShadowNode->setPositionType(YGPositionTypeAbsolute); + layoutableShadowNode.setPositionType(YGPositionTypeAbsolute); ConcreteComponentDescriptor::adopt(shadowNode); } diff --git a/packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h index 6dc1ce41a1a59e..1f3fc051432dd9 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h @@ -29,17 +29,17 @@ class AndroidProgressBarComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - auto androidProgressBarShadowNode = - std::static_pointer_cast(shadowNode); + auto &androidProgressBarShadowNode = + static_cast(*shadowNode); // `AndroidProgressBarShadowNode` uses // `AndroidProgressBarMeasurementsManager` to provide measurements to Yoga. - androidProgressBarShadowNode->setAndroidProgressBarMeasurementsManager( + androidProgressBarShadowNode.setAndroidProgressBarMeasurementsManager( measurementsManager_); // All `AndroidProgressBarShadowNode`s must have leaf Yoga nodes with // properly setup measure function. - androidProgressBarShadowNode->enableMeasurement(); + androidProgressBarShadowNode.enableMeasurement(); } private: diff --git a/packages/react-native/ReactCommon/react/renderer/components/safeareaview/SafeAreaViewComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/safeareaview/SafeAreaViewComponentDescriptor.h index 09134eb9abde1f..b0b916b853bea7 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/safeareaview/SafeAreaViewComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/safeareaview/SafeAreaViewComponentDescriptor.h @@ -22,21 +22,13 @@ class SafeAreaViewComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { react_native_assert( std::dynamic_pointer_cast(shadowNode)); - auto safeAreaViewShadowNode = - std::static_pointer_cast(shadowNode); - - react_native_assert(std::dynamic_pointer_cast( - safeAreaViewShadowNode)); - auto layoutableShadowNode = - std::static_pointer_cast( - safeAreaViewShadowNode); - - auto state = - std::static_pointer_cast( - shadowNode->getState()); - auto stateData = state->getData(); - - layoutableShadowNode->setPadding(stateData.padding); + auto &layoutableShadowNode = + static_cast(*shadowNode); + auto &stateData = + static_cast( + *shadowNode->getState()) + .getData(); + layoutableShadowNode.setPadding(stateData.padding); ConcreteComponentDescriptor::adopt(shadowNode); } diff --git a/packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp index e60623e4900e02..87c7a5c6574223 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp @@ -8,9 +8,9 @@ #include "ScrollViewProps.h" #include -#include #include #include +#include #include @@ -319,6 +319,15 @@ ScrollViewProps::ScrollViewProps( rawProps, "scrollToOverflowEnabled", sourceProps.scrollToOverflowEnabled, + {})), + isInvertedVirtualizedList( + CoreFeatures::enablePropIteratorSetter + ? sourceProps.isInvertedVirtualizedList + : convertRawProp( + context, + rawProps, + "isInvertedVirtualizedList", + sourceProps.isInvertedVirtualizedList, {})) {} void ScrollViewProps::setProp( @@ -368,6 +377,7 @@ void ScrollViewProps::setProp( RAW_SET_PROP_SWITCH_CASE_BASIC(snapToEnd); RAW_SET_PROP_SWITCH_CASE_BASIC(contentInsetAdjustmentBehavior); RAW_SET_PROP_SWITCH_CASE_BASIC(scrollToOverflowEnabled); + RAW_SET_PROP_SWITCH_CASE_BASIC(isInvertedVirtualizedList); } } @@ -492,7 +502,11 @@ SharedDebugStringConvertibleList ScrollViewProps::getDebugProps() const { debugStringConvertibleItem( "snapToStart", snapToStart, defaultScrollViewProps.snapToStart), debugStringConvertibleItem( - "snapToEnd", snapToEnd, defaultScrollViewProps.snapToEnd)}; + "snapToEnd", snapToEnd, defaultScrollViewProps.snapToEnd), + debugStringConvertibleItem( + "isInvertedVirtualizedList", + snapToEnd, + defaultScrollViewProps.isInvertedVirtualizedList)}; } #endif diff --git a/packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h b/packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h index dea44da3af5d2b..72482e2002ec9d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h @@ -68,6 +68,7 @@ class ScrollViewProps final : public ViewProps { ContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior{ ContentInsetAdjustmentBehavior::Never}; bool scrollToOverflowEnabled{false}; + bool isInvertedVirtualizedList{false}; #pragma mark - DebugStringConvertible diff --git a/packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h index 5ce046bebe53ea..a2694a68dc9ad8 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h @@ -29,17 +29,17 @@ class AndroidSwitchComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - auto androidSwitchShadowNode = - std::static_pointer_cast(shadowNode); + auto &androidSwitchShadowNode = + static_cast(*shadowNode); // `AndroidSwitchShadowNode` uses `AndroidSwitchMeasurementsManager` to // provide measurements to Yoga. - androidSwitchShadowNode->setAndroidSwitchMeasurementsManager( + androidSwitchShadowNode.setAndroidSwitchMeasurementsManager( measurementsManager_); // All `AndroidSwitchShadowNode`s must have leaf Yoga nodes with properly // setup measure function. - androidSwitchShadowNode->enableMeasurement(); + androidSwitchShadowNode.enableMeasurement(); } private: diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp index 1d54aaf6829de7..248054b629e90b 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp @@ -8,10 +8,10 @@ #include "BaseTextProps.h" #include -#include #include #include #include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h index 3d76dc9306cc1f..85576b0f56c9d1 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h @@ -31,12 +31,11 @@ class ParagraphComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - auto paragraphShadowNode = - std::static_pointer_cast(shadowNode); + auto ¶graphShadowNode = static_cast(*shadowNode); // `ParagraphShadowNode` uses `TextLayoutManager` to measure text content // and communicate text rendering metrics to mounting layer. - paragraphShadowNode->setTextLayoutManager(textLayoutManager_); + paragraphShadowNode.setTextLayoutManager(textLayoutManager_); } private: diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphLayoutManager.cpp b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphLayoutManager.cpp index 41720767d228f4..7dbd216892eb31 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphLayoutManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphLayoutManager.cpp @@ -7,7 +7,7 @@ #include "ParagraphLayoutManager.h" #include -#include +#include namespace facebook::react { @@ -42,20 +42,22 @@ bool ParagraphLayoutManager::shoudMeasureString( AttributedString const &attributedString, ParagraphAttributes const ¶graphAttributes, LayoutConstraints layoutConstraints) const { - size_t newHash = folly::hash::hash_combine( - 0, - textAttributedStringHashLayoutWise(attributedString), - paragraphAttributes); + size_t newParagraphInputHash = + folly::hash::hash_combine(0, attributedString, paragraphAttributes); - if (newHash != paragraphInputHash_) { + if (newParagraphInputHash != paragraphInputHash_) { // AttributedString or ParagraphAttributes have changed. // Must create new host text storage and trigger measure. hostTextStorage_ = textLayoutManager_->getHostTextStorage( attributedString, paragraphAttributes, layoutConstraints); - paragraphInputHash_ = newHash; + paragraphInputHash_ = newParagraphInputHash; + return true; // Must measure again. } + // Detect the case when available width for Paragraph meaningfully changes. + // This is to prevent unnecessary re-creation of NSTextStorage on iOS. + // On Android, this is no-op. bool hasMaximumSizeChanged = layoutConstraints.maximumSize.width != lastAvailableWidth_; Float threshold = 0.01f; diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphProps.cpp index 242567dc4b6e63..be978655612902 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphProps.cpp @@ -9,9 +9,9 @@ #include #include -#include #include #include +#include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h index 0936994b5da60f..b44e8f416dc675 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h @@ -9,7 +9,6 @@ #include #include -#include #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h index 33f183d58e3738..7ea08be94c9589 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h @@ -84,52 +84,49 @@ class AndroidTextInputComponentDescriptor final protected: void adopt(ShadowNode::Unshared const &shadowNode) const override { - auto textInputShadowNode = - std::static_pointer_cast(shadowNode); + auto &textInputShadowNode = + static_cast(*shadowNode); // `ParagraphShadowNode` uses `TextLayoutManager` to measure text content // and communicate text rendering metrics to mounting layer. - textInputShadowNode->setTextLayoutManager(textLayoutManager_); + textInputShadowNode.setTextLayoutManager(textLayoutManager_); - textInputShadowNode->setContextContainer( + textInputShadowNode.setContextContainer( const_cast(getContextContainer().get())); - int surfaceId = textInputShadowNode->getSurfaceId(); + int surfaceId = textInputShadowNode.getSurfaceId(); if (surfaceIdToThemePaddingMap_.find(surfaceId) != surfaceIdToThemePaddingMap_.end()) { YGStyle::Edges theme = surfaceIdToThemePaddingMap_[surfaceId]; + auto &textInputProps = textInputShadowNode.getConcreteProps(); + // Override padding // Node is still unsealed during adoption, before layout is complete // TODO: T62959168 account for RTL and paddingLeft when setting default // paddingStart, and vice-versa with paddingRight/paddingEnd. // For now this assumes no RTL. - YGStyle::Edges result = - textInputShadowNode->getConcreteProps().yogaStyle.padding(); + YGStyle::Edges result = textInputProps.yogaStyle.padding(); bool changedPadding = false; - if (!textInputShadowNode->getConcreteProps().hasPadding && - !textInputShadowNode->getConcreteProps().hasPaddingStart && - !textInputShadowNode->getConcreteProps().hasPaddingLeft && - !textInputShadowNode->getConcreteProps().hasPaddingHorizontal) { + if (!textInputProps.hasPadding && !textInputProps.hasPaddingStart && + !textInputProps.hasPaddingLeft && + !textInputProps.hasPaddingHorizontal) { changedPadding = true; result[YGEdgeStart] = theme[YGEdgeStart]; } - if (!textInputShadowNode->getConcreteProps().hasPadding && - !textInputShadowNode->getConcreteProps().hasPaddingEnd && - !textInputShadowNode->getConcreteProps().hasPaddingRight && - !textInputShadowNode->getConcreteProps().hasPaddingHorizontal) { + if (!textInputProps.hasPadding && !textInputProps.hasPaddingEnd && + !textInputProps.hasPaddingRight && + !textInputProps.hasPaddingHorizontal) { changedPadding = true; result[YGEdgeEnd] = theme[YGEdgeEnd]; } - if (!textInputShadowNode->getConcreteProps().hasPadding && - !textInputShadowNode->getConcreteProps().hasPaddingTop && - !textInputShadowNode->getConcreteProps().hasPaddingVertical) { + if (!textInputProps.hasPadding && !textInputProps.hasPaddingTop && + !textInputProps.hasPaddingVertical) { changedPadding = true; result[YGEdgeTop] = theme[YGEdgeTop]; } - if (!textInputShadowNode->getConcreteProps().hasPadding && - !textInputShadowNode->getConcreteProps().hasPaddingBottom && - !textInputShadowNode->getConcreteProps().hasPaddingVertical) { + if (!textInputProps.hasPadding && !textInputProps.hasPaddingBottom && + !textInputProps.hasPaddingVertical) { changedPadding = true; result[YGEdgeBottom] = theme[YGEdgeBottom]; } @@ -139,16 +136,14 @@ class AndroidTextInputComponentDescriptor final // paddingLeft update, we must explicitly unset paddingStart... (same with // paddingEnd) // TODO: support RTL - if ((textInputShadowNode->getConcreteProps().hasPadding || - textInputShadowNode->getConcreteProps().hasPaddingLeft || - textInputShadowNode->getConcreteProps().hasPaddingHorizontal) && - !textInputShadowNode->getConcreteProps().hasPaddingStart) { + if ((textInputProps.hasPadding || textInputProps.hasPaddingLeft || + textInputProps.hasPaddingHorizontal) && + !textInputProps.hasPaddingStart) { result[YGEdgeStart] = YGValueUndefined; } - if ((textInputShadowNode->getConcreteProps().hasPadding || - textInputShadowNode->getConcreteProps().hasPaddingRight || - textInputShadowNode->getConcreteProps().hasPaddingHorizontal) && - !textInputShadowNode->getConcreteProps().hasPaddingEnd) { + if ((textInputProps.hasPadding || textInputProps.hasPaddingRight || + textInputProps.hasPaddingHorizontal) && + !textInputProps.hasPaddingEnd) { result[YGEdgeEnd] = YGValueUndefined; } @@ -157,16 +152,15 @@ class AndroidTextInputComponentDescriptor final // commit, state update, etc, will incur this cost. if (changedPadding) { // Set new props on node - const_cast( - textInputShadowNode->getConcreteProps()) + const_cast(textInputProps) .yogaStyle.padding() = result; // Communicate new props to Yoga part of the node - textInputShadowNode->updateYogaProps(); + textInputShadowNode.updateYogaProps(); } } - textInputShadowNode->dirtyLayout(); - textInputShadowNode->enableMeasurement(); + textInputShadowNode.dirtyLayout(); + textInputShadowNode.enableMeasurement(); ConcreteComponentDescriptor::adopt(shadowNode); } diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputProps.cpp index 9953e2228ed24f..07ed9defdb3c08 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputProps.cpp @@ -7,9 +7,9 @@ #include "AndroidTextInputProps.h" #include -#include #include #include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/iostextinput/react/renderer/components/iostextinput/TextInputComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/textinput/iostextinput/react/renderer/components/iostextinput/TextInputComponentDescriptor.h index c1a900be843e5f..224c7703fe7ebf 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/iostextinput/react/renderer/components/iostextinput/TextInputComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/iostextinput/react/renderer/components/iostextinput/TextInputComponentDescriptor.h @@ -28,10 +28,8 @@ class TextInputComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - auto concreteShadowNode = - std::static_pointer_cast(shadowNode); - - concreteShadowNode->setTextLayoutManager(textLayoutManager_); + auto &concreteShadowNode = static_cast(*shadowNode); + concreteShadowNode.setTextLayoutManager(textLayoutManager_); } private: diff --git a/packages/react-native/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp b/packages/react-native/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp index 5fd1a4ba9cb4bf..b0420504ef4262 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp @@ -15,7 +15,7 @@ ComponentHandle UnimplementedViewComponentDescriptor::getComponentHandle() } ComponentName UnimplementedViewComponentDescriptor::getComponentName() const { - return std::static_pointer_cast(this->flavor_)->c_str(); + return static_cast(flavor_.get())->c_str(); } Props::Shared UnimplementedViewComponentDescriptor::cloneProps( @@ -32,7 +32,7 @@ Props::Shared UnimplementedViewComponentDescriptor::cloneProps( emptyRawProps.parse(rawPropsParser_, context); auto unimplementedViewProps = std::make_shared( context, - *std::static_pointer_cast(clonedProps), + static_cast(*clonedProps), emptyRawProps); unimplementedViewProps->setComponentName(getComponentName()); diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp index d9ebf62e9b5330..45d5460d9d0923 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp @@ -9,9 +9,9 @@ #include #include -#include #include #include +#include namespace facebook::react { @@ -260,7 +260,7 @@ void AccessibilityProps::setProp( #if RN_DEBUG_STRING_CONVERTIBLE SharedDebugStringConvertibleList AccessibilityProps::getDebugProps() const { - auto const &defaultProps = AccessibilityProps(); + const auto &defaultProps = AccessibilityProps(); return SharedDebugStringConvertibleList{ debugStringConvertibleItem("testId", testId, defaultProps.testId), }; diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.cpp index 09fa5c9b0a6ba7..d3b749ee840a6c 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.cpp @@ -9,6 +9,45 @@ namespace facebook::react { +jsi::Value PointerEvent::asJSIValue(jsi::Runtime &runtime) const { + auto object = jsi::Object(runtime); + object.setProperty(runtime, "pointerId", this->pointerId); + object.setProperty(runtime, "pressure", this->pressure); + object.setProperty(runtime, "pointerType", this->pointerType); + object.setProperty(runtime, "clientX", this->clientPoint.x); + object.setProperty(runtime, "clientY", this->clientPoint.y); + // x/y are an alias to clientX/Y + object.setProperty(runtime, "x", this->clientPoint.x); + object.setProperty(runtime, "y", this->clientPoint.y); + // since RN doesn't have a scrollable root, pageX/Y will always equal + // clientX/Y + object.setProperty(runtime, "pageX", this->clientPoint.x); + object.setProperty(runtime, "pageY", this->clientPoint.y); + object.setProperty(runtime, "screenX", this->screenPoint.x); + object.setProperty(runtime, "screenY", this->screenPoint.y); + object.setProperty(runtime, "offsetX", this->offsetPoint.x); + object.setProperty(runtime, "offsetY", this->offsetPoint.y); + object.setProperty(runtime, "width", this->width); + object.setProperty(runtime, "height", this->height); + object.setProperty(runtime, "tiltX", this->tiltX); + object.setProperty(runtime, "tiltY", this->tiltY); + object.setProperty(runtime, "detail", this->detail); + object.setProperty(runtime, "buttons", this->buttons); + object.setProperty(runtime, "tangentialPressure", this->tangentialPressure); + object.setProperty(runtime, "twist", this->twist); + object.setProperty(runtime, "ctrlKey", this->ctrlKey); + object.setProperty(runtime, "shiftKey", this->shiftKey); + object.setProperty(runtime, "altKey", this->altKey); + object.setProperty(runtime, "metaKey", this->metaKey); + object.setProperty(runtime, "isPrimary", this->isPrimary); + object.setProperty(runtime, "button", this->button); + return object; +} + +EventPayloadType PointerEvent::getType() const { + return EventPayloadType::PointerEvent; +} + #if RN_DEBUG_STRING_CONVERTIBLE std::string getDebugName(PointerEvent const & /*pointerEvent*/) { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.h b/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.h index 03ad6a1699b5be..cf71de0281eaf2 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.h @@ -7,13 +7,14 @@ #pragma once +#include #include #include #include namespace facebook::react { -struct PointerEvent { +struct PointerEvent : public EventPayload { /* * A unique identifier for the pointer causing the event. */ @@ -109,6 +110,12 @@ struct PointerEvent { * was fired. */ int button; + + /* + * EventPayload implementations + */ + jsi::Value asJSIValue(jsi::Runtime &runtime) const override; + EventPayloadType getType() const override; }; #if RN_DEBUG_STRING_CONVERTIBLE diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp index 747dedcf7dd3ae..661d9ac5073002 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp @@ -58,43 +58,6 @@ static jsi::Value touchEventPayload( return object; } -static jsi::Value pointerEventPayload( - jsi::Runtime &runtime, - PointerEvent const &event) { - auto object = jsi::Object(runtime); - object.setProperty(runtime, "pointerId", event.pointerId); - object.setProperty(runtime, "pressure", event.pressure); - object.setProperty(runtime, "pointerType", event.pointerType); - object.setProperty(runtime, "clientX", event.clientPoint.x); - object.setProperty(runtime, "clientY", event.clientPoint.y); - // x/y are an alias to clientX/Y - object.setProperty(runtime, "x", event.clientPoint.x); - object.setProperty(runtime, "y", event.clientPoint.y); - // since RN doesn't have a scrollable root, pageX/Y will always equal - // clientX/Y - object.setProperty(runtime, "pageX", event.clientPoint.x); - object.setProperty(runtime, "pageY", event.clientPoint.y); - object.setProperty(runtime, "screenX", event.screenPoint.x); - object.setProperty(runtime, "screenY", event.screenPoint.y); - object.setProperty(runtime, "offsetX", event.offsetPoint.x); - object.setProperty(runtime, "offsetY", event.offsetPoint.y); - object.setProperty(runtime, "width", event.width); - object.setProperty(runtime, "height", event.height); - object.setProperty(runtime, "tiltX", event.tiltX); - object.setProperty(runtime, "tiltY", event.tiltY); - object.setProperty(runtime, "detail", event.detail); - object.setProperty(runtime, "buttons", event.buttons); - object.setProperty(runtime, "tangentialPressure", event.tangentialPressure); - object.setProperty(runtime, "twist", event.twist); - object.setProperty(runtime, "ctrlKey", event.ctrlKey); - object.setProperty(runtime, "shiftKey", event.shiftKey); - object.setProperty(runtime, "altKey", event.altKey); - object.setProperty(runtime, "metaKey", event.metaKey); - object.setProperty(runtime, "isPrimary", event.isPrimary); - object.setProperty(runtime, "button", event.button); - return object; -} - void TouchEventEmitter::dispatchTouchEvent( std::string type, TouchEvent const &event, @@ -116,9 +79,7 @@ void TouchEventEmitter::dispatchPointerEvent( RawEvent::Category category) const { dispatchEvent( std::move(type), - [event](jsi::Runtime &runtime) { - return pointerEventPayload(runtime, event); - }, + std::make_shared(event), priority, category); } @@ -178,9 +139,7 @@ void TouchEventEmitter::onPointerDown(const PointerEvent &event) const { } void TouchEventEmitter::onPointerMove(const PointerEvent &event) const { - dispatchUniqueEvent("pointerMove", [event](jsi::Runtime &runtime) { - return pointerEventPayload(runtime, event); - }); + dispatchUniqueEvent("pointerMove", std::make_shared(event)); } void TouchEventEmitter::onPointerUp(const PointerEvent &event) const { @@ -223,4 +182,20 @@ void TouchEventEmitter::onPointerOut(const PointerEvent &event) const { RawEvent::Category::ContinuousStart); } +void TouchEventEmitter::onGotPointerCapture(const PointerEvent &event) const { + dispatchPointerEvent( + "gotPointerCapture", + event, + EventPriority::AsynchronousBatched, + RawEvent::Category::ContinuousStart); +} + +void TouchEventEmitter::onLostPointerCapture(const PointerEvent &event) const { + dispatchPointerEvent( + "lostPointerCapture", + event, + EventPriority::AsynchronousBatched, + RawEvent::Category::ContinuousEnd); +} + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.h b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.h index ad42dfa7674eac..ef2e11b95481a7 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.h @@ -38,6 +38,8 @@ class TouchEventEmitter : public EventEmitter { void onPointerLeave(PointerEvent const &event) const; void onPointerOver(PointerEvent const &event) const; void onPointerOut(PointerEvent const &event) const; + void onGotPointerCapture(PointerEvent const &event) const; + void onLostPointerCapture(PointerEvent const &event) const; private: void dispatchTouchEvent( diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/ViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/ViewProps.cpp index a269bc0e749160..900080e6646f89 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/ViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/ViewProps.cpp @@ -11,10 +11,10 @@ #include #include -#include #include #include #include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/ViewShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/ViewShadowNode.cpp index 2318f08e968269..98b87012855e0d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/ViewShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/ViewShadowNode.cpp @@ -8,7 +8,7 @@ #include "ViewShadowNode.h" #include #include -#include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp index 724a33ab4a3b80..79f294bef7647a 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp @@ -9,9 +9,9 @@ #include #include -#include #include #include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/primitives.h b/packages/react-native/ReactCommon/react/renderer/components/view/primitives.h index 04daf6e3367070..ac418daa87fef8 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/primitives.h @@ -21,7 +21,7 @@ namespace facebook::react { enum class PointerEventsMode : uint8_t { Auto, None, BoxNone, BoxOnly }; struct ViewEvents { - std::bitset<32> bits{}; + std::bitset<64> bits{}; enum class Offset : std::size_t { // Pointer events @@ -60,13 +60,15 @@ struct ViewEvents { PointerOutCapture = 29, Click = 30, ClickCapture = 31, + GotPointerCapture = 32, + LostPointerCapture = 33, }; constexpr bool operator[](const Offset offset) const { return bits[static_cast(offset)]; } - std::bitset<32>::reference operator[](const Offset offset) { + std::bitset<64>::reference operator[](const Offset offset) { return bits[static_cast(offset)]; } }; diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h index 704a00f404c6c9..6aabbf23835d97 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h @@ -616,6 +616,18 @@ static inline ViewEvents convertRawProp( "onClickCapture", sourceValue[Offset::ClickCapture], defaultValue[Offset::ClickCapture]); + result[Offset::GotPointerCapture] = convertRawProp( + context, + rawProps, + "onGotPointerCapture", + sourceValue[Offset::GotPointerCapture], + defaultValue[Offset::GotPointerCapture]); + result[Offset::LostPointerCapture] = convertRawProp( + context, + rawProps, + "onLostPointerCapture", + sourceValue[Offset::LostPointerCapture], + defaultValue[Offset::LostPointerCapture]); // PanResponder callbacks result[Offset::MoveShouldSetResponder] = convertRawProp( diff --git a/packages/react-native/ReactCommon/react/renderer/core/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/core/CMakeLists.txt index cbbaa6f1f3999e..c8786aa0099c4e 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/core/CMakeLists.txt @@ -23,6 +23,7 @@ target_link_libraries(react_render_core folly_runtime glog jsi + logger react_config react_debug react_render_debug diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h index 3315e745ab82d1..01ea9b1603ba87 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -21,6 +20,7 @@ #include #include #include +#include namespace facebook::react { @@ -87,11 +87,10 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { void appendChild( const ShadowNode::Shared &parentShadowNode, const ShadowNode::Shared &childShadowNode) const override { - auto concreteParentShadowNode = - std::static_pointer_cast(parentShadowNode); - auto concreteNonConstParentShadowNode = - std::const_pointer_cast(concreteParentShadowNode); - concreteNonConstParentShadowNode->appendChild(childShadowNode); + auto &concreteParentShadowNode = + static_cast(*parentShadowNode); + const_cast(concreteParentShadowNode) + .appendChild(childShadowNode); } virtual Props::Shared cloneProps( diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h index 640342d1965ff5..61fb3299cf78e8 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h @@ -49,7 +49,7 @@ class ConcreteState : public State { * Returns stored data. */ Data const &getData() const { - return *std::static_pointer_cast(data_); + return *static_cast(data_.get()); } /* @@ -90,7 +90,7 @@ class ConcreteState : public State { auto stateUpdate = StateUpdate{ family, [=](StateData::Shared const &oldData) -> StateData::Shared { react_native_assert(oldData); - return callback(*std::static_pointer_cast(oldData)); + return callback(*static_cast(oldData.get())); }}; family->dispatchRawState(std::move(stateUpdate), priority); diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp index 22a12a2ffb43fe..cf988ed287b96e 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp @@ -74,6 +74,18 @@ void EventEmitter::dispatchEvent( const ValueFactory &payloadFactory, EventPriority priority, RawEvent::Category category) const { + dispatchEvent( + std::move(type), + std::make_shared(payloadFactory), + priority, + category); +} + +void EventEmitter::dispatchEvent( + std::string type, + SharedEventPayload payload, + EventPriority priority, + RawEvent::Category category) const { SystraceSection s("EventEmitter::dispatchEvent", "type", type); auto eventDispatcher = eventDispatcher_.lock(); @@ -84,7 +96,7 @@ void EventEmitter::dispatchEvent( eventDispatcher->dispatchEvent( RawEvent( normalizeEventType(std::move(type)), - payloadFactory, + std::move(payload), eventTarget_, category), priority); @@ -93,6 +105,14 @@ void EventEmitter::dispatchEvent( void EventEmitter::dispatchUniqueEvent( std::string type, const ValueFactory &payloadFactory) const { + dispatchUniqueEvent( + std::move(type), + std::make_shared(payloadFactory)); +} + +void EventEmitter::dispatchUniqueEvent( + std::string type, + SharedEventPayload payload) const { SystraceSection s("EventEmitter::dispatchUniqueEvent"); auto eventDispatcher = eventDispatcher_.lock(); @@ -102,7 +122,7 @@ void EventEmitter::dispatchUniqueEvent( eventDispatcher->dispatchUniqueEvent(RawEvent( normalizeEventType(std::move(type)), - payloadFactory, + std::move(payload), eventTarget_, RawEvent::Category::Continuous)); } diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h index c02d605b43b77d..77b859cf266ead 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h @@ -12,9 +12,11 @@ #include #include +#include #include #include #include +#include namespace facebook::react { @@ -78,6 +80,12 @@ class EventEmitter { EventPriority priority = EventPriority::AsynchronousBatched, RawEvent::Category category = RawEvent::Category::Unspecified) const; + void dispatchEvent( + std::string type, + SharedEventPayload payload, + EventPriority priority = EventPriority::AsynchronousBatched, + RawEvent::Category category = RawEvent::Category::Unspecified) const; + void dispatchUniqueEvent(std::string type, const folly::dynamic &payload) const; @@ -86,6 +94,8 @@ class EventEmitter { const ValueFactory &payloadFactory = EventEmitter::defaultPayloadFactory()) const; + void dispatchUniqueEvent(std::string type, SharedEventPayload payload) const; + private: void toggleEventTargetOwnership_() const; diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventPayload.h b/packages/react-native/ReactCommon/react/renderer/core/EventPayload.h new file mode 100644 index 00000000000000..1d46c84f87bea3 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/core/EventPayload.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +#include + +namespace facebook::react { + +/** + * Abstract base class for all event payload types. + */ +struct EventPayload { + virtual ~EventPayload() = default; + + EventPayload() = default; + EventPayload(const EventPayload &) = default; + EventPayload &operator=(const EventPayload &) = default; + EventPayload(EventPayload &&) = default; + EventPayload &operator=(EventPayload &&) = default; + + virtual jsi::Value asJSIValue(jsi::Runtime &runtime) const = 0; + + /** + * Reports the type of the event payload for efficient downcasting. + * When adding a new EventPayload be sure to add a new type of it + * in `EventPayloadType` and return it from its overriden `getType()` method. + */ + virtual EventPayloadType getType() const = 0; +}; + +using SharedEventPayload = std::shared_ptr; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/NativeViewConfig/RCTNativeViewConfigProvider.h b/packages/react-native/ReactCommon/react/renderer/core/EventPayloadType.h similarity index 55% rename from packages/react-native/ReactCommon/react/bridgeless/platform/ios/NativeViewConfig/RCTNativeViewConfigProvider.h rename to packages/react-native/ReactCommon/react/renderer/core/EventPayloadType.h index 2f5c555581a294..35d1b6e56fef69 100644 --- a/packages/react-native/ReactCommon/react/bridgeless/platform/ios/NativeViewConfig/RCTNativeViewConfigProvider.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventPayloadType.h @@ -7,11 +7,8 @@ #pragma once -#include - namespace facebook::react { -/* - * Installs native view config provider into JavaScript runtime. - */ -void installNativeViewConfigProviderBinding(jsi::Runtime &runtime); -} // namespace facebook::react + +enum class EventPayloadType { ValueFactory, PointerEvent }; + +} diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventPipe.h b/packages/react-native/ReactCommon/react/renderer/core/EventPipe.h index 53d41488418d3e..a31bc54d5ad5c5 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventPipe.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventPipe.h @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -22,6 +23,6 @@ using EventPipe = std::function; + const EventPayload &payload)>; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp index 4ff9406f60bbe1..9ba86af056e8c4 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp @@ -6,6 +6,7 @@ */ #include +#include #include "EventEmitter.h" #include "EventLogger.h" #include "EventQueue.h" @@ -53,12 +54,18 @@ void EventQueueProcessor::flushEvents( eventLogger->onEventDispatch(event.loggingTag); } + if (event.eventPayload == nullptr) { + react_native_log_error( + "EventQueueProcessor: Unexpected null event payload"); + continue; + } + eventPipe_( runtime, event.eventTarget.get(), event.type, reactPriority, - event.payloadFactory); + *event.eventPayload); if (eventLogger != nullptr) { eventLogger->onEventEnd(event.loggingTag); diff --git a/packages/react-native/ReactCommon/react/renderer/core/Props.cpp b/packages/react-native/ReactCommon/react/renderer/core/Props.cpp index 6f62ff59b8fcce..a2f3ba5f9a0a2f 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/Props.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/Props.cpp @@ -8,8 +8,8 @@ #include "Props.h" #include -#include #include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp index 646ce4aea3ad86..d0fa7f28466974 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp @@ -11,11 +11,11 @@ namespace facebook::react { RawEvent::RawEvent( std::string type, - ValueFactory payloadFactory, + SharedEventPayload eventPayload, SharedEventTarget eventTarget, Category category) : type(std::move(type)), - payloadFactory(std::move(payloadFactory)), + eventPayload(std::move(eventPayload)), eventTarget(std::move(eventTarget)), category(category) {} diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h index d9ec02c796e79a..03a2f0857aa1a0 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h +++ b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h @@ -11,8 +11,8 @@ #include #include +#include #include -#include namespace facebook::react { @@ -60,12 +60,12 @@ struct RawEvent { RawEvent( std::string type, - ValueFactory payloadFactory, + SharedEventPayload eventPayload, SharedEventTarget eventTarget, Category category = Category::Unspecified); std::string type; - ValueFactory payloadFactory; + SharedEventPayload eventPayload; SharedEventTarget eventTarget; Category category; EventTag loggingTag{0}; diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawValue.h b/packages/react-native/ReactCommon/react/renderer/core/RawValue.h index 1107df54e05332..ffaa85042af384 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawValue.h +++ b/packages/react-native/ReactCommon/react/renderer/core/RawValue.h @@ -53,7 +53,7 @@ class RawValue { /* * Constructors. */ - RawValue() noexcept : dynamic_(nullptr){}; + RawValue() noexcept : dynamic_(nullptr) {} RawValue(RawValue &&other) noexcept : dynamic_(std::move(other.dynamic_)) {} @@ -72,9 +72,9 @@ class RawValue { /* * Arbitrary constructors are private only for RawProps and internal usage. */ - RawValue(const folly::dynamic &dynamic) noexcept : dynamic_(dynamic){}; + RawValue(const folly::dynamic &dynamic) noexcept : dynamic_(dynamic) {} - RawValue(folly::dynamic &&dynamic) noexcept : dynamic_(std::move(dynamic)){}; + RawValue(folly::dynamic &&dynamic) noexcept : dynamic_(std::move(dynamic)) {} /* * Copy constructor and copy assignment operator would be private and only for @@ -109,7 +109,7 @@ class RawValue { template bool hasType() const noexcept { return checkValueType(dynamic_, (T *)nullptr); - }; + } /* * Checks if the stored value is *not* `null`. diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp index ba8da5d6f1eda8..f8782c879f0c0a 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp @@ -227,9 +227,8 @@ void ShadowNode::appendChild(const ShadowNode::Shared &child) { ensureUnsealed(); cloneChildrenIfShared(); - auto nonConstChildren = - std::const_pointer_cast(children_); - nonConstChildren->push_back(child); + auto &children = const_cast(*children_); + children.push_back(child); child->family_->setParent(family_); } @@ -241,11 +240,9 @@ void ShadowNode::replaceChild( ensureUnsealed(); cloneChildrenIfShared(); - newChild->family_->setParent(family_); - auto &children = - *std::const_pointer_cast(children_); + auto &children = const_cast(*children_); auto size = children.size(); if (suggestedIndex != -1 && suggestedIndex < size) { diff --git a/packages/react-native/ReactCommon/react/renderer/core/StateData.h b/packages/react-native/ReactCommon/react/renderer/core/StateData.h index dcdcaf05e3abff..dafb6c3e98e43b 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/StateData.h +++ b/packages/react-native/ReactCommon/react/renderer/core/StateData.h @@ -26,7 +26,7 @@ struct StateData final { #ifdef ANDROID StateData() = default; - StateData(StateData const &previousState, folly::dynamic data){}; + StateData(StateData const &previousState, folly::dynamic data) {} folly::dynamic getDynamic() const; MapBuffer getMapBuffer() const; #endif diff --git a/packages/react-native/ReactCommon/react/renderer/core/ValueFactoryEventPayload.cpp b/packages/react-native/ReactCommon/react/renderer/core/ValueFactoryEventPayload.cpp new file mode 100644 index 00000000000000..3d13654910d48d --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/core/ValueFactoryEventPayload.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "ValueFactoryEventPayload.h" + +namespace facebook::react { + +ValueFactoryEventPayload::ValueFactoryEventPayload(ValueFactory factory) + : valueFactory_(std::move(factory)) {} + +jsi::Value ValueFactoryEventPayload::asJSIValue(jsi::Runtime &runtime) const { + return valueFactory_(runtime); +} + +EventPayloadType ValueFactoryEventPayload::getType() const { + return EventPayloadType::ValueFactory; +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/ValueFactoryEventPayload.h b/packages/react-native/ReactCommon/react/renderer/core/ValueFactoryEventPayload.h new file mode 100644 index 00000000000000..205929a8e020af --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/core/ValueFactoryEventPayload.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include + +namespace facebook::react { + +class ValueFactoryEventPayload : public EventPayload { + public: + explicit ValueFactoryEventPayload(ValueFactory factory); + jsi::Value asJSIValue(jsi::Runtime &runtime) const override; + EventPayloadType getType() const override; + + private: + ValueFactory valueFactory_; +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp b/packages/react-native/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp index e88013b9e555b6..3bc03bf1a39974 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -26,7 +27,7 @@ class EventQueueProcessorTest : public testing::Test { const EventTarget * /*eventTarget*/, const std::string &type, ReactEventPriority priority, - const ValueFactory & /*payloadFactory*/) { + const EventPayload & /*payload*/) { eventTypes_.push_back(type); eventPriorities_.push_back(priority); }; @@ -49,7 +50,7 @@ TEST_F(EventQueueProcessorTest, singleUnspecifiedEvent) { *runtime_, {RawEvent( "my type", - dummyValueFactory_, + std::make_shared(dummyValueFactory_), nullptr, RawEvent::Category::Unspecified)}); @@ -63,22 +64,22 @@ TEST_F(EventQueueProcessorTest, continuousEvent) { *runtime_, {RawEvent( "touchStart", - dummyValueFactory_, + std::make_shared(dummyValueFactory_), nullptr, RawEvent::Category::ContinuousStart), RawEvent( "touchMove", - dummyValueFactory_, + std::make_shared(dummyValueFactory_), nullptr, RawEvent::Category::Unspecified), RawEvent( "touchEnd", - dummyValueFactory_, + std::make_shared(dummyValueFactory_), nullptr, RawEvent::Category::ContinuousEnd), RawEvent( "custom event", - dummyValueFactory_, + std::make_shared(dummyValueFactory_), nullptr, RawEvent::Category::Unspecified)}); @@ -103,7 +104,7 @@ TEST_F(EventQueueProcessorTest, alwaysContinuousEvent) { { RawEvent( "onScroll", - dummyValueFactory_, + std::make_shared(dummyValueFactory_), nullptr, RawEvent::Category::Continuous), }); @@ -120,7 +121,7 @@ TEST_F(EventQueueProcessorTest, alwaysDiscreteEvent) { { RawEvent( "onChange", - dummyValueFactory_, + std::make_shared(dummyValueFactory_), nullptr, RawEvent::Category::Discrete), }); diff --git a/packages/react-native/ReactCommon/react/renderer/debug/React-rendererdebug.podspec b/packages/react-native/ReactCommon/react/renderer/debug/React-rendererdebug.podspec new file mode 100644 index 00000000000000..9a8ec0c50c8d39 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/debug/React-rendererdebug.podspec @@ -0,0 +1,60 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' +folly_version = '2021.07.22.00' + +header_search_paths = [ + "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/DoubleConversion\"" +] + +if ENV['USE_FRAMEWORKS'] + header_search_paths << "\"$(PODS_TARGET_SRCROOT)/../../..\"" #this is needed to allow the Renderer/Debug access its own files + header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\"" +end + +Pod::Spec.new do |s| + s.name = "React-rendererdebug" + s.version = version + s.summary = "-" # TODO + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.source_files = "**/*.{cpp,h,mm}" + s.compiler_flags = folly_compiler_flags + s.header_dir = "react/renderer/debug" + s.exclude_files = "tests" + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "HEADER_SEARCH_PATHS" => header_search_paths.join(' '), + "DEFINES_MODULE" => "YES" + } + + if ENV['USE_FRAMEWORKS'] + s.module_name = "React_rendererdebug" + s.header_mappings_dir = "../../.." + end + + s.dependency "React-debug" + s.dependency "RCT-Folly", folly_version + s.dependency "DoubleConversion" +end diff --git a/packages/react-native/ReactCommon/react/renderer/element/Element.h b/packages/react-native/ReactCommon/react/renderer/element/Element.h index dee0354d484b1c..c80aa030b06f64 100644 --- a/packages/react-native/ReactCommon/react/renderer/element/Element.h +++ b/packages/react-native/ReactCommon/react/renderer/element/Element.h @@ -123,7 +123,11 @@ class Element final { Element &reference( std::function callback) { - fragment_.referenceCallback = callback; + fragment_.referenceCallback = + [callback = std::move(callback)](ShadowNode::Shared const &shadowNode) { + callback(std::const_pointer_cast( + std::static_pointer_cast(shadowNode))); + }; return *this; } diff --git a/packages/react-native/ReactCommon/react/renderer/graphics/React-graphics.podspec b/packages/react-native/ReactCommon/react/renderer/graphics/React-graphics.podspec index 85a9e21bbee818..4111d290bdf673 100644 --- a/packages/react-native/ReactCommon/react/renderer/graphics/React-graphics.podspec +++ b/packages/react-native/ReactCommon/react/renderer/graphics/React-graphics.podspec @@ -45,11 +45,13 @@ Pod::Spec.new do |s| if ENV['USE_FRAMEWORKS'] s.module_name = "React_graphics" - s.header_mappings_dir = "../../.." + s.header_mappings_dir = File.absolute_path("../../..") header_search_paths = header_search_paths + ["\"$(PODS_TARGET_SRCROOT)/platform/ios\""] end - s.pod_target_xcconfig = { "USE_HEADERMAP" => "NO", "HEADER_SEARCH_PATHS" => header_search_paths.join(" ") } + s.pod_target_xcconfig = { "USE_HEADERMAP" => "NO", + "HEADER_SEARCH_PATHS" => header_search_paths.join(" "), + "DEFINES_MODULE" => "YES" } s.dependency "glog" s.dependency "RCT-Folly/Fabric", folly_version diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageRequest.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageRequest.h index 78c1b4c8112704..5853c97cd8ef1a 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageRequest.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageRequest.h @@ -12,6 +12,7 @@ #include #include #include +#include namespace facebook::react { @@ -29,7 +30,8 @@ class ImageRequest final { */ ImageRequest( ImageSource imageSource, - std::shared_ptr telemetry); + std::shared_ptr telemetry, + SharedFunction<> cancelationFunction); /* * The move constructor. @@ -41,11 +43,6 @@ class ImageRequest final { */ ImageRequest(const ImageRequest &other) = delete; - /** - * Set cancelation function. - */ - void setCancelationFunction(std::function cancelationFunction); - /* * Calls cancel function if one is defined. Should be when downloading * image isn't needed anymore. E.g. was removed. @@ -94,9 +91,9 @@ class ImageRequest final { std::shared_ptr coordinator_{}; /* - * Function we can call to cancel image request (see destructor). + * Function we can call to cancel image request. */ - std::function cancelRequest_; + SharedFunction<> cancelRequest_; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageManager.cpp b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageManager.cpp index 30bc153fc0d4e4..d9a382125e606c 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageManager.cpp @@ -24,7 +24,7 @@ ImageRequest ImageManager::requestImage( const ImageSource &imageSource, SurfaceId /*surfaceId*/) const { // Not implemented. - return {imageSource, nullptr}; + return {imageSource, nullptr, {}}; } } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequest.cpp b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequest.cpp index a502f65d9c305c..6a5c1341830b40 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequest.cpp @@ -13,8 +13,11 @@ namespace facebook::react { ImageRequest::ImageRequest( ImageSource imageSource, - std::shared_ptr telemetry) - : imageSource_(std::move(imageSource)), telemetry_(std::move(telemetry)) { + std::shared_ptr telemetry, + SharedFunction<> cancelationFunction) + : imageSource_(std::move(imageSource)), + telemetry_(std::move(telemetry)), + cancelRequest_(std::move(cancelationFunction)) { // Not implemented. } diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/React-ImageManager.podspec b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/React-ImageManager.podspec index 5dd7f9ef452028..856b847e23d0af 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/React-ImageManager.podspec +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/React-ImageManager.podspec @@ -42,14 +42,15 @@ Pod::Spec.new do |s| if ENV['USE_FRAMEWORKS'] s.module_name = "React_ImageManager" - s.header_mappings_dir = "./" + s.header_mappings_dir = File.absolute_path("./") header_search_paths = header_search_paths + [ "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\"", "\"$(PODS_ROOT)/DoubleConversion\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\"", - "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\"" + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers/\"", ] end @@ -64,6 +65,7 @@ Pod::Spec.new do |s| s.dependency "React-Core/Default" s.dependency "React-RCTImage" s.dependency "React-debug" + s.dependency "React-rendererdebug" s.dependency "React-utils" s.dependency "glog" end diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequest.cpp b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequest.cpp index cca7918e2d6d2c..2c1e009a58e47c 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequest.cpp @@ -11,20 +11,16 @@ namespace facebook::react { ImageRequest::ImageRequest( ImageSource imageSource, - std::shared_ptr telemetry) - : imageSource_(std::move(imageSource)), telemetry_(std::move(telemetry)) { + std::shared_ptr telemetry, + SharedFunction<> cancelationFunction) + : imageSource_(std::move(imageSource)), + telemetry_(std::move(telemetry)), + cancelRequest_(std::move(cancelationFunction)) { coordinator_ = std::make_shared(); } -void ImageRequest::setCancelationFunction( - std::function cancelationFunction) { - cancelRequest_ = cancelationFunction; -} - void ImageRequest::cancel() const { - if (cancelRequest_) { - cancelRequest_(); - } + cancelRequest_(); } const ImageSource &ImageRequest::getImageSource() const { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.mm b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.mm index 1f4b4eabaa2ce2..036607666424c8 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.mm +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.mm @@ -48,13 +48,11 @@ - (ImageRequest)requestImage:(ImageSource)imageSource surfaceId:(SurfaceId)surfa telemetry = nullptr; } - auto imageRequest = ImageRequest(imageSource, telemetry); + auto sharedCancelationFunction = SharedFunction<>(); + auto imageRequest = ImageRequest(imageSource, telemetry, sharedCancelationFunction); auto weakObserverCoordinator = (std::weak_ptr)imageRequest.getSharedObserverCoordinator(); - auto sharedCancelationFunction = SharedFunction<>(); - imageRequest.setCancelationFunction(sharedCancelationFunction); - /* * Even if an image is being loaded asynchronously on some other background thread, some other preparation * work (such as creating an `NSURLRequest` object and some obscure logic inside `RCTImageLoader`) can take a couple diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm index dd7c9936ac9562..71a1e882856626 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm @@ -37,13 +37,11 @@ - (instancetype)initWithImageLoader:(id)i - (ImageRequest)requestImage:(ImageSource)imageSource surfaceId:(SurfaceId)surfaceId { auto telemetry = std::make_shared(surfaceId); - auto imageRequest = ImageRequest(imageSource, telemetry); + auto sharedCancelationFunction = SharedFunction<>(); + auto imageRequest = ImageRequest(imageSource, telemetry, sharedCancelationFunction); auto weakObserverCoordinator = (std::weak_ptr)imageRequest.getSharedObserverCoordinator(); - auto sharedCancelationFunction = SharedFunction<>(); - imageRequest.setCancelationFunction(sharedCancelationFunction); - dispatch_group_t imageWaitGroup = dispatch_group_create(); dispatch_group_enter(imageWaitGroup); diff --git a/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h b/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h index 5e45d6e1a2a42b..4eda42bff75c00 100644 --- a/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h +++ b/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h @@ -8,8 +8,8 @@ #pragma once #include -#include #include +#include "MapBuffer.h" namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp index 16626c1eb561f6..be1132fc180940 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp +++ b/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp @@ -178,6 +178,10 @@ std::optional MountingCoordinator::pullTransaction() return transaction; } +bool MountingCoordinator::hasPendingTransactions() const { + return lastRevision_.has_value(); +} + TelemetryController const &MountingCoordinator::getTelemetryController() const { return telemetryController_; } diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.h b/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.h index 7ca6aeb5a9b3c3..16d3ca1b77702c 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.h +++ b/packages/react-native/ReactCommon/react/renderer/mounting/MountingCoordinator.h @@ -58,6 +58,14 @@ class MountingCoordinator final { */ std::optional pullTransaction() const; + /* + * Indicates if there are transactions waiting to be consumed and mounted on + * the host platform. This can be useful to determine if side-effects of + * mounting can be expected after some operations (like IntersectionObserver + * initial paint notifications). + */ + bool hasPendingTransactions() const; + /* * Blocks the current thread until a new mounting transaction is available or * after the specified `timeout` duration. diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp index f504c986b5c418..1ded30dcfdacb4 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp +++ b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp @@ -446,7 +446,7 @@ void ShadowTree::emitLayoutEvents( // Checking if the `onLayout` event was requested for the particular Shadow // Node. - auto const &viewProps = + const auto &viewProps = static_cast(*viewShadowNode.getProps()); if (!viewProps.onLayout) { continue; diff --git a/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserver.cpp b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserver.cpp new file mode 100644 index 00000000000000..85dc0bb3ca6f2c --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserver.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "IntersectionObserver.h" +#include +#include +#include +#include +#include +#include + +namespace facebook::react { + +IntersectionObserver::IntersectionObserver( + IntersectionObserverObserverId intersectionObserverId, + ShadowNode::Shared targetShadowNode, + std::vector thresholds) + : intersectionObserverId_(intersectionObserverId), + targetShadowNode_(std::move(targetShadowNode)), + thresholds_(std::move(thresholds)) {} + +static Rect getRootBoundingRect( + LayoutableShadowNode const &layoutableRootShadowNode) { + auto layoutMetrics = layoutableRootShadowNode.getLayoutMetrics(); + + if (layoutMetrics == EmptyLayoutMetrics || + layoutMetrics.displayType == DisplayType::None) { + return Rect{}; + } + + // Apply the transform to translate the root view to its location in the + // viewport. + return layoutMetrics.frame * layoutableRootShadowNode.getTransform(); +} + +static Rect getTargetBoundingRect( + ShadowNodeFamily::AncestorList const &targetAncestors) { + auto layoutMetrics = LayoutableShadowNode::computeRelativeLayoutMetrics( + targetAncestors, + {/* .includeTransform = */ true, + /* .includeViewportOffset = */ true}); + return layoutMetrics == EmptyLayoutMetrics ? Rect{} : layoutMetrics.frame; +} + +static Rect getClippedTargetBoundingRect( + ShadowNodeFamily::AncestorList const &targetAncestors) { + auto layoutMetrics = LayoutableShadowNode::computeRelativeLayoutMetrics( + targetAncestors, + {/* .includeTransform = */ true, + /* .includeViewportOffset = */ true, + /* .applyParentClipping = */ true}); + + return layoutMetrics == EmptyLayoutMetrics ? Rect{} : layoutMetrics.frame; +} + +// Partially equivalent to +// https://w3c.github.io/IntersectionObserver/#compute-the-intersection +static Rect computeIntersection( + Rect const &rootBoundingRect, + Rect const &targetBoundingRect, + ShadowNodeFamily::AncestorList const &targetAncestors) { + auto absoluteIntersectionRect = + Rect::intersect(rootBoundingRect, targetBoundingRect); + + Float absoluteIntersectionRectArea = absoluteIntersectionRect.size.width * + absoluteIntersectionRect.size.height; + + Float targetBoundingRectArea = + targetBoundingRect.size.width * targetBoundingRect.size.height; + + // Finish early if there is not intersection between the root and the target + // before we do any clipping. + if (absoluteIntersectionRectArea == 0 || targetBoundingRectArea == 0) { + return {}; + } + + // Coordinates of the target after clipping the parts hidden by a parent + // (e.g.: in scroll views, or in views with a parent with overflow: hidden) + auto clippedTargetBoundingRect = + getClippedTargetBoundingRect(targetAncestors); + + return Rect::intersect(rootBoundingRect, clippedTargetBoundingRect); +} + +// Partially equivalent to +// https://w3c.github.io/IntersectionObserver/#update-intersection-observations-algo +std::optional +IntersectionObserver::updateIntersectionObservation( + RootShadowNode const &rootShadowNode, + double mountTime) { + auto const layoutableRootShadowNode = + traitCast(&rootShadowNode); + + react_native_assert( + layoutableRootShadowNode != nullptr && + "RootShadowNode instances must always inherit from LayoutableShadowNode."); + + auto targetAncestors = + targetShadowNode_->getFamily().getAncestors(rootShadowNode); + + // Absolute coordinates of the root + auto rootBoundingRect = getRootBoundingRect(*layoutableRootShadowNode); + + // Absolute coordinates of the target + auto targetBoundingRect = getTargetBoundingRect(targetAncestors); + + auto intersectionRect = computeIntersection( + rootBoundingRect, targetBoundingRect, targetAncestors); + + Float targetBoundingRectArea = + targetBoundingRect.size.width * targetBoundingRect.size.height; + auto intersectionRectArea = + intersectionRect.size.width * intersectionRect.size.height; + + Float intersectionRatio = + targetBoundingRectArea == 0 // prevent division by zero + ? 0 + : intersectionRectArea / targetBoundingRectArea; + + if (intersectionRatio == 0) { + return setNotIntersectingState( + rootBoundingRect, targetBoundingRect, mountTime); + } + + auto highestThresholdCrossed = getHighestThresholdCrossed(intersectionRatio); + if (highestThresholdCrossed == -1) { + return setNotIntersectingState( + rootBoundingRect, targetBoundingRect, mountTime); + } + + return setIntersectingState( + rootBoundingRect, + targetBoundingRect, + intersectionRect, + highestThresholdCrossed, + mountTime); +} + +Float IntersectionObserver::getHighestThresholdCrossed( + Float intersectionRatio) { + Float highestThreshold = -1; + for (auto threshold : thresholds_) { + if (intersectionRatio >= threshold) { + highestThreshold = threshold; + } + } + return highestThreshold; +} + +std::optional +IntersectionObserver::setIntersectingState( + Rect const &rootBoundingRect, + Rect const &targetBoundingRect, + Rect const &intersectionRect, + Float threshold, + double mountTime) { + auto newState = IntersectionObserverState::Intersecting(threshold); + + if (state_ != newState) { + state_ = newState; + IntersectionObserverEntry entry{ + intersectionObserverId_, + targetShadowNode_, + targetBoundingRect, + rootBoundingRect, + intersectionRect, + true, + mountTime, + }; + return std::optional{std::move(entry)}; + } + + return std::nullopt; +} + +std::optional +IntersectionObserver::setNotIntersectingState( + Rect const &rootBoundingRect, + Rect const &targetBoundingRect, + double mountTime) { + if (state_ != IntersectionObserverState::NotIntersecting()) { + state_ = IntersectionObserverState::NotIntersecting(); + IntersectionObserverEntry entry{ + intersectionObserverId_, + targetShadowNode_, + targetBoundingRect, + rootBoundingRect, + std::nullopt, + false, + mountTime, + }; + return std::optional(std::move(entry)); + } + + return std::nullopt; +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserver.h b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserver.h new file mode 100644 index 00000000000000..5f0371b6b23c16 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserver.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include "IntersectionObserverState.h" + +namespace facebook::react { + +using IntersectionObserverObserverId = int32_t; + +struct IntersectionObserverEntry { + IntersectionObserverObserverId intersectionObserverId; + ShadowNode::Shared shadowNode; + Rect targetRect; + Rect rootRect; + std::optional intersectionRect; + bool isIntersectingAboveThresholds; + // TODO(T156529385) Define `DOMHighResTimeStamp` as an alias for `double` and + // use it here. + double time; +}; + +class IntersectionObserver { + public: + IntersectionObserver( + IntersectionObserverObserverId intersectionObserverId, + ShadowNode::Shared targetShadowNode, + std::vector thresholds); + + // Partially equivalent to + // https://w3c.github.io/IntersectionObserver/#update-intersection-observations-algo + std::optional updateIntersectionObservation( + RootShadowNode const &rootShadowNode, + double mountTime); + + IntersectionObserverObserverId getIntersectionObserverId() const { + return intersectionObserverId_; + } + + ShadowNode const &getTargetShadowNode() const { + return *targetShadowNode_; + } + + std::vector getThresholds() const { + return thresholds_; + } + + private: + Float getHighestThresholdCrossed(Float intersectionRatio); + + std::optional setIntersectingState( + Rect const &rootBoundingRect, + Rect const &targetBoundingRect, + Rect const &intersectionRect, + Float threshold, + double mountTime); + + std::optional setNotIntersectingState( + Rect const &rootBoundingRect, + Rect const &targetBoundingRect, + double mountTime); + + IntersectionObserverObserverId intersectionObserverId_; + ShadowNode::Shared targetShadowNode_; + std::vector thresholds_; + mutable IntersectionObserverState state_ = + IntersectionObserverState::Initial(); +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverManager.cpp b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverManager.cpp new file mode 100644 index 00000000000000..7959b9316d22a8 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverManager.cpp @@ -0,0 +1,213 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "IntersectionObserverManager.h" +#include +#include +#include +#include "IntersectionObserver.h" + +namespace facebook::react { + +IntersectionObserverManager::IntersectionObserverManager() = default; + +void IntersectionObserverManager::observe( + IntersectionObserverObserverId intersectionObserverId, + const ShadowNode::Shared &shadowNode, + std::vector thresholds, + UIManager const &uiManager) { + SystraceSection s("IntersectionObserverManager::observe"); + + auto surfaceId = shadowNode->getSurfaceId(); + + // The actual observer lives in the array, so we need to create it there and + // then get a reference. Otherwise we only update its state in a copy. + IntersectionObserver *observer; + + // Register observer + { + std::unique_lock lock(observersMutex_); + + auto &observers = observersBySurfaceId_[surfaceId]; + observers.emplace_back(IntersectionObserver{ + intersectionObserverId, shadowNode, std::move(thresholds)}); + observer = &observers.back(); + } + + // Notification of initial state. + // Ideally, we'd have well defined event loop step to notify observers + // (like on the Web) and we'd send the initial notification there, but as + // we don't have it we have to run this check once and manually dispatch. + auto &shadowTreeRegistry = uiManager.getShadowTreeRegistry(); + MountingCoordinator::Shared mountingCoordinator = nullptr; + RootShadowNode::Shared rootShadowNode = nullptr; + shadowTreeRegistry.visit(surfaceId, [&](ShadowTree const &shadowTree) { + mountingCoordinator = shadowTree.getMountingCoordinator(); + rootShadowNode = shadowTree.getCurrentRevision().rootShadowNode; + }); + auto hasPendingTransactions = mountingCoordinator != nullptr && + mountingCoordinator->hasPendingTransactions(); + + if (!hasPendingTransactions) { + auto entry = observer->updateIntersectionObservation( + *rootShadowNode, JSExecutor::performanceNow()); + if (entry) { + { + std::unique_lock lock(pendingEntriesMutex_); + pendingEntries_.push_back(std::move(entry).value()); + } + notifyObserversIfNecessary(); + } + } +} + +void IntersectionObserverManager::unobserve( + IntersectionObserverObserverId intersectionObserverId, + ShadowNode const &shadowNode) { + SystraceSection s("IntersectionObserverManager::unobserve"); + + std::unique_lock lock(observersMutex_); + + auto surfaceId = shadowNode.getSurfaceId(); + + auto observersIt = observersBySurfaceId_.find(surfaceId); + if (observersIt == observersBySurfaceId_.end()) { + return; + } + + auto &observers = observersIt->second; + + observers.erase( + std::remove_if( + observers.begin(), + observers.end(), + [intersectionObserverId, &shadowNode](auto const &observer) { + return observer.getIntersectionObserverId() == + intersectionObserverId && + ShadowNode::sameFamily( + observer.getTargetShadowNode(), shadowNode); + }), + observers.end()); + + if (observers.empty()) { + observersBySurfaceId_.erase(surfaceId); + } +} + +void IntersectionObserverManager::connect( + UIManager &uiManager, + std::function notifyIntersectionObserversCallback) { + SystraceSection s("IntersectionObserverManager::connect"); + notifyIntersectionObserversCallback_ = + std::move(notifyIntersectionObserversCallback); + + // Fail-safe in case the caller doesn't guarantee consistency. + if (mountHookRegistered_) { + return; + } + + uiManager.registerMountHook(*this); + mountHookRegistered_ = true; +} + +void IntersectionObserverManager::disconnect(UIManager &uiManager) { + SystraceSection s("IntersectionObserverManager::disconnect"); + + // Fail-safe in case the caller doesn't guarantee consistency. + if (!mountHookRegistered_) { + return; + } + + uiManager.unregisterMountHook(*this); + mountHookRegistered_ = false; + notifyIntersectionObserversCallback_ = nullptr; +} + +std::vector +IntersectionObserverManager::takeRecords() { + std::unique_lock lock(pendingEntriesMutex_); + + notifiedIntersectionObservers_ = false; + + std::vector entries; + pendingEntries_.swap(entries); + return entries; +} + +void IntersectionObserverManager::shadowTreeDidMount( + RootShadowNode::Shared const &rootShadowNode, + double mountTime) noexcept { + updateIntersectionObservations(*rootShadowNode, mountTime); +} + +void IntersectionObserverManager::updateIntersectionObservations( + RootShadowNode const &rootShadowNode, + double mountTime) { + SystraceSection s( + "IntersectionObserverManager::updateIntersectionObservations"); + + std::vector entries; + + // Run intersection observations + { + std::shared_lock lock(observersMutex_); + + auto surfaceId = rootShadowNode.getSurfaceId(); + + auto observersIt = observersBySurfaceId_.find(surfaceId); + if (observersIt == observersBySurfaceId_.end()) { + return; + } + + auto &observers = observersIt->second; + for (auto &observer : observers) { + auto entry = + observer.updateIntersectionObservation(rootShadowNode, mountTime); + if (entry) { + entries.push_back(std::move(entry).value()); + } + } + } + + { + std::unique_lock lock(pendingEntriesMutex_); + pendingEntries_.insert( + pendingEntries_.end(), entries.begin(), entries.end()); + } + + notifyObserversIfNecessary(); +} + +/** + * This method allows us to avoid scheduling multiple calls to notify observers + * in the JS thread. We schedule one and skip subsequent ones (we just append + * the entries to the pending list and wait for the scheduled task to consume + * all of them). + */ +void IntersectionObserverManager::notifyObserversIfNecessary() { + bool dispatchNotification = false; + + { + std::unique_lock lock(pendingEntriesMutex_); + + if (!pendingEntries_.empty() && !notifiedIntersectionObservers_) { + notifiedIntersectionObservers_ = true; + dispatchNotification = true; + } + } + + if (dispatchNotification) { + notifyObservers(); + } +} + +void IntersectionObserverManager::notifyObservers() { + SystraceSection s("IntersectionObserverManager::notifyObservers"); + notifyIntersectionObserversCallback_(); +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverManager.h b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverManager.h new file mode 100644 index 00000000000000..4691febc7524f0 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverManager.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include "IntersectionObserver.h" + +namespace facebook::react { + +class IntersectionObserverManager final : public UIManagerMountHook { + public: + IntersectionObserverManager(); + + void observe( + IntersectionObserverObserverId intersectionObserverId, + const ShadowNode::Shared &shadowNode, + std::vector thresholds, + UIManager const &uiManager); + + void unobserve( + IntersectionObserverObserverId intersectionObserverId, + ShadowNode const &shadowNode); + + void connect( + UIManager &uiManager, + std::function notifyIntersectionObserversCallback); + + void disconnect(UIManager &uiManager); + + std::vector takeRecords(); + +#pragma mark - UIManagerMountHook + + void shadowTreeDidMount( + RootShadowNode::Shared const &rootShadowNode, + double mountTime) noexcept override; + + private: + mutable std::unordered_map> + observersBySurfaceId_; + mutable std::shared_mutex observersMutex_; + + mutable std::function notifyIntersectionObserversCallback_; + + mutable std::vector pendingEntries_; + mutable std::mutex pendingEntriesMutex_; + + mutable bool notifiedIntersectionObservers_{}; + mutable bool mountHookRegistered_{}; + + void notifyObserversIfNecessary(); + void notifyObservers(); + + // Equivalent to + // https://w3c.github.io/IntersectionObserver/#update-intersection-observations-algo + void updateIntersectionObservations( + RootShadowNode const &rootShadowNode, + double mountTime); + + IntersectionObserver const &getRegisteredIntersectionObserver( + SurfaceId surfaceId, + IntersectionObserverObserverId observerId) const; +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverState.cpp b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverState.cpp new file mode 100644 index 00000000000000..79feead1cac578 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverState.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "IntersectionObserverState.h" + +namespace facebook::react { + +IntersectionObserverState IntersectionObserverState::Initial() { + static const IntersectionObserverState state = + IntersectionObserverState(IntersectionObserverStateType::Initial); + return state; +} + +IntersectionObserverState IntersectionObserverState::NotIntersecting() { + static const IntersectionObserverState state = + IntersectionObserverState(IntersectionObserverStateType::NotIntersecting); + return state; +} + +IntersectionObserverState IntersectionObserverState::Intersecting( + Float threshold) { + return IntersectionObserverState( + IntersectionObserverStateType::Intersecting, threshold); +} + +IntersectionObserverState::IntersectionObserverState( + IntersectionObserverStateType state) + : state_(state) {} + +IntersectionObserverState::IntersectionObserverState( + IntersectionObserverStateType state, + Float threshold) + : state_(state), threshold_(threshold) {} + +bool IntersectionObserverState::isIntersecting() const { + return state_ == IntersectionObserverStateType::Intersecting; +} + +bool IntersectionObserverState::operator==( + const IntersectionObserverState &other) const { + if (state_ != other.state_) { + return false; + } + + if (state_ != IntersectionObserverStateType::Intersecting) { + return true; + } + + return threshold_ == other.threshold_; +} + +bool IntersectionObserverState::operator!=( + const IntersectionObserverState &other) const { + return !(*this == other); +} +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverState.h b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverState.h new file mode 100644 index 00000000000000..67ae4e98c93861 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/intersection/IntersectionObserverState.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +namespace { +enum class IntersectionObserverStateType { + Initial, + NotIntersecting, + Intersecting, +}; +} + +namespace facebook::react { + +class IntersectionObserverState { + public: + static IntersectionObserverState Initial(); + static IntersectionObserverState NotIntersecting(); + static IntersectionObserverState Intersecting(Float threshold); + + bool isIntersecting() const; + + bool operator==(const IntersectionObserverState &other) const; + bool operator!=(const IntersectionObserverState &other) const; + + private: + explicit IntersectionObserverState(IntersectionObserverStateType state); + IntersectionObserverState( + IntersectionObserverStateType state, + Float threshold); + + IntersectionObserverStateType state_; + + // This value is only relevant if the state is + // IntersectionObserverStateType::Intersecting. + Float threshold_{}; +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserver.cpp b/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserver.cpp new file mode 100644 index 00000000000000..e59813a77d39b6 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserver.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "MutationObserver.h" +#include +#include + +namespace facebook::react { + +MutationObserver::MutationObserver(MutationObserverId mutationObserverId) + : mutationObserverId_(mutationObserverId) {} + +void MutationObserver::observe( + ShadowNode::Shared targetShadowNode, + bool observeSubtree) { + if (observeSubtree) { + deeplyObservedShadowNodes_.push_back(targetShadowNode); + } else { + shallowlyObservedShadowNodes_.push_back(targetShadowNode); + } +} + +void MutationObserver::unobserve(ShadowNode const &targetShadowNode) { + // We don't know if it's being observed deeply or not, so we need to check + // both possibilities. + deeplyObservedShadowNodes_.erase( + std::remove_if( + deeplyObservedShadowNodes_.begin(), + deeplyObservedShadowNodes_.end(), + [&targetShadowNode](auto shadowNode) { + return ShadowNode::sameFamily(*shadowNode, targetShadowNode); + }), + deeplyObservedShadowNodes_.end()); + + shallowlyObservedShadowNodes_.erase( + std::remove_if( + shallowlyObservedShadowNodes_.begin(), + shallowlyObservedShadowNodes_.end(), + [&targetShadowNode](auto const shadowNode) { + return ShadowNode::sameFamily(*shadowNode, targetShadowNode); + }), + shallowlyObservedShadowNodes_.end()); +} + +bool MutationObserver::isObserving() const { + return !deeplyObservedShadowNodes_.empty() || + !shallowlyObservedShadowNodes_.empty(); +} + +static ShadowNode::Shared getShadowNodeInTree( + ShadowNode const &shadowNode, + ShadowNode const &newTree) { + auto ancestors = shadowNode.getFamily().getAncestors(newTree); + if (ancestors.empty()) { + return nullptr; + } + + auto pair = ancestors.rbegin(); + return pair->first.get().getChildren().at(pair->second); +} + +static ShadowNode::Shared findNodeOfSameFamily( + ShadowNode::ListOfShared const &list, + ShadowNode const &node) { + for (auto ¤t : list) { + if (ShadowNode::sameFamily(node, *current)) { + return current; + } + } + return nullptr; +} + +void MutationObserver::recordMutations( + RootShadowNode const &oldRootShadowNode, + RootShadowNode const &newRootShadowNode, + std::vector &recordedMutations) const { + // This tracks the nodes that have already been processed by this observer, + // so we avoid unnecessary work and duplicated entries. + SetOfShadowNodePointers processedNodes; + + // We go over the deeply observed nodes first to avoid skipping nodes that + // have only been checked shallowly. + for (auto targetShadowNode : deeplyObservedShadowNodes_) { + recordMutationsInTarget( + targetShadowNode, + oldRootShadowNode, + newRootShadowNode, + true, + recordedMutations, + processedNodes); + } + + for (auto targetShadowNode : shallowlyObservedShadowNodes_) { + recordMutationsInTarget( + targetShadowNode, + oldRootShadowNode, + newRootShadowNode, + false, + recordedMutations, + processedNodes); + } +} + +void MutationObserver::recordMutationsInTarget( + ShadowNode::Shared targetShadowNode, + RootShadowNode const &oldRootShadowNode, + RootShadowNode const &newRootShadowNode, + bool observeSubtree, + std::vector &recordedMutations, + SetOfShadowNodePointers &processedNodes) const { + // If the node isnt't present in the old tree, it's either: + // - A new node. In that case, the mutation happened in its parent, not in the + // node itself. + // - A non-existent node. In that case, there are no new mutations. + auto oldTargetShadowNode = + getShadowNodeInTree(*targetShadowNode, oldRootShadowNode); + if (!oldTargetShadowNode) { + return; + } + + // If the node isn't present in the new tree (and we didn't return in the + // previous check), it means the whole node was removed. In that case we don't + // record any mutations in the node itself (maybe in its parent if there are + // other observers set up). + auto newTargetShadowNode = + getShadowNodeInTree(*targetShadowNode, newRootShadowNode); + if (!newTargetShadowNode) { + return; + } + + recordMutationsInSubtrees( + std::move(targetShadowNode), + *oldTargetShadowNode, + *newTargetShadowNode, + observeSubtree, + recordedMutations, + processedNodes); +} + +void MutationObserver::recordMutationsInSubtrees( + ShadowNode::Shared targetShadowNode, + ShadowNode const &oldNode, + ShadowNode const &newNode, + bool observeSubtree, + std::vector &recordedMutations, + SetOfShadowNodePointers processedNodes) const { + bool isSameNode = &oldNode == &newNode; + // If the nodes are referentially equal, their children are also the same. + if (isSameNode || processedNodes.find(&newNode) != processedNodes.end()) { + return; + } + + processedNodes.insert(&newNode); + + auto oldChildren = oldNode.getChildren(); + auto newChildren = newNode.getChildren(); + + std::vector addedNodes; + std::vector removedNodes; + + // Check for removed nodes (and equal nodes for further inspection) + for (auto &oldChild : oldChildren) { + auto newChild = findNodeOfSameFamily(newChildren, *oldChild); + if (!newChild) { + removedNodes.push_back(oldChild); + } else if (observeSubtree) { + // Nodes are present in both tress. If `subtree` is set to true, + // we continue checking their children. + recordMutationsInSubtrees( + targetShadowNode, + *oldChild, + *newChild, + observeSubtree, + recordedMutations, + processedNodes); + } + } + + // Check for added nodes + for (auto &newChild : newChildren) { + auto oldChild = findNodeOfSameFamily(oldChildren, *newChild); + if (!oldChild) { + addedNodes.push_back(newChild); + } + } + + if (!addedNodes.empty() || !removedNodes.empty()) { + recordedMutations.emplace_back(MutationRecord{ + mutationObserverId_, + targetShadowNode, + std::move(addedNodes), + std::move(removedNodes)}); + } +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserver.h b/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserver.h new file mode 100644 index 00000000000000..b1677b93b64f85 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserver.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include +#include + +namespace facebook::react { + +using MutationObserverId = int32_t; + +struct MutationRecord { + MutationObserverId mutationObserverId; + ShadowNode::Shared targetShadowNode; + std::vector addedShadowNodes; + std::vector removedShadowNodes; +}; + +class MutationObserver { + public: + MutationObserver(MutationObserverId intersectionObserverId); + + void observe(ShadowNode::Shared targetShadowNode, bool observeSubtree); + void unobserve(ShadowNode const &targetShadowNode); + + bool isObserving() const; + + void recordMutations( + RootShadowNode const &oldRootShadowNode, + RootShadowNode const &newRootShadowNode, + std::vector &recordedMutations) const; + + private: + MutationObserverId mutationObserverId_; + std::vector deeplyObservedShadowNodes_; + std::vector shallowlyObservedShadowNodes_; + + using SetOfShadowNodePointers = std::unordered_set; + + void recordMutationsInTarget( + ShadowNode::Shared targetShadowNode, + RootShadowNode const &oldRootShadowNode, + RootShadowNode const &newRootShadowNode, + bool observeSubtree, + std::vector &recordedMutations, + SetOfShadowNodePointers &processedNodes) const; + + void recordMutationsInSubtrees( + ShadowNode::Shared targetShadowNode, + ShadowNode const &oldNode, + ShadowNode const &newNode, + bool observeSubtree, + std::vector &recordedMutations, + SetOfShadowNodePointers processedNodes) const; +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserverManager.cpp b/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserverManager.cpp new file mode 100644 index 00000000000000..75386a60710f52 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserverManager.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "MutationObserverManager.h" +#include +#include +#include "MutationObserver.h" + +namespace facebook::react { + +MutationObserverManager::MutationObserverManager() = default; + +void MutationObserverManager::observe( + MutationObserverId mutationObserverId, + ShadowNode::Shared shadowNode, + bool observeSubtree, + UIManager const &uiManager) { + SystraceSection s("MutationObserverManager::observe"); + + auto surfaceId = shadowNode->getSurfaceId(); + + auto &observers = observersBySurfaceId_[surfaceId]; + + auto observerIt = observers.find(mutationObserverId); + if (observerIt == observers.end()) { + auto observer = MutationObserver{mutationObserverId}; + observer.observe(shadowNode, observeSubtree); + observers.insert({mutationObserverId, std::move(observer)}); + } else { + auto observer = observerIt->second; + observer.observe(shadowNode, observeSubtree); + } +} + +void MutationObserverManager::unobserve( + MutationObserverId mutationObserverId, + ShadowNode const &shadowNode) { + SystraceSection s("MutationObserverManager::unobserve"); + + auto surfaceId = shadowNode.getSurfaceId(); + + auto observersIt = observersBySurfaceId_.find(surfaceId); + if (observersIt == observersBySurfaceId_.end()) { + return; + } + + auto &observers = observersIt->second; + + auto observerIt = observers.find(mutationObserverId); + if (observerIt == observers.end()) { + return; + } + + auto &observer = observerIt->second; + + observer.unobserve(shadowNode); + + if (!observer.isObserving()) { + observers.erase(mutationObserverId); + } + + if (observers.empty()) { + observersBySurfaceId_.erase(surfaceId); + } +} + +void MutationObserverManager::connect( + UIManager &uiManager, + std::function &)> onMutations) { + SystraceSection s("MutationObserverManager::connect"); + + // Fail-safe in case the caller doesn't guarantee consistency. + if (commitHookRegistered_) { + return; + } + + onMutations_ = onMutations; + + uiManager.registerCommitHook(*this); + commitHookRegistered_ = true; +} + +void MutationObserverManager::disconnect(UIManager &uiManager) { + SystraceSection s("MutationObserverManager::disconnect"); + + // Fail-safe in case the caller doesn't guarantee consistency. + if (!commitHookRegistered_) { + return; + } + + uiManager.unregisterCommitHook(*this); + + onMutations_ = nullptr; + commitHookRegistered_ = false; +} + +void MutationObserverManager::commitHookWasRegistered( + UIManager const &uiManager) noexcept {} +void MutationObserverManager::commitHookWasUnregistered( + UIManager const &uiManager) noexcept {} + +RootShadowNode::Unshared MutationObserverManager::shadowTreeWillCommit( + ShadowTree const &shadowTree, + RootShadowNode::Shared const &oldRootShadowNode, + RootShadowNode::Unshared const &newRootShadowNode) noexcept { + runMutationObservations(shadowTree, *oldRootShadowNode, *newRootShadowNode); + return newRootShadowNode; +} + +void MutationObserverManager::runMutationObservations( + ShadowTree const &shadowTree, + RootShadowNode const &oldRootShadowNode, + RootShadowNode const &newRootShadowNode) { + SystraceSection s("MutationObserverManager::runMutationObservations"); + + auto surfaceId = shadowTree.getSurfaceId(); + + auto observersIt = observersBySurfaceId_.find(surfaceId); + if (observersIt == observersBySurfaceId_.end()) { + return; + } + + std::vector mutationRecords; + + auto &observers = observersIt->second; + for (const auto &[mutationObserverId, observer] : observers) { + observer.recordMutations( + oldRootShadowNode, newRootShadowNode, mutationRecords); + } + + if (!mutationRecords.empty()) { + onMutations_(mutationRecords); + } + + return; +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserverManager.h b/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserverManager.h new file mode 100644 index 00000000000000..c77e074d1017ff --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/observers/mutation/MutationObserverManager.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include +#include +#include "MutationObserver.h" + +namespace facebook::react { + +class MutationObserverManager final : public UIManagerCommitHook { + public: + MutationObserverManager(); + + void observe( + MutationObserverId mutationObserverId, + ShadowNode::Shared shadowNode, + bool observeSubtree, + UIManager const &uiManager); + + void unobserve( + MutationObserverId mutationObserverId, + ShadowNode const &shadowNode); + + void connect( + UIManager &uiManager, + std::function &)> onMutations); + + void disconnect(UIManager &uiManager); + +#pragma mark - UIManagerCommitHook + + void commitHookWasRegistered(UIManager const &uiManager) noexcept override; + void commitHookWasUnregistered(UIManager const &uiManager) noexcept override; + + RootShadowNode::Unshared shadowTreeWillCommit( + ShadowTree const &shadowTree, + RootShadowNode::Shared const &oldRootShadowNode, + RootShadowNode::Unshared const &newRootShadowNode) noexcept override; + + private: + std::unordered_map< + SurfaceId, + std::unordered_map> + observersBySurfaceId_; + + std::function &)> onMutations_; + bool commitHookRegistered_{}; + + void runMutationObservations( + ShadowTree const &shadowTree, + RootShadowNode const &oldRootShadowNode, + RootShadowNode const &newRootShadowNode); +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec new file mode 100644 index 00000000000000..0590fab2e76a6a --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec @@ -0,0 +1,68 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' +folly_version = '2021.07.22.00' + +header_search_paths = [ + "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/boost\"", +] + +if ENV['USE_FRAMEWORKS'] + header_search_paths << "\"$(PODS_TARGET_SRCROOT)/../../..\"" #this is needed to allow the RuntimeScheduler access its own files + header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\"" +end + +Pod::Spec.new do |s| + s.name = "React-runtimescheduler" + s.version = version + s.summary = "-" # TODO + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = { :ios => min_ios_version_supported } + s.source = source + s.source_files = "**/*.{cpp,h}" + s.compiler_flags = folly_compiler_flags + s.header_dir = "react/renderer/runtimescheduler" + s.exclude_files = "tests" + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "HEADER_SEARCH_PATHS" => header_search_paths.join(' ')} + + if ENV['USE_FRAMEWORKS'] + s.module_name = "React_runtimescheduler" + s.header_mappings_dir = File.absolute_path("../../..") + end + + s.dependency "React-jsi" + s.dependency "React-runtimeexecutor" + s.dependency "React-callinvoker" + s.dependency "React-debug" + s.dependency "React-utils" + s.dependency "glog" + s.dependency "RCT-Folly", folly_version + + if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" + s.dependency "hermes-engine" + else + s.dependency "React-jsi" + end + +end diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/primitives.h b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/primitives.h index 3ba035b6872a21..a21e2cc51f45c5 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/primitives.h @@ -9,8 +9,8 @@ #include #include -#include #include +#include namespace facebook::react { @@ -23,8 +23,14 @@ struct TaskWrapper : public jsi::HostObject { inline static jsi::Value valueFromTask( jsi::Runtime &runtime, std::shared_ptr task) { - return jsi::Object::createFromHostObject( - runtime, std::make_shared(task)); + if (CoreFeatures::useNativeState) { + jsi::Object obj(runtime); + obj.setNativeState(runtime, std::move(task)); + return obj; + } else { + return jsi::Object::createFromHostObject( + runtime, std::make_shared(task)); + } } inline static std::shared_ptr taskFromValue( @@ -34,7 +40,11 @@ inline static std::shared_ptr taskFromValue( return nullptr; } - return value.getObject(runtime).getHostObject(runtime)->task; + if (CoreFeatures::useNativeState) { + return value.getObject(runtime).getNativeState(runtime); + } else { + return value.getObject(runtime).getHostObject(runtime)->task; + } } } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index 1d812fcccf845a..990912be9cbe77 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -60,11 +60,11 @@ Scheduler::Scheduler( const EventTarget *eventTarget, const std::string &type, ReactEventPriority priority, - const ValueFactory &payloadFactory) { + const EventPayload &payload) { uiManager->visitBinding( [&](UIManagerBinding const &uiManagerBinding) { uiManagerBinding.dispatchEvent( - runtime, eventTarget, type, priority, payloadFactory); + runtime, eventTarget, type, priority, payload); }, runtime); if (runtimeScheduler != nullptr) { diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/android/react/renderer/textlayoutmanager/TextLayoutManager.cpp b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/android/react/renderer/textlayoutmanager/TextLayoutManager.cpp index e39f6712784f26..916e5ccd8992c9 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/android/react/renderer/textlayoutmanager/TextLayoutManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/android/react/renderer/textlayoutmanager/TextLayoutManager.cpp @@ -12,11 +12,11 @@ #include #include #include -#include #include #include #include #include +#include using namespace facebook::jni; diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.cpp new file mode 100644 index 00000000000000..04b409cffe7de2 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "PointerEventsProcessor.h" + +namespace facebook::react { + +void PointerEventsProcessor::interceptPointerEvent( + jsi::Runtime &runtime, + EventTarget const *eventTarget, + std::string const &type, + ReactEventPriority priority, + PointerEvent const &event, + DispatchEvent const &eventDispatcher) { + // TODO: implement pointer capture redirection + eventDispatcher(runtime, eventTarget, type, priority, event); +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.h b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.h new file mode 100644 index 00000000000000..87953bd88bff40 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace facebook::react { + +using DispatchEvent = std::function; + +class PointerEventsProcessor final { + public: + void interceptPointerEvent( + jsi::Runtime &runtime, + EventTarget const *eventTarget, + std::string const &type, + ReactEventPriority priority, + PointerEvent const &event, + DispatchEvent const &eventDispatcher); +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h index 31db46be2c0eee..6eb71dd549ef7e 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h @@ -201,6 +201,10 @@ class UIManager final : public ShadowTreeDelegate { void reportMount(SurfaceId surfaceId) const; + bool hasBackgroundExecutor() const { + return backgroundExecutor_ != nullptr; + } + private: friend class UIManagerBinding; friend class Scheduler; diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp index 2e4db8f6e19b27..f44aef8ecedfe2 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -93,10 +94,36 @@ void UIManagerBinding::dispatchEvent( EventTarget const *eventTarget, std::string const &type, ReactEventPriority priority, - ValueFactory const &payloadFactory) const { + const EventPayload &eventPayload) const { SystraceSection s("UIManagerBinding::dispatchEvent", "type", type); - auto payload = payloadFactory(runtime); + if (eventPayload.getType() == EventPayloadType::PointerEvent) { + auto pointerEvent = static_cast(eventPayload); + auto dispatchCallback = [this]( + jsi::Runtime &runtime, + EventTarget const *eventTarget, + std::string const &type, + ReactEventPriority priority, + const EventPayload &eventPayload) { + this->dispatchEventToJS( + runtime, eventTarget, type, priority, eventPayload); + }; + pointerEventsProcessor_.interceptPointerEvent( + runtime, eventTarget, type, priority, pointerEvent, dispatchCallback); + } else { + dispatchEventToJS(runtime, eventTarget, type, priority, eventPayload); + } +} + +void UIManagerBinding::dispatchEventToJS( + jsi::Runtime &runtime, + EventTarget const *eventTarget, + std::string const &type, + ReactEventPriority priority, + const EventPayload &eventPayload) const { + SystraceSection s("UIManagerBinding::dispatchEventToJS", "type", type); + + auto payload = eventPayload.asJSIValue(runtime); // If a payload is null, the factory has decided to cancel the event if (payload.isNull()) { @@ -332,7 +359,7 @@ jsi::Value UIManagerBinding::get( size_t count) -> jsi::Value { validateArgumentCount(runtime, methodName, paramCount, count); - auto const &rawProps = RawProps(runtime, arguments[1]); + const auto &rawProps = RawProps(runtime, arguments[1]); return valueFromShadowNode( runtime, uiManager->cloneNode( @@ -356,7 +383,7 @@ jsi::Value UIManagerBinding::get( size_t count) -> jsi::Value { validateArgumentCount(runtime, methodName, paramCount, count); - auto const &rawProps = RawProps(runtime, arguments[1]); + const auto &rawProps = RawProps(runtime, arguments[1]); return valueFromShadowNode( runtime, uiManager->cloneNode( @@ -1179,4 +1206,8 @@ jsi::Value UIManagerBinding::get( return jsi::Value::undefined(); } +UIManager &UIManagerBinding::getUIManager() { + return *uiManager_; +} + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h index 0be85f6dc887f5..cd55d271385e05 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -52,7 +53,7 @@ class UIManagerBinding : public jsi::HostObject { EventTarget const *eventTarget, std::string const &type, ReactEventPriority priority, - ValueFactory const &payloadFactory) const; + const EventPayload &payload) const; /* * Invalidates the binding and underlying UIManager. @@ -68,9 +69,23 @@ class UIManagerBinding : public jsi::HostObject { */ jsi::Value get(jsi::Runtime &runtime, jsi::PropNameID const &name) override; + UIManager &getUIManager(); + private: + /* + * Internal method that sends the event to JS. Should only be called from + * UIManagerBinding::dispatchEvent. + */ + void dispatchEventToJS( + jsi::Runtime &runtime, + EventTarget const *eventTarget, + std::string const &type, + ReactEventPriority priority, + const EventPayload &payload) const; + std::shared_ptr uiManager_; std::unique_ptr eventHandler_; + mutable PointerEventsProcessor pointerEventsProcessor_; mutable ReactEventPriority currentEventPriority_; }; diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/primitives.h b/packages/react-native/ReactCommon/react/renderer/uimanager/primitives.h index 629a37b658934a..2d1426cb65957a 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/primitives.h @@ -12,10 +12,10 @@ #include #include #include -#include #include #include #include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/utils/ContextContainer.h b/packages/react-native/ReactCommon/react/utils/ContextContainer.h index f71fb759493683..d9b602240deab4 100644 --- a/packages/react-native/ReactCommon/react/utils/ContextContainer.h +++ b/packages/react-native/ReactCommon/react/utils/ContextContainer.h @@ -82,7 +82,7 @@ class ContextContainer final { react_native_assert( instances_.find(key) != instances_.end() && "ContextContainer doesn't have an instance for given key."); - return *std::static_pointer_cast(instances_.at(key)); + return *static_cast(instances_.at(key).get()); } /* @@ -99,7 +99,7 @@ class ContextContainer final { return {}; } - return *std::static_pointer_cast(iterator->second); + return *static_cast(iterator->second.get()); } private: diff --git a/packages/react-native/ReactCommon/react/renderer/core/CoreFeatures.cpp b/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp similarity index 92% rename from packages/react-native/ReactCommon/react/renderer/core/CoreFeatures.cpp rename to packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp index a15227df1d06af..b23cdfbb125864 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/CoreFeatures.cpp +++ b/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp @@ -15,7 +15,6 @@ bool CoreFeatures::blockPaintForUseLayoutEffect = false; bool CoreFeatures::useNativeState = false; bool CoreFeatures::cacheLastTextMeasurement = false; bool CoreFeatures::cancelImageDownloadsOnRecycle = false; -bool CoreFeatures::disableTransactionCommit = false; bool CoreFeatures::enableGranularScrollViewStateUpdatesIOS = false; bool CoreFeatures::enableMountHooks = false; diff --git a/packages/react-native/ReactCommon/react/renderer/core/CoreFeatures.h b/packages/react-native/ReactCommon/react/utils/CoreFeatures.h similarity index 90% rename from packages/react-native/ReactCommon/react/renderer/core/CoreFeatures.h rename to packages/react-native/ReactCommon/react/utils/CoreFeatures.h index 9c6cb00ba93eb6..84612fcfc97a58 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/CoreFeatures.h +++ b/packages/react-native/ReactCommon/react/utils/CoreFeatures.h @@ -44,11 +44,6 @@ class CoreFeatures { // from view hierarchy. This feature flag enables this feature. static bool cancelImageDownloadsOnRecycle; - // On iOS, every transaction is wrapperd in [CATransaction begin] and - // [CATransaction end] This feature flag disables it to measure its impact in - // production. - static bool disableTransactionCommit; - // When enabled, RCTScrollViewComponentView will trigger ShadowTree state // updates for all changes in scroll position. static bool enableGranularScrollViewStateUpdatesIOS; diff --git a/packages/react-native/ReactCommon/react/utils/React-utils.podspec b/packages/react-native/ReactCommon/react/utils/React-utils.podspec index d262c559241052..18370236534029 100644 --- a/packages/react-native/ReactCommon/react/utils/React-utils.podspec +++ b/packages/react-native/ReactCommon/react/utils/React-utils.podspec @@ -42,13 +42,13 @@ Pod::Spec.new do |s| s.compiler_flags = folly_compiler_flags s.header_dir = "react/utils" s.exclude_files = "tests" - s.pod_target_xcconfig = { - "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", - "HEADER_SEARCH_PATHS" => header_search_paths.join(' ')} + s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "HEADER_SEARCH_PATHS" => header_search_paths.join(' '), + "DEFINES_MODULE" => "YES" } if ENV['USE_FRAMEWORKS'] s.module_name = "React_utils" - s.header_mappings_dir = "../.." + s.header_mappings_dir = File.absolute_path("../..") end s.dependency "RCT-Folly", folly_version diff --git a/packages/react-native/ReactCommon/react/utils/SharedFunction.h b/packages/react-native/ReactCommon/react/utils/SharedFunction.h index 70db3e378bda1f..d44d8102fdc668 100644 --- a/packages/react-native/ReactCommon/react/utils/SharedFunction.h +++ b/packages/react-native/ReactCommon/react/utils/SharedFunction.h @@ -21,9 +21,9 @@ namespace facebook::react { * - When captured by `std::function` arguments are not copyable; * - When we need to replace the content of the callable later on the go. */ -template +template class SharedFunction { - using T = ReturnT(ArgumentT...); + using T = void(ArgumentT...); struct Pair { Pair(std::function &&function) : function(std::move(function)) {} @@ -46,9 +46,11 @@ class SharedFunction { pair_->function = function; } - ReturnT operator()(ArgumentT... args) const { + void operator()(ArgumentT... args) const { std::shared_lock lock(pair_->mutex); - return pair_->function(args...); + if (pair_->function) { + pair_->function(args...); + } } private: diff --git a/packages/react-native/ReactCommon/yoga/cmake/project-defaults.cmake b/packages/react-native/ReactCommon/yoga/cmake/project-defaults.cmake index 87f0e6b791a614..d02a2836df6c38 100644 --- a/packages/react-native/ReactCommon/yoga/cmake/project-defaults.cmake +++ b/packages/react-native/ReactCommon/yoga/cmake/project-defaults.cmake @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -33,6 +33,7 @@ add_compile_options( -fexceptions # Enable warnings and warnings as errors -Wall + -Wextra -Werror # Disable RTTI $<$:-fno-rtti> diff --git a/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h b/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h index e544defae72248..7c91550585d20a 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h +++ b/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h @@ -13,10 +13,7 @@ #include -namespace facebook { -namespace yoga { - -namespace detail { +namespace facebook::yoga::detail { // std::bitset with one bit for each option defined in YG_ENUM_SEQ_DECL template @@ -68,6 +65,4 @@ inline void setBooleanData(uint8_t& flags, size_t index, bool value) { } } -} // namespace detail -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::detail diff --git a/packages/react-native/ReactCommon/yoga/yoga/CompactValue.h b/packages/react-native/ReactCommon/yoga/yoga/CompactValue.h index 20462ce35d4fcc..9d494500111f5f 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/CompactValue.h +++ b/packages/react-native/ReactCommon/yoga/yoga/CompactValue.h @@ -38,9 +38,7 @@ static_assert( #define VISIBLE_FOR_TESTING private: #endif -namespace facebook { -namespace yoga { -namespace detail { +namespace facebook::yoga::detail { // This class stores YGValue in 32 bits. // - The value does not matter for Undefined and Auto. NaNs are used for their @@ -209,6 +207,4 @@ constexpr bool operator!=(CompactValue a, CompactValue b) noexcept { return !(a == b); } -} // namespace detail -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::detail diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.cpp b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.cpp index 5bf85f4a1b82df..93c16c69bf3ab4 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.cpp @@ -9,16 +9,14 @@ using namespace facebook::yoga; -namespace facebook { -namespace yoga { +namespace facebook::yoga { bool configUpdateInvalidatesLayout(YGConfigRef a, YGConfigRef b) { return a->getErrata() != b->getErrata() || a->getEnabledExperiments() != b->getEnabledExperiments() || a->getPointScaleFactor() != b->getPointScaleFactor() || a->useWebDefaults() != b->useWebDefaults(); } -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga YGConfig::YGConfig(YGLogger logger) : cloneNodeCallback_{nullptr} { setLogger(logger); diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h index d7c7f49fde979f..391e250080de00 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h @@ -12,8 +12,7 @@ #include "BitUtils.h" #include "Yoga-internal.h" -namespace facebook { -namespace yoga { +namespace facebook::yoga { // Whether moving a node from config "a" to config "b" should dirty previously // calculated layout results. @@ -48,8 +47,7 @@ struct YGConfigFlags { }; #pragma pack(pop) -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga struct YOGA_EXPORT YGConfig { YGConfig(YGLogger logger); diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp index 96b424a3bfd6e9..e8ace4b38efbc4 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp @@ -107,8 +107,8 @@ const char* YGExperimentalFeatureToString(const YGExperimentalFeature value) { return "web-flex-basis"; case YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge: return "absolute-percentage-against-padding-edge"; - case YGExperimentalFeatureFixAbsoluteTrailingColumnMargin: - return "fix-absolute-trailing-column-margin"; + case YGExperimentalFeatureFixJNILocalRefOverflows: + return "fix-jnilocal-ref-overflows"; } return "unknown"; } diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h index 72146fe279867e..a502d39b161254 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h @@ -66,7 +66,7 @@ YG_ENUM_SEQ_DECL( YGExperimentalFeature, YGExperimentalFeatureWebFlexBasis, YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge, - YGExperimentalFeatureFixAbsoluteTrailingColumnMargin) + YGExperimentalFeatureFixJNILocalRefOverflows) YG_ENUM_SEQ_DECL( YGFlexDirection, diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGMacros.h b/packages/react-native/ReactCommon/yoga/yoga/YGMacros.h index cd137117d27d52..18bf6d3f4063a5 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGMacros.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGMacros.h @@ -95,9 +95,8 @@ #endif #ifdef __cplusplus -namespace facebook { -namespace yoga { -namespace enums { + +namespace facebook::yoga::enums { template constexpr int count(); // can't use `= delete` due to a defect in clang < 3.9 @@ -109,9 +108,7 @@ constexpr int n() { } } // namespace detail -} // namespace enums -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::enums #endif #define YG_ENUM_DECL(NAME, ...) \ @@ -122,16 +119,13 @@ constexpr int n() { #define YG_ENUM_SEQ_DECL(NAME, ...) \ YG_ENUM_DECL(NAME, __VA_ARGS__) \ YG_EXTERN_C_END \ - namespace facebook { \ - namespace yoga { \ - namespace enums { \ + \ + namespace facebook::yoga::enums { \ template <> \ constexpr int count() { \ return detail::n<__VA_ARGS__>(); \ } \ } \ - } \ - } \ YG_EXTERN_C_BEGIN #else #define YG_ENUM_SEQ_DECL YG_ENUM_DECL diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.cpp b/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.cpp index d4d3499a3f8ae5..7aa50f07d02176 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.cpp @@ -16,8 +16,7 @@ #include "Yoga-internal.h" #include "Utils.h" -namespace facebook { -namespace yoga { +namespace facebook::yoga { typedef std::string string; static void indent(string& base, uint32_t level) { @@ -242,6 +241,6 @@ void YGNodeToString( } appendFormattedString(str, ""); } -} // namespace yoga -} // namespace facebook + +} // namespace facebook::yoga #endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h b/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h index ac550e9611c295..7648f83c7bbc50 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h @@ -13,8 +13,7 @@ #include -namespace facebook { -namespace yoga { +namespace facebook::yoga { void YGNodeToString( std::string& str, @@ -22,7 +21,6 @@ void YGNodeToString( YGPrintOptions options, uint32_t level); -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga #endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h b/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h index 5c5f11c77b0672..c16c2ad5775c2b 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h +++ b/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h @@ -33,8 +33,7 @@ void YGNodeDeallocate(YGNodeRef node); YG_EXTERN_C_END -namespace facebook { -namespace yoga { +namespace facebook::yoga { inline bool isUndefined(float value) { return std::isnan(value); @@ -46,8 +45,7 @@ inline bool isUndefined(double value) { void throwLogicalErrorWithMessage(const char* message); -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga extern const std::array trailing; extern const std::array leading; @@ -103,9 +101,7 @@ struct YGCachedMeasurement { // 98% of analyzed layouts require less than 8 entries. #define YG_MAX_CACHED_RESULT_COUNT 8 -namespace facebook { -namespace yoga { -namespace detail { +namespace facebook::yoga::detail { template class Values { @@ -149,9 +145,8 @@ class Values { Values& operator=(const Values& other) = default; }; -} // namespace detail -} // namespace yoga -} // namespace facebook + +} // namespace facebook::yoga::detail static const float kDefaultFlexGrow = 0.0f; static const float kDefaultFlexShrink = 0.0f; diff --git a/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp b/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp index 798972c0a420ce..ab0aa82526dbae 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp @@ -1543,19 +1543,13 @@ static void YGNodeAbsoluteLayoutChild( depth, generationCount); - auto trailingMarginOuterSize = - node->getConfig()->isExperimentalFeatureEnabled( - YGExperimentalFeatureFixAbsoluteTrailingColumnMargin) - ? isMainAxisRow ? height : width - : width; - if (child->isTrailingPosDefined(mainAxis) && !child->isLeadingPositionDefined(mainAxis)) { child->setLayoutPosition( node->getLayout().measuredDimensions[dim[mainAxis]] - child->getLayout().measuredDimensions[dim[mainAxis]] - node->getTrailingBorder(mainAxis) - - child->getTrailingMargin(mainAxis, trailingMarginOuterSize) + child->getTrailingMargin(mainAxis, isMainAxisRow ? width : height) .unwrap() - child->getTrailingPosition(mainAxis, isMainAxisRow ? width : height) .unwrap(), @@ -1598,7 +1592,7 @@ static void YGNodeAbsoluteLayoutChild( node->getLayout().measuredDimensions[dim[crossAxis]] - child->getLayout().measuredDimensions[dim[crossAxis]] - node->getTrailingBorder(crossAxis) - - child->getTrailingMargin(crossAxis, trailingMarginOuterSize) + child->getTrailingMargin(crossAxis, isMainAxisRow ? height : width) .unwrap() - child ->getTrailingPosition(crossAxis, isMainAxisRow ? height : width) diff --git a/packages/react-native/ReactCommon/yoga/yoga/event/event.cpp b/packages/react-native/ReactCommon/yoga/yoga/event/event.cpp index 152c4e16f5c996..ee47331d85a7e6 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/event/event.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/event/event.cpp @@ -9,8 +9,7 @@ #include #include -namespace facebook { -namespace yoga { +namespace facebook::yoga { const char* LayoutPassReasonToString(const LayoutPassReason value) { switch (value) { @@ -82,5 +81,4 @@ void Event::publish(const YGNode& node, Type eventType, const Data& eventData) { } } -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga diff --git a/packages/react-native/ReactCommon/yoga/yoga/event/event.h b/packages/react-native/ReactCommon/yoga/yoga/event/event.h index c917467ebb1a32..4c34fa66d60256 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/event/event.h +++ b/packages/react-native/ReactCommon/yoga/yoga/event/event.h @@ -16,8 +16,7 @@ struct YGConfig; struct YGNode; -namespace facebook { -namespace yoga { +namespace facebook::yoga { enum struct LayoutType : int { kLayout = 0, @@ -140,5 +139,4 @@ struct Event::TypedData { void* layoutContext; }; -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga diff --git a/packages/react-native/ReactCommon/yoga/yoga/log.cpp b/packages/react-native/ReactCommon/yoga/yoga/log.cpp index 6cdd3f69f478b3..51040592a27955 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/log.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/log.cpp @@ -11,9 +11,7 @@ #include "YGConfig.h" #include "YGNode.h" -namespace facebook { -namespace yoga { -namespace detail { +namespace facebook::yoga::detail { namespace { @@ -59,6 +57,4 @@ void Log::log( va_end(args); } -} // namespace detail -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::detail diff --git a/packages/react-native/ReactCommon/yoga/yoga/log.h b/packages/react-native/ReactCommon/yoga/yoga/log.h index 419724e22338e3..070a164da387ce 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/log.h +++ b/packages/react-native/ReactCommon/yoga/yoga/log.h @@ -12,10 +12,7 @@ struct YGNode; struct YGConfig; -namespace facebook { -namespace yoga { - -namespace detail { +namespace facebook::yoga::detail { struct Log { static void log( @@ -33,6 +30,4 @@ struct Log { ...) noexcept; }; -} // namespace detail -} // namespace yoga -} // namespace facebook +} // namespace facebook::yoga::detail diff --git a/packages/react-native/build.gradle.kts b/packages/react-native/build.gradle.kts index 6ac661e1d42c6f..47a482604cda2b 100644 --- a/packages/react-native/build.gradle.kts +++ b/packages/react-native/build.gradle.kts @@ -11,8 +11,8 @@ // their settings.gradle.kts file. // More on this here: https://reactnative.dev/contributing/how-to-build-from-source plugins { - id("com.android.library") version "7.4.2" apply false - id("com.android.application") version "7.4.2" apply false + id("com.android.library") version "8.0.2" apply false + id("com.android.application") version "8.0.2" apply false id("de.undercouch.download") version "5.0.1" apply false kotlin("android") version "1.8.0" apply false } diff --git a/packages/react-native/flow/global.js b/packages/react-native/flow/global.js index e7f9814671a5a6..676f09957d259d 100644 --- a/packages/react-native/flow/global.js +++ b/packages/react-native/flow/global.js @@ -27,9 +27,7 @@ declare var global: { }, // setUpPerformance - +performance: { - +now: () => number, - }, + +performance: Performance, // setUpXHR +XMLHttpRequest: typeof XMLHttpRequest, diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 67225d5695f41f..5af074d98e22db 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -21,7 +21,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": ">=16" + "node": ">=18" }, "bin": "./cli.js", "types": "types", @@ -62,8 +62,6 @@ "scripts/hermes/prepare-hermes-for-build.js", "scripts/ios-configure-glog.sh", "scripts/xcode/with-environment.sh", - "scripts/launchPackager.bat", - "scripts/launchPackager.command", "scripts/native_modules.rb", "scripts/node-binary.sh", "scripts/packager.sh", @@ -94,9 +92,9 @@ }, "dependencies": { "@jest/create-cache-key-function": "^29.2.1", - "@react-native-community/cli": "12.0.0-alpha.3", - "@react-native-community/cli-platform-android": "12.0.0-alpha.3", - "@react-native-community/cli-platform-ios": "12.0.0-alpha.3", + "@react-native-community/cli": "12.0.0-alpha.7", + "@react-native-community/cli-platform-android": "12.0.0-alpha.7", + "@react-native-community/cli-platform-ios": "12.0.0-alpha.7", "@react-native/assets-registry": "^0.73.0", "@react-native/codegen": "^0.73.0", "@react-native/gradle-plugin": "^0.73.0", @@ -105,16 +103,17 @@ "@react-native/virtualized-lists": "^0.73.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", + "ansi-regex": "^5.0.0", "base64-js": "^1.5.1", - "deprecated-react-native-prop-types": "4.1.0", + "deprecated-react-native-prop-types": "4.2.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "jest-environment-node": "^29.2.1", "jsc-android": "^250231.0.0", "memoize-one": "^5.0.0", - "metro-runtime": "0.76.2", - "metro-source-map": "0.76.2", + "metro-runtime": "0.76.7", + "metro-source-map": "0.76.7", "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", "pretty-format": "^26.5.2", diff --git a/packages/react-native/react-native.config.js b/packages/react-native/react-native.config.js index b9c5fa3d76092c..b5d4c5b6e3651c 100644 --- a/packages/react-native/react-native.config.js +++ b/packages/react-native/react-native.config.js @@ -24,16 +24,4 @@ module.exports = { dependencyConfig: android.dependencyConfig, }, }, - /** - * Used when running RNTester (with React Native from source) - */ - reactNativePath: '.', - project: { - ios: { - sourceDir: '../packages/rn-tester', - }, - android: { - sourceDir: '../packages/rn-tester', - }, - }, }; diff --git a/packages/react-native/scripts/.packager.env b/packages/react-native/scripts/.packager.env deleted file mode 100644 index 361f5fb47d34ac..00000000000000 --- a/packages/react-native/scripts/.packager.env +++ /dev/null @@ -1 +0,0 @@ -export RCT_METRO_PORT=8081 diff --git a/packages/react-native/scripts/cocoapods/__tests__/codegen-test.rb b/packages/react-native/scripts/cocoapods/__tests__/codegen-test.rb index 70573b4f3162ef..44ebdb71b6f37c 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/codegen-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/codegen-test.rb @@ -182,6 +182,47 @@ def testCheckAndGenerateEmptyThirdPartyProvider_whenBothMissing_buildCodegen() }) end + def testCheckAndGenerateEmptyThirdPartyProvider_withAbsoluteReactNativePath_buildCodegen() + # Arrange + rn_path = '/Users/distiller/react-native/packages/react-native' + codegen_cli_path = rn_path + "/../@react-native/codegen" + DirMock.mocked_existing_dirs([ + codegen_cli_path, + ]) + + # Act + checkAndGenerateEmptyThirdPartyProvider!(rn_path, false, dir_manager: DirMock, file_manager: FileMock) + + # Assert + assert_equal(Pathname.pwd_invocation_count, 1) + assert_equal(Pod::Config.instance.installation_root.relative_path_from_invocation_count, 1) + assert_equal(FileMock.exist_invocation_params, [ + rn_path + "/React/Fabric/" + @third_party_provider_header, + rn_path + "/React/Fabric/" + @tmp_schema_list_file + ]) + assert_equal(DirMock.exist_invocation_params, [ + rn_path + "/../react-native-codegen", + codegen_cli_path, + codegen_cli_path + "/lib", + ]) + assert_equal(Pod::UI.collected_messages, [ + "[Codegen] building #{codegen_cli_path}.", + "[Codegen] generating an empty RCTThirdPartyFabricComponentsProvider" + ]) + assert_equal($collected_commands, [rn_path + "/../@react-native/codegen/scripts/oss/build.sh"]) + assert_equal(FileMock.open_files[0].collected_write, ["[]"]) + assert_equal(FileMock.open_files[0].fsync_invocation_count, 1) + assert_equal(Pod::Executable.executed_commands[0], { + "command" => "node", + "arguments" => [ + rn_path + "/scripts/generate-provider-cli.js", + "--platform", 'ios', + "--schemaListPath", rn_path + "/React/Fabric/" + @tmp_schema_list_file, + "--outputDir", rn_path + "/React/Fabric" + ] + }) + end + # ================= # # Test - RunCodegen # # ================= # diff --git a/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb b/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb index 297ed18bca59bb..b105737840a809 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb @@ -373,7 +373,7 @@ def testUseReactCodegenDiscovery_whenParametersAreGood_executeCodegen '[Codegen] warn: using experimental new codegen integration' ]) assert_equal(codegen_utils_mock.get_react_codegen_script_phases_params, [{ - :app_path => "~/app", + :app_path => app_path, :config_file_dir => "", :config_key => "codegenConfig", :fabric_enabled => false, @@ -382,7 +382,7 @@ def testUseReactCodegenDiscovery_whenParametersAreGood_executeCodegen assert_equal(codegen_utils_mock.get_react_codegen_spec_params, [{ :fabric_enabled => false, :folly_version=>"2021.07.22.00", - :package_json_file => "../node_modules/react-native/package.json", + :package_json_file => "#{app_path}/ios/../node_modules/react-native/package.json", :script_phases => "echo TestScript" }]) assert_equal(codegen_utils_mock.generate_react_codegen_spec_params, [{ @@ -577,8 +577,9 @@ def get_podspec_fabric_and_script_phases(script_phases) 'React-graphics': [], 'React-rncore': [], 'React-Fabric': [], - 'React-debug': [], 'React-utils': [], + 'React-debug': [], + 'React-rendererdebug': [], }) specs[:'script_phases'] = script_phases @@ -590,13 +591,14 @@ def get_podspec_when_use_frameworks specs = get_podspec_no_fabric_no_script() specs["pod_target_xcconfig"]["FRAMEWORK_SEARCH_PATHS"].concat([]) - specs["pod_target_xcconfig"]["HEADER_SEARCH_PATHS"].concat(" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_TARGET_SRCROOT)\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-Fabric/React_Fabric.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-FabricImage/React_FabricImage.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-graphics/React_graphics.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-RCTFabric/RCTFabric.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\"") + specs["pod_target_xcconfig"]["HEADER_SEARCH_PATHS"].concat(" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_TARGET_SRCROOT)\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-Fabric/React_Fabric.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-FabricImage/React_FabricImage.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-graphics/React_graphics.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-RCTFabric/RCTFabric.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-utils/React_utils.framework/Headers\"") specs[:dependencies].merge!({ 'React-graphics': [], 'React-Fabric': [], - 'React-debug': [], 'React-utils': [], + 'React-debug': [], + 'React-rendererdebug': [], }) return specs diff --git a/packages/react-native/scripts/cocoapods/__tests__/flipper-test.rb b/packages/react-native/scripts/cocoapods/__tests__/flipper-test.rb index 12de576beb3681..6daec762f57de2 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/flipper-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/flipper-test.rb @@ -77,10 +77,6 @@ def test_postInstall_updatesThePodCorrectly flipper_post_install(installer) # Assert - yoga_target = installer.target_with_name("YogaKit") - yoga_target.build_configurations.each do |config| - assert_equal(config.build_settings['SWIFT_VERSION'], '4.1') - end reactCore_target = installer.target_with_name("React-RCTAppDelegate") reactCore_target.build_configurations.each do |config| @@ -129,14 +125,6 @@ def check_flipper_pod(name, expectedVersion, expectedConfigurations) def prepare_mocked_installer return InstallerMock.new( PodsProjectMock.new([ - TargetMock.new( - "YogaKit", - [ - BuildConfigurationMock.new("Debug", is_debug: true), - BuildConfigurationMock.new("Release", is_debug: false), - BuildConfigurationMock.new("CustomConfig", is_debug: true), - ] - ), TargetMock.new( "React-Core", [ diff --git a/packages/react-native/scripts/cocoapods/__tests__/new_architecture-test.rb b/packages/react-native/scripts/cocoapods/__tests__/new_architecture-test.rb index 1f0c04c216a168..8eb56511fe7a12 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/new_architecture-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/new_architecture-test.rb @@ -129,7 +129,7 @@ def test_installModulesDependencies_whenNewArchEnabledAndNewArchAndNoSearchPaths # Assert assert_equal(spec.compiler_flags, NewArchitectureHelper.folly_compiler_flags) - assert_equal(spec.pod_target_xcconfig["HEADER_SEARCH_PATHS"], "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/Yoga\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-FabricImage/React_FabricImage.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\"") + assert_equal(spec.pod_target_xcconfig["HEADER_SEARCH_PATHS"], "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/Yoga\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-FabricImage/React_FabricImage.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers\"") assert_equal(spec.pod_target_xcconfig["CLANG_CXX_LANGUAGE_STANDARD"], "c++17") assert_equal(spec.pod_target_xcconfig["OTHER_CPLUSPLUSFLAGS"], "$(inherited) -DRCT_NEW_ARCH_ENABLED=1 -DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1") assert_equal( @@ -148,8 +148,9 @@ def test_installModulesDependencies_whenNewArchEnabledAndNewArchAndNoSearchPaths { :dependency_name => "Yoga" }, { :dependency_name => "React-Fabric" }, { :dependency_name => "React-graphics" }, - { :dependency_name => "React-debug" }, { :dependency_name => "React-utils" }, + { :dependency_name => "React-debug" }, + { :dependency_name => "React-rendererdebug" }, { :dependency_name => "hermes-engine" } ]) end @@ -168,7 +169,7 @@ def test_installModulesDependencies_whenNewArchDisabledAndSearchPathsAndCompiler # Assert assert_equal(spec.compiler_flags, "-Wno-nullability-completeness #{NewArchitectureHelper.folly_compiler_flags}") - assert_equal(spec.pod_target_xcconfig["HEADER_SEARCH_PATHS"], "#{other_flags} \"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/Yoga\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-FabricImage/React_FabricImage.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\"") + assert_equal(spec.pod_target_xcconfig["HEADER_SEARCH_PATHS"], "#{other_flags} \"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/Yoga\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-FabricImage/React_FabricImage.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers\"") assert_equal(spec.pod_target_xcconfig["CLANG_CXX_LANGUAGE_STANDARD"], "c++17") assert_equal( spec.dependencies, diff --git a/packages/react-native/scripts/cocoapods/__tests__/test_utils/InstallerMock.rb b/packages/react-native/scripts/cocoapods/__tests__/test_utils/InstallerMock.rb index 7c1c95de4d4116..6c0bfc7a353e76 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/test_utils/InstallerMock.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/test_utils/InstallerMock.rb @@ -114,14 +114,15 @@ class UserProjectMock attr_reader :path attr_reader :build_configurations attr_reader :native_targets + attr_reader :files attr_reader :save_invocation_count - - def initialize(path = "/test/path.xcproj", build_configurations = [], native_targets: []) - @path = path + def initialize(path = "/test/path.xcproj", build_configurations = [], parent = "/test", native_targets: [], files: []) + @path = Pathname.new(path, parent) @build_configurations = build_configurations @native_targets = native_targets + @files = files @save_invocation_count = 0 end @@ -130,6 +131,16 @@ def save() end end +class PBXFileRefMock + attr_reader :name + attr_reader :path + + def initialize(name) + @name = name + @path = name + end +end + class XCConfigMock attr_reader :name attr_accessor :attributes diff --git a/packages/react-native/scripts/cocoapods/__tests__/test_utils/PathnameMock.rb b/packages/react-native/scripts/cocoapods/__tests__/test_utils/PathnameMock.rb index 0e4078fa03450c..883aeea077f813 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/test_utils/PathnameMock.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/test_utils/PathnameMock.rb @@ -9,8 +9,9 @@ class Pathname attr_reader :path - def initialize(path) + def initialize(path, parent = "") @path = path + @parent = parent end def realpath @@ -21,6 +22,10 @@ def relative_path_from(path) return @path end + def parent + return @parent + end + def self.pwd!(pwd) @@pwd = pwd end @@ -34,6 +39,9 @@ def self.pwd_invocation_count return @@pwd_invocation_count end + def to_s + return @path + end def self.reset() @@pwd = "" diff --git a/packages/react-native/scripts/cocoapods/__tests__/test_utils/XcodeprojMock.rb b/packages/react-native/scripts/cocoapods/__tests__/test_utils/XcodeprojMock.rb new file mode 100644 index 00000000000000..7737a1bba45a33 --- /dev/null +++ b/packages/react-native/scripts/cocoapods/__tests__/test_utils/XcodeprojMock.rb @@ -0,0 +1,21 @@ +# 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. + +module Xcodeproj + class Plist + @@path_to_file_mapping = Hash.new + def self.read_from_path(path) + return @@path_to_file_mapping[path] + end + + def self.write_to_path(hash, path) + @@path_to_file_mapping[path] = hash + end + + def self.reset() + @@path_to_file_mapping.clear + end + end +end diff --git a/packages/react-native/scripts/cocoapods/__tests__/utils-test.rb b/packages/react-native/scripts/cocoapods/__tests__/utils-test.rb index 82209f2dc1d49e..1d65edb1f97580 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/utils-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/utils-test.rb @@ -14,6 +14,7 @@ require_relative "./test_utils/systemUtils.rb" require_relative "./test_utils/PathnameMock.rb" require_relative "./test_utils/TargetDefinitionMock.rb" +require_relative "./test_utils/XcodeprojMock.rb" class UtilsTests < Test::Unit::TestCase def setup @@ -28,6 +29,7 @@ def teardown Pod::Config.reset() SysctlChecker.reset() Environment.reset() + Xcodeproj::Plist.reset() ENV['RCT_NEW_ARCH_ENABLED'] = '0' ENV['USE_HERMES'] = '1' ENV['USE_FRAMEWORKS'] = nil @@ -324,7 +326,7 @@ def test_fixLibrarySearchPaths_correctlySetsTheSearchPathsForAllProjects first_target = prepare_target("FirstTarget") second_target = prepare_target("SecondTarget") third_target = prepare_target("ThirdTarget") - user_project_mock = UserProjectMock.new("a/path", [ + user_project_mock = UserProjectMock.new("/a/path", [ prepare_config("Debug"), prepare_config("Release"), ], @@ -434,7 +436,7 @@ def test_applyMacCatalystPatches_correctlyAppliesNecessaryPatches first_target = prepare_target("FirstTarget") second_target = prepare_target("SecondTarget") third_target = prepare_target("ThirdTarget", "com.apple.product-type.bundle") - user_project_mock = UserProjectMock.new("a/path", [ + user_project_mock = UserProjectMock.new("/a/path", [ prepare_config("Debug"), prepare_config("Release"), ], @@ -492,7 +494,7 @@ def test_applyXcode15Patch_correctlyAppliesNecessaryPatch }), ], nil) - user_project_mock = UserProjectMock.new("a/path", [ + user_project_mock = UserProjectMock.new("/a/path", [ prepare_config("Debug"), prepare_config("Release"), ], @@ -644,7 +646,7 @@ def test_updateSearchPaths_whenUseFrameworks_addsSearchPaths DependencyMock.new("React-ImageManager"), ]) third_target = prepare_target("ThirdTarget", "com.apple.product-type.bundle") - user_project_mock = UserProjectMock.new("a/path", [ + user_project_mock = UserProjectMock.new("/a/path", [ prepare_config("Debug"), prepare_config("Release"), ], @@ -688,7 +690,7 @@ def test_updateSearchPaths_whenNotUseFrameworks_addsSearchPaths first_target = prepare_target("FirstTarget") second_target = prepare_target("SecondTarget") third_target = prepare_target("ThirdTarget", "com.apple.product-type.bundle") - user_project_mock = UserProjectMock.new("a/path", [ + user_project_mock = UserProjectMock.new("/a/path", [ prepare_config("Debug"), prepare_config("Release"), ], @@ -750,7 +752,7 @@ def test_applyFlagsForFabric_whenFabricDisabled_doNothing first_target = prepare_target("FirstTarget") second_target = prepare_target("SecondTarget") third_target = prepare_target("ThirdTarget", "com.apple.product-type.bundle") - user_project_mock = UserProjectMock.new("a/path", [ + user_project_mock = UserProjectMock.new("/a/path", [ prepare_config("Debug"), prepare_config("Release"), ], @@ -772,6 +774,59 @@ def test_applyFlagsForFabric_whenFabricDisabled_doNothing assert_equal(config.build_settings["OTHER_CFLAGS"], "$(inherited)") end end + + # ============================== # + # Test - Apply ATS configuration # + # ============================== # + + def test_applyATSConfig_plistNil + # Arrange + user_project_mock = prepare_user_project_mock_with_plists() + pods_projects_mock = PodsProjectMock.new([], {"some_pod" => {}}) + installer = InstallerMock.new(pods_projects_mock, [ + AggregatedProjectMock.new(user_project_mock) + ]) + + # # Act + ReactNativePodsUtils.apply_ats_config(installer) + + # # Assert + assert_equal(user_project_mock.files.length, 2) + user_project_mock.files.each do |file| + path = File.join(user_project_mock.path.parent, file.name) + plist = Xcodeproj::Plist.read_from_path(path) + assert_equal(plist['NSAppTransportSecurity'], { + 'NSAllowsArbitraryLoads' => false, + 'NSAllowsLocalNetworking' => true, + }); + end + end + + def test_applyATSConfig_plistNonNil + # Arrange + user_project_mock = prepare_user_project_mock_with_plists() + pods_projects_mock = PodsProjectMock.new([], {"some_pod" => {}}) + installer = InstallerMock.new(pods_projects_mock, [ + AggregatedProjectMock.new(user_project_mock) + ]) + Xcodeproj::Plist.write_to_path({}, "/test/Info.plist") + Xcodeproj::Plist.write_to_path({}, "/test/Extension-Info.plist") + + # # Act + ReactNativePodsUtils.apply_ats_config(installer) + + # # Assert + assert_equal(user_project_mock.files.length, 2) + user_project_mock.files.each do |file| + path = File.join(user_project_mock.path.parent, file.name) + plist = Xcodeproj::Plist.read_from_path(path) + assert_equal(plist['NSAppTransportSecurity'], { + 'NSAllowsArbitraryLoads' => false, + 'NSAllowsLocalNetworking' => true, + }); + end + end + end # ===== # @@ -779,12 +834,19 @@ def test_applyFlagsForFabric_whenFabricDisabled_doNothing # ===== # def prepare_empty_user_project_mock - return UserProjectMock.new("a/path", [ + return UserProjectMock.new("/a/path", [ BuildConfigurationMock.new("Debug"), BuildConfigurationMock.new("Release"), ]) end +def prepare_user_project_mock_with_plists + return UserProjectMock.new(:files => [ + PBXFileRefMock.new("Info.plist"), + PBXFileRefMock.new("Extension-Info.plist"), + ]) +end + def prepare_config(config_name) return BuildConfigurationMock.new(config_name, {"LIBRARY_SEARCH_PATHS" => [ "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)", diff --git a/packages/react-native/scripts/cocoapods/bridgeless.rb b/packages/react-native/scripts/cocoapods/bridgeless.rb new file mode 100644 index 00000000000000..efbc030da6342c --- /dev/null +++ b/packages/react-native/scripts/cocoapods/bridgeless.rb @@ -0,0 +1,18 @@ +# 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. + + +# Set up Bridgeless dependencies +# +# @parameter react_native_path: relative path to react-native +def setup_bridgeless!(react_native_path: "../node_modules/react-native", use_hermes: true) + pod "React-jsitracing", :path => "#{react_native_path}/ReactCommon/hermes/executor/" + pod "React-runtimescheduler", :path => "#{react_native_path}/ReactCommon/react/renderer/runtimescheduler" + pod 'React-BridgelessCore', :path => "#{react_native_path}/ReactCommon/react/bridgeless" + pod 'React-BridgelessApple', :path => "#{react_native_path}/ReactCommon/react/bridgeless/platform/ios" + if use_hermes + pod 'React-BridgelessHermes', :path => "#{react_native_path}/ReactCommon/react/bridgeless" + end +end diff --git a/packages/react-native/scripts/cocoapods/codegen.rb b/packages/react-native/scripts/cocoapods/codegen.rb index 56d120fcceda05..9c8e83bbb887bc 100644 --- a/packages/react-native/scripts/cocoapods/codegen.rb +++ b/packages/react-native/scripts/cocoapods/codegen.rb @@ -11,8 +11,8 @@ # - dir_manager: a class that implements the `Dir` interface. Defaults to `Dir`, the Dependency can be injected for testing purposes. # @throws an error if it could not find the codegen folder. def build_codegen!(react_native_path, relative_installation_root, dir_manager: Dir) - codegen_repo_path = "#{relative_installation_root}/#{react_native_path}/../react-native-codegen"; - codegen_npm_path = "#{relative_installation_root}/#{react_native_path}/../@react-native/codegen"; + codegen_repo_path = "#{basePath(react_native_path, relative_installation_root)}/../react-native-codegen"; + codegen_npm_path = "#{basePath(react_native_path, relative_installation_root)}/../@react-native/codegen"; codegen_cli_path = "" if dir_manager.exist?(codegen_repo_path) @@ -61,7 +61,7 @@ def checkAndGenerateEmptyThirdPartyProvider!(react_native_path, new_arch_enabled Pod::Executable.execute_command( 'node', [ - "#{relative_installation_root}/#{react_native_path}/scripts/generate-provider-cli.js", + "#{basePath(react_native_path, relative_installation_root)}/scripts/generate-provider-cli.js", "--platform", 'ios', "--schemaListPath", temp_schema_list_path, "--outputDir", "#{output_dir}" @@ -108,3 +108,12 @@ def run_codegen!( codegen_utils.generate_react_codegen_podspec!(react_codegen_spec, codegen_output_dir) end end + +def basePath(react_native_path, relative_installation_root) + expanded_path = File.expand_path(react_native_path) + if expanded_path == react_native_path + react_native_path + else + File.join(relative_installation_root.to_s, react_native_path) + end +end diff --git a/packages/react-native/scripts/cocoapods/codegen_utils.rb b/packages/react-native/scripts/cocoapods/codegen_utils.rb index 1ea549fa094961..1f983213f38655 100644 --- a/packages/react-native/scripts/cocoapods/codegen_utils.rb +++ b/packages/react-native/scripts/cocoapods/codegen_utils.rb @@ -101,7 +101,8 @@ def get_react_codegen_spec(package_json_file, folly_version: '2021.07.22.00', fa "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\"", "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-RCTFabric/RCTFabric.framework/Headers\"", "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\"" + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers\"", + "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-utils/React_utils.framework/Headers\"", ]) end @@ -132,7 +133,7 @@ def get_react_codegen_spec(package_json_file, folly_version: '2021.07.22.00', fa "React-jsi": [], "ReactCommon/turbomodule/bridging": [], "ReactCommon/turbomodule/core": [], - "React-NativeModulesApple": [], + "React-NativeModulesApple": [], "glog": [], "DoubleConversion": [], } @@ -141,6 +142,7 @@ def get_react_codegen_spec(package_json_file, folly_version: '2021.07.22.00', fa if fabric_enabled spec[:'dependencies'].merge!({ 'React-graphics': [], + 'React-rendererdebug': [], 'React-Fabric': [], 'React-debug': [], 'React-utils': [], @@ -316,7 +318,7 @@ def use_react_native_codegen_discovery!( :config_key => config_key ) react_codegen_spec = codegen_utils.get_react_codegen_spec( - file_manager.join(react_native_path, "package.json"), + file_manager.join(relative_installation_root, react_native_path, "package.json"), :folly_version => folly_version, :fabric_enabled => fabric_enabled, :hermes_enabled => hermes_enabled, diff --git a/packages/react-native/scripts/cocoapods/flipper.rb b/packages/react-native/scripts/cocoapods/flipper.rb index 7206161e568560..5930723785f9e5 100644 --- a/packages/react-native/scripts/cocoapods/flipper.rb +++ b/packages/react-native/scripts/cocoapods/flipper.rb @@ -6,7 +6,7 @@ # Default versions of Flipper and related dependencies. # Update this map to bump the dependencies. $flipper_default_versions = { - 'Flipper' => '0.182.0', + 'Flipper' => '0.201.0', 'Flipper-Boost-iOSX' => '1.76.0.1.11', 'Flipper-DoubleConversion' => '3.2.0.1', 'Flipper-Fmt' => '7.1.7', @@ -64,18 +64,11 @@ def use_flipper_pods(versions = {}, configurations: ['Debug']) end # Applies some changes to some pods of the project: -# * it sets the Swift version for Yoga kit to 4.1 # * it sets the sonar-kit flag to React-Core pod # # @parameter installer: the installer object used to install the pods. def flipper_post_install(installer) installer.pods_project.targets.each do |target| - if target.name == 'YogaKit' - target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '4.1' - end - end - # Enable flipper for React-RCTAppDelegate Debug configuration if target.name == 'React-RCTAppDelegate' target.build_configurations.each do |config| diff --git a/packages/react-native/scripts/cocoapods/new_architecture.rb b/packages/react-native/scripts/cocoapods/new_architecture.rb index b9a51834c91269..a9884def75d994 100644 --- a/packages/react-native/scripts/cocoapods/new_architecture.rb +++ b/packages/react-native/scripts/cocoapods/new_architecture.rb @@ -109,8 +109,9 @@ def self.install_modules_dependencies(spec, new_arch_enabled, folly_version) header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\"" - header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\"" header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-utils/React_utils.framework/Headers\"" + header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-debug/React_debug.framework/Headers\"" + header_search_paths << "\"$(PODS_CONFIGURATION_BUILD_DIR)/React-rendererdebug/React_rendererdebug.framework/Headers\"" end header_search_paths_string = header_search_paths.join(" ") spec.compiler_flags = compiler_flags.empty? ? @@folly_compiler_flags : "#{compiler_flags} #{@@folly_compiler_flags}" @@ -137,8 +138,9 @@ def self.install_modules_dependencies(spec, new_arch_enabled, folly_version) spec.dependency "Yoga" spec.dependency "React-Fabric" spec.dependency "React-graphics" - spec.dependency "React-debug" spec.dependency "React-utils" + spec.dependency "React-debug" + spec.dependency "React-rendererdebug" if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" spec.dependency "hermes-engine" diff --git a/packages/react-native/scripts/cocoapods/utils.rb b/packages/react-native/scripts/cocoapods/utils.rb index fc823b54e41393..5ca482a16933f4 100644 --- a/packages/react-native/scripts/cocoapods/utils.rb +++ b/packages/react-native/scripts/cocoapods/utils.rb @@ -171,7 +171,7 @@ def self.fix_library_search_path(config) end if lib_search_paths.include?("$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)") || lib_search_paths.include?("\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"") - # $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) causes problem with Xcode 12.5 + arm64 (Apple M1) + # $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) causes problem with Xcode 12.5 + arm64 (Apple Silicon) # since the libraries there are only built for x86_64 and i386. lib_search_paths.delete("$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)") lib_search_paths.delete("\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"") @@ -396,6 +396,42 @@ def self.set_imagemanager_search_path(target_installation_result) ]) end + def self.get_plist_paths_from(user_project) + info_plists = user_project + .files + .select { |p| + p.name&.end_with?('Info.plist') + } + return info_plists + end + + def self.update_ats_in_plist(plistPaths, parent) + plistPaths.each do |plistPath| + fullPlistPath = File.join(parent, plistPath.path) + plist = Xcodeproj::Plist.read_from_path(fullPlistPath) + ats_configs = { + "NSAllowsArbitraryLoads" => false, + "NSAllowsLocalNetworking" => true, + } + if plist.nil? + plist = { + "NSAppTransportSecurity" => ats_configs + } + else + plist["NSAppTransportSecurity"] = ats_configs + end + Xcodeproj::Plist.write_to_path(plist, fullPlistPath) + end + end + + def self.apply_ats_config(installer) + user_project = installer.aggregate_targets + .map{ |t| t.user_project } + .first + plistPaths = self.get_plist_paths_from(user_project) + self.update_ats_in_plist(plistPaths, user_project.path.parent) + end + def self.react_native_pods return [ "DoubleConversion", diff --git a/packages/react-native/scripts/find-node-for-xcode.sh b/packages/react-native/scripts/find-node-for-xcode.sh index e928cd8e31be52..a36bbc23056d8e 100644 --- a/packages/react-native/scripts/find-node-for-xcode.sh +++ b/packages/react-native/scripts/find-node-for-xcode.sh @@ -21,10 +21,10 @@ set -e # the running shell process will choose a node binary and a global package directory breaks version managers unset PREFIX -# Support Homebrew on M1 -HOMEBREW_M1_BIN=/opt/homebrew/bin -if [[ -d $HOMEBREW_M1_BIN && ! $PATH =~ $HOMEBREW_M1_BIN ]]; then - export PATH="$HOMEBREW_M1_BIN:$PATH" +# Support Homebrew on Apple Silicon +HOMEBREW_APPLE_SILICON_BIN=/opt/homebrew/bin +if [[ -d $HOMEBREW_APPLE_SILICON_BIN && ! $PATH =~ $HOMEBREW_APPLE_SILICON_BIN ]]; then + export PATH="$HOMEBREW_APPLE_SILICON_BIN:$PATH" fi # Define NVM_DIR and source the nvm.sh setup script diff --git a/packages/react-native/scripts/launchPackager.bat b/packages/react-native/scripts/launchPackager.bat deleted file mode 100644 index 5060dcd9a275b8..00000000000000 --- a/packages/react-native/scripts/launchPackager.bat +++ /dev/null @@ -1,12 +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. - -@echo off -title Metro -call .packager.bat -cd ../../../ -node "%~dp0..\cli.js" start -pause -exit diff --git a/packages/react-native/scripts/launchPackager.command b/packages/react-native/scripts/launchPackager.command deleted file mode 100755 index efd1f2e4eed160..00000000000000 --- a/packages/react-native/scripts/launchPackager.command +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# 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. - -# Set terminal title -echo -en "\\033]0;Metro\\a" -clear - -THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd) - -export PODS_ROOT="$THIS_DIR/../../../ios/Pods" -WITH_ENVIRONMENT="$THIS_DIR/xcode/with-environment.sh" -source $WITH_ENVIRONMENT - -# export packager environment variables -source "$THIS_DIR/.packager.env" - -if [ -n "${RCT_PACKAGER_LOGS_DIR}" ] ; then - echo "Writing logs to $RCT_PACKAGER_LOGS_DIR" - # shellcheck source=/dev/null - RCT_PACKAGER_LOG_PATH="$RCT_PACKAGER_LOGS_DIR/metro.log" \ - . "$THIS_DIR/packager.sh" \ - > "$RCT_PACKAGER_LOGS_DIR/packager.stdout.log" \ - 2> "$RCT_PACKAGER_LOGS_DIR/packager.stderr.log" -else - # shellcheck source=/dev/null - . "$THIS_DIR/packager.sh" -fi -if [[ -z "$CI" ]]; then - echo "Process terminated. Press to close the window" - read -r -fi diff --git a/packages/react-native/scripts/react-native-xcode.sh b/packages/react-native/scripts/react-native-xcode.sh index 080ed233ec25be..7e2f1190771cb5 100755 --- a/packages/react-native/scripts/react-native-xcode.sh +++ b/packages/react-native/scripts/react-native-xcode.sh @@ -176,7 +176,7 @@ else if [[ $EMIT_SOURCEMAP == true ]]; then EXTRA_COMPILER_ARGS="$EXTRA_COMPILER_ARGS -output-source-map" fi - "$HERMES_CLI_PATH" -emit-binary -max-diagnostic-width=80 "$EXTRA_COMPILER_ARGS" -out "$DEST/main.jsbundle" "$BUNDLE_FILE" + "$HERMES_CLI_PATH" -emit-binary -max-diagnostic-width=80 $EXTRA_COMPILER_ARGS -out "$DEST/main.jsbundle" "$BUNDLE_FILE" if [[ $EMIT_SOURCEMAP == true ]]; then HBC_SOURCEMAP_FILE="$DEST/main.jsbundle.map" "$NODE_BINARY" "$COMPOSE_SOURCEMAP_PATH" "$PACKAGER_SOURCEMAP_FILE" "$HBC_SOURCEMAP_FILE" -o "$SOURCEMAP_FILE" diff --git a/packages/react-native/scripts/react_native_pods.rb b/packages/react-native/scripts/react_native_pods.rb index 40d5ee3b2b2579..1bcb13195f2559 100644 --- a/packages/react-native/scripts/react_native_pods.rb +++ b/packages/react-native/scripts/react_native_pods.rb @@ -15,6 +15,7 @@ require_relative './cocoapods/utils.rb' require_relative './cocoapods/new_architecture.rb' require_relative './cocoapods/local_podspec_patch.rb' +require_relative './cocoapods/bridgeless.rb' $CODEGEN_OUTPUT_DIR = 'build/generated/ios' $CODEGEN_COMPONENT_DIR = 'react/renderer/components' @@ -119,6 +120,9 @@ def use_react_native! ( pod 'React-cxxreact', :path => "#{prefix}/ReactCommon/cxxreact" pod 'React-debug', :path => "#{prefix}/ReactCommon/react/debug" pod 'React-utils', :path => "#{prefix}/ReactCommon/react/utils" + pod 'React-Mapbuffer', :path => "#{prefix}/ReactCommon" + pod 'React-jserrorhandler', :path => "#{prefix}/ReactCommon/jserrorhandler" + pod "React-nativeconfig", :path => "#{prefix}/ReactCommon" if hermes_enabled setup_hermes!(:react_native_path => prefix, :fabric_enabled => fabric_enabled) @@ -131,6 +135,7 @@ def use_react_native! ( pod 'React-callinvoker', :path => "#{prefix}/ReactCommon/callinvoker" pod 'React-runtimeexecutor', :path => "#{prefix}/ReactCommon/runtimeexecutor" + pod 'React-rendererdebug', :path => "#{prefix}/ReactCommon/react/renderer/debug" pod 'React-perflogger', :path => "#{prefix}/ReactCommon/reactperflogger" pod 'React-logger', :path => "#{prefix}/ReactCommon/logger" pod 'ReactCommon/turbomodule/core', :path => "#{prefix}/ReactCommon", :modular_headers => true @@ -165,6 +170,10 @@ def use_react_native! ( build_codegen!(prefix, relative_installation_root) end + if new_arch_enabled + setup_bridgeless!(:react_native_path => prefix, :use_hermes => hermes_enabled) + end + # Flipper now build in Release mode but it is not linked to the Release binary (as specified by the Configuration option) if flipper_configuration.flipper_enabled install_flipper_dependencies(prefix) @@ -237,14 +246,15 @@ def react_native_post_install( if ReactNativePodsUtils.has_pod(installer, "React-hermes") ReactNativePodsUtils.set_gcc_preprocessor_definition_for_React_hermes(installer) + ReactNativePodsUtils.exclude_i386_architecture_while_using_hermes(installer) end - ReactNativePodsUtils.exclude_i386_architecture_while_using_hermes(installer) ReactNativePodsUtils.fix_library_search_paths(installer) ReactNativePodsUtils.update_search_paths(installer) ReactNativePodsUtils.set_node_modules_user_settings(installer, react_native_path) ReactNativePodsUtils.apply_flags_for_fabric(installer, fabric_enabled: fabric_enabled) ReactNativePodsUtils.apply_xcode_15_patch(installer) + ReactNativePodsUtils.apply_ats_config(installer) NewArchitectureHelper.set_clang_cxx_language_standard_if_needed(installer) is_new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == "1" @@ -354,7 +364,7 @@ def use_react_native_codegen!(spec, options={}) } end -# This provides a post_install workaround for build issues related Xcode 12.5 and Apple Silicon (M1) machines. +# This provides a post_install workaround for build issues related Xcode 12.5 and Apple Silicon machines. # Call this in the app's main Podfile's post_install hook. # See https://github.com/facebook/react-native/issues/31480#issuecomment-902912841 for more context. # Actual fix was authored by https://github.com/mikehardy. diff --git a/packages/react-native/sdks/hermes-engine/hermes-utils.rb b/packages/react-native/sdks/hermes-engine/hermes-utils.rb index 1d3f501d9d3910..bec2c4b9897d8a 100644 --- a/packages/react-native/sdks/hermes-engine/hermes-utils.rb +++ b/packages/react-native/sdks/hermes-engine/hermes-utils.rb @@ -131,7 +131,7 @@ def download_hermes_tarball(react_native_path, tarball_url, version, configurati # Returns: the path to the downloaded Hermes tarball def download_nightly_hermes(react_native_path, version) tarball_url = nightly_tarball_url(version) - return download_stable_hermes(react_native_path, tarball_url, version, nil) + return download_hermes_tarball(react_native_path, tarball_url, version, nil) end def nightly_tarball_url(version) diff --git a/packages/react-native/settings.gradle.kts b/packages/react-native/settings.gradle.kts index df9e6e8d2942b3..c0748c7b488123 100644 --- a/packages/react-native/settings.gradle.kts +++ b/packages/react-native/settings.gradle.kts @@ -29,3 +29,8 @@ include(":packages:react-native:ReactAndroid:hermes-engine") project(":packages:react-native:ReactAndroid:hermes-engine").projectDir = file("ReactAndroid/hermes-engine/") + +include(":packages:react-native:ReactAndroid:flipper-integration") + +project(":packages:react-native:ReactAndroid:flipper-integration").projectDir = + file("ReactAndroid/flipper-integration/") diff --git a/packages/react-native/template/__tests__/App.test.tsx b/packages/react-native/template/__tests__/App.test.tsx index 3413ac1c403683..9eac6fbc87d2c3 100644 --- a/packages/react-native/template/__tests__/App.test.tsx +++ b/packages/react-native/template/__tests__/App.test.tsx @@ -6,7 +6,7 @@ import 'react-native'; import React from 'react'; import App from '../App'; -// Note: import explicitly to use the types shiped with jest. +// Note: import explicitly to use the types shipped with jest. import {it} from '@jest/globals'; // Note: test renderer must be required after react-native. diff --git a/packages/react-native/template/android/app/build.gradle b/packages/react-native/template/android/app/build.gradle index b464d3616cd1ff..00e28c6f06595a 100644 --- a/packages/react-native/template/android/app/build.gradle +++ b/packages/react-native/template/android/app/build.gradle @@ -107,13 +107,8 @@ android { dependencies { // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") + implementation("com.facebook.react:flipper-integration") - debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") - debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { - exclude group:'com.squareup.okhttp3', module:'okhttp' - } - - debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") if (hermesEnabled.toBoolean()) { implementation("com.facebook.react:hermes-android") } else { diff --git a/packages/react-native/template/android/app/src/main/java/com/helloworld/MainApplication.kt b/packages/react-native/template/android/app/src/main/java/com/helloworld/MainApplication.kt index 6ca847e0e0bd5a..77a64826ad98c7 100644 --- a/packages/react-native/template/android/app/src/main/java/com/helloworld/MainApplication.kt +++ b/packages/react-native/template/android/app/src/main/java/com/helloworld/MainApplication.kt @@ -7,25 +7,27 @@ import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactNativeHost +import com.facebook.react.flipper.ReactNativeFlipper import com.facebook.soloader.SoLoader class MainApplication : Application(), ReactApplication { - private val reactNativeHost: ReactNativeHost = + override val reactNativeHost: ReactNativeHost = object : DefaultReactNativeHost(this) { override fun getPackages(): List { // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); return PackageList(this).packages } + override fun getJSMainModuleName(): String = "index" + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED } - override fun getReactNativeHost(): ReactNativeHost = reactNativeHost - override fun onCreate() { super.onCreate() SoLoader.init(this, false) diff --git a/packages/react-native/template/android/gradle.properties b/packages/react-native/template/android/gradle.properties index a3b2fa12490544..a46a5b90fad015 100644 --- a/packages/react-native/template/android/gradle.properties +++ b/packages/react-native/template/android/gradle.properties @@ -24,9 +24,6 @@ android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true -# Version of flipper SDK to use with React Native -FLIPPER_VERSION=0.182.0 - # Use this property to specify which architecture you want to build. # You can also override it from the CLI using # ./gradlew -PreactNativeArchitectures=x86_64 diff --git a/packages/react-native/template/android/gradle/wrapper/gradle-wrapper.jar b/packages/react-native/template/android/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e..033e24c4cdf41a 100644 Binary files a/packages/react-native/template/android/gradle/wrapper/gradle-wrapper.jar and b/packages/react-native/template/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/packages/react-native/template/android/gradle/wrapper/gradle-wrapper.properties b/packages/react-native/template/android/gradle/wrapper/gradle-wrapper.properties index a21c6ebe28b660..c747538fb38b53 100644 --- a/packages/react-native/template/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/react-native/template/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/packages/react-native/template/android/gradlew b/packages/react-native/template/android/gradlew index aeb74cbb43e393..fcb6fca147c0cd 100755 --- a/packages/react-native/template/android/gradlew +++ b/packages/react-native/template/android/gradlew @@ -130,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. diff --git a/packages/react-native/template/ios/HelloWorld.xcodeproj/project.pbxproj b/packages/react-native/template/ios/HelloWorld.xcodeproj/project.pbxproj index afc51486e318f7..6390f4b55591c0 100644 --- a/packages/react-native/template/ios/HelloWorld.xcodeproj/project.pbxproj +++ b/packages/react-native/template/ios/HelloWorld.xcodeproj/project.pbxproj @@ -177,7 +177,6 @@ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */; buildPhases = ( C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, - FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, @@ -378,25 +377,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldTests/Pods-HelloWorld-HelloWorldTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - FD10A7F022414F080027D42C /* Start Packager */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Start Packager"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/packages/react-native/template/ios/HelloWorld/Info.plist b/packages/react-native/template/ios/HelloWorld/Info.plist index b9fd912f0d5899..c004615da4e278 100644 --- a/packages/react-native/template/ios/HelloWorld/Info.plist +++ b/packages/react-native/template/ios/HelloWorld/Info.plist @@ -26,14 +26,11 @@ NSAppTransportSecurity - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + NSLocationWhenInUseUsageDescription diff --git a/packages/react-native/template/package.json b/packages/react-native/template/package.json index d98247f43312de..38d89d30ccfa6a 100644 --- a/packages/react-native/template/package.json +++ b/packages/react-native/template/package.json @@ -25,12 +25,12 @@ "babel-jest": "^29.2.1", "eslint": "^8.19.0", "jest": "^29.2.1", - "metro-react-native-babel-preset": "0.76.2", + "metro-react-native-babel-preset": "0.76.7", "prettier": "2.8.8", "react-test-renderer": "18.2.0", "typescript": "5.0.4" }, "engines": { - "node": ">=16" + "node": ">=18" } } diff --git a/packages/react-native/types/__typetests__/animated.tsx b/packages/react-native/types/__typetests__/animated.tsx index bee061fb72d2e9..7bee861b77cf0f 100644 --- a/packages/react-native/types/__typetests__/animated.tsx +++ b/packages/react-native/types/__typetests__/animated.tsx @@ -237,6 +237,8 @@ function TestAnimatedAPI() { }} /> ; + {/* @ts-expect-error the transform object must contain only one key-value pair */} + ; ); } diff --git a/packages/react-native/types/__typetests__/index.tsx b/packages/react-native/types/__typetests__/index.tsx index d73b93d1459ae6..9770ef1cf81204 100644 --- a/packages/react-native/types/__typetests__/index.tsx +++ b/packages/react-native/types/__typetests__/index.tsx @@ -84,8 +84,7 @@ import { SectionListProps, SectionListRenderItemInfo, Share, - ShareDismissedAction, - ShareSharedAction, + ShareAction, StatusBar, StyleProp, StyleSheet, @@ -387,6 +386,7 @@ const testNativeSyntheticEvent = ( e.isTrusted; e.nativeEvent; e.target; + e.target.measure(() => {}); e.timeStamp; e.type; e.nativeEvent; diff --git a/packages/react-native/types/modules/globals.d.ts b/packages/react-native/types/modules/globals.d.ts index 1bd4d2ccbe9a0d..02bc10af8d2139 100644 --- a/packages/react-native/types/modules/globals.d.ts +++ b/packages/react-native/types/modules/globals.d.ts @@ -67,7 +67,7 @@ declare interface WindowOrWorkerGlobalScope { interface Blob { readonly size: number; readonly type: string; - slice(start?: number, end?: number): Blob; + slice(start?: number, end?: number, contentType?: string): Blob; } interface BlobOptions { @@ -80,6 +80,20 @@ declare var Blob: { new (blobParts?: Array, options?: BlobOptions): Blob; }; +interface File extends Blob { + name: string; + lastModified: number; +} + +declare var File: { + prototype: File; + new ( + fileParts?: Array, + name?: string, + options?: BlobOptions, + ): File; +}; + type FormDataValue = | string | {name?: string | undefined; type?: string | undefined; uri: string}; diff --git a/packages/rn-tester/NativeModuleExample/Screenshot.m b/packages/rn-tester/NativeModuleExample/Screenshot.mm similarity index 100% rename from packages/rn-tester/NativeModuleExample/Screenshot.m rename to packages/rn-tester/NativeModuleExample/Screenshot.mm diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index b595f3ccdc18c0..4a927a34d1b59c 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -3,13 +3,6 @@ PODS: - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - FBLazyVector (1000.0.0) - - FBReactNativeSpec (1000.0.0): - - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 1000.0.0) - - RCTTypeSafety (= 1000.0.0) - - React-Core (= 1000.0.0) - - React-jsi (= 1000.0.0) - - ReactCommon/turbomodule/core (= 1000.0.0) - Flipper (0.182.0): - Flipper-Folly (~> 2.6) - Flipper-Boost-iOSX (1.76.0.1.11) @@ -70,14 +63,42 @@ PODS: - FlipperKit/FlipperKitNetworkPlugin - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (1000.0.0): - - hermes-engine/Hermes (= 1000.0.0) - - hermes-engine/JSI (= 1000.0.0) - - hermes-engine/Public (= 1000.0.0) - - hermes-engine/Hermes (1000.0.0) - - hermes-engine/JSI (1000.0.0) - - hermes-engine/Public (1000.0.0) - - libevent (2.1.12) + - MyNativeView (0.0.1): + - glog + - RCT-Folly (= 2021.07.22.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - NativeCxxModuleExample (0.0.1): + - glog + - RCT-Folly (= 2021.07.22.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - OCMock (3.9.1) - OpenSSL-Universal (1.1.1100) - RCT-Folly (2021.07.22.00): @@ -96,12 +117,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - RCT-Folly/Futures (2021.07.22.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - libevent - RCTRequired (1000.0.0) - RCTTypeSafety (1000.0.0): - FBLazyVector (= 1000.0.0) @@ -120,12 +135,35 @@ PODS: - React-RCTSettings (= 1000.0.0) - React-RCTText (= 1000.0.0) - React-RCTVibration (= 1000.0.0) + - React-BridgelessApple (1000.0.0): + - RCT-Folly/Fabric (= 2021.07.22.00) + - React-BridgelessCore + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-jsc + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-runtimeexecutor + - React-utils + - React-BridgelessCore (1000.0.0): + - glog + - RCT-Folly/Fabric (= 2021.07.22.00) + - React-cxxreact + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-runtimeexecutor + - React-runtimescheduler - React-callinvoker (1000.0.0) - React-Codegen (1000.0.0): - DoubleConversion - - FBReactNativeSpec - glog - - hermes-engine - RCT-Folly - RCTRequired - RCTTypeSafety @@ -133,20 +171,20 @@ PODS: - React-debug - React-Fabric - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-NativeModulesApple - - React-rncore + - React-rendererdebug - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - React-Core (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default (= 1000.0.0) - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -155,11 +193,10 @@ PODS: - Yoga - React-Core/CoreModulesHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -168,10 +205,9 @@ PODS: - Yoga - React-Core/Default (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -180,12 +216,11 @@ PODS: - Yoga - React-Core/DevSupport (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default (= 1000.0.0) - React-Core/RCTWebSocket (= 1000.0.0) - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-jsinspector (= 1000.0.0) @@ -195,11 +230,10 @@ PODS: - Yoga - React-Core/RCTActionSheetHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -208,11 +242,10 @@ PODS: - Yoga - React-Core/RCTAnimationHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -221,11 +254,10 @@ PODS: - Yoga - React-Core/RCTBlobHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -234,11 +266,10 @@ PODS: - Yoga - React-Core/RCTImageHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -247,11 +278,10 @@ PODS: - Yoga - React-Core/RCTLinkingHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -260,11 +290,10 @@ PODS: - Yoga - React-Core/RCTNetworkHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -273,11 +302,10 @@ PODS: - Yoga - React-Core/RCTPushNotificationHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -286,11 +314,10 @@ PODS: - Yoga - React-Core/RCTSettingsHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -299,11 +326,10 @@ PODS: - Yoga - React-Core/RCTTextHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -312,11 +338,10 @@ PODS: - Yoga - React-Core/RCTVibrationHeaders (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -325,11 +350,10 @@ PODS: - Yoga - React-Core/RCTWebSocket (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default (= 1000.0.0) - React-cxxreact (= 1000.0.0) - - React-hermes + - React-jsc - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -350,9 +374,9 @@ PODS: - boost (= 1.76.0) - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-callinvoker (= 1000.0.0) + - React-debug (= 1000.0.0) - React-jsi (= 1000.0.0) - React-jsinspector (= 1000.0.0) - React-logger (= 1000.0.0) @@ -362,7 +386,6 @@ PODS: - React-Fabric (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -375,12 +398,9 @@ PODS: - React-Fabric/componentregistry (= 1000.0.0) - React-Fabric/componentregistrynative (= 1000.0.0) - React-Fabric/components (= 1000.0.0) - - React-Fabric/config (= 1000.0.0) - React-Fabric/core (= 1000.0.0) - - React-Fabric/debug_renderer (= 1000.0.0) - React-Fabric/imagemanager (= 1000.0.0) - React-Fabric/leakchecker (= 1000.0.0) - - React-Fabric/mapbuffer (= 1000.0.0) - React-Fabric/mounting (= 1000.0.0) - React-Fabric/runtimescheduler (= 1000.0.0) - React-Fabric/scheduler (= 1000.0.0) @@ -389,15 +409,15 @@ PODS: - React-Fabric/textlayoutmanager (= 1000.0.0) - React-Fabric/uimanager (= 1000.0.0) - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/animations (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -405,15 +425,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/attributedstring (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -421,15 +441,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/butter (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -437,15 +457,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/componentregistry (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -453,15 +473,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/componentregistrynative (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -469,15 +489,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -496,15 +516,15 @@ PODS: - React-Fabric/components/unimplementedview (= 1000.0.0) - React-Fabric/components/view (= 1000.0.0) - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/inputaccessory (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -512,15 +532,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/legacyviewmanagerinterop (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -528,15 +548,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/modal (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -544,15 +564,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/rncore (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -560,15 +580,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/root (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -576,15 +596,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/safeareaview (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -592,15 +612,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/scrollview (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -608,15 +628,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/text (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -624,15 +644,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/textinput (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -640,15 +660,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/unimplementedview (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -656,15 +676,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/view (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -672,48 +692,16 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - Yoga - - React-Fabric/config (1000.0.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 1000.0.0) - - RCTTypeSafety (= 1000.0.0) - - React-Core - - React-cxxreact - - React-debug - - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) - - React-jsiexecutor (= 1000.0.0) - - React-logger - - React-utils - - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/core (1000.0.0): - DoubleConversion - glog - - hermes-engine - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 1000.0.0) - - RCTTypeSafety (= 1000.0.0) - - React-Core - - React-cxxreact - - React-debug - - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) - - React-jsiexecutor (= 1000.0.0) - - React-logger - - React-utils - - ReactCommon/turbomodule/core (= 1000.0.0) - - React-Fabric/debug_renderer (1000.0.0): - - DoubleConversion - - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -721,15 +709,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/imagemanager (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -737,15 +725,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/leakchecker (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -753,31 +741,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) - - React-jsiexecutor (= 1000.0.0) - - React-logger - - React-utils - - ReactCommon/turbomodule/core (= 1000.0.0) - - React-Fabric/mapbuffer (1000.0.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2021.07.22.00) - - RCTRequired (= 1000.0.0) - - RCTTypeSafety (= 1000.0.0) - - React-Core - - React-cxxreact - - React-debug - - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/mounting (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -785,15 +757,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/runtimescheduler (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -801,15 +773,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/scheduler (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -817,15 +789,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/telemetry (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -833,15 +805,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/templateprocessor (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -849,15 +821,15 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/textlayoutmanager (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -866,15 +838,15 @@ PODS: - React-debug - React-Fabric/uimanager - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/uimanager (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) @@ -882,41 +854,32 @@ PODS: - React-cxxreact - React-debug - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - React-FabricImage (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - RCTRequired (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) - React-Fabric - React-graphics (= 1000.0.0) - React-ImageManager - - React-jsi (= 1000.0.0) + - React-jsi - React-jsiexecutor (= 1000.0.0) - React-logger + - React-rendererdebug + - React-utils - ReactCommon/turbomodule/core (= 1000.0.0) - Yoga - React-graphics (1000.0.0): - glog - RCT-Folly/Fabric (= 2021.07.22.00) - React-Core/Default (= 1000.0.0) - - React-hermes (1000.0.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 1000.0.0) - - React-jsi - - React-jsiexecutor (= 1000.0.0) - - React-jsinspector (= 1000.0.0) - - React-perflogger (= 1000.0.0) - React-ImageManager (1000.0.0): - glog - RCT-Folly/Fabric @@ -924,27 +887,40 @@ PODS: - React-debug - React-Fabric - React-RCTImage + - React-rendererdebug - React-utils + - React-jsc (1000.0.0): + - React-jsc/Fabric (= 1000.0.0) + - React-jsi (= 1000.0.0) + - React-jsc/Fabric (1000.0.0): + - React-jsi (= 1000.0.0) + - React-jserrorhandler (1000.0.0): + - RCT-Folly/Fabric (= 2021.07.22.00) + - React-jsi (= 1000.0.0) + - React-Mapbuffer - React-jsi (1000.0.0): - boost (= 1.76.0) - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-jsiexecutor (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-cxxreact (= 1000.0.0) - React-jsi (= 1000.0.0) - React-perflogger (= 1000.0.0) - React-jsinspector (1000.0.0) + - React-jsitracing (1000.0.0): + - React-jsi - React-logger (1000.0.0): - glog + - React-Mapbuffer (1000.0.0): + - glog + - React-debug + - React-nativeconfig (1000.0.0) - React-NativeModulesApple (1000.0.0): - glog - - hermes-engine - React-callinvoker - React-Core - React-cxxreact @@ -966,15 +942,23 @@ PODS: - RCT-Folly - RCTRequired - RCTTypeSafety + - React-BridgelessApple + - React-BridgelessCore - React-Core - React-CoreModules - - React-hermes + - React-debug + - React-Fabric + - React-graphics + - React-jsc + - React-nativeconfig - React-NativeModulesApple + - React-RCTFabric - React-RCTImage - React-RCTNetwork + - React-rendererdebug + - React-utils - ReactCommon/turbomodule/core - React-RCTBlob (1000.0.0): - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Codegen (= 1000.0.0) - React-Core/RCTBlobHeaders (= 1000.0.0) @@ -984,7 +968,6 @@ PODS: - ReactCommon/turbomodule/core (= 1000.0.0) - React-RCTFabric (1000.0.0): - glog - - hermes-engine - RCT-Folly/Fabric (= 2021.07.22.00) - React-Core (= 1000.0.0) - React-debug @@ -992,8 +975,11 @@ PODS: - React-FabricImage - React-graphics - React-ImageManager + - React-jsi + - React-nativeconfig - React-RCTImage (= 1000.0.0) - React-RCTText + - React-rendererdebug - React-utils - Yoga - React-RCTImage (1000.0.0): @@ -1037,32 +1023,44 @@ PODS: - ReactCommon/turbomodule/core (= 1000.0.0) - React-RCTText (1000.0.0): - React-Core/RCTTextHeaders (= 1000.0.0) + - Yoga - React-RCTVibration (1000.0.0): - RCT-Folly (= 2021.07.22.00) - React-Codegen (= 1000.0.0) - React-Core/RCTVibrationHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) + - React-rendererdebug (1000.0.0): + - DoubleConversion + - RCT-Folly (= 2021.07.22.00) + - React-debug - React-rncore (1000.0.0) - React-runtimeexecutor (1000.0.0): - React-jsi (= 1000.0.0) + - React-runtimescheduler (1000.0.0): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker + - React-debug + - React-jsi + - React-runtimeexecutor + - React-utils - React-utils (1000.0.0): - glog - RCT-Folly (= 2021.07.22.00) - React-debug - ReactCommon-Samples (1000.0.0): - DoubleConversion - - hermes-engine - RCT-Folly - React-Codegen - React-Core - React-cxxreact + - React-jsi - React-NativeModulesApple - ReactCommon/turbomodule/core - ReactCommon/turbomodule/bridging (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-callinvoker (= 1000.0.0) - React-cxxreact (= 1000.0.0) @@ -1072,7 +1070,6 @@ PODS: - ReactCommon/turbomodule/core (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-callinvoker (= 1000.0.0) - React-cxxreact (= 1000.0.0) @@ -1082,7 +1079,21 @@ PODS: - ScreenshotManager (0.0.1): - glog - RCT-Folly (= 2021.07.22.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen - React-Core + - React-debug + - React-Fabric + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - SocketRocket (0.6.0) - Yoga (1.14.0) - YogaKit (1.18.1): @@ -1092,7 +1103,6 @@ DEPENDENCIES: - boost (from `../react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../react-native/React/FBReactNativeSpec`) - Flipper (= 0.182.0) - Flipper-Boost-iOSX (= 1.76.0.1.11) - Flipper-DoubleConversion (= 3.2.0.1) @@ -1114,8 +1124,8 @@ DEPENDENCIES: - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.182.0) - FlipperKit/SKIOSNetworkPlugin (= 0.182.0) - glog (from `../react-native/third-party-podspecs/glog.podspec`) - - hermes-engine (from `../react-native/sdks/hermes-engine/hermes-engine.podspec`) - - libevent (~> 2.1.12) + - MyNativeView (from `NativeComponentExample`) + - NativeCxxModuleExample (from `NativeCxxModuleExample`) - OCMock (~> 3.9.1) - OpenSSL-Universal (= 1.1.1100) - RCT-Folly (from `../react-native/third-party-podspecs/RCT-Folly.podspec`) @@ -1123,6 +1133,8 @@ DEPENDENCIES: - RCTRequired (from `../react-native/Libraries/RCTRequired`) - RCTTypeSafety (from `../react-native/Libraries/TypeSafety`) - React (from `../react-native/`) + - React-BridgelessApple (from `../react-native/ReactCommon/react/bridgeless`) + - React-BridgelessCore (from `../react-native/ReactCommon/react/bridgeless`) - React-callinvoker (from `../react-native/ReactCommon/callinvoker`) - React-Codegen (from `build/generated/ios`) - React-Core (from `../react-native/`) @@ -1134,12 +1146,17 @@ DEPENDENCIES: - React-Fabric (from `../react-native/ReactCommon`) - React-FabricImage (from `../react-native/ReactCommon`) - React-graphics (from `../react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../react-native/ReactCommon/hermes`) - React-ImageManager (from `../react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jsc (from `../react-native/ReactCommon/jsc`) + - React-jsc/Fabric (from `../react-native/ReactCommon/jsc`) + - React-jserrorhandler (from `../react-native/ReactCommon/jserrorhandler`) - React-jsi (from `../react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../react-native/ReactCommon/jsinspector`) + - React-jsitracing (from `../react-native/ReactCommon/hermes/executor/`) - React-logger (from `../react-native/ReactCommon/logger`) + - React-Mapbuffer (from `../react-native/ReactCommon`) + - React-nativeconfig (from `../react-native/ReactCommon`) - React-NativeModulesApple (from `../react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../react-native/Libraries/ActionSheetIOS`) @@ -1155,8 +1172,10 @@ DEPENDENCIES: - React-RCTTest (from `./RCTTest`) - React-RCTText (from `../react-native/Libraries/Text`) - React-RCTVibration (from `../react-native/Libraries/Vibration`) + - React-rendererdebug (from `../react-native/ReactCommon/react/renderer/debug`) - React-rncore (from `../react-native/ReactCommon`) - React-runtimeexecutor (from `../react-native/ReactCommon/runtimeexecutor`) + - React-runtimescheduler (from `../react-native/ReactCommon/react/renderer/runtimescheduler`) - React-utils (from `../react-native/ReactCommon/react/utils`) - ReactCommon-Samples (from `../react-native/ReactCommon/react/nativemodule/samples`) - ReactCommon/turbomodule/core (from `../react-native/ReactCommon`) @@ -1175,7 +1194,6 @@ SPEC REPOS: - Flipper-PeerTalk - FlipperKit - fmt - - libevent - OCMock - OpenSSL-Universal - SocketRocket @@ -1188,13 +1206,12 @@ EXTERNAL SOURCES: :podspec: "../react-native/third-party-podspecs/DoubleConversion.podspec" FBLazyVector: :path: "../react-native/Libraries/FBLazyVector" - FBReactNativeSpec: - :path: "../react-native/React/FBReactNativeSpec" glog: :podspec: "../react-native/third-party-podspecs/glog.podspec" - hermes-engine: - :podspec: "../react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: '' + MyNativeView: + :path: NativeComponentExample + NativeCxxModuleExample: + :path: NativeCxxModuleExample RCT-Folly: :podspec: "../react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: @@ -1203,6 +1220,10 @@ EXTERNAL SOURCES: :path: "../react-native/Libraries/TypeSafety" React: :path: "../react-native/" + React-BridgelessApple: + :path: "../react-native/ReactCommon/react/bridgeless" + React-BridgelessCore: + :path: "../react-native/ReactCommon/react/bridgeless" React-callinvoker: :path: "../react-native/ReactCommon/callinvoker" React-Codegen: @@ -1221,18 +1242,26 @@ EXTERNAL SOURCES: :path: "../react-native/ReactCommon" React-graphics: :path: "../react-native/ReactCommon/react/renderer/graphics" - React-hermes: - :path: "../react-native/ReactCommon/hermes" React-ImageManager: :path: "../react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jsc: + :path: "../react-native/ReactCommon/jsc" + React-jserrorhandler: + :path: "../react-native/ReactCommon/jserrorhandler" React-jsi: :path: "../react-native/ReactCommon/jsi" React-jsiexecutor: :path: "../react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../react-native/ReactCommon/jsinspector" + React-jsitracing: + :path: "../react-native/ReactCommon/hermes/executor/" React-logger: :path: "../react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../react-native/ReactCommon" + React-nativeconfig: + :path: "../react-native/ReactCommon" React-NativeModulesApple: :path: "../react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: @@ -1263,10 +1292,14 @@ EXTERNAL SOURCES: :path: "../react-native/Libraries/Text" React-RCTVibration: :path: "../react-native/Libraries/Vibration" + React-rendererdebug: + :path: "../react-native/ReactCommon/react/renderer/debug" React-rncore: :path: "../react-native/ReactCommon" React-runtimeexecutor: :path: "../react-native/ReactCommon/runtimeexecutor" + React-runtimescheduler: + :path: "../react-native/ReactCommon/react/renderer/runtimescheduler" React-utils: :path: "../react-native/ReactCommon/react/utils" ReactCommon: @@ -1283,7 +1316,6 @@ SPEC CHECKSUMS: CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953 FBLazyVector: f4492a543c5a8fa1502d3a5867e3f7252497cfe8 - FBReactNativeSpec: 7a256eec25705f77ac6d6c6187ec2d89a180fa6c Flipper: 6edb735e6c3e332975d1b17956bcc584eccf5818 Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 @@ -1294,50 +1326,58 @@ SPEC CHECKSUMS: FlipperKit: 2efad7007d6745a3f95e4034d547be637f89d3f6 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 99bd064df01718db56b8f75e6b5ea3051c7dad0a - hermes-engine: 3d4707423e276e19d41573fc74ac39cf57c56b17 - libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + MyNativeView: 59008ae4e02f2ee035b79a60254713a9d3f61d52 + NativeCxxModuleExample: d4eec7a8e74e2bb5e9b7f0b578079dbeb708029a OCMock: 9491e4bec59e0b267d52a9184ff5605995e74be8 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c RCT-Folly: b0d1393cb3763d71efca99db314c65f0072eb0fe RCTRequired: 82c56a03b3efd524bfdb581a906add903f78f978 RCTTypeSafety: 034ade4e3b36be976b8378f825ccadbe104fa852 React: cb6dc75e09f32aeddb4d8fb58a394a67219a92fe + React-BridgelessApple: 849f20885c11e1af2adae038b6d342df7859d44c + React-BridgelessCore: c4bc485d1669e3bf0f25b257bb4cac2e72d0419e React-callinvoker: bae59cbd6affd712bbfc703839dad868ff35069d - React-Codegen: 42dae0c7801d765934f76cfbaefcb5742524cc98 - React-Core: b04375fb8581bb80b6c87c25061a1998c61b0006 - React-CoreModules: fa9b32bbc7818672a7ca91eeef4867e133b566ec - React-cxxreact: 21b73aa1e245d6c701e62150312c3748756bbf42 - React-debug: d1cd203242675d48eecec6c2553933c0e0a3874f - React-Fabric: e85af38574589ce0d1a353623ecda0f94435da16 - React-FabricImage: 8552a7e0919bc2ab09c6869a7507ad7a46e552d9 - React-graphics: a85048af7e210ec4fed185ef201726f7b4825cc0 - React-hermes: fa4837e1d1e55f462ad3e485794056189b495d7e - React-ImageManager: 528eb68fe16f08d4c76cd32949e6bcd9e4aeae4b - React-jsi: ae20bc6ced4999f64acc5163cbfa67f878f346f4 - React-jsiexecutor: 754993beb8627912e5b25344cad02ed11a616d9f + React-Codegen: 4986f11d93f42d109e7ba574bd00105955c18221 + React-Core: 300cfd5b0a8b04283079111a68ba580c4d594644 + React-CoreModules: b2a626b7880f5ba5434ddb36797d6c3050645069 + React-cxxreact: 87ced584a35f147307fc91d110db9f3a81c1d99a + React-debug: b8ca04c97389d8deb71159f7fbba395904b2d599 + React-Fabric: 039ddbb4734ece61c0b0870566c6636019923688 + React-FabricImage: 0b3ea28c3cfe3c44b0d9da7f8c089d36f1684808 + React-graphics: cb2b0d040a7f798ed14d7ce3caf07a89cb78e306 + React-ImageManager: 85e3d6600b740cfa25e079bd7d0c460a6ba6665b + React-jsc: e49efa048247735aa67be1440eba9d977f03879d + React-jserrorhandler: 13d74cf05cdcb78355b8ffb18b5d6c3bf7b4e465 + React-jsi: ecc314bc5f0625120ddfc9517edfa2f60b9c4252 + React-jsiexecutor: 6a0b5825828c4d3b452bf1485b3b841c36713c95 React-jsinspector: bede0a6ac88f2463eafc1301239fe943adf06fa7 + React-jsitracing: 9c31143708c500579047b26ef7a82e91189329b2 React-logger: c20eb15d006d5c303cf6bfbb11243c8d579d9f56 - React-NativeModulesApple: 518f3f3d2d9e4944f99df30e601f8774d1fa1663 + React-Mapbuffer: f6997dcdedb2f6816a36b972d1a39ea278c17485 + React-nativeconfig: 614a27e2704609dd6501137b77d1278266beafa2 + React-NativeModulesApple: d8a757252dbcd08ac54cf1606e096c7ba4884669 React-perflogger: c294d51cfc18b90caa1604ef3a0fe2dd76b9e15e React-RCTActionSheet: 943bd5f540f3af1e5a149c13c4de81858edf718a - React-RCTAnimation: a430a8c32e7947b7b014f7bd1ef6825168ad4841 - React-RCTAppDelegate: c847ea72bc6fd48b7b6693755c232a3cecbbc970 - React-RCTBlob: 9de0f88a876429c31b96b63975173c60978b5586 - React-RCTFabric: 911e88ea1b9f0b083b1502fb8dabda0a68142d42 - React-RCTImage: 8addd5fae983149d4506fbf8b36be30585adadf4 - React-RCTLinking: aec004e7f55b71be0f68913b1d993964fc8013e1 - React-RCTNetwork: 67229afd0642c55d4493cad5129238a7a1599441 - React-RCTPushNotification: 9e4bba7bb3a4682281216a81f3342caecf84cef7 - React-RCTSettings: 9b6f5a70aa3b859b2686794c3441e278b4f6e0a6 + React-RCTAnimation: 2c4bb7f0f5734cffc722d08f0db0082b56f74f19 + React-RCTAppDelegate: 64e535f0d0b11a095e5839fa907ce7751d882267 + React-RCTBlob: 0d3a2bbd6e9d415cf9775083e71b5539a33eda56 + React-RCTFabric: 3c4c7f5ce155eb6a2697223d193e47bab4592c63 + React-RCTImage: bb95cc1d6ac1370dcebcc88b13938b31d93d5eff + React-RCTLinking: 1d65dcc1acf31b0824a07498b2a62fe0faa8c996 + React-RCTNetwork: 584d43bdefb0d73d90eec6146b79cafcc9242d00 + React-RCTPushNotification: 6e39862fcc7d8de4f243d1fa66836671d050d8d0 + React-RCTSettings: d98d83e8e9737f0a2c5fb2b05956ef31c102ae0b React-RCTTest: d4004e03f9e5ca2607eb05bee5a0618b189a127a - React-RCTText: 6d0a9927391dc26325c2edf60ef7d36f637e709c + React-RCTText: e9b0e8ecf0ab4f9fac58916433dcf8e8d5e5c2c1 React-RCTVibration: ae65884c71d67f356396d6fcc44eec48b5afef70 - React-rncore: fe8c75a4beb121d0f923f0a45a17910083ccb681 + React-rendererdebug: e9e35b8c9c6fb17a38ab3bacc9f52c3c35a1fefa + React-rncore: 1eb30c961c5061f3ac07850e77f0038f0c29ac46 React-runtimeexecutor: e1c32bc249dd3cf3919cb4664fd8dc84ef70cff7 - React-utils: 2c3b06a36a63d6fce240ac5cb1de003b95222810 - ReactCommon: de6e7a92ad50207b08bcf696a61d9b509876e131 - ReactCommon-Samples: 13b7118480fb9abeee8a98bc1cceff06984cfde4 - ScreenshotManager: d39b964a374e5012e2b8c143e29ead86b1da6a3c + React-runtimescheduler: adc24d7aa23f30e8f4cd711b50a5b4180e8b33b0 + React-utils: 6d6dcf42bdbf8f4972e252bd031f34ccf105f0aa + ReactCommon: 39f00514ceeff66073c919ec2d97b299afa551ad + ReactCommon-Samples: b5f49b2e62f1a7e865197bb7daa2a66104bfed02 + ScreenshotManager: 870b88afa7fb6fce0f65587d5eaa8ddfa64a3748 SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 Yoga: 239f77be94241af2a02e7018fe6165a715bc25f1 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a diff --git a/packages/rn-tester/README.md b/packages/rn-tester/README.md index 07eb33e3d2afc9..50fb1c6e7a3c6b 100644 --- a/packages/rn-tester/README.md +++ b/packages/rn-tester/README.md @@ -34,9 +34,9 @@ Both macOS and Xcode are required. 3. Install Bundler and CocoaPods dependencies: `bundle install && bundle exec pod install` or `yarn setup-ios-hermes`. In order to use JSC instead of Hermes engine, run: `USE_HERMES=0 bundle exec pod install` or `yarn setup-ios-jsc` instead. 4. Open the generated `RNTesterPods.xcworkspace`. This is not checked in, as it is generated by CocoaPods. Do not open `RNTesterPods.xcodeproj` directly. -#### Note for M1 users +#### Note for Apple Silicon users -If you own a Mac M1 laptop, you need to run some different commands to install and run cocoapods. +If you own a Mac laptop with Apple Silicon, you need to run some different commands to install and run cocoapods. - `sudo arch -x86_64 gem install ffi`: this installs the `ffi` package to load dynamically-linked libraries. - `arch -x86_64 pod install`: this run `pod install` with the right architecture. diff --git a/packages/rn-tester/RNTester/AppDelegate.mm b/packages/rn-tester/RNTester/AppDelegate.mm index f4e8d4006c5416..35274d73bc24ad 100644 --- a/packages/rn-tester/RNTester/AppDelegate.mm +++ b/packages/rn-tester/RNTester/AppDelegate.mm @@ -71,7 +71,7 @@ - (void)loadSourceForBridge:(RCTBridge *)bridge return std::make_shared(jsInvoker); } #ifdef RCT_NEW_ARCH_ENABLED - if (name == std::string([@"NativeCxxModuleExampleCxx" UTF8String])) { + if (name == facebook::react::NativeCxxModuleExample::kModuleName) { return std::make_shared(jsInvoker); } #endif @@ -123,6 +123,11 @@ - (void)application:(__unused UIApplication *)application { return @{@"RNTMyNativeView" : RNTMyNativeViewComponentView.class}; } + +- (NSURL *)getBundleURL +{ + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"js/RNTesterApp.ios"]; +} #endif @end diff --git a/packages/rn-tester/RNTester/Info.plist b/packages/rn-tester/RNTester/Info.plist index 0542ca74710b3c..8e05c22beec181 100644 --- a/packages/rn-tester/RNTester/Info.plist +++ b/packages/rn-tester/RNTester/Info.plist @@ -38,10 +38,14 @@ NSAppTransportSecurity NSAllowsArbitraryLoads + + NSAllowsLocalNetworking NSLocationWhenInUseUsageDescription You need to add NSLocationWhenInUseUsageDescription key in Info.plist to enable geolocation, otherwise it is going to *fail silently*! + NSPhotoLibraryUsageDescription + You need to add NSPhotoLibraryUsageDescription key in Info.plist to enable photo library usage, otherwise it is going to *fail silently*! UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -57,7 +61,5 @@ UIViewControllerBasedStatusBarAppearance - NSPhotoLibraryUsageDescription - You need to add NSPhotoLibraryUsageDescription key in Info.plist to enable photo library usage, otherwise it is going to *fail silently*! diff --git a/packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.m b/packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.mm similarity index 100% rename from packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.m rename to packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.mm diff --git a/packages/rn-tester/RNTester/NativeExampleViews/UpdatePropertiesExampleView.m b/packages/rn-tester/RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm similarity index 100% rename from packages/rn-tester/RNTester/NativeExampleViews/UpdatePropertiesExampleView.m rename to packages/rn-tester/RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm diff --git a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj index 01af6ae1065c2d..21f894ab822e40 100644 --- a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj +++ b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj @@ -9,8 +9,6 @@ /* Begin PBXBuildFile section */ 04157F50C11E9F16DDD69B17 /* libPods-RNTester.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F98312BF816A7F2688C036D /* libPods-RNTester.a */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 272E6B3F1BEA849E001FCF37 /* UpdatePropertiesExampleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.m */; }; - 27F441EC1BEBE5030039B79C /* FlexibleSizeExampleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.m */; }; 2DDEF0101F84BF7B00DBDF73 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2DDEF00F1F84BF7B00DBDF73 /* Images.xcassets */; }; 383889DA23A7398900D06C3E /* RCTConvert_UIColorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 383889D923A7398900D06C3E /* RCTConvert_UIColorTests.m */; }; 3D2AFAF51D646CF80089D1A3 /* legacy_image@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3D2AFAF41D646CF80089D1A3 /* legacy_image@2x.png */; }; @@ -19,6 +17,8 @@ 953D44E0A849F5064163EA24 /* libPods-RNTesterIntegrationTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F4A7C4C85AB0198A25D51E4 /* libPods-RNTesterIntegrationTests.a */; }; BE3BEE3556275C62F33864C8 /* libPods-RNTesterUnitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6144DEEE56C6C17B301A90E4 /* libPods-RNTesterUnitTests.a */; }; CD10C7A5290BD4EB0033E1ED /* RCTEventEmitterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CD10C7A4290BD4EB0033E1ED /* RCTEventEmitterTests.m */; }; + E62F11832A5C6580000BF1C8 /* FlexibleSizeExampleView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.mm */; }; + E62F11842A5C6584000BF1C8 /* UpdatePropertiesExampleView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.mm */; }; E7C1241A22BEC44B00DA25C0 /* RNTesterIntegrationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E7C1241922BEC44B00DA25C0 /* RNTesterIntegrationTests.m */; }; E7DB20D122B2BAA6005AC45F /* RCTBundleURLProviderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E7DB20A922B2BAA3005AC45F /* RCTBundleURLProviderTests.m */; }; E7DB20D222B2BAA6005AC45F /* RCTModuleInitNotificationRaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E7DB20AA22B2BAA3005AC45F /* RCTModuleInitNotificationRaceTests.m */; }; @@ -84,8 +84,8 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RNTester/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RNTester/main.m; sourceTree = ""; }; 272E6B3B1BEA849E001FCF37 /* UpdatePropertiesExampleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UpdatePropertiesExampleView.h; path = RNTester/NativeExampleViews/UpdatePropertiesExampleView.h; sourceTree = ""; }; - 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UpdatePropertiesExampleView.m; path = RNTester/NativeExampleViews/UpdatePropertiesExampleView.m; sourceTree = ""; }; - 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FlexibleSizeExampleView.m; path = RNTester/NativeExampleViews/FlexibleSizeExampleView.m; sourceTree = ""; }; + 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UpdatePropertiesExampleView.mm; path = RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm; sourceTree = ""; }; + 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FlexibleSizeExampleView.mm; path = RNTester/NativeExampleViews/FlexibleSizeExampleView.mm; sourceTree = ""; }; 27F441EA1BEBE5030039B79C /* FlexibleSizeExampleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FlexibleSizeExampleView.h; path = RNTester/NativeExampleViews/FlexibleSizeExampleView.h; sourceTree = ""; }; 2DDEF00F1F84BF7B00DBDF73 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RNTester/Images.xcassets; sourceTree = ""; }; 2F98312BF816A7F2688C036D /* libPods-RNTester.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTester.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -240,10 +240,10 @@ 272E6B3A1BEA846C001FCF37 /* NativeExampleViews */ = { isa = PBXGroup; children = ( - 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.m */, + 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.mm */, 27F441EA1BEBE5030039B79C /* FlexibleSizeExampleView.h */, 272E6B3B1BEA849E001FCF37 /* UpdatePropertiesExampleView.h */, - 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.m */, + 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.mm */, ); name = NativeExampleViews; sourceTree = ""; @@ -409,7 +409,6 @@ 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 68CD48B71D2BCB2C007E06A9 /* Build JS Bundle */, - 5CF0FD27207FC6EC00C13D65 /* Start Metro */, 79E8BE2B119D4C5CCD2F04B3 /* [RN] Copy Hermes Framework */, 4E5A5A192F46F13B14A915AF /* [CP] Embed Pods Frameworks */, 4E2AB2EE08A8E6F86E659152 /* [CP] Copy Pods Resources */, @@ -627,21 +626,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5CF0FD27207FC6EC00C13D65 /* Start Metro */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Start Metro"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -x\n\n# RN-Tester does not have an iOS directory. The PROJECT_ROOT should \n# point to the folder where the `metro.config.js` file lives.\nexport PROJECT_ROOT=$(pwd)\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open -n \"$SRCROOT/../react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; - showEnvVarsInLog = 0; - }; 68CD48B71D2BCB2C007E06A9 /* Build JS Bundle */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -756,8 +740,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 272E6B3F1BEA849E001FCF37 /* UpdatePropertiesExampleView.m in Sources */, - 27F441EC1BEBE5030039B79C /* FlexibleSizeExampleView.m in Sources */, + E62F11842A5C6584000BF1C8 /* UpdatePropertiesExampleView.mm in Sources */, + E62F11832A5C6580000BF1C8 /* FlexibleSizeExampleView.mm in Sources */, 5C60EB1C226440DB0018C04F /* AppDelegate.mm in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, ); diff --git a/packages/rn-tester/RNTesterUnitTests/RCTBundleURLProviderTests.m b/packages/rn-tester/RNTesterUnitTests/RCTBundleURLProviderTests.m index 4da7d3fa59d145..596dceb191be1f 100644 --- a/packages/rn-tester/RNTesterUnitTests/RCTBundleURLProviderTests.m +++ b/packages/rn-tester/RNTesterUnitTests/RCTBundleURLProviderTests.m @@ -26,7 +26,7 @@ URLWithString: [NSString stringWithFormat: - @"http://localhost:8081/%@.bundle?platform=ios&dev=true&lazy=true&minify=false&modulesOnly=false&runModule=true&app=com.apple.dt.xctest.tool", + @"http://localhost:8081/%@.bundle?platform=ios&dev=true&lazy=true&minify=false&inlineSourceMap=false&modulesOnly=false&runModule=true&app=com.apple.dt.xctest.tool", testFile]]; } @@ -36,7 +36,7 @@ URLWithString: [NSString stringWithFormat: - @"http://192.168.1.1:8081/%@.bundle?platform=ios&dev=true&lazy=true&minify=false&modulesOnly=false&runModule=true&app=com.apple.dt.xctest.tool", + @"http://192.168.1.1:8081/%@.bundle?platform=ios&dev=true&lazy=true&minify=false&inlineSourceMap=false&modulesOnly=false&runModule=true&app=com.apple.dt.xctest.tool", testFile]]; } diff --git a/packages/rn-tester/android/app/build.gradle b/packages/rn-tester/android/app/build.gradle index e9e68fee660565..a4d46e130a4c43 100644 --- a/packages/rn-tester/android/app/build.gradle +++ b/packages/rn-tester/android/app/build.gradle @@ -94,7 +94,7 @@ android { namespace "com.facebook.react.uiapp" // Used to override the NDK path/version on internal CI or by allowing - // users to customize the NDK path/version from their root project (e.g. for M1 support) + // users to customize the NDK path/version from their root project (e.g. for Apple Silicon support) if (rootProject.hasProperty("ndkPath")) { ndkPath rootProject.ext.ndkPath } @@ -156,14 +156,11 @@ android { dependencies { // Build React Native from source implementation project(':packages:react-native:ReactAndroid') + implementation project(':packages:react-native:ReactAndroid:flipper-integration') // Consume Hermes as built from source only for the Hermes variant. hermesImplementation(project(":packages:react-native:ReactAndroid:hermes-engine")) - debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") - debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") - debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") - jscImplementation jscFlavor androidTestImplementation 'junit:junit:4.12' @@ -184,7 +181,7 @@ android { afterEvaluate { // As we're consuming Hermes from source, we want to make sure // `hermesc` is built before we actually invoke the `emit*HermesResource` task - createBundleHermesReleaseJsAndAssets.dependsOn(":packages:react-native:ReactAndroid:hermes-engine:buildHermes") + createBundleHermesReleaseJsAndAssets.dependsOn(":packages:react-native:ReactAndroid:hermes-engine:buildHermesC") // As we're building 4 native flavors in parallel, there is clash on the `.cxx/Debug` and // `.cxx/Release` folder where the CMake intermediates are stored. diff --git a/packages/rn-tester/android/app/gradle.properties b/packages/rn-tester/android/app/gradle.properties index 1d6bf9759649a1..afa8164ce4cf34 100644 --- a/packages/rn-tester/android/app/gradle.properties +++ b/packages/rn-tester/android/app/gradle.properties @@ -4,9 +4,6 @@ org.gradle.parallel=true android.useAndroidX=true android.enableJetifier=true -# Version of flipper SDK to use with React Native -FLIPPER_VERSION=0.182.0 - # RN-Tester is building with NewArch always enabled newArchEnabled=true # RN-Tester is running with Hermes enabled and filtering variants with enableHermesOnlyInVariants diff --git a/packages/rn-tester/android/app/src/debug/java/com/facebook/react/uiapp/ReactNativeFlipper.java b/packages/rn-tester/android/app/src/debug/java/com/facebook/react/uiapp/ReactNativeFlipper.java deleted file mode 100644 index 28579c8450d8ef..00000000000000 --- a/packages/rn-tester/android/app/src/debug/java/com/facebook/react/uiapp/ReactNativeFlipper.java +++ /dev/null @@ -1,74 +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. - */ - -package com.facebook.react.uiapp; - -import android.content.Context; -import com.facebook.flipper.android.AndroidFlipperClient; -import com.facebook.flipper.android.utils.FlipperUtils; -import com.facebook.flipper.core.FlipperClient; -import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; -import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; -import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; -import com.facebook.flipper.plugins.inspector.DescriptorMapping; -import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; -import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; -import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; -import com.facebook.flipper.plugins.react.ReactFlipperPlugin; -import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; -import com.facebook.react.ReactInstanceEventListener; -import com.facebook.react.ReactInstanceManager; -import com.facebook.react.bridge.ReactContext; -import com.facebook.react.modules.network.NetworkingModule; -import okhttp3.OkHttpClient; - -public class ReactNativeFlipper { - public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { - if (FlipperUtils.shouldEnableFlipper(context)) { - final FlipperClient client = AndroidFlipperClient.getInstance(context); - - client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); - client.addPlugin(new ReactFlipperPlugin()); - client.addPlugin(new DatabasesFlipperPlugin(context)); - client.addPlugin(new SharedPreferencesFlipperPlugin(context)); - client.addPlugin(CrashReporterPlugin.getInstance()); - - NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); - NetworkingModule.setCustomClientBuilder( - new NetworkingModule.CustomClientBuilder() { - @Override - public void apply(OkHttpClient.Builder builder) { - builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); - } - }); - client.addPlugin(networkFlipperPlugin); - client.start(); - - // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized - // Hence we run if after all native modules have been initialized - ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); - if (reactContext == null) { - reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceEventListener() { - @Override - public void onReactContextInitialized(ReactContext reactContext) { - reactInstanceManager.removeReactInstanceEventListener(this); - reactContext.runOnNativeModulesQueueThread( - new Runnable() { - @Override - public void run() { - client.addPlugin(new FrescoFlipperPlugin()); - } - }); - } - }); - } else { - client.addPlugin(new FrescoFlipperPlugin()); - } - } - } -} diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java index cb00882bbed8fb..1ce23983101170 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java @@ -10,22 +10,31 @@ import android.app.Application; import androidx.annotation.NonNull; import com.facebook.fbreact.specs.SampleTurboModule; +import com.facebook.react.JSEngineResolutionAlgorithm; import com.facebook.react.ReactApplication; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.TurboReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridgeless.ReactHost; +import com.facebook.react.common.annotations.UnstableReactNativeAPI; +import com.facebook.react.common.assets.ReactFontManager; +import com.facebook.react.common.mapbuffer.ReadableMapBuffer; import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.defaults.DefaultComponentsRegistry; import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; import com.facebook.react.defaults.DefaultReactNativeHost; +import com.facebook.react.fabric.ComponentFactory; +import com.facebook.react.flipper.ReactNativeFlipper; +import com.facebook.react.interfaces.ReactHostInterface; +import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler; import com.facebook.react.module.model.ReactModuleInfo; import com.facebook.react.module.model.ReactModuleInfoProvider; import com.facebook.react.shell.MainReactPackage; import com.facebook.react.uiapp.component.MyLegacyViewManager; import com.facebook.react.uiapp.component.MyNativeViewManager; import com.facebook.react.uimanager.ViewManager; -import com.facebook.react.views.text.ReactFontManager; import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.Arrays; @@ -36,6 +45,8 @@ public class RNTesterApplication extends Application implements ReactApplication { + private ReactHost mReactHost; + private final ReactNativeHost mReactNativeHost = new DefaultReactNativeHost(this) { @Override @@ -135,11 +146,54 @@ public void onCreate() { if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { DefaultNewArchitectureEntryPoint.load(); } - ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO: initialize Flipper for Bridgeless + } else { + ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); + } } @Override public ReactNativeHost getReactNativeHost() { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + throw new RuntimeException("Should not use ReactNativeHost when Bridgeless enabled"); + } return mReactNativeHost; } + + @Override + @UnstableReactNativeAPI + public ReactHostInterface getReactHostInterface() { + if (mReactHost == null) { + // Create an instance of ReactHost to manager the instance of ReactInstance, + // which is similar to how we use ReactNativeHost to manager instance of ReactInstanceManager + RNTesterReactHostDelegate reactHostDelegate = + new RNTesterReactHostDelegate(getApplicationContext()); + RNTesterReactJsExceptionHandler reactJsExceptionHandler = + new RNTesterReactJsExceptionHandler(); + + ComponentFactory componentFactory = new ComponentFactory(); + DefaultComponentsRegistry.register(componentFactory); + mReactHost = + new ReactHost( + this.getApplicationContext(), + reactHostDelegate, + componentFactory, + true, + reactJsExceptionHandler, + true); + if (BuildConfig.IS_HERMES_ENABLED_IN_FLAVOR) { + mReactHost.setJSEngineResolutionAlgorithm(JSEngineResolutionAlgorithm.HERMES); + } else { + mReactHost.setJSEngineResolutionAlgorithm(JSEngineResolutionAlgorithm.JSC); + } + reactHostDelegate.setReactHost(mReactHost); + } + return mReactHost; + } + + @UnstableReactNativeAPI + public static class RNTesterReactJsExceptionHandler implements ReactJsExceptionHandler { + public void reportJsException(ReadableMapBuffer errorMap) {} + } }; diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.java new file mode 100644 index 00000000000000..ef3eb92712d8f0 --- /dev/null +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.uiapp; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.facebook.fbreact.specs.SampleTurboModule; +import com.facebook.react.JSEngineResolutionAlgorithm; +import com.facebook.react.ReactPackage; +import com.facebook.react.ReactPackageTurboModuleManagerDelegate; +import com.facebook.react.TurboReactPackage; +import com.facebook.react.bridge.JSBundleLoader; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridgeless.BindingsInstaller; +import com.facebook.react.bridgeless.JSCInstance; +import com.facebook.react.bridgeless.JSEngineInstance; +import com.facebook.react.bridgeless.ReactHost; +import com.facebook.react.bridgeless.ReactHostDelegate; +import com.facebook.react.bridgeless.hermes.HermesInstance; +import com.facebook.react.common.annotations.UnstableReactNativeAPI; +import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.defaults.DefaultTurboModuleManagerDelegate; +import com.facebook.react.fabric.ReactNativeConfig; +import com.facebook.react.module.model.ReactModuleInfo; +import com.facebook.react.module.model.ReactModuleInfoProvider; +import com.facebook.react.shell.MainReactPackage; +import com.facebook.react.turbomodule.core.TurboModuleManager; +import com.facebook.react.uiapp.component.MyLegacyViewManager; +import com.facebook.react.uiapp.component.MyNativeViewManager; +import com.facebook.react.uimanager.ViewManager; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@UnstableReactNativeAPI +public class RNTesterReactHostDelegate implements ReactHostDelegate { + private final Context mContext; + private @Nullable ReactHost mReactHost; + private @Nullable List mReactPackages; + + RNTesterReactHostDelegate(Context context) { + this.mContext = context; + } + + public void setReactHost(ReactHost reactHost) { + mReactHost = reactHost; + } + + @Override + public String getJSMainModulePath() { + return "js/RNTesterApp.android"; + } + + @Override + public JSBundleLoader getJSBundleLoader() { + return JSBundleLoader.createAssetLoader(mContext, "assets://RNTesterApp.android.bundle", true); + } + + @Override + public synchronized BindingsInstaller getBindingsInstaller() { + return null; + } + + @NonNull + @Override + public ReactPackageTurboModuleManagerDelegate.Builder getTurboModuleManagerDelegateBuilder() { + return new DefaultTurboModuleManagerDelegate.Builder(); + } + + @Override + public JSEngineInstance getJSEngineInstance() { + if (mReactHost.getJSEngineResolutionAlgorithm() == JSEngineResolutionAlgorithm.JSC) { + return new JSCInstance(); + } else { + return new HermesInstance(); + } + } + + @Override + public void handleInstanceException(Exception e) {} + + @Override + public ReactNativeConfig getReactNativeConfig(TurboModuleManager turboModuleManager) { + return ReactNativeConfig.DEFAULT_CONFIG; + } + + @Override + public List getReactPackages() { + if (mReactPackages == null) { + mReactPackages = + Arrays.asList( + new MainReactPackage(), + new TurboReactPackage() { + public NativeModule getModule( + final String name, final ReactApplicationContext reactContext) { + if (!ReactFeatureFlags.useTurboModules) { + return null; + } + + if (SampleTurboModule.NAME.equals(name)) { + return new SampleTurboModule(reactContext); + } + + return null; + } + + // Note: Specialized annotation processor for @ReactModule isn't configured in OSS + // yet. For now, hardcode this information, though it's not necessary for most + // modules. + public ReactModuleInfoProvider getReactModuleInfoProvider() { + return new ReactModuleInfoProvider() { + public Map getReactModuleInfos() { + final Map moduleInfos = new HashMap<>(); + if (ReactFeatureFlags.useTurboModules) { + moduleInfos.put( + SampleTurboModule.NAME, + new ReactModuleInfo( + SampleTurboModule.NAME, + "SampleTurboModule", + false, // canOverrideExistingModule + false, // needsEagerInit + true, // hasConstants + false, // isCxxModule + true // isTurboModule + )); + } + return moduleInfos; + } + }; + } + }, + new ReactPackage() { + @NonNull + @Override + public List createNativeModules( + @NonNull ReactApplicationContext reactContext) { + return Collections.emptyList(); + } + + @NonNull + @Override + public List createViewManagers( + @NonNull ReactApplicationContext reactContext) { + List viewManagers = new ArrayList<>(); + viewManagers.add(new MyNativeViewManager()); + viewManagers.add(new MyLegacyViewManager(reactContext)); + return viewManagers; + } + }); + } + return mReactPackages; + } +} diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyLegacyViewManager.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyLegacyViewManager.java index a192837166ffa1..e2f34691472d88 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyLegacyViewManager.java +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyLegacyViewManager.java @@ -27,7 +27,7 @@ public class MyLegacyViewManager extends SimpleViewManager { public static final String REACT_CLASS = "RNTMyLegacyNativeView"; - private static final Integer COMMAND_CHANGE_BACKGROUND_COLOR = 42; + private static final int COMMAND_CHANGE_BACKGROUND_COLOR = 42; private final ReactApplicationContext mCallerContext; public MyLegacyViewManager(ReactApplicationContext reactContext) { @@ -71,8 +71,7 @@ public final Map getExportedViewConstants() { @Override public final Map getExportedCustomBubblingEventTypeConstants() { - Map eventTypeConstants = new HashMap(); - eventTypeConstants.putAll( + return new HashMap<>( MapBuilder.builder() .put( "onColorChanged", @@ -81,18 +80,29 @@ public final Map getExportedCustomBubblingEventTypeConstants() { MapBuilder.of( "bubbled", "onColorChanged", "captured", "onColorChangedCapture"))) .build()); - return eventTypeConstants; } @Override public void receiveCommand( @NonNull MyNativeView view, String commandId, @Nullable ReadableArray args) { - if (commandId.contentEquals(COMMAND_CHANGE_BACKGROUND_COLOR.toString())) { + if (commandId.contentEquals("changeBackgroundColor")) { int sentColor = Color.parseColor(args.getString(0)); view.setBackgroundColor(sentColor); } } + @SuppressWarnings("deprecation") // We intentionally want to test against the legacy API here. + @Override + public void receiveCommand( + @NonNull MyNativeView view, int commandId, @Nullable ReadableArray args) { + switch (commandId) { + case COMMAND_CHANGE_BACKGROUND_COLOR: + int sentColor = Color.parseColor(args.getString(0)); + view.setBackgroundColor(sentColor); + break; + } + } + @Nullable @Override public Map getCommandsMap() { diff --git a/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp b/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp index ae9238ab90dd2d..9bbc4c83311e6e 100644 --- a/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp +++ b/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp @@ -33,7 +33,7 @@ void registerComponents( std::shared_ptr cxxModuleProvider( const std::string &name, const std::shared_ptr &jsInvoker) { - if (name == "NativeCxxModuleExampleCxx") { + if (name == NativeCxxModuleExample::kModuleName) { return std::make_shared(jsInvoker); } return nullptr; diff --git a/packages/rn-tester/android/app/src/release/java/com/facebook/react/uiapp/ReactNativeFlipper.java b/packages/rn-tester/android/app/src/release/java/com/facebook/react/uiapp/ReactNativeFlipper.java deleted file mode 100644 index 26cc2168b99867..00000000000000 --- a/packages/rn-tester/android/app/src/release/java/com/facebook/react/uiapp/ReactNativeFlipper.java +++ /dev/null @@ -1,21 +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. - */ - -package com.facebook.react.uiapp; - -import android.content.Context; -import com.facebook.react.ReactInstanceManager; - -/** - * Class responsible of loading Flipper inside your React Native application. This is the release - * flavor of it so it's empty as we don't want to load Flipper. - */ -public class ReactNativeFlipper { - public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { - // Do nothing as we don't want to initialize Flipper on Release. - } -} diff --git a/packages/rn-tester/js/RNTesterAppShared.js b/packages/rn-tester/js/RNTesterAppShared.js index 3cd8e9d9afad5a..0949aafca08d92 100644 --- a/packages/rn-tester/js/RNTesterAppShared.js +++ b/packages/rn-tester/js/RNTesterAppShared.js @@ -29,6 +29,15 @@ import {BackHandler, StyleSheet, View, useColorScheme} from 'react-native'; // RNTester App currently uses in memory storage for storing navigation state +if (global.RN$Bridgeless) { + require('react-native/Libraries/NativeComponent/NativeComponentRegistry').setRuntimeConfigProvider( + name => { + // In bridgeless mode, never load native ViewConfig. + return {native: false, strict: false, verify: false}; + }, + ); +} + const RNTesterApp = (): React.Node => { const [state, dispatch] = React.useReducer( RNTesterNavigationReducer, diff --git a/packages/rn-tester/js/components/RNTTestDetails.js b/packages/rn-tester/js/components/RNTTestDetails.js index 1a64dca9ef458e..2bc82dedbb590b 100644 --- a/packages/rn-tester/js/components/RNTTestDetails.js +++ b/packages/rn-tester/js/components/RNTTestDetails.js @@ -29,8 +29,12 @@ function RNTTestDetails({ <> {description == null ? null : ( - Description - {description} + + Description + + + {description} + )} {expect == null ? null : ( @@ -78,7 +82,6 @@ const styles = StyleSheet.create({ }, heading: { fontSize: 16, - color: 'grey', fontWeight: '500', }, paragraph: { diff --git a/packages/rn-tester/js/examples/Border/BorderExample.js b/packages/rn-tester/js/examples/Border/BorderExample.js index 6ac3b1c7714eda..279c439cea77da 100644 --- a/packages/rn-tester/js/examples/Border/BorderExample.js +++ b/packages/rn-tester/js/examples/Border/BorderExample.js @@ -5,18 +5,21 @@ * LICENSE file in the root directory of this source tree. * * @format + * @flow strict-local */ 'use strict'; -const React = require('react'); -const { +import type {RNTesterModule} from '../../types/RNTesterTypes'; +import * as React from 'react'; + +import { StyleSheet, View, PlatformColor, Platform, DynamicColorIOS, -} = require('react-native'); +} from 'react-native'; const styles = StyleSheet.create({ box: { @@ -199,144 +202,164 @@ const styles = StyleSheet.create({ }, }); -exports.title = 'Border'; -exports.category = 'UI'; -exports.description = - 'Demonstrates some of the border styles available to Views.'; -exports.examples = [ - { - title: 'Equal-Width / Same-Color', - description: 'borderWidth & borderColor', - render() { - return ; +export default ({ + title: 'Border', + category: 'UI', + description: 'Demonstrates some of the border styles available to Views.', + examples: [ + { + title: 'Equal-Width / Same-Color', + name: 'equal-width-same-color', + description: 'borderWidth & borderColor', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Equal-Width / Same-Color', - description: 'borderWidth & borderColor & borderRadius', - render() { - return ; + { + title: 'Equal-Width / Same-Color', + name: 'equal-width-same-color-border-radius', + description: 'borderWidth & borderColor & borderRadius', + render: function ({testID}): React.Node { + return ( + + ); + }, }, - }, - { - title: 'Equal-Width Borders', - description: 'borderWidth & border*Color', - render() { - return ; + { + title: 'Equal-Width Borders', + name: 'equal-width-borders', + description: 'borderWidth & border*Color', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Same-Color Borders', - description: 'border*Width & borderColor', - render() { - return ; + { + title: 'Same-Color Borders', + name: 'same-color-borders', + description: 'border*Width & borderColor', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Custom Borders', - description: 'border*Width & border*Color', - render() { - return ; + { + title: 'Custom Borders', + name: 'custom-borders', + description: 'border*Width & border*Color', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Custom Borders', - description: 'border*Width & border*Color', - platform: 'ios', - render() { - return ; + { + title: 'Custom Borders', + name: 'custom-borders-ios-1', + description: 'border*Width & border*Color', + platform: 'ios', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Custom Borders', - description: 'border*Width & border*Color', - platform: 'ios', - render() { - return ; + { + title: 'Custom Borders', + name: 'custom-borders-ios-2', + description: 'border*Width & border*Color', + platform: 'ios', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Custom Borders', - description: 'borderRadius & clipping', - platform: 'ios', - render() { - return ( - - - - ); + { + title: 'Custom Borders', + name: 'custom-borders-ios-clipping', + description: 'borderRadius & clipping', + platform: 'ios', + render: function ({testID}): React.Node { + return ( + + + + ); + }, }, - }, - { - title: 'Single Borders', - description: 'top, left, bottom right', - render() { - return ( - - - - - - - ); + { + title: 'Single Borders', + name: 'single-borders', + description: 'top, left, bottom right', + render: function ({testID}): React.Node { + return ( + + + + + + + ); + }, }, - }, - { - title: 'Corner Radii', - description: 'borderTopLeftRadius & borderBottomRightRadius', - render() { - return ; + { + title: 'Corner Radii', + name: 'corner-radii', + description: 'borderTopLeftRadius & borderBottomRightRadius', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Corner Radii / Elevation', - description: 'borderTopLeftRadius & borderBottomRightRadius & elevation', - platform: 'android', - render() { - return ; + { + title: 'Corner Radii / Elevation', + name: 'corner-radii-elevation', + description: 'borderTopLeftRadius & borderBottomRightRadius & elevation', + platform: 'android', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'CSS Trick - Triangle', - description: 'create a triangle by manipulating border colors and widths', - render() { - return ; + { + title: 'CSS Trick - Triangle', + name: 'css-trick-triangle', + description: 'create a triangle by manipulating border colors and widths', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Curved border(Left|Right|Bottom|Top)Width', - description: 'Make a non-uniform width curved border', - render() { - return ; + { + title: 'Curved border(Left|Right|Bottom|Top)Width', + name: 'curved-border-lrbt-width', + description: 'Make a non-uniform width curved border', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Curved border(Left|Right|Bottom|Top)Color', - description: 'Make a non-uniform color curved border', - render() { - return ; + { + title: 'Curved border(Left|Right|Bottom|Top)Color', + name: 'curved-border-lrbt-color', + description: 'Make a non-uniform color curved border', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Curved border(Top|Bottom)(Left|Right)Radius', - description: 'Make a non-uniform radius curved border', - render() { - return ; + { + title: 'Curved border(Top|Bottom)(Left|Right)Radius', + name: 'curved-border-tb-lr-radius', + description: 'Make a non-uniform radius curved border', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'System color', - description: 'Using a platform color', - render() { - return ; + { + title: 'System color', + name: 'system-color', + description: 'Using a platform color', + render: function ({testID}): React.Node { + return ; + }, }, - }, - { - title: 'Dynamic color', - description: 'Using a custom dynamic color', - platform: 'ios', - render() { - return ; + { + title: 'Dynamic color', + name: 'dynamic-color-ios', + description: 'Using a custom dynamic color', + platform: 'ios', + render: function ({testID}): React.Node { + return ; + }, }, - }, -]; + ], +}: RNTesterModule); diff --git a/packages/rn-tester/js/examples/Experimental/Compatibility/ManyPointersPropertiesExample.js b/packages/rn-tester/js/examples/Experimental/Compatibility/ManyPointersPropertiesExample.js index f07df3a3a878e7..9961c571f81db2 100644 --- a/packages/rn-tester/js/examples/Experimental/Compatibility/ManyPointersPropertiesExample.js +++ b/packages/rn-tester/js/examples/Experimental/Compatibility/ManyPointersPropertiesExample.js @@ -19,6 +19,28 @@ const styles = StyleSheet.create({ property: {borderWidth: 1, margin: 10}, }); +function getModifiersText(evt: PointerEvent['nativeEvent']): string { + const modifiers = []; + if (evt.ctrlKey === true) { + modifiers.push('Ctrl'); + } + if (evt.shiftKey === true) { + modifiers.push('Shift'); + } + if (evt.altKey === true) { + modifiers.push('Alt'); + } + if (evt.metaKey === true) { + modifiers.push('Meta'); + } + + if (modifiers.length > 0) { + return modifiers.join(', '); + } + + return ''; +} + function ManyPointersPropertiesExample(): React.Node { const [data, setData] = React.useState<{}>({}); const onPointerMove = (event: PointerEvent) => { @@ -43,8 +65,13 @@ function ManyPointersPropertiesExample(): React.Node { Coordinates: [{evt.clientX.toPrecision(3)},{' '} {evt.clientY.toPrecision(3)}] + + Screen Coordinates: [{evt.screenX?.toPrecision(3)},{' '} + {evt.screenY?.toPrecision(3)}] + Button: {evt.button} Pressure: {evt.pressure} + Modifiers: {getModifiersText(evt)} ), )} diff --git a/packages/rn-tester/js/examples/Experimental/W3CPointerEventPlatformTests/PointerEventCaptureMouse.js b/packages/rn-tester/js/examples/Experimental/W3CPointerEventPlatformTests/PointerEventCaptureMouse.js index 7ce1b6bf894f66..680cbb259e8202 100644 --- a/packages/rn-tester/js/examples/Experimental/W3CPointerEventPlatformTests/PointerEventCaptureMouse.js +++ b/packages/rn-tester/js/examples/Experimental/W3CPointerEventPlatformTests/PointerEventCaptureMouse.js @@ -32,12 +32,12 @@ function PointerEventCaptureMouseTestCase( const pointermoveNoCaptureGot1Ref = useRef(false); const ownEventForTheCapturedTargetGotRef = useRef(false); - // const testGotPointerCapture = harness.useAsyncTest( - // 'gotpointercapture event received"', - // ); - // const testLostPointerCapture = harness.useAsyncTest( - // 'lostpointercapture event received"', - // ); + const testGotPointerCapture = harness.useAsyncTest( + 'gotpointercapture event received"', + ); + const testLostPointerCapture = harness.useAsyncTest( + 'lostpointercapture event received"', + ); const handleCaptureButtonDown = useCallback((evt: PointerEvent) => { const target0 = target0Ref.current; @@ -50,20 +50,20 @@ function PointerEventCaptureMouseTestCase( } }, []); - // const handleTarget0GotPointerCapture = useCallback( - // (evt: PointerEvent) => { - // testGotPointerCapture.done(); - // }, - // [testGotPointerCapture], - // ); - - // const handleTarget0LostPointerCapture = useCallback( - // (evt: PointerEvent) => { - // testLostPointerCapture.done(); - // isPointerCaptureRef.current = false; - // }, - // [testLostPointerCapture], - // ); + const handleTarget0GotPointerCapture = useCallback( + (evt: PointerEvent) => { + testGotPointerCapture.done(); + }, + [testGotPointerCapture], + ); + + const handleTarget0LostPointerCapture = useCallback( + (evt: PointerEvent) => { + testLostPointerCapture.done(); + isPointerCaptureRef.current = false; + }, + [testLostPointerCapture], + ); const testPointerMove0 = harness.useAsyncTest( 'pointerover event for black rectangle received', @@ -150,8 +150,8 @@ function PointerEventCaptureMouseTestCase( diff --git a/packages/rn-tester/js/examples/IntersectionObserver/IntersectionObserverBenchmark.js b/packages/rn-tester/js/examples/IntersectionObserver/IntersectionObserverBenchmark.js new file mode 100644 index 00000000000000..7932f6dc2ff7cd --- /dev/null +++ b/packages/rn-tester/js/examples/IntersectionObserver/IntersectionObserverBenchmark.js @@ -0,0 +1,127 @@ +/** + * 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 + * @flow strict-local + */ + +import {RNTesterThemeContext} from '../../components/RNTesterTheme'; + +import * as React from 'react'; +import { + useLayoutEffect, + useState, + useRef, + type ElementRef, + useContext, +} from 'react'; +import {Button, ScrollView, StyleSheet, Text, View} from 'react-native'; + +export const name = 'IntersectionObserver Benchmark'; +export const title = name; +export const description = + 'Example of using IntersectionObserver to observe a large amount of UI elements'; + +export function render(): React.Node { + return ; +} + +const ROWS = 100; +const COLUMNS = 5; + +function IntersectionObserverBenchark(): React.Node { + const [isObserving, setObserving] = useState(false); + + return ( + <> + +